From 02f22ddf76fd5891e241b45456e4b094240f8c01 Mon Sep 17 00:00:00 2001 From: Runemoro Date: Tue, 19 Dec 2017 15:30:06 -0500 Subject: [PATCH] Big fixes - Disable void fog in pockets and change yBase back to 0 - Remove depth info from pockets, we already have it in VirtualLocation - Fix texture name - Fix bug cloud/sky renderer crash --- .../java/com/zixiken/dimdoors/DimDoors.java | 2 + .../dimdoors/client/DDProxyClient.java | 12 ++ .../dimdoors/server/DDProxyServer.java | 8 ++ .../dimdoors/shared/DDProxyCommon.java | 7 ++ .../shared/commands/CommandDimTeleport.java | 14 ++- .../shared/commands/PocketCommand.java | 105 +++++++++++------- .../dimdoors/shared/pockets/Pocket.java | 2 +- .../shared/pockets/PocketGenerator.java | 18 +-- .../shared/pockets/PocketRegistry.java | 8 +- .../dimdoors/shared/util/TeleportUtils.java | 36 ++++-- .../limbodimension/WorldProviderLimbo.java | 18 +-- .../WorldProviderPersonalPocket.java | 10 -- .../pocketdimension/WorldProviderPocket.java | 18 +-- .../blocks/altered_ancient_fabric.png | Bin 10012 -> 0 bytes .../blocks/fabric_ancient_altered.png | Bin 11247 -> 10012 bytes 15 files changed, 156 insertions(+), 102 deletions(-) delete mode 100644 src/main/resources/assets/dimdoors/textures/blocks/altered_ancient_fabric.png diff --git a/src/main/java/com/zixiken/dimdoors/DimDoors.java b/src/main/java/com/zixiken/dimdoors/DimDoors.java index eed4516e..2ae819cf 100644 --- a/src/main/java/com/zixiken/dimdoors/DimDoors.java +++ b/src/main/java/com/zixiken/dimdoors/DimDoors.java @@ -12,6 +12,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.translation.I18n; +import net.minecraft.world.WorldProvider; +import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; diff --git a/src/main/java/com/zixiken/dimdoors/client/DDProxyClient.java b/src/main/java/com/zixiken/dimdoors/client/DDProxyClient.java index e6ed2245..262198b5 100644 --- a/src/main/java/com/zixiken/dimdoors/client/DDProxyClient.java +++ b/src/main/java/com/zixiken/dimdoors/client/DDProxyClient.java @@ -8,7 +8,9 @@ import com.zixiken.dimdoors.shared.tileentities.TileEntityFloatingRift; import com.zixiken.dimdoors.shared.tileentities.TileEntityHorizontalEntranceRift; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.WorldProvider; import net.minecraft.world.WorldServer; +import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.RenderingRegistry; import net.minecraftforge.fml.common.event.FMLInitializationEvent; @@ -54,4 +56,14 @@ public class DDProxyClient extends DDProxyCommon { public WorldServer getWorldServer(int dimId) { return Minecraft.getMinecraft().getIntegratedServer().getWorld(dimId); } + + @Override + public void setCloudRenderer(WorldProvider provider, IRenderHandler renderer) { + provider.setCloudRenderer(renderer); + } + + @Override + public void setSkyRenderer(WorldProvider provider, IRenderHandler renderer) { + provider.setSkyRenderer(renderer); + } } diff --git a/src/main/java/com/zixiken/dimdoors/server/DDProxyServer.java b/src/main/java/com/zixiken/dimdoors/server/DDProxyServer.java index bcae7e51..d95f7bc6 100644 --- a/src/main/java/com/zixiken/dimdoors/server/DDProxyServer.java +++ b/src/main/java/com/zixiken/dimdoors/server/DDProxyServer.java @@ -7,7 +7,9 @@ package com.zixiken.dimdoors.server; import com.zixiken.dimdoors.shared.DDProxyCommon; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.WorldProvider; import net.minecraft.world.WorldServer; +import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.common.DimensionManager; /** @@ -30,4 +32,10 @@ public class DDProxyServer extends DDProxyCommon { public WorldServer getWorldServer(int dimId) { return DimensionManager.getWorld(dimId); } + + @Override + public void setCloudRenderer(WorldProvider provider, IRenderHandler renderer) {} + + @Override + public void setSkyRenderer(WorldProvider provider, IRenderHandler renderer) {} } diff --git a/src/main/java/com/zixiken/dimdoors/shared/DDProxyCommon.java b/src/main/java/com/zixiken/dimdoors/shared/DDProxyCommon.java index 780948eb..66c23ece 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/DDProxyCommon.java +++ b/src/main/java/com/zixiken/dimdoors/shared/DDProxyCommon.java @@ -10,7 +10,9 @@ import com.zixiken.dimdoors.shared.util.DefaultSchematicGenerator; import com.zixiken.dimdoors.shared.world.DimDoorDimensions; import com.zixiken.dimdoors.shared.world.ModBiomes; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.WorldProvider; import net.minecraft.world.biome.Biome; +import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @@ -44,4 +46,9 @@ public abstract class DDProxyCommon implements IDDProxy { SchematicHandler.INSTANCE.loadSchematics(); DefaultSchematicGenerator.generateDefaultSchematics(); } + + + abstract public void setCloudRenderer(WorldProvider provider, IRenderHandler renderer); + + abstract public void setSkyRenderer(WorldProvider provider, IRenderHandler renderer); } diff --git a/src/main/java/com/zixiken/dimdoors/shared/commands/CommandDimTeleport.java b/src/main/java/com/zixiken/dimdoors/shared/commands/CommandDimTeleport.java index ac6586aa..dbfa4ead 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/commands/CommandDimTeleport.java +++ b/src/main/java/com/zixiken/dimdoors/shared/commands/CommandDimTeleport.java @@ -47,6 +47,13 @@ public class CommandDimTeleport extends CommandBase { // TODO: localization @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + // Check correct number of arguments + if (args.length < 4 || args.length > 6) { + sender.sendMessage(new TextComponentString("[DimDoors] Usage: /" + getUsage(sender))); + return; + } + + // Parse arguments int dimension, x, y, z; int yaw = 0; // TODO: keep old yaw and pitch? int pitch = 0; @@ -57,11 +64,12 @@ public class CommandDimTeleport extends CommandBase { // TODO: localization z = Integer.parseInt(args[3]); if (args.length >= 5) yaw = Integer.parseInt(args[4]); if (args.length >= 6) pitch = Integer.parseInt(args[5]); - } catch (ArrayIndexOutOfBoundsException|NumberFormatException e) { - sender.sendMessage(new TextComponentString("[DimDoors] Incorrect usage.")); + } catch (NumberFormatException e) { + sender.sendMessage(new TextComponentString("[DimDoors] Usage: /" + getUsage(sender))); return; } + // Teleport if it's a player if (sender instanceof Entity) { TeleportUtils.teleport((Entity) sender, new Location(dimension, new BlockPos(x, y, z)), yaw, pitch); } else { @@ -72,7 +80,7 @@ public class CommandDimTeleport extends CommandBase { // TODO: localization @Override public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) { List list = new ArrayList<>(); - if (args.length < 2) { //counts an empty ("") argument as an argument as well... + if (args.length == 1) { list = StringUtils.getAsStringList(DimensionManager.getIDs()); list = StringUtils.getMatchingStrings(args[0], list, false); } diff --git a/src/main/java/com/zixiken/dimdoors/shared/commands/PocketCommand.java b/src/main/java/com/zixiken/dimdoors/shared/commands/PocketCommand.java index 9a6fc34f..4b8b2230 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/commands/PocketCommand.java +++ b/src/main/java/com/zixiken/dimdoors/shared/commands/PocketCommand.java @@ -4,7 +4,9 @@ import com.zixiken.dimdoors.DimDoors; import com.zixiken.dimdoors.shared.*; import com.zixiken.dimdoors.shared.pockets.*; import com.zixiken.dimdoors.shared.rifts.TileEntityRift; +import com.zixiken.dimdoors.shared.util.Location; import com.zixiken.dimdoors.shared.util.StringUtils; +import com.zixiken.dimdoors.shared.util.TeleportUtils; import com.zixiken.dimdoors.shared.util.WorldUtils; import com.zixiken.dimdoors.shared.world.DimDoorDimensions; import net.minecraft.command.CommandBase; @@ -13,6 +15,7 @@ import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; import javax.annotation.Nullable; import java.util.ArrayList; @@ -34,7 +37,7 @@ public class PocketCommand extends CommandBase { @Override public String getUsage(ICommandSender sender) { - return "dimpocket "; + return "dimpocket [setup]"; } @Override @@ -44,20 +47,56 @@ public class PocketCommand extends CommandBase { @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { // TODO: option to replace current pocket + // Check correct number of arguments + if (args.length > 2 || args.length > 3) { + sender.sendMessage(new TextComponentString("[DimDoors] Usage: /" + getUsage(sender))); + return; + } + String group = args[0]; + String name = args[1]; + boolean setup = true; + if (args.length >= 3) { + switch (args[2]) { + case "true": + setup = true; + break; + case "false": + setup = false; + break; + default: + sender.sendMessage(new TextComponentString("[DimDoors] Usage: /" + getUsage(sender))); + return; + } + } + + // Execute only if it's a player if (sender instanceof EntityPlayerMP) { EntityPlayerMP player = getCommandSenderAsPlayer(sender); - if (areArgumentsValid(args, player)) { - int dim = WorldUtils.getDim(player.world); - if (DimDoorDimensions.isPocketDimension(dim)) { - PocketTemplate template = SchematicHandler.INSTANCE.getTemplate(args[0], args[1]); - Pocket pocket = PocketGenerator.generatePocketFromTemplate(dim, 0, template, new VirtualLocation(0, 0, 0, 0,0)); - // TODO: options for linking back/not setting entrance - pocket.setup(); - TileEntityRift entrance = (TileEntityRift) player.world.getTileEntity(pocket.getEntrance().getPos()); // TODO: what about no entrances? - entrance.teleportTo(player); - } else { - DimDoors.chat(player, "You must be in a pocket dimension to use this command!"); - } + // Make sure the player is in a pocket world + if (!DimDoorDimensions.isPocketDimension(WorldUtils.getDim(player.world))) { + DimDoors.chat(player, "You must be in a pocket dimension to use this command!"); + return; + } + + // Check if the schematic exists + if (!SchematicHandler.INSTANCE.getTemplateGroups().contains(name)) { + DimDoors.chat(player, "Group " + group + " not found"); + return; + } else if (!SchematicHandler.INSTANCE.getTemplateNames(name).contains(group)) { + DimDoors.chat(player, "Schematic " + name + " not found in group " + group); + return; + } + + // Generate the schematic and teleport the player to it + DimDoors.chat(player, "Generating schematic " + args[1]); + PocketTemplate template = SchematicHandler.INSTANCE.getTemplate(args[0], args[1]); + Pocket pocket = PocketGenerator.generatePocketFromTemplate(WorldUtils.getDim(player.world), template, new VirtualLocation(0, 0, 0, 0,0)); + if (setup) pocket.setup(); + if (pocket.getEntrance() != null) { + TileEntityRift entrance = (TileEntityRift) player.world.getTileEntity(pocket.getEntrance().getPos()); + entrance.teleportTo(player); + } else { + TeleportUtils.teleport(player, new Location(player.world, pocket.getX(), 0, pocket.getZ()), 0, 0); } } else { DimDoors.log.info("Not executing command /" + getName() + " because it wasn't sent by a player."); @@ -67,34 +106,18 @@ public class PocketCommand extends CommandBase { @Override public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) { List list = new ArrayList<>(); - if (args.length < 2) { //counts an empty ("") argument as an argument as well... - list = SchematicHandler.INSTANCE.getTemplateGroups(); - list = StringUtils.getMatchingStrings(args[0], list, false); - } else if (args.length == 2) { - list = SchematicHandler.INSTANCE.getTemplateNames(args[0]); - list = StringUtils.getMatchingStrings(args[1], list, false); - } - return list; - } - - private boolean areArgumentsValid(String[] args, EntityPlayerMP player) { - if (args.length < 2) { - DimDoors.chat(player, "Too few arguments."); - return false; - } else if (args.length > 2) { - DimDoors.chat(player, "Too many arguments."); - return false; - } else { //exactly 2 arguments - if (!SchematicHandler.INSTANCE.getTemplateGroups().contains(args[0])) { - DimDoors.chat(player, "Group not found."); - return false; - } else if (!SchematicHandler.INSTANCE.getTemplateNames(args[0]).contains(args[1])) { - DimDoors.chat(player, "Schematic not found."); - return false; - } else { - DimDoors.chat(player, "Generating schematic " + args[1]); - return true; - } + switch (args.length) { + case 1: + list = SchematicHandler.INSTANCE.getTemplateGroups(); + break; + case 2: + list = SchematicHandler.INSTANCE.getTemplateNames(args[0]); + break; + case 3: + list.add("true"); + list.add("false"); + break; } + return StringUtils.getMatchingStrings(args[0], list, false); } } diff --git a/src/main/java/com/zixiken/dimdoors/shared/pockets/Pocket.java b/src/main/java/com/zixiken/dimdoors/shared/pockets/Pocket.java index 2ff424e2..058e1444 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/pockets/Pocket.java +++ b/src/main/java/com/zixiken/dimdoors/shared/pockets/Pocket.java @@ -34,7 +34,7 @@ public class Pocket { // TODO: better visibilities private Pocket() {} - Pocket(int id, int dimID, int x, int z, int depth) { + Pocket(int id, int dimID, int x, int z) { this.id = id; this.dimID = dimID; this.x = x; diff --git a/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketGenerator.java b/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketGenerator.java index 4f6f0cce..a414503b 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketGenerator.java +++ b/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketGenerator.java @@ -8,39 +8,39 @@ import java.util.Random; public class PocketGenerator { - public static Pocket generatePocketFromTemplate(int dimID, int depth, PocketTemplate pocketTemplate, VirtualLocation virtualLocation) { - DimDoors.log.info("depth = " + depth + " originalDim = " + virtualLocation); + public static Pocket generatePocketFromTemplate(int dimID, PocketTemplate pocketTemplate, VirtualLocation virtualLocation) { + DimDoors.log.info("Generating pocket from template " + pocketTemplate.getName() + " at virtual location " + virtualLocation); PocketRegistry registry = PocketRegistry.getForDim(dimID); - Pocket pocket = registry.newPocket(depth); - pocketTemplate.place(pocket, 10); // Sky starts getting dark (because of void) below y = 10 TODO: config option for yBase or maybe param? + Pocket pocket = registry.newPocket(); + pocketTemplate.place(pocket, 0); // TODO: config option for yBase pocket.setVirtualLocation(virtualLocation); return pocket; } public static Pocket generatePrivatePocket(VirtualLocation virtualLocation) { PocketTemplate pocketTemplate = SchematicHandler.INSTANCE.getPersonalPocketTemplate(); - return generatePocketFromTemplate(DimDoorDimensions.getPrivateDimID(), 0, pocketTemplate, virtualLocation); + return generatePocketFromTemplate(DimDoorDimensions.getPrivateDimID(), pocketTemplate, virtualLocation); } public static Pocket generatePublicPocket(VirtualLocation virtualLocation) { PocketTemplate pocketTemplate = SchematicHandler.INSTANCE.getPublicPocketTemplate(); - return generatePocketFromTemplate(DimDoorDimensions.getPublicDimID(), 0, pocketTemplate, virtualLocation); + return generatePocketFromTemplate(DimDoorDimensions.getPublicDimID(), pocketTemplate, virtualLocation); } /** * Create a dungeon pocket at a certain depth. * - * @param depth The depth of the dungeon * @param virtualLocation The virtual location of the pocket * @return The newly-generated dungeon pocket */ - public Pocket generateDungeonPocket(int depth, VirtualLocation virtualLocation) { // TODO: Add rift for linking! + public Pocket generateDungeonPocket(VirtualLocation virtualLocation) { + int depth = virtualLocation.getDepth(); float netherProbability = virtualLocation.getDimID() == -1 ? 1 : (float) depth / 50; // TODO: improve nether probability Random random = new Random(); String group = random.nextFloat() < netherProbability ? "nether" : "ruins"; PocketTemplate pocketTemplate = SchematicHandler.INSTANCE.getRandomTemplate(group, depth, DDConfig.getMaxPocketSize(), false); - return generatePocketFromTemplate(DimDoorDimensions.getDungeonDimID(), depth, pocketTemplate, virtualLocation); + return generatePocketFromTemplate(DimDoorDimensions.getDungeonDimID(), pocketTemplate, virtualLocation); } } diff --git a/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketRegistry.java b/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketRegistry.java index 2959a23c..fd09e1eb 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketRegistry.java +++ b/src/main/java/com/zixiken/dimdoors/shared/pockets/PocketRegistry.java @@ -144,9 +144,9 @@ public class PocketRegistry extends WorldSavedData { * * @return The newly created Pocket */ - public Pocket newPocket(int depth) { + public Pocket newPocket() { Pocket pocket = null; - while(pocket == null) pocket = newPocket(nextID++, depth); // TODO: config option to reuse IDs (start at 0 rather than nextFreePocket) + while(pocket == null) pocket = newPocket(nextID++); // TODO: config option to reuse IDs (start at 0 rather than nextFreePocket) return pocket; } @@ -156,10 +156,10 @@ public class PocketRegistry extends WorldSavedData { * * @return The newly created Pocket, or null if that ID is taken already. */ - public Pocket newPocket(int id, int depth) { + public Pocket newPocket(int id) { if (pockets.get(id) != null) return null; GridUtils.GridPos pos = getGridPosFromID(id); - Pocket pocket = new Pocket(id, dimID, pos.getX(), pos.getZ(), depth); + Pocket pocket = new Pocket(id, dimID, pos.getX(), pos.getZ()); pockets.put(id, pocket); if (id >= nextID) nextID = id + 1; markDirty(); diff --git a/src/main/java/com/zixiken/dimdoors/shared/util/TeleportUtils.java b/src/main/java/com/zixiken/dimdoors/shared/util/TeleportUtils.java index 8f877583..b1eb1daf 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/util/TeleportUtils.java +++ b/src/main/java/com/zixiken/dimdoors/shared/util/TeleportUtils.java @@ -19,7 +19,23 @@ import java.util.EnumSet; public class TeleportUtils { - public static Entity teleport(Entity entity, Location location, float yaw, float pitch) { // TODO float position? + public static Entity teleport(Entity entity, Location location) { + return teleport(entity, location, entity.rotationYaw, entity.rotationPitch); + } + + public static Entity teleport(Entity entity, Location location, float yaw, float pitch) { + return teleport(entity, location.getDimID(), location.getPos().getX(), location.getPos().getY(), location.getPos().getZ(), yaw, pitch); + } + + public static Entity teleport(Entity entity, BlockPos pos, float yaw, float pitch) { + return teleport(entity, WorldUtils.getDim(entity.getEntityWorld()), pos.getX(), pos.getY(), pos.getZ(), yaw, pitch); + } + + public static Entity teleport(Entity entity, double x, double y, double z, float yaw, float pitch) { + return teleport(entity, WorldUtils.getDim(entity.getEntityWorld()), x, y, z, yaw, pitch); + } + + public static Entity teleport(Entity entity, int newDimension, double x, double y, double z, float yaw, float pitch) { if (entity.world.isRemote || !(entity.world instanceof WorldServer) || entity.isDead) return entity; // dead means inactive, not a dead player yaw = MathHelper.wrapDegrees(yaw); @@ -29,7 +45,7 @@ public class TeleportUtils { entity.removePassengers(); int oldDimension = entity.dimension; - int newDimension = location.getDimID(); + // int newDimension = dim; if (entity instanceof EntityPlayerMP) { entity.noClip = true; @@ -38,14 +54,14 @@ public class TeleportUtils { if (oldDimension == newDimension) { // Based on CommandTeleport.doTeleport if (entity instanceof EntityPlayerMP) { ((EntityPlayerMP) entity).connection.setPlayerLocation( - location.getPos().getX(), - location.getPos().getY(), - location.getPos().getZ(), + x, + y, + z, yaw, pitch, EnumSet.noneOf(SPacketPlayerPosLook.EnumFlags.class)); } else { - entity.setLocationAndAngles(location.getPos().getX(), location.getPos().getY(), location.getPos().getZ(), yaw, pitch); + entity.setLocationAndAngles(x, y, z, yaw, pitch); } entity.setRotationYawHead(yaw); return entity; @@ -60,7 +76,7 @@ public class TeleportUtils { if (entity instanceof EntityPlayerMP) { EntityPlayerMP player = (EntityPlayerMP) entity; try { - Field invulnerableDimensionChange = EntityPlayerMP.class.getDeclaredField("invulnerableDimensionChange"); // Prevents cancelling the position change in survival. TODO: necessary? + Field invulnerableDimensionChange = EntityPlayerMP.class.getDeclaredField("invulnerableDimensionChange"); // Prevents cancelling the position change in survival. invulnerableDimensionChange.setAccessible(true); invulnerableDimensionChange.setBoolean(player, true); // without this, there's a chance that the new player position gets cancelled } catch (NoSuchFieldException|IllegalAccessException e) { @@ -77,7 +93,7 @@ public class TeleportUtils { // Move to new world oldServer.profiler.startSection("moving"); - player.moveToBlockPosAndAngles(location.getPos(), yaw, pitch); // TODO: clamp to world border or -29999872, 29999872 like in original code? + player.setLocationAndAngles(x, y, z, yaw, pitch); // TODO: clamp to world border or -29999872, 29999872 like in original code? if (entity.isEntityAlive()) oldServer.updateEntityWithOptionalForce(entity, false); oldServer.profiler.endSection(); @@ -100,7 +116,7 @@ public class TeleportUtils { FMLCommonHandler.instance().firePlayerChangedDimensionEvent(player, oldDimension, newDimension); - player.connection.sendPacket(new SPacketEffect(1032, BlockPos.ORIGIN, 0, false)); + //player.connection.sendPacket(new SPacketEffect(1032, BlockPos.ORIGIN, 0, false)); // TODO //player.prevBlockpos = null; // For frost walk. Is this needed? What about other fields? /*player.lastExperience = -1; @@ -127,7 +143,7 @@ public class TeleportUtils { } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } - newEntity.moveToBlockPosAndAngles(location.getPos(), yaw, pitch); + newEntity.setPositionAndRotation(x, y, z, yaw, pitch); boolean oldForceSpawn = newEntity.forceSpawn; newEntity.forceSpawn = true; newServer.spawnEntity(newEntity); diff --git a/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/WorldProviderLimbo.java b/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/WorldProviderLimbo.java index c4d80d2d..b783a70b 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/WorldProviderLimbo.java +++ b/src/main/java/com/zixiken/dimdoors/shared/world/limbodimension/WorldProviderLimbo.java @@ -1,5 +1,6 @@ package com.zixiken.dimdoors.shared.world.limbodimension; +import com.zixiken.dimdoors.DimDoors; import com.zixiken.dimdoors.client.CloudRenderBlank; import com.zixiken.dimdoors.shared.blocks.BlockFabric; import com.zixiken.dimdoors.shared.blocks.ModBlocks; @@ -22,13 +23,12 @@ import net.minecraftforge.fml.relauncher.SideOnly; public class WorldProviderLimbo extends WorldProvider { - @SideOnly(Side.CLIENT) private final IRenderHandler skyRenderer = new LimboSkyProvider(); - @SideOnly(Side.CLIENT) private final IRenderHandler cloudRenderer = new CloudRenderBlank(); - @Override public void init() { hasSkyLight = false; biomeProvider = new BiomeProviderSingle(ModBiomes.LIMBO); + DimDoors.proxy.setCloudRenderer(this, new CloudRenderBlank()); + DimDoors.proxy.setSkyRenderer(this, new LimboSkyProvider()); } @Override @@ -113,16 +113,4 @@ public class WorldProviderLimbo extends WorldProvider { public Vec3d getFogColor(float celestialAngle, float partialTicks) { return new Vec3d(.2, .2, .2); } - - @Override - @SideOnly(Side.CLIENT) - public IRenderHandler getSkyRenderer() { - return skyRenderer; - } - - @Override - @SideOnly(Side.CLIENT) - public IRenderHandler getCloudRenderer() { - return cloudRenderer; - } } diff --git a/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPersonalPocket.java b/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPersonalPocket.java index c35b1a3f..ed6dc054 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPersonalPocket.java +++ b/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPersonalPocket.java @@ -29,16 +29,6 @@ public class WorldProviderPersonalPocket extends WorldProviderPocket { } } - @Override - public double getHorizon() { - return world.getHeight() - 256; - } - - @Override - public int getActualHeight() { - return -256; - } - @SideOnly(Side.CLIENT) @Override public Vec3d getSkyColor(Entity cameraEntity, float partialTicks) { diff --git a/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPocket.java b/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPocket.java index 214dced7..e389db91 100644 --- a/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPocket.java +++ b/src/main/java/com/zixiken/dimdoors/shared/world/pocketdimension/WorldProviderPocket.java @@ -1,5 +1,6 @@ package com.zixiken.dimdoors.shared.world.pocketdimension; +import com.zixiken.dimdoors.DimDoors; import com.zixiken.dimdoors.client.CloudRenderBlank; import com.zixiken.dimdoors.shared.pockets.EnumPocketType; import com.zixiken.dimdoors.shared.world.DimDoorDimensions; @@ -8,7 +9,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.DimensionType; import net.minecraft.world.WorldProvider; import net.minecraft.world.gen.IChunkGenerator; -import net.minecraftforge.client.IRenderHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -16,12 +16,11 @@ import javax.annotation.Nullable; public abstract class WorldProviderPocket extends WorldProvider { - @SideOnly(Side.CLIENT) private final IRenderHandler cloudRenderer = new CloudRenderBlank(); - @Override public void init() { // TODO: save pocket registry nbt here? (see WorldProviderEnd) hasSkyLight = true; + DimDoors.proxy.setCloudRenderer(this, new CloudRenderBlank()); } @Override @@ -49,12 +48,6 @@ public abstract class WorldProviderPocket extends WorldProvider { @Override @Nullable @SideOnly(Side.CLIENT) public float[] calcSunriseSunsetColors(float celestialAngle, float partialTicks) { return null; } - @Override - @SideOnly(Side.CLIENT) - public IRenderHandler getCloudRenderer() { - return cloudRenderer; - } - @Override @SideOnly(Side.CLIENT) public boolean doesXZShowFog(int x, int z) { return false; // TODO: set this to true outside of pockets } @@ -67,5 +60,12 @@ public abstract class WorldProviderPocket extends WorldProvider { @Override @SideOnly(Side.CLIENT) public Vec3d getFogColor(float celestialAngle, float partialTicks) { return Vec3d.ZERO; } + @Override + @SideOnly(Side.CLIENT) + public double getVoidFogYFactor() { + return 1; + } + public abstract EnumPocketType getPocketType(); + } diff --git a/src/main/resources/assets/dimdoors/textures/blocks/altered_ancient_fabric.png b/src/main/resources/assets/dimdoors/textures/blocks/altered_ancient_fabric.png deleted file mode 100644 index c4868576611ad4a5ec86c41c67b7327b553d6afe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10012 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 SjSJ$^8j^yHs&u`iS=fIXtq?5$ diff --git a/src/main/resources/assets/dimdoors/textures/blocks/fabric_ancient_altered.png b/src/main/resources/assets/dimdoors/textures/blocks/fabric_ancient_altered.png index 387821f141e26eb7e614e233e75610be1c08809d..c4868576611ad4a5ec86c41c67b7327b553d6afe 100644 GIT binary patch delta 9968 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 Z#P|zJnR^hjae0FJD9WnI)JU0y{s%}g9`^tM literal 11247 zcmW++1y~!+76nRMoZ`hHNbpkJp|}Qjr??b%E2X%5@ghN+P~4%o6?b=cFaGv_`+dnI z8`+tiJLjHr?nJ0SWH8Z4&=3$1Fy&+=)qwUL0>UdQlsCXDCesa7pm}4aAR`I1z;P$h z90)Y1PO`eL2ngtS|2+^9GP2$SC*QisDM`Iu$G{~bWA=|l^Z`y0yGiM|NjN$=+gzxoOU1n~t#B=uMrSOK)A6mPMsbvOwG!Oldn+SiJ>)*3J9S7N>mD1jp!7nK^VP?yF=WjH;Tqm)DkO z%p5KP-sF!bs}1_J#!|;^>HyzhgeL3R0Z-0k3bXFe$w@B1)=oc>IMZ8y<51IZRci{% zYTeT6d6oe0R-?WL;PO>Q6+pkBGbDj`Yu7%82S6X+hfdu3r;qM_>{gT4WlLL(xaZHi zcWc#y)lLmts$abu?(h@&kU31RC2d?@TZEIUCV$)n@5kzOjt<*@+t6J;&7^c>Sv}wS z&C&xH%AFsDbhoZC3!z1=UJpt@Y+3IwyYLM6r=QXV1QVxIdi6A8XIEXo-#x?l$HMlK zEQqo#4OXXAYM<}9+72wMBXG1~oMB+!H3@ET)vKra0s>o|1$LhXX))h9d!9w%PU>-{ zTF_&Ly|kbkS)bZ<@WpE%Wf;QoS4$T37>lj8*>Wf1+S+~WP*Vo(nag5KH$&|vIC}Zi ztLx{5-gPKf%e4KMuHrT6=UUz#+!6|?#h6W~dMYZW+hs|%kdB$Yn# z^w+5!&3@V@VwTNQ;x7o^0b5*P`KS-9mL+Xy>wp{S_$|bGTiv^*S>{V)!?0yFc~A@c zi-%!az$Z$Vz`)a-#-jNzcQVi8>EpLg9;Z%?--WzDHuL7_em(Q{S_1qKeq6R}L3OtJ zHm%xv-b|$`u4nD$gqP{Jnr0x@0(wo43d)`C1L|pIIwZ7_5a~`jtYUeFt}ZQz7M|=6 zJesot!#`%VdQjcn50@wOV$z%TDH4<8wdk{U@L zb9f>K%MFrh>0fl-7@iSn2aG3u-{9hp{&c$~XbatV=Mn~vjr^h#8zy<`qdh&S4rD8 zwD)%in^&&)W{1DGQEbo$V3!O9`e~CXK{iso&PzTPo`p-d-KdC;AM?2LFzq#c$lp+Z z_l71r{OvZL`W+#T^70se+*xF5v0##g{iI)sjG(KODTfDTRl0&FjKef3G+hc0uLZI& zVoE~Rn7iH+V|UQECO5y#+t*2z2`wy#Uj<`hV++bej%&EQf&FPdZ2BH|m61^)uhZA6 zOmy0;!c5@tjykK6<&$5ilq9?|eJ{vd;~vpLzg6&7(u+KyHW+Gy^3@Ajt`JAI6r$Epzs2>~oIBV@s z&?8gvga4w}1OZ7PRBe*ov|D*l*C zv6#DkZR?|IO|ByEu&reR7UDVM0^9%-T-1rnFPX2I%je*0yfApZV?-4{F_W8>#fQy<83ZA`usv{w%aEDeM7I}gnTXhbv-``VN z@su^&HgRK47I6EVAIKVVj>x7Y?boSZv$@UsufBbP;-H-NW@8pWkfY3L+gkT0A-v7MFLwa| zaxbl}61iY-9oCS_wb`kmGBoV-MUc0~Am9fTUhY3GuwyK0nk;R}W+#6Q9=`Kyb3b&O zUBEkewQq2ZRz7V@D(Kob9?{SRtw5M)#64BQ1E0bZ6pwXPas^i z=MhvWtVpW0`Nu&L8ZwBaNs&<~auvnF?jLW^78?u+>Rwq{p`{q3orqzkim{H}exo}u@fh-Ph18|%>dZL*;u|~GzOj!d5^0p%HZ|=uIoA~qk7w=QFuY< z@^FZl;@_?vhs$Ad7By=>`9U#{L>n;L>%oPH?mw)520pWY4ZDTly{92fU@`Y6P@d9H@ z=*POJskZVEVOr(cq*pYHy5#iMd!?OB!hvE<5;;F~jeWM~Msng4z%ISBhQLi*Omrs8 z3A@We-?4nvGsee9`ImV=&4$Lgg|oqaduA_>o01DYIA)|(be2k;E7E@}+4*+q?FAkM zY~rta%UZbNzd1&b&##}ILd0^DMS)avvNj-TJHK1g_i7Ewnu;VHe6iaX7aR`SB)DDv zO}9Xl)9f0z`K8x=;FkjF`s}Su$aWuA*h|#Bi>v7|OCWgHhHj%F4)!Ve^%3N)jCwEW z91)_&LbgO#glyVy!@-6GuQ_`B1pd6A!0nea0)&UBfFMa8NWNyRt4qRX7=Gx%26M0Z zct&MQ_pKtQ!OAvzfH+5M={ZGYWLaB>G*#;e(j9{w$F)q@+_#N6nrzKl{kACn2a}wA zuA?DtwVQE%nA}EaRyajyU;~nQQ^*|XmZFnvPoV)ly?fd`41KED(8%a{!uekdyD??U zMY(px;N9IFt(2_t(nUz366DzlA}89db@S6hb6pEf%hCWE`9vWxw*(CD8A9LOpE9!Iif zKo~&k-et+x+ZXXj1yUTACNtGd_aW64%9FQ}ib^1D?dEr0=aVQ^oquX_($dmw=7l_p zK;d6o1}Ss0vXZN-tG#6MKaNC61PxL>Y;DnY`aXlyK^m_O3=OxZ_&+0=Ati&Hqp`Dd-bA-s?tR^w5PQz&){DcZhJpMOS$H&YD+W}!kVLHonL7yE3Nn4 z-0RC|<&cfjsw<;myN*;KW|zuJn|~&K%t~6BZjMn(?B!|u3uJ7@pB8oTkE)2G<=1pO z@NCHofEFiX0%-|U!E;}&*#;s|sv{3X>#~R~`S&Qm<+K>MvXAftJ^Mr+j3V&Mxj4=4;Y>vxe=l6WE>&S(hBIE@) zQZ}uP84?Tc>6jV&^}2j~YJ5mEM1?Ac0z9g?l0L#ki*Ii3#`eh6C-#n{S-w*6sBT9q8Nx=!wtd~uPOW_J8@FVZ`LB246xg~o8!fi zWVr`Ugk4A$GyXg<|x%3FljE#dRt-jZQ>ll-oZW_=i|@XqX>__5vNMTVH>6lHTC^{ zhT%pI`t-I^qfoh)9}5c$qy)l5<7`9LM?LtDfVa0BueAE6ZMm8|3Gc?!hF{cG7`H?I z$jZ{OglCE) zetHn)=a=iG<0pKp9r5I9mZ6{4Uh>(v-OJav`8thaM^$eZTVq4s%97Dy2+SdFQMe;e z>r57ftU_X{7SV*g)!tYLtjDgduD{@eN%Jf-O8tz%Fu zTB2`8FSN5ZU9QboGb{UJ`{pZi&qz*I0Z+QdM^(dFcR~6n1&OK!I{}n#nyrM|?Ck8< zKiq!zq{#l!7^-h?r(ADm2FYpoK$vvM?)WWzgc!H4#2VZOB3iB#C(>tf%gf7;zqbXx z1klcJ&^7!0eECmKUB+w*k%XN*n2`06<7~T=!VapmpoSL7gv2dy=G)s_K)6IQP20ktgWq#S19Juw8RAJj$JKyY+)8{Z{_=U3d{4ApKU|G$$97idd z2vc|}JXVUSi^|w=vT&k{p6eXN|1GK2Uw)#`ZwY@R$^x<4Nq?XBG4b5z-`N}+-Lz!v zrq0dH4eq{JN1TC?OhovpNKqugj|*z*o%2ZQ*;O0OAE?;zQm^qHvO5WP=XHfrZ66wX z*#viNva512I7(y9R54`O=iLM%*x1V!Zxb>$m?>}SN7FRo!9p)tLFLiI5p35(a>5N{zIcOy;hYuM#}k4KpuZE zZc{X2h7KC+$yQ~!AcYD8Nsih2J|#S*uqJfmucw>&`Kvm*vug~#@W_lG3XwDYXHMUA z-)ojO7cv(cbjLkTF-wyC1tO#-K{8|lc4!x&o|2c9lamVI`PbVjMAizYBqPr0n`?h# zctr)?`W7o`%YDmX6Km2mOGV{-@dHyLQ2<%Y(tHEYH>6CVrc75~k<*8s0qB8IH*UmK zvu^6K5X#B%$A0D)5m~YH)?-v>qujJ4>^CqrcJwTe*~`Kn^-BEgeRDJqKUubrf)Gq* zfrG%p74!)jUu81_U!HiUg+8PW!N|`DklUmZ%InVe_Dc3om}opt{2^>zh8%(s9VR^W zwLQzCw7If1@E2TB+-$*6c$K4+>4I#TfFVpvu3(Gf`T)%o(;JXxElAKi`VPC|p@C{n zwd^a|2^1jIbb;wieEvC|2O?0Y?o7ioxDxK%;`}}wZkrt2pi}$0{Emllay>%^4m6)FZn#A4o^z?N6 z%G~?lTFhP&wFe*`jSUU5VSfQ4JEt4kMJVb=z^5tTC=*Cw(CmFA4-7Dc2#?fY9oW4tr)YoV9 zoS);&((o87k=hd2hHiyCq(|(r1Mm!5s23JtK@M`kWuoO1z zm)%lBDK1<|@1QAr9%cZLWGf}|Ll_NcyB%tqCe;ESZXD{-goLuk|D_;2w!b_tE+E@b zj5HDTS|>|Z8qRLhtCyybmZ-%fcGe{&C1tC-e*~8!%QI5jHny}VUOdJdRNF7BOX^i! zUS7KR`3d20X=r8n2Fr;&UR`ljW}KH{WeM>QvwwZGEmWCbh*|4+u$t)K0*9K;5r#yx z-Z1%9up}l_vXmakDWdZsfQR;3^VAqefGGi6_y~Pyy_@k98I`@hKAcrb?lsYH>yRXt zA&g@se{?d%ATF+EM{;Gf_g?_*e#T{_v^Xn0R`}V$;{{OV`Gt<#)72>6$)BQ5HrZGk zW0i^8GyJmUlVreA={I_C69wLIa z(l(t@dok7b@RSNeL+N9_1oOhMSJWq&!?p&oG$#d{8Ky5 zm*tRSqce$UF?>9KcED2vU=K1k7eo{`>{@t7{}sSG{L;Gom@k zo!so6wAJ$PL(h{WZOw#vV;qIBe5Z8G*QKgi_P@KA7r%nr=$8$RQyQKbjHoUgJk)u+&?2G1&5AF^=ItdguoN^x%s2E*No*)JW20YXBYi{G1(IdFL#iW;~nHeK{9MXc=Uf3RmC zO>QAK^$f-JJ!1>MFOH7&{#@Q~aNYjXANHbmQ_aoI|8cSGH^IVH?>T*$H0$!&e^-se zIX%ek0hjx9rB#8&bM;mbk}}|v=mO8lz0xGG8~zc_%?jV7pN+pz%(41>AXzXW_a&z9 zfR=lUoHT^!`SEfTl|ap=v+xBN^~>X>a%X4`CeWwDV|=`6y`k;xZAtEdgKs07X1J>I zTXiIE#o|A-e99IgSl5|b5-J1AL>k2{d+it-O9=e$BQ%J6IPRtRPD<7$;lTNhc{1B;e30Yw>LKvbx(&C z?Pe5HCu2PwDFI&9}p3C*O0vH{jw!^M?eBg zeG`B%JCp6sI$vt_EE@RS66_6m@tVnP-FPf1*J$U6sL<7J>d(9s_P(G6Gh87!_j!0L zt4jYpwJ!^pjNrAH*$Q~NuLZbPahOb99CD#{Oh1gAk`g@cZ+k4EB(j`AQKtt3`HNR- z7mhqp5IUYpo}?qn4z^w{>kk|Pa))o`eIp%~lu?*KcT`l=S3dxuat+?;wVoGsXY=y% zss@Y^DZk$|kbCdWyj#A%1>Fd{le$2cbjk)>zL$tFE-?_f2+rv@^<&Wr`&}PsW}Lw_Ll5U< zHR3Oo{8t@Qs#vM*%4e(WQg$!zAZk*weNXFB+xC3bdN3Cn%+6&%B>zX>Eg8jaMK*i$ zl>LB2$1g0*N+}u;9W5PY49BqZ#@U&k)-)-&^E09l_Td@`4P~sDJxty|Xo9x@KEZx+ zi!9Z}SSj;g_v*(j09^+B_f)w? zLK!*8Kr=u;a)i9q02ETU@pL-;OU0{CMO zx4m3H?(EiAeNU~hg9ABr;uC*dR@h;&+D)z+VqL2%BxWWpvC*jgP#aQ@shbE80A@%U9(;F;#b#|69a79$9?_tyHh_7LSXfAit$8moQLu6Xu1&u!^0jwQVe1P0 zMCVMZOm%~Bv6M)JE`9JvL7|`g^4g2KNJyuq(rG^4(~<^on6unCEg&5teo0?vOI0^0vdX4AFq< zp7+bM|Hk~ctlh>ml2>A`zjau|qY?z#pARxR07wD6Cv8CVex?Qd3AuUzrv{IPGkFWb ze7{t65a*S#H}QCT3m8j~hT=RGn*8V_pU43a@#E2V*_NzZ;EOb(10kzdNo>v01u=q& zNmES)7Kvk9begtbAa)7IVuW9R*Fpbf+kz}m;Ce~w%t`K zY_QMybxyIR$}ohF5H{O{)8%PBi(7x64hUTwnJl`;t~M_tZx+=W=0Y>#Cm$tCfgXFH zfFe_=sD}J*;-0vKx!ex64N&~`9W@N8ArPH`9joJN8>_aqHc)g<0caS^54Z9B=vhcG5u$e&Nzr6r}71tI3NS%EZ4gFiYz0v)Bn@ANh znDmPz*n}V3&+62=UWdhlVjwdS&*`1Sq!E(+WsNga3shY`=Jx8@r|KVKdyZZqi`;{X zm=`GWl1f42fkyhobTE2Oua&kH)5KO}m-o9jVwOqZq03gX?`>*(z`AKUfsUKW&&{(# zcd|Smt26o0!;_Zj(h;eS4w~cRWA5o7{Ckculx30%Q~GYzaiVMfHhl;Dm<6p>b1DoenxKZc=yqeznHs7Cj>tpT?EPg0W;kQ&Lnuo^Mji5>?U*t zPiljr_C+qbs8}vNerxZCyxi@_$Fk~*=JS~z?aK6)Mi7{D8Dt+oop?*ZEJ$ynbF?e7 z8#9e^sYhfk=#Yw=y0Y0B%x+d1Z_pqR|EU)!5)>LF(OR(3$mtCC0Bav~rlk_#=}E+B z&NoA{@ulsh+G>>E{rMuZbpCyXjg`Jhr~mNKf9JXlxBoKNOuzcT#@5LpT!*Ilv0S!A z;6H0|AH&+Tf8=!4=}XKmXdvxt$X0ki@kK9QtEcTbw4Fky2HBzWEk=tOzGR6Jb*DWz zsqXvJ^x^zo?~@bsE25QbHlM2F-IT3Ap@&!y62X;5`x(6pMH{d?VKuZ<2z@pyf@NOH zyp2wy@H6yuH}7!xK^<0sp86wxU5@owi-lKCM?O?Gs4DRNHlA}sRdybQi?1&!PNcDt z?7ZpjHh~KjZlkX|l=Ek)KJlcbE#^X*gPamdsmq4VFEnNfJ`FTv`Ac7grzRKM+SUyx zpqgDQx>kDhXR(<=Kioi_lo_1g(vkSqIEDXJ;zd)9cy38i3s;%jNA{1@mvZ+to12^F z=Hup(8oa?6eLder7;QhVGaF{o5Vmvi$NHf)S=aqqUZ>>{19luN%9A*r?+aKoxj}rk zRw7=qq2~(S{uAJO8ffn)E#2K=5Bg|&R+dszSR80vv5#R2F=bVM@Sr)_j^@NplkgrH ztOEI z=eYTdh$w`2p9uaj!sMA6>wwy!@9VVi8aTFzyRP*=jeu@nqLzh~5AEiz5hy}WbxZhp zi_6ISZ0e4urJfI0`|1lT_z%z_MKYDa!5k6)jP1fu=w>qRl*4cnuc>>wTyh@!_dH?t zNcE*ZZZ5O#i<9$?Pd|n&lfLl{DyqGe*(R}Q^O-w8cdimi`FQb1Nhop1szwn>kBlx5 zexLGA200uSkl)2FiNVi^;B~n(TtaHBH?(`rQj?ZzCC`iF>EnQx_fw=q zSGSmujzaWusn7$=oo*J9VBENmqjWLYGS>H@f-1nn!kg?iAckz6MX*LSEn$JOPQcOY z+qY=K<<+el$uGF@cKWno~0+IgkR`lVCZp6 zbIr8&_0f_21frlJ|MjToOLV|(EdHkz+5Bni(nRQ$FYgjjRWhd;{c#9jD$;)0l*nR( zcv7eb_vk(Y(>d5)3unhJg$?yjQ3cUhYvxJkN5-lh9*1u77IdFiSn9#xuL1;o#|Sij z@Dgqyf?zXY*p&2``=Hf5kv|0uz#bV%UQTVN%(R$e`t>z(l;5;cj={?q1Ftj{EKTX%UA7413 z;ZO*ZN@XD7qr(A#)b!#VJL}PQQz?VWx*0REjN+Dz$nyOt%oxm@FBhD^R$r|>E-%H8 z`{8U{ZrE^Nla_I4^Iy1R?J7n8KkDUGS@8wIWG~-WW|1Rt4zp&3t&XwotwyIORvY9P zE9id~rK+ElxAO+jTU*f51*U62=B%4Vq!{B#wOivnnZq@q!Qz2f!iI068%tp5kk-JA z+zC`@BYBP9t0Y{SwT$<;UB0Ig6Y@IrwZCt_O}@7Hz@;P&`SFSL%?z(`ZCeOqc!@yhUa`VpxKWaOVHL$LjhG?S1liMUoOG zNP(nf)-^M5w1ux~TNq&=A`v#&E<}R_!<$IBDEuBSlfFwKxbxnd{>yl(bQinU%FQOrU?Xf`{b1Ppi9_sw;J$5CvuMS;(-+fM z15YezoKZnl&r{Va@9!4jFrk@g$>uXidd)0QnaCH7j*ev+UHzzckxM@<68t7u^iOps zXD&&PPwNO(6tJ6M$4i1Z=yZfULK}igiZ^}9*6fzag!tNcpn^t;R}L!uX$zH2#f@t$i1wEceAPFpyGIEQ0^q20mR*R&)_X;RP75QJ(}vQuJs?pKG<4*%ZLh zrp<)yW}yQH;q4s72ho^!mLAPn{jw!}8#c!)kxGsCZL5r%-@6TS50|}k`f#%SpCA-6 zrC1`9?gr505)!jvy8{^ZoJ`c?zD~1_c%ExO3aTEY)1?1KHL? z%C-cwk#XO8-6<*1Y3ef(IW|}lk6f+Bg6ami3*bt<&*2J)hM)~K#CC=$M}0WO{bgEK zq3s}=&>!pTakuY-Z_KCh+()!%VZ~L~&G+dt1YNxvE z>~g5%XjA{nq~^eL-g-D8VwbuM%mlvWT_nIY$bOIL&ZF_fw`R_e%qDmVN5ityuOE== z-&_hO8mKlH7tEE}SomP!^fK0j!sEfj8&}_HzV4-PM4Bp#eZ*SeU0%gps?Limpj7G6 z5<4aFvmtiejz1y_aBu0&3l%2IXTRLX9Gql>BN;0StuXelWXt`kFI_BFgx4(=uh0|r zL0%U*omYW=PG%e}-d|^(ywDklo}qioqi;XxU#FUMfDgXk=xM*9uzw3iKW_T6i=Fkx zRSC(Re}9mFbp$4_E@O)d^{)Pzy0r8lGB#G$?0Wykh0AIVp%FT-@Z_{{RQcg?9h|