From 960b3e727148dc269dfb0b2a8747669fa012f726 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 6 Mar 2014 12:15:38 -0600 Subject: [PATCH 01/58] Commands are guaranteed to be ICommand, not CommandBase. --- .../StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java index 87c08ed..b298e51 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java @@ -1,6 +1,7 @@ package StevenDimDoors.mod_pocketDim.commands; import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ChatMessageComponent; @@ -84,6 +85,6 @@ public abstract class DDCommandBase extends CommandBase @Override public int compareTo(Object par1Obj) { - return this.getCommandName().compareTo(((CommandBase)par1Obj).getCommandName()); + return this.getCommandName().compareTo(((ICommand)par1Obj).getCommandName()); } } -- 2.39.5 From 63b0547069e2ec0ba8d1a534b8d7d356110f8779 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Wed, 4 Mar 2015 00:43:28 -0600 Subject: [PATCH 02/58] Update low-hanging fruit to 1.7.10 --- .../mod_pocketDim/CommonProxy.java | 4 +- .../mod_pocketDim/ConnectionHandler.java | 9 -- .../mod_pocketDim/CraftingManager.java | 30 ++-- .../StevenDimDoors/mod_pocketDim/DDLoot.java | 61 +++---- .../mod_pocketDim/blocks/BaseDimDoor.java | 80 ++++----- .../mod_pocketDim/blocks/BlockDimWall.java | 26 +-- .../blocks/BlockDimWallPerm.java | 10 +- .../mod_pocketDim/blocks/BlockDoorGold.java | 11 +- .../mod_pocketDim/blocks/BlockDoorQuartz.java | 9 +- .../blocks/BlockGoldDimDoor.java | 19 +-- .../mod_pocketDim/blocks/BlockLimbo.java | 14 +- .../mod_pocketDim/blocks/BlockRift.java | 137 ++++++++-------- .../mod_pocketDim/blocks/DimensionalDoor.java | 16 +- .../mod_pocketDim/blocks/IDimDoor.java | 5 +- .../mod_pocketDim/blocks/PersonalDimDoor.java | 17 +- .../mod_pocketDim/blocks/TransTrapdoor.java | 52 +++--- .../mod_pocketDim/blocks/TransientDoor.java | 34 ++-- .../mod_pocketDim/blocks/UnstableDoor.java | 19 ++- .../mod_pocketDim/blocks/WarpDoor.java | 16 +- .../mod_pocketDim/commands/DDCommandBase.java | 7 +- .../mod_pocketDim/config/DDProperties.java | 84 +--------- .../config/DDWorldProperties.java | 4 +- .../mod_pocketDim/core/DDTeleporter.java | 44 +++-- .../mod_pocketDim/core/NewDimData.java | 5 +- .../dungeon/DungeonSchematic.java | 26 +-- .../mod_pocketDim/dungeon/ModBlockFilter.java | 6 +- .../mod_pocketDim/items/BaseItemDoor.java | 31 ++-- .../mod_pocketDim/items/ItemBlockDimWall.java | 9 +- .../mod_pocketDim/items/ItemDDKey.java | 19 ++- .../items/ItemDimensionalDoor.java | 4 +- .../mod_pocketDim/items/ItemGoldDimDoor.java | 4 +- .../mod_pocketDim/items/ItemGoldDoor.java | 8 +- .../mod_pocketDim/items/ItemPersonalDoor.java | 4 +- .../mod_pocketDim/items/ItemQuartzDoor.java | 8 +- .../mod_pocketDim/items/ItemRiftBlade.java | 22 +-- .../mod_pocketDim/items/ItemRiftGoggles.java | 5 +- .../items/ItemRiftSignature.java | 12 +- .../items/ItemStabilizedRiftSignature.java | 12 +- .../mod_pocketDim/items/ItemStableFabric.java | 8 +- .../mod_pocketDim/items/ItemUnstableDoor.java | 4 +- .../mod_pocketDim/items/ItemWarpDoor.java | 4 +- .../mod_pocketDim/items/ItemWorldThread.java | 8 +- .../DispenserBehaviorStabilizedRS.java | 2 +- .../mod_pocketDim/items/itemRiftRemover.java | 16 +- .../mod_pocketDim/mod_pocketDim.java | 80 ++++----- .../mod_pocketDim/schematic/BlockRotator.java | 152 +++++++++--------- .../mod_pocketDim/schematic/IBlockSetter.java | 3 +- .../mod_pocketDim/schematic/Schematic.java | 12 +- .../schematic/WorldBlockSetter.java | 6 +- .../ticking/CustomLimboPopulator.java | 20 +-- .../ticking/RiftRegenerator.java | 7 +- .../tileentities/TileEntityDimDoor.java | 7 - .../tileentities/TileEntityRift.java | 13 +- .../mod_pocketDim/util/WeightedContainer.java | 4 +- .../mod_pocketDim/world/LimboDecay.java | 60 +++---- .../mod_pocketDim/world/LimboGenerator.java | 31 ++-- .../mod_pocketDim/world/LimboProvider.java | 13 +- .../mod_pocketDim/world/PocketBuilder.java | 40 +++-- .../mod_pocketDim/world/PocketGenerator.java | 7 +- .../DDStructureNetherBridgeStart.java | 17 +- .../world/gateways/GatewayGenerator.java | 17 +- .../PrivatePocketRender.java | 6 +- .../mod_pocketDimClient/RenderDimDoor.java | 3 +- .../RenderTransTrapdoor.java | 6 +- 64 files changed, 656 insertions(+), 773 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java index 5f48227..73b28e8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java @@ -134,13 +134,13 @@ public class CommonProxy implements IGuiHandler } public void updateDoorTE(BaseDimDoor door, World world, int x, int y, int z) { - TileEntity tile = world.getBlockTileEntity(x, y, z); + TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileEntityDimDoor) { int metadata = world.getBlockMetadata(x, y, z); TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; dimTile.openOrClosed = door.isDoorOnRift(world, x, y, z)&&door.isUpperDoorBlock(metadata); - dimTile.orientation = door.getFullMetadata(world, x, y, z) & 7; + dimTile.orientation = world.getBlockMetadata(x,y,z) & 7; dimTile.lockStatus = door.getLockStatus(world, x, y, z); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 156ecce..2eff1d7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -1,19 +1,10 @@ package StevenDimDoors.mod_pocketDim; -import net.minecraft.network.INetworkManager; -import net.minecraft.network.NetLoginHandler; -import net.minecraft.network.packet.NetHandler; -import net.minecraft.network.packet.Packet1Login; -import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.DimensionManager; -import net.minecraftforge.common.network.ForgePacket; -import net.minecraftforge.common.network.packet.DimensionRegisterPacket; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; -import cpw.mods.fml.common.network.IConnectionHandler; -import cpw.mods.fml.common.network.Player; public class ConnectionHandler implements IConnectionHandler { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java index cc48470..a9df452 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java @@ -4,6 +4,8 @@ package StevenDimDoors.mod_pocketDim; import net.minecraft.block.Block; import net.minecraft.block.BlockDispenser; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -27,19 +29,19 @@ public class CraftingManager implements ICraftingHandler { case 1: GameRegistry.addShapelessRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1), - Item.enderPearl, mod_pocketDim.itemWorldThread); + Items.ender_pearl, mod_pocketDim.itemWorldThread); break; case 2: GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1), - "yxy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + "yxy", 'x', Items.ender_pearl, 'y', mod_pocketDim.itemWorldThread); break; case 3: GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1), - " y ", "yxy", " y ", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + " y ", "yxy", " y ", 'x', Items.ender_pearl, 'y', mod_pocketDim.itemWorldThread); break; default: GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStableFabric, 1), - "yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', mod_pocketDim.itemWorldThread); + "yyy", "yxy", "yyy", 'x', Items.ender_pearl, 'y', mod_pocketDim.itemWorldThread); break; } } @@ -47,47 +49,47 @@ public class CraftingManager implements ICraftingHandler if (properties.CraftingDimensionalDoorAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemDimensionalDoor, 1), - "yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Item.doorIron); + "yxy", 'x', mod_pocketDim.itemStableFabric, 'y', Items.iron_door); } if (properties.CraftingUnstableDoorAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemUnstableDoor, 1), - "yxy", 'x', Item.eyeOfEnder, 'y', mod_pocketDim.itemDimensionalDoor); + "yxy", 'x', Items.ender_eye, 'y', mod_pocketDim.itemDimensionalDoor); } if (properties.CraftingWarpDoorAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemWarpDoor, 1), - "yxy", 'x', Item.enderPearl, 'y', Item.doorWood); + "yxy", 'x', Items.ender_pearl, 'y', Items.wooden_door); } if (properties.CraftingTransTrapdoorAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.transTrapdoor, 1), - "y", "x", "y", 'x', Item.enderPearl, 'y', Block.trapdoor); + "y", "x", "y", 'x', Items.ender_pearl, 'y', Blocks.trapdoor); } if (properties.CraftingRiftSignatureAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemRiftSignature, 1), - " y ", "yxy", " y ", 'x', Item.enderPearl, 'y', Item.ingotIron); + " y ", "yxy", " y ", 'x', Items.ender_pearl, 'y', Items.iron_ingot); } if (properties.CraftingRiftRemoverAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemRiftRemover, 1), - "yyy", "yxy", "yyy", 'x', Item.enderPearl, 'y', Item.ingotGold); + "yyy", "yxy", "yyy", 'x', Items.ender_pearl, 'y', Items.gold_ingot); } if (properties.CraftingRiftBladeAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemRiftBlade, 1), - "x", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Item.blazeRod); + "x", "x", "y", 'x', mod_pocketDim.itemStableFabric, 'y', Items.blaze_rod); } if (properties.CraftingStabilizedRiftSignatureAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemStabilizedRiftSignature, 1), - " y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Item.ingotIron); + " y ", "yxy", " y ", 'x', mod_pocketDim.itemStableFabric, 'y', Items.iron_ingot); } if (properties.CraftingGoldenDimensionalDoorAllowed) { @@ -97,7 +99,7 @@ public class CraftingManager implements ICraftingHandler if (properties.CraftingGoldenDoorAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemGoldenDoor, 1), - "yy", "yy", "yy", 'y', Item.ingotGold); + "yy", "yy", "yy", 'y', Items.gold_ingot); } if (properties.CraftingPersonalDimDoorAllowed) { @@ -114,7 +116,7 @@ public class CraftingManager implements ICraftingHandler if (properties.CraftingDDKeysAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemDDKey, 1), - " z", " y ", "y ", 'y', Item.ingotGold, 'z', Item.enderPearl); + " z", " y ", "y ", 'y', Items.gold_ingot, 'z', Items.ender_pearl); GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemDDKey, 1), "z", "z", 'z', mod_pocketDim.itemDDKey); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java index 50f4fb6..97a7e2a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DDLoot.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Random; import net.minecraft.enchantment.Enchantment; +import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -46,34 +47,34 @@ public class DDLoot { ArrayList items = new ArrayList(); - addContent(true, items, Item.ingotIron.itemID, 160, 1, 3); - addContent(true, items, Item.coal.itemID, 120, 1, 3); - addContent(true, items, Item.netherQuartz.itemID, 120, 1, 3); - addContent(true, items, Item.enchantedBook.itemID, 100); - addContent(true, items, Item.ingotGold.itemID, 80, 1, 3); - addContent(true, items, Item.diamond.itemID, 40, 1, 2); - addContent(true, items, Item.emerald.itemID, 20, 1, 2); - addContent(true, items, Item.appleGold.itemID, 10); + addContent(true, items, Items.iron_ingot, 160, 1, 3); + addContent(true, items, Items.coal, 120, 1, 3); + addContent(true, items, Items.quartz, 120, 1, 3); + addContent(true, items, Items.book, 100); + addContent(true, items, Items.gold_ingot, 80, 1, 3); + addContent(true, items, Items.diamond, 40, 1, 2); + addContent(true, items, Items.emerald, 20, 1, 2); + addContent(true, items, Items.golden_apple, 10); - addContent(properties.FabricOfRealityLootEnabled, items, mod_pocketDim.blockDimWall.blockID, 20, 16, 64); - addContent(properties.WorldThreadLootEnabled, items, mod_pocketDim.itemWorldThread.itemID, 80, 2, 12); + addContent(properties.FabricOfRealityLootEnabled, items, Item.getItemFromBlock(mod_pocketDim.blockDimWall), 20, 16, 64); + addContent(properties.WorldThreadLootEnabled, items, mod_pocketDim.itemWorldThread, 80, 2, 12); // Add all the items to our dungeon chest addItemsToContainer(DungeonChestInfo, items); } private static void addContent(boolean include, ArrayList items, - int itemID, int weight) + Item item, int weight) { if (include) - items.add(new WeightedRandomChestContent(itemID, 0, 1, 1, weight)); + items.add(new WeightedRandomChestContent(item, 0, 1, 1, weight)); } private static void addContent(boolean include, ArrayList items, - int itemID, int weight, int minAmount, int maxAmount) + Item item, int weight, int minAmount, int maxAmount) { if (include) - items.add(new WeightedRandomChestContent(itemID, 0, minAmount, maxAmount, weight)); + items.add(new WeightedRandomChestContent(item, 0, minAmount, maxAmount, weight)); } private static void addItemsToContainer(ChestGenHooks container, ArrayList items) @@ -156,25 +157,25 @@ public class DDLoot { count = MathHelper.getRandomIntegerInRange(random, 2, 5); for (k = 0; k < count; k++) { - stacks.add( new ItemStack(Item.bone, 1) ); + stacks.add( new ItemStack(Items.bone, 1) ); } count = MathHelper.getRandomIntegerInRange(random, 2, 4); for (k = 0; k < count; k++) { - stacks.add( new ItemStack(Item.rottenFlesh, 1) ); + stacks.add( new ItemStack(Items.rotten_flesh, 1) ); } // Insert tools // 30% chance of adding a pickaxe if (random.nextInt(100) < 30) { - addModifiedTool(Item.pickaxeIron, stacks, random); + addModifiedTool(Items.iron_pickaxe, stacks, random); } // 30% chance of adding a bow and some arrows if (random.nextInt(100) < 30) { addModifiedBow(stacks, random); - stacks.add( new ItemStack(Item.arrow, MathHelper.getRandomIntegerInRange(random, 8, 32)) ); + stacks.add( new ItemStack(Items.arrow, MathHelper.getRandomIntegerInRange(random, 8, 32)) ); } // 10% chance of adding a Rift Blade (no enchants) if (properties.RiftBladeLootEnabled && random.nextInt(100) < 10) @@ -184,25 +185,25 @@ public class DDLoot { else { // 20% of adding an iron sword, 10% of adding a stone sword - addModifiedSword( getRandomItem(Item.swordIron, Item.swordStone, null, 20, 10, random) , stacks, random); + addModifiedSword( getRandomItem(Items.iron_sword, Items.stone_sword, null, 20, 10, random) , stacks, random); } // Insert equipment // For each piece, 25% of an iron piece, 10% of a chainmail piece - addModifiedEquipment( getRandomItem(Item.helmetIron, Item.helmetChain, null, 25, 10, random) , stacks, random); - addModifiedEquipment( getRandomItem(Item.plateIron, Item.plateChain, null, 25, 10, random) , stacks, random); - addModifiedEquipment( getRandomItem(Item.legsIron, Item.legsChain, null, 25, 10, random) , stacks, random); - addModifiedEquipment( getRandomItem(Item.bootsIron, Item.bootsChain, null, 25, 10, random) , stacks, random); + addModifiedEquipment( getRandomItem(Items.iron_helmet, Items.chainmail_helmet, null, 25, 10, random) , stacks, random); + addModifiedEquipment( getRandomItem(Items.iron_chestplate, Items.chainmail_chestplate, null, 25, 10, random) , stacks, random); + addModifiedEquipment( getRandomItem(Items.iron_leggings, Items.chainmail_leggings, null, 25, 10, random) , stacks, random); + addModifiedEquipment( getRandomItem(Items.iron_boots, Items.iron_boots, null, 25, 10, random) , stacks, random); // Insert other random stuff // 40% chance for a name tag, 35% chance for a glass bottle // 30% chance for an ender pearl, 5% chance for record 11 // 30% chance for a ghast tear - addItemWithChance(stacks, random, 40, Item.nameTag, 1); - addItemWithChance(stacks, random, 35, Item.glassBottle, 1); - addItemWithChance(stacks, random, 30, Item.enderPearl, 1); - addItemWithChance(stacks, random, 30, Item.ghastTear, 1); - addItemWithChance(stacks, random, 5, Item.record11, 1); + addItemWithChance(stacks, random, 40, Items.name_tag, 1); + addItemWithChance(stacks, random, 35, Items.glass_bottle, 1); + addItemWithChance(stacks, random, 30, Items.ender_pearl, 1); + addItemWithChance(stacks, random, 30, Items.ghast_tear, 1); + addItemWithChance(stacks, random, 5, Items.record_11, 1); // Finally, there is a 5% chance of adding a player head if (random.nextInt(100) < 5) @@ -239,7 +240,7 @@ public class DDLoot { private static void addModifiedBow(ArrayList stacks, Random random) { - stacks.add( getModifiedItem(Item.bow, random, new Enchantment[] { Enchantment.flame, Enchantment.power, Enchantment.punch }) ); + stacks.add( getModifiedItem(Items.bow, random, new Enchantment[] { Enchantment.flame, Enchantment.power, Enchantment.punch }) ); } private static ItemStack getModifiedItem(Item item, Random random, Enchantment[] enchantments) @@ -289,7 +290,7 @@ public class DDLoot { { skullOwner = deathTracker.getRandomUsername(random); } - ItemStack skull = new ItemStack(Item.skull, 1, PLAYER_SKULL_METADATA); + ItemStack skull = new ItemStack(Items.skull, 1, PLAYER_SKULL_METADATA); skull.stackTagCompound = new NBTTagCompound(); skull.stackTagCompound.setString("SkullOwner", skullOwner); stacks.add(skull); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index b6d24e5..7d84b10 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -1,20 +1,24 @@ package StevenDimDoors.mod_pocketDim.blocks; import java.util.Random; + +import StevenDimDoors.mod_pocketDim.core.LinkType; import net.minecraft.block.Block; import net.minecraft.block.BlockDoor; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.IconFlipped; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Icon; +import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -32,23 +36,23 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn protected final DDProperties properties; @SideOnly(Side.CLIENT) - protected Icon[] upperTextures; + protected IIcon[] upperTextures; @SideOnly(Side.CLIENT) - protected Icon[] lowerTextures; + protected IIcon[] lowerTextures; - public BaseDimDoor(int blockID, Material material, DDProperties properties) + public BaseDimDoor(Material material, DDProperties properties) { - super(blockID, material); + super(material); this.properties = properties; } @Override @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister iconRegister) + public void registerBlockIcons(IIconRegister iconRegister) { - upperTextures = new Icon[2]; - lowerTextures = new Icon[2]; + upperTextures = new IIcon[2]; + lowerTextures = new IIcon[2]; upperTextures[0] = iconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "_upper"); lowerTextures[0] = iconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "_lower"); upperTextures[1] = new IconFlipped(upperTextures[0], true, false); @@ -60,7 +64,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn */ @Override @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int metadata) + public IIcon getIcon(int side, int metadata) { return this.upperTextures[0]; } @@ -88,7 +92,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn final int MAGIC_CONSTANT = 1003; - int metadata = this.getFullMetadata(world, x, y, z); + int metadata = world.getBlockMetadata(x, y, z); int lowMeta = metadata & 7; lowMeta ^= 4; @@ -112,7 +116,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn public void onBlockAdded(World world, int x, int y, int z) { this.placeLink(world, x, y, z); - world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + world.setTileEntity(x, y, z, this.createNewTileEntity(world, world.getBlockMetadata(x, y, z))); this.updateAttachedTile(world, x, y, z); } @@ -121,11 +125,11 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn */ @Override @SideOnly(Side.CLIENT) - public Icon getBlockTexture(IBlockAccess blockAccess, int x, int y, int z, int side) + public IIcon getIcon(IBlockAccess blockAccess, int x, int y, int z, int side) { if (side != 1 && side != 0) { - int fullMetadata = this.getFullMetadata(blockAccess, x, y, z); + int fullMetadata = blockAccess.getBlockMetadata(x, y, z); int orientation = fullMetadata & 3; boolean reversed = false; @@ -186,13 +190,13 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn public BaseDimDoor updateAttachedTile(World world, int x, int y, int z) { mod_pocketDim.proxy.updateDoorTE(this, world, x, y, z); - TileEntity tile = world.getBlockTileEntity(x, y, z); + TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileEntityDimDoor) { int metadata = world.getBlockMetadata(x, y, z); TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; dimTile.openOrClosed = isDoorOnRift(world, x, y, z) && isUpperDoorBlock(metadata); - dimTile.orientation = this.getFullMetadata(world, x, y, z) & 7; + dimTile.orientation = world.getBlockMetadata(x, y, z) & 7; } return this; } @@ -242,7 +246,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn @Override public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) { - this.setDoorRotation(this.getFullMetadata(par1IBlockAccess, par2, par3, par4)); + this.setDoorRotation(par1IBlockAccess.getBlockMetadata(par2, par3, par4)); } @@ -334,24 +338,24 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn * their own) Args: x, y, z, neighbor blockID */ @Override - public void onNeighborBlockChange(World world, int x, int y, int z, int neighborID) + public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { int metadata = world.getBlockMetadata(x, y, z); if (isUpperDoorBlock(metadata)) { - if (world.getBlockId(x, y - 1, z) != this.blockID) + if (world.getBlock(x, y - 1, z) != this) { world.setBlockToAir(x, y, z); } - if (neighborID > 0 && neighborID != this.blockID) + if (!neighbor.isAir(world, x, y, z) && neighbor != this) { - this.onNeighborBlockChange(world, x, y - 1, z, neighborID); + this.onNeighborBlockChange(world, x, y - 1, z, neighbor); } } else { - if (world.getBlockId(x, y + 1, z) != this.blockID) + if (world.getBlock(x, y + 1, z) != this) { world.setBlockToAir(x, y, z); if (!world.isRemote) @@ -362,9 +366,9 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn else if(this.getLockStatus(world, x, y, z)<=1) { boolean powered = world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z); - if ((powered || neighborID > 0 && Block.blocksList[neighborID].canProvidePower()) && neighborID != this.blockID) + if ((powered || !neighbor.isAir(world, x, y, z) && neighbor.canProvidePower()) && neighbor != this) { - this.onPoweredBlockChange(world, x, y, z, powered); + this.func_150014_a(world, x, y, z, powered); } } } @@ -375,22 +379,22 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn */ @Override @SideOnly(Side.CLIENT) - public int idPicked(World world, int x, int y, int z) + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { - return this.getDoorItem(); + return new ItemStack(this.getDoorItem(), 1, 0); } /** * Returns the ID of the items to drop on destruction. */ @Override - public int idDropped(int metadata, Random random, int fortune) + public Item getItemDropped(int metadata, Random random, int fortune) { - return isUpperDoorBlock(metadata) ? 0 : this.getDrops(); + return isUpperDoorBlock(metadata) ? null : this.getDoorItem(); } @Override - public TileEntity createNewTileEntity(World world) + public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityDimDoor(); } @@ -405,7 +409,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn } // Check that this is the top block of the door - if (world.getBlockId(x, y - 1, z) == this.blockID) + if (world.getBlock(x, y - 1, z) == this) { int metadata = world.getBlockMetadata(x, y - 1, z); boolean canUse = isDoorOpen(metadata); @@ -418,7 +422,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn { // Teleport the entity through the link, if it exists DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); - if (link != null) + if (link != null && (link.linkType() != LinkType.PERSONAL || entity instanceof EntityPlayer)) { try { @@ -433,10 +437,10 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn // Close the door only after the entity goes through // so players don't have it slam in their faces. - this.onPoweredBlockChange(world, x, y, z, false); + this.func_150014_a(world, x, y, z, false); } } - else if (world.getBlockId(x, y + 1, z) == this.blockID) + else if (world.getBlock(x, y + 1, z) == this) { enterDimDoor(world, x, y + 1, z, entity); } @@ -525,20 +529,20 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn @Override public TileEntity initDoorTE(World world, int x, int y, int z) { - TileEntity te = this.createNewTileEntity(world); - world.setBlockTileEntity(x, y, z, te); + TileEntity te = this.createNewTileEntity(world, world.getBlockMetadata(x, y, z)); + world.setTileEntity(x, y, z, te); return te; } @Override - public void breakBlock(World world, int x, int y, int z, int oldBlockID, int oldMeta) + public void breakBlock(World world, int x, int y, int z, Block oldBlock, int oldMeta) { // This function runs on the server side after a block is replaced // We MUST call super.breakBlock() since it involves removing tile entities - super.breakBlock(world, x, y, z, oldBlockID, oldMeta); + super.breakBlock(world, x, y, z, oldBlock, oldMeta); // Schedule rift regeneration for this block if it was replaced - if (world.getBlockId(x, y, z) != oldBlockID) + if (world.getBlock(x, y, z) != oldBlock) { mod_pocketDim.riftRegenerator.scheduleFastRegeneration(x, y, z, world); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java index f17ef8e..e627985 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWall.java @@ -6,14 +6,14 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; -import net.minecraft.util.Icon; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -25,11 +25,11 @@ public class BlockDimWall extends Block { private static final float SUPER_HIGH_HARDNESS = 10000000000000F; private static final float SUPER_EXPLOSION_RESISTANCE = 18000000F; - private Icon[] blockIcon = new Icon[3]; + private IIcon[] blockIcon = new IIcon[3]; - public BlockDimWall(int blockID, int j, Material par2Material) + public BlockDimWall(int j, Material par2Material) { - super(blockID, par2Material); + super(par2Material); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); } @@ -65,7 +65,7 @@ public class BlockDimWall extends Block } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerBlockIcons(IIconRegister par1IconRegister) { this.blockIcon[0] = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); this.blockIcon[1] = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName() + "Perm"); @@ -74,7 +74,7 @@ public class BlockDimWall extends Block @SideOnly(Side.CLIENT) @Override - public Icon getIcon(int par1, int par2) + public IIcon getIcon(int par1, int par2) { switch(par2) { @@ -99,7 +99,7 @@ public class BlockDimWall extends Block @Override @SuppressWarnings({ "rawtypes", "unchecked" }) @SideOnly(Side.CLIENT) - public void getSubBlocks(int unknown, CreativeTabs tab, List subItems) + public void getSubBlocks(Item unknown, CreativeTabs tab, List subItems) { for (int ix = 0; ix < 3; ix++) { @@ -138,10 +138,10 @@ public class BlockDimWall extends Block // SenseiKiwi: Using getBlockID() rather than the raw itemID is critical. // Some mods may override that function and use item IDs outside the range // of the block list. - - int blockID = ((ItemBlock) playerEquip).getBlockID(); - Block block = Block.blocksList[blockID]; - if (!Block.isNormalCube(blockID) || block instanceof BlockContainer || blockID == this.blockID) + + ItemBlock playerEquipItemBlock = (ItemBlock)playerEquip; + Block block = playerEquipItemBlock.field_150939_a; + if (!block.isNormalCube(world, x, y, z) || block instanceof BlockContainer || block == this) { return false; } @@ -151,7 +151,7 @@ public class BlockDimWall extends Block { entityPlayer.getCurrentEquippedItem().stackSize--; } - world.setBlock(x, y, z, entityPlayer.getCurrentEquippedItem().itemID, entityPlayer.getCurrentEquippedItem().getItemDamage(), 0); + world.setBlock(x, y, z, block, playerEquipItemBlock.getMetadata(entityPlayer.getCurrentEquippedItem().getItemDamage()), 0); } return true; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java index d3dac45..e75abe3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDimWallPerm.java @@ -4,7 +4,7 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -22,16 +22,16 @@ public class BlockDimWallPerm extends Block private static final Random random = new Random(); private static DDProperties properties = null; - public BlockDimWallPerm(int i, int j, Material par2Material) + public BlockDimWallPerm(int j, Material par2Material) { - super(i, Material.ground); + super(Material.ground); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); if (properties == null) properties = DDProperties.instance(); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerBlockIcons(IIconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); } @@ -87,7 +87,7 @@ public class BlockDimWallPerm extends Block if (Math.abs(xc) + Math.abs(zc) < random.nextInt(3) + 2 || Math.abs(xc) + Math.abs(zc) < random.nextInt(3) + 3) { - overworld.setBlock(destinationX + xc, destinationY - 1, destinationZ + zc, properties.LimboBlockID); + overworld.setBlock(destinationX + xc, destinationY - 1, destinationZ + zc, mod_pocketDim.blockLimbo); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java index f535db3..9f27eae 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java @@ -5,8 +5,7 @@ import java.util.Random; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.IconFlipped; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.util.Icon; +import net.minecraft.item.Item; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -15,9 +14,9 @@ import cpw.mods.fml.relauncher.SideOnly; public class BlockDoorGold extends BlockDoor { - public BlockDoorGold(int par1, Material par2Material) + public BlockDoorGold(Material par2Material) { - super(par1, par2Material); + super( par2Material); } @SideOnly(Side.CLIENT) @@ -28,8 +27,8 @@ public class BlockDoorGold extends BlockDoor @Override - public int idDropped(int par1, Random par2Random, int par3) + public Item getItemDropped(int par1, Random par2Random, int par3) { - return (par1 & 8) != 0 ? 0 : mod_pocketDim.itemGoldenDoor.itemID; + return (par1 & 8) != 0 ? null : mod_pocketDim.itemGoldenDoor; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java index fb06a00..58a4048 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java @@ -6,12 +6,13 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; +import net.minecraft.item.Item; public class BlockDoorQuartz extends BlockDoor { - public BlockDoorQuartz(int par1, Material par2Material) + public BlockDoorQuartz(Material par2Material) { - super(par1, par2Material); + super(par2Material); } @SideOnly(Side.CLIENT) @@ -21,8 +22,8 @@ public class BlockDoorQuartz extends BlockDoor } @Override - public int idDropped(int par1, Random par2Random, int par3) + public Item getItemDropped(int par1, Random par2Random, int par3) { - return (par1 & 8) != 0 ? 0 : mod_pocketDim.itemGoldenDoor.itemID; + return (par1 & 8) != 0 ? null : mod_pocketDim.itemGoldenDoor; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java index 22055a9..a4d4e43 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockGoldDimDoor.java @@ -9,21 +9,22 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; import net.minecraft.block.material.Material; +import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class BlockGoldDimDoor extends BaseDimDoor { - public BlockGoldDimDoor(int blockID, Material material, DDProperties properties) + public BlockGoldDimDoor(Material material, DDProperties properties) { - super(blockID, material, properties); + super( material, properties); } @Override public void placeLink(World world, int x, int y, int z) { - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + if (!world.isRemote && world.getBlock(x, y - 1, z) == this) { NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(x, y, z); @@ -35,19 +36,13 @@ public class BlockGoldDimDoor extends BaseDimDoor } @Override - public int getDoorItem() + public Item getDoorItem() { - return mod_pocketDim.itemGoldenDimensionalDoor.itemID; + return mod_pocketDim.itemGoldenDimensionalDoor; } @Override - public int getDrops() - { - return mod_pocketDim.itemGoldenDoor.itemID; - } - - @Override - public TileEntity createNewTileEntity(World world) + public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityDimDoorGold(); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockLimbo.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockLimbo.java index 07f1247..87ae7b4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockLimbo.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockLimbo.java @@ -4,8 +4,8 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.util.Icon; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -18,9 +18,9 @@ public class BlockLimbo extends Block private final int limboDimensionID; private final LimboDecay decay; - public BlockLimbo(int i, int j, Material par2Material, int limboDimensionID, LimboDecay decay) + public BlockLimbo(int j, Material par2Material, int limboDimensionID, LimboDecay decay) { - super(i, Material.ground); + super(Material.ground); this.limboDimensionID = limboDimensionID; this.decay = decay; this.setTickRandomly(true); @@ -32,19 +32,19 @@ public class BlockLimbo extends Block */ @SideOnly(Side.CLIENT) @Override - public Icon getBlockTexture(IBlockAccess blockAccess, int x, int y, int z, int side) + public IIcon getIcon(IBlockAccess blockAccess, int x, int y, int z, int side) { return this.getIcon(side, blockAccess.getBlockMetadata(x, y, z)); } @Override - public void registerIcons(IconRegister iconRegister) + public void registerBlockIcons(IIconRegister iconRegister) { this.blockIcon = iconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); } @Override - public Icon getIcon(int par1, int par2) + public IIcon getIcon(int par1, int par2) { return this.blockIcon; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 5890b49..8be2c45 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -7,15 +7,18 @@ import java.util.Queue; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.block.BlockFlowing; -import net.minecraft.block.BlockFluid; +import net.minecraft.block.BlockLiquid; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fluids.IFluidBlock; @@ -47,48 +50,48 @@ public class BlockRift extends Block implements ITileEntityProvider public static final int MAX_WORLD_THREAD_DROP_CHANCE = 1000; private final DDProperties properties; - private final ArrayList blocksImmuneToRift; // List of Vanilla blocks immune to rifts - private final ArrayList modBlocksImmuneToRift; // List of DD blocks immune to rifts + private final ArrayList blocksImmuneToRift; // List of Vanilla blocks immune to rifts + private final ArrayList modBlocksImmuneToRift; // List of DD blocks immune to rifts - public BlockRift(int i, int j, Material par2Material, DDProperties properties) + public BlockRift(int j, Material par2Material, DDProperties properties) { - super(i, par2Material); + super(par2Material); this.setTickRandomly(true); this.properties = properties; - this.modBlocksImmuneToRift = new ArrayList(); - this.modBlocksImmuneToRift.add(properties.FabricBlockID); - this.modBlocksImmuneToRift.add(properties.PermaFabricBlockID); - this.modBlocksImmuneToRift.add(properties.DimensionalDoorID); - this.modBlocksImmuneToRift.add(properties.WarpDoorID); - this.modBlocksImmuneToRift.add(properties.TransTrapdoorID); - this.modBlocksImmuneToRift.add(properties.UnstableDoorID); - this.modBlocksImmuneToRift.add(properties.RiftBlockID); - this.modBlocksImmuneToRift.add(properties.TransientDoorID); - this.modBlocksImmuneToRift.add(properties.GoldenDimensionalDoorID); - this.modBlocksImmuneToRift.add(properties.GoldenDoorID); + this.modBlocksImmuneToRift = new ArrayList(); + this.modBlocksImmuneToRift.add(mod_pocketDim.blockDimWall); + this.modBlocksImmuneToRift.add(mod_pocketDim.blockDimWallPerm); + this.modBlocksImmuneToRift.add(mod_pocketDim.dimensionalDoor); + this.modBlocksImmuneToRift.add(mod_pocketDim.warpDoor); + this.modBlocksImmuneToRift.add(mod_pocketDim.transTrapdoor); + this.modBlocksImmuneToRift.add(mod_pocketDim.unstableDoor); + this.modBlocksImmuneToRift.add(mod_pocketDim.blockRift); + this.modBlocksImmuneToRift.add(mod_pocketDim.transientDoor); + this.modBlocksImmuneToRift.add(mod_pocketDim.goldenDimensionalDoor); + this.modBlocksImmuneToRift.add(mod_pocketDim.goldenDoor); - this.blocksImmuneToRift = new ArrayList(); + this.blocksImmuneToRift = new ArrayList(); - this.blocksImmuneToRift.add(properties.FabricBlockID); - this.blocksImmuneToRift.add(properties.PermaFabricBlockID); - this.blocksImmuneToRift.add(properties.DimensionalDoorID); - this.blocksImmuneToRift.add(properties.WarpDoorID); - this.blocksImmuneToRift.add(properties.TransTrapdoorID); - this.blocksImmuneToRift.add(properties.UnstableDoorID); - this.blocksImmuneToRift.add(properties.RiftBlockID); - this.blocksImmuneToRift.add(properties.TransientDoorID); - this.blocksImmuneToRift.add(properties.GoldenDimensionalDoorID); - this.blocksImmuneToRift.add(properties.GoldenDoorID); - this.blocksImmuneToRift.add(properties.PersonalDimDoorID); - this.blocksImmuneToRift.add(Block.blockLapis.blockID); - this.blocksImmuneToRift.add(Block.blockIron.blockID); - this.blocksImmuneToRift.add(Block.blockGold.blockID); - this.blocksImmuneToRift.add(Block.blockDiamond.blockID); - this.blocksImmuneToRift.add(Block.blockEmerald.blockID); + this.blocksImmuneToRift.add(mod_pocketDim.blockDimWall); + this.blocksImmuneToRift.add(mod_pocketDim.blockDimWallPerm); + this.blocksImmuneToRift.add(mod_pocketDim.dimensionalDoor); + this.blocksImmuneToRift.add(mod_pocketDim.warpDoor); + this.blocksImmuneToRift.add(mod_pocketDim.transTrapdoor); + this.blocksImmuneToRift.add(mod_pocketDim.unstableDoor); + this.blocksImmuneToRift.add(mod_pocketDim.blockRift); + this.blocksImmuneToRift.add(mod_pocketDim.transientDoor); + this.blocksImmuneToRift.add(mod_pocketDim.goldenDimensionalDoor); + this.blocksImmuneToRift.add(mod_pocketDim.goldenDoor); + this.blocksImmuneToRift.add(mod_pocketDim.personalDimDoor); + this.blocksImmuneToRift.add(Blocks.lapis_block); + this.blocksImmuneToRift.add(Blocks.iron_block); + this.blocksImmuneToRift.add(Blocks.gold_block); + this.blocksImmuneToRift.add(Blocks.diamond_block); + this.blocksImmuneToRift.add(Blocks.emerald_block); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerBlockIcons(IIconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); } @@ -166,7 +169,7 @@ public class BlockRift extends Block implements ITileEntityProvider //Randomly decide whether to search for blocks to destroy. This reduces the frequency of search operations, //moderates performance impact, and controls the apparent speed of block destruction. if (random.nextInt(MAX_BLOCK_SEARCH_CHANCE) < BLOCK_SEARCH_CHANCE && - ((TileEntityRift) world.getBlockTileEntity(x, y, z)).updateNearestRift() ) + ((TileEntityRift) world.getTileEntity(x, y, z)).updateNearestRift() ) { destroyNearbyBlocks(world, x, y, z, random); } @@ -184,8 +187,8 @@ public class BlockRift extends Block implements ITileEntityProvider { if (random.nextInt(MAX_BLOCK_DESTRUCTION_CHANCE) < BLOCK_DESTRUCTION_CHANCE) { - dropWorldThread(world.getBlockId(target.getX(), target.getY(), target.getZ()), world, x, y, z, random); - world.destroyBlock(target.getX(), target.getY(), target.getZ(), false); + dropWorldThread(world.getBlock(target.getX(), target.getY(), target.getZ()), world, x, y, z, random); + world.func_147480_a(target.getX(), target.getY(), target.getZ(), false); } } } @@ -231,12 +234,11 @@ public class BlockRift extends Block implements ITileEntityProvider return targets; } - public void dropWorldThread(int blockID, World world, int x, int y, int z, Random random) + public void dropWorldThread(Block block, World world, int x, int y, int z, Random random) { - if (blockID != 0 && (random.nextInt(MAX_WORLD_THREAD_DROP_CHANCE) < properties.WorldThreadDropChance) - && !(Block.blocksList[blockID] instanceof BlockFlowing || - Block.blocksList[blockID] instanceof BlockFluid || - Block.blocksList[blockID] instanceof IFluidBlock)) + if (!block.isAir(world, x, y, z) && (random.nextInt(MAX_WORLD_THREAD_DROP_CHANCE) < properties.WorldThreadDropChance) + && !(block instanceof BlockLiquid || + block instanceof IFluidBlock)) { ItemStack thread = new ItemStack(mod_pocketDim.itemWorldThread, 1); world.spawnEntityInWorld(new EntityItem(world, x, y, z, thread)); @@ -265,7 +267,8 @@ public class BlockRift extends Block implements ITileEntityProvider public boolean spreadRift(NewDimData dimension, DimLink parent, World world, Random random) { - int x, y, z, blockID; + int x, y, z; + Block block = null; Point4D source = parent.source(); // Find reachable blocks that are vulnerable to rift damage and include air @@ -281,11 +284,11 @@ public class BlockRift extends Block implements ITileEntityProvider z = target.getZ(); // Create a child, replace the block with a rift, and consider dropping World Thread - blockID = world.getBlockId(x, y, z); - if (world.setBlock(x, y, z, properties.RiftBlockID)) + block = world.getBlock(x, y, z); + if (world.setBlock(x, y, z, mod_pocketDim.blockRift)) { dimension.createChildLink(x, y, z, parent); - dropWorldThread(blockID, world, x, y, z, random); + dropWorldThread(block, world, x, y, z, random); return true; } } @@ -314,7 +317,7 @@ public class BlockRift extends Block implements ITileEntityProvider ArrayList targets=findReachableBlocks(world, x, y, z, 2, false); - TileEntityRift tile = (TileEntityRift)world.getBlockTileEntity(x, y, z); + TileEntityRift tile = (TileEntityRift)world.getTileEntity(x, y, z); if(rand.nextBoolean()) @@ -335,14 +338,14 @@ public class BlockRift extends Block implements ITileEntityProvider { if (world != null && !isBlockImmune(world, x, y, z)) { - return world.setBlock(x, y, z, mod_pocketDim.blockRift.blockID); + return world.setBlock(x, y, z, mod_pocketDim.blockRift); } return false; } public boolean isBlockImmune(World world, int x, int y, int z) { - Block block = Block.blocksList[world.getBlockId(x, y, z)]; + Block block = world.getBlock(x, y, z); if (block != null) { // SenseiKiwi: I've switched to using the block's blast resistance instead of its @@ -352,8 +355,8 @@ public class BlockRift extends Block implements ITileEntityProvider // I've set this to access blockResistance directly. Might need changing later. return (block.blockResistance >= MIN_IMMUNE_RESISTANCE || - modBlocksImmuneToRift.contains(block.blockID) || - blocksImmuneToRift.contains(block.blockID)); + modBlocksImmuneToRift.contains(block) || + blocksImmuneToRift.contains(block)); } return false; } @@ -362,41 +365,41 @@ public class BlockRift extends Block implements ITileEntityProvider { // Check whether the block at the specified location is one of the // rift-resistant blocks from DD. - Block block = Block.blocksList[world.getBlockId(x, y, z)]; + Block block = world.getBlock(x, y, z); if (block != null) { - return modBlocksImmuneToRift.contains(block.blockID); + return modBlocksImmuneToRift.contains(block); } return false; } @Override - public int idPicked(World par1World, int par2, int par3, int par4) + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) + { + return null; + } + + @Override + public Item getItemDropped(int par1, Random par2Random, int par3) { - return 0; + return null; } @Override - public int idDropped(int par1, Random par2Random, int par3) - { - return 0; - } - - @Override - public TileEntity createNewTileEntity(World world) + public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityRift(); } @Override - public void breakBlock(World world, int x, int y, int z, int oldBlockID, int oldMeta) + public void breakBlock(World world, int x, int y, int z, Block oldBlock, int oldMeta) { // This function runs on the server side after a block is replaced // We MUST call super.breakBlock() since it involves removing tile entities - super.breakBlock(world, x, y, z, oldBlockID, oldMeta); + super.breakBlock(world, x, y, z, oldBlock, oldMeta); // Schedule rift regeneration for this block if it was changed - if (world.getBlockId(x, y, z) != oldBlockID) + if (world.getBlock(x, y, z) != oldBlock) { mod_pocketDim.riftRegenerator.scheduleSlowRegeneration(x, y, z, world); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java index 8416f5f..65cc4a8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/DimensionalDoor.java @@ -12,15 +12,15 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; public class DimensionalDoor extends BaseDimDoor { - public DimensionalDoor(int blockID, Material material, DDProperties properties) + public DimensionalDoor(Material material, DDProperties properties) { - super(blockID, material, properties); + super(material, properties); } @Override public void placeLink(World world, int x, int y, int z) { - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + if (!world.isRemote && world.getBlock(x, y - 1, z) == this) { NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(x, y, z); @@ -32,14 +32,8 @@ public class DimensionalDoor extends BaseDimDoor } @Override - public int getDoorItem() + public Item getDoorItem() { - return mod_pocketDim.itemDimensionalDoor.itemID; - } - - @Override - public int getDrops() - { - return Item.doorIron.itemID; + return mod_pocketDim.itemDimensionalDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java index 608eeb3..dfe7f83 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/IDimDoor.java @@ -1,6 +1,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.entity.Entity; +import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -25,9 +26,7 @@ public interface IDimDoor */ public void placeLink(World world, int x, int y, int z); - public int getDrops(); - - public int getDoorItem(); + public Item getDoorItem(); public TileEntity initDoorTE(World world, int x, int y, int z); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java index 4dfb501..c95975c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java @@ -1,6 +1,7 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; +import net.minecraft.item.Item; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.config.DDProperties; @@ -12,16 +13,16 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; public class PersonalDimDoor extends BaseDimDoor { - public PersonalDimDoor(int blockID, Material material, DDProperties properties) + public PersonalDimDoor(Material material, DDProperties properties) { - super(blockID, material, properties); + super( material, properties); // TODO Auto-generated constructor stub } @Override public void placeLink(World world, int x, int y, int z) { - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + if (!world.isRemote && world.getBlock(x, y - 1, z) == this) { NewDimData dimension = PocketManager.getDimensionData(world); DimLink link = dimension.getLink(x, y, z); @@ -33,15 +34,9 @@ public class PersonalDimDoor extends BaseDimDoor } @Override - public int getDrops() + public Item getDoorItem() { - return mod_pocketDim.itemQuartzDoor.itemID; - } - - @Override - public int getDoorItem() - { - return mod_pocketDim.itemPersonalDoor.itemID; + return mod_pocketDim.itemPersonalDoor; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java index 453569b..a3da637 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransTrapdoor.java @@ -9,11 +9,15 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockTrapDoor; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; @@ -27,14 +31,14 @@ import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntityProvider { - public TransTrapdoor(int blockID, Material material) + public TransTrapdoor(Material material) { - super(blockID, material); + super(material); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerBlockIcons(IIconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName()); } @@ -92,20 +96,20 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit { if(this.checkCanOpen(par1World, par2, par3, par4)) { - super.onPoweredBlockChange(par1World, par2, par3, par4, par5); + super.func_150120_a(par1World, par2, par3, par4, par5); } } @Override public void enterDimDoor(World world, int x, int y, int z, Entity entity) { - if (!world.isRemote && isTrapdoorOpen(world.getBlockMetadata(x, y, z))) + if (!world.isRemote && func_150118_d(world.getBlockMetadata(x, y, z))) { DimLink link = PocketManager.getLink(x, y, z, world); - if (link != null) + if (link != null && (link.linkType() != LinkType.PERSONAL || entity instanceof EntityPlayer)) { DDTeleporter.traverseDimDoor(world, link, entity,this); } - super.onPoweredBlockChange(world, x, y, z, false); + super.func_150120_a(world, x, y, z, false); } } @@ -113,11 +117,11 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit public void onBlockAdded(World world, int x, int y, int z) { this.placeLink(world, x, y, z); - world.setBlockTileEntity(x, y, z, this.createNewTileEntity(world)); + world.setTileEntity(x, y, z, this.createNewTileEntity(world, world.getBlockMetadata(x, y, z))); } @Override - public TileEntity createNewTileEntity(World world) + public TileEntity createNewTileEntity(World world, int metadata) { return new TileEntityTransTrapdoor(); } @@ -138,28 +142,22 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit @Override @SideOnly(Side.CLIENT) - public int idPicked(World world, int x, int y, int z) + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) { - return this.getDoorItem(); + return new ItemStack(this.getDoorItem(), 1, 0); } @Override - public int idDropped(int metadata, Random random, int fortuneLevel) + public Item getItemDropped(int metadata, Random random, int fortuneLevel) { - return this.getDrops(); + return Item.getItemFromBlock(Blocks.trapdoor); } @Override - public int getDoorItem() + public Item getDoorItem() { - return mod_pocketDim.transTrapdoor.blockID; + return Item.getItemFromBlock(mod_pocketDim.transTrapdoor); } - - @Override - public int getDrops() - { - return Block.trapdoor.blockID; - } public static boolean isTrapdoorSetLow(int metadata) { @@ -169,8 +167,8 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit @Override public TileEntity initDoorTE(World world, int x, int y, int z) { - TileEntity te = this.createNewTileEntity(world); - world.setBlockTileEntity(x, y, z, te); + TileEntity te = this.createNewTileEntity(world, world.getBlockMetadata(x, y, z)); + world.setTileEntity(x, y, z, te); return te; } @@ -181,14 +179,14 @@ public class TransTrapdoor extends BlockTrapDoor implements IDimDoor, ITileEntit } @Override - public void breakBlock(World world, int x, int y, int z, int oldBlockID, int oldMeta) + public void breakBlock(World world, int x, int y, int z, Block oldBlock, int oldMeta) { // This function runs on the server side after a block is replaced // We MUST call super.breakBlock() since it involves removing tile entities - super.breakBlock(world, x, y, z, oldBlockID, oldMeta); + super.breakBlock(world, x, y, z, oldBlock, oldMeta); // Schedule rift regeneration for this block if it was replaced - if (world.getBlockId(x, y, z) != oldBlockID) + if (world.getBlock(x, y, z) != oldBlock) { mod_pocketDim.riftRegenerator.scheduleFastRegeneration(x, y, z, world); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java index 8364733..0d45171 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/TransientDoor.java @@ -1,9 +1,11 @@ package StevenDimDoors.mod_pocketDim.blocks; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.config.DDProperties; @@ -15,9 +17,9 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; public class TransientDoor extends BaseDimDoor { - public TransientDoor(int blockID, Material material, DDProperties properties) + public TransientDoor(Material material, DDProperties properties) { - super(blockID, material, properties); + super(material, properties); } @Override @@ -30,7 +32,7 @@ public class TransientDoor extends BaseDimDoor } // Check that this is the top block of the door - if (world.getBlockId(x, y - 1, z) == this.blockID) + if (world.getBlock(x, y - 1, z) == this) { boolean canUse = true; int metadata = world.getBlockMetadata(x, y - 1, z); @@ -45,15 +47,17 @@ public class TransientDoor extends BaseDimDoor DimLink link = PocketManager.getLink(x, y, z, world.provider.dimensionId); if (link != null) { - DDTeleporter.traverseDimDoor(world, link, entity, this); - // Turn the door into a rift AFTER teleporting the player. - // The door's orientation may be necessary for the teleport. - world.setBlock(x, y, z, properties.RiftBlockID); - world.setBlockToAir(x, y - 1, z); + if (link.linkType() != LinkType.PERSONAL || entity instanceof EntityPlayer) { + DDTeleporter.traverseDimDoor(world, link, entity, this); + // Turn the door into a rift AFTER teleporting the player. + // The door's orientation may be necessary for the teleport. + world.setBlock(x, y, z, mod_pocketDim.blockRift); + world.setBlockToAir(x, y - 1, z); + } } } } - else if (world.getBlockId(x, y + 1, z) == this.blockID) + else if (world.getBlock(x, y + 1, z) == this) { enterDimDoor(world, x, y + 1, z, entity); } @@ -62,7 +66,7 @@ public class TransientDoor extends BaseDimDoor @Override public void placeLink(World world, int x, int y, int z) { - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + if (!world.isRemote && world.getBlock(x, y - 1, z) == this) { NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(x, y, z); @@ -74,15 +78,9 @@ public class TransientDoor extends BaseDimDoor } @Override - public int getDoorItem() + public Item getDoorItem() { - return 0; - } - - @Override - public int getDrops() - { - return 0; + return null; } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java index 76b9911..a780e2d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/UnstableDoor.java @@ -1,7 +1,9 @@ package StevenDimDoors.mod_pocketDim.blocks; import net.minecraft.block.material.Material; +import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.config.DDProperties; @@ -9,17 +11,20 @@ import StevenDimDoors.mod_pocketDim.core.LinkType; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; +import java.util.ArrayList; +import java.util.Random; + public class UnstableDoor extends BaseDimDoor { - public UnstableDoor(int blockID, Material material, DDProperties properties) + public UnstableDoor(Material material, DDProperties properties) { - super(blockID, material, properties); + super(material, properties); } @Override public void placeLink(World world, int x, int y, int z) { - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + if (!world.isRemote && world.getBlock(x, y - 1, z) == this) { NewDimData dimension = PocketManager.getDimensionData(world); dimension.createLink(x, y, z, LinkType.RANDOM,world.getBlockMetadata(x, y - 1, z)); @@ -27,14 +32,14 @@ public class UnstableDoor extends BaseDimDoor } @Override - public int getDoorItem() + public Item getDoorItem() { - return mod_pocketDim.itemUnstableDoor.itemID; + return mod_pocketDim.itemUnstableDoor; } @Override - public int getDrops() + public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { - return Item.doorIron.itemID; + return Items.iron_door; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java index 45357e9..df10fac 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/WarpDoor.java @@ -12,15 +12,15 @@ import StevenDimDoors.mod_pocketDim.core.PocketManager; public class WarpDoor extends BaseDimDoor { - public WarpDoor(int blockID, Material material, DDProperties properties) + public WarpDoor(Material material, DDProperties properties) { - super(blockID, material, properties); + super(material, properties); } @Override public void placeLink(World world, int x, int y, int z) { - if (!world.isRemote && world.getBlockId(x, y - 1, z) == this.blockID) + if (!world.isRemote && world.getBlock(x, y - 1, z) == this) { NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(x, y, z); @@ -32,14 +32,8 @@ public class WarpDoor extends BaseDimDoor } @Override - public int getDoorItem() + public Item getDoorItem() { - return mod_pocketDim.itemWarpDoor.itemID; - } - - @Override - public int getDrops() - { - return Item.doorWood.itemID; + return mod_pocketDim.itemWarpDoor; } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java index badb0a2..fe6ac2e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/DDCommandBase.java @@ -4,7 +4,7 @@ import net.minecraft.command.CommandBase; import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.ChatMessageComponent; +import net.minecraft.util.ChatComponentText; /* * An abstract base class for our Dimensional Doors commands. This cleans up the code a little and provides @@ -85,9 +85,8 @@ public abstract class DDCommandBase extends CommandBase public static void sendChat(EntityPlayer player, String message) { - ChatMessageComponent cmp = new ChatMessageComponent(); - cmp.addText(message); - player.sendChatToPlayer(cmp); + ChatComponentText text = new ChatComponentText(message); + player.addChatMessage(text); } /* diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index 4996764..c448e2b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -2,56 +2,14 @@ package StevenDimDoors.mod_pocketDim.config; import java.io.File; -import net.minecraftforge.common.Configuration; import StevenDimDoors.mod_pocketDim.blocks.BlockRift; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; import StevenDimDoors.mod_pocketDim.world.fortresses.DDStructureNetherBridgeStart; import StevenDimDoors.mod_pocketDim.world.gateways.GatewayGenerator; +import net.minecraftforge.common.config.Configuration; public class DDProperties { - /** - * Block IDs - */ - - public final int UnstableDoorID; - public final int DimensionalDoorID; - public final int GoldenDoorID; - public final int GoldenDimensionalDoorID; - public final int WarpDoorID; - public final int TransTrapdoorID; - public final int TransientDoorID; - public final int FabricBlockID; - public final int RiftBlockID; - public final int QuartzDoorID; - public final int PersonalDimDoorID; - - - /** - * World Generation Block IDs - */ - - public final int LimboBlockID; - public final int PermaFabricBlockID; - - /** - * Item IDs - */ - - public final int RiftBladeItemID; - public final int RiftSignatureItemID; - public final int GoldenDimensionalDoorItemID; - public final int GoldenDoorItemID; - public final int RiftRemoverItemID; - public final int StableFabricItemID; - public final int StabilizedRiftSignatureItemID; - public final int DimensionalDoorItemID; - public final int UnstableDoorItemID; - public final int WarpDoorItemID; - public final int WorldThreadItemID; - public final int DDKeyItemID; - public final int ItemQuartzDoorID; - public final int ItemPersonalDimDoorID; /** * Other IDs @@ -195,38 +153,6 @@ public class DDProperties DoorRenderEntityID = config.get(CATEGORY_ENTITY, "Door Render Entity ID", 89).getInt(); MonolithEntityID = config.get(CATEGORY_ENTITY, "Monolith Entity ID", 125).getInt(); - DimensionalDoorID = config.getBlock("Dimensional Door Block ID", 1970).getInt(); - TransTrapdoorID = config.getBlock("Transdimensional Trapdoor Block ID", 1971).getInt(); - FabricBlockID =config.getBlock("Fabric Of Reality Block ID", 1973).getInt(); - WarpDoorID = config.getBlock("Warp Door Block ID", 1975).getInt(); - RiftBlockID = config.getBlock("Rift Block ID", 1977).getInt(); - UnstableDoorID = config.getBlock("Unstable Door Block ID", 1978).getInt(); - TransientDoorID = config.getBlock("Transient Door Block ID", 1979).getInt(); - GoldenDoorID = config.getBlock("Gold Door Block ID", 1980).getInt(); - GoldenDimensionalDoorID = config.getBlock("Gold Dim Door Block ID", 1981).getInt(); - QuartzDoorID = config.getBlock("Quartz Door Block ID", 1982).getInt(); - PersonalDimDoorID = config.getBlock("Personal Dim Door ID", 1983).getInt(); - - WarpDoorItemID = config.getItem("Warp Door Item ID", 5670).getInt(); - RiftRemoverItemID = config.getItem("Rift Remover Item ID", 5671).getInt(); - StableFabricItemID = config.getItem("Stable Fabric Item ID", 5672).getInt(); - UnstableDoorItemID = config.getItem("Unstable Door Item ID", 5673).getInt(); - DimensionalDoorItemID = config.getItem("Dimensional Door Item ID", 5674).getInt(); - RiftSignatureItemID = config.getItem("Rift Signature Item ID", 5675).getInt(); - RiftBladeItemID = config.getItem("Rift Blade Item ID", 5676).getInt(); - StabilizedRiftSignatureItemID = config.getItem("Stabilized Rift Signature Item ID", 5677).getInt(); - GoldenDoorItemID = config.getItem("Gold Door Item ID", 5678).getInt(); - GoldenDimensionalDoorItemID = config.getItem("Gold Dim Door Item ID", 5679).getInt(); - WorldThreadItemID = config.getItem("World Thread Item ID", 5680).getInt(); - DDKeyItemID = config.getItem("Rift Key Item ID", 5681).getInt(); - ItemQuartzDoorID = config.getItem("Quartz Door Item ID", 5681).getInt(); - ItemPersonalDimDoorID = config.getItem("Personal Dim Door ID", 5681).getInt(); - - LimboBlockID = config.getTerrainBlock("World Generation Block IDs - must be less than 256", "Limbo Block ID", 217, - "Blocks used for the terrain in Limbo").getInt(); - PermaFabricBlockID = config.getTerrainBlock("World Generation Block IDs - must be less than 256", - "Perma Fabric Block ID", 220, "Blocks used for enclosing pocket dimensions").getInt(); - LimboDimensionID = config.get(CATEGORY_DIMENSION, "Limbo Dimension ID", -23).getInt(); PocketProviderID = config.get(CATEGORY_PROVIDER, "Pocket Provider ID", 124).getInt(); LimboProviderID = config.get(CATEGORY_PROVIDER, "Limbo Provider ID", 113).getInt(); @@ -259,14 +185,6 @@ public class DDProperties PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 149).getInt(); config.save(); - - // Unfortunately, there are users out there who have been misconfiguring the worldgen blocks to have IDs above 255. - // This leads to disastrous and cryptic errors in other areas of Minecraft. To prevent headaches, we'll throw - // an exception here if the blocks have invalid IDs. - if (LimboBlockID > 255 || PermaFabricBlockID > 255) - { - throw new IllegalStateException("World generation blocks MUST have block IDs less than 256. Fix your configuration!"); - } } public static DDProperties initialize(File configFile) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java index b2a4569..be2f642 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDWorldProperties.java @@ -1,8 +1,8 @@ package StevenDimDoors.mod_pocketDim.config; -import java.io.File; +import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.Configuration; +import java.io.File; public class DDWorldProperties { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 3096f35..9fa1e29 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -8,11 +8,9 @@ import net.minecraft.entity.EntityList; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet41EntityEffect; -import net.minecraft.network.packet.Packet43Experience; -import net.minecraft.network.packet.Packet9Respawn; import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; @@ -59,8 +57,8 @@ public class DDTeleporter int x = destination.getX(); int y = destination.getY(); int z = destination.getZ(); - int blockIDTop; - int blockIDBottom; + Block blockTop; + Block blockBottom; Point3D point; switch (orientation) @@ -81,19 +79,19 @@ public class DDTeleporter point = new Point3D(x, y - 1, z); break; } - blockIDBottom = world.getBlockId(point.getX(), point.getY(), point.getZ()); - blockIDTop = world.getBlockId(point.getX(), point.getY() + 1, point.getZ()); + blockBottom = world.getBlock(point.getX(), point.getY(), point.getZ()); + blockTop = world.getBlock(point.getX(), point.getY() + 1, point.getZ()); - if (Block.blocksList[blockIDBottom] != null) + if (blockBottom != null) { - if (!Block.blocksList[blockIDBottom].isBlockReplaceable(world, point.getX(), point.getY(), point.getZ()) && world.isBlockOpaqueCube(point.getX(), point.getY(), point.getZ())) + if (!blockBottom.isReplaceable(world, point.getX(), point.getY(), point.getZ()) && world.isBlockNormalCubeDefault(point.getX(), point.getY(), point.getZ(), false)) { return false; } } - if (Block.blocksList[blockIDTop] != null) + if (blockTop != null) { - if (!Block.blocksList[blockIDTop].isBlockReplaceable(world, point.getX(), point.getY() + 1, point.getZ())) + if (!blockTop.isReplaceable(world, point.getX(), point.getY() + 1, point.getZ())) { return false; } @@ -221,7 +219,7 @@ public class DDTeleporter } //Check if the block below that point is actually a door - Block block = Block.blocksList[world.getBlockId(door.getX(), door.getY() - 1, door.getZ())]; + Block block = world.getBlock(door.getX(), door.getY() - 1, door.getZ()); if (block==null || !(block instanceof IDimDoor)) { //Return the pocket's orientation instead @@ -394,7 +392,7 @@ public class DDTeleporter * Also ensures correct orientation relative to the door. * @param world - world the player is currently in * @param link - the link the player is using to teleport; sends the player to its destination - * @param player - the instance of the player to be teleported + * @param entity - the instance of the player to be teleported */ public static void traverseDimDoor(World world, DimLink link, Entity entity, Block door) { @@ -495,7 +493,7 @@ public class DDTeleporter case POCKET: return PocketBuilder.generateNewPocket(link, properties, door, DimensionType.POCKET); case PERSONAL: - return setupPersonalLink(link, properties, entity, door); + return setupPersonalLink(link, properties, (EntityPlayer)entity, door); case SAFE_EXIT: return generateSafeExit(link, properties); case DUNGEON_EXIT: @@ -511,14 +509,14 @@ public class DDTeleporter } } - private static boolean setupPersonalLink(DimLink link, DDProperties properties,Entity player, Block door) + private static boolean setupPersonalLink(DimLink link, DDProperties properties,EntityPlayer player, Block door) { if(!(player instanceof EntityPlayer)) { return false; } - NewDimData dim = PocketManager.getPersonalDimensionForPlayer(player.getEntityName()); + NewDimData dim = PocketManager.getPersonalDimensionForPlayer(player.getGameProfile().getId().toString()); if(dim == null) { return PocketBuilder.generateNewPersonalPocket(link, properties, player, door); @@ -602,7 +600,7 @@ public class DDTeleporter { World startWorld = PocketManager.loadDimension(link.source().getDimension()); World destWorld = PocketManager.loadDimension(link.destination().getDimension()); - TileEntity doorTE = startWorld.getBlockTileEntity(link.source().getX(), link.source().getY(), link.point.getZ()); + TileEntity doorTE = startWorld.getTileEntity(link.source().getX(), link.source().getY(), link.point.getZ()); if(doorTE instanceof TileEntityDimDoor) { if((TileEntityDimDoor.class.cast(doorTE).hasGennedPair)) @@ -610,11 +608,11 @@ public class DDTeleporter return; } TileEntityDimDoor.class.cast(doorTE).hasGennedPair=true; - Block blockToReplace = Block.blocksList[destWorld.getBlockId(link.destination().getX(), link.destination().getY(), link.destination().getZ())]; + Block blockToReplace = destWorld.getBlock(link.destination().getX(), link.destination().getY(), link.destination().getZ()); if(!destWorld.isAirBlock(link.destination().getX(), link.destination().getY(), link.destination().getZ())) { - if(!blockToReplace.isBlockReplaceable(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ())) + if(!blockToReplace.isReplaceable(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ())) { return; } @@ -739,9 +737,9 @@ public class DDTeleporter // Checking if the block is not an opaque solid is equivalent // checking for a replaceable block, because we only allow // exits intersecting blocks on those two surfaces. - if (!world.isBlockNormalCube(x + dx, y, z + dz)) + if (!world.isBlockNormalCubeDefault(x + dx, y, z + dz, false)) { - world.setBlock(x + dx, y, z + dz, properties.FabricBlockID, 0, 2); + world.setBlock(x + dx, y, z + dz, mod_pocketDim.blockDimWall, 0, 2); } } } @@ -755,7 +753,7 @@ public class DDTeleporter { for (int dz = -1; dz <= 1; dz++) { - world.setBlock(x + dx, y + dy, z + dz, 0, 0, 2); + world.setBlock(x + dx, y + dy, z + dz, Blocks.air, 0, 2); } } } @@ -768,7 +766,7 @@ public class DDTeleporter sourceDim.setLinkDestination(reverse, source.getX(), source.getY(), source.getZ()); // Set up the warp door at the destination - orientation = BlockRotator.transformMetadata(orientation, 2, properties.WarpDoorID); + orientation = BlockRotator.transformMetadata(orientation, 2, mod_pocketDim.warpDoor); ItemDoor.placeDoorBlock(world, x, y + 1, z, orientation, mod_pocketDim.warpDoor); // Complete the link to the destination diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java index f0b646e..f3df3eb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -8,6 +8,7 @@ import java.util.Random; import java.util.Stack; import java.util.TreeMap; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; import net.minecraft.item.ItemStack; import net.minecraft.world.ChunkCoordIntPair; @@ -251,7 +252,7 @@ public abstract class NewDimData implements IPackable for (k = -range; k <= range; k++) { distance = getAbsoluteSum(i, j, k); - if (distance > 0 && distance < minDistance && world.getBlockId(x + i, y + j, z + k) == properties.RiftBlockID) + if (distance > 0 && distance < minDistance && world.getBlock(x + i, y + j, z + k) == mod_pocketDim.blockRift) { link = getLink(x + i, y + j, z + k); if (link != null) @@ -290,7 +291,7 @@ public abstract class NewDimData implements IPackable for (k = -range; k <= range; k++) { distance = getAbsoluteSum(i, j, k); - if (distance > 0 && world.getBlockId(x + i, y + j, z + k) == properties.RiftBlockID) + if (distance > 0 && world.getBlock(x + i, y + j, z + k) == mod_pocketDim.blockRift) { link = getLink(x + i, y + j, z + k); if (link != null) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index afcbc0e..460a9c7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -11,6 +11,7 @@ import java.util.Random; import java.util.TreeMap; import net.minecraft.block.Block; import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; @@ -113,7 +114,7 @@ public class DungeonSchematic extends Schematic { applyFilter(finder); //Flip the entrance's orientation to get the dungeon's orientation - orientation = BlockRotator.transformMetadata(finder.getEntranceOrientation(), 2, Block.doorWood.blockID); + orientation = BlockRotator.transformMetadata(finder.getEntranceOrientation(), 2, Blocks.wooden_door); entranceDoorLocation = finder.getEntranceDoorLocation(); exitDoorLocations = finder.getExitDoorLocations(); @@ -233,7 +234,7 @@ public class DungeonSchematic extends Schematic { count = tileEntities.tagCount(); for (index = 0; index < count; index++) { - NBTTagCompound tileTag = (NBTTagCompound) tileEntities.tagAt(index); + NBTTagCompound tileTag = (NBTTagCompound) tileEntities.getCompoundTagAt(index); //Rewrite its location to be in world coordinates pocketPoint.setX(tileTag.getInteger("x")); pocketPoint.setY(tileTag.getInteger("y")); @@ -243,7 +244,7 @@ public class DungeonSchematic extends Schematic { tileTag.setInteger("y", pocketPoint.getY()); tileTag.setInteger("z", pocketPoint.getZ()); //Load the tile entity and put it in the world - world.setBlockTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag)); + world.setTileEntity(pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), TileEntity.createAndLoadEntity(tileTag)); } setUpDungeon(PocketManager.createDimensionData(world), world, pocketCenter, turnAngle, entryLink, random, properties, blockSetter); @@ -341,9 +342,9 @@ public class DungeonSchematic extends Schematic { int z = location.getZ(); if (y >= 0) { - int blockID = world.getBlockId(x, y, z); + Block block = world.getBlock(x, y, z); int metadata = world.getBlockMetadata(x, y, z); - blockSetter.setBlock(world, x, y + 1, z, blockID, metadata); + blockSetter.setBlock(world, x, y + 1, z, block, metadata); } initDoorTileEntity(world, location); } @@ -365,7 +366,7 @@ public class DungeonSchematic extends Schematic { Point3D location = point.clone(); BlockRotator.transformPoint(location, entrance, rotation, pocketCenter); //Remove frame block - blockSetter.setBlock(world, location.getX(), location.getY(), location.getZ(), 0, 0); + blockSetter.setBlock(world, location.getX(), location.getY(), location.getZ(), Blocks.air, 0); //Spawn Monolith if (canSpawn) { @@ -377,8 +378,8 @@ public class DungeonSchematic extends Schematic { private static void initDoorTileEntity(World world, Point3D point) { - Block door = Block.blocksList[world.getBlockId(point.getX(), point.getY(), point.getZ())]; - Block door2 = Block.blocksList[world.getBlockId(point.getX(), point.getY() - 1, point.getZ())]; + Block door = world.getBlock(point.getX(), point.getY(), point.getZ()); + Block door2 = world.getBlock(point.getX(), point.getY() - 1, point.getZ()); if (door instanceof IDimDoor && door2 instanceof IDimDoor) { @@ -395,7 +396,8 @@ public class DungeonSchematic extends Schematic { { final int SEARCH_RANGE = 6; - int x, y, z, block; + int x, y, z; + Block block; int dx, dy, dz; for (dy = SEARCH_RANGE; dy >= -SEARCH_RANGE; dy--) @@ -407,12 +409,12 @@ public class DungeonSchematic extends Schematic { x = pocketCenter.getX() + dx; y = pocketCenter.getY() + dy; z = pocketCenter.getZ() + dz; - block = world.getBlockId(x, y, z); - if (block == Block.signWall.blockID || block == Block.signPost.blockID) + block = world.getBlock(x, y, z); + if (block == Blocks.wall_sign || block == Blocks.standing_sign) { TileEntitySign signEntity = new TileEntitySign(); signEntity.signText[1] = "Level " + depth; - world.setBlockTileEntity(x, y, z, signEntity); + world.setTileEntity(x, y, z, signEntity); return; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java index c0ab099..08fb8fe 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java @@ -7,15 +7,15 @@ public class ModBlockFilter extends SchematicFilter { private short maxVanillaBlockID; private short[] exceptions; - private short replacementBlockID; + private Block replacementBlock; private byte replacementMetadata; - public ModBlockFilter(short maxVanillaBlockID, short[] exceptions, short replacementBlockID, byte replacementMetadata) + public ModBlockFilter(short maxVanillaBlockID, short[] exceptions, Block replacementBlock, byte replacementMetadata) { super("ModBlockFilter"); this.maxVanillaBlockID = maxVanillaBlockID; this.exceptions = exceptions; - this.replacementBlockID = replacementBlockID; + this.replacementBlock = replacementBlock; this.replacementMetadata = replacementMetadata; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java index 3ad3a4b..600c5c3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/BaseItemDoor.java @@ -5,7 +5,7 @@ import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; @@ -30,14 +30,13 @@ public abstract class BaseItemDoor extends ItemDoor private static DDProperties properties = null; /** - * door represents the non-dimensional door this item is associated with. Leave null for none. - * @param itemID + * door represents the non-dimensional door this item is associated with. Leave null for none. * @param material - * @param door + * @param vanillaDoor */ - public BaseItemDoor(int itemID, Material material, ItemDoor vanillaDoor) + public BaseItemDoor(Material material, ItemDoor vanillaDoor) { - super(itemID, material); + super( material); this.setMaxStackSize(64); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); if (properties == null) @@ -51,7 +50,7 @@ public abstract class BaseItemDoor extends ItemDoor } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } @@ -134,10 +133,10 @@ public abstract class BaseItemDoor extends ItemDoor // side if (side == 1 && !world.isRemote) { - int blockID = world.getBlockId(x, y, z); - if (blockID != 0) + Block block = world.getBlock(x, y, z); + if (!block.isAir(world, x, y, z)) { - if (!Block.blocksList[blockID].isBlockReplaceable(world, x, y, z)) + if (!block.isReplaceable(world, x, y, z)) { y++; } @@ -179,7 +178,7 @@ public abstract class BaseItemDoor extends ItemDoor MovingObjectPosition hit = BaseItemDoor.doRayTrace(player.worldObj, player, true); if (hit != null) { - if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID) + if (world.getBlock(hit.blockX, hit.blockY, hit.blockZ) == mod_pocketDim.blockRift) { DimLink link = PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world.provider.dimensionId); if (link != null) @@ -196,7 +195,7 @@ public abstract class BaseItemDoor extends ItemDoor placeDoorBlock(world, x, y - 1, z, orientation, doorBlock); if (!(stack.getItem() instanceof BaseItemDoor)) { - ((TileEntityDimDoor) world.getBlockTileEntity(x, y, z)).hasGennedPair = true; + ((TileEntityDimDoor) world.getTileEntity(x, y, z)).hasGennedPair = true; } if (!player.capabilities.isCreativeMode) { @@ -213,9 +212,9 @@ public abstract class BaseItemDoor extends ItemDoor public static boolean canPlace(World world, int x, int y, int z) { - int id = world.getBlockId(x, y, z); + Block block = world.getBlock(x, y, z); - return (id == properties.RiftBlockID || id == 0 || Block.blocksList[id].blockMaterial.isReplaceable()); + return (block == mod_pocketDim.blockRift || block.isAir(world, x, y, z) || block.getMaterial().isReplaceable()); } /** @@ -236,7 +235,7 @@ public abstract class BaseItemDoor extends ItemDoor double d1 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double) f + (double) (par1World.isRemote ? par2EntityPlayer.getEyeHeight() - par2EntityPlayer.getDefaultEyeHeight() : par2EntityPlayer.getEyeHeight()); double d2 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double) f; - Vec3 vec3 = par1World.getWorldVec3Pool().getVecFromPool(d0, d1, d2); + Vec3 vec3 = Vec3.createVectorHelper (d0, d1, d2); float f3 = MathHelper.cos(-f2 * 0.017453292F - (float) Math.PI); float f4 = MathHelper.sin(-f2 * 0.017453292F - (float) Math.PI); float f5 = -MathHelper.cos(-f1 * 0.017453292F); @@ -249,6 +248,6 @@ public abstract class BaseItemDoor extends ItemDoor d3 = ((EntityPlayerMP) par2EntityPlayer).theItemInWorldManager.getBlockReachDistance(); } Vec3 vec31 = vec3.addVector((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); - return par1World.rayTraceBlocks_do_do(vec3, vec31, par3, !par3); + return par1World.rayTraceBlocks(vec3, vec31, par3); } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java index 50e62fe..0075035 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java @@ -1,6 +1,7 @@ package StevenDimDoors.mod_pocketDim.items; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -9,14 +10,14 @@ public class ItemBlockDimWall extends ItemBlock { private final static String[] subNames = {"Fabric of Reality", "Ancient Fabric" , "Altered Fabric"}; - public ItemBlockDimWall(int par1) + public ItemBlockDimWall(Block block) { - super(par1); + super(block); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); setHasSubtypes(true); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("tile.", "")); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java index 78d38cd..dcc7eb4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java @@ -6,7 +6,7 @@ import java.util.List; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; @@ -14,7 +14,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.EnumMovingObjectType; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.StatCollector; import net.minecraft.world.World; @@ -29,9 +28,9 @@ public class ItemDDKey extends Item { public static final int TIME_TO_UNLOCK = 30; - public ItemDDKey(int itemID) + public ItemDDKey() { - super(itemID); + super(); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); this.setMaxStackSize(1); @@ -55,7 +54,7 @@ public class ItemDDKey extends Item } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } @@ -87,9 +86,9 @@ public class ItemDDKey extends Item { return true; } - int blockID = world.getBlockId(x, y, z); + Block block = world.getBlock(x, y, z); // make sure we are dealing with a door - if (!(Block.blocksList[blockID] instanceof IDimDoor)) + if (!(block instanceof IDimDoor)) { return false; } @@ -146,7 +145,7 @@ public class ItemDDKey extends Item { //Raytrace to make sure we are still looking at a door MovingObjectPosition pos = getMovingObjectPositionFromPlayer(player.worldObj, player, true); - if (pos != null && pos.typeOfHit == EnumMovingObjectType.TILE) + if (pos != null && pos.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { //make sure we have a link and it has a lock DimLink link = PocketManager.getLink(pos.blockX, pos.blockY, pos.blockZ, player.worldObj); @@ -170,13 +169,13 @@ public class ItemDDKey extends Item * Raytrace to make sure we are still looking at the right block while preparing to remove the lock */ @Override - public void onUsingItemTick(ItemStack stack, EntityPlayer player, int count) + public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { // no need to check every tick, twice a second instead if (count % 10 == 0) { MovingObjectPosition pos = getMovingObjectPositionFromPlayer(player.worldObj, player, true); - if (pos != null && pos.typeOfHit == EnumMovingObjectType.TILE) + if (pos != null && pos.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { DimLink link = PocketManager.getLink(pos.blockX, pos.blockY, pos.blockZ, player.worldObj); if (link != null && link.hasLock()) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java index 18f123d..945ddd3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java @@ -12,9 +12,9 @@ import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemDimensionalDoor extends BaseItemDoor { - public ItemDimensionalDoor(int itemID, Material material, ItemDoor door) + public ItemDimensionalDoor(Material material, ItemDoor door) { - super(itemID, material, door); + super(material, door); } @SuppressWarnings({ "rawtypes", "unchecked" }) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java index abf9f09..92514b8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java @@ -13,9 +13,9 @@ import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemGoldDimDoor extends BaseItemDoor { - public ItemGoldDimDoor(int itemID, Material material, ItemDoor door) + public ItemGoldDimDoor(Material material, ItemDoor door) { - super(itemID, material, door); + super(material, door); } @SuppressWarnings({ "rawtypes", "unchecked" }) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDoor.java index 252c1b6..74d2933 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.items; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; @@ -12,14 +12,14 @@ import net.minecraft.world.World; public class ItemGoldDoor extends ItemDoor { - public ItemGoldDoor(int par1, Material par2Material) + public ItemGoldDoor(Material par2Material) { - super(par1, par2Material); + super(par2Material); this.setMaxStackSize(16); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java index 02d6b8a..f8c6577 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java @@ -12,9 +12,9 @@ import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemPersonalDoor extends BaseItemDoor { - public ItemPersonalDoor(int itemID, Material material, ItemDoor door) + public ItemPersonalDoor(Material material, ItemDoor door) { - super(itemID, material, door); + super(material, door); } @SuppressWarnings({ "rawtypes", "unchecked" }) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemQuartzDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemQuartzDoor.java index 34d226d..71fe975 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemQuartzDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemQuartzDoor.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.items; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; @@ -12,13 +12,13 @@ import net.minecraft.world.World; public class ItemQuartzDoor extends ItemDoor { - public ItemQuartzDoor(int par1, Material par2Material) + public ItemQuartzDoor( Material par2Material) { - super(par1, par2Material); + super(par2Material); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index d846251..162479d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -4,7 +4,7 @@ import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; @@ -12,7 +12,7 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.EnumToolMaterial; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.util.AxisAlignedBB; @@ -31,9 +31,9 @@ public class ItemRiftBlade extends ItemSword { private final DDProperties properties; - public ItemRiftBlade(int itemID, DDProperties properties) + public ItemRiftBlade(DDProperties properties) { - super(itemID, EnumToolMaterial.EMERALD); + super(ToolMaterial.EMERALD); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); this.properties = properties; @@ -55,7 +55,7 @@ public class ItemRiftBlade extends ItemSword double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * var4; double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * var4 + 1.62D - par2EntityPlayer.yOffset; double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * var4; - Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11); + Vec3 var13 = Vec3.createVectorHelper(var7, var9, var11); float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI); float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI); float var16 = -MathHelper.cos(-var5 * 0.017453292F); @@ -68,12 +68,12 @@ public class ItemRiftBlade extends ItemSword var21 = 7; } Vec3 var23 = var13.addVector(var18 * var21, var17 * var21, var20 * var21); - return par1World.rayTraceBlocks_do_do(var13, var23, true, false); + return par1World.rayTraceBlocks(var13, var23, true); } private boolean teleportToEntity(ItemStack item, Entity par1Entity, EntityPlayer holder) { - Vec3 var2 = holder.worldObj.getWorldVec3Pool().getVecFromPool(holder.posX - par1Entity.posX, holder.boundingBox.minY + holder.height / 2.0F - par1Entity.posY + par1Entity.getEyeHeight(), holder.posZ - par1Entity.posZ); + Vec3 var2 = Vec3.createVectorHelper(holder.posX - par1Entity.posX, holder.boundingBox.minY + holder.height / 2.0F - par1Entity.posY + par1Entity.getEyeHeight(), holder.posZ - par1Entity.posZ); double cooef =( var2.lengthVector()-2.5)/var2.lengthVector(); var2.xCoord*=cooef; @@ -114,7 +114,7 @@ public class ItemRiftBlade extends ItemSword for (EntityLiving ent : list) { Vec3 var3 = player.getLook(1.0F).normalize(); - Vec3 var4 = player.worldObj.getWorldVec3Pool().getVecFromPool(ent.posX - player.posX, ent.boundingBox.minY + (ent.height) / 2.0F - ( player.posY + player.getEyeHeight()), ent.posZ - player.posZ); + Vec3 var4 = Vec3.createVectorHelper(ent.posX - player.posX, ent.boundingBox.minY + (ent.height) / 2.0F - ( player.posY + player.getEyeHeight()), ent.posZ - player.posZ); double var5 = var4.lengthVector(); var4 = var4.normalize(); double var7 = var3.dotProduct(var4); @@ -132,7 +132,7 @@ public class ItemRiftBlade extends ItemSword int x = hit.blockX; int y = hit.blockY; int z = hit.blockZ; - if (world.getBlockId(x, y, z) == properties.RiftBlockID) + if (world.getBlock(x, y, z) == mod_pocketDim.blockRift) { if (PocketManager.getLink(x, y, z, world) != null) { @@ -160,7 +160,7 @@ public class ItemRiftBlade extends ItemSword } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } @@ -173,7 +173,7 @@ public class ItemRiftBlade extends ItemSword { //Don't include a call to super.getIsRepairable()! //That would cause this sword to accept diamonds as a repair material (since we set material = Diamond). - return mod_pocketDim.itemStableFabric.itemID == par2ItemStack.itemID ? true : false; + return mod_pocketDim.itemStableFabric == par2ItemStack.getItem() ? true : false; } /** diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java index dfaedeb..1e6399b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftGoggles.java @@ -1,15 +1,14 @@ package StevenDimDoors.mod_pocketDim.items; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.ItemArmor; public class ItemRiftGoggles extends ItemArmor { - public ItemRiftGoggles(int par1, int par2, int par3) + public ItemRiftGoggles(int par2, int par3) { - super(par1, EnumArmorMaterial.IRON, par1, par1); + super(ArmorMaterial.IRON, par2, par3); this.setCreativeTab(CreativeTabs.tabRedstone); // this.setIconIndex(Item.doorWood.getIconFromDamage(0)); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index c3b58d8..7a30b0d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -2,7 +2,7 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; import net.minecraft.block.Block; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -22,9 +22,9 @@ import cpw.mods.fml.relauncher.SideOnly; public class ItemRiftSignature extends Item { - public ItemRiftSignature(int itemID) + public ItemRiftSignature() { - super(itemID); + super(); this.setMaxStackSize(1); this.setMaxDamage(0); this.hasSubtypes = true; @@ -40,7 +40,7 @@ public class ItemRiftSignature extends Item } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } @@ -139,12 +139,12 @@ public class ItemRiftSignature extends Item public static int adjustYForSpecialBlocks(World world, int x, int y, int z) { int targetY = y - 2; // Get the block the player actually clicked on - Block block = Block.blocksList[world.getBlockId(x, targetY, z)]; + Block block = world.getBlock(x, targetY, z); if (block == null) { return targetY + 2; } - if (block.isBlockReplaceable(world, x, targetY, z)) + if (block.isReplaceable(world, x, targetY, z)) { return targetY + 1; // Move block placement down (-2+1) one so its directly over things like snow } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index f97bb8c..62dbfd4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -1,8 +1,10 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; -import net.minecraft.client.renderer.texture.IconRegister; + +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; @@ -18,13 +20,13 @@ import cpw.mods.fml.relauncher.SideOnly; public class ItemStabilizedRiftSignature extends ItemRiftSignature { - public ItemStabilizedRiftSignature(int itemID) + public ItemStabilizedRiftSignature() { - super(itemID); + super(); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } @@ -74,7 +76,7 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature // Check if the player is in creative mode, // or if the player can pay with an Ender Pearl to create a rift. if (!player.capabilities.isCreativeMode && - !player.inventory.consumeInventoryItem(Item.enderPearl.itemID)) + !player.inventory.consumeInventoryItem(Items.ender_pearl)) { mod_pocketDim.sendChat(player, "You don't have any Ender Pearls!"); // I won't do this, but this is the chance to localize chat diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java index 3e283b4..a1d0b31 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStableFabric.java @@ -1,19 +1,19 @@ package StevenDimDoors.mod_pocketDim.items; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.Item; import StevenDimDoors.mod_pocketDim.mod_pocketDim; public class ItemStableFabric extends Item { - public ItemStableFabric(int itemID, int par2) + public ItemStableFabric(int par2) { - super(itemID); + super(); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java index e51bcaa..dd3b02c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java @@ -12,9 +12,9 @@ import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemUnstableDoor extends BaseItemDoor { - public ItemUnstableDoor(int itemID, Material material, ItemDoor door) + public ItemUnstableDoor(Material material, ItemDoor door) { - super(itemID, material, door); + super( material, door); } @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java index 403bbc1..4f24600 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java @@ -12,9 +12,9 @@ import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; public class ItemWarpDoor extends BaseItemDoor { - public ItemWarpDoor(int itemID, Material material, ItemDoor door) + public ItemWarpDoor(Material material, ItemDoor door) { - super(itemID, material, door); + super(material, door); } @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWorldThread.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWorldThread.java index 91162c2..b4a354a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWorldThread.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWorldThread.java @@ -1,19 +1,19 @@ package StevenDimDoors.mod_pocketDim.items; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.Item; import StevenDimDoors.mod_pocketDim.mod_pocketDim; public class ItemWorldThread extends Item { - public ItemWorldThread(int itemID) + public ItemWorldThread() { - super(itemID); + super(); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java index f79fe26..b304d26 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/behaviors/DispenserBehaviorStabilizedRS.java @@ -18,7 +18,7 @@ public class DispenserBehaviorStabilizedRS extends BehaviorDefaultDispenseItem int x = dispenser.getXInt(); int y = dispenser.getYInt(); int z = dispenser.getZInt(); - EnumFacing facing = BlockDispenser.getFacing(dispenser.getBlockMetadata()); + EnumFacing facing = BlockDispenser.func_149937_b(dispenser.getBlockMetadata()); int dx = facing.getFrontOffsetX(); int dy = facing.getFrontOffsetY(); int dz = facing.getFrontOffsetZ(); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index e1ecef9..dfad4f0 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -3,7 +3,7 @@ package StevenDimDoors.mod_pocketDim.items; import java.util.List; import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -21,16 +21,16 @@ import cpw.mods.fml.relauncher.SideOnly; public class itemRiftRemover extends Item { - public itemRiftRemover(int itemID, Material par2Material) + public itemRiftRemover(Material par2Material) { - super(itemID); + super(); this.setMaxStackSize(1); this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab); this.setMaxDamage(4); } @Override - public void registerIcons(IconRegister par1IconRegister) + public void registerIcons(IIconRegister par1IconRegister) { this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName().replace("item.", "")); } @@ -56,7 +56,7 @@ public class itemRiftRemover extends Item int hz = hit.blockZ; NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(hx, hy, hz); - if (world.getBlockId(hx, hy, hz) == mod_pocketDim.blockRift.blockID && link != null && + if (world.getBlock(hx, hy, hz) == mod_pocketDim.blockRift && link != null && player.canPlayerEdit(hx, hy, hz, hit.sideHit, stack)) { // Invoke onPlayerRightClick() @@ -87,15 +87,15 @@ public class itemRiftRemover extends Item NewDimData dimension = PocketManager.createDimensionData(world); DimLink link = dimension.getLink(x, y, z); - if (world.getBlockId(x, y, z) == mod_pocketDim.blockRift.blockID && link != null && + if (world.getBlock(x, y, z) == mod_pocketDim.blockRift && link != null && player.canPlayerEdit(x, y, z, side, stack)) { // Tell the rift's tile entity to do its removal animation - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + TileEntity tileEntity = world.getTileEntity(x, y, z); if (tileEntity != null && tileEntity instanceof TileEntityRift) { ((TileEntityRift) tileEntity).shouldClose = true; - tileEntity.onInventoryChanged(); + tileEntity.markDirty(); } else if (!world.isRemote) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index b4d6069..79ccb36 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -4,13 +4,13 @@ import java.io.File; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.EntityEggInfo; import net.minecraft.entity.EntityList; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; -import net.minecraft.util.ChatMessageComponent; +import net.minecraft.util.ChatComponentText; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.ForgeChunkManager; @@ -85,21 +85,12 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.event.FMLServerStoppedEvent; -import cpw.mods.fml.common.network.NetworkMod; -import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; -import cpw.mods.fml.common.registry.TickRegistry; import cpw.mods.fml.relauncher.Side; @Mod(modid = mod_pocketDim.modid, name = "Dimensional Doors", version = mod_pocketDim.version) - -@NetworkMod(clientSideRequired = true, serverSideRequired = false, connectionHandler=ConnectionHandler.class, -clientPacketHandlerSpec = -@SidedPacketHandler(channels = {PacketConstants.CHANNEL_NAME}, packetHandler = ClientPacketHandler.class), -serverPacketHandlerSpec = -@SidedPacketHandler(channels = {PacketConstants.CHANNEL_NAME}, packetHandler = ServerPacketHandler.class)) public class mod_pocketDim { public static final String version = "@VERSION@"; @@ -167,9 +158,9 @@ public class mod_pocketDim public static CreativeTabs dimDoorsCreativeTab = new CreativeTabs("dimDoorsCreativeTab") { @Override - public ItemStack getIconItemStack() + public Item getTabIconItem() { - return new ItemStack(mod_pocketDim.itemDimensionalDoor, 1, 0); + return mod_pocketDim.itemDimensionalDoor; } @Override @@ -204,36 +195,36 @@ public class mod_pocketDim limboDecay = new LimboDecay(properties); // Initialize blocks and items - transientDoor = new TransientDoor(properties.TransientDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("transientDoor"); - goldenDimensionalDoor = new BlockGoldDimDoor(properties.GoldenDimensionalDoorID, Material.iron, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorGold"); + transientDoor = new TransientDoor(Material.iron, properties).setHardness(1.0F) .setBlockName("transientDoor"); + goldenDimensionalDoor = new BlockGoldDimDoor(Material.iron, properties).setHardness(1.0F) .setBlockName("dimDoorGold"); - quartzDoor = new BlockDoorQuartz(properties.QuartzDoorID, Material.rock).setHardness(0.1F).setUnlocalizedName("doorQuartz"); - personalDimDoor = new PersonalDimDoor(properties.PersonalDimDoorID, Material.rock,properties).setHardness(0.1F).setUnlocalizedName("dimDoorPersonal"); + quartzDoor = new BlockDoorQuartz(Material.rock).setHardness(0.1F).setBlockName("doorQuartz"); + personalDimDoor = new PersonalDimDoor(Material.rock,properties).setHardness(0.1F).setBlockName("dimDoorPersonal"); - goldenDoor = new BlockDoorGold(properties.GoldenDoorID, Material.iron).setHardness(0.1F).setUnlocalizedName("doorGold"); - blockDimWall = new BlockDimWall(properties.FabricBlockID, 0, Material.iron).setLightValue(1.0F).setHardness(0.1F).setUnlocalizedName("blockDimWall"); - blockDimWallPerm = (new BlockDimWallPerm(properties.PermaFabricBlockID, 0, Material.iron)).setLightValue(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setUnlocalizedName("blockDimWallPerm"); - warpDoor = new WarpDoor(properties.WarpDoorID, Material.wood, properties).setHardness(1.0F) .setUnlocalizedName("dimDoorWarp"); - blockRift = (BlockRift) (new BlockRift(properties.RiftBlockID, 0, Material.air, properties).setHardness(1.0F) .setUnlocalizedName("rift")); - blockLimbo = new BlockLimbo(properties.LimboBlockID, 15, Material.iron, properties.LimboDimensionID, limboDecay).setHardness(.2F).setUnlocalizedName("BlockLimbo").setLightValue(.0F); - unstableDoor = (new UnstableDoor(properties.UnstableDoorID, Material.iron, properties).setHardness(.2F).setUnlocalizedName("chaosDoor").setLightValue(.0F) ); - dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(properties.DimensionalDoorID, Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setUnlocalizedName("dimDoor")); - transTrapdoor = (TransTrapdoor) (new TransTrapdoor(properties.TransTrapdoorID, Material.wood).setHardness(1.0F) .setUnlocalizedName("dimHatch")); + goldenDoor = new BlockDoorGold(Material.iron).setHardness(0.1F).setBlockName("doorGold"); + blockDimWall = new BlockDimWall(0, Material.iron).setLightLevel(1.0F).setHardness(0.1F).setBlockName("blockDimWall"); + blockDimWallPerm = (new BlockDimWallPerm(0, Material.iron)).setLightLevel(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setBlockName("blockDimWallPerm"); + warpDoor = new WarpDoor(Material.wood, properties).setHardness(1.0F) .setBlockName("dimDoorWarp"); + blockRift = (BlockRift) (new BlockRift(0, Material.air, properties).setHardness(1.0F) .setBlockName("rift")); + blockLimbo = new BlockLimbo(15, Material.iron, properties.LimboDimensionID, limboDecay).setHardness(.2F).setBlockName("BlockLimbo").setLightLevel(.0F); + unstableDoor = (new UnstableDoor(Material.iron, properties).setHardness(.2F).setBlockName("chaosDoor").setLightLevel(.0F) ); + dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setBlockName("dimDoor")); + transTrapdoor = (TransTrapdoor) (new TransTrapdoor(Material.wood).setHardness(1.0F) .setBlockName("dimHatch")); - itemDDKey = (new ItemDDKey(properties.DDKeyItemID)).setUnlocalizedName("itemDDKey"); - itemQuartzDoor = (new ItemQuartzDoor(properties.QuartzDoorID, Material.rock)).setUnlocalizedName("itemQuartzDoor"); - itemPersonalDoor = (new ItemPersonalDoor(properties.PersonalDimDoorID, Material.rock, (ItemDoor)this.itemQuartzDoor)).setUnlocalizedName("itemQuartzDimDoor"); - itemGoldenDoor = (new ItemGoldDoor(properties.GoldenDoorItemID, Material.wood)).setUnlocalizedName("itemGoldDoor"); - itemGoldenDimensionalDoor = (new ItemGoldDimDoor(properties.GoldenDimensionalDoorItemID, Material.iron, (ItemDoor)this.itemGoldenDoor)).setUnlocalizedName("itemGoldDimDoor"); - itemDimensionalDoor = (ItemDimensionalDoor) (new ItemDimensionalDoor(properties.DimensionalDoorItemID, Material.iron, (ItemDoor)Item.doorIron)).setUnlocalizedName("itemDimDoor"); - itemWarpDoor = (new ItemWarpDoor(properties.WarpDoorItemID, Material.wood,(ItemDoor)Item.doorWood)).setUnlocalizedName("itemDimDoorWarp"); - itemRiftSignature = (new ItemRiftSignature(properties.RiftSignatureItemID)).setUnlocalizedName("itemLinkSignature"); - itemRiftRemover = (new itemRiftRemover(properties.RiftRemoverItemID, Material.wood)).setUnlocalizedName("itemRiftRemover"); - itemStableFabric = (new ItemStableFabric(properties.StableFabricItemID, 0)).setUnlocalizedName("itemStableFabric"); - itemUnstableDoor = (new ItemUnstableDoor(properties.UnstableDoorItemID, Material.iron, null)).setUnlocalizedName("itemChaosDoor"); - itemRiftBlade = (new ItemRiftBlade(properties.RiftBladeItemID, properties)).setUnlocalizedName("ItemRiftBlade"); - itemStabilizedRiftSignature = (new ItemStabilizedRiftSignature(properties.StabilizedRiftSignatureItemID)).setUnlocalizedName("itemStabilizedRiftSig"); - itemWorldThread = (new ItemWorldThread(properties.WorldThreadItemID)).setUnlocalizedName("itemWorldThread"); + itemDDKey = (new ItemDDKey()).setUnlocalizedName("itemDDKey"); + itemQuartzDoor = (new ItemQuartzDoor(Material.rock)).setUnlocalizedName("itemQuartzDoor"); + itemPersonalDoor = (new ItemPersonalDoor(Material.rock, (ItemDoor)this.itemQuartzDoor)).setUnlocalizedName("itemQuartzDimDoor"); + itemGoldenDoor = (new ItemGoldDoor(Material.wood)).setUnlocalizedName("itemGoldDoor"); + itemGoldenDimensionalDoor = (new ItemGoldDimDoor(Material.iron, (ItemDoor)this.itemGoldenDoor)).setUnlocalizedName("itemGoldDimDoor"); + itemDimensionalDoor = (ItemDimensionalDoor) (new ItemDimensionalDoor(Material.iron, (ItemDoor) Items.iron_door)).setUnlocalizedName("itemDimDoor"); + itemWarpDoor = (new ItemWarpDoor(Material.wood,(ItemDoor)Items.iron_door)).setUnlocalizedName("itemDimDoorWarp"); + itemRiftSignature = (new ItemRiftSignature()).setUnlocalizedName("itemLinkSignature"); + itemRiftRemover = (new itemRiftRemover(Material.wood)).setUnlocalizedName("itemRiftRemover"); + itemStableFabric = (new ItemStableFabric(0)).setUnlocalizedName("itemStableFabric"); + itemUnstableDoor = (new ItemUnstableDoor(Material.iron, null)).setUnlocalizedName("itemChaosDoor"); + itemRiftBlade = (new ItemRiftBlade(properties)).setUnlocalizedName("ItemRiftBlade"); + itemStabilizedRiftSignature = (new ItemStabilizedRiftSignature()).setUnlocalizedName("itemStabilizedRiftSig"); + itemWorldThread = (new ItemWorldThread()).setUnlocalizedName("itemWorldThread"); // Check if other biomes have been registered with the same IDs we want. If so, crash Minecraft // to notify the user instead of letting it pass and conflicting with Biomes o' Plenty. @@ -311,7 +302,7 @@ public class mod_pocketDim EntityRegistry.registerModEntity(MobMonolith.class, "Monolith", properties.MonolithEntityID, this, 70, 1, true); EntityList.IDtoClassMapping.put(properties.MonolithEntityID, MobMonolith.class); - EntityList.entityEggs.put(properties.MonolithEntityID, new EntityEggInfo(properties.MonolithEntityID, 0, 0xffffff)); + EntityList.entityEggs.put(properties.MonolithEntityID, new EntityList.EntityEggInfo(properties.MonolithEntityID, 0, 0xffffff)); LanguageRegistry.instance().addStringLocalization("entity.dimdoors.Monolith.name", "Monolith"); CraftingManager.registerRecipes(properties); @@ -320,7 +311,7 @@ public class mod_pocketDim DungeonHelper.initialize(); gatewayGenerator = new GatewayGenerator(properties); - GameRegistry.registerWorldGenerator(mod_pocketDim.gatewayGenerator); + GameRegistry.registerWorldGenerator(mod_pocketDim.gatewayGenerator, 0); // Register loot chests DDLoot.registerInfo(properties); @@ -442,8 +433,7 @@ public class mod_pocketDim public static void sendChat(EntityPlayer player, String message) { - ChatMessageComponent cmp = new ChatMessageComponent(); - cmp.addText(message); - player.sendChatToPlayer(cmp); + ChatComponentText text = new ChatComponentText(message); + player.addChatComponentMessage(text); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index 98ae89c..ab2f711 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -1,12 +1,12 @@ package StevenDimDoors.mod_pocketDim.schematic; -import net.minecraft.block.Block; -import net.minecraft.block.BlockComparator; -import net.minecraft.block.BlockDoor; -import net.minecraft.block.BlockRedstoneRepeater; -import net.minecraft.block.BlockStairs; +import net.minecraft.block.*; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import net.minecraft.init.Blocks; + +import java.util.HashMap; +import java.util.Map; public class BlockRotator { @@ -17,65 +17,65 @@ public class BlockRotator private final static int BLOCK_ID_COUNT = 4096; //Provides a fast lookup table for whether blocks have orientations - private final static boolean[] hasOrientations = new boolean[BLOCK_ID_COUNT]; + private final static Map hasOrientations = new HashMap(); - static + public static void setupOrientations() { - hasOrientations[Block.dispenser.blockID] = true; - hasOrientations[Block.dropper.blockID] = true; - hasOrientations[Block.stairsStoneBrick.blockID] = true; - hasOrientations[Block.lever.blockID] = true; - hasOrientations[Block.stoneButton.blockID] = true; - hasOrientations[Block.woodenButton.blockID] = true; - hasOrientations[Block.redstoneRepeaterIdle.blockID] = true; - hasOrientations[Block.redstoneRepeaterActive.blockID] = true; - hasOrientations[Block.tripWireSource.blockID] = true; - hasOrientations[Block.torchWood.blockID] = true; - hasOrientations[Block.torchRedstoneIdle.blockID] = true; - hasOrientations[Block.torchRedstoneActive.blockID] = true; - hasOrientations[Block.doorIron.blockID] = true; - hasOrientations[Block.doorWood.blockID] = true; - hasOrientations[Block.pistonBase.blockID] = true; - hasOrientations[Block.pistonStickyBase.blockID] = true; - hasOrientations[Block.pistonExtension.blockID] = true; - hasOrientations[Block.redstoneComparatorIdle.blockID] = true; - hasOrientations[Block.redstoneComparatorActive.blockID] = true; - hasOrientations[Block.signPost.blockID] = true; - hasOrientations[Block.signWall.blockID] = true; - hasOrientations[Block.skull.blockID] = true; - hasOrientations[Block.ladder.blockID] = true; - hasOrientations[Block.vine.blockID] = true; - hasOrientations[Block.anvil.blockID] = true; - hasOrientations[Block.chest.blockID] = true; - hasOrientations[Block.chestTrapped.blockID] = true; - hasOrientations[Block.hopperBlock.blockID] = true; - hasOrientations[Block.stairsNetherBrick.blockID] = true; - hasOrientations[Block.stairsCobblestone.blockID] = true; - hasOrientations[Block.stairsNetherQuartz.blockID] = true; - hasOrientations[Block.stairsSandStone.blockID] = true; - hasOrientations[Block.stairsBrick.blockID] = true; - hasOrientations[Block.stairsWoodBirch.blockID] = true; - hasOrientations[Block.stairsWoodOak.blockID] = true; - hasOrientations[Block.stairsWoodJungle.blockID] = true; - hasOrientations[Block.stairsWoodSpruce.blockID] = true; - hasOrientations[Block.wood.blockID] = true; - hasOrientations[Block.blockNetherQuartz.blockID] = true; - hasOrientations[Block.railPowered.blockID] = true; - hasOrientations[Block.railDetector.blockID] = true; - hasOrientations[Block.railActivator.blockID] = true; - hasOrientations[Block.rail.blockID] = true; - hasOrientations[Block.furnaceBurning.blockID] = true; - hasOrientations[Block.furnaceIdle.blockID] = true; - hasOrientations[Block.bed.blockID] = true; + hasOrientations.put(Blocks.dispenser, true); + hasOrientations.put(Blocks.dropper, true); + hasOrientations.put(Blocks.stone_brick_stairs, true); + hasOrientations.put(Blocks.lever, true); + hasOrientations.put(Blocks.stone_button, true); + hasOrientations.put(Blocks.wooden_button, true); + hasOrientations.put(Blocks.unpowered_repeater, true); + hasOrientations.put(Blocks.powered_repeater, true); + hasOrientations.put(Blocks.tripwire_hook, true); + hasOrientations.put(Blocks.torch, true); + hasOrientations.put(Blocks.redstone_torch, true); + hasOrientations.put(Blocks.unlit_redstone_torch, true); + hasOrientations.put(Blocks.iron_door, true); + hasOrientations.put(Blocks.wooden_door, true); + hasOrientations.put(Blocks.piston, true); + hasOrientations.put(Blocks.sticky_piston, true); + hasOrientations.put(Blocks.piston_head, true); + hasOrientations.put(Blocks.powered_comparator, true); + hasOrientations.put(Blocks.unpowered_comparator, true); + hasOrientations.put(Blocks.standing_sign, true); + hasOrientations.put(Blocks.wall_sign, true); + hasOrientations.put(Blocks.skull, true); + hasOrientations.put(Blocks.ladder, true); + hasOrientations.put(Blocks.vine, true); + hasOrientations.put(Blocks.anvil, true); + hasOrientations.put(Blocks.chest, true); + hasOrientations.put(Blocks.trapped_chest, true); + hasOrientations.put(Blocks.hopper, true); + hasOrientations.put(Blocks.nether_brick_stairs, true); + hasOrientations.put(Blocks.stone_stairs, true); + hasOrientations.put(Blocks.quartz_stairs, true); + hasOrientations.put(Blocks.sandstone_stairs, true); + hasOrientations.put(Blocks.brick_stairs, true); + hasOrientations.put(Blocks.birch_stairs, true); + hasOrientations.put(Blocks.oak_stairs, true); + hasOrientations.put(Blocks.jungle_stairs, true); + hasOrientations.put(Blocks.spruce_stairs, true); + hasOrientations.put(Blocks.log, true); + hasOrientations.put(Blocks.log2, true); + hasOrientations.put(Blocks.quartz_block, true); + hasOrientations.put(Blocks.rail, true); + hasOrientations.put(Blocks.activator_rail, true); + hasOrientations.put(Blocks.detector_rail, true); + hasOrientations.put(Blocks.golden_rail, true); + hasOrientations.put(Blocks.furnace, true); + hasOrientations.put(Blocks.lit_furnace, true); + hasOrientations.put(Blocks.bed, true); - hasOrientations[mod_pocketDim.dimensionalDoor.blockID] = true; - hasOrientations[mod_pocketDim.warpDoor.blockID] = true; - hasOrientations[mod_pocketDim.goldenDimensionalDoor.blockID] = true; - hasOrientations[mod_pocketDim.personalDimDoor.blockID] = true; - + hasOrientations.put(mod_pocketDim.dimensionalDoor, true); + hasOrientations.put(mod_pocketDim.warpDoor, true); + hasOrientations.put(mod_pocketDim.goldenDimensionalDoor, true); + hasOrientations.put(mod_pocketDim.personalDimDoor, true); } - public static int transformMetadata(int metadata, int turns, int blockID) + public static int transformMetadata(int metadata, int turns, Block block) { //I changed rotations to reduce the monstrous code we had. It might be //slightly less efficient, but it's easier to maintain for now. ~SenseiKiwi @@ -84,37 +84,37 @@ public class BlockRotator turns += 1 << 16; turns %= 4; - if (hasOrientations[blockID]) + if (hasOrientations.containsKey(block) && hasOrientations.get(block)) { while (turns > 0) { - metadata = rotateMetadataBy90(metadata, blockID); + metadata = rotateMetadataBy90(metadata, block); turns--; } } return metadata; } - private static int rotateMetadataBy90(int metadata, int blockID) + private static int rotateMetadataBy90(int metadata, Block block) { //TODO: Replace this horrible function with something prettier. We promise we will for the next version, //after switching to MC 1.6. PADRE, PLEASE FORGIVE OUR SINS. - if (blockID == Block.wood.blockID) + if (block == Blocks.log || block == Blocks.log2) { if (metadata >= 4 && metadata < 12) { metadata = (metadata % 8) + 4; } } - else if (blockID == Block.blockNetherQuartz.blockID) + else if (block == Blocks.quartz_block) { if (metadata == 3 || metadata == 4) { metadata = (metadata - 2) % 2 + 3; } } - else if (blockID == Block.railPowered.blockID || blockID == Block.railDetector.blockID || blockID == Block.railActivator.blockID) + else if (block == Blocks.golden_rail || block == Blocks.detector_rail || block == Blocks.activator_rail) { switch (metadata) { @@ -159,7 +159,7 @@ public class BlockRotator break; } } - else if (blockID==Block.rail.blockID) + else if (block==Blocks.rail) { switch (metadata) { @@ -183,7 +183,7 @@ public class BlockRotator break; } } - else if (blockID==Block.bed.blockID) + else if (block==Blocks.bed) { switch (metadata) { @@ -213,7 +213,7 @@ public class BlockRotator break; } } - else if (Block.blocksList[blockID] instanceof BlockStairs) + else if (block instanceof BlockStairs) { switch (metadata) @@ -244,7 +244,7 @@ public class BlockRotator break; } } - else if (blockID == Block.chest.blockID || blockID == Block.chestTrapped.blockID || blockID == Block.ladder.blockID || blockID == Block.furnaceBurning.blockID|| blockID == Block.furnaceIdle.blockID) + else if (block == Blocks.chest || block == Blocks.trapped_chest || block == Blocks.ladder || block == Blocks.lit_furnace || block == Blocks.furnace) { switch (metadata) { @@ -262,7 +262,7 @@ public class BlockRotator break; } } - else if (blockID == Block.hopperBlock.blockID) + else if (block == Blocks.hopper) { switch (metadata) { @@ -292,7 +292,7 @@ public class BlockRotator break; } } - else if (blockID==Block.vine.blockID) + else if (block==Blocks.vine) { switch (metadata) { @@ -311,7 +311,7 @@ public class BlockRotator break; } } - else if (blockID==Block.signWall.blockID) + else if (block==Blocks.wall_sign) { switch (metadata) { @@ -330,7 +330,7 @@ public class BlockRotator break; } } - else if (blockID==Block.signPost.blockID) + else if (block==Blocks.standing_sign) { switch (metadata) { @@ -384,7 +384,7 @@ public class BlockRotator break; } } - else if(blockID== Block.lever.blockID || blockID == Block.stoneButton.blockID || blockID == Block.woodenButton.blockID || blockID== Block.torchWood.blockID||blockID== Block.torchRedstoneIdle.blockID||blockID== Block.torchRedstoneActive.blockID) + else if(block== Blocks.lever || block == Blocks.stone_button || block == Blocks.wooden_button || block== Blocks.torch||block== Blocks.unlit_redstone_torch||block== Blocks.redstone_torch) { switch (metadata) { @@ -414,7 +414,7 @@ public class BlockRotator break; } } - else if(blockID== Block.pistonBase.blockID||blockID==Block.pistonExtension.blockID||blockID==Block.pistonStickyBase.blockID || blockID == Block.dispenser.blockID || blockID == Block.dropper.blockID) + else if(block== Blocks.piston||block==Blocks.piston_head||block==Blocks.sticky_piston || block == Blocks.dispenser || block == Blocks.dropper) { switch (metadata) { @@ -444,7 +444,7 @@ public class BlockRotator break; } } - else if (Block.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) + else if (block instanceof BlockRedstoneRepeater || block instanceof BlockDoor || block== Blocks.tripwire_hook || block instanceof BlockRedstoneComparator) { switch (metadata) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/IBlockSetter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/IBlockSetter.java index 5eedbb3..e17304d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/IBlockSetter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/IBlockSetter.java @@ -1,8 +1,9 @@ package StevenDimDoors.mod_pocketDim.schematic; +import net.minecraft.block.Block; import net.minecraft.world.World; public interface IBlockSetter { - public void setBlock(World world, int x, int y, int z, int blockID, int metadata); + public void setBlock(World world, int x, int y, int z, Block block, int metadata); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java index dbb912f..b375484 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java @@ -27,11 +27,11 @@ public class Schematic { protected short height; protected short length; - protected short[] blocks; + protected String[] blocks; protected byte[] metadata; protected NBTTagList tileEntities; - protected Schematic(short width, short height, short length, short[] blocks, byte[] metadata, NBTTagList tileEntities) + protected Schematic(short width, short height, short length, String[] blocks, byte[] metadata, NBTTagList tileEntities) { this.width = width; this.height = height; @@ -96,9 +96,9 @@ public class Schematic { return length; } - public short getBlockID(int x, int y, int z) + public Block getBlock(int x, int y, int z) { - return blocks[calculateIndex(x, y, z)]; + return (Block)Block.blockRegistry.getObject(blocks[calculateIndex(x, y, z)]); } public byte getBlockMetadata(int x, int y, int z) @@ -141,7 +141,7 @@ public class Schematic { byte[] metadata = null; //block metadata byte[] lowBits = null; //first 8 bits of the block IDs byte[] highBits = null; //additional 4 bits of the block IDs - short[] blocks = null; //list of combined block IDs + String[] blocks = null; //list of combined block IDs NBTTagList tileEntities = null; //storage for tile entities in NBT form NBTTagCompound schematicTag; //the NBT data extracted from the schematic file boolean hasExtendedBlockIDs; //indicates whether the schematic contains extended block IDs @@ -186,7 +186,7 @@ public class Schematic { if (volume > 2 * highBits.length && hasExtendedBlockIDs) throw new InvalidSchematicException("The schematic has extended block IDs for fewer blocks than its dimensions indicate."); - blocks = new short[volume]; + blocks = new String[volume]; if (hasExtendedBlockIDs) { //Combine the split block IDs into a single value diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java index 2ff9e08..e937bf5 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldBlockSetter.java @@ -21,11 +21,11 @@ public class WorldBlockSetter implements IBlockSetter this.ignoreAir = ignoreAir; } - public void setBlock(World world, int x, int y, int z, int blockID, int metadata) + public void setBlock(World world, int x, int y, int z, Block block, int metadata) { - if (!ignoreAir || blockID != 0) + if (!ignoreAir || !block.isAir(world,x,y,z)) { - world.setBlock(x, y, z, blockID, metadata, flags); + world.setBlock(x, y, z, block, metadata, flags); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java index 231eec2..29f6fa0 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/CustomLimboPopulator.java @@ -3,7 +3,9 @@ package StevenDimDoors.mod_pocketDim.ticking; import java.util.Random; import java.util.concurrent.ConcurrentLinkedQueue; +import net.minecraft.block.Block; import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; import net.minecraft.server.MinecraftServer; import net.minecraft.world.GameRules; import net.minecraft.world.World; @@ -99,7 +101,7 @@ public class CustomLimboPopulator implements IRegularTickReceiver { } int sanity = 0; - int blockID = 0; + Block block = Blocks.air; boolean didSpawn = false; //The following initialization code is based on code from ChunkProviderGenerate. @@ -117,23 +119,23 @@ public class CustomLimboPopulator implements IRegularTickReceiver { x = chunkX * CHUNK_SIZE + random.nextInt(CHUNK_SIZE); z = chunkZ * CHUNK_SIZE + random.nextInt(CHUNK_SIZE); y = MAX_MONOLITH_SPAWN_Y; - blockID = pocket.getBlockId(x, y, z); + block = pocket.getBlock(x, y, z); - while (blockID == 0 &&y>0) + while (block.isAir(pocket, x, y, z) &&y>0) { y--; - blockID = pocket.getBlockId(x, y, z); + block = pocket.getBlock(x, y, z); } - while ((blockID == properties.FabricBlockID || blockID == properties.PermaFabricBlockID) && y > 0) + while ((block == mod_pocketDim.blockDimWall || block == mod_pocketDim.blockDimWallPerm) && y > 0) { y--; - blockID = pocket.getBlockId(x, y, z); + block = pocket.getBlock(x, y, z); } - while (blockID == 0 && y > 0) + while (block.isAir(pocket, x, y, z) && y > 0) { y--; - blockID = pocket.getBlockId(x, y, z); + block = pocket.getBlock(x, y, z); } if(y > 0) { @@ -175,7 +177,7 @@ public class CustomLimboPopulator implements IRegularTickReceiver { int x = chunkX * CHUNK_SIZE + random.nextInt(CHUNK_SIZE); int z = chunkZ * CHUNK_SIZE + random.nextInt(CHUNK_SIZE); - while (limbo.getBlockId(x, y, z) == 0 && y <255) + while (limbo.getBlock(x, y, z).isAir(limbo, x, y, z) && y <255) { y++; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java index f23c38c..a5155ca 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/RiftRegenerator.java @@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim.ticking; import java.util.PriorityQueue; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; @@ -112,9 +113,9 @@ public class RiftRegenerator implements IRegularTickReceiver { else { // All of the necessary conditions have been met. Restore the rift! - int blockID = world.getBlockId(x, y, z); - if (world.setBlock(x, y, z, blockRift.blockID)) - blockRift.dropWorldThread(blockID, world, x, y, z, random); + Block block = world.getBlock(x, y, z); + if (world.setBlock(x, y, z, blockRift)) + blockRift.dropWorldThread(block, world, x, y, z, random); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 57c10a8..ad9d649 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -3,19 +3,12 @@ package StevenDimDoors.mod_pocketDim.tileentities; import java.util.Random; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet; import StevenDimDoors.mod_pocketDim.ServerPacketHandler; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; -import net.minecraft.block.Block; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.Packet130UpdateSign; -import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index b5ee488..2bd9638 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -7,9 +7,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.INetworkManager; -import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.Packet132TileEntityData; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import StevenDimDoors.mod_pocketDim.ServerPacketHandler; @@ -65,7 +62,7 @@ public class TileEntityRift extends DDTileEntityBase { if (PocketManager.getLink(xCoord, yCoord, zCoord, worldObj.provider.dimensionId) == null) { - if (worldObj.getBlockId(xCoord, yCoord, zCoord) == mod_pocketDim.blockRift.blockID) + if (worldObj.getBlock(xCoord, yCoord, zCoord) == mod_pocketDim.blockRift) { worldObj.setBlockToAir(xCoord, yCoord, zCoord); } @@ -76,7 +73,7 @@ public class TileEntityRift extends DDTileEntityBase return; } - if (worldObj.getBlockId(xCoord, yCoord, zCoord) != mod_pocketDim.blockRift.blockID) + if (worldObj.getBlock(xCoord, yCoord, zCoord) != mod_pocketDim.blockRift) { invalidate(); return; @@ -154,11 +151,11 @@ public class TileEntityRift extends DDTileEntityBase for (DimLink riftLink : dimension.findRiftsInRange(worldObj, 6, xCoord, yCoord, zCoord)) { Point4D location = riftLink.source(); - TileEntityRift rift = (TileEntityRift) worldObj.getBlockTileEntity(location.getX(), location.getY(), location.getZ()); + TileEntityRift rift = (TileEntityRift) worldObj.getTileEntity(location.getX(), location.getY(), location.getZ()); if (rift != null && !rift.shouldClose) { rift.shouldClose = true; - rift.onInventoryChanged(); + rift.markDirty(); } } } @@ -207,7 +204,7 @@ public class TileEntityRift extends DDTileEntityBase this.yOffset = 0; this.xOffset = 0; } - this.onInventoryChanged(); + this.markDirty(); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java index 65d239c..a61990f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/util/WeightedContainer.java @@ -1,6 +1,6 @@ package StevenDimDoors.mod_pocketDim.util; -import net.minecraft.util.WeightedRandomItem; +import net.minecraft.util.WeightedRandom; /*. * Implements a simple generic item for using net.minecraft.util.WeightedRandom with objects of type T. @@ -9,7 +9,7 @@ import net.minecraft.util.WeightedRandomItem; * extending WeightedRandomItem or cases in which we would have to break compatibility with previous serialized * instances to add support for WeightedRandomItem. */ -public class WeightedContainer extends WeightedRandomItem { +public class WeightedContainer extends WeightedRandom.Item { private T data; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java index 13edb19..16ab005 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java @@ -2,12 +2,15 @@ package StevenDimDoors.mod_pocketDim.world; import java.util.Random; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; +import net.minecraft.init.Blocks; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.config.DDProperties; +import net.minecraftforge.common.ForgeChunkManager; /** * Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo @@ -21,31 +24,31 @@ public class LimboDecay { private static final int SECTION_HEIGHT = 16; //Provides a reversed list of the block IDs that blocks cycle through during decay. - private final int[] decaySequence; + private final Block[] decaySequence; private final Random random; private final DDProperties properties; - private final int[] blocksImmuneToDecay; + private final Block[] blocksImmuneToDecay; public LimboDecay(DDProperties properties) { - decaySequence = new int[] { - properties.LimboBlockID, - Block.gravel.blockID, - Block.cobblestone.blockID, - Block.stone.blockID + decaySequence = new Block[] { + mod_pocketDim.blockLimbo, + Blocks.gravel, + Blocks.cobblestone, + Blocks.stone }; - blocksImmuneToDecay = new int[] { - properties.LimboBlockID, - properties.PermaFabricBlockID, - properties.TransientDoorID, - properties.DimensionalDoorID, - properties.WarpDoorID, - properties.RiftBlockID, - properties.UnstableDoorID, - properties.GoldenDoorID, - properties.GoldenDimensionalDoorID + blocksImmuneToDecay = new Block[] { + mod_pocketDim.blockLimbo, + mod_pocketDim.blockDimWallPerm, + mod_pocketDim.transientDoor, + mod_pocketDim.dimensionalDoor, + mod_pocketDim.warpDoor, + mod_pocketDim.blockRift, + mod_pocketDim.unstableDoor, + mod_pocketDim.goldenDoor, + mod_pocketDim.goldenDimensionalDoor }; this.properties = properties; @@ -90,7 +93,7 @@ public class LimboDecay { //Obtain the coordinates of active chunks in Limbo. For each section of each chunk, //pick a random block and try to apply fast decay. - for (Object coordObject : limbo.activeChunkSet) + for (Object coordObject : ForgeChunkManager.getPersistentChunksFor(limbo).keySet()) { ChunkCoordIntPair chunkCoord = (ChunkCoordIntPair) coordObject; @@ -112,10 +115,10 @@ public class LimboDecay { */ private boolean decayBlockFast(World world, int x, int y, int z) { - int blockID = world.getBlockId(x, y, z); - if (canDecayBlock(blockID)) + Block block = world.getBlock(x, y, z); + if (canDecayBlock(block, world, x, y, z)) { - world.setBlock(x, y, z, properties.LimboBlockID); + world.setBlock(x, y, z, mod_pocketDim.blockLimbo); return true; } return false; @@ -127,14 +130,14 @@ public class LimboDecay { private boolean decayBlock(World world, int x, int y, int z) { int index; - int blockID = world.getBlockId(x, y, z); - if (canDecayBlock(blockID)) + Block block = world.getBlock(x, y, z); + if (canDecayBlock(block, world, x, y, z)) { //Loop over the block IDs that decay can go through. //Find an index matching the current blockID, if any. for (index = 0; index < decaySequence.length; index++) { - if (decaySequence[index] == blockID) + if (decaySequence[index] == block) { break; } @@ -155,22 +158,21 @@ public class LimboDecay { /** * Checks if a block can decay. We will not decay air, certain DD blocks, or containers. */ - private boolean canDecayBlock(int blockID) + private boolean canDecayBlock(Block block, World world, int x, int y, int z) { - if (blockID == 0) + if (block.isAir(world, x, y, z)) { return false; } for (int k = 0; k < blocksImmuneToDecay.length; k++) { - if (blockID == blocksImmuneToDecay[k]) + if (block == blocksImmuneToDecay[k]) { return false; } } - - Block block = Block.blocksList[blockID]; + return (block == null || !(block instanceof BlockContainer)); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java index dd3185f..fd22e09 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboGenerator.java @@ -3,7 +3,11 @@ package StevenDimDoors.mod_pocketDim.world; import java.util.List; import java.util.Random; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import cpw.mods.fml.common.eventhandler.Event; +import net.minecraft.block.Block; import net.minecraft.entity.EnumCreatureType; +import net.minecraft.init.Blocks; import net.minecraft.util.IProgressUpdate; import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkPosition; @@ -13,9 +17,8 @@ import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.ChunkProviderGenerate; import net.minecraft.world.gen.NoiseGeneratorOctaves; -import net.minecraft.world.gen.feature.MapGenScatteredFeature; +import net.minecraft.world.gen.structure.MapGenScatteredFeature; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.Event.Result; import net.minecraftforge.event.terraingen.ChunkProviderEvent; import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.ticking.CustomLimboPopulator; @@ -119,7 +122,7 @@ public class LimboGenerator extends ChunkProviderGenerate } @Override - public void replaceBlocksForBiome(int par1, int par2, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase) + public void replaceBlocksForBiome(int par1, int par2, Block[] blocks, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase) { } @@ -129,8 +132,8 @@ public class LimboGenerator extends ChunkProviderGenerate { //TODO: Wtf? Why do you reinitialize the seed when we already initialized it in the constructor?! ~SenseiKiwi LimboGenerator.rand.setSeed(chunkX * 341873128712L + chunkZ * 132897987541L); - byte[] var3 = new byte[32768]; - this.generateTerrain(chunkX, chunkZ, var3); + Block[] var3 = new Block[32768]; + this.func_147424_a(chunkX, chunkZ, var3); Chunk var4 = new Chunk(this.worldObj, var3, chunkX, chunkZ); var4.generateSkylightMap(); @@ -163,7 +166,7 @@ public class LimboGenerator extends ChunkProviderGenerate { ChunkProviderEvent.InitNoiseField event = new ChunkProviderEvent.InitNoiseField(this, par1ArrayOfDouble, par2, par3, par4, par5, par6, par7); MinecraftForge.EVENT_BUS.post(event); - if (event.getResult() == Result.DENY) return event.noisefield; + if (event.getResult() == Event.Result.DENY) return event.noisefield; if (par1ArrayOfDouble == null) { @@ -208,13 +211,13 @@ public class LimboGenerator extends ChunkProviderGenerate { for (int var22 = -var19; var22 <= var19; ++var22) { - float var24 = this.parabolicField[var21 + 2 + (var22 + 2) * 5] / (BiomeGenBase.plains.minHeight + 9.0F); + float var24 = this.parabolicField[var21 + 2 + (var22 + 2) * 5] / (BiomeGenBase.plains.rootHeight + 9.0F); //this adjusts the height of the terrain - var16 += BiomeGenBase.plains.maxHeight * var24+4; - var17 += BiomeGenBase.plains.minHeight * var24-1; + var16 += BiomeGenBase.plains.heightVariation * var24+4; + var17 += BiomeGenBase.plains.rootHeight * var24-1; var18 += var24; } } @@ -305,7 +308,7 @@ public class LimboGenerator extends ChunkProviderGenerate return par1ArrayOfDouble; } @Override - public void generateTerrain(int par1, int par2, byte[] par3ArrayOfByte) + public void func_147424_a(int par1, int par2, Block[] blocks) { byte var4 = 4; byte var5 = 16; @@ -353,16 +356,16 @@ public class LimboGenerator extends ChunkProviderGenerate { if ((var47 += var49) > 0.0D) { - par3ArrayOfByte[var43 += var44] = (byte)properties.LimboBlockID; + blocks[var43 += var44] = mod_pocketDim.blockLimbo; } else if (var12 * 8 + var31 < var6) { - par3ArrayOfByte[var43 += var44] = (byte)properties.PermaFabricBlockID; + blocks[var43 += var44] = mod_pocketDim.blockDimWallPerm; } else { - par3ArrayOfByte[var43 += var44] = 0; + blocks[var43 += var44] = Blocks.air; } } @@ -402,7 +405,7 @@ public class LimboGenerator extends ChunkProviderGenerate } @Override - public ChunkPosition findClosestStructure(World var1, String var2, + public ChunkPosition func_147416_a(World var1, String var2, int var3, int var4, int var5) { // TODO Auto-generated method stub return null; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java index 9e22053..381fcb2 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboProvider.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim.world; import java.util.Random; +import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -50,7 +51,7 @@ public class LimboProvider extends WorldProvider @Override protected void registerWorldChunkManager() { - super.worldChunkMgr = new WorldChunkManagerHell(mod_pocketDim.limboBiome,1,1); + super.worldChunkMgr = new WorldChunkManagerHell(mod_pocketDim.limboBiome,1); } @Override @@ -73,7 +74,7 @@ public class LimboProvider extends WorldProvider @Override - public boolean canSnowAt(int x, int y, int z) + public boolean canSnowAt(int x, int y, int z, boolean checkLight) { return false; } @@ -136,8 +137,8 @@ public class LimboProvider extends WorldProvider @Override public boolean canCoordinateBeSpawn(int par1, int par2) { - int var3 = this.worldObj.getFirstUncoveredBlock(par1, par2); - return var3 == properties.LimboBlockID; + Block block = this.worldObj.getTopBlock(par1, par2); + return block == mod_pocketDim.blockLimbo; } @Override public double getHorizon() @@ -148,14 +149,14 @@ public class LimboProvider extends WorldProvider public Vec3 getSkyColor(Entity cameraEntity, float partialTicks) { setCloudRenderer( new CloudRenderBlank()); - return this.worldObj.getWorldVec3Pool().getVecFromPool(0, 0, 0); + return Vec3.createVectorHelper(0, 0, 0); } @SideOnly(Side.CLIENT) @Override public Vec3 getFogColor(float par1, float par2) { - return this.worldObj.getWorldVec3Pool().getVecFromPool(.2, .2, .2); + return Vec3.createVectorHelper(.2, .2, .2); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index 6f9b946..ffc5020 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -4,6 +4,7 @@ import java.util.Random; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; @@ -264,7 +265,7 @@ public class PocketBuilder } //Check if the block below that point is actually a door - Block block = Block.blocksList[world.getBlockId(source.getX(), source.getY() - 1, source.getZ())]; + Block block = world.getBlock(source.getX(), source.getY() - 1, source.getZ()); if (block==null || !(block instanceof IDimDoor)) { throw new IllegalStateException("The link's source is not a door block. It should be impossible to traverse a rift without a door!"); @@ -322,7 +323,7 @@ public class PocketBuilder * @param door * @return */ - public static boolean generateNewPersonalPocket(DimLink link, DDProperties properties,Entity player, Block door) + public static boolean generateNewPersonalPocket(DimLink link, DDProperties properties,EntityPlayer player, Block door) { //incase a chicken walks in or something if(!(player instanceof EntityPlayer)) @@ -338,7 +339,7 @@ public class PocketBuilder { //Register a new dimension NewDimData parent = PocketManager.getDimensionData(link.source().getDimension()); - NewDimData dimension = PocketManager.registerPocket(parent, DimensionType.PERSONAL, player.getEntityName()); + NewDimData dimension = PocketManager.registerPocket(parent, DimensionType.PERSONAL, player.getGameProfile().getId().toString()); //Load a world @@ -454,7 +455,7 @@ public class PocketBuilder BlockRotator.transformPoint(center, door, orientation - BlockRotator.EAST_DOOR_METADATA, door); //Build the outer layer of Eternal Fabric - buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2), properties.PermaFabricBlockID, 0, false, 0); + buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2), mod_pocketDim.blockDimWallPerm, 0, false, 0); //check if we are building a personal pocket int metadata = 0; @@ -466,19 +467,19 @@ public class PocketBuilder //Build the (wallThickness - 1) layers of Fabric of Reality for (int layer = 1; layer < wallThickness; layer++) { - buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2) - layer, mod_pocketDim.blockDimWall.blockID, metadata, + buildBox(world, center.getX(), center.getY(), center.getZ(), (size / 2) - layer, mod_pocketDim.blockDimWall, metadata, layer < (wallThickness - 1) && properties.TNFREAKINGT_Enabled, properties.NonTntWeight); } //MazeBuilder.generate(world, x, y, z, random); //Build the door - int doorOrientation = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA + 2, doorBlock.blockID); + int doorOrientation = BlockRotator.transformMetadata(BlockRotator.EAST_DOOR_METADATA, orientation - BlockRotator.EAST_DOOR_METADATA + 2, doorBlock); ItemDimensionalDoor.placeDoorBlock(world, x, y - 1, z, doorOrientation, doorBlock); } - private static void buildBox(World world, int centerX, int centerY, int centerZ, int radius, int blockID, int metadata, boolean placeTnt, int nonTntWeight) + private static void buildBox(World world, int centerX, int centerY, int centerZ, int radius, Block block, int metadata, boolean placeTnt, int nonTntWeight) { int x, y, z; @@ -495,14 +496,14 @@ public class PocketBuilder { for (z = startZ; z <= endZ; z++) { - setBlockDirectlySpecial(world, x, startY, z, blockID, metadata, placeTnt, nonTntWeight); - setBlockDirectlySpecial(world, x, endY, z, blockID, metadata, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, x, startY, z, block, metadata, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, x, endY, z, block, metadata, placeTnt, nonTntWeight); } for (y = startY; y <= endY; y++) { - setBlockDirectlySpecial(world, x, y, startZ, blockID, metadata, placeTnt, nonTntWeight); - setBlockDirectlySpecial(world, x, y, endZ, blockID, metadata, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, x, y, startZ, block, metadata, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, x, y, endZ, block, metadata, placeTnt, nonTntWeight); } } @@ -510,31 +511,26 @@ public class PocketBuilder { for (z = startZ; z <= endZ; z++) { - setBlockDirectlySpecial(world, startX, y, z, blockID, metadata, placeTnt, nonTntWeight); - setBlockDirectlySpecial(world, endX, y, z, blockID, metadata, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, startX, y, z, block, metadata, placeTnt, nonTntWeight); + setBlockDirectlySpecial(world, endX, y, z, block, metadata, placeTnt, nonTntWeight); } } } - private static void setBlockDirectlySpecial(World world, int x, int y, int z, int blockID, int metadata, boolean placeTnt, int nonTntWeight) + private static void setBlockDirectlySpecial(World world, int x, int y, int z, Block block, int metadata, boolean placeTnt, int nonTntWeight) { if (placeTnt && random.nextInt(nonTntWeight + 1) == 0) { - setBlockDirectly(world, x, y, z, Block.tnt.blockID, 1); + setBlockDirectly(world, x, y, z, Blocks.tnt, 1); } else { - setBlockDirectly(world, x, y, z, blockID, metadata); + setBlockDirectly(world, x, y, z, block, metadata); } } - private static void setBlockDirectly(World world, int x, int y, int z, int blockID, int metadata) + private static void setBlockDirectly(World world, int x, int y, int z, Block block, int metadata) { - if (blockID != 0 && Block.blocksList[blockID] == null) - { - return; - } - int cX = x >> 4; int cZ = z >> 4; int cY = y >> 4; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java index df99d03..de7e801 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketGenerator.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim.world; import java.util.List; +import net.minecraft.block.Block; import net.minecraft.entity.EnumCreatureType; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; @@ -27,7 +28,7 @@ public class PocketGenerator extends ChunkProviderGenerate } @Override - public void generateTerrain(int par1, int par2, byte[] par3ArrayOfByte) + public void func_147424_a(int par1, int par2, Block[] blocks) { } @@ -41,7 +42,7 @@ public class PocketGenerator extends ChunkProviderGenerate @Override public Chunk provideChunk(int chunkX, int chunkZ) { - byte[] var3 = new byte[32768]; + Block[] var3 = new Block[32768]; Chunk chunk = new Chunk(worldObj, var3, chunkX, chunkZ); if(!chunk.isTerrainPopulated) @@ -77,7 +78,7 @@ public class PocketGenerator extends ChunkProviderGenerate } @Override - public ChunkPosition findClosestStructure(World var1, String var2, int var3, int var4, int var5) + public ChunkPosition func_147416_a(World var1, String var2, int var3, int var4, int var5) { return null; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java index 2778197..ef57b97 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java @@ -6,13 +6,12 @@ import java.util.Random; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -import net.minecraft.world.gen.structure.ComponentNetherBridgeThrone; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; -import net.minecraft.world.gen.structure.StructureNetherBridgeStart; import StevenDimDoors.mod_pocketDim.config.DDProperties; +import net.minecraft.world.gen.structure.StructureNetherBridgePieces; -public class DDStructureNetherBridgeStart extends StructureNetherBridgeStart +public class DDStructureNetherBridgeStart extends StructureNetherBridgePieces.Start { public static final int MAX_GATEWAY_GENERATION_CHANCE = 100; @@ -26,26 +25,26 @@ public class DDStructureNetherBridgeStart extends StructureNetherBridgeStart public DDStructureNetherBridgeStart(World world, Random random, int chunkX, int chunkZ, DDProperties properties) { // StructureNetherBridgeStart handles designing the fortress for us - super(world, random, chunkX, chunkZ); + super(random, chunkX, chunkZ); Iterator componentIterator; StructureComponent component; StructureBoundingBox bounds; - ArrayList spawnerRooms; + ArrayList spawnerRooms; hasGateway = false; // Randomly decide whether to build a gateway in this fortress if (random.nextInt(MAX_GATEWAY_GENERATION_CHANCE) < properties.FortressGatewayGenerationChance) { // Search for all the blaze spawners in a fortress - spawnerRooms = new ArrayList(); + spawnerRooms = new ArrayList(); componentIterator = this.components.iterator(); while (componentIterator.hasNext()) { component = (StructureComponent) componentIterator.next(); - if (component instanceof ComponentNetherBridgeThrone) + if (component instanceof StructureNetherBridgePieces.Throne) { - spawnerRooms.add((ComponentNetherBridgeThrone) component); + spawnerRooms.add((StructureNetherBridgePieces.Throne) component); } } @@ -78,7 +77,7 @@ public class DDStructureNetherBridgeStart extends StructureNetherBridgeStart dimensionalTag.setInteger("GatewayMinY", this.minY); dimensionalTag.setInteger("GatewayMinZ", this.minZ); } - fortressTag.setCompoundTag("DimensionalDoors", dimensionalTag); + fortressTag.setTag("DimensionalDoors", dimensionalTag); return fortressTag; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java index 4e2c756..7b33283 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayGenerator.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; import net.minecraftforge.common.DimensionManager; @@ -97,9 +98,9 @@ public class GatewayGenerator implements IWorldGenerator //If the point is within the acceptable altitude range, the block above is empty, and we're //not building on bedrock, then generate a rift there if (y >= MIN_RIFT_Y && y <= MAX_RIFT_Y && world.isAirBlock(x, y + 1, z) && - world.getBlockId(x, y, z) != Block.bedrock.blockID && //<-- Stops Nether roof spawning. DO NOT REMOVE! - world.getBlockId(x, y - 1, z) != Block.bedrock.blockID && - world.getBlockId(x, y - 2, z) != Block.bedrock.blockID) + world.getBlock(x, y, z) != Blocks.bedrock && //<-- Stops Nether roof spawning. DO NOT REMOVE! + world.getBlock(x, y - 1, z) != Blocks.bedrock && + world.getBlock(x, y - 2, z) != Blocks.bedrock) { //Create a link. If this is not the first time, create a child link and connect it to the first link. if (link == null) @@ -165,8 +166,8 @@ public class GatewayGenerator implements IWorldGenerator return (y >= MIN_RIFT_Y && y <= MAX_RIFT_Y && world.isAirBlock(x, y + 1, z) && - world.getBlockId(x, y, z) != Block.bedrock.blockID && //<-- Stops Nether roof spawning. DO NOT REMOVE! - world.getBlockId(x, y - 1, z) != Block.bedrock.blockID && + world.getBlock(x, y, z) != Blocks.bedrock && //<-- Stops Nether roof spawning. DO NOT REMOVE! + world.getBlock(x, y - 1, z) != Blocks.bedrock && checkFoundationMaterial(world, x, y - 2, z)); } @@ -175,8 +176,8 @@ public class GatewayGenerator implements IWorldGenerator //We check the material and opacity to prevent generating gateways on top of trees or houses, //or on top of strange things like tall grass, water, slabs, or torches. //We also want to avoid generating things on top of the Nether's bedrock! - Material material = world.getBlockMaterial(x, y, z); - return (material != Material.leaves && material != Material.wood && material != Material.pumpkin - && world.isBlockOpaqueCube(x, y, z) && world.getBlockId(x, y, z) != Block.bedrock.blockID); + Material material = world.getBlock(x, y, z).getMaterial(); + return (material != Material.leaves && material != Material.wood && material != Material.gourd + && world.isBlockNormalCubeDefault(x, y, z, false) && world.getBlock(x, y, z) != Blocks.bedrock); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/PrivatePocketRender.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/PrivatePocketRender.java index 08458ea..0679252 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/PrivatePocketRender.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/PrivatePocketRender.java @@ -1,11 +1,11 @@ package StevenDimDoors.mod_pocketDimClient; +import net.minecraft.util.IIcon; import org.lwjgl.opengl.GL11; import net.minecraft.block.Block; import net.minecraft.block.BlockGrass; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -79,7 +79,7 @@ public class PrivatePocketRender implements ISimpleBlockRenderingHandler Tessellator tessellator = Tessellator.instance; boolean flag = false; - Icon icon = renderer.getBlockIcon(block, world, x, y, z, 2); + IIcon icon = renderer.getBlockIcon(block, world, x, y, z, 2); @@ -144,7 +144,7 @@ public class PrivatePocketRender implements ISimpleBlockRenderingHandler @Override - public boolean shouldRender3DInInventory() + public boolean shouldRender3DInInventory(int data) { // TODO Auto-generated method stub return true; diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index cbd3e21..585551a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -31,7 +31,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; -import net.minecraft.world.storage.MapCoord; import net.minecraft.world.storage.MapData; import static org.lwjgl.opengl.GL11.*; @@ -352,7 +351,7 @@ public class RenderDimDoor extends TileEntitySpecialRenderer TileEntityDimDoor tile = (TileEntityDimDoor) par1TileEntity; try { - mod_pocketDim.dimensionalDoor.updateAttachedTile(tile.worldObj, + mod_pocketDim.dimensionalDoor.updateAttachedTile(tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord); } catch (Exception e) diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java index 98f8e88..36d506b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderTransTrapdoor.java @@ -41,7 +41,7 @@ public class RenderTransTrapdoor extends TileEntitySpecialRenderer { GL11.glDisable(GL11.GL_LIGHTING); Random random = new Random(31100L); - int metadata = tile.worldObj.getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord); + int metadata = tile.getWorldObj().getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord); for (int count = 0; count < 16; ++count) { @@ -112,7 +112,7 @@ public class RenderTransTrapdoor extends TileEntitySpecialRenderer GL11.glColor4d(var21 * var17, var22 * var17, var23 * var17, 1.0F); if (TransTrapdoor.isTrapdoorSetLow(metadata)) { - if (BlockTrapDoor.isTrapdoorOpen(metadata)) + if (BlockTrapDoor.func_150118_d(metadata)) { GL11.glVertex3d(x, y+0.2, z); GL11.glVertex3d(x, y+0.2, z+1); @@ -129,7 +129,7 @@ public class RenderTransTrapdoor extends TileEntitySpecialRenderer } else { - if (BlockTrapDoor.isTrapdoorOpen(metadata)) + if (BlockTrapDoor.func_150118_d(metadata)) { GL11.glVertex3d(x, y+0.95, z); GL11.glVertex3d(x, y+0.95, z+1); -- 2.39.5 From fe40edf200542ede735b16ad296199f843c46bc0 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Wed, 4 Mar 2015 01:10:39 -0600 Subject: [PATCH 03/58] More low-hanging fruit. --- .../experimental/MazeBuilder.java | 48 +++++++++---------- .../experimental/SphereDecayOperation.java | 14 +++--- .../mod_pocketDim/CraftingManager.java | 28 +++++------ .../mod_pocketDim/EventHookContainer.java | 28 +++++------ .../mod_pocketDim/core/DDTeleporter.java | 5 +- .../dungeon/FillContainersOperation.java | 6 +-- .../mod_pocketDim/dungeon/ModBlockFilter.java | 2 +- .../mod_pocketDim/mod_pocketDim.java | 6 ++- .../ticking/ServerTickHandler.java | 40 ++++++++-------- .../mod_pocketDim/world/PocketBuilder.java | 2 +- .../mod_pocketDim/world/PocketProvider.java | 8 ++-- .../fortresses/DDNetherFortressGenerator.java | 2 +- .../DDStructureNetherBridgeStart.java | 5 +- 13 files changed, 94 insertions(+), 100 deletions(-) diff --git a/src/main/java/StevenDimDoors/experimental/MazeBuilder.java b/src/main/java/StevenDimDoors/experimental/MazeBuilder.java index 9e31e9a..3069b4a 100644 --- a/src/main/java/StevenDimDoors/experimental/MazeBuilder.java +++ b/src/main/java/StevenDimDoors/experimental/MazeBuilder.java @@ -3,6 +3,7 @@ package StevenDimDoors.experimental; import java.util.Random; import net.minecraft.block.Block; +import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; @@ -16,7 +17,7 @@ public class MazeBuilder { MazeDesign design = MazeDesigner.generate(random); Point3D offset = new Point3D(x - design.width() / 2, y - design.height() - 1, z - design.length() / 2); - SphereDecayOperation decay = new SphereDecayOperation(random, 0, 0, Block.stoneBrick.blockID, 2); + SphereDecayOperation decay = new SphereDecayOperation(random, Blocks.air, 0, Blocks.stonebrick, 2); buildRooms(design.getRoomGraph(), world, offset); carveDoorways(design.getRoomGraph(), world, offset, decay, random); @@ -37,7 +38,7 @@ public class MazeBuilder for (IGraphNode node : roomGraph.nodes()) { PartitionNode room = node.data(); - buildBox(world, offset, room.minCorner(), room.maxCorner(), Block.stoneBrick.blockID, 0); + buildBox(world, offset, room.minCorner(), room.maxCorner(), Blocks.stonebrick, 0); } } @@ -146,28 +147,28 @@ public class MazeBuilder private static void carveDoorAlongX(World world, int x, int y, int z) { - setBlockDirectly(world, x, y, z, 0, 0); - setBlockDirectly(world, x, y + 1, z, 0, 0); - setBlockDirectly(world, x + 1, y, z, 0, 0); - setBlockDirectly(world, x + 1, y + 1, z, 0, 0); + setBlockDirectly(world, x, y, z, Blocks.air, 0); + setBlockDirectly(world, x, y + 1, z, Blocks.air, 0); + setBlockDirectly(world, x + 1, y, z, Blocks.air, 0); + setBlockDirectly(world, x + 1, y + 1, z, Blocks.air, 0); } private static void carveDoorAlongZ(World world, int x, int y, int z) { - setBlockDirectly(world, x, y, z, 0, 0); - setBlockDirectly(world, x, y + 1, z, 0, 0); - setBlockDirectly(world, x, y, z + 1, 0, 0); - setBlockDirectly(world, x, y + 1, z + 1, 0, 0); + setBlockDirectly(world, x, y, z, Blocks.air, 0); + setBlockDirectly(world, x, y + 1, z, Blocks.air, 0); + setBlockDirectly(world, x, y, z + 1, Blocks.air, 0); + setBlockDirectly(world, x, y + 1, z + 1, Blocks.air, 0); } private static void carveHole(World world, int x, int y, int z) { - setBlockDirectly(world, x, y, z, 0, 0); - setBlockDirectly(world, x, y + 1, z, 0, 0); + setBlockDirectly(world, x, y, z, Blocks.air, 0); + setBlockDirectly(world, x, y + 1, z, Blocks.air, 0); } - private static void buildBox(World world, Point3D offset, Point3D minCorner, Point3D maxCorner, int blockID, int metadata) + private static void buildBox(World world, Point3D offset, Point3D minCorner, Point3D maxCorner, Block block, int metadata) { int minX = minCorner.getX() + offset.getX(); int minY = minCorner.getY() + offset.getY(); @@ -183,35 +184,30 @@ public class MazeBuilder { for (z = minZ; z <= maxZ; z++) { - setBlockDirectly(world, x, minY, z, blockID, metadata); - setBlockDirectly(world, x, maxY, z, blockID, metadata); + setBlockDirectly(world, x, minY, z, block, metadata); + setBlockDirectly(world, x, maxY, z, block, metadata); } } for (x = minX; x <= maxX; x++) { for (y = minY; y <= maxY; y++) { - setBlockDirectly(world, x, y, minZ, blockID, metadata); - setBlockDirectly(world, x, y, maxZ, blockID, metadata); + setBlockDirectly(world, x, y, minZ, block, metadata); + setBlockDirectly(world, x, y, maxZ, block, metadata); } } for (z = minZ; z <= maxZ; z++) { for (y = minY; y <= maxY; y++) { - setBlockDirectly(world, minX, y, z, blockID, metadata); - setBlockDirectly(world, maxX, y, z, blockID, metadata); + setBlockDirectly(world, minX, y, z, block, metadata); + setBlockDirectly(world, maxX, y, z, block, metadata); } } } - private static void setBlockDirectly(World world, int x, int y, int z, int blockID, int metadata) + private static void setBlockDirectly(World world, int x, int y, int z, Block block, int metadata) { - if (blockID != 0 && Block.blocksList[blockID] == null) - { - return; - } - int cX = x >> 4; int cZ = z >> 4; int cY = y >> 4; @@ -228,7 +224,7 @@ public class MazeBuilder extBlockStorage = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); chunk.getBlockStorageArray()[cY] = extBlockStorage; } - extBlockStorage.setExtBlockID(localX, y & 15, localZ, blockID); + extBlockStorage.setExtBlockID(localX, y & 15, localZ, block); extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata); chunk.setChunkModified(); } diff --git a/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java b/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java index 0af0bac..c6fa3d7 100644 --- a/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java +++ b/src/main/java/StevenDimDoors/experimental/SphereDecayOperation.java @@ -29,18 +29,18 @@ public class SphereDecayOperation extends WorldOperation private double centerX; private double centerY; private double centerZ; - private int primaryBlockID; + private Block primaryBlock; private int primaryMetadata; - private int secondaryBlockID; + private Block secondaryBlock; private int secondaryMetadata; - public SphereDecayOperation(Random random, int primaryBlockID, int primaryMetadata, int secondaryBlockID, int secondaryMetadata) + public SphereDecayOperation(Random random, Block primaryBlock, int primaryMetadata, Block secondaryBlock, int secondaryMetadata) { super("SphereDecayOperation"); this.random = random; - this.primaryBlockID = primaryBlockID; + this.primaryBlock = primaryBlock; this.primaryMetadata = primaryMetadata; - this.secondaryBlockID = secondaryBlockID; + this.secondaryBlock = secondaryBlock; this.secondaryMetadata = secondaryMetadata; } @@ -72,11 +72,11 @@ public class SphereDecayOperation extends WorldOperation if (squareDistance < 0.5 || random.nextDouble() < scaling / squareDistance) { - world.setBlock(x, y, z, primaryBlockID, primaryMetadata, 1); + world.setBlock(x, y, z, primaryBlock, primaryMetadata, 1); } else if (random.nextDouble() < scaling / squareDistance) { - world.setBlock(x, y, z, secondaryBlockID, secondaryMetadata, 1); + world.setBlock(x, y, z, secondaryBlock, secondaryMetadata, 1); } } return true; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java index a9df452..d95bd36 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java @@ -1,6 +1,8 @@ package StevenDimDoors.mod_pocketDim; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; import net.minecraft.block.Block; import net.minecraft.block.BlockDispenser; import net.minecraft.entity.player.EntityPlayer; @@ -14,10 +16,9 @@ import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.core.DDLock; import StevenDimDoors.mod_pocketDim.items.ItemDDKey; import StevenDimDoors.mod_pocketDim.items.behaviors.DispenserBehaviorStabilizedRS; -import cpw.mods.fml.common.ICraftingHandler; import cpw.mods.fml.common.registry.GameRegistry; -public class CraftingManager implements ICraftingHandler +public class CraftingManager { CraftingManager() { } @@ -123,19 +124,19 @@ public class CraftingManager implements ICraftingHandler } - @Override - public void onCrafting(EntityPlayer player, ItemStack item, IInventory craftMatrix) + @SubscribeEvent + public void onCrafting(PlayerEvent.ItemCraftedEvent event) { - if(item.getItem() instanceof ItemDDKey) + if(event.crafting.getItem() instanceof ItemDDKey) { - ItemDDKey keyItem = (ItemDDKey) item.getItem(); + ItemDDKey keyItem = (ItemDDKey) event.crafting.getItem(); ItemStack topKey = null; ItemStack bottomKey = null; int topKeySlot = 0; - for(int i = 0; i> 4, MathHelper.floor_double(entity.posZ) >> 4); // Tell Forge we're moving its players so everyone else knows. // Let's try doing this down here in case this is what's killing NEI. - GameRegistry.onPlayerChangedDimension((EntityPlayer)entity); + FMLCommonHandler.instance().firePlayerChangedDimensionEvent((EntityPlayer)entity, oldWorld.provider.dimensionId, newWorld.provider.dimensionId); } DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); return entity; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java index e44a58b..ef39006 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/FillContainersOperation.java @@ -33,12 +33,12 @@ public class FillContainersOperation extends WorldOperation @Override protected boolean applyToBlock(World world, int x, int y, int z) { - int blockID = world.getBlockId(x, y, z); + Block block = world.getBlock(x, y, z); // Fill empty chests and dispensers - if (Block.blocksList[blockID] instanceof BlockContainer) + if (block instanceof BlockContainer) { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + TileEntity tileEntity = world.getTileEntity(x, y, z); // Fill chests if (tileEntity instanceof TileEntityChest) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java index 08fb8fe..5e3270e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java @@ -36,7 +36,7 @@ public class ModBlockFilter extends SchematicFilter { } } //No matching exception found. Replace the block. - blocks[index] = replacementBlockID; + blocks[index] = replacementBlock; metadata[index] = replacementMetadata; return true; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 79ccb36..3e56941 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -1,6 +1,8 @@ package StevenDimDoors.mod_pocketDim; import java.io.File; + +import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; @@ -189,7 +191,7 @@ public class mod_pocketDim { // Initialize ServerTickHandler instance serverTickHandler = new ServerTickHandler(); - TickRegistry.registerTickHandler(serverTickHandler, Side.SERVER); + FMLCommonHandler.instance().bus().register(serverTickHandler); // Initialize LimboDecay instance: required for BlockLimbo limboDecay = new LimboDecay(properties); @@ -307,7 +309,7 @@ public class mod_pocketDim CraftingManager.registerRecipes(properties); CraftingManager.registerDispenserBehaviors(); - GameRegistry.registerCraftingHandler(new CraftingManager()); + FMLCommonHandler.instance().bus().register(new CraftingManager()); DungeonHelper.initialize(); gatewayGenerator = new GatewayGenerator(properties); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/ServerTickHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/ServerTickHandler.java index 58da365..83844c0 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/ServerTickHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/ServerTickHandler.java @@ -1,13 +1,15 @@ package StevenDimDoors.mod_pocketDim.ticking; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.EnumSet; import StevenDimDoors.mod_pocketDim.core.DDTeleporter; -import cpw.mods.fml.common.ITickHandler; -import cpw.mods.fml.common.TickType; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.relauncher.Side; -public class ServerTickHandler implements ITickHandler, IRegularTickSender +public class ServerTickHandler implements IRegularTickSender { private static final String PROFILING_LABEL = "Dimensional Doors: Server Tick"; @@ -32,10 +34,19 @@ public class ServerTickHandler implements ITickHandler, IRegularTickSender receivers.clear(); } - @Override - public void tickStart(EnumSet type, Object... tickData) - { - if (type.equals(EnumSet.of(TickType.SERVER))) + @SubscribeEvent + public void tickEvent(TickEvent event) { + if (event.side != Side.SERVER) + return; + + if (event.phase == TickEvent.Phase.START) + tickStart(event.type); + else if (event.phase == TickEvent.Phase.END) + tickEnd(event.type); + } + + private void tickStart(TickEvent.Type type) { + if (type.equals(EnumSet.of(TickEvent.Type.SERVER))) { for (RegularTickReceiverInfo info : receivers) { @@ -54,8 +65,7 @@ public class ServerTickHandler implements ITickHandler, IRegularTickSender } } - @Override - public void tickEnd(EnumSet type, Object... tickData) + private void tickEnd(TickEvent.Type type) { for (RegularTickReceiverInfo info : receivers) { @@ -66,16 +76,4 @@ public class ServerTickHandler implements ITickHandler, IRegularTickSender } tickCount++; //There is no need to reset the counter. Let it overflow. } - - @Override - public EnumSet ticks() - { - return EnumSet.of(TickType.SERVER); - } - - @Override - public String getLabel() - { - return PROFILING_LABEL; //Used for profiling! - } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index ffc5020..d0b4555 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -547,7 +547,7 @@ public class PocketBuilder extBlockStorage = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); chunk.getBlockStorageArray()[cY] = extBlockStorage; } - extBlockStorage.setExtBlockID(localX, y & 15, localZ, blockID); + extBlockStorage.setExtBlockID(localX, y & 15, localZ, block); extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata); chunk.setChunkModified(); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java index dd6e787..7caaa26 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java @@ -34,7 +34,7 @@ public class PocketProvider extends WorldProvider @Override protected void registerWorldChunkManager() { - super.worldChunkMgr = new WorldChunkManagerHell(mod_pocketDim.pocketBiome, 1, 1); + super.worldChunkMgr = new WorldChunkManagerHell(mod_pocketDim.pocketBiome, 1); } @Override @@ -47,14 +47,14 @@ public class PocketProvider extends WorldProvider public Vec3 getSkyColor(Entity cameraEntity, float partialTicks) { setCloudRenderer( new CloudRenderBlank()); - return this.worldObj.getWorldVec3Pool().getVecFromPool(0d, 0d, 0d); + return Vec3.createVectorHelper(0d, 0d, 0d); } @SideOnly(Side.CLIENT) @Override public Vec3 getFogColor(float par1, float par2) { - return this.worldObj.getWorldVec3Pool().getVecFromPool(0d, 0d, 0d); + return Vec3.createVectorHelper(0d, 0d, 0d); } @Override @@ -70,7 +70,7 @@ public class PocketProvider extends WorldProvider } @Override - public boolean canSnowAt(int x, int y, int z) + public boolean canSnowAt(int x, int y, int z, boolean light) { return false; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java index 9531939..0d63af0 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDNetherFortressGenerator.java @@ -15,7 +15,7 @@ public class DDNetherFortressGenerator extends MapGenNetherBridge // If we don't do this, Minecraft will crash when a fortress tries to generate. // Moreover, use Fortress as our structure identifier so that if DD is removed, // fortresses will generate properly using Vanilla code. - MapGenStructureIO.func_143034_b(DDStructureNetherBridgeStart.class, "Fortress"); + MapGenStructureIO.func_143031_a(DDStructureNetherBridgeStart.class, "Fortress"); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java index ef57b97..a10f2de 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/DDStructureNetherBridgeStart.java @@ -10,8 +10,9 @@ import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.world.gen.structure.StructureNetherBridgePieces; +import net.minecraft.world.gen.structure.StructureStart; -public class DDStructureNetherBridgeStart extends StructureNetherBridgePieces.Start +public class DDStructureNetherBridgeStart extends StructureStart { public static final int MAX_GATEWAY_GENERATION_CHANCE = 100; @@ -25,7 +26,7 @@ public class DDStructureNetherBridgeStart extends StructureNetherBridgePieces.St public DDStructureNetherBridgeStart(World world, Random random, int chunkX, int chunkZ, DDProperties properties) { // StructureNetherBridgeStart handles designing the fortress for us - super(random, chunkX, chunkZ); + super(chunkX, chunkZ); Iterator componentIterator; StructureComponent component; -- 2.39.5 From c075079630b5955c699d6e80fab40a4e9297a4f1 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Wed, 4 Mar 2015 04:09:48 -0600 Subject: [PATCH 04/58] Fix sounds & last of the low-hanging fruit --- .../StevenDimDoors/mod_pocketDim/DimData.java | 4 +- .../mod_pocketDim/EventHookContainer.java | 83 ++----- .../commands/CommandCreateRandomRift.java | 4 +- .../commands/CommandDeleteRifts.java | 2 +- .../commands/CommandTeleportPlayer.java | 2 +- .../helpers/BlockRotationHelper.java | 234 +++++++++--------- .../helpers/ChunkLoaderHelper.java | 4 +- .../mod_pocketDim/helpers/yCoordHelper.java | 25 +- .../schematic/ChunkBlockSetter.java | 6 +- .../schematic/WorldCopyOperation.java | 2 +- .../mod_pocketDim/ticking/MobMonolith.java | 2 +- .../mod_pocketDim/world/CustomCaveGen.java | 34 +-- .../mod_pocketDim/world/DDBiomeGenBase.java | 2 +- .../world/PersonalPocketProvider.java | 4 +- .../fortresses/ComponentNetherGateway.java | 90 +++---- .../world/gateways/GatewayLimbo.java | 15 +- .../world/gateways/GatewayTwoPillars.java | 9 +- .../mod_pocketDimClient/ClientProxy.java | 4 +- .../mod_pocketDimClient/RenderMobObelisk.java | 8 +- .../resources/assets/dimdoors/sounds.json | 15 ++ 20 files changed, 264 insertions(+), 285 deletions(-) create mode 100644 src/main/resources/assets/dimdoors/sounds.json diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java index cd57285..4fb7bfe 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/DimData.java @@ -64,7 +64,7 @@ public class DimData implements Serializable { while (k>> rotationMappings = new HashMap>>(); + public HashMap>> rotationMappings = new HashMap>>(); public BlockRotationHelper() { @@ -15,7 +16,7 @@ public class BlockRotationHelper public void InitializeRotationMap() { - HashMap> orientation0 = new HashMap>(); + HashMap> orientation0 = new HashMap>(); HashMap stairs0 = new HashMap(); @@ -99,7 +100,7 @@ public class BlockRotationHelper railsSpecial0.put(9, 8); - HashMap> orientation1 = new HashMap>(); + HashMap> orientation1 = new HashMap>(); HashMap stairs1 = new HashMap(); @@ -183,7 +184,7 @@ public class BlockRotationHelper railsSpecial1.put(8, 8); railsSpecial1.put(9, 9); - HashMap> orientation2 = new HashMap>(); + HashMap> orientation2 = new HashMap>(); HashMap stairs2 = new HashMap(); @@ -270,122 +271,119 @@ public class BlockRotationHelper - orientation0.put(Block.stairsBrick.blockID, stairs0); - orientation0.put(Block.stairsCobblestone.blockID, stairs0); - orientation0.put(Block.stairsNetherBrick.blockID, stairs0); - orientation0.put(Block.stairsNetherQuartz.blockID, stairs0); - orientation0.put(Block.stairsSandStone.blockID, stairs0); - orientation0.put(Block.stairsStoneBrick.blockID, stairs0); - orientation0.put(Block.stairsWoodBirch.blockID, stairs0); - orientation0.put(Block.stairsWoodJungle.blockID, stairs0); - orientation0.put(Block.stairsWoodOak.blockID, stairs0); - orientation0.put(Block.stairsWoodSpruce.blockID, stairs0); - orientation0.put(Block.stairsBrick.blockID, stairs0); - orientation0.put(Block.vine.blockID, vine0); - orientation0.put(Block.chest.blockID, chestsLadders0); - orientation0.put(Block.chestTrapped.blockID, chestsLadders0); - orientation0.put(Block.ladder.blockID, chestsLadders0); - orientation0.put(Block.lever.blockID, leverButtonTorch0); - orientation0.put(Block.stoneButton.blockID, leverButtonTorch0); - orientation0.put(Block.woodenButton.blockID, leverButtonTorch0); - orientation0.put(Block.torchRedstoneActive.blockID, leverButtonTorch0); - orientation0.put(Block.torchRedstoneIdle.blockID, leverButtonTorch0); - orientation0.put(Block.torchWood.blockID, leverButtonTorch0); - orientation0.put(Block.pistonBase.blockID,pistonDropperDispenser0); - orientation0.put(Block.pistonExtension.blockID,pistonDropperDispenser0); - orientation0.put(Block.pistonMoving.blockID,pistonDropperDispenser0); - orientation0.put(Block.pistonStickyBase.blockID,pistonDropperDispenser0); - orientation0.put(Block.dropper.blockID,pistonDropperDispenser0); - orientation0.put(Block.dispenser.blockID,pistonDropperDispenser0); - orientation0.put(Block.redstoneComparatorActive.blockID,pistonDropperDispenser0); - orientation0.put(Block.redstoneComparatorIdle.blockID,pistonDropperDispenser0); - orientation0.put(Block.redstoneRepeaterActive.blockID,pistonDropperDispenser0); - orientation0.put(Block.redstoneRepeaterIdle.blockID,pistonDropperDispenser0); - orientation0.put(Block.doorWood.blockID,pistonDropperDispenser0); - orientation0.put(Block.doorIron.blockID,pistonDropperDispenser0); - orientation0.put(Block.tripWireSource.blockID,pistonDropperDispenser0); - orientation0.put(Block.railDetector.blockID,railsSpecial0); - orientation0.put(Block.railActivator.blockID,railsSpecial0); - orientation0.put(Block.railPowered.blockID,railsSpecial0); - orientation0.put(Block.rail.blockID,rails0); + orientation0.put(Blocks.brick_stairs, stairs0); + orientation0.put(Blocks.stone_stairs, stairs0); + orientation0.put(Blocks.nether_brick_stairs, stairs0); + orientation0.put(Blocks.quartz_stairs, stairs0); + orientation0.put(Blocks.sandstone_stairs, stairs0); + orientation0.put(Blocks.stone_brick_stairs, stairs0); + orientation0.put(Blocks.birch_stairs, stairs0); + orientation0.put(Blocks.jungle_stairs, stairs0); + orientation0.put(Blocks.oak_stairs, stairs0); + orientation0.put(Blocks.spruce_stairs, stairs0); + orientation0.put(Blocks.brick_stairs, stairs0); + orientation0.put(Blocks.vine, vine0); + orientation0.put(Blocks.chest, chestsLadders0); + orientation0.put(Blocks.trapped_chest, chestsLadders0); + orientation0.put(Blocks.ladder, chestsLadders0); + orientation0.put(Blocks.lever, leverButtonTorch0); + orientation0.put(Blocks.stone_button, leverButtonTorch0); + orientation0.put(Blocks.wooden_button, leverButtonTorch0); + orientation0.put(Blocks.redstone_torch, leverButtonTorch0); + orientation0.put(Blocks.unlit_redstone_torch, leverButtonTorch0); + orientation0.put(Blocks.torch, leverButtonTorch0); + orientation0.put(Blocks.piston,pistonDropperDispenser0); + orientation0.put(Blocks.piston_head,pistonDropperDispenser0); + orientation0.put(Blocks.piston_extension,pistonDropperDispenser0); + orientation0.put(Blocks.sticky_piston,pistonDropperDispenser0); + orientation0.put(Blocks.dropper,pistonDropperDispenser0); + orientation0.put(Blocks.dispenser,pistonDropperDispenser0); + orientation0.put(Blocks.powered_comparator,pistonDropperDispenser0); + orientation0.put(Blocks.unpowered_comparator,pistonDropperDispenser0); + orientation0.put(Blocks.powered_repeater,pistonDropperDispenser0); + orientation0.put(Blocks.unpowered_repeater,pistonDropperDispenser0); + orientation0.put(Blocks.wooden_door,pistonDropperDispenser0); + orientation0.put(Blocks.iron_door,pistonDropperDispenser0); + orientation0.put(Blocks.tripwire_hook,pistonDropperDispenser0); + orientation0.put(Blocks.detector_rail,railsSpecial0); + orientation0.put(Blocks.activator_rail,railsSpecial0); + orientation0.put(Blocks.golden_rail,railsSpecial0); + orientation0.put(Blocks.rail,rails0); - orientation1.put(Block.stairsBrick.blockID, stairs1); - orientation1.put(Block.stairsCobblestone.blockID, stairs1); - orientation1.put(Block.stairsNetherBrick.blockID, stairs1); - orientation1.put(Block.stairsNetherQuartz.blockID, stairs1); - orientation1.put(Block.stairsSandStone.blockID, stairs1); - orientation1.put(Block.stairsStoneBrick.blockID, stairs1); - orientation1.put(Block.stairsWoodBirch.blockID, stairs1); - orientation1.put(Block.stairsWoodJungle.blockID, stairs1); - orientation1.put(Block.stairsWoodOak.blockID, stairs1); - orientation1.put(Block.stairsWoodSpruce.blockID, stairs1); - orientation1.put(Block.stairsBrick.blockID, stairs1); - orientation1.put(Block.vine.blockID, vine1); - orientation1.put(Block.chest.blockID, chestsLadders1); - orientation1.put(Block.chestTrapped.blockID, chestsLadders1); - orientation1.put(Block.ladder.blockID, chestsLadders1); - orientation1.put(Block.lever.blockID, leverButtonTorch1); - orientation1.put(Block.stoneButton.blockID, leverButtonTorch1); - orientation1.put(Block.woodenButton.blockID, leverButtonTorch1); - orientation1.put(Block.torchRedstoneActive.blockID, leverButtonTorch1); - orientation1.put(Block.torchRedstoneIdle.blockID, leverButtonTorch1); - orientation1.put(Block.torchWood.blockID, leverButtonTorch1); - orientation1.put(Block.pistonBase.blockID,pistonDropperDispenser1); - orientation1.put(Block.pistonExtension.blockID,pistonDropperDispenser1); - orientation1.put(Block.pistonMoving.blockID,pistonDropperDispenser1); - orientation1.put(Block.pistonStickyBase.blockID,pistonDropperDispenser1); - orientation1.put(Block.dropper.blockID,pistonDropperDispenser1); - orientation1.put(Block.dispenser.blockID,pistonDropperDispenser1); - orientation1.put(Block.redstoneComparatorActive.blockID,pistonDropperDispenser1); - orientation1.put(Block.redstoneComparatorIdle.blockID,pistonDropperDispenser1); - orientation1.put(Block.redstoneRepeaterActive.blockID,pistonDropperDispenser1); - orientation1.put(Block.redstoneRepeaterIdle.blockID,pistonDropperDispenser1); - orientation1.put(Block.doorWood.blockID,pistonDropperDispenser1); - orientation1.put(Block.doorIron.blockID,pistonDropperDispenser1); - orientation1.put(Block.tripWireSource.blockID,pistonDropperDispenser1); - orientation1.put(Block.railDetector.blockID,railsSpecial1); - orientation1.put(Block.railActivator.blockID,railsSpecial1); - orientation1.put(Block.railPowered.blockID,railsSpecial1); - orientation1.put(Block.rail.blockID,rails1); + orientation1.put(Blocks.brick_stairs, stairs1); + orientation1.put(Blocks.stone_stairs, stairs1); + orientation1.put(Blocks.nether_brick_stairs, stairs1); + orientation1.put(Blocks.quartz_stairs, stairs1); + orientation1.put(Blocks.sandstone_stairs, stairs1); + orientation1.put(Blocks.stone_brick_stairs, stairs1); + orientation1.put(Blocks.birch_stairs, stairs1); + orientation1.put(Blocks.jungle_stairs, stairs1); + orientation1.put(Blocks.oak_stairs, stairs1); + orientation1.put(Blocks.spruce_stairs, stairs1); + orientation1.put(Blocks.vine, vine1); + orientation1.put(Blocks.chest, chestsLadders1); + orientation1.put(Blocks.trapped_chest, chestsLadders1); + orientation1.put(Blocks.ladder, chestsLadders1); + orientation1.put(Blocks.lever, leverButtonTorch1); + orientation1.put(Blocks.stone_button, leverButtonTorch1); + orientation1.put(Blocks.wooden_button, leverButtonTorch1); + orientation1.put(Blocks.redstone_torch, leverButtonTorch1); + orientation1.put(Blocks.unlit_redstone_torch, leverButtonTorch1); + orientation1.put(Blocks.torch, leverButtonTorch1); + orientation1.put(Blocks.piston,pistonDropperDispenser1); + orientation1.put(Blocks.piston_head,pistonDropperDispenser1); + orientation1.put(Blocks.piston_extension,pistonDropperDispenser1); + orientation1.put(Blocks.sticky_piston,pistonDropperDispenser1); + orientation1.put(Blocks.dropper,pistonDropperDispenser1); + orientation1.put(Blocks.dispenser,pistonDropperDispenser1); + orientation1.put(Blocks.powered_comparator,pistonDropperDispenser1); + orientation1.put(Blocks.unpowered_comparator,pistonDropperDispenser1); + orientation1.put(Blocks.powered_repeater,pistonDropperDispenser1); + orientation1.put(Blocks.unpowered_repeater,pistonDropperDispenser1); + orientation1.put(Blocks.wooden_door,pistonDropperDispenser1); + orientation1.put(Blocks.iron_door,pistonDropperDispenser1); + orientation1.put(Blocks.tripwire_hook,pistonDropperDispenser1); + orientation1.put(Blocks.detector_rail,railsSpecial1); + orientation1.put(Blocks.activator_rail,railsSpecial1); + orientation1.put(Blocks.golden_rail,railsSpecial1); + orientation1.put(Blocks.rail,rails1); - orientation2.put(Block.stairsBrick.blockID, stairs2); - orientation2.put(Block.stairsCobblestone.blockID, stairs2); - orientation2.put(Block.stairsNetherBrick.blockID, stairs2); - orientation2.put(Block.stairsNetherQuartz.blockID, stairs2); - orientation2.put(Block.stairsSandStone.blockID, stairs2); - orientation2.put(Block.stairsStoneBrick.blockID, stairs2); - orientation2.put(Block.stairsWoodBirch.blockID, stairs2); - orientation2.put(Block.stairsWoodJungle.blockID, stairs2); - orientation2.put(Block.stairsWoodOak.blockID, stairs2); - orientation2.put(Block.stairsWoodSpruce.blockID, stairs2); - orientation2.put(Block.stairsBrick.blockID, stairs2); - orientation2.put(Block.vine.blockID, vine2); - orientation2.put(Block.chest.blockID, chestsLadders2); - orientation2.put(Block.chestTrapped.blockID, chestsLadders2); - orientation2.put(Block.ladder.blockID, chestsLadders2); - orientation2.put(Block.lever.blockID, leverButtonTorch2); - orientation2.put(Block.stoneButton.blockID, leverButtonTorch2); - orientation2.put(Block.woodenButton.blockID, leverButtonTorch2); - orientation2.put(Block.torchRedstoneActive.blockID, leverButtonTorch2); - orientation2.put(Block.torchRedstoneIdle.blockID, leverButtonTorch2); - orientation2.put(Block.torchWood.blockID, leverButtonTorch2); - orientation2.put(Block.pistonBase.blockID,pistonDropperDispenser2); - orientation2.put(Block.pistonExtension.blockID,pistonDropperDispenser2); - orientation2.put(Block.pistonMoving.blockID,pistonDropperDispenser2); - orientation2.put(Block.pistonStickyBase.blockID,pistonDropperDispenser2); - orientation2.put(Block.dropper.blockID,pistonDropperDispenser2); - orientation2.put(Block.dispenser.blockID,pistonDropperDispenser2); - orientation2.put(Block.redstoneComparatorActive.blockID,pistonDropperDispenser2); - orientation2.put(Block.redstoneComparatorIdle.blockID,pistonDropperDispenser2); - orientation2.put(Block.redstoneRepeaterActive.blockID,pistonDropperDispenser2); - orientation2.put(Block.redstoneRepeaterIdle.blockID,pistonDropperDispenser2); - orientation2.put(Block.doorWood.blockID,pistonDropperDispenser2); - orientation2.put(Block.doorIron.blockID,pistonDropperDispenser2); - orientation2.put(Block.tripWireSource.blockID,pistonDropperDispenser2); - orientation2.put(Block.railDetector.blockID,railsSpecial2); - orientation2.put(Block.railActivator.blockID,railsSpecial2); - orientation2.put(Block.railPowered.blockID,railsSpecial2); - orientation2.put(Block.rail.blockID,rails2); + orientation2.put(Blocks.brick_stairs, stairs2); + orientation2.put(Blocks.stone_stairs, stairs2); + orientation2.put(Blocks.nether_brick_stairs, stairs2); + orientation2.put(Blocks.quartz_stairs, stairs2); + orientation2.put(Blocks.sandstone_stairs, stairs2); + orientation2.put(Blocks.stone_brick_stairs, stairs2); + orientation2.put(Blocks.birch_stairs, stairs2); + orientation2.put(Blocks.jungle_stairs, stairs2); + orientation2.put(Blocks.oak_stairs, stairs2); + orientation2.put(Blocks.spruce_stairs, stairs2); + orientation2.put(Blocks.vine, vine2); + orientation2.put(Blocks.trapped_chest, chestsLadders2); + orientation2.put(Blocks.ladder, chestsLadders2); + orientation2.put(Blocks.lever, leverButtonTorch2); + orientation2.put(Blocks.stone_button, leverButtonTorch2); + orientation2.put(Blocks.wooden_button, leverButtonTorch2); + orientation2.put(Blocks.redstone_torch, leverButtonTorch2); + orientation2.put(Blocks.unlit_redstone_torch, leverButtonTorch2); + orientation2.put(Blocks.torch, leverButtonTorch2); + orientation2.put(Blocks.piston,pistonDropperDispenser2); + orientation2.put(Blocks.piston_head,pistonDropperDispenser2); + orientation2.put(Blocks.piston_extension,pistonDropperDispenser2); + orientation2.put(Blocks.sticky_piston,pistonDropperDispenser2); + orientation2.put(Blocks.dropper,pistonDropperDispenser2); + orientation2.put(Blocks.dispenser,pistonDropperDispenser2); + orientation2.put(Blocks.powered_comparator,pistonDropperDispenser2); + orientation2.put(Blocks.unpowered_comparator,pistonDropperDispenser2); + orientation2.put(Blocks.powered_repeater,pistonDropperDispenser2); + orientation2.put(Blocks.unpowered_repeater,pistonDropperDispenser2); + orientation2.put(Blocks.wooden_door,pistonDropperDispenser2); + orientation2.put(Blocks.iron_door,pistonDropperDispenser2); + orientation2.put(Blocks.tripwire_hook,pistonDropperDispenser2); + orientation2.put(Blocks.detector_rail,railsSpecial2); + orientation2.put(Blocks.activator_rail,railsSpecial2); + orientation2.put(Blocks.golden_rail,railsSpecial2); + orientation2.put(Blocks.rail,rails2); this.rotationMappings.put(2, orientation2); this.rotationMappings.put(1, orientation1); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java index 6483afd..014dada 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/ChunkLoaderHelper.java @@ -32,9 +32,9 @@ public class ChunkLoaderHelper implements LoadingCallback int y = ticket.getModData().getInteger("goldDimDoorY"); int z = ticket.getModData().getInteger("goldDimDoorZ"); - if (world.getBlockId(x, y, z) == mod_pocketDim.properties.GoldenDimensionalDoorID) + if (world.getBlock(x, y, z) == mod_pocketDim.goldenDimensionalDoor) { - IChunkLoader loader = (IChunkLoader) world.getBlockTileEntity(x, y, z); + IChunkLoader loader = (IChunkLoader) world.getTileEntity(x, y, z); if (!loader.isInitialized()) { loader.initialize(ticket); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java index 26aa178..f46af21 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/yCoordHelper.java @@ -52,22 +52,17 @@ public class yCoordHelper public static boolean isCoveredBlock(Chunk chunk, int localX, int y, int localZ) { - int blockID; Block block; Material material; if (y < 0) return false; - blockID = chunk.getBlockID(localX, y, localZ); - if (blockID == 0) - return false; - - block = Block.blocksList[blockID]; + block = chunk.getBlock(localX, y, localZ); if (block == null) return false; - material = block.blockMaterial; + material = block.getMaterial(); return (material.isLiquid() || !material.isReplaceable()); } @@ -109,12 +104,11 @@ public class yCoordHelper { for (dz = -1; dz <= 1 && isSafe; dz++) { - blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + block = chunk.getBlock(localX + dx, y, localZ + dz); metadata = chunk.getBlockMetadata(localX + dx, y, localZ + dz); - block = Block.blocksList[blockID]; - if (blockID != 0 && (!block.blockMaterial.isReplaceable() || block.blockMaterial.isLiquid())) + if (!block.isAir(world, x, y, z) && (!block.getMaterial().isReplaceable() || block.getMaterial().isLiquid())) { - if (!block.blockMaterial.isReplaceable() && (!block.isOpaqueCube() || block.hasTileEntity(metadata))) + if (!block.getMaterial().isReplaceable() && (!block.isOpaqueCube() || block.hasTileEntity(metadata))) { isSafe = false; } @@ -170,12 +164,11 @@ public class yCoordHelper { for (dz = -1; dz <= 1 && isSafe; dz++) { - blockID = chunk.getBlockID(localX + dx, y, localZ + dz); + block = chunk.getBlock(localX + dx, y, localZ + dz); metadata = chunk.getBlockMetadata(localX + dx, y, localZ + dz); - block = Block.blocksList[blockID]; - if (blockID != 0 && (!block.blockMaterial.isReplaceable() || block.blockMaterial.isLiquid())) + if (!block.isAir(world,x,y,z) && (!block.getMaterial().isReplaceable() || block.getMaterial().isLiquid())) { - if (!block.blockMaterial.isReplaceable() && (!block.isOpaqueCube() || block.hasTileEntity(metadata))) + if (!block.getMaterial().isReplaceable() && (!block.isOpaqueCube() || block.hasTileEntity(metadata))) { if (layers >= 3) { @@ -247,7 +240,7 @@ public class yCoordHelper { for (dz = -1; dz <= 1; dz++, index++) { - if (chunk.getBlockID(localX + dx, y, localZ + dz) != 0) + if (!chunk.getBlock(localX + dx, y, localZ + dz).isAir(world, x+dx,y,z+dz)) { gaps[index] = 0; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java index b00195c..a7e9268 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java @@ -14,9 +14,9 @@ public class ChunkBlockSetter implements IBlockSetter this.ignoreAir = ignoreAir; } - public void setBlock(World world, int x, int y, int z, int blockID, int metadata) + public void setBlock(World world, int x, int y, int z, Block block, int metadata) { - if ((blockID == 0 && ignoreAir) || (blockID != 0 && Block.blocksList[blockID] == null)) + if (block.isAir(world, x, y, z) && ignoreAir) { return; } @@ -39,7 +39,7 @@ public class ChunkBlockSetter implements IBlockSetter extBlockStorage = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); chunk.getBlockStorageArray()[cY] = extBlockStorage; } - extBlockStorage.setExtBlockID(localX, y & 15, localZ, blockID); + extBlockStorage.setExtBlockID(localX, y & 15, localZ, block); extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata); chunk.setChunkModified(); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java index fe49a78..04fab49 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java @@ -42,7 +42,7 @@ public class WorldCopyOperation extends WorldOperation blockIDs[index] = (short) world.getBlockId(x, y, z); metadata[index] = (byte) world.getBlockMetadata(x, y, z); - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + TileEntity tileEntity = world.getTileEntity(x, y, z); if (tileEntity != null) { //Extract tile entity data diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 279c123..daf20e6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -94,7 +94,7 @@ public class MobMonolith extends EntityFlying implements IMob protected void applyEntityAttributes() { super.applyEntityAttributes(); - this.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth).setAttribute(57005); + this.getAttributeMap().getAttributeInstance(SharedMonsterAttributes.maxHealth).setBaseValue(57005); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java index 1f9b680..0b0b017 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/CustomCaveGen.java @@ -2,7 +2,9 @@ package StevenDimDoors.mod_pocketDim.world; import java.util.Random; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import net.minecraft.block.Block; +import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraft.world.gen.MapGenBase; @@ -21,15 +23,15 @@ public class CustomCaveGen extends MapGenBase /** * Generates a larger initial cave node than usual. Called 25% of the time. */ - protected void generateLargeCaveNode(long par1, int par3, int par4, byte[] par5ArrayOfByte, double par6, double par8, double par10) + protected void generateLargeCaveNode(long par1, int par3, int par4, Block[] blocks, double par6, double par8, double par10) { - this.generateCaveNode(par1, par3, par4, par5ArrayOfByte, par6, par8, par10, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); + this.generateCaveNode(par1, par3, par4, blocks, par6, par8, par10, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D); } /** * Generates a node in the current cave system recursion tree. */ - protected void generateCaveNode(long par1, int par3, int par4, byte[] par5ArrayOfByte, double par6, double par8, double par10, float par12, float par13, float par14, int par15, int par16, double par17) + protected void generateCaveNode(long par1, int par3, int par4, Block[] blocks, double par6, double par8, double par10, float par12, float par13, float par14, int par15, int par16, double par17) { double var19 = par3 * 16 + 8; double var21 = par4 * 16 + 8; @@ -81,8 +83,8 @@ public class CustomCaveGen extends MapGenBase if (!var54 && par15 == var27 && par12 > 1.0F && par16 > 0) { - this.generateCaveNode(var25.nextLong(), par3, par4, par5ArrayOfByte, par6, par8, par10, var25.nextFloat() * 0.5F + 0.5F, par13 - ((float)Math.PI / 2F), par14 / 3.0F, par15, par16, 1.0D); - this.generateCaveNode(var25.nextLong(), par3, par4, par5ArrayOfByte, par6, par8, par10, var25.nextFloat() * 0.5F + 0.5F, par13 + ((float)Math.PI / 2F), par14 / 3.0F, par15, par16, 1.0D); + this.generateCaveNode(var25.nextLong(), par3, par4, blocks, par6, par8, par10, var25.nextFloat() * 0.5F + 0.5F, par13 - ((float)Math.PI / 2F), par14 / 3.0F, par15, par16, 1.0D); + this.generateCaveNode(var25.nextLong(), par3, par4, blocks, par6, par8, par10, var25.nextFloat() * 0.5F + 0.5F, par13 + ((float)Math.PI / 2F), par14 / 3.0F, par15, par16, 1.0D); return; } @@ -151,7 +153,7 @@ public class CustomCaveGen extends MapGenBase if (var44 >= 0 && var44 < 128) { - if (par5ArrayOfByte[var45] == Block.waterMoving.blockID || par5ArrayOfByte[var45] == Block.waterStill.blockID) + if (blocks[var45] == Blocks.flowing_water || blocks[var45] == Blocks.water) { var58 = true; } @@ -185,26 +187,26 @@ public class CustomCaveGen extends MapGenBase if (var51 > -0.7D && var59 * var59 + var51 * var51 + var46 * var46 < 1.0D) { - byte var53 = par5ArrayOfByte[var48]; + Block var53 = blocks[var48]; - if (var53 == Block.grass.blockID) + if (var53 == Blocks.grass) { var49 = true; } - if (var53 == properties.LimboBlockID || var53 == Block.dirt.blockID || var53 == Block.grass.blockID) + if (var53 == mod_pocketDim.blockLimbo || var53 == Blocks.dirt || var53 == Blocks.grass) { if (var50 < 10) { - par5ArrayOfByte[var48] = (byte)Block.lavaMoving.blockID; + blocks[var48] = Blocks.flowing_lava; } else { - par5ArrayOfByte[var48] = 0; + blocks[var48] = Blocks.air; - if (var49 && par5ArrayOfByte[var48 - 1] == Block.dirt.blockID) + if (var49 && blocks[var48 - 1] == Blocks.dirt) { - par5ArrayOfByte[var48 - 1] = this.worldObj.getBiomeGenForCoords(var42 + par3 * 16, var45 + par4 * 16).topBlock; + blocks[var48 - 1] = this.worldObj.getBiomeGenForCoords(var42 + par3 * 16, var45 + par4 * 16).topBlock; } } } @@ -230,7 +232,7 @@ public class CustomCaveGen extends MapGenBase * Recursively called by generate() (generate) and optionally by itself. */ @Override - protected void recursiveGenerate(World par1World, int par2, int par3, int par4, int par5, byte[] par6ArrayOfByte) + protected void func_151538_a(World par1World, int par2, int par3, int par4, int par5, Block[] blocks) { int var7 = this.rand.nextInt(this.rand.nextInt(this.rand.nextInt(40) + 1) + 1); @@ -248,7 +250,7 @@ public class CustomCaveGen extends MapGenBase if (this.rand.nextInt(4) == 0) { - this.generateLargeCaveNode(this.rand.nextLong(), par4, par5, par6ArrayOfByte, var9, var11, var13); + this.generateLargeCaveNode(this.rand.nextLong(), par4, par5, blocks, var9, var11, var13); var15 += this.rand.nextInt(4); } @@ -263,7 +265,7 @@ public class CustomCaveGen extends MapGenBase var19 *= this.rand.nextFloat() * this.rand.nextFloat() * 3.0F + 1.0F; } - this.generateCaveNode(this.rand.nextLong(), par4, par5, par6ArrayOfByte, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D); + this.generateCaveNode(this.rand.nextLong(), par4, par5, blocks, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/DDBiomeGenBase.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/DDBiomeGenBase.java index f6e3428..3bd1b95 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/DDBiomeGenBase.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/DDBiomeGenBase.java @@ -23,7 +23,7 @@ public class DDBiomeGenBase extends BiomeGenBase { for (int k = 0; k < biomes.length; k++) { - if (biomeList[biomes[k]] != null && !(biomeList[biomes[k]] instanceof DDBiomeGenBase)) + if (getBiomeGenArray()[biomes[k]] != null && !(getBiomeGenArray()[biomes[k]] instanceof DDBiomeGenBase)) { // Crash Minecraft to avoid having people complain to us about strange things // that are really the result of silent biome ID conflicts. diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PersonalPocketProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PersonalPocketProvider.java index 8f1b824..6f42518 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PersonalPocketProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PersonalPocketProvider.java @@ -31,7 +31,7 @@ public class PersonalPocketProvider extends PocketProvider public Vec3 getSkyColor(Entity cameraEntity, float partialTicks) { setCloudRenderer( new CloudRenderBlank()); - return this.worldObj.getWorldVec3Pool().getVecFromPool(1,1,1); + return Vec3.createVectorHelper(1,1,1); } public boolean isSurfaceWorld() @@ -61,7 +61,7 @@ public class PersonalPocketProvider extends PocketProvider @Override public Vec3 getFogColor(float par1, float par2) { - return this.worldObj.getWorldVec3Pool().getVecFromPool(1,1,1); + return Vec3.createVectorHelper(1,1,1); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java index 245071e..4a5758d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/fortresses/ComponentNetherGateway.java @@ -2,7 +2,7 @@ package StevenDimDoors.mod_pocketDim.world.fortresses; import java.util.List; import java.util.Random; -import net.minecraft.block.Block; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; @@ -71,75 +71,75 @@ public class ComponentNetherGateway extends StructureComponent int NETHER_SLAB_METADATA = 6; // Set all the blocks in the area of the room to air - this.fillWithBlocks(world, bounds, 0, 2, 0, 6, 6, 6, 0, 0, false); + this.fillWithBlocks(world, bounds, 0, 2, 0, 6, 6, 6, Blocks.air, Blocks.air, false); // Set up the platform under the gateway - this.fillWithBlocks(world, bounds, 0, 0, 0, 6, 1, 6, Block.netherBrick.blockID, Block.netherBrick.blockID, false); + this.fillWithBlocks(world, bounds, 0, 0, 0, 6, 1, 6, Blocks.nether_brick, Blocks.nether_brick, false); // Build the fence at the back of the room - this.fillWithBlocks(world, bounds, 1, 2, 6, 5, 2, 6, Block.netherBrick.blockID, Block.netherBrick.blockID, false); - this.fillWithBlocks(world, bounds, 1, 3, 6, 5, 3, 6, Block.netherFence.blockID, Block.netherFence.blockID, false); + this.fillWithBlocks(world, bounds, 1, 2, 6, 5, 2, 6, Blocks.nether_brick, Blocks.nether_brick, false); + this.fillWithBlocks(world, bounds, 1, 3, 6, 5, 3, 6, Blocks.nether_brick_fence, Blocks.nether_brick_fence, false); // Build the fences at the sides of the room - this.fillWithBlocks(world, bounds, 0, 2, 0, 0, 2, 6, Block.netherBrick.blockID, Block.netherBrick.blockID, false); - this.fillWithBlocks(world, bounds, 0, 3, 0, 0, 3, 6, Block.netherFence.blockID, Block.netherFence.blockID, false); + this.fillWithBlocks(world, bounds, 0, 2, 0, 0, 2, 6, Blocks.nether_brick, Blocks.nether_brick, false); + this.fillWithBlocks(world, bounds, 0, 3, 0, 0, 3, 6, Blocks.nether_brick_fence, Blocks.nether_brick_fence, false); - this.fillWithBlocks(world, bounds, 6, 2, 0, 6, 2, 6, Block.netherBrick.blockID, Block.netherBrick.blockID, false); - this.fillWithBlocks(world, bounds, 6, 3, 0, 6, 3, 6, Block.netherFence.blockID, Block.netherFence.blockID, false); + this.fillWithBlocks(world, bounds, 6, 2, 0, 6, 2, 6, Blocks.nether_brick, Blocks.nether_brick, false); + this.fillWithBlocks(world, bounds, 6, 3, 0, 6, 3, 6, Blocks.nether_brick_fence, Blocks.nether_brick_fence, false); // Build the fence portions closest to the entrance - this.placeBlockAtCurrentPosition(world, Block.netherBrick.blockID, 0, 1, 2, 0, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 1, 3, 0, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick, 0, 1, 2, 0, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 1, 3, 0, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherBrick.blockID, 0, 5, 2, 0, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 5, 3, 0, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick, 0, 5, 2, 0, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 5, 3, 0, bounds); // Build the first layer of the gateway - this.fillWithBlocks(world, bounds, 1, 2, 2, 5, 2, 5, Block.netherBrick.blockID, Block.netherBrick.blockID, false); - this.fillWithMetadataBlocks(world, bounds, 1, 2, 1, 5, 2, 1, Block.stoneSingleSlab.blockID, NETHER_SLAB_METADATA, Block.stoneSingleSlab.blockID, NETHER_SLAB_METADATA, false); + this.fillWithBlocks(world, bounds, 1, 2, 2, 5, 2, 5, Blocks.nether_brick, Blocks.nether_brick, false); + this.fillWithMetadataBlocks(world, bounds, 1, 2, 1, 5, 2, 1, Blocks.stone_slab, NETHER_SLAB_METADATA, Blocks.stone_slab, NETHER_SLAB_METADATA, false); - this.placeBlockAtCurrentPosition(world, Block.stoneSingleSlab.blockID, NETHER_SLAB_METADATA, 1, 2, 2, bounds); - this.placeBlockAtCurrentPosition(world, Block.stoneSingleSlab.blockID, NETHER_SLAB_METADATA, 5, 2, 2, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, NETHER_SLAB_METADATA, 1, 2, 2, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, NETHER_SLAB_METADATA, 5, 2, 2, bounds); // Build the second layer of the gateway - int orientation = this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 2); - this.fillWithBlocks(world, bounds, 2, 3, 3, 2, 3, 4, Block.netherBrick.blockID, Block.netherBrick.blockID, false); - this.fillWithBlocks(world, bounds, 4, 3, 3, 4, 3, 4, Block.netherBrick.blockID, Block.netherBrick.blockID, false); - this.placeBlockAtCurrentPosition(world, Block.netherBrick.blockID, 0, 3, 3, 4, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, orientation, 3, 3, 5, bounds); + int orientation = this.getMetadataWithOffset(Blocks.nether_brick_stairs, 2); + this.fillWithBlocks(world, bounds, 2, 3, 3, 2, 3, 4, Blocks.nether_brick, Blocks.nether_brick, false); + this.fillWithBlocks(world, bounds, 4, 3, 3, 4, 3, 4, Blocks.nether_brick, Blocks.nether_brick, false); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick, 0, 3, 3, 4, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, orientation, 3, 3, 5, bounds); // Build the third layer of the gateway // We add 4 to get the rotated metadata for upside-down stairs // because Minecraft only supports metadata rotations for normal stairs -_- - this.fillWithMetadataBlocks(world, bounds, 2, 4, 4, 4, 4, 4, Block.stairsNetherBrick.blockID, orientation, Block.stairsNetherBrick.blockID, orientation, false); + this.fillWithMetadataBlocks(world, bounds, 2, 4, 4, 4, 4, 4, Blocks.nether_brick_stairs, orientation, Blocks.nether_brick_stairs, orientation, false); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 0) + 4, 2, 4, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 1) + 4, 4, 4, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 0) + 4, 2, 4, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 1) + 4, 4, 4, 3, bounds); // Build the fourth layer of the gateway - this.placeBlockAtCurrentPosition(world, Block.netherBrick.blockID, 0, 3, 5, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick, 0, 3, 5, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherrack.blockID, 0, 2, 5, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 0) + 4, 1, 5, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 3) + 4, 2, 5, 2, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 2) + 4, 2, 5, 4, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.netherrack, 0, 2, 5, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 0) + 4, 1, 5, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 3) + 4, 2, 5, 2, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 2) + 4, 2, 5, 4, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherrack.blockID, 0, 4, 5, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 1) + 4, 5, 5, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 3) + 4, 4, 5, 2, bounds); - this.placeBlockAtCurrentPosition(world, Block.stairsNetherBrick.blockID, this.getMetadataWithOffset(Block.stairsNetherBrick.blockID, 2) + 4, 4, 5, 4, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.netherrack, 0, 4, 5, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 1) + 4, 5, 5, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 3) + 4, 4, 5, 2, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_stairs, this.getMetadataWithOffset(Blocks.nether_brick_stairs, 2) + 4, 4, 5, 4, bounds); // Build the top layer of the gateway - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 3, 6, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 3, 6, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.fire.blockID, 0, 2, 6, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 1, 6, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 2, 6, 2, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 2, 6, 4, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.fire, 0, 2, 6, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 1, 6, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 2, 6, 2, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 2, 6, 4, bounds); - this.placeBlockAtCurrentPosition(world, Block.fire.blockID, 0, 4, 6, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 5, 6, 3, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 4, 6, 2, bounds); - this.placeBlockAtCurrentPosition(world, Block.netherFence.blockID, 0, 4, 6, 4, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.fire, 0, 4, 6, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 5, 6, 3, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 4, 6, 2, bounds); + this.placeBlockAtCurrentPosition(world, Blocks.nether_brick_fence, 0, 4, 6, 4, bounds); // Place the transient door int y = this.getYWithOffset(3); @@ -152,7 +152,7 @@ public class ComponentNetherGateway extends StructureComponent // due to the way Minecraft handles structure generation! if (bounds.isVecInside(x, y, z) && bounds.isVecInside(x, y + 1, z)) { - orientation = this.getMetadataWithOffset(Block.doorWood.blockID, 1); + orientation = this.getMetadataWithOffset(Blocks.wooden_door, 1); dimension = PocketManager.createDimensionData(world); link = dimension.getLink(x, y + 1, z); if (link == null) @@ -166,7 +166,7 @@ public class ComponentNetherGateway extends StructureComponent { for (z = 0; z <= 6; ++z) { - this.fillCurrentPositionBlocksDownwards(world, Block.netherBrick.blockID, 0, x, -1, z, bounds); + this.func_151554_b(world, Blocks.nether_brick, 0, x, -1, z, bounds); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java index 6a3ec04..c9e77e7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayLimbo.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim.world.gateways; +import net.minecraft.block.Block; import net.minecraft.item.ItemDoor; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -18,17 +19,17 @@ public class GatewayLimbo extends BaseGateway @Override public boolean generate(World world, int x, int y, int z) { - int blockID = mod_pocketDim.blockLimbo.blockID; + Block block = mod_pocketDim.blockLimbo; // Build the gateway out of Unraveled Fabric. Since nearly all the blocks in Limbo are of // that type, there is no point replacing the ground. - world.setBlock(x, y + 3, z + 1, blockID, 0, 3); - world.setBlock(x, y + 3, z - 1, blockID, 0, 3); + world.setBlock(x, y + 3, z + 1, block, 0, 3); + world.setBlock(x, y + 3, z - 1, block, 0, 3); // Build the columns around the door - world.setBlock(x, y + 2, z - 1, blockID, 0, 3); - world.setBlock(x, y + 2, z + 1, blockID, 0, 3); - world.setBlock(x, y + 1, z - 1, blockID, 0, 3); - world.setBlock(x, y + 1, z + 1, blockID, 0, 3); + world.setBlock(x, y + 2, z - 1, block, 0, 3); + world.setBlock(x, y + 2, z + 1, block, 0, 3); + world.setBlock(x, y + 1, z - 1, block, 0, 3); + world.setBlock(x, y + 1, z + 1, block, 0, 3); PocketManager.getDimensionData(world).createLink(x, y + 2, z, LinkType.DUNGEON, 0); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java index 13507a4..42d22fa 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayTwoPillars.java @@ -1,6 +1,7 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import net.minecraft.block.Block; +import net.minecraft.init.Blocks; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.config.DDProperties; @@ -16,7 +17,7 @@ public class GatewayTwoPillars extends BaseSchematicGateway @Override protected void generateRandomBits(World world, int x, int y, int z) { - final int blockID = Block.stoneBrick.blockID; + final Block block = Blocks.stonebrick; //Replace some of the ground around the gateway with bricks for (int xc = -GATEWAY_RADIUS; xc <= GATEWAY_RADIUS; xc++) @@ -26,19 +27,19 @@ public class GatewayTwoPillars extends BaseSchematicGateway //Check that the block is supported by an opaque block. //This prevents us from building over a cliff, on the peak of a mountain, //or the surface of the ocean or a frozen lake. - if (world.isBlockOpaqueCube(x + xc, y - 1, z + zc)) + if (world.isBlockNormalCubeDefault(x + xc, y - 1, z + zc, false)) { //Randomly choose whether to place bricks or not. The math is designed so that the //chances of placing a block decrease as we get farther from the gateway's center. if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(2) + 3) { //Place Stone Bricks - world.setBlock(x + xc, y, z + zc, blockID, 0, 3); + world.setBlock(x + xc, y, z + zc, block, 0, 3); } else if (Math.abs(xc) + Math.abs(zc) < world.rand.nextInt(3) + 3) { //Place Cracked Stone Bricks - world.setBlock(x + xc, y, z + zc, blockID, 2, 3); + world.setBlock(x + xc, y, z + zc, block, 2, 3); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index 004e4ce..b6e3608 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -35,14 +35,14 @@ public class ClientProxy extends CommonProxy @Override public void updateDoorTE(BaseDimDoor door, World world, int x, int y, int z) { - TileEntity tile = world.getBlockTileEntity(x, y, z); + TileEntity tile = world.getTileEntity(x, y, z); if (tile instanceof TileEntityDimDoor) { DimLink link = PocketManager.getLink(x, y, z, world); int metadata = world.getBlockMetadata(x, y, z); TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; dimTile.openOrClosed = door.isDoorOnRift(world, x, y, z)&&door.isUpperDoorBlock(metadata); - dimTile.orientation = door.getFullMetadata(world, x, y, z) & 7; + dimTile.orientation = world.getBlockMetadata(x, y, z) & 7; dimTile.lockStatus = door.getLockStatus(world, x, y, z); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java index dc35abd..b87e6c8 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java @@ -29,7 +29,7 @@ public class RenderMobObelisk extends RenderLiving } @Override - public void doRenderLiving(EntityLiving entity, double x, double y, double z, float par8, float par9) + public void doRender(EntityLiving entity, double x, double y, double z, float par8, float par9) { final float minScaling = 0; final float maxScaling = 0.1f; @@ -39,7 +39,7 @@ public class RenderMobObelisk extends RenderLiving float aggroScaling = minScaling + (maxScaling - minScaling) * monolith.getAggroProgress(); // Calculate jitter - include entity ID to give Monoliths individual jitters - float time = ((Minecraft.getSystemTime() + 0xF1234568 * monolith.entityId) % 200000) / 50.0F; + float time = ((Minecraft.getSystemTime() + 0xF1234568 * monolith.getEntityId()) % 200000) / 50.0F; // We use random constants here on purpose just to get different wave forms double xJitter = aggroScaling * Math.sin(1.1f * time) * Math.sin(0.8f * time); double yJitter = aggroScaling * Math.sin(1.2f * time) * Math.sin(0.9f * time); @@ -52,7 +52,7 @@ public class RenderMobObelisk extends RenderLiving public void render(EntityLiving par1EntityLivingBase, double x, double y, double z, float par8, float par9) { - if (MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Pre(par1EntityLivingBase, this))) return; + if (MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Pre(par1EntityLivingBase, this, x, y, z))) return; GL11.glPushMatrix(); GL11.glDisable(GL11.GL_CULL_FACE); GL11.glDisable(GL11.GL_LIGHTING); @@ -104,7 +104,7 @@ public class RenderMobObelisk extends RenderLiving GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(true); GL11.glPopMatrix(); - MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(par1EntityLivingBase, this)); + MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(par1EntityLivingBase, this, x, y, z)); } private static float interpolateRotation(float par1, float par2, float par3) diff --git a/src/main/resources/assets/dimdoors/sounds.json b/src/main/resources/assets/dimdoors/sounds.json new file mode 100644 index 0000000..d676cc3 --- /dev/null +++ b/src/main/resources/assets/dimdoors/sounds.json @@ -0,0 +1,15 @@ +{ + "crack": {"category":"hostile", "sound":[{"name":"crack","stream":false}]}, + "creepy": {"category":"ambient", "sound":[{"name":"creepy","stream":true}]}, + "doorLocked": {"category":"player", "sound":[{"name":"doorLocked","stream":false}]}, + "doorLockRemoved": {"category":"player", "sound":[{"name":"doorLockRemoved","stream":false}]}, + "keyLock": {"category":"player", "sound":[{"name":"keyLock","stream":false}]}, + "keyUnlock": {"category":"player", "sound":[{"name":"keyUnlock", "stream":false}]}, + "monk": {"category":"hostile", "sound":[{"name":"monk", "stream":false}]}, + "rift": {"category":"master", "sound":[{"name":"rift", "stream":false}]}, + "riftClose": {"category":"player", "sound":[{"name":"riftClose", "stream":false}]}, + "riftDoor": {"category":"player", "sound":[{"name":"riftDoor", "stream":false}]}, + "riftEnd": {"category":"player", "sound":[{"name":"riftEnd", "stream":false}]}, + "riftStart": {"category":"player", "sound":[{"name":"riftStart", "stream":false}]}, + "tearing": {"category":"hostile", "sound":[{"name":"tearing", "stream":false}]} +} \ No newline at end of file -- 2.39.5 From 2a5774d4777254cd49b0a55c208bb6a3f8769aa4 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 5 Mar 2015 15:28:37 -0600 Subject: [PATCH 05/58] Updated most of the networking code... a lot of it is probably broken still --- .../mod_pocketDim/ConnectionHandler.java | 34 +++---- .../mod_pocketDim/ServerPacketHandler.java | 92 ++---------------- .../commands/CommandCreateDungeonRift.java | 2 +- .../mod_pocketDim/core/DDTeleporter.java | 11 ++- .../mod_pocketDim/core/PocketManager.java | 18 +--- .../mod_pocketDim/helpers/Compactor.java | 8 +- .../network/ClientJoinPacket.java | 40 ++++++++ .../network/CreateDimensionPacket.java | 50 ++++++++++ .../network/CreateLinkPacket.java | 53 ++++++++++ .../network/DeleteDimensionPacket.java | 50 ++++++++++ .../network/DeleteLinkPacket.java | 51 ++++++++++ .../network/DimDoorsNetwork.java | 97 +++++++++++++++++++ .../mod_pocketDim/network/DimDoorsPacket.java | 19 ++++ .../network/UpdateLinkPacket.java | 49 ++++++++++ .../tileentities/TileEntityDimDoor.java | 4 +- .../tileentities/TileEntityRift.java | 6 +- .../mod_pocketDim/util/Point4D.java | 8 +- .../mod_pocketDim/watcher/ClientDimData.java | 9 +- .../mod_pocketDim/watcher/ClientLinkData.java | 9 +- .../mod_pocketDim/watcher/IUpdateSource.java | 8 -- .../ClientPacketHandler.java | 82 ---------------- 21 files changed, 465 insertions(+), 235 deletions(-) create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/CreateDimensionPacket.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/CreateLinkPacket.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteDimensionPacket.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteLinkPacket.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java create mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/network/UpdateLinkPacket.java delete mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java delete mode 100644 src/main/java/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 2eff1d7..4fc3d1f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -1,15 +1,21 @@ package StevenDimDoors.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.network.DimDoorsNetwork; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent; +import cpw.mods.fml.common.network.FMLNetworkEvent; +import net.minecraft.network.Packet; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import net.minecraftforge.common.network.ForgeMessage; -public class ConnectionHandler implements IConnectionHandler +public class ConnectionHandler { - @Override - public String connectionReceived(NetLoginHandler netHandler, INetworkManager manager) + @SubscribeEvent + public String connectionReceived(FMLNetworkEvent.ServerConnectionFromClientEvent event) { for(NewDimData data : PocketManager.getDimensions()) { @@ -17,8 +23,9 @@ public class ConnectionHandler implements IConnectionHandler { if(data.isPocketDimension()||data.id()==mod_pocketDim.properties.LimboDimensionID) { - Packet250CustomPayload[] pkt = ForgePacket.makePacketSet(new DimensionRegisterPacket(data.id(), DimensionManager.getProviderType(data.id()))); - manager.addToSendQueue(pkt[0]); + DimDoorsNetwork.sendToPlayer( new ForgeMessage.DimensionRegisterMessage(data.id(), DimensionManager.getProviderType(data.id())), ) + Packet pkt = + event.manager.scheduleOutboundPacket(pkt[0]); } } catch(Exception E) @@ -29,14 +36,8 @@ public class ConnectionHandler implements IConnectionHandler return null; } - @Override - public void connectionOpened(NetHandler netClientHandler, String server, int port, INetworkManager manager) { } - - @Override - public void connectionOpened(NetHandler netClientHandler,MinecraftServer server, INetworkManager manager) { } - - @Override - public void connectionClosed(INetworkManager manager) + @SubscribeEvent + public void connectionClosed(FMLNetworkEvent.ClientDisconnectionFromServerEvent event) { if(PocketManager.isConnected) { @@ -44,11 +45,8 @@ public class ConnectionHandler implements IConnectionHandler } } - @Override - public void clientLoggedIn(NetHandler clientHandler, INetworkManager manager, Packet1Login login) { } - - @Override - public void playerLoggedIn(Player player, NetHandler netHandler, INetworkManager manager) + @SubscribeEvent + public void playerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { // Hax... please don't do this! >_< PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.createDimensionDataDangerously(0))); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java index 7ad11f9..fe73160 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ServerPacketHandler.java @@ -4,18 +4,15 @@ import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; +import StevenDimDoors.mod_pocketDim.network.*; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; -import net.minecraft.network.INetworkManager; -import net.minecraft.network.packet.Packet250CustomPayload; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; -import cpw.mods.fml.common.network.IPacketHandler; -import cpw.mods.fml.common.network.PacketDispatcher; -import cpw.mods.fml.common.network.Player; +import net.minecraft.network.Packet; -public class ServerPacketHandler implements IPacketHandler +public class ServerPacketHandler { public ServerPacketHandler() { @@ -23,21 +20,18 @@ public class ServerPacketHandler implements IPacketHandler PocketManager.registerLinkWatcher(new LinkWatcher()); } - @Override - public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) { } - private static class DimWatcher implements IUpdateWatcher { @Override public void onCreated(ClientDimData message) { - sendDimPacket(PacketConstants.CREATE_DIM_PACKET_ID, message); + DimDoorsNetwork.sendToAllPlayers(new CreateDimensionPacket(message)); } @Override public void onDeleted(ClientDimData message) { - sendDimPacket(PacketConstants.DELETE_DIM_PACKET_ID, message); + DimDoorsNetwork.sendToAllPlayers(new DeleteDimensionPacket(message)); } @Override @@ -53,89 +47,19 @@ public class ServerPacketHandler implements IPacketHandler @Override public void onCreated(ClientLinkData message) { - sendLinkPacket(PacketConstants.CREATE_LINK_PACKET_ID, message); + DimDoorsNetwork.sendToAllPlayers(new CreateLinkPacket(message)); } @Override public void onDeleted(ClientLinkData message) { - sendLinkPacket(PacketConstants.DELETE_LINK_PACKET_ID, message); + DimDoorsNetwork.sendToAllPlayers(new DeleteLinkPacket(message)); } @Override public void update(ClientLinkData message) { - sendLinkPacket(PacketConstants.UPDATE_LINK_PACKET_ID, message); - } - } - - public static Packet250CustomPayload createLinkPacket(ClientLinkData data) - { - try - { - Packet250CustomPayload packet = new Packet250CustomPayload(); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - DataOutputStream writer = new DataOutputStream(buffer); - writer.writeByte(PacketConstants.CREATE_LINK_PACKET_ID); - data.write(writer); - writer.close(); - packet.channel = PacketConstants.CHANNEL_NAME; - packet.data = buffer.toByteArray(); - packet.length = packet.data.length; - return packet; - } - catch (IOException e) - { - //This shouldn't happen... - e.printStackTrace(); - return null; - } - - - } - - - private static void sendDimPacket(byte id, ClientDimData data) - { - try - { - Packet250CustomPayload packet = new Packet250CustomPayload(); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - DataOutputStream writer = new DataOutputStream(buffer); - writer.writeByte(id); - data.write(writer); - writer.close(); - packet.channel = PacketConstants.CHANNEL_NAME; - packet.data = buffer.toByteArray(); - packet.length = packet.data.length; - PacketDispatcher.sendPacketToAllPlayers(packet); - } - catch (IOException e) - { - //This shouldn't happen... - e.printStackTrace(); - } - } - - private static void sendLinkPacket(byte id, ClientLinkData message) - { - try - { - Packet250CustomPayload packet = new Packet250CustomPayload(); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - DataOutputStream writer = new DataOutputStream(buffer); - writer.writeByte(id); - message.write(writer); - writer.close(); - packet.channel = PacketConstants.CHANNEL_NAME; - packet.data = buffer.toByteArray(); - packet.length = packet.data.length; - PacketDispatcher.sendPacketToAllPlayers(packet); - } - catch (IOException e) - { - //This shouldn't happen... - e.printStackTrace(); + DimDoorsNetwork.sendToAllPlayers(new UpdateLinkPacket(message)); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index 4fa55a3..8c8d486 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -67,7 +67,7 @@ public class CommandCreateDungeonRift extends DDCommandBase if (PocketBuilder.generateSelectedDungeonPocket(link, mod_pocketDim.properties, result)) { // Create a rift to our selected dungeon and notify the player - sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift.blockID, 0, 3); + sender.worldObj.setBlock(x, y + 1, z, mod_pocketDim.blockRift, 0, 3); sendChat(sender, "Created a rift to \"" + result.schematicName() + "\" dungeon (Dimension ID = " + link.destination().getDimension() + ")."); } else diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 512a3c2..e651fc2 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -14,6 +14,9 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemDoor; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.play.server.S07PacketRespawn; +import net.minecraft.network.play.server.S1DPacketEntityEffect; +import net.minecraft.network.play.server.S1FPacketSetExperience; import net.minecraft.potion.PotionEffect; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; @@ -298,7 +301,7 @@ public class DDTeleporter // Set the new dimension and inform the client that it's moving to a new world. player.dimension = destination.getDimension(); - player.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(player.dimension, (byte)player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), newWorld.getHeight(), player.theItemInWorldManager.getGameType())); + player.playerNetServerHandler.sendPacket(new S07PacketRespawn(player.dimension, player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), player.theItemInWorldManager.getGameType())); // GreyMaria: Used the safe player entity remover before. // This should fix an apparently unreported bug where @@ -321,10 +324,10 @@ public class DDTeleporter for(Object potionEffect : player.getActivePotionEffects()) { PotionEffect effect = (PotionEffect)potionEffect; - player.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(player.entityId, effect)); + player.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(player.getEntityId(), effect)); } - player.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(player.experience, player.experienceTotal, player.experienceLevel)); + player.playerNetServerHandler.sendPacket(new S1FPacketSetExperience(player.experience, player.experienceTotal, player.experienceLevel)); } // Creates sanity by removing the entity from its old location's chunk entity list, if applicable. @@ -384,7 +387,7 @@ public class DDTeleporter newWorld.getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); // Tell Forge we're moving its players so everyone else knows. // Let's try doing this down here in case this is what's killing NEI. - FMLCommonHandler.instance().firePlayerChangedDimensionEvent((EntityPlayer)entity, oldWorld.provider.dimensionId, newWorld.provider.dimensionId); + FMLCommonHandler.instance().firePlayerChangedDimensionEvent((EntityPlayer) entity, oldWorld.provider.dimensionId, newWorld.provider.dimensionId); } DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); return entity; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 209c2fc..7b97f94 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -1,9 +1,6 @@ package StevenDimDoors.mod_pocketDim.core; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -21,7 +18,6 @@ import StevenDimDoors.mod_pocketDim.saving.PackedDimData; import StevenDimDoors.mod_pocketDim.util.Point4D; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; import StevenDimDoors.mod_pocketDim.watcher.UpdateWatcherProxy; import cpw.mods.fml.common.FMLCommonHandler; @@ -508,8 +504,7 @@ public class PocketManager * * @param dimensionID * @param parent - * @param isPocket - * @param isDungeon + * @param type * @return */ private static NewDimData registerDimension(int dimensionID, InnerDimData parent, DimensionType type) @@ -689,12 +684,7 @@ public class PocketManager return linkWatcher.unregisterReceiver(watcher); } - public static void getWatchers(IUpdateSource updateSource) - { - updateSource.registerWatchers(new ClientDimWatcher(), new ClientLinkWatcher()); - } - - public static void writePacket(DataOutputStream output) throws IOException + public static void writePacket(DataOutput output) throws IOException { // Write a very compact description of our dimensions and links to be // sent to a client @@ -716,7 +706,7 @@ public class PocketManager } } - public static void readPacket(DataInputStream input) throws IOException + public static void readPacket(DataInput input) throws IOException { // TODO- figure out why this is getting called so frequently if (isLoaded) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java index a19dc9f..b5dc629 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java @@ -1,8 +1,6 @@ package StevenDimDoors.mod_pocketDim.helpers; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; import java.util.Collection; import java.util.Comparator; import java.util.HashSet; @@ -27,7 +25,7 @@ public class Compactor } } - public static void write(Collection values, DataOutputStream output) throws IOException + public static void write(Collection values, DataOutput output) throws IOException { // SenseiKiwi: Just encode the data straight up for now. I'll implement fancier compression later. output.writeInt(values.size()); @@ -56,7 +54,7 @@ public class Compactor */ } - public static void readDimensions(DataInputStream input, IDimRegistrationCallback callback) throws IOException + public static void readDimensions(DataInput input, IDimRegistrationCallback callback) throws IOException { // Read in the dimensions one by one. Make sure we register root dimensions before // attempting to register the dimensions under them. diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java new file mode 100644 index 0000000..9cbd969 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java @@ -0,0 +1,40 @@ +package StevenDimDoors.mod_pocketDim.network; + +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; + +import java.io.IOException; + +public class ClientJoinPacket extends DimDoorsPacket { + @Override + public void write(ByteArrayDataOutput out) { + try { + PocketManager.writePacket(out); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + @Override + public void read(ByteArrayDataInput in) { + try { + PocketManager.readPacket(in); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + @Override + public void handleClient(World world, EntityPlayer player) { + + } + + @Override + public void handleServer(World world, EntityPlayerMP player) { + + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/CreateDimensionPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/CreateDimensionPacket.java new file mode 100644 index 0000000..c035550 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/CreateDimensionPacket.java @@ -0,0 +1,50 @@ +package StevenDimDoors.mod_pocketDim.network; + +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; + +import java.io.IOException; + +public class CreateDimensionPacket extends DimDoorsPacket { + private ClientDimData dimensionData = null; + + public CreateDimensionPacket() {} + public CreateDimensionPacket(ClientDimData data) { + this.dimensionData = data; + } + + @Override + public void write(ByteArrayDataOutput out) { + if (dimensionData != null) { + try { + dimensionData.write(out); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + @Override + public void read(ByteArrayDataInput in) { + try { + dimensionData = ClientDimData.read(in); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + @Override + public void handleClient(World world, EntityPlayer player) { + PocketManager.getDimwatcher().onCreated(dimensionData); + } + + @Override + public void handleServer(World world, EntityPlayerMP player) { + //Shouldn't be here + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/CreateLinkPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/CreateLinkPacket.java new file mode 100644 index 0000000..2211b33 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/CreateLinkPacket.java @@ -0,0 +1,53 @@ +package StevenDimDoors.mod_pocketDim.network; + +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; + +import java.io.IOException; + +public class CreateLinkPacket extends DimDoorsPacket { + + private ClientLinkData clientLinkData = null; + + public CreateLinkPacket() { + } + + public CreateLinkPacket(ClientLinkData data) { + this.clientLinkData = data; + } + + @Override + public void write(ByteArrayDataOutput out) { + if (clientLinkData != null) { + try { + clientLinkData.write(out); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + @Override + public void read(ByteArrayDataInput in) { + try { + clientLinkData = ClientLinkData.read(in); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + @Override + public void handleClient(World world, EntityPlayer player) { + PocketManager.getLinkWatcher().onCreated(clientLinkData); + } + + @Override + public void handleServer(World world, EntityPlayerMP player) { + //Shouldn't be here + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteDimensionPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteDimensionPacket.java new file mode 100644 index 0000000..d2c9137 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteDimensionPacket.java @@ -0,0 +1,50 @@ +package StevenDimDoors.mod_pocketDim.network; + +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; + +import java.io.IOException; + +public class DeleteDimensionPacket extends DimDoorsPacket { + private ClientDimData dimensionData = null; + + public DeleteDimensionPacket() {} + public DeleteDimensionPacket(ClientDimData dimensionData) { + this.dimensionData = dimensionData; + } + + @Override + public void write(ByteArrayDataOutput out) { + if (dimensionData != null) { + try { + dimensionData.write(out); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + @Override + public void read(ByteArrayDataInput in) { + try { + dimensionData = ClientDimData.read(in); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + @Override + public void handleClient(World world, EntityPlayer player) { + PocketManager.getDimwatcher().onDeleted(dimensionData); + } + + @Override + public void handleServer(World world, EntityPlayerMP player) { + //Shouldn't be here + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteLinkPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteLinkPacket.java new file mode 100644 index 0000000..e3d00cb --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/DeleteLinkPacket.java @@ -0,0 +1,51 @@ +package StevenDimDoors.mod_pocketDim.network; + +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; +import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; + +import java.io.IOException; + +public class DeleteLinkPacket extends DimDoorsPacket { + private ClientLinkData linkData; + + public DeleteLinkPacket() {} + public DeleteLinkPacket(ClientLinkData linkData) { + this.linkData = linkData; + } + + @Override + public void write(ByteArrayDataOutput out) { + if (linkData != null) { + try { + linkData.write(out); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + @Override + public void read(ByteArrayDataInput in) { + try { + linkData = ClientLinkData.read(in); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + @Override + public void handleClient(World world, EntityPlayer player) { + PocketManager.getLinkWatcher().onDeleted(linkData); + } + + @Override + public void handleServer(World world, EntityPlayerMP player) { + //Shouldn't be here + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java new file mode 100644 index 0000000..be8bb7a --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java @@ -0,0 +1,97 @@ +package StevenDimDoors.mod_pocketDim.network; + +import com.google.common.collect.Maps; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.network.FMLEmbeddedChannel; +import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec; +import cpw.mods.fml.common.network.FMLOutboundHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.tileentity.TileEntity; + +import java.util.EnumMap; + +@ChannelHandler.Sharable +public class DimDoorsNetwork extends FMLIndexedMessageToMessageCodec { + + private static final DimDoorsNetwork INSTANCE = new DimDoorsNetwork(); + private static final EnumMap channels = Maps.newEnumMap(Side.class); + + public static void init() { + if (!channels.isEmpty()) + return; + + INSTANCE.addDiscriminator(0, ClientJoinPacket.class); + INSTANCE.addDiscriminator(1, CreateDimensionPacket.class); + INSTANCE.addDiscriminator(2, DeleteDimensionPacket.class); + INSTANCE.addDiscriminator(3, CreateLinkPacket.class); + INSTANCE.addDiscriminator(4, DeleteLinkPacket.class); + INSTANCE.addDiscriminator(5, UpdateLinkPacket.class); + + channels.putAll(NetworkRegistry.INSTANCE.newChannel("ModysseyTeleporters", INSTANCE)); + } + + public void encodeInto(ChannelHandlerContext ctx, DimDoorsPacket msg, ByteBuf target) throws Exception { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + msg.write(out); + target.writeBytes(out.toByteArray()); + } + + @Override + public void decodeInto(ChannelHandlerContext ctx, ByteBuf source, DimDoorsPacket msg) { + ByteArrayDataInput in = ByteStreams.newDataInput(source.array()); + + in.skipBytes(1); + msg.read(in); + + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) + handleClient(msg); + else + handleServer(ctx, msg); + } + + @SideOnly(Side.CLIENT) + private void handleClient(DimDoorsPacket msg) { + msg.handleClient(Minecraft.getMinecraft().theWorld, Minecraft.getMinecraft().thePlayer); + } + + private void handleServer(ChannelHandlerContext ctx, DimDoorsPacket msg) { + EntityPlayerMP player = ((NetHandlerPlayServer)ctx.channel().attr(NetworkRegistry.NET_HANDLER).get()).playerEntity; + msg.handleServer(player.worldObj, player); + } + + public static void sendToAllPlayers(DimDoorsPacket packet) { + channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALL); + channels.get(Side.SERVER).writeAndFlush(packet); + } + + public static void sendToServer(DimDoorsPacket packet) { + channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER); + channels.get(Side.CLIENT).writeAndFlush(packet); + } + + public static void sendToPlayer(DimDoorsPacket packet, EntityPlayer player) { + channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.PLAYER); + channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(player); + channels.get(Side.SERVER).writeAndFlush(packet); + } + + public static void sendToVicinity(DimDoorsPacket packet, TileEntity entity, double distance) { + channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.ALLAROUNDPOINT); + + NetworkRegistry.TargetPoint vicinity = new NetworkRegistry.TargetPoint(entity.getWorldObj().provider.dimensionId, entity.xCoord + 0.5, entity.yCoord + 0.5, entity.zCoord + 0.5, distance); + channels.get(Side.SERVER).attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(vicinity); + channels.get(Side.SERVER).writeAndFlush(packet); + } +} \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java new file mode 100644 index 0000000..a2f7d63 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java @@ -0,0 +1,19 @@ +package StevenDimDoors.mod_pocketDim.network; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; + +public abstract class DimDoorsPacket { + public abstract void write(ByteArrayDataOutput out); + public abstract void read(ByteArrayDataInput in); + + @SideOnly(Side.CLIENT) + public abstract void handleClient(World world, EntityPlayer player); + + public abstract void handleServer(World world, EntityPlayerMP player); +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/UpdateLinkPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/UpdateLinkPacket.java new file mode 100644 index 0000000..6d2eeab --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/UpdateLinkPacket.java @@ -0,0 +1,49 @@ +package StevenDimDoors.mod_pocketDim.network; + +import StevenDimDoors.mod_pocketDim.core.PocketManager; +import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.world.World; + +import java.io.IOException; + +public class UpdateLinkPacket extends DimDoorsPacket { + private ClientLinkData linkData = null; + + public UpdateLinkPacket() {} + public UpdateLinkPacket(ClientLinkData linkData) { + this.linkData = linkData; + } + @Override + public void write(ByteArrayDataOutput out) { + if (linkData != null) { + try { + linkData.write(out); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + @Override + public void read(ByteArrayDataInput in) { + try { + linkData = ClientLinkData.read(in); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + @Override + public void handleClient(World world, EntityPlayer player) { + PocketManager.getLinkWatcher().update(linkData); + } + + @Override + public void handleServer(World world, EntityPlayerMP player) { + //Shouldn't be here + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index ad9d649..07ba56b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -9,10 +9,10 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; +import net.minecraft.network.Packet; - -public class TileEntityDimDoor extends DDTileEntityBase +public class TileEntityDimDoor extends DDTileEntityBase { public boolean openOrClosed; public int orientation; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 2bd9638..8ef949f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -7,6 +7,8 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import StevenDimDoors.mod_pocketDim.ServerPacketHandler; @@ -292,9 +294,9 @@ public class TileEntityRift extends DDTileEntityBase } @Override - public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { - readFromNBT(pkt.data); + readFromNBT(pkt.func_148857_g()); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java b/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java index 2693e63..6824360 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -1,8 +1,6 @@ package StevenDimDoors.mod_pocketDim.util; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; import StevenDimDoors.mod_pocketDim.Point3D; @@ -180,7 +178,7 @@ public final class Point4D implements Comparable return "(" + x + ", " + y + ", " + z + ", " + dimension + ")"; } - public static void write(Point4D point, DataOutputStream stream) throws IOException + public static void write(Point4D point, DataOutput stream) throws IOException { stream.writeBoolean(point != null); if (point != null) @@ -192,7 +190,7 @@ public final class Point4D implements Comparable } } - public static Point4D read(DataInputStream stream) throws IOException + public static Point4D read(DataInput stream) throws IOException { if (stream.readBoolean()) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java index aaf6aef..1a8eb17 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientDimData.java @@ -1,8 +1,7 @@ package StevenDimDoors.mod_pocketDim.watcher; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; + import StevenDimDoors.mod_pocketDim.core.DimensionType; import StevenDimDoors.mod_pocketDim.core.NewDimData; @@ -27,14 +26,14 @@ public class ClientDimData this.type = dimension.type(); } - public void write(DataOutputStream output) throws IOException + public void write(DataOutput output) throws IOException { output.writeInt(ID); output.writeInt(rootID); output.writeInt(type.index); } - public static ClientDimData read(DataInputStream input) throws IOException + public static ClientDimData read(DataInput input) throws IOException { int id = input.readInt(); int rootID = input.readInt(); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java b/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java index c23c137..055cc84 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java @@ -1,8 +1,7 @@ package StevenDimDoors.mod_pocketDim.watcher; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; +import java.io.*; + import StevenDimDoors.mod_pocketDim.core.DDLock; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkType; @@ -36,7 +35,7 @@ public class ClientLinkData } - public void write(DataOutputStream output) throws IOException + public void write(DataOutput output) throws IOException { Point4D.write(point, output); output.writeInt(this.type.index); @@ -50,7 +49,7 @@ public class ClientLinkData } } - public static ClientLinkData read(DataInputStream input) throws IOException + public static ClientLinkData read(DataInput input) throws IOException { Point4D point = Point4D.read(input); LinkType type = LinkType.getLinkTypeFromIndex(input.readInt()); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java b/src/main/java/StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java deleted file mode 100644 index f8dd404..0000000 --- a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/IUpdateSource.java +++ /dev/null @@ -1,8 +0,0 @@ -package StevenDimDoors.mod_pocketDim.watcher; - -import StevenDimDoors.mod_pocketDim.util.Point4D; - -public interface IUpdateSource -{ - public void registerWatchers(IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher); -} diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java deleted file mode 100644 index eda68a4..0000000 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientPacketHandler.java +++ /dev/null @@ -1,82 +0,0 @@ -package StevenDimDoors.mod_pocketDimClient; - -import StevenDimDoors.mod_pocketDim.PacketConstants; -import StevenDimDoors.mod_pocketDim.core.PocketManager; -import StevenDimDoors.mod_pocketDim.util.Point4D; -import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; -import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateSource; -import StevenDimDoors.mod_pocketDim.watcher.IUpdateWatcher; - -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.network.IPacketHandler; -import cpw.mods.fml.common.network.Player; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; - -import net.minecraft.network.INetworkManager; -import net.minecraft.network.packet.Packet250CustomPayload; -import net.minecraft.server.integrated.IntegratedServer; - -public class ClientPacketHandler implements IPacketHandler, IUpdateSource -{ - private IUpdateWatcher linkWatcher; - private IUpdateWatcher dimWatcher; - - public ClientPacketHandler() - { - PocketManager.getWatchers(this); - } - - @Override - public void registerWatchers(IUpdateWatcher dimWatcher, IUpdateWatcher linkWatcher) - { - this.dimWatcher = dimWatcher; - this.linkWatcher = linkWatcher; - } - - @Override - public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) - { - // TODO: Is this even necessary? I'm not convinced we can receive packets from other channels anyway! - if (!packet.channel.equals(PacketConstants.CHANNEL_NAME)) - return; - - //Checking memory connection wasnt working for some reason, but this seems to work fine. - if (FMLCommonHandler.instance().getMinecraftServerInstance() instanceof IntegratedServer) - return; - - try - { - DataInputStream input = new DataInputStream(new ByteArrayInputStream(packet.data)); - byte packetID = input.readByte(); - switch (packetID) - { - case PacketConstants.CLIENT_JOIN_PACKET_ID: - PocketManager.readPacket(input); - break; - case PacketConstants.CREATE_DIM_PACKET_ID: - dimWatcher.onCreated( ClientDimData.read(input) ); - break; - case PacketConstants.CREATE_LINK_PACKET_ID: - linkWatcher.onCreated( ClientLinkData.read(input) ); - break; - case PacketConstants.DELETE_DIM_PACKET_ID: - dimWatcher.onDeleted( ClientDimData.read(input) ); - break; - case PacketConstants.DELETE_LINK_PACKET_ID: - linkWatcher.onDeleted( ClientLinkData.read(input) ); - break; - case PacketConstants.UPDATE_LINK_PACKET_ID: - linkWatcher.update( ClientLinkData.read(input) ); - break; - } - } - catch (Exception e) - { - System.err.println("An exception occurred while processing a data packet:"); - e.printStackTrace(); - } - } -} -- 2.39.5 From 43c606c687c0e9009c3714759d2eff24e199a529 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 5 Mar 2015 15:47:06 -0600 Subject: [PATCH 06/58] Some schematic fixes --- .../experimental/MazeBuilder.java | 2 +- .../dungeon/DungeonSchematic.java | 72 +++++-------------- .../mod_pocketDim/dungeon/ModBlockFilter.java | 18 ++--- .../dungeon/SpecialBlockFinder.java | 35 ++++----- .../schematic/ChunkBlockSetter.java | 2 +- .../schematic/CompoundFilter.java | 6 +- .../mod_pocketDim/schematic/Schematic.java | 4 +- .../schematic/SchematicFilter.java | 8 ++- .../schematic/WorldCopyOperation.java | 13 ++-- .../mod_pocketDim/world/PocketBuilder.java | 2 +- 10 files changed, 65 insertions(+), 97 deletions(-) diff --git a/src/main/java/StevenDimDoors/experimental/MazeBuilder.java b/src/main/java/StevenDimDoors/experimental/MazeBuilder.java index 3069b4a..60455d2 100644 --- a/src/main/java/StevenDimDoors/experimental/MazeBuilder.java +++ b/src/main/java/StevenDimDoors/experimental/MazeBuilder.java @@ -224,7 +224,7 @@ public class MazeBuilder extBlockStorage = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); chunk.getBlockStorageArray()[cY] = extBlockStorage; } - extBlockStorage.setExtBlockID(localX, y & 15, localZ, block); + extBlockStorage.func_150818_a(localX, y & 15, localZ, block); extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata); chunk.setChunkModified(); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 460a9c7..684f44a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -9,6 +9,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Random; import java.util.TreeMap; + +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; @@ -37,15 +39,6 @@ import StevenDimDoors.mod_pocketDim.util.Point4D; public class DungeonSchematic extends Schematic { - private static final short MAX_VANILLA_BLOCK_ID = 173; - private static final short STANDARD_FABRIC_OF_REALITY_ID = 1973; - private static final short STANDARD_ETERNAL_FABRIC_ID = 220; - private static final short STANDARD_WARP_DOOR_ID = 1975; - private static final short STANDARD_DIMENSIONAL_DOOR_ID = 1970; - private static final short STANDARD_TRANSIENT_DOOR_ID = 1979; - - private static final short MONOLITH_SPAWN_MARKER_ID = (short) Block.endPortalFrame.blockID; - private static final short EXIT_DOOR_MARKER_ID = (short) Block.sandStone.blockID; private static final int NETHER_DIMENSION_ID = -1; private int orientation; @@ -53,18 +46,17 @@ public class DungeonSchematic extends Schematic { private ArrayList exitDoorLocations; private ArrayList dimensionalDoorLocations; private ArrayList monolithSpawnLocations; - - private static final short[] MOD_BLOCK_FILTER_EXCEPTIONS = new short[] { - STANDARD_FABRIC_OF_REALITY_ID, - STANDARD_ETERNAL_FABRIC_ID, - STANDARD_WARP_DOOR_ID, - STANDARD_DIMENSIONAL_DOOR_ID, - STANDARD_TRANSIENT_DOOR_ID - }; - + private ArrayList modBlockFilterExceptions; + private DungeonSchematic(Schematic source) { super(source); + modBlockFilterExceptions = new ArrayList(5); + modBlockFilterExceptions.add(mod_pocketDim.blockDimWall); + modBlockFilterExceptions.add(mod_pocketDim.blockDimWallPerm); + modBlockFilterExceptions.add(mod_pocketDim.warpDoor); + modBlockFilterExceptions.add(mod_pocketDim.dimensionalDoor); + modBlockFilterExceptions.add(mod_pocketDim.transientDoor); } public int getOrientation() @@ -109,8 +101,8 @@ public class DungeonSchematic extends Schematic { public void applyImportFilters(DDProperties properties) { //Search for special blocks (warp doors, dim doors, and end portal frames that mark Monolith spawn points) - SpecialBlockFinder finder = new SpecialBlockFinder(STANDARD_WARP_DOOR_ID, STANDARD_DIMENSIONAL_DOOR_ID, - MONOLITH_SPAWN_MARKER_ID, EXIT_DOOR_MARKER_ID); + SpecialBlockFinder finder = new SpecialBlockFinder(mod_pocketDim.warpDoor, mod_pocketDim.dimensionalDoor, + Blocks.end_portal_frame, Blocks.sandstone); applyFilter(finder); //Flip the entrance's orientation to get the dungeon's orientation @@ -123,19 +115,10 @@ public class DungeonSchematic extends Schematic { //Filter out mod blocks except some of our own CompoundFilter standardizer = new CompoundFilter(); - standardizer.addFilter(new ModBlockFilter(MAX_VANILLA_BLOCK_ID, MOD_BLOCK_FILTER_EXCEPTIONS, - (short) properties.FabricBlockID, (byte) 0)); + standardizer.addFilter(new ModBlockFilter(modBlockFilterExceptions, + mod_pocketDim.blockDimWall, (byte) 0)); //Also convert standard DD block IDs to local versions - Map mapping = getAssignedToStandardIDMapping(properties); - - for (Entry entry : mapping.entrySet()) - { - if (entry.getKey() != entry.getValue()) - { - standardizer.addFilter(new ReplacementFilter(entry.getValue(), entry.getKey())); - } - } applyFilter(standardizer); } @@ -144,36 +127,15 @@ public class DungeonSchematic extends Schematic { //Check if some block IDs assigned by Forge differ from our standard IDs //If so, change the IDs to standard values CompoundFilter standardizer = new CompoundFilter(); - Map mapping = getAssignedToStandardIDMapping(properties); - - for (Entry entry : mapping.entrySet()) - { - if (entry.getKey() != entry.getValue()) - { - standardizer.addFilter(new ReplacementFilter(entry.getKey(), entry.getValue())); - } - } //Filter out mod blocks except some of our own //This comes after ID standardization because the mod block filter relies on standardized IDs - standardizer.addFilter(new ModBlockFilter(MAX_VANILLA_BLOCK_ID, MOD_BLOCK_FILTER_EXCEPTIONS, - STANDARD_FABRIC_OF_REALITY_ID, (byte) 0)); + standardizer.addFilter(new ModBlockFilter(modBlockFilterExceptions, + mod_pocketDim.blockDimWall, (byte) 0)); applyFilter(standardizer); } - - private static Map getAssignedToStandardIDMapping(DDProperties properties) - { - //If we ever need this broadly or support other mods, this should be moved to a separate class - TreeMap mapping = new TreeMap(); - mapping.put((short) properties.FabricBlockID, STANDARD_FABRIC_OF_REALITY_ID); - mapping.put((short) properties.PermaFabricBlockID, STANDARD_ETERNAL_FABRIC_ID); - mapping.put((short) properties.WarpDoorID, STANDARD_WARP_DOOR_ID); - mapping.put((short) properties.DimensionalDoorID, STANDARD_DIMENSIONAL_DOOR_ID); - mapping.put((short) properties.TransientDoorID, STANDARD_TRANSIENT_DOOR_ID); - return mapping; - } - + public static DungeonSchematic copyFromWorld(World world, int x, int y, int z, short width, short height, short length, boolean doCompactBounds) { return new DungeonSchematic(Schematic.copyFromWorld(world, x, y, z, width, height, length, doCompactBounds)); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java index 5e3270e..11af89f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/ModBlockFilter.java @@ -3,33 +3,33 @@ package StevenDimDoors.mod_pocketDim.dungeon; import net.minecraft.block.Block; import StevenDimDoors.mod_pocketDim.schematic.SchematicFilter; +import java.util.List; + public class ModBlockFilter extends SchematicFilter { - private short maxVanillaBlockID; - private short[] exceptions; + private List exceptions; private Block replacementBlock; private byte replacementMetadata; - public ModBlockFilter(short maxVanillaBlockID, short[] exceptions, Block replacementBlock, byte replacementMetadata) + public ModBlockFilter(List exceptions, Block replacementBlock, byte replacementMetadata) { super("ModBlockFilter"); - this.maxVanillaBlockID = maxVanillaBlockID; this.exceptions = exceptions; this.replacementBlock = replacementBlock; this.replacementMetadata = replacementMetadata; } @Override - protected boolean applyToBlock(int index, short[] blocks, byte[] metadata) + protected boolean applyToBlock(int index, Block[] blocks, byte[] metadata) { int k; - short currentID = blocks[index]; - if (currentID > maxVanillaBlockID || (currentID != 0 && Block.blocksList[currentID] == null)) + Block current = blocks[index]; + if (!Block.blockRegistry.getNameForObject(current).startsWith("minecraft:")) { //This might be a mod block. Check if an exception exists. - for (k = 0; k < exceptions.length; k++) + for (k = 0; k < exceptions.size(); k++) { - if (currentID == exceptions[k]) + if (current == exceptions.get(k)) { //Exception found, not considered a mod block return false; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java index ff8fffb..3c32e05 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java @@ -5,13 +5,14 @@ import java.util.ArrayList; import StevenDimDoors.mod_pocketDim.Point3D; import StevenDimDoors.mod_pocketDim.schematic.Schematic; import StevenDimDoors.mod_pocketDim.schematic.SchematicFilter; +import net.minecraft.block.Block; public class SpecialBlockFinder extends SchematicFilter { - private short warpDoorID; - private short dimensionalDoorID; - private short monolithSpawnMarkerID; - private short exitMarkerID; + private Block warpDoor; + private Block dimensionalDoor; + private Block monolithSpawnMarker; + private Block exitMarker; private int entranceOrientation; private Schematic schematic; private Point3D entranceDoorLocation; @@ -19,13 +20,13 @@ public class SpecialBlockFinder extends SchematicFilter { private ArrayList dimensionalDoorLocations; private ArrayList monolithSpawnLocations; - public SpecialBlockFinder(short warpDoorID, short dimensionalDoorID, short monolithSpawnMarkerID, short exitMarkerID) + public SpecialBlockFinder(Block warpDoor, Block dimensionalDoor, Block monolithSpawn, Block exitDoor) { super("SpecialBlockFinder"); - this.warpDoorID = warpDoorID; - this.dimensionalDoorID = dimensionalDoorID; - this.monolithSpawnMarkerID = monolithSpawnMarkerID; - this.exitMarkerID = exitMarkerID; + this.warpDoor = warpDoor; + this.dimensionalDoor = dimensionalDoor; + this.monolithSpawnMarker = monolithSpawn; + this.exitMarker = exitDoor; this.entranceDoorLocation = null; this.entranceOrientation = 0; this.exitDoorLocations = new ArrayList(); @@ -55,27 +56,27 @@ public class SpecialBlockFinder extends SchematicFilter { } @Override - protected boolean initialize(Schematic schematic, short[] blocks, byte[] metadata) + protected boolean initialize(Schematic schematic, Block[] blocks, byte[] metadata) { this.schematic = schematic; return true; } @Override - protected boolean applyToBlock(int index, short[] blocks, byte[] metadata) + protected boolean applyToBlock(int index, Block[] blocks, byte[] metadata) { int indexBelow; int indexDoubleBelow; - if (blocks[index] == monolithSpawnMarkerID) + if (blocks[index] == monolithSpawnMarker) { monolithSpawnLocations.add(schematic.calculatePoint(index)); return true; } - if (blocks[index] == dimensionalDoorID) + if (blocks[index] == dimensionalDoor) { indexBelow = schematic.calculateIndexBelow(index); - if (indexBelow >= 0 && blocks[indexBelow] == dimensionalDoorID) + if (indexBelow >= 0 && blocks[indexBelow] == dimensionalDoor) { dimensionalDoorLocations.add(schematic.calculatePoint(index)); return true; @@ -85,13 +86,13 @@ public class SpecialBlockFinder extends SchematicFilter { return false; } } - if (blocks[index] == warpDoorID) + if (blocks[index] == warpDoor) { indexBelow = schematic.calculateIndexBelow(index); - if (indexBelow >= 0 && blocks[indexBelow] == warpDoorID) + if (indexBelow >= 0 && blocks[indexBelow] == warpDoor) { indexDoubleBelow = schematic.calculateIndexBelow(indexBelow); - if (indexDoubleBelow >= 0 && blocks[indexDoubleBelow] == exitMarkerID) + if (indexDoubleBelow >= 0 && blocks[indexDoubleBelow] == exitMarker) { exitDoorLocations.add(schematic.calculatePoint(index)); return true; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java index a7e9268..a98f35d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ChunkBlockSetter.java @@ -39,7 +39,7 @@ public class ChunkBlockSetter implements IBlockSetter extBlockStorage = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); chunk.getBlockStorageArray()[cY] = extBlockStorage; } - extBlockStorage.setExtBlockID(localX, y & 15, localZ, block); + extBlockStorage.func_150818_a(localX, y & 15, localZ, block); extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata); chunk.setChunkModified(); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java index 882faa5..5bae47c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java @@ -1,5 +1,7 @@ package StevenDimDoors.mod_pocketDim.schematic; +import net.minecraft.block.Block; + import java.util.ArrayList; public class CompoundFilter extends SchematicFilter { @@ -18,7 +20,7 @@ public class CompoundFilter extends SchematicFilter { } @Override - protected boolean initialize(Schematic schematic, short[] blocks, byte[] metadata) + protected boolean initialize(Schematic schematic,Block[] blocks, byte[] metadata) { for (SchematicFilter filter : filters) { @@ -44,7 +46,7 @@ public class CompoundFilter extends SchematicFilter { } @Override - protected boolean applyToBlock(int index, short[] blocks, byte[] metadata) + protected boolean applyToBlock(int index, Block[] blocks, byte[] metadata) { for (SchematicFilter filter : filters) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java index b375484..76e815d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java @@ -400,7 +400,7 @@ public class Schematic { count = tileEntities.tagCount(); for (index = 0; index < count; index++) { - NBTTagCompound tileTag = (NBTTagCompound) tileEntities.tagAt(index); + NBTTagCompound tileTag = (NBTTagCompound) tileEntities.getCompoundTagAt(index); //Rewrite its location to be in world coordinates dx = tileTag.getInteger("x") + x; dy = tileTag.getInteger("y") + y; @@ -409,7 +409,7 @@ public class Schematic { tileTag.setInteger("y", dy); tileTag.setInteger("z", dz); //Load the tile entity and put it in the world - world.setBlockTileEntity(dx, dy, dz, TileEntity.createAndLoadEntity(tileTag)); + world.setTileEntity(dx, dy, dz, TileEntity.createAndLoadEntity(tileTag)); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java index 105a28c..491cf77 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java @@ -1,5 +1,7 @@ package StevenDimDoors.mod_pocketDim.schematic; +import net.minecraft.block.Block; + public class SchematicFilter { private String name; @@ -14,7 +16,7 @@ public class SchematicFilter { return name; } - public boolean apply(Schematic schematic, short[] blocks, byte[] metadata) + public boolean apply(Schematic schematic, Block[] blocks, byte[] metadata) { if (!initialize(schematic, blocks, metadata)) return false; @@ -28,12 +30,12 @@ public class SchematicFilter { return finish(); } - protected boolean initialize(Schematic schematic, short[] blocks, byte[] metadata) + protected boolean initialize(Schematic schematic, Block[] blocks, byte[] metadata) { return true; } - protected boolean applyToBlock(int index, short[] blocks, byte[] metadata) + protected boolean applyToBlock(int index, Block[] blocks, byte[] metadata) { return true; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java index 04fab49..0c8220d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/WorldCopyOperation.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim.schematic; +import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; @@ -11,14 +12,14 @@ public class WorldCopyOperation extends WorldOperation private int originY; private int originZ; private int index; - private short[] blockIDs; + private Block[] blocks; private byte[] metadata; private NBTTagList tileEntities; public WorldCopyOperation() { super("WorldCopyOperation"); - blockIDs = null; + blocks = null; metadata = null; tileEntities = null; } @@ -30,7 +31,7 @@ public class WorldCopyOperation extends WorldOperation originX = x; originY = y; originZ = z; - blockIDs = new short[width * height * length]; + blocks = new Block[width * height * length]; metadata = new byte[width * height * length]; tileEntities = new NBTTagList(); return true; @@ -39,7 +40,7 @@ public class WorldCopyOperation extends WorldOperation @Override protected boolean applyToBlock(World world, int x, int y, int z) { - blockIDs[index] = (short) world.getBlockId(x, y, z); + blocks[index] = world.getBlock(x, y, z); metadata[index] = (byte) world.getBlockMetadata(x, y, z); TileEntity tileEntity = world.getTileEntity(x, y, z); @@ -59,9 +60,9 @@ public class WorldCopyOperation extends WorldOperation return true; } - public short[] getBlockIDs() + public Block[] getBlocks() { - return blockIDs; + return blocks; } public byte[] getMetadata() diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index d0b4555..d7f97c9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -547,7 +547,7 @@ public class PocketBuilder extBlockStorage = new ExtendedBlockStorage(cY << 4, !world.provider.hasNoSky); chunk.getBlockStorageArray()[cY] = extBlockStorage; } - extBlockStorage.setExtBlockID(localX, y & 15, localZ, block); + extBlockStorage.func_150818_a(localX, y & 15, localZ, block); extBlockStorage.setExtBlockMetadata(localX, y & 15, localZ, metadata); chunk.setChunkModified(); } -- 2.39.5 From a0cf769bdac39ab6fb2b28d63688992363167fd2 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 5 Mar 2015 15:52:15 -0600 Subject: [PATCH 07/58] More schematic fixes --- .../mod_pocketDim/mod_pocketDim.java | 1 - .../schematic/ReplacementFilter.java | 16 +++++++++------- .../world/gateways/GatewayBlockFilter.java | 18 ++++++++++-------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 3e56941..8ee02a3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -76,7 +76,6 @@ import StevenDimDoors.mod_pocketDim.world.LimboProvider; import StevenDimDoors.mod_pocketDim.world.PersonalPocketProvider; import StevenDimDoors.mod_pocketDim.world.PocketProvider; import StevenDimDoors.mod_pocketDim.world.gateways.GatewayGenerator; -import StevenDimDoors.mod_pocketDimClient.ClientPacketHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java index e55a7db..461c629 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java @@ -1,16 +1,18 @@ package StevenDimDoors.mod_pocketDim.schematic; +import net.minecraft.block.Block; + public class ReplacementFilter extends SchematicFilter { - private short targetBlock; + private Block targetBlock; private byte targetMetadata; private boolean matchMetadata; - private short replacementBlock; + private Block replacementBlock; private byte replacementMetadata; private boolean changeMetadata; - public ReplacementFilter(short targetBlock, byte targetMetadata, short replacementBlock, byte replacementMetadata) + public ReplacementFilter(Block targetBlock, byte targetMetadata, Block replacementBlock, byte replacementMetadata) { super("ReplacementFilter"); this.targetBlock = targetBlock; @@ -21,7 +23,7 @@ public class ReplacementFilter extends SchematicFilter { this.changeMetadata = true; } - public ReplacementFilter(short targetBlock, short replacementBlock, byte replacementMetadata) + public ReplacementFilter(Block targetBlock, Block replacementBlock, byte replacementMetadata) { super("ReplacementFilter"); this.targetBlock = targetBlock; @@ -31,7 +33,7 @@ public class ReplacementFilter extends SchematicFilter { this.changeMetadata = true; } - public ReplacementFilter(short targetBlock, byte targetMetadata, short replacementBlock) + public ReplacementFilter(Block targetBlock, byte targetMetadata, Block replacementBlock) { super("ReplacementFilter"); this.targetBlock = targetBlock; @@ -41,7 +43,7 @@ public class ReplacementFilter extends SchematicFilter { this.changeMetadata = false; } - public ReplacementFilter(short targetBlock, short replacementBlock) + public ReplacementFilter(Block targetBlock, Block replacementBlock) { super("ReplacementFilter"); this.targetBlock = targetBlock; @@ -51,7 +53,7 @@ public class ReplacementFilter extends SchematicFilter { } @Override - protected boolean applyToBlock(int index, short[] blocks, byte[] metadata) + protected boolean applyToBlock(int index, Block[] blocks, byte[] metadata) { if (blocks[index] == targetBlock) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java index 04ee966..70c07ea 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/gateways/GatewayBlockFilter.java @@ -3,8 +3,10 @@ package StevenDimDoors.mod_pocketDim.world.gateways; import java.util.ArrayList; import StevenDimDoors.mod_pocketDim.Point3D; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.schematic.Schematic; import StevenDimDoors.mod_pocketDim.schematic.SchematicFilter; +import net.minecraft.block.Block; public class GatewayBlockFilter extends SchematicFilter { @@ -33,41 +35,41 @@ public class GatewayBlockFilter extends SchematicFilter { } @Override - protected boolean initialize(Schematic schematic, short[] blocks, byte[] metadata) + protected boolean initialize(Schematic schematic, Block[] blocks, byte[] metadata) { this.schematic = schematic; return true; } @Override - protected boolean applyToBlock(int index, short[] blocks, byte[] metadata) + protected boolean applyToBlock(int index, Block[] blocks, byte[] metadata) { int indexBelow; int indexDoubleBelow; - if (blocks[index] == STANDARD_DIMENSIONAL_DOOR_ID) + if (blocks[index] == mod_pocketDim.dimensionalDoor) { indexBelow = schematic.calculateIndexBelow(index); - if (indexBelow >= 0 && blocks[indexBelow] == STANDARD_DIMENSIONAL_DOOR_ID) + if (indexBelow >= 0 && blocks[indexBelow] == mod_pocketDim.dimensionalDoor) { entranceDoorLocation = schematic.calculatePoint(index); entranceOrientation = (metadata[indexBelow] & 3); return true; } } - if (blocks[index] == STANDARD_TRANSIENT_DOOR_ID) + if (blocks[index] == mod_pocketDim.transientDoor) { indexBelow = schematic.calculateIndexBelow(index); - if (indexBelow >= 0 && blocks[indexBelow] == STANDARD_TRANSIENT_DOOR_ID) + if (indexBelow >= 0 && blocks[indexBelow] == mod_pocketDim.transientDoor) { entranceDoorLocation = schematic.calculatePoint(index); entranceOrientation = (metadata[indexBelow] & 3); return true; } } - if (blocks[index] == STANDARD_WARP_DOOR_ID) + if (blocks[index] == mod_pocketDim.warpDoor) { indexBelow = schematic.calculateIndexBelow(index); - if (indexBelow >= 0 && blocks[indexBelow] == STANDARD_WARP_DOOR_ID) + if (indexBelow >= 0 && blocks[indexBelow] == mod_pocketDim.warpDoor) { entranceDoorLocation = schematic.calculatePoint(index); entranceOrientation = (metadata[indexBelow] & 3); -- 2.39.5 From 6457c562a6b52f699477e200b26d50daba3f38f5 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Fri, 6 Mar 2015 20:57:05 -0600 Subject: [PATCH 08/58] Fix schematics & add TE sync --- .../mod_pocketDim/ConnectionHandler.java | 3 +- .../dungeon/DungeonSchematic.java | 8 +- .../mod_pocketDim/network/DimDoorsPacket.java | 1 + .../mod_pocketDim/schematic/Schematic.java | 101 ++++++++++++++---- .../tileentities/TileEntityDimDoor.java | 14 ++- .../tileentities/TileEntityRift.java | 35 +++--- .../mod_pocketDim/util/Point4D.java | 14 +++ .../mod_pocketDim/watcher/ClientLinkData.java | 31 ++++++ src/main/resources/META-INF/MANIFEST.MF | 4 + .../resources/META-INF/accessTransformer.cfg | 1 + 10 files changed, 172 insertions(+), 40 deletions(-) create mode 100644 src/main/resources/META-INF/MANIFEST.MF create mode 100644 src/main/resources/META-INF/accessTransformer.cfg diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 4fc3d1f..f7817cb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -23,8 +23,7 @@ public class ConnectionHandler { if(data.isPocketDimension()||data.id()==mod_pocketDim.properties.LimboDimensionID) { - DimDoorsNetwork.sendToPlayer( new ForgeMessage.DimensionRegisterMessage(data.id(), DimensionManager.getProviderType(data.id())), ) - Packet pkt = + DimDoorsNetwork.sendToPlayer( new ForgeMessage.DimensionRegisterMessage(data.id(), DimensionManager.getProviderType(data.id()))); event.manager.scheduleOutboundPacket(pkt[0]); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 684f44a..a59a5d2 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -166,7 +166,7 @@ public class DungeonSchematic extends Schematic { int index; int count; - int blockID; + Block block; int blockMeta; int dx, dy, dz; Point3D pocketPoint = new Point3D(0, 0, 0); @@ -182,12 +182,12 @@ public class DungeonSchematic extends Schematic { pocketPoint.setX(dx); pocketPoint.setY(dy); pocketPoint.setZ(dz); - blockID = blocks[index]; + block = blocks[index]; BlockRotator.transformPoint(pocketPoint, entranceDoorLocation, turnAngle, pocketCenter); - blockMeta = BlockRotator.transformMetadata(metadata[index], turnAngle, blockID); + blockMeta = BlockRotator.transformMetadata(metadata[index], turnAngle, block); //In the future, we might want to make this more efficient by building whole chunks at a time - blockSetter.setBlock(world, pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), blockID, blockMeta); + blockSetter.setBlock(world, pocketPoint.getX(), pocketPoint.getY(), pocketPoint.getZ(), block, blockMeta); index++; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java index a2f7d63..6a14437 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsPacket.java @@ -6,6 +6,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.Packet; import net.minecraft.world.World; public abstract class DimDoorsPacket { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java index 76e815d..2013b38 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java @@ -6,11 +6,14 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.LinkedList; +import java.util.List; import net.minecraft.block.Block; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; @@ -27,19 +30,30 @@ public class Schematic { protected short height; protected short length; - protected String[] blocks; + protected Block[] blocks; protected byte[] metadata; protected NBTTagList tileEntities; - protected Schematic(short width, short height, short length, String[] blocks, byte[] metadata, NBTTagList tileEntities) + protected Schematic(short width, short height, short length, String[] blockPalette, short[] blockIds, byte[] metadata, NBTTagList tileEntities) { this.width = width; this.height = height; this.length = length; - this.blocks = blocks; this.metadata = metadata; this.tileEntities = tileEntities; + + if (blockPalette != null) + loadBlockList(blockPalette, blockIds); } + + protected Schematic(short width, short height, short length, Block[] blocks, byte[] metadata, NBTTagList tileEntities) { + this.width = width; + this.height = height; + this.length = length; + this.blocks = blocks; + this.metadata = metadata; + this.tileEntities = tileEntities; + } protected Schematic(Schematic source) { @@ -53,6 +67,20 @@ public class Schematic { this.tileEntities = source.tileEntities; } + private void loadBlockList(String[] blockPalette, short[] blockIds) { + this.blocks = new Block[blockIds.length]; + + Block[] blockObjPalette = new Block[blockPalette.length]; + + for (int i = 0; i < blockPalette.length; i++) { + blockObjPalette[i++] = (Block)Block.blockRegistry.getObject(blockPalette[i]); + } + + for (int i = 0; i < blockIds.length; i++) { + this.blocks[i] = blockObjPalette[blockIds[i]]; + } + } + public int calculateIndex(int x, int y, int z) { if (x < 0 || x >= width) @@ -124,9 +152,7 @@ public class Schematic { public static Schematic readFromResource(String resourcePath) throws InvalidSchematicException { - //We need an instance of a class in the mod to retrieve a resource - Schematic empty = new Schematic((short) 0, (short) 0, (short) 0, null, null, null); - InputStream schematicStream = empty.getClass().getResourceAsStream(resourcePath); + InputStream schematicStream = Schematic.class.getResourceAsStream(resourcePath); return readFromStream(schematicStream); } @@ -141,7 +167,8 @@ public class Schematic { byte[] metadata = null; //block metadata byte[] lowBits = null; //first 8 bits of the block IDs byte[] highBits = null; //additional 4 bits of the block IDs - String[] blocks = null; //list of combined block IDs + short[] blockIds = null; //list of combined block IDs + String[] blockPalette = null; NBTTagList tileEntities = null; //storage for tile entities in NBT form NBTTagCompound schematicTag; //the NBT data extracted from the schematic file boolean hasExtendedBlockIDs; //indicates whether the schematic contains extended block IDs @@ -173,6 +200,19 @@ public class Schematic { if (length < 0) throw new InvalidSchematicException("The schematic cannot have a negative length."); + + NBTTagList nbtPalette = schematicTag.getTagList("Palette", 8); + + if (nbtPalette.tagCount() < 1) { + throw new InvalidSchematicException("The schematic must have a valid block palette."); + } + + blockPalette = new String[nbtPalette.tagCount()]; + + for (int i = 0; i < nbtPalette.tagCount(); i++) { + blockPalette[i] = nbtPalette.getStringTagAt(i); + } + //load block info lowBits = schematicTag.getByteArray("Blocks"); highBits = schematicTag.getByteArray("AddBlocks"); @@ -186,7 +226,7 @@ public class Schematic { if (volume > 2 * highBits.length && hasExtendedBlockIDs) throw new InvalidSchematicException("The schematic has extended block IDs for fewer blocks than its dimensions indicate."); - blocks = new String[volume]; + blockIds = new short[volume]; if (hasExtendedBlockIDs) { //Combine the split block IDs into a single value @@ -194,12 +234,12 @@ public class Schematic { int index; for (index = 0; index < pairs; index += 2) { - blocks[index] = (short) (((highBits[index >> 1] & 0x0F) << 8) + (lowBits[index] & 0xFF)); - blocks[index + 1] = (short) (((highBits[index >> 1] & 0xF0) << 4) + (lowBits[index + 1] & 0xFF)); + blockIds[index] = (short) (((highBits[index >> 1] & 0x0F) << 8) + (lowBits[index] & 0xFF)); + blockIds[index + 1] = (short) (((highBits[index >> 1] & 0xF0) << 4) + (lowBits[index + 1] & 0xFF)); } if (index < volume) { - blocks[index] = lowBits[index >> 1]; + blockIds[index] = lowBits[index >> 1]; } } else @@ -207,14 +247,21 @@ public class Schematic { //Copy the blockIDs for (int index = 0; index < volume; index++) { - blocks[index] = (short) (lowBits[index] & 0xFF); + blockIds[index] = (short) (lowBits[index] & 0xFF); } } + for (int i = 0; i < blockIds.length; i++) { + int paletteIndex = blockIds[i]; + if (paletteIndex < 0 || paletteIndex >= blockPalette.length) { + throw new InvalidSchematicException("Block entry referenced a non-existant palette entry."); + } + } + //Get the list of tile entities - tileEntities = schematicTag.getTagList("TileEntities"); + tileEntities = schematicTag.getTagList("TileEntities", 10); - Schematic result = new Schematic(width, height, length, blocks, metadata, tileEntities); + Schematic result = new Schematic(width, height, length, blockPalette, blockIds, metadata, tileEntities); return result; } catch (InvalidSchematicException ex) @@ -266,7 +313,7 @@ public class Schematic { //Short and sweet ^_^ WorldCopyOperation copier = new WorldCopyOperation(); copier.apply(world, x, y, z, width, height, length); - return new Schematic(width, height, length, copier.getBlockIDs(), copier.getMetadata(), copier.getTileEntities()); + return new Schematic(width, height, length, copier.getBlocks(), copier.getMetadata(), copier.getTileEntities()); } private static boolean encodeBlockIDs(short[] blocks, byte[] lowBits, byte[] highBits) @@ -291,6 +338,20 @@ public class Schematic { return hasHighBits; } + private static void reduceToPalette(Block[] blocks, List blockPalette, short[] blockIds) { + for (int i = 0; i < blocks.length; i++) { + String blockName = Block.blockRegistry.getNameForObject(blocks[i]); + int blockIndex = blockPalette.indexOf(blockName); + + if (blockIndex < 0) { + blockIndex = blockPalette.size(); + blockPalette.add(blockName); + } + + blockIds[i] = (short)blockIndex; + } + } + public NBTTagCompound writeToNBT() { return writeToNBT(true); @@ -301,13 +362,13 @@ public class Schematic { return writeToNBT(width, height, length, blocks, metadata, tileEntities, copyTileEntities); } - protected static NBTTagCompound writeToNBT(short width, short height, short length, short[] blocks, byte[] metadata, + protected static NBTTagCompound writeToNBT(short width, short height, short length, Block[] blocks, byte[] metadata, NBTTagList tileEntities, boolean copyTileEntities) { //This is the main storage function. Schematics are really compressed NBT tags, so if we can generate //the tags, most of the work is done. All the other storage functions will rely on this one. - NBTTagCompound schematicTag = new NBTTagCompound("Schematic"); + NBTTagCompound schematicTag = new NBTTagCompound(); schematicTag.setShort("Width", width); schematicTag.setShort("Length", length); @@ -316,9 +377,13 @@ public class Schematic { schematicTag.setTag("Entities", new NBTTagList()); schematicTag.setString("Materials", "Alpha"); + List blockPalette = new LinkedList(); + short[] blockIds = new short[blocks.length]; + reduceToPalette(blocks, blockPalette, blockIds); + byte[] lowBits = new byte[blocks.length]; byte[] highBits = new byte[(blocks.length >> 1) + (blocks.length & 1)]; - boolean hasExtendedIDs = encodeBlockIDs(blocks, lowBits, highBits); + boolean hasExtendedIDs = encodeBlockIDs(blockIds, lowBits, highBits); schematicTag.setByteArray("Blocks", lowBits); schematicTag.setByteArray("Data", metadata); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 07ba56b..8390d43 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim.tileentities; import java.util.Random; +import StevenDimDoors.mod_pocketDim.network.CreateLinkPacket; import net.minecraft.nbt.NBTTagCompound; import StevenDimDoors.mod_pocketDim.ServerPacketHandler; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -9,7 +10,6 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; -import net.minecraft.network.Packet; public class TileEntityDimDoor extends DDTileEntityBase @@ -32,11 +32,21 @@ public class TileEntityDimDoor extends DDTileEntityBase { if(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)!=null) { - return ServerPacketHandler.createLinkPacket(new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj))); + ClientLinkData linkData = new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)); + NBTTagCompound tag = new NBTTagCompound(); + linkData.writeToNBT(tag); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, tag); } return null; } + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound tag = pkt.func_148857_g(); + ClientLinkData linkData = ClientLinkData.readFromNBT(tag); + PocketManager.getLinkWatcher().onCreated(linkData); + } + @Override public void readFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 8ef949f..54eb418 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -3,11 +3,14 @@ package StevenDimDoors.mod_pocketDim.tileentities; import java.util.ArrayList; import java.util.List; import java.util.Random; + +import StevenDimDoors.mod_pocketDim.network.CreateLinkPacket; import net.minecraft.entity.Entity; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; @@ -283,21 +286,25 @@ public class TileEntityRift extends DDTileEntityBase } - @Override - public Packet getDescriptionPacket() - { - if (PocketManager.getLink(xCoord, yCoord, zCoord, worldObj) != null) - { - return ServerPacketHandler.createLinkPacket(new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj))); - } - return null; - } + @Override + public Packet getDescriptionPacket() + { + if(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)!=null) + { + ClientLinkData linkData = new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)); + NBTTagCompound tag = new NBTTagCompound(); + linkData.writeToNBT(tag); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, tag); + } + return null; + } - @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) - { - readFromNBT(pkt.func_148857_g()); - } + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound tag = pkt.func_148857_g(); + ClientLinkData linkData = ClientLinkData.readFromNBT(tag); + PocketManager.getLinkWatcher().onCreated(linkData); + } @Override public float[] getRenderColor(Random rand) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java b/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java index 6824360..30bab3f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/util/Point4D.java @@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim.util; import java.io.*; import StevenDimDoors.mod_pocketDim.Point3D; +import net.minecraft.nbt.NBTTagCompound; public final class Point4D implements Comparable @@ -178,6 +179,15 @@ public final class Point4D implements Comparable return "(" + x + ", " + y + ", " + z + ", " + dimension + ")"; } + public static void writeToNBT(Point4D point, NBTTagCompound tag) { + if (point != null) { + tag.setInteger("X", point.x); + tag.setInteger("Y", point.y); + tag.setInteger("Z", point.z); + tag.setInteger("Dimension", point.dimension); + } + } + public static void write(Point4D point, DataOutput stream) throws IOException { stream.writeBoolean(point != null); @@ -201,4 +211,8 @@ public final class Point4D implements Comparable return null; } } + + public static Point4D readFromNBT(NBTTagCompound tag) { + return new Point4D(tag.getInteger("X"), tag.getInteger("Y"), tag.getInteger("Z"), tag.getInteger("Dimension")); + } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java b/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java index 055cc84..c4e9bbd 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/watcher/ClientLinkData.java @@ -6,6 +6,7 @@ import StevenDimDoors.mod_pocketDim.core.DDLock; import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.LinkType; import StevenDimDoors.mod_pocketDim.util.Point4D; +import net.minecraft.nbt.NBTTagCompound; public class ClientLinkData { @@ -49,6 +50,23 @@ public class ClientLinkData } } + public void writeToNBT(NBTTagCompound tag) { + tag.setInteger("Type", this.type.index); + + if (this.lock != null) { + NBTTagCompound lock = new NBTTagCompound(); + lock.setBoolean("State", this.lock.getLockState()); + lock.setInteger("Key", this.lock.getLockKey()); + tag.setTag("Lock", lock); + } + + if (this.point != null) { + NBTTagCompound point = new NBTTagCompound(); + Point4D.writeToNBT(this.point, point); + tag.setTag("Point", point); + } + } + public static ClientLinkData read(DataInput input) throws IOException { Point4D point = Point4D.read(input); @@ -60,4 +78,17 @@ public class ClientLinkData } return new ClientLinkData(point, type, lock); } + + public static ClientLinkData readFromNBT(NBTTagCompound tag) { + LinkType type = LinkType.getLinkTypeFromIndex(tag.getInteger("Type")); + Point4D point = null; + if (tag.hasKey("Point")) + point = Point4D.readFromNBT(tag.getCompoundTag("Point")); + DDLock lock = null; + if (tag.hasKey("Lock")) { + NBTTagCompound lockTag = tag.getCompoundTag("Lock"); + lock = new DDLock(lockTag.getBoolean("State"),lockTag.getInteger("Key")); + } + return new ClientLinkData(point, type, lock); + } } diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..e4056bc --- /dev/null +++ b/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Ant-Version: Apache Ant 1.8.3 +Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.) +FMLAT: accessTransformer.cfg diff --git a/src/main/resources/META-INF/accessTransformer.cfg b/src/main/resources/META-INF/accessTransformer.cfg new file mode 100644 index 0000000..6a6d483 --- /dev/null +++ b/src/main/resources/META-INF/accessTransformer.cfg @@ -0,0 +1 @@ +public net.minecraft.block.Block field_149781_w # Block resistance -- 2.39.5 From 89f256af0979fdd94eeb17f7ca715ae0e28ad4d9 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Fri, 6 Mar 2015 21:05:43 -0600 Subject: [PATCH 09/58] Need to actally update this build script. --- build.gradle | 52 ++++++++++++++----------- src/main/resources/META-INF/MANIFEST.MF | 4 -- 2 files changed, 30 insertions(+), 26 deletions(-) delete mode 100644 src/main/resources/META-INF/MANIFEST.MF diff --git a/build.gradle b/build.gradle index 1555934..e7e528c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,45 +5,53 @@ buildscript { name = "forge" url = "http://files.minecraftforge.net/maven" } + maven { + name = "sonatype" + url = "https://oss.sonatype.org/content/repositories/snapshots/" + } } dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT' + classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' } } - apply plugin: 'forge' -version = "2.2.4-" + System.getenv("BUILD_NUMBER") +version = "2.2.5-" + System.getenv("BUILD_NUMBER") group = "com.stevenrs11.dimdoors" // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = "DimensionalDoors" minecraft { - version = "1.6.4-9.11.1.964" - - replaceIn "mod_pocketDim.java" - replace "@VERSION@", project.version + version = "1.7.10-10.13.2.1307-1.7.10" + runDir = "eclipse" } targetCompatibility = '1.6' sourceCompatibility = '1.6' processResources -{ - // Replace stuff $version and $mcversion in mcmod.info - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - - // Replace version and mcversion - expand 'version':project.version, 'mcversion':project.minecraft.version - } - - // Copy everything else - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' - } -} + { + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else, thats not the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } + } + jar { - destinationDir = new File("build/dist/") + manifest { + attributes 'FMLAT': 'accessTransformer.cfg' + } } diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF deleted file mode 100644 index e4056bc..0000000 --- a/src/main/resources/META-INF/MANIFEST.MF +++ /dev/null @@ -1,4 +0,0 @@ -Manifest-Version: 1.0 -Ant-Version: Apache Ant 1.8.3 -Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.) -FMLAT: accessTransformer.cfg -- 2.39.5 From db92637ea3f2005267edec77574bf8c1a8ce7be9 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Sat, 7 Mar 2015 01:34:17 -0600 Subject: [PATCH 10/58] Finally got the AT working --- build.gradle | 2 +- .../mod_pocketDim/tileentities/TileEntityDimDoor.java | 3 +++ .../META-INF/{accessTransformer.cfg => DimDoors_at.cfg} | 0 3 files changed, 4 insertions(+), 1 deletion(-) rename src/main/resources/META-INF/{accessTransformer.cfg => DimDoors_at.cfg} (100%) diff --git a/build.gradle b/build.gradle index e7e528c..6de83ba 100644 --- a/build.gradle +++ b/build.gradle @@ -52,6 +52,6 @@ processResources jar { manifest { - attributes 'FMLAT': 'accessTransformer.cfg' + attributes 'FMLAT': 'DimDoors_at.cfg' } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index 8390d43..d280066 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -10,6 +10,9 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; public class TileEntityDimDoor extends DDTileEntityBase diff --git a/src/main/resources/META-INF/accessTransformer.cfg b/src/main/resources/META-INF/DimDoors_at.cfg similarity index 100% rename from src/main/resources/META-INF/accessTransformer.cfg rename to src/main/resources/META-INF/DimDoors_at.cfg -- 2.39.5 From f78fadd8a8501dcbd983a220d805296224fa8435 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Sat, 7 Mar 2015 01:45:12 -0600 Subject: [PATCH 11/58] I think this is how you use forgemessages(???) --- .../java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index f7817cb..de0eb0d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -23,8 +23,7 @@ public class ConnectionHandler { if(data.isPocketDimension()||data.id()==mod_pocketDim.properties.LimboDimensionID) { - DimDoorsNetwork.sendToPlayer( new ForgeMessage.DimensionRegisterMessage(data.id(), DimensionManager.getProviderType(data.id()))); - event.manager.scheduleOutboundPacket(pkt[0]); + event.manager.channel().writeAndFlush(new ForgeMessage.DimensionRegisterMessage(data.id(), DimensionManager.getProviderType(data.id()))); } } catch(Exception E) -- 2.39.5 From 5ef42b6bd31ca24f92973e0e3848fa68f617986b Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Sat, 7 Mar 2015 01:49:46 -0600 Subject: [PATCH 12/58] Apparently biome 149 is taken by minecraft --- .../java/StevenDimDoors/mod_pocketDim/config/DDProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index c448e2b..949ee8e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -182,7 +182,7 @@ public class DDProperties "drop World Thread when it destroys a block. The default chance is 50.").getInt(); LimboBiomeID = config.get(CATEGORY_BIOME, "Limbo Biome ID", 148).getInt(); - PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 149).getInt(); + PocketBiomeID = config.get(CATEGORY_BIOME, "Pocket Biome ID", 147).getInt(); config.save(); } -- 2.39.5 From 22654722b6a7c050c41dd1b791539074c12370e8 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Sat, 7 Mar 2015 02:20:06 -0600 Subject: [PATCH 13/58] Turns out items have to be registered now & other spot fixes --- .../mod_pocketDim/EventHookContainer.java | 3 +++ .../mod_pocketDim/mod_pocketDim.java | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index b0bcbc1..d2875db 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -145,6 +145,9 @@ public class EventHookContainer PocketManager.load(); } + if (FMLClientHandler.instance().getClient().thePlayer == null) + return; + if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID && !Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(limboMusic)) { Minecraft.getMinecraft().getSoundHandler().playSound(limboMusic); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 8ee02a3..4758fe1 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -247,6 +247,20 @@ public class mod_pocketDim GameRegistry.registerBlock(transTrapdoor,"Transdimensional Trapdoor"); GameRegistry.registerBlock(blockDimWallPerm, "Fabric of RealityPerm"); GameRegistry.registerBlock(transientDoor, "transientDoor"); + GameRegistry.registerItem(itemDDKey, "Rift Key"); + GameRegistry.registerItem(itemQuartzDoor, "Quartz Door Item"); + GameRegistry.registerItem(itemPersonalDoor, "Personal Dimensional Door Item"); + GameRegistry.registerItem(itemGoldenDoor, "Golden Door Item"); + GameRegistry.registerItem(itemGoldenDimensionalDoor, "Golden Dimensional Door Item"); + GameRegistry.registerItem(itemDimensionalDoor, "Dimensional Door Item"); + GameRegistry.registerItem(itemWarpDoor, "Warp Door Item"); + GameRegistry.registerItem(itemRiftSignature, "Rift Signature"); + GameRegistry.registerItem(itemRiftRemover, "Rift Remover"); + GameRegistry.registerItem(itemStableFabric, "Stable Fabric Item"); + GameRegistry.registerItem(itemUnstableDoor, "Unstable Door Item"); + GameRegistry.registerItem(itemRiftBlade, "Rift Blade"); + GameRegistry.registerItem(itemStabilizedRiftSignature, "Stabilized Rift Signature"); + GameRegistry.registerItem(itemWorldThread, "World Thread"); GameRegistry.registerBlock(blockDimWall, ItemBlockDimWall.class, "Fabric of Reality"); -- 2.39.5 From 4d26a2ec31544c15e53b19e87621265020f952bc Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Sun, 8 Mar 2015 17:46:42 -0500 Subject: [PATCH 14/58] Initial rendering fix for rifts --- .../mod_pocketDim/blocks/BlockRift.java | 15 +- .../mod_pocketDim/mod_pocketDim.java | 12 +- .../tileentities/TileEntityRift.java | 19 +- .../mod_pocketDimClient/ClientProxy.java | 2 - .../mod_pocketDimClient/GoggleRiftFX.java | 312 +++++++++--------- 5 files changed, 184 insertions(+), 176 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java index 8be2c45..1409227 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockRift.java @@ -53,7 +53,7 @@ public class BlockRift extends Block implements ITileEntityProvider private final ArrayList blocksImmuneToRift; // List of Vanilla blocks immune to rifts private final ArrayList modBlocksImmuneToRift; // List of DD blocks immune to rifts - public BlockRift(int j, Material par2Material, DDProperties properties) + public BlockRift(Material par2Material, DDProperties properties) { super(par2Material); this.setTickRandomly(true); @@ -131,11 +131,7 @@ public class BlockRift extends Block implements ITileEntityProvider public int getRenderType() { // This doesn't do anything yet - if (mod_pocketDim.isPlayerWearingGoogles) - { - return 0; - } - return 8; + return 0; } /** @@ -320,12 +316,11 @@ public class BlockRift extends Block implements ITileEntityProvider TileEntityRift tile = (TileEntityRift)world.getTileEntity(x, y, z); - if(rand.nextBoolean()) - { + //renders an extra little blob on top of the actual rift location so its easier to find. Eventually will only render if the player has the goggles. FMLClientHandler.instance().getClient().effectRenderer.addEffect(new GoggleRiftFX(world,x+.5, y+.5, z+.5, rand.nextGaussian() * 0.01D, rand.nextGaussian() * 0.01D, rand.nextGaussian() * 0.01D, FMLClientHandler.instance().getClient().effectRenderer)); - } - if(tile.shouldClose) + + if(tile.shouldClose) { //renders an opposite color effect if it is being closed by the rift remover FMLClientHandler.instance().getClient().effectRenderer.addEffect(new ClosingRiftFX(world,x+.5, y+.5, z+.5, rand.nextGaussian() * 0.01D, rand.nextGaussian() * 0.01D, rand.nextGaussian() * 0.01D, FMLClientHandler.instance().getClient().effectRenderer)); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 4758fe1..358c98a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -140,8 +140,6 @@ public class mod_pocketDim public static BiomeGenBase limboBiome; public static BiomeGenBase pocketBiome; - public static boolean isPlayerWearingGoogles = false; - public static DDProperties properties; public static DDWorldProperties worldProperties; public static CustomLimboPopulator spawner; //Added this field temporarily. Will be refactored out later. @@ -206,7 +204,7 @@ public class mod_pocketDim blockDimWall = new BlockDimWall(0, Material.iron).setLightLevel(1.0F).setHardness(0.1F).setBlockName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(0, Material.iron)).setLightLevel(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setBlockName("blockDimWallPerm"); warpDoor = new WarpDoor(Material.wood, properties).setHardness(1.0F) .setBlockName("dimDoorWarp"); - blockRift = (BlockRift) (new BlockRift(0, Material.air, properties).setHardness(1.0F) .setBlockName("rift")); + blockRift = (BlockRift) (new BlockRift(Material.fire, properties).setHardness(1.0F) .setBlockName("rift")); blockLimbo = new BlockLimbo(15, Material.iron, properties.LimboDimensionID, limboDecay).setHardness(.2F).setBlockName("BlockLimbo").setLightLevel(.0F); unstableDoor = (new UnstableDoor(Material.iron, properties).setHardness(.2F).setBlockName("chaosDoor").setLightLevel(.0F) ); dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setBlockName("dimDoor")); @@ -310,10 +308,10 @@ public class mod_pocketDim LanguageRegistry.instance().addStringLocalization("itemGroup.dimDoorsCustomTab", "en_US", "Dimensional Doors Items"); - GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor"); - GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift"); - GameRegistry.registerTileEntity(TileEntityTransTrapdoor.class, "TileEntityDimHatch"); - GameRegistry.registerTileEntity(TileEntityDimDoorGold.class, "TileEntityDimDoorGold"); + GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor"); + GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift"); + GameRegistry.registerTileEntity(TileEntityTransTrapdoor.class, "TileEntityDimHatch"); + GameRegistry.registerTileEntity(TileEntityDimDoorGold.class, "TileEntityDimDoorGold"); EntityRegistry.registerModEntity(MobMonolith.class, "Monolith", properties.MonolithEntityID, this, 70, 1, true); EntityList.IDtoClassMapping.put(properties.MonolithEntityID, MobMonolith.class); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 54eb418..54b1fc0 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -289,21 +289,30 @@ public class TileEntityRift extends DDTileEntityBase @Override public Packet getDescriptionPacket() { + NBTTagCompound tag = new NBTTagCompound(); + writeToNBT(tag); + if(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)!=null) { ClientLinkData linkData = new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)); - NBTTagCompound tag = new NBTTagCompound(); + + NBTTagCompound link = new NBTTagCompound(); linkData.writeToNBT(tag); - return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, tag); + + tag.setTag("Link", link); } - return null; + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, tag); } @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { NBTTagCompound tag = pkt.func_148857_g(); - ClientLinkData linkData = ClientLinkData.readFromNBT(tag); - PocketManager.getLinkWatcher().onCreated(linkData); + readFromNBT(tag); + + if (tag.hasKey("Link")) { + ClientLinkData linkData = ClientLinkData.readFromNBT(tag.getCompoundTag("Link")); + PocketManager.getLinkWatcher().onCreated(linkData); + } } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index b6e3608..feefd27 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -23,8 +23,6 @@ public class ClientProxy extends CommonProxy //MinecraftForgeClient.preloadTexture(BLOCK_PNG); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDimDoor.class, new RenderDimDoor()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTransTrapdoor.class, new RenderTransTrapdoor()); - //This code activates the new rift rendering, as well as a bit of code in TileEntityRift - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRift.class, new RenderRift()); //MinecraftForgeClient.preloadTexture(RIFT2_PNG); RenderingRegistry.registerEntityRenderingHandler(MobMonolith.class, new RenderMobObelisk(.5F)); diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java index 9845af8..a0a2f4f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/GoggleRiftFX.java @@ -12,180 +12,188 @@ import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GoggleRiftFX extends EntityFireworkSparkFX { - private int field_92049_a = 160; - private boolean field_92054_ax; - private boolean field_92048_ay; - private final EffectRenderer field_92047_az; - private float field_92050_aA; - private float field_92051_aB; - private float field_92052_aC; - private boolean field_92053_aD; + private int field_92049_a = 160; + private boolean field_92054_ax; + private boolean field_92048_ay; + private final EffectRenderer field_92047_az; + private float field_92050_aA; + private float field_92051_aB; + private float field_92052_aC; + private boolean field_92053_aD; - public GoggleRiftFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, EffectRenderer par14EffectRenderer) - { + public GoggleRiftFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, EffectRenderer par14EffectRenderer) + { - super(par1World, par2, par4, par6, par12, par12, par12, par14EffectRenderer); - this.motionX = par8; - this.motionY = par10; - this.motionZ = par12; - this.field_92047_az = par14EffectRenderer; - this.particleScale *= .55F; - this.particleMaxAge = 30 + this.rand.nextInt(16); - this.noClip = true; - } - @Override - public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - if (!this.field_92048_ay || this.particleAge < this.particleMaxAge / 3 || (this.particleAge + this.particleMaxAge) / 3 % 2 == 0) - { - this.doRenderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); - } - } + super(par1World, par2, par4, par6, par12, par12, par12, par14EffectRenderer); + this.motionX = par8; + this.motionY = par10; + this.motionZ = par12; + this.field_92047_az = par14EffectRenderer; + this.particleScale *= 0.75F; + this.particleMaxAge = 40 + this.rand.nextInt(26); + this.noClip = true; + } - public void doRenderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) - { - float var8 = super.particleTextureIndexX % 16 / 16.0F; - float var9 = var8 + 0.0624375F; - float var10 = this.particleTextureIndexX / 16 / 16.0F; - float var11 = var10 + 0.0624375F; - float var12 = 0.1F * this.particleScale; - float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * par2 - interpPosX); - float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * par2 - interpPosY); - float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * par2 - interpPosZ); - float var16 = .0F; + public void func_92045_e(boolean par1) + { + this.field_92054_ax = par1; + } - if (PocketManager.createDimensionData(worldObj).isPocketDimension()) - { - var16 = .7F; - } + public void func_92043_f(boolean par1) + { + this.field_92048_ay = par1; + } - par1Tessellator.setColorRGBA_F(this.particleRed * var16, this.particleGreen * var16, this.particleBlue * var16, (float) .7); + public void func_92044_a(int par1) + { + float var2 = ((par1 & 16711680) >> 16) / 255.0F; + float var3 = ((par1 & 65280) >> 8) / 255.0F; + float var4 = ((par1 & 255) >> 0) / 255.0F; + float var5 = 1.0F; + this.setRBGColorF(var2 * var5, var3 * var5, var4 * var5); + } - par1Tessellator.addVertexWithUV(var13 - par3 * var12 - par6 * var12, var14 - par4 * var12, var15 - par5 * var12 - par7 * var12, var9, var11); - par1Tessellator.addVertexWithUV(var13 - par3 * var12 + par6 * var12, var14 + par4 * var12, var15 - par5 * var12 + par7 * var12, var9, var10); - par1Tessellator.addVertexWithUV(var13 + par3 * var12 + par6 * var12, var14 + par4 * var12, var15 + par5 * var12 + par7 * var12, var8, var10); - par1Tessellator.addVertexWithUV(var13 + par3 * var12 - par6 * var12, var14 - par4 * var12, var15 + par5 * var12 - par7 * var12, var8, var11); - } + public void func_92046_g(int par1) + { + this.field_92050_aA = ((par1 & 16711680) >> 16) / 255.0F; + this.field_92051_aB = ((par1 & 65280) >> 8) / 255.0F; + this.field_92052_aC = ((par1 & 255) >> 0) / 255.0F; + this.field_92053_aD = true; + } + + /** + * returns the bounding box for this entity + */ + @Override + public AxisAlignedBB getBoundingBox() + { + return null; + } + + /** + * Returns true if this entity should push and be pushed by other entities when colliding. + */ + @Override + public boolean canBePushed() + { + return false; + } + + @Override + public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + if (!this.field_92048_ay || this.particleAge < this.particleMaxAge / 3 || (this.particleAge + this.particleMaxAge) / 3 % 2 == 0) + { - public void func_92045_e(boolean par1) - { - this.field_92054_ax = par1; - } + this.doRenderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7); + } + } - public void func_92043_f(boolean par1) - { - this.field_92048_ay = par1; - } + public void doRenderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) + { + float f6 = this.particleTextureIndexX / 16.0F; + float f7 = f6 + 0.0624375F; + float f8 = this.particleTextureIndexY / 16.0F; + float f9 = f8 + 0.0624375F; + float f10 = 0.1F * this.particleScale; - public void func_92044_a(int par1) - { - float var2 = ((par1 & 16711680) >> 16) / 255.0F; - float var3 = ((par1 & 65280) >> 8) / 255.0F; - float var4 = ((par1 & 255) >> 0) / 255.0F; - float var5 = 1.0F; - this.setRBGColorF(var2 * var5, var3 * var5, var4 * var5); - } + if (this.particleIcon != null) + { + f6 = this.particleIcon.getMinU(); + f7 = this.particleIcon.getMaxU(); + f8 = this.particleIcon.getMinV(); + f9 = this.particleIcon.getMaxV(); + } - public void func_92046_g(int par1) - { - this.field_92050_aA = ((par1 & 16711680) >> 16) / 255.0F; - this.field_92051_aB = ((par1 & 65280) >> 8) / 255.0F; - this.field_92052_aC = ((par1 & 255) >> 0) / 255.0F; - this.field_92053_aD = true; - } + float f11 = (float)(this.prevPosX + (this.posX - this.prevPosX) * par2 - interpPosX); + float f12 = (float)(this.prevPosY + (this.posY - this.prevPosY) * par2 - interpPosY); + float f13 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * par2 - interpPosZ); + float f14 = 0F; - /** - * returns the bounding box for this entity - */ - @Override - public AxisAlignedBB getBoundingBox() - { - return null; - } + if (PocketManager.createDimensionData(worldObj).isPocketDimension()) + { + f14 = 0.7F; + } - /** - * Returns true if this entity should push and be pushed by other entities when colliding. - */ - @Override - public boolean canBePushed() - { - return false; - } + par1Tessellator.setColorRGBA_F(this.particleRed * f14, this.particleGreen * f14, this.particleBlue * f14, (float) .7); + par1Tessellator.addVertexWithUV(f11 - par3 * f10 - par6 * f10, f12 - par4 * f10, f13 - par5 * f10 - par7 * f10, f7, f9); + par1Tessellator.addVertexWithUV(f11 - par3 * f10 + par6 * f10, f12 + par4 * f10, f13 - par5 * f10 + par7 * f10, f7, f8); + par1Tessellator.addVertexWithUV(f11 + par3 * f10 + par6 * f10, f12 + par4 * f10, f13 + par5 * f10 + par7 * f10, f6, f8); + par1Tessellator.addVertexWithUV(f11 + par3 * f10 - par6 * f10, f12 - par4 * f10, f13 + par5 * f10 - par7 * f10, f6, f9); + } + /** + * Called to update the entity's position/logic. + */ + @Override + public void onUpdate() + { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if (this.particleAge++ >= this.particleMaxAge) + { + this.setDead(); + } - /** - * Called to update the entity's position/logic. - */ - @Override - public void onUpdate() - { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; + if (this.particleAge > this.particleMaxAge / 2) + { + this.setAlphaF(1.0F - ((float)this.particleAge - (float)(this.particleMaxAge / 2)) / this.particleMaxAge); - if (this.particleAge++ >= this.particleMaxAge) - { - this.setDead(); - } + if (this.field_92053_aD) + { + this.particleRed += (this.field_92050_aA - this.particleRed) * 0.2F; + this.particleGreen += (this.field_92051_aB - this.particleGreen) * 0.2F; + this.particleBlue += (this.field_92052_aC - this.particleBlue) * 0.2F; + } + } - if (this.particleAge > this.particleMaxAge / 2) - { - this.setAlphaF(1.0F - ((float)this.particleAge - (float)(this.particleMaxAge / 2)) / this.particleMaxAge); + this.setParticleTextureIndex(this.field_92049_a + (7 - this.particleAge * 8 / this.particleMaxAge)); + // this.motionY -= 0.004D; + this.moveEntity(this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9100000262260437D; + this.motionY *= 0.9100000262260437D; + this.motionZ *= 0.9100000262260437D; - if (this.field_92053_aD) - { - this.particleRed += (this.field_92050_aA - this.particleRed) * 0.2F; - this.particleGreen += (this.field_92051_aB - this.particleGreen) * 0.2F; - this.particleBlue += (this.field_92052_aC - this.particleBlue) * 0.2F; - } - } + if (this.onGround) + { + this.motionX *= 0.699999988079071D; + this.motionZ *= 0.699999988079071D; + } - this.setParticleTextureIndex(this.field_92049_a + (7 - this.particleAge * 8 / this.particleMaxAge)); - // this.motionY -= 0.004D; - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9100000262260437D; - this.motionY *= 0.9100000262260437D; - this.motionZ *= 0.9100000262260437D; + if (this.field_92054_ax && this.particleAge < this.particleMaxAge / 2 && (this.particleAge + this.particleMaxAge) % 2 == 0) + { + GoggleRiftFX var1 = new GoggleRiftFX(this.worldObj, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, this.field_92047_az); + var1.setRBGColorF(this.particleRed, this.particleGreen, this.particleBlue); + var1.particleAge = var1.particleMaxAge / 2; - if (this.onGround) - { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - } + if (this.field_92053_aD) + { + var1.field_92053_aD = true; + var1.field_92050_aA = this.field_92050_aA; + var1.field_92051_aB = this.field_92051_aB; + var1.field_92052_aC = this.field_92052_aC; + } - if (this.field_92054_ax && this.particleAge < this.particleMaxAge / 2 && (this.particleAge + this.particleMaxAge) % 2 == 0) - { - GoggleRiftFX var1 = new GoggleRiftFX(this.worldObj, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, this.field_92047_az); - var1.setRBGColorF(this.particleRed, this.particleGreen, this.particleBlue); - var1.particleAge = var1.particleMaxAge / 2; + var1.field_92048_ay = this.field_92048_ay; + this.field_92047_az.addEffect(var1); + } + } - if (this.field_92053_aD) - { - var1.field_92053_aD = true; - var1.field_92050_aA = this.field_92050_aA; - var1.field_92051_aB = this.field_92051_aB; - var1.field_92052_aC = this.field_92052_aC; - } + @Override + public int getBrightnessForRender(float par1) + { + return 15728880; + } - var1.field_92048_ay = this.field_92048_ay; - this.field_92047_az.addEffect(var1); - } - } - - @Override - public int getBrightnessForRender(float par1) - { - return 15728880; - } - - /** - * Gets how bright this entity is. - */ - @Override - public float getBrightness(float par1) - { - return 1.0F; - } + /** + * Gets how bright this entity is. + */ + @Override + public float getBrightness(float par1) + { + return 1.0F; + } } -- 2.39.5 From 76d2f20f5d3883386ed948aaa9df9a2961e6ff74 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Mon, 9 Mar 2015 03:36:56 -0500 Subject: [PATCH 15/58] Fix rifts not rendering, fix rifts not closing, door blocks not synched --- .../mod_pocketDim/CommonProxy.java | 2 +- .../mod_pocketDim/blocks/BaseDimDoor.java | 37 +++++++++---------- .../tileentities/TileEntityDimDoor.java | 18 ++++++--- .../tileentities/TileEntityRift.java | 2 +- .../mod_pocketDimClient/ClientProxy.java | 2 +- 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java index 73b28e8..9a1666d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java @@ -140,7 +140,7 @@ public class CommonProxy implements IGuiHandler int metadata = world.getBlockMetadata(x, y, z); TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; dimTile.openOrClosed = door.isDoorOnRift(world, x, y, z)&&door.isUpperDoorBlock(metadata); - dimTile.orientation = world.getBlockMetadata(x,y,z) & 7; + dimTile.orientation = door.func_150012_g(world, x,y,z) & 7; dimTile.lockStatus = door.getLockStatus(world, x, y, z); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index 7d84b10..5178dd3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -90,26 +90,23 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn return false; } - final int MAGIC_CONSTANT = 1003; - - int metadata = world.getBlockMetadata(x, y, z); - int lowMeta = metadata & 7; - lowMeta ^= 4; + int metadata = this.func_150012_g(world, x, y, z); + int newMetadata = metadata & 7; + newMetadata ^= 4; - if (isUpperDoorBlock(metadata)) - { - world.setBlockMetadataWithNotify(x, y - 1, z, lowMeta, 2); - world.markBlockRangeForRenderUpdate(x, y - 1, z, x, y, z); - } - else - { - world.setBlockMetadataWithNotify(x, y, z, lowMeta, 2); - world.markBlockRangeForRenderUpdate(x, y, z, x, y, z); - } + if ((metadata & 8) == 0) + { + world.setBlockMetadataWithNotify(x, y, z, newMetadata, 2); + world.markBlockRangeForRenderUpdate(x, y, z, x, y, z); + } + else + { + world.setBlockMetadataWithNotify(x, y - 1, z, newMetadata, 2); + world.markBlockRangeForRenderUpdate(x, y - 1, z, x, y, z); + } - world.playAuxSFXAtEntity(player, MAGIC_CONSTANT, x, y, z, 0); - - return true; + world.playAuxSFXAtEntity(player, 1003, x, y, z, 0); + return true; } @Override @@ -129,7 +126,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn { if (side != 1 && side != 0) { - int fullMetadata = blockAccess.getBlockMetadata(x, y, z); + int fullMetadata = func_150012_g(blockAccess, x, y, z); int orientation = fullMetadata & 3; boolean reversed = false; @@ -246,7 +243,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn @Override public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) { - this.setDoorRotation(par1IBlockAccess.getBlockMetadata(par2, par3, par4)); + this.setDoorRotation(func_150012_g(par1IBlockAccess, par2, par3, par4)); } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java index d280066..8a48808 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityDimDoor.java @@ -33,21 +33,27 @@ public class TileEntityDimDoor extends DDTileEntityBase @Override public Packet getDescriptionPacket() { + NBTTagCompound tag = new NBTTagCompound(); + writeToNBT(tag); if(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)!=null) { ClientLinkData linkData = new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)); - NBTTagCompound tag = new NBTTagCompound(); - linkData.writeToNBT(tag); - return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, tag); + NBTTagCompound link = new NBTTagCompound(); + linkData.writeToNBT(link); + tag.setTag("Link", link); } - return null; + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, tag); } @Override public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { NBTTagCompound tag = pkt.func_148857_g(); - ClientLinkData linkData = ClientLinkData.readFromNBT(tag); - PocketManager.getLinkWatcher().onCreated(linkData); + readFromNBT(tag); + + if (tag.hasKey("Link")) { + ClientLinkData linkData = ClientLinkData.readFromNBT(tag.getCompoundTag("Link")); + PocketManager.getLinkWatcher().onCreated(linkData); + } } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 54b1fc0..63993c9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -164,7 +164,7 @@ public class TileEntityRift extends DDTileEntityBase } } } - if (growth == 0 && !worldObj.isRemote) + if (growth <= 0 && !worldObj.isRemote) { DimLink link = PocketManager.getLink(this.xCoord, this.yCoord, this.zCoord, worldObj); if (link != null) diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index feefd27..9387b13 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -40,7 +40,7 @@ public class ClientProxy extends CommonProxy int metadata = world.getBlockMetadata(x, y, z); TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; dimTile.openOrClosed = door.isDoorOnRift(world, x, y, z)&&door.isUpperDoorBlock(metadata); - dimTile.orientation = world.getBlockMetadata(x, y, z) & 7; + dimTile.orientation = door.func_150012_g(world, x, y, z) & 7; dimTile.lockStatus = door.getLockStatus(world, x, y, z); } } -- 2.39.5 From e47e9597ac9aa00c300473c15c60e83f274c9724 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Mon, 9 Mar 2015 09:35:06 -0500 Subject: [PATCH 16/58] Fix rotation issue for dimdoors --- .../StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index 5178dd3..a6dc04d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -193,7 +193,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn int metadata = world.getBlockMetadata(x, y, z); TileEntityDimDoor dimTile = (TileEntityDimDoor) tile; dimTile.openOrClosed = isDoorOnRift(world, x, y, z) && isUpperDoorBlock(metadata); - dimTile.orientation = world.getBlockMetadata(x, y, z) & 7; + dimTile.orientation = this.func_150012_g(world, x, y, z) & 7; } return this; } @@ -393,7 +393,11 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityDimDoor(); + if ((metadata & 8) != 0) { + return new TileEntityDimDoor(); + } + + return null; } @Override -- 2.39.5 From 735b06ded2b9aa60743862f7219ad84d4698558f Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Mon, 9 Mar 2015 10:36:25 -0500 Subject: [PATCH 17/58] Forgot to register block rotations --- src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 358c98a..971aff6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim; import java.io.File; +import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -262,6 +263,8 @@ public class mod_pocketDim GameRegistry.registerBlock(blockDimWall, ItemBlockDimWall.class, "Fabric of Reality"); + BlockRotator.setupOrientations(); + if (!DimensionManager.registerProviderType(properties.PocketProviderID, PocketProvider.class, false)) throw new IllegalStateException("There is a provider ID conflict between PocketProvider from Dimensional Doors and another provider type. Fix your configuration!"); if (!DimensionManager.registerProviderType(properties.LimboProviderID, LimboProvider.class, false)) -- 2.39.5 From 394495baa62efca3af8926820882a5cd8b5dbc97 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Mon, 9 Mar 2015 16:07:48 -0500 Subject: [PATCH 18/58] Migrated the dungeons to 1.7 --- .../schematics/core/somethingBroke.schematic | Bin 1057 -> 890 bytes .../gateways/sandstonePillars.schematic | Bin 365 -> 416 bytes .../schematics/gateways/twoPillars.schematic | Bin 268 -> 308 bytes ...Hall_SK-CourtyardAmbush_Open_100.schematic | Bin 13622 -> 13801 bytes ...lexHall_SK-Intersection_Open_100.schematic | Bin 1348 -> 1480 bytes ...mplexHall_SK-SoulWastes_Open_100.schematic | Bin 17821 -> 17483 bytes ...ComplexHall_SK-Starfall_Open_100.schematic | Bin 8322 -> 8167 bytes ...plexHall_SK-TheCauldron_Open_100.schematic | Bin 5040 -> 4803 bytes .../Maze_SK-BrimstoneMines_Open_80.schematic | Bin 59604 -> 59814 bytes .../Maze_SK-QuartzfoldCave_Open_40.schematic | Bin 37400 -> 37578 bytes ...Maze_SK-SwirlsUponSwirls_Open_40.schematic | Bin 6478 -> 4950 bytes .../nether/Maze_SK-Tangle_Open_80.schematic | Bin 4260 -> 3438 bytes ...mpleHall_SK-AnvilValley_Open_100.schematic | Bin 5912 -> 5830 bytes .../SimpleHall_SK-Arena_Open_100.schematic | Bin 3051 -> 2970 bytes ...mpleHall_SK-DarkPathLeft_Open_50.schematic | Bin 970 -> 851 bytes ...pleHall_SK-DarkPathRight_Open_50.schematic | Bin 1015 -> 883 bytes ...mpleHall_SK-DiamondRoom_Open_100.schematic | Bin 1090 -> 1197 bytes ...impleHall_SK-LongBridge_Open_100.schematic | Bin 687 -> 782 bytes ...all_SK-SpiralStairsDown_Open_100.schematic | Bin 730 -> 839 bytes ...impleHall_SK-TheFurnace_Open_100.schematic | Bin 1592 -> 1736 bytes ...l_Balgor0-CrumbledHall_Closed_75.schematic | Bin 2513 -> 1809 bytes ...omplexHall_Cere-JumpPass_Open_75.schematic | Bin 675 -> 742 bytes ...plexHall_Cere-PuzzleWall_Open_75.schematic | Bin 2778 -> 2382 bytes ...l_Cere-TransferTunnel_Closed_100.schematic | Bin 2163 -> 1829 bytes ...xHall_SK-AnchoredDescent_Open_50.schematic | Bin 933 -> 925 bytes ...allwayHiddenTreasure-B_Closed_50.schematic | Bin 1691 -> 1458 bytes ...lexHall_SK-HiddenStairs_Open_100.schematic | Bin 2413 -> 1971 bytes ...omplexHall_SK-LostGarden_Open_40.schematic | Bin 5958 -> 5216 bytes ...ComplexHall_SK-RuinsOhNo_Open_50.schematic | Bin 1847 -> 1514 bytes ...dEnd_Balgor0-ArrowHall_Closed_75.schematic | Bin 2421 -> 1986 bytes ...adEnd_Cere-FloatingAltar_Open_75.schematic | Bin 1612 -> 1616 bytes ...dEnd_SK-EyesOfTricksters_Open_50.schematic | Bin 4733 -> 3963 bytes ...End_SK-FarAwayInTheDark_Open_100.schematic | Bin 1332 -> 1197 bytes ...eadEnd_SK-UnstableDesert_Open_50.schematic | Bin 2128 -> 1817 bytes .../Exit_SK-HotSuspense_Open_75.schematic | Bin 1777 -> 1338 bytes ...xit_SK-LockingExitTrap_Closed_50.schematic | Bin 2207 -> 1807 bytes ...t_XombyCraft-RopeBridge_Open_100.schematic | Bin 2137 -> 1804 bytes .../Hub_Balgor0-OmniMaze_Open_50.schematic | Bin 7039 -> 7093 bytes .../Hub_Cere-GreatHall_Open_40.schematic | Bin 8088 -> 8066 bytes .../Hub_SK-Claustrophobia_Open_40.schematic | Bin 2514 -> 2394 bytes .../Hub_SK-FractalCage_Open_40.schematic | Bin 10545 -> 9128 bytes .../Hub_SK-HeartOfDisorder_Open_50.schematic | Bin 8974 -> 9094 bytes .../ruins/Hub_SK-RandomSnow_Open_75.schematic | Bin 2824 -> 2501 bytes .../Hub_SK-RandomSwamp_Open_75.schematic | Bin 2951 -> 2940 bytes .../ruins/Hub_SK-TheNexus_Open_40.schematic | Bin 13964 -> 13367 bytes ...leHall_SK-LeftDownStairs_Open_50.schematic | Bin 776 -> 662 bytes ...SimpleHall_SK-LeftUpPath_Open_50.schematic | Bin 905 -> 749 bytes ...eHall_SK-RightDownStairs_Open_50.schematic | Bin 744 -> 641 bytes ...impleHall_SK-RightUpPath_Open_50.schematic | Bin 902 -> 744 bytes ...leHall_SK-SpiralHallway_Open_100.schematic | Bin 452 -> 542 bytes .../SimpleHall_SK-UTurnLeft_Open_50.schematic | Bin 582 -> 603 bytes ...SimpleHall_SK-UTurnRight_Open_50.schematic | Bin 582 -> 603 bytes ...all_SK-WatchedForkLeft_Closed_80.schematic | Bin 2022 -> 1650 bytes ...ll_SK-WatchedForkRight_Closed_80.schematic | Bin 2066 -> 1693 bytes .../Trap_SK-FakeTNTTrap-B_Closed_50.schematic | Bin 2126 -> 1776 bytes .../Trap_SK-NicolesTower_Open_50.schematic | Bin 3591 -> 3673 bytes .../Trap_SK-RaceTheLight_Closed_50.schematic | Bin 1565 -> 1658 bytes ...Trap_SK-RestlessCorridor_Open_40.schematic | Bin 3791 -> 3324 bytes ...Trap_SK-SimpleLeftTrap_Closed_50.schematic | Bin 1447 -> 1316 bytes ...rap_SK-SimpleRightTrap_Closed_50.schematic | Bin 1495 -> 1369 bytes ...p_SK-TrappedStairsDown_Closed_50.schematic | Bin 1299 -> 1337 bytes ...rap_SK-TrappedStairsUp_Closed_50.schematic | Bin 1303 -> 1333 bytes .../Trap_SK-UTrapRight_Open_50.schematic | Bin 876 -> 893 bytes ...plexHall_buggyTopEntry1_open_100.schematic | Bin 1843 -> 1353 bytes ...exitRuinsWithHiddenDoor_open_100.schematic | Bin 1327 -> 1097 bytes ...hallwayHiddenTreasure_closed_100.schematic | Bin 1334 -> 1187 bytes ...xHall_largeBrokenHall_closed_100.schematic | Bin 1524 -> 1301 bytes ...Hall_mediumPillarStairs_open_100.schematic | Bin 1236 -> 1163 bytes .../complexHall_pitStairs_open_100.schematic | Bin 1368 -> 1074 bytes .../complexHall_ruinsO_open_100.schematic | Bin 1410 -> 1181 bytes ...l_smallBranchWithExit_closed_100.schematic | Bin 1099 -> 929 bytes ..._smallRotundaWithExit_closed_100.schematic | Bin 1189 -> 1018 bytes ...plexHall_tntPuzzleTrap_closed_50.schematic | Bin 1813 -> 1682 bytes ...deadEnd_azersDungeonO_closed_100.schematic | Bin 1562 -> 1349 bytes .../deadEnd_brokenPillarsO_open_100.schematic | Bin 1408 -> 1131 bytes ...End_diamondTowerTemple1_open_100.schematic | Bin 1384 -> 1294 bytes .../deadEnd_fallingTrapO_open_100.schematic | Bin 1349 -> 1136 bytes ...eadEnd_hiddenStaircaseO_open_100.schematic | Bin 1330 -> 1066 bytes .../deadEnd_lavaTrapO_open_100.schematic | Bin 1937 -> 1598 bytes .../deadEnd_randomTree_open_75.schematic | Bin 1178 -> 1049 bytes .../deadEnd_smallDesert_open_75.schematic | Bin 1140 -> 959 bytes ...adEnd_smallHiddenTowerO_open_100.schematic | Bin 1373 -> 1094 bytes .../ruins/deadEnd_smallPond_open_75.schematic | Bin 1257 -> 1062 bytes ...d_smallSilverfishRoom_closed_100.schematic | Bin 872 -> 768 bytes .../ruins/deadEnd_tntTrapO_open_100.schematic | Bin 1139 -> 993 bytes .../ruins/exit_exitCube_open_100.schematic | Bin 1084 -> 913 bytes .../exit_lockingExitHall_closed_100.schematic | Bin 1207 -> 1088 bytes .../exit_smallExitPrison_open_100.schematic | Bin 972 -> 823 bytes .../hub_4WayBasicHall_closed_200.schematic | Bin 989 -> 824 bytes .../hub_4WayHallExit_closed_200.schematic | Bin 1188 -> 947 bytes .../hub_doorTotemRuins_open_100.schematic | Bin 1348 -> 1173 bytes .../ruins/hub_fortRuins_open_100.schematic | Bin 2094 -> 1800 bytes ...hub_hallwayTrapRooms1_closed_100.schematic | Bin 1878 -> 1636 bytes .../hub_longDoorHallway_closed_100.schematic | Bin 956 -> 783 bytes ...b_smallMultilevelMaze_closed_100.schematic | Bin 2024 -> 1796 bytes .../maze_smallMaze1_closed_100.schematic | Bin 1384 -> 1054 bytes ...ollapsedSingleTunnel1_closed_100.schematic | Bin 1120 -> 907 bytes ...leHall_simpleDropHall_closed_100.schematic | Bin 1248 -> 1134 bytes ...pleHall_simpleSmallT1_closed_100.schematic | Bin 864 -> 730 bytes ...Hall_simpleStairsDown_closed_100.schematic | Bin 1115 -> 953 bytes ...leHall_simpleStairsUp_closed_100.schematic | Bin 992 -> 869 bytes ...l_singleStraightHall1_closed_100.schematic | Bin 849 -> 714 bytes ...eHall_smallSimpleLeft_closed_100.schematic | Bin 886 -> 733 bytes ...Hall_smallSimpleRight_closed_100.schematic | Bin 864 -> 730 bytes .../trap_fakeTNTTrap_closed_100.schematic | Bin 1586 -> 1440 bytes ...ap_hallwayPitFallTrap_closed_200.schematic | Bin 1514 -> 1373 bytes .../ruins/trap_lavaPyramid_open_100.schematic | Bin 1872 -> 1757 bytes .../trap_pistonFallRuins_open_75.schematic | Bin 4178 -> 4016 bytes .../trap_pistonFloorHall_closed_150.schematic | Bin 1676 -> 1497 bytes ..._pistonFloorPlatform2_closed_100.schematic | Bin 2128 -> 1677 bytes ...p_pistonFloorPlatform_closed_100.schematic | Bin 3966 -> 3037 bytes .../trap_pistonHallway_closed_100.schematic | Bin 1622 -> 1474 bytes ...rap_pistonSmasherHall_closed_100.schematic | Bin 2338 -> 2130 bytes .../trap_raceTheTNTHall_closed_1.schematic | Bin 1064 -> 966 bytes ...llFallcomboPistonHall_closed_200.schematic | Bin 2007 -> 1703 bytes 115 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/schematics/core/somethingBroke.schematic b/src/main/resources/schematics/core/somethingBroke.schematic index 28a3ea8ad36d37be9373dfe9ede1547a8171ec0c..de2d9c74264d12d200978559a5eaf31c900afcdd 100644 GIT binary patch literal 890 zcmb2|=3oE;7KXQX&*uq;OB{PBT>k0!;%(g1VnZS~z7pNAc+m=OEk%c>w^!s&aHzYT z^H^bi>Z?eH&<5jYE|=B*`Te#D5@E07UhH2bex&e~Nv)lArvL1Hvt^gP3cPHtSz9p` zY(9{`Uhmm~q{mndRAY9!93mb+QZ-EALyw ztU;#}x-+eQyi9}|DQU!W7;}Ee%@vC=8W)n*ZfVG*H2-V^?>*U-y4v@4cwd z(5*|ms&c1#g+^^X=XQV3FPjV3!>zt-4b=+G44u|1w{BJM`Rvdu*{efVU0S6hZ5t8F z+`lg*aQ)h#m0qhi<$MVU&8?LAb4zRLsx4Zl-S|VV9y{(P`W4O(5#L<%b64N1C}gql z)i#m8U#)^#J2iDN`>L=1?`^mUbl5hK9U(vGE%aKtYcklted#NLR=!(uYSYE$sn^|s z&e**IXl=pM=RBcWS7k#Y&8obg{4WcT5Ew0P+qm-df3X4rJ@BFj!roM|^sz3Yc?#J%(^2_A+tGu6n+Vz+8&5eSs&m@=_07^oz Ai2wiq literal 1057 zcmb2|=3sz;w|DRQ1^bFLJZ$7xYJJaDxNi?%xaBi!lHw7$%z3|Kw;myJ;~a)8{#g4l(nLSvbzT2Jyc00Exd=3`(DC-^1)dryEq;GT*!KRFMsybzU{aBy?VTV+Vaf$32p4h zkFP(!Uv_TnvXXCEoA=8{G*+Piy=F^7d7Hh;O!ubGzt1G5^bhcfHcNA%}bGewdwl zoGMZa)ONmp$3?f$J1-9Y$(Cg{zqMkPbnR!)-51?N?`Bxv%GetCK>BW#^wW<r-3csV+Zuv+QlFx+V$rHfb4}p_Vkc_@$Ftq ztNsDi#6|twSFSbn)y~yA*1O!19I_b66M?R_xl_GDqo$_1e_yd^-ZrnLT5EykREHq^ zWsBrqIV6YnYrV=`9kS}uD$0xp#?#WOfSVVAwCMIti$k@hYUQQ6uMW`)y`lA&O}OLl Jp9~2m1_0aA7TEv* diff --git a/src/main/resources/schematics/gateways/sandstonePillars.schematic b/src/main/resources/schematics/gateways/sandstonePillars.schematic index 30315b5a299f51d6ae0464ab1039a95e56e95199..9f5043cad3065d050e84eacd5b4141b3fc97bf12 100644 GIT binary patch literal 416 zcmV;R0bl+fiwFP!000040L@d|PQx$^b<%BZcM$?49{7~Kjco#>dDkIk}&ld9`l_LBLk- zP3!?}4RBb~NU?#^ek-sj#<7YbD15a|obia#Y&U z3mOfpn++*sxIjlqU7#Jj>xnYDp9<6?)Kfy+X0G&O-p`Cxl0Lyc{6A@37V851ZTw*p z>>!C?lLUvxNa=}7p&mlqlkz4r$<&hX^XFIjM?(4EDV(GZ8XW2`DCs1v5E|t%R?Sux z8C&-jC&QbhO0z&=uOLfvr`f1GJ%beAZNW;~uCSunD)8T-)o2`}RmtgQ3&$c;&Z!7| z?Q~|SRg#N0*Y#z3x!qc!rFBLtxUK+St)qAgR}yEE3f^{IF0}O(?&}}Uwj5{jB!w@3 Kg;eWD1polt1jJSV literal 365 zcmV-z0h0b7iwFP!000000KHSePQx$^brQO^8yw)&@8A!{I)Ts-NFZ^J)@ZfXB~u%u zjnjUHui)o!x^^mEDI5StcHHOp5+_lI5I)XRwUQR+KAgnTN&t2X0K9hYoHG|br$Pu; zmJi&PY!7hQ%P24*DwLF+vZm2DbG#1xJ6X^#W0kkc9*rYe7q?Z09!dzoR9m#DijopQ zcqgsOQDy~r<7}PE5Kf;kQ#EbqnhAho0_O*O8{;ZACTDP#%HmpSt&#_cIS3e;9F?~8 zf<{Amvp!L#8?@Ba1s3s(UMQm{sYE?Py(IM1td+jcCz&Z!LQAk$w(1$;gL6 zeT?#Fi)xQx=Zq4UQmE4kZEzbYmG(xY$gSeSu7P&Tn&uSmQ78U4vP&9$vM!5S^O1c3 LmTY9l&jbJfIB}xP diff --git a/src/main/resources/schematics/gateways/twoPillars.schematic b/src/main/resources/schematics/gateways/twoPillars.schematic index 75f538db2f88cdd17c5cd760d08ea224b9e076d6..b56de0447a1ac866746ab2fec51e806bc2220cce 100644 GIT binary patch literal 308 zcmV-40n7d$iwFP!000040KHL7PXaLzoh~1{i*V2wkNyzC1zDm8j3k(NuG^8FusbE~ zn1H|D7F|%o**VNtXI>}o4Ip2Y6*gL^Orcw7(Eu=kvzGiWvmbfqkmP3R8o7Wv7|YU|Mi2=x&cL)?d`Lfpj&|9FJ@b3}4H zB7yz_c`X(6Qpl&q+|{<+`0#dnUYCbW-Ra_a^~ewFU=uqEFyE zKU=mwhjgiH6v6Bu^{64n(&;xDM@Ftsr5DTi>ZshnjiJT_0{vK=W*-@ge8MN%bck1Y G0ssI54V3Hv literal 268 zcmV+n0rUPJiwFP!000000KHMmPQx$|9H-5zlmmPKU(!oyDmWB@1QKUAUd5}Xc9a;Y z<=6N*HYyD*>X|+4%&vFGBYT4UwY0R=fy)%*LI(|ChKmuMm)Qv){pK9m(ghAoojQ!= zPdZS`y6zCq>&EIF(>Jc^I5z3EGem4~GxYZbZwv2Rg=?$32Xc!p96mGdIK3qlKEv#m@Vz-g*)Hmdw+ePg=G9sZq`$fUMpc35mh<`Mp{+Ngc z6A_XXxhh!1De}27_q8uKot)jBym)$m=InoxN8-u`j3dPFY(!#|A{q8)SYv$*;eAN{ S!VkY#4*473(Z%sB0ssJ=#DKK` diff --git a/src/main/resources/schematics/nether/ComplexHall_SK-CourtyardAmbush_Open_100.schematic b/src/main/resources/schematics/nether/ComplexHall_SK-CourtyardAmbush_Open_100.schematic index d19467b762924dc6135e47c71472d411d535900f..fc49b35b08dac8e7a312722cd7ca687d7930eadb 100644 GIT binary patch literal 13801 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 DFz;;} literal 13622 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 N$J3eF`ZXvo{x2c~iW>j` literal 17821 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 diff --git a/src/main/resources/schematics/nether/ComplexHall_SK-Starfall_Open_100.schematic b/src/main/resources/schematics/nether/ComplexHall_SK-Starfall_Open_100.schematic index d585689aedffd193ce942c9ccca157a785f393b3..cd06896713eb50bf24180505aa984c0f7f9aa111 100644 GIT binary patch literal 8167 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

UPe^y+WbY#PO{%ytSxv7* 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 H7tZ_(_T4X) diff --git a/src/main/resources/schematics/nether/Maze_SK-BrimstoneMines_Open_80.schematic b/src/main/resources/schematics/nether/Maze_SK-BrimstoneMines_Open_80.schematic index b62c1a93127faedd7a9a6bc47306b9c4cb928c81..8ce25f7204d0a8006e00886c19e5b007104667b6 100644 GIT binary patch delta 57225 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�@F`ax<%o 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

o6a1A5HmvKAW1T!)VRD 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

FQV6;urM4MGS6LT=r<5uV=wD2E6Vav`{+K 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 Dl5oq4 diff --git a/src/main/resources/schematics/nether/Maze_SK-SwirlsUponSwirls_Open_40.schematic b/src/main/resources/schematics/nether/Maze_SK-SwirlsUponSwirls_Open_40.schematic index 439545648ea27236adbbd242c8ef4d0fd2b1ed28..b82b97b403d67bedd33ee125b10a96c54f47e195 100644 GIT binary patch literal 4950 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 G=wAS0BbWC8 diff --git a/src/main/resources/schematics/nether/Maze_SK-Tangle_Open_80.schematic b/src/main/resources/schematics/nether/Maze_SK-Tangle_Open_80.schematic index b6de21e2c59ca229df747b6064c6103bfb4ce145..ffb21031cdf92b3729dbda930183a9e4ddd27d7e 100644 GIT binary patch literal 3438 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 MgSI?Xv+sa^1HFy700000 literal 4260 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 diff --git a/src/main/resources/schematics/nether/SimpleHall_SK-Arena_Open_100.schematic b/src/main/resources/schematics/nether/SimpleHall_SK-Arena_Open_100.schematic index 05a8cda4f17363822c301f603e0872b517b2303a..9ec6d4fe90fd4543cc63efe18d8281f17a15effb 100644 GIT binary patch literal 2970 zcmb`Idop&bD+hTe{($*h9ke{K6G z+$^@aGPQeuw!KF2?BEqe<#TY^waM|_%(xh1$$ggt$O~X23*qw z%F?>0v~>F zdf=+ZlqWsX6FV!n0Ph@n41+qJR2^S;U$bly+77`8dvl(*bGxFRdQscsa;i&FWD(5o?4Zda;~l+>BH9uxW| zGsdas(^1Om&XP84N88eZ0(*Jp>br-I0wC{)Xou=oU>9)J`;X|+0DkklO1L-N!{n1W z?OpT1In#gM;@^t8gH5EF>D3yqEaoMC+YlNdOy<&U~4*w$Ubm?PSP_C14wG z8_NDQb)LPeksuXY1U_(bsxKZSqTTSJ-Q@3y=9w4JZfcsK>EbP{lxmfi?{Am-nZix+ zkB>$X9yG8jqNQEd5OojlM3)%uI2(HFXDBL0TMo0qU%&!m| zr^SK{ai)zt^38#E_tNcFh~mdVPB9`on5^wk9Lm$>*=|?ePqy%?;6@rY>NGsUJ!96x z(-zrj*tsvSP$3t=mbasnfbR|tA{Jp|kudiD_FEF#MR>R^8V1!hPS=NoD`K?=d?(-X zv}gV1-=YMAtQ3EpukhWEbj4m9pl2mY^$tyEpG{3t=s~Ala8B(EYfbhft6)z1(X{J# z1G$Lg1+`&(L@nwGOW5Y;Hg#cK0W@uC@tg{f^6f@cKs*5JbdI5~)!M?+F6Y`aJUWYa zbc?}a_<|r3vY_h`A0TO`(n9sXwT4Lf=ZS@2Sh_(;;r@tRSI#n|?JBMfP3E}e`x>9E z@(0=vWW|m?^>SU&Qg&Hy9EoCXo;@=;#EWUzoIjSbx?YdJ#>9oB){WEYTQJEsB~vG-v^Qysg(BM9Ahz_ zLjDbRn1bXUO-qO`l8fP7L9B0=C4D*M?y}TInmn3A=r1yl2<)RXx}idhuzfoxnaO2$XxFOI+sx zl2Cy8A+2J1a@cvu~+bz>h-ljCS$fMG;ZVz0>rr|l}7|;!p->2 zVn*Mlh=n24B#bf~s24MwwDfevvPoc1OR1i#dLPiE z?K)%+#a0=`)I*TbawpVQ}YG zdZ<8v??)g_q)Y4sWyUGJQs*QAoK{}(Y1eXT`;n)Lzk@IGrHaIvmr^m_WaDdD#3$jN zupHi0SHB6$DcyB@>(Po!+z8#Ca!ooY7UivhtIO&(MT zGglnny#I+ai=+dh7?ZZo6z|4FSPO+ryC3CXEDLXeFg6rHe}DX|gbM%QBwWh<*zyFa zsPd-F%TB>n=CP_)^H1zT&Ru!X9tEIb{5rL>fFfvs(OSrH&-|fDCQ5S8NC6cY*WwCO z8#^g3W@W0rb}sO(uqxMp412G}^e)(5(6m8C;gQpDd@-;5;yC6Wg|Bc6!ulBUhCupYmc%aJDX+$JFgXwmX3{Mbp!@o^!Xkd!7=Q1E zFlyW9=yPQ^66ps-9?5qgk@>8bFS130Jl{Xcr?Y85RE5zp#63Ln199?(*lhvK`Qq!l zkOE!?@tI=xQF41yu*;Z|2^8G0PrX|LHh>9AmH}a<0WlUCQQZl)&ZV)&!y8eOfYLb9 zoLCkXSb}m*RNCQEKKfGoVkKaD!!XNSc!{XO^k2-KFIaM4L%c!JS&eyEl=uGQ*pm69{g_^dxO+8doaXOV~}xY6n7buuZs zLSsR=#}|C%jrl$Xz$x`&@GITvNft*{lJVS{$8uH8oP;GgE(+(XlhrZc#%{ba&1GR_ zalMsoMWTEgMhL_AFh0lJ*Wvqhwx&aM?m~pVZ$`rEwdKCnBK0+*Il=P?bA+;l@;UC? zT4ZU%=#V4OJwqR7^xl&je{~-p1Qo#a8HWp#b3U!>dDHurtS6TUMXw#G%~{+@(PZLK KZL`7VP5%XQ#;K{Zknptblv*y_d2I#;q=F&%8 zP#@r7&dwM7#t#5~zrCyqv5*%J-ZxfNF|y@dJXBo)E*Kr2bqQIUq&xxZ zg2Y4q>8Mg^51)U0l~GTemPhViRZ(q^k37){6~pbNer9x8DS#rsgv?G8A!^AvKI)Qc zg25#K53`GviV^h?Ph6cnO3FQsb1Jrib$bw{@;jY;U#T@^lqDv=q}iU<{9+i;v;`*T zCk)1hrPy~)`8w!#vbWmgX0*4+r5QeqkE2C?Rt*IcA=`09=W(^8u5X%It#-?Icipc5 zyy88t>W6o-cl_sDf-;t;-~5y^^CM4-i@?}+=?^3thVmbuT=YhN@;s7Wp^w@ghO8(j zCSBQz*Glb2I^$c~f1}2*1fRt;maJM$E7Xy^%*y@q`*!6AH!Fc+co_WER90vsH@&6y zdSi4{?=4CHOYp=ueA*49c-YPX{FXsR@;9-<;HVm(RZDzy`7QNI^2_oGhF-`eYj4{z zXSrdIt$xdP^V^#7siC9kSUyK1AmT49ADUKU)VBPz|C7`J;r(*L>l^uZs>n-YQqa*j zWBD%UiFMxUMmtzxfZ?z;ye9Vbc%z(7M}i&IQRBq8I!~>qc(j%mV(rjh#Y5uQH^CtBWq)$TnEtfY^z5J&Ik)_{qTIaK7WL>c zAG5xO@4dt$y;JYMQK~tB$DPYx1=hPM)RJ8VdI&rNUdUS+jcRG!r`p^y_jk|G_v!p z;6t?Q&cjs)_rO)|T>HxW(A>z0&2EK-;`WiTr2_0I)@77YuD;oqk-C5g%sGplLj<1R zV65jfCI`MD+TFp}2YlFm;3eBpGv+_IU05a`P6@o5@$NY#P?+ntUF}=Y`n`(QN7_|L z-RWd=hT2EMN8VZ5();YI0(X<5R~KmBP|i-xyyu#6xV#cyjK*%FCI|#-LeiC^H9#+v z`ck93){uLgY$9ZKZXW+#nx+x*JXTsd6k(R!3X=#^Yrw zG{8qrRLMpdl?c3JU3pchE^l*AS!=DAkB0{n1A*5wC={r1%7s%=-k%;nHaY{3C7f9< z-CzTlvji2+;X?Z+GumSyQDnV`plVKSZJ z^Dv+g3P5;y^=?Bkk^5~15#&Pms~|8OQvw8{N8W}S`Y7O<*`M7~J)O-~sUL;d2&mV4??lmGnBra?7)L z`$5IYnv{qo?n=PA*N!k3vA#JuwJSL-YvJc8CcRhq3xv=@;|65E*Z;%uwxa=n`NH+^ z^yH#1-+hmCauEN9IZz&#c?*XO<-`EuO$qt(>;r;${T>So;3`Ylb*#GA;1YhII^N7l zKWFemkzj+KN~Y5p{Q4tTPiF@~Hi#I4fds#)wS?%`EN6V9XWRRB3bJ+YTowgIAPgs% zlDCq2auMYXLKbcd#Ol- zO!HXDCq2VN^5dBw#i3Tjt5lM^gletKMM&^x#wqq$ zJq0zez$^1J5oH_Mz0>p_mpRZl@O8!$?Y5>nRjkjyKLOWW*7U1ot-*}}1^x;p@`AKu za{MKy;1XZTjYm9JSUaxYQ86Jh+elLp#_5z&!f^D4Z0FB9Qa>|Wg4^k?e~xtO9yIp_ ztnX%j7aq+}i@Yf00&PDn&l<35)%_aagq6$rTd4O*ldC<}OTzp-c|nvJaYxVgPwf_A z-6Y`#Z6*?coy5>{+9Kafoist&njVkO3J@uxEhSkzp9_RI`Vpk9wF9x-&_n8;tYy_x>DH zH$!f1!t0nl{u#k}mFHl_dh<@fvedPonsx|lCi(SYUc9{NElFl_0K zwkPqQ*Kn?3FSLYIArc(&e2k<+E_0g)Op2;AsBb4G8fpjJi`a6w%lyYo04iwQU-qeh zSnShCVM68g2s7^COtZ7WbZtFQYq>qD+w&&>fUSpw`IFulZ@X-iscIzW+UB>6!cMwO zE?z%RKuSP24d@CkV-iVuBEe*xoW54_=3l`|%i9(%Ld+l;uel9sFOvxE-Sj5~i2^{+ zfNK=79Y$Yq2qHo!6?HZ2H61ZG)9F5yN5V7?@=xC!DL%rF%u(Ey@bU5^&_E9aYk!cm zzMd4SiQ60??yZA-o#j%pGF{6?Gq}vX=sf=Kj;$NISo>R_yVdQ{SZjoV6&DqMsF@5k zL~j~zn!PQ7*O#V00Xb-_R*fwP9EN;EsKkEH?u}VXpx=gW>c*S1P+t!}J1qWMF|yS+ z7!DNnI~tyP3mSr|+)WnlTB*{okwl5&E|^+MSsDlUx?!S-V!z{h?lK5@wRF@|mR(27 zOPcxR+*o9$pz<0GmGek*?#WxMy9#rE^mZ-ShT=6qy|){<6mS?6gAcvIE_ zzoAEvEGaetRPH&YB}5@?tz)w%fN;gg>dorX<5~R`gtj!ilg{xzuQ`u^dkn%Y!`xaj zwC^Kf_6)-TI>}=lMI6Z)Y`RCg4k z{z>b-s||VQ0c*@1D-r<8!tg-%K!GDVIW~&;Cog`A zA=!2%Ty%9ajG&TpAE&DoTSccyNQ>6L=d&7$%5)tZ)MOGD01S_nMr^|2*p@Vc#cMG} zoy@tWmb^az%ks=J2&K^kGNWEex8Y--skF>O%^f7Xjamrb_$1`io$RUtjEWJZJY7vZcZcbMU}F02?TO ADF6Tf diff --git a/src/main/resources/schematics/nether/SimpleHall_SK-DarkPathLeft_Open_50.schematic b/src/main/resources/schematics/nether/SimpleHall_SK-DarkPathLeft_Open_50.schematic index 9e742bbb7d0ee887059a13adf7c48d2ff53482be..916ddc08c60377d64ae84730a9208ae53e5a3c8c 100644 GIT binary patch literal 851 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 diff --git a/src/main/resources/schematics/nether/SimpleHall_SK-DiamondRoom_Open_100.schematic b/src/main/resources/schematics/nether/SimpleHall_SK-DiamondRoom_Open_100.schematic index 364c896a34e0e0735efdec0d5f9fc19c311ac858..76e28b21055910b6901b0cc2972d1dfef00badd3 100644 GIT binary patch literal 1197 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 R&o}=vPT;tHNT7y+0RXFrMY;e0 diff --git a/src/main/resources/schematics/nether/SimpleHall_SK-SpiralStairsDown_Open_100.schematic b/src/main/resources/schematics/nether/SimpleHall_SK-SpiralStairsDown_Open_100.schematic index e8873176870dfad1795a2597b1ece50dda519cdb..a0e5e6bce8a4a475a8ff7c0a6d0e1f1a1d36507b 100644 GIT binary patch literal 839 zcmV-N1GxMjiwFP!000040PUO2PunmUhu^ws+VHVyoiu5OO&oUE6*g%SH%6IuU;+&! zj>v0FW05*2F&pf!U;2@D6>ZwYuIrZfxg>9J?1wilKdC5N;9ax>)}@lS>)^DgqyQhz z070HJ)oQi)O%?qf(y z71o&bW<}<(8J?K+Q`s~(yS60q1bere0&AH+R#-oitX~-0{(jAj&E@^;7D1MT2aOXU zx#TSAf6yA>{h*S?oQ4V1j>5Zuda!fJLzWHON=MZiK)4UDM%N!(yxWSRxC+}*%$bl> z@<{Y1tUx`W$;ktk>1mTEt$Wd7kvI-07pGj@rdM~OJ0{NJ<1k8?pT=S3Z+hQ$dVEZe zPI`QRUP_uW zF!Cqho-)yq0qoYnJM#UnVbs1&0Gc07?P>%;5ClOG1VIo4K@h}l2)N%F?*tOQ5U5>o zfAD3Jn|+gnuR-dkG65Nr7S#-s#s3DgQ5Q{7E|w)adr`-6ivOlHouYc(ltoGAkYAK> zbMtyorlU^ZXKta^L>;07pZUd#McskVc*D*vsuUb?6*Yi**giuJ_Q z(+jg5oly|t%q?sX9oWn%Oo@`b5O;D5cg?b1tEgT#Wl@qjPqh1bEXFDr^!ue+m|^_cbg+>}L0=8#`t z))#v8nDx3ly6`%f^<_nsvOdpxSeWgoLNTOnnP_8OL|6S`GAz3CVlDBYeojLsCF{M# z>%ogI7pxuA8+jPg-xS{ayz56%oE(0mzhd6ri*ELQG8%IEc+TQ3ycv%dOa?5z?v1*I z-SKtGV|X`x*mWY)pC<5jv`UM2nMimfXt>vVUk_f6@03y84xl+2dqv~B!JyaUL4Rl% RUMIXG;2%)Nu&hX4000^Zq{;vQ literal 730 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 literal 1592 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 Vg0g#MpHBlIZ*_Oa-+o@N^e5{AaRUGV literal 2513 zcmd^8X;c!37BV=lR1;zFwm3Z~_jq|X@#Gt|n;5=w_s zGYv5X(UhgsY+_t66?chBBP7ugMMNCm^5dQJ&inWNyz{;v_q*qwd%t_mJ@>ODY*zaR zB#$PGMrjtEbZpBvV3UJX<5HVzg4*3|?QXN^Gk9?mNfdp$zI6NtO^cdCC9JJWt#1;Q z-bLWfB1{MTVb7+Kw0r)0!WGMLof*7P;nXxFRXiEm(nUJ$lEoaM*(}Npt zPZ4&<3`|xH*QuUc46R(YzlwIkqs*CSG(uX3&`Lf!v<|dGKfrYl9JW6L=U+TTk z7ikXOdaK9jx0oSD)tpmKD0Vhw8!z!*USWJ{?0InP!M4_9{=J_-t|079c&Rx{>!gD) z;`gQmtK6f&x6 zFjePQQda9$7qRqVRnxGln4YP;Rm)h*P%f%IpstaU6J@E3ucn8^$YC*IM%FVUJ7kBm zZts00r@b)jfeq!^P7UStxE}DHB{re^+mkojCz?ZjBXR=_(T=+lS3h1|NlCS4<#%-P z8H~v>x7KCJiR(|Z{D3I67%xS)`vYG)laZ3xLiq$_7!~mlUIOGAKF1xp)HR#4@CZ^N zbIg(VZs*f*JN3ng{qz2Bh`?zpv#1In0cvw32N$YnhF{s;VwAMsQSo6d>Ha6b8>wIG z-kqOwVHPIOX83+SRWWt0V*@aqFqH~bbdxG&4mrVo&Ha72cR`UpgsVRGU@-S!2m*2M z;y!vXJOP1vRy{%M52U<(5A~7l_9uvph$(5a@#=1a^wyyCK@=fG#S?>T`|D`JU;D?* zXl-$|=8b*z3^Z|@+ceX>QCKa~D@gz4F0*1e7Cj++91&-I=2~y-lcv~O)Yq*6*=59R z%Wd0~4o3jUPlf^7%IEzB9NX?9grM_tzBrp2t&C82J5brsczQ!HHI(8=O1}-U4!mpZ zII!oWubGI#XO&Dtt5t#7wxhuU?h&x`B54b5xKfi9AGBVgaqeUGt(SoEBqZ%>&|Vxc z8yV&1Bl&VJZ-We&Klp$KyKQP%q8b0>@kbySGrKOwv_Z3h@_Ab$dA-knR6`%VAmAQ| zOVv#hy8tFzof!M!Y6D_>Dalv#y<{GM?9PQJfMeX(>aUa|Z!=KPhzkPe38e%2zOj4& z_i)Z!HLt!F%cN({nbqb2DTtH4+^6hHu$45!*s(`y8)+rA@oh>his32Fh7c+WuH)f+ zJfHN;QJC6W_tY31fbn4NAYS^J<4r=EMkQ2EU7tMGRvJZfr|Zk2V_)k4EHRmwG-e6W zDsz)g##J6*z^k7`)`D!t(U$2SWYOqCx%uH4k*9XB>8S+#cVj!Hys7`a1>1En(OoaT z!H#Mirm0M_Z>Hq^E!;Ly+wLJ$nlHvq>&fk@m5)3Hp_83xJ$Wgu_Nm55-yUJj4Exf&4uuRl@yDB}o|V$< zS%oKu4q3&sn(yq=WPLQxl<2+;v67CeyCrVLHRN%Y${jalvd+EwWQu_K6iq$47A}ZG zYIt-SXAfTg#t*NFj>>Nz;v{4o7&DOT-c&3tV?nP)x^DU}V`5)z%1o~6dv8D9XQfCJ z@bBQR2pH~yjJ^o4%BpLy-0N_tsj=^Bz`O&{{%G|Y^p}oDmz$gDNBbGYrklbB2E*_6h+4XO{?pD0q NEw((Lpz;Q&{RuUh!;k;~ diff --git a/src/main/resources/schematics/ruins/ComplexHall_Cere-JumpPass_Open_75.schematic b/src/main/resources/schematics/ruins/ComplexHall_Cere-JumpPass_Open_75.schematic index 9c242b6300ed23dde961216341d744a80a24921e..a1160181fc62516e56d4488dd63a140d857c05bb 100644 GIT binary patch literal 742 zcmVZu2GS4{Ang*liPu<7 z?J6;1<>`179tEerX%Z({(yj&k-8lYyzH?5`ag@qFfX)}!CnGGV>wwk60t1}<0u2of z4Gj$qjs1kZHZ<~4*Q!zMO6q12wuQ!7*;ya9VrtilR%vq>MJZ&ZwKkl+{-_q`tkf=Z z`iJc;Hu3^ha*{M^=d9;(Dt%el{d;N6T_>RNeCR;?nh7c>iBLRmL+2wFB&0Zqz`hE` zKJLKLR~nFo*@3ibwZWhsyjb#+9v$^K4-p*uIJzN>5$_JuP;RC}9#X;t7L+q7H4r$` zo}wwbM+nXypoFtp}6k}YctoYI$r%UD=$`*8)8Rjwvm)gE{T-xdkiOs zQ|ZgX?%&N%*-e|qKZFiAcQ_zIkoI(TJfe)aA$|~-@lC|}YU=WSKOm9djC}ing80mJOBUy literal 675 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 literal 2778 zcmds3dpOe#8(xKy97?9hp+ZIDeKl6(SUEJa%K5ks4)fC}G0CZNC`n2oTSmsF38e{b zsEEy)!*c3JV@^>mB*r`Jb6wwiecyF`e}8|y_aFCtUC;GA*L^?FUyoM$Cdj`b%tv1t zXxVuyw|KupRY0q=@ybK9jiUQWQ3{o)AM~G|q{x=p-(wrjz1+5MPuhdY)2ngGn%CM& zw8)2cCFTvznQXp4taZ*~(Bti9-*p{(k&oE7rVXK1%w+2rCKZoqG#ARh8C_*q<1D7{ zF;1>5*sNQ#wMJntURw`=ASkoL4R3*x0;uNpe69*!B+Bo-V(%hsE`UHZFV_&y49-k1 z$Uq>E><09H=y-DaGwOP`vCLogWMQ)aZr+OvvF9FJ^0zbN;M0rgI@gtp`wo85G@O5C z+5|q;=nJhL5av|*9p2hbgJltoasJ$@HXcx2wA;cv2DhP9N$jKBP}Bc$@I6Io^?1v@ z^|i1;4L`>cSa8qa?yKl%6_A_pIm1c^BpnaEQ*mkCTU;j~{1Gcg9@vu{yjcDbcKb7* z5A|fTA-S~>(>p6l%$h{)C22=0T|q%%k_mw*#0*cNJA~Ss4y#K+N-fK?EB`+E|4%;j zyO|GdXF> zenJ@?)SZ9_89RbWT}}nFr?L+VTTC9-F43*>k(GSR@1YVN{uoZ)e$@X^_Q12{2abHl zaf>u&ZktH=SAu?GM20V5YuVv+zOLIbNSzyCm!XQPUSXO~l75dcMpCruweF2>t?@6& zXqo%+a{fyU;$*s|Q+gQnM4}PDDwUxWPs(dvg zVms`TN@MvNne9G+WI!}Jxw04~3Fx;#?jb?zFk@^*V{`)6?9OY<-J()ekEQ+m#HRGb z`SyYgyWmzbM?g54`NYjw^K+ek{P|54ps|$5C~tT|joXh=;Q3kRMyqmE(4(b@qdN;| zM(eA^J+rfY!Q|*6%>Jm^vN7q6rjC&zwFaF(8Qs(AhVxXJlZmu-NkKGxNay;bpvRTB zntdLhn2MH;cJr~UU3MPt+k$q$H&D2_Q72sV%XB+>Huli3UVjcPb?9>~4&~UZ4jt6; zqr$u}sPXdGH!q-Ab`$O-Jc_l~Pp*oP71FglYp}Zm03L8uV4d_a!CmN%vOG90%<bksUU*$FR)j&0<(J7-;7cA!d+LtrAbYKxgkByHVk%W~+HnvoTBQ-AkncU2Lmu z1RQ(i6TMh~v^6{m-2z^`@QTnDc0gWo2fE+S$Kw5j;>I`lDbIBJZy65N2p%{&CIegI zD-~a4d4Or&{A`OdFLqZ%7>5z&DKzF)e+bYR=Uy_!K8Ld4)GI!KI;|oxkv-7i`#t0!B9!iOEf!cHk5s z{FF!Vry6rbQ2Owl*PefszLv{E8r(;qT#T`cDfAFlQp#)Jr8kBSmas&AB|{{@R_k(VHYdnP=S;KB8FO{yXAIQo&P2Zaa0 zLI28>e6J&+CW1mBFx6DZ0*itpkAuxLZaW7Dx(fT@C8VPG4)?Odw_7 zO?$yL*ik2zKam9p1a#1aGk@Qelk-UiWx^@6MVVm_|LMyxCY=a25t!GAc+9jIsS8Si2P^hItI1?V|9Z!o20PpV2Gp#Rfa3{V-s5HQ_2FXda zLyGS^di9Q{-1B;@gKt9>H@+?bz^;{h9szZ}K;{yBO2#aix@l9w+xCa9<-$PzmKDI=C@YXEToJPy9LDgpby Uy7o;Olu9;?qub`Y9M?ns1p-H53jhEB diff --git a/src/main/resources/schematics/ruins/ComplexHall_Cere-TransferTunnel_Closed_100.schematic b/src/main/resources/schematics/ruins/ComplexHall_Cere-TransferTunnel_Closed_100.schematic index 786a0107ab60cf3b2fa43597181d4109e9c90a76..f2601c105f3b1af8fd69413e502ba0a948ce572b 100644 GIT binary patch literal 1829 zcmdr~X;9J$9AzuhGVO5H%oH76EiW7~BJW}6h9Onyd=*q4jVMO(Ca4)+%i^DP{=rb_QvD4kjyN;WzG3%|I07n z6zv$(5{9&EJr5afm)4PG5MK6zLZ@R>;4Tc(^az}eEVe{l_+j#Wq%%p~P4<}MGH)WI zdWvARjns*rv3PoQFs*#5C;n>0=}3Ocx3Kw$qNbA+pU*=|X( z>{*E9+zd>fC9?DxPKTWewkEZlEJ$)@!EL{_()=e2i0kYrhK8!wUIu^u0qZp1MYFH~ z?SNS|QF}x@cEoBn+ZsBdI|Ffi>45a4P1bxdpYm6B14jExT~E|ca|6RmXkJ6nFprBt zTxR&q`>U{+y=~T>RuIr}e$6PC-H)aRLieP}??OP4c<*E?%iqYMK)!_2%_FE&ysfI+ zL>0oAx;jF)$6&>3y(tV~Q7_hY?(iXP^?>!A27<_^@xsVp@UqjIJA9NS;;W~oJHIT5 z)ezr~k}O3*M?;X554j=@&CPWRKKgW;>BeP<9ghDv;6~#7C29q(uuwpi1O-rU=y#n3#bSPvDc3XZT0RBQOq$~D+}{=`CYGD!W8v#S9`Nk25QonDdWx8rpk+!?+OB* z_}I^DJ12i~-@m)Xl)40Wk@i?DCzq0}mzI#(`Ysj@wjE$%6jdWOOudv{X&USOel0W< z2cY(O3#5x)y3c-CZxFS%jLjhyVaJBz42I&0>%j>_cMf2(b|0KGmg(!&AP-+ZFjOBe zDsSf0F6Jy`PX6u-j`-k7Qp>&H_2_ndI%7|W@YJXw?a>UU5b+i9q^Xn9$E<#wCycQY zO8d^+I;3tk_W8*D`)ER+yX6i)5pbic^ZXUxJI6A&Ky}cqVJj=tpit%~P}-vQ$M0Cp zs2#y(WMpu$XsLX3RU0nYc)3{mmk1cLnbL@}ngAvdh*-u3g5#^$cRR{cI!N@ePNy>G zSsI!U`fBZvEIH9}AWT=4@#2O8@IYJNVz6^V9G@CbcelF|H&$~K!Ev~Q>^({UYBMRN z=rI!X?&K)zrSIVEgdrwdtke1F9z|=N?D{|om9;H%Twm#4gpSujW3g>4nSBlnt>`_ZIFXj3I%Bx0$K{?jjJBNFu6{Y8df$C#a%K_NR?dF`ho}B z6uzmYp?Y$^5hAZ-5?_g?fRqny>-uaSw52$R2HDZwQ?CP^cY?$CxV<%;q^Ra;i>7g; zzQWc-=?>XVBV2XFR}=oj`Q$=gz;$A)X_h!6Fwp5}FXgJVa^*Fe|0y+3nlN!J#xMlI z4lIPon|Ur&LfJzJNNnyc*>8OAVa{Mpm5I{EeIF7%w^IjeXJY7?ZrbiSGm}gEG_|w>oNl&04AG2;PD;9-o#wK%R1LSpR+QqzryV~;H-;;t97(=e*%>vkIB7)S2C~n;NxC_ Yy}c?R4q(Sk`=n`9N(FVq!hQ$nFWJ3@Gynhq literal 2163 zcmeHI`B&2i5(gEfM+y}@hyn#l6cKUdi&@IGq7YGzl^{y8TnhM2AW`nqKt)0;ln9Y4 z0nuOtgg}ub(8y7xQ7{GwN3sNg1`}Bl!Vwk;chl`|U;lvqxbw@*do!QU%$u1vW16e0 z^_wUwc=%BdLn0#25`}sCuZU4^c;Jw2!OK(6K*2VfewN`UP5O#$X!k&SCn|4ulIZAkbC78CIH|Uh1SPUkZy&ba!UKxN}s|XnJ-4x>>1B=s`%c{0?`ymfE6jLMSWlB6w~Od z&iYuys+IH~p^3;A3A4s}fHSt@eUb6Zd?R%0MZEWulW4T-;tju1$G-mF^ObG^xREYH z2c#?SnQ*VS{m}i#te>ZsQa|pYDf@IX4W}C=3-bBX*AiMmS7(FE1T4C-i^eW@$55MP z3-K|g{EXhlC}hZo8sDUR=lI0@dO;%AZiK}MX|3n6wgyN=4GCzyeX+ixp#u1H%Z(Re zb-Z5i-JP|@m7avLv58HSeAwXa33TsTLo>VE0mC%%rn#@MxG~YjM$D3_fBL|1wx*Fj z2YQ6$odqwsgwC{j%-8rHzt0Puj;5CXL5zPx5oDd>C*&nQ_v}k&U?W4^!cwv zb2b~hd$5jg-l{U{Vy#T1Gk4M>N#)vy{bkhD?zFWT`&Ul6 z7ask7I$>^h>UpwL>uMFe&7Sn;5_wb->ZITk$uX({gpI+W*Sw^zGECWZVp7RgUWgv- z-9AyfL@ko2y;U>hp7`UN8y~oQDgH*$r-D^@isYSi^JeUX&+LTd@&rZYekLMUjj#R& zpKYGkXx`EI_cL|TpSvc%&3{n_D#K|=1PtXkDyX$ESi5ug8ttO90i(hzy2au|MaZsq zqUNZ@qbJ9vE?sgR^9pYN!S4O+;;B*SkDveLW>nZr^%a0=A-D~?=m5+YP{`I#%vuJQ z%{F$ESS1T6WAn(88B}h|HKc!Ti{kr@u*KJI;;#HFLOcAvw1-?hcxYv@Jt|w=7WGmA z28yQl${-on#BGqdW^9^K6i zI-O(_zw-&I%V?ZEs5mn+rwPD>A9U|RM73%FFLNpAc#-ctdI)s}DQu5F@@V z=0K{KL~t`$P|{g4p}&Py-!)+3zwvXr3Ak)($0RLVA`FBuXJjXj+CXXRVFDYQhep=i zb^_~1C_Sgi#Xx!sELv^qr#YTno&DGWJ!>!dsR`i;>Jz#ZR!#5oZ^i4d9;Bs8S@eez z5xvX_z-)BXOO|yYov!Eb9^)>Jro4%(EkWNo%zDp+aZm^zP2FAi2cLW$OpJ+;IAc;5tpOKYqLfOQT)ekH)< z>U&-pNyZJX<6`k2Xf=9QIxFeJmrrUor%)3o)P%sMZF^yPzlsC4ExdFBg>e&u<4Q z2DgYr;eP%{5ZBDd4rU+-e)oUJ|5{@D>((mo{<^IieFlKKK%r3aw;+%X007fKp!p$w QrCZuMvD*)9BDQJ$0(1W=vH$=8 diff --git a/src/main/resources/schematics/ruins/ComplexHall_SK-AnchoredDescent_Open_50.schematic b/src/main/resources/schematics/ruins/ComplexHall_SK-AnchoredDescent_Open_50.schematic index 60b443ca4207a09b650f5b249966664b67f19907..45d20ab32ac6c5d0f67628e460f8a940fab6e1b2 100644 GIT binary patch literal 925 zcmV;O17iFiiwFP!000040PWq;Z<9bA2k;+I=-5OPH8E;5Gd}wd?9I6uO*C25WRJ_O zy{(r~x&RN(zuvYh?H!aBI^byc{k*`z9bwAbDMEMBfIsTtJt!fTwhcrRz2x z8#VUrlRHq%4cgR8nP#>;_7#7?!3J%rAjfNMeZ1|4Rg5->zDdfX!p>hcqEp&H=^tC} zJM>TUJkQ2sxHkFA9fV$(C#Q%I>n6|0HWo7a6kW-ni!?EG-@s$F;?oNN0000000000 z00000sGduEr$H=Y!K3NdqEMxjLsG#b_og_=xTnv`8MoH_J$(NAQ|VgIA{c z{5ik%ud%RZYA950^@ul=Ug${s$_=S^r`&0y1N%(N&x2I(d$XfdB6zt?<-yB|c1kScwye0@<69lgb zg4d+FnB2;*xYOMARf;us-C4hTinWus<4w(a~3S8H(QF=<4tnXTFH1 zZkcjS^;3chm@rSnNP~GAuF!4z0jfX)ywd>h-2vC#0oPQ(JQX_B_W@lDP?8>CN+lUl zrEzM=+J{H(LeUzGX&0%@3|xD`4O}%CqXJRyXz+Ub4R$ePKz)};j|x41*NCF@0jWN^ zSUc3GdrVWuW4JZ)w>ywt8B??fiESfxWE~qBI;!quP$DAEs1rC<3VwP40000000000 z0000000000P|uiM+&;LrYx7n3Ytjog{xWg-FMG0FG5vb!EGA?2^qalp$z_+pRoa;8 zpIm;QjM3~l)88-n${n$@zrkD2gX5pz_$)a7-VR`8BVO)}(AfEB{&43m*eipLujlid z<7#`y3qL1>lqyC7+D-CKQ z?n6@QT-fZHCA3W``lBsL& zOwGZYO%m}Y(;h43y3%KwR{<+NkAqfx`Lu9e2_>3ZDkaFErRD`{ffe5e;5yi9a&CpP>D1N`>TYSSn&onY_%Swrf+*}eRo^4x6%f)6Pn6nce?Vp(_Evq zz}_Q6l})1t;0r5t@F#nXREZgM;!~QC3zEgPywpW;Tq%Fll4rU%-8%};HQiIZlGT~b z-;#sTnuqGNKD}yd;b?b<#_AGuD-`uqGjd!f?uDa4?_y?Sqo?S@eWelJ={CLdf!^z1 z_Ry-UspbcOOkB1dEfUHZGSH2Is8ih*CdR{=4POh<-X(y}illR|?-wBGl2cH(L#k}3 zuZzHlS=V|;&f&?>L@&#AmwVtEe%lfp_Zc~#8Q_Pp&p&0YQaY|@g z6jv)$j|GyA8x#kx0TKbPa3w!Ng=-8!KjvKp2*-nAwFF6+1~|%4a|EO=kk+4BL=z`X zgt*FOpp4V%r)=^(ovOjjn-7O zcT6hJ_tp{B<5+by7z^U=6T3imjp1a+04 zXT~~Xa09#X0D-P>NDUGp@y-c!BZ(1KQtJlA=T%sxJ!4O zf0s6ww3^J(+If*Sxj3Vf3e;TwA?v#%@68{Hc{8DDXIOn(_?8b26;+I7bWUWn1Q@mi z){6Gk{!dK*T-;5z^>gf#r;f=B_^KSV541}VQ~qo(>lRsf2wd^a=?1#t+L|&=+MbbS7QmbO8k7$So9dsg*`=R$=%YvqblB|6Sjt9+9$-i7XS6MLA%~qZ>V8gvkPsBA2nTBZg(PS z)<-B*uW!7|(Bez(%@+m3^u(~2nNQrA$9^~1WJl+WxqWEkB6#ABs*Q ckrq?Hp56=w!T>t<8 literal 1691 zcmdUvYgEz)7{*ynyI{DJm(opLX|+6FQcRcr)6$yLLbNkX^MXw-6#;hBP}3rvX=J4n zbzV@X)&g&!c)yPXCqh`HA~5fonii%gBI~q1?E60K?EUh5c%Soo&U?;#9`k!!K!4A? zQ~;M?cD29V>2gpg`b`4Kb+QeKnXNutC%l-E9W_uQwc>CtGDN@c$vMA*g{3O7Q44MM z-M)cU_vQOvq|kuX_>%NzabxC0SuioYalQf zPXmE2mF2VH;V^r`(I&H+o11b^IVo2iNH?Zu+53?Y$Z?ecrhG(ydzEhNm!xSsg%amK z8CrBz!t8DP6Z=c(;tERed?dnu5;aCO4Gh`z0gX$h5kDpT3n@gX2n&b=g9oGM>kl=w zO)V$PrxpKEA8UWj)y_6OELwhK&7$=#X0T)2KbGL?77Zt`6I|}Q=RtI`^oF}S&|kgx zlKKPF@TmF;a#*zTbp+s}S%U$9ny#@mS%Sw%>l2Jts9o zgURB;yuGp(n=1svAd>#INQ5Aq6wE0r1Uf4ADd>RSJ^B)goC)!B@fc0bIZ5`Q_DvQ( zEPb45R+WwRnezL#eVpLeDiV>#D@#&grOEqd0mU7O`&fEIe_)%SXOd@DXOJmkYA5c zgXkru;VIk_=c!n>iJji9N;2(-Q}3R>BCmg-gz|02&7i(p`CT|CdiFS?QoAaWhV1fe2g=Gs8!5bo$cEwTv=GHoI51l(s+d0V!*hjiUEY%e{J>rUYLysyJ z(+}`#{U&K3{dqUc1bjzdI#`&lXia>z`HM*+i zX|&4j501d-a|6Q_CT~EX_@WFee)fS07UkmPdf03yVKtWg~n~@jAQS z1(nK5RUv|u@Lg-H$ThEYwA}@wQE7!bCz1#Y>AcZMXlVS5C+oo==4DI-o=G3Fz9vwB zmr#O!yGrTv%gVD=bz>2lhEil&n&sGJn<&ZQOco#9HLIg}@cESrNX{r@G#>Gc>>kRK zE=g~y$#Ndk*Q@49R5Lg}p!Kbda+Pf%@Nts{v%nj<&c(g1Uy~+ZGfCD;{N?Lh1FYc+ zojH>Wg^Sn8^2lXQme5#W6eqYv*-JdHIPp>?z8Q6!-kUh(WLjg0QJ~zv_fUkGGVk-Y z(F;2m&;mp)cq5PsYn$PDoLgq_TDA)C81x`u^zm-gNq%Z{R*cZ~wTJkE1sI*PxT9py zl$v?$PC!A712ax#r8m@5JT%<~wpJ=nmjmxnC{!->m=+(JNTKwe(%J4P_`<=#0cz|h m1U$K1ZZArBRH3`u!UCG{KQaBIt5?Q`6KY?)M_77o0{sQuX*I9_ diff --git a/src/main/resources/schematics/ruins/ComplexHall_SK-HiddenStairs_Open_100.schematic b/src/main/resources/schematics/ruins/ComplexHall_SK-HiddenStairs_Open_100.schematic index b9a08631c9f30862787849ba712ab0797c3d3223..10d019350106d779b06562f89f6f2c585d2a7aef 100644 GIT binary patch literal 1971 zcmb7@Yc$&l8pi*lD%7aObP`NU>$)^(8$y+|rK$*a+ELeP%Mh2i#h|32X{)2E>72L> zsaxV!1SM!(8%t+sgFj1#sJINel%%c^NxHE+pXQuBd-nP8p7*@xea`#g_q;lpiom|) zfz?7VYSIgqMjARU?=b2zR)HNuY~3E2E=??K41-dxVadswcQUw1=!^2X)%F-(iARGG ztR>?V%YF&s{<@c!2tE@m#6-@__d3N_^>h!K&#xGx2T9-Y5iWY=_NjmS_nAKzNEQLm z0D!|kpAY^-1%Tlj4E4lh-ER&9z~tlF5%tXJ13)|kz4--j_$#i-^m)w|GpFYzp6`R=_m7xDmo4vxhCQn0 z2k(f>Y~3sFba_bJ>$HbVs^%o6r;vp#=*czc(CzV^7|e%tadu1bi$mdN^xFfbS(sA` zq%_XMwNKY7>@-x3ZGP4;0ZrMScp5;bZP^@U5Yly*f>B6Qsl~xSRV%tvk(1nquQsK+ zNhcZ~Bvx4DUW8|F-AK~C{$pe+@DX+ur*sqjV0HDa0y!%;j0nNPL@8$~gv~cSQu_hm zoORFq`W&BIx_^h7fRXUj1kaDf-Rt9U4HIA~u*6uQLcrQEvBg4*)_3<-Ezk zZWzOjLNat^#vlOTFS^QIGZGuB1A2p-{kS7f1-Qvc5;q{=QktBM!=Xo0U;G){J~2-f z0`m$Pkx{wJeGM@Y>$%KdQ4c_mfh#rKx5n2zr0#Wd2Iv|o{}X#}^IJ)LZ4U~_tyRU!m?KMf&7|8vdDvW+9O8jgzzGOb~lbq5Sbo&Kci>&rz zD)cRn^WB14e%+e@Qu?^aNSAeagBHu7l{QP2UhT|4RJcug@bepGYIp>K=pnGB{@12; z)XlxY4@*Yt3NaY@;+g1j&9MHIrqrj3_FBG|Es5sfdasl)eqyU-CUF_MtS@_dzKYcHxvLIo4$dJ)wN+CFKW`9XnC_}5us#s}Z9A(w-_Unxh71$#;Dsy?2 zyPa1F8_$r{+KBhHbfOnc4PTiMZNn}3KGgP70fuohhc$w@ZW+|LW=8*2yE&zkhi8a= z_(j|fl^VacTY~#z?UBl8b8IjzWSd5Rm+&4WR(l=svTSmb!d|#;HU?`kc4zw@PFVP| z4G|C?Z;f5)J<+@BL`f-HY)Ln~`>g(=pu9jIG-KDkfYVDO7<02PJ5JP(Ekbbqvh(=u zd$_2+nlgQ1vUGArk)VP>`;sGlB3sc-IFFUBWYfH5#(G1@(6)lYET)G^r{xC`yMJ>A z30zkJ2hI%8&StenESiDi+v%CpT*NHq{%K(gQ&R@J^&cN2tMUt6RSC2RjC^<7PgF?@ zX@>HHYZPZ7VwHvbo_f?5%SUQq3GW7u;DZ$8b?6U$SMCoTFC1`syv;pE4BSMQgk@Ab zT6iC(BCT>`e5Y-e9G%Kme-h#bdq*1NE?RMQ&JK5xW;to;Ek)zoGknK=HWSF!uX7Dr z52jlCcYN-nW;tb!*0g|5ndIhis2&T`1Ro|c7xw<%ST3)F4fOTIy@2Dm`A!0Z0$Q{j zoDm{eTaPi$2%kx!~dZal%+=q`|ut>%UOikk`UaOsU z!a*=@%nnH}4mL79>E|Mgx1#ix0`Zz$)e?D(V#PbV*fclgAiWV z8l0{X#97QBERQ^0kA7YdDT}G&fBg0=^V%+b(C(L89xEBy^kGwZSD^*E$-H*9a9swj`a!MGGiq!)`Pqv3@LaLO|8kRY$~n_ z%?xz=g}mXq)e+BgB6BZ_LXM;7GUpWR4awe}-u|(+QrJ-4IZAJ9Z1x-1ZUj1%yc?fD z3GS}$suO=JB{#jbZu8`gPdT3|A8`JsK9e1_`!VjEw4|v1MyV8%f8EF7HB1ip7n)nk A?f?J) literal 2413 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 Cn^AlK literal 5958 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 EAADVu`~Uy| diff --git a/src/main/resources/schematics/ruins/ComplexHall_SK-RuinsOhNo_Open_50.schematic b/src/main/resources/schematics/ruins/ComplexHall_SK-RuinsOhNo_Open_50.schematic index da86903925ff3b3208f2cdf7f509a34781156b53..1e96e5a76e468363afb83356866f0accaaf69e06 100644 GIT binary patch literal 1514 zcmdT^ZBP;h7%A4?MjTc9Q-X{)9s z%#WpAPVplZL1^N1e&-b_Vi72!f!0(+QDAO&+u!Z)-XG6<_uli~bI)_{y>OPb)t~i= z)%3_f5~TB^XG&S{)}#2*(x9|hLLhbaY18<=wJ@?jB?LE4+itO; z=10y8*fExlq?g2mSYvX03ce8|k@GVrovcB%`36jT933xMK0WgCF3LzjUTmL??pNVq zCO%19_o|}Rdt^swXI z=OPT+I_CjE@4@6@F3ljSB1hAr@NC7cXs~oq%8SkuBRi8xIP8-*8^_>oHG$Fw9~-L6 z^7(~kB&i8bY68^D4fS#?qmMhsM)fbL6VeteVPNw8OJ3qkQ;6hTSTtHSsd8v#;Z_zL zs%KdcjqqV%bOu_(R!`~HQQC25*(eNZ+fnn-$Xe*@H1EHCCsIQ*z009)>u_3*uP{%Aw#^XiM;OnRt>&+%E5J~#i z{AOH10J?kkki=KmD=`z)LH>3~s`9P;1V07wC4DBx>3ta0E_w)a+Lb@sDH{{-$0 z`@|z{Q0uvGT?j`xiq{@>%*hWkb;RL`{od{Yqbs9dj*n(<0}Ij#p|j;@5@7knjZlPp zvUnkalhKuff{8F_=TYTNrb^k7nH)prLN0Jp{YgG7NvE?Om>ae60e`; zA|I~I@P2tb$HES}PNXnz;YK_5_ggkhtV)p5gHt0p83l(;fsLE??7X?M`%Wi?%M|2$ zD%hh=rG`RCO|aimRf?PLT~@;lipz17ZJTV`F^XDv$WgLL!y9OIeGTioIONR zz=(^?mkk*qGurwX0`r9K6>i~)WpI1iat;W!gcR+&B$m25uJd!6F=jO&wnC?CU?nFO zeTegPVa^+js%?^>Dnb`ZU8Z8`dTZuEBFklJvMtSV9n&Veyv$a6a)+ba=7Ky#6|UsO z50oRmEj-vNsqKG4`se#udBosK3^x&`GA!zI?sfbe{A&!dy(8r literal 1847 zcmdT^Yd8}M7?xVO&%tTQ8Y1`0kYYG4D@$@qwJs}G4oO&H%v>UuU*~*(zV~_G_j%su`|*C-*>W;}&HQLb1j}9H z8YdS;###VIpIi1;)h}1L6nKEk0Y|r7RE#zs%{h1=cT09ko}G&)KmD9F<&-5ux(SjcKQJ>X%hH}vFkPr5gn`oY&$lqd`392(AYPQ0Dia$@$_ z&a10K`FI~uQl>acma8c@S8=oF2a@qd>Fln1l1>jr_y>9!ErYmSJJ%iq|9;TF$FI@$Q4gx?Jc^t9%B`f*fs*x! z!xb#rdrcY-RFYH|^Qm<0``C(5ki{4tegzM>V z>zUzsNF~OJYj2Jxca|XuEAV(cA=$G6_zrIaOW`5sFOrUwUfG9phvHg^Kukf;34(ot z4ZEATf>^U~Vtx>^Vi&ghS;K~N9T>BTbA&IBM_vg-7abZ4TdKWl1m_bnh!GL^*zrEW z))^#m+x$dZcMKNxSZsECy!O5WPCX{_<_ibl*hn^?Usy8nel;a3V1v$Nl3xw4)`mAG zR9Z$edd<^>A)U-GmoFrn*9+5Q8Bn`U)!A@dS6l!p(Z`N$M|MhCuvM3wvvCa%k!()) zB?2C8)g8FtN`cEQpCpOYM1^jqjv%m^S54^D$PP2FKAaJ&GWh~2nF3*Ot|~rm9pDC) zHPC{uH_&u&O)IU%fY6%CNkHh*!DlaZZfpb;5%ZAJ&k5j26c7RIz@r!iemkC=>u}VV zvvT4uM-?ma--a1DEaYPn8Z+rS^gTRJrGovCglR`~z|O(>^CAcVkl3SDG}REZXzp&K ztmls#7NppsWXfX!6{H*{*s?A-o@IoknpZ|Cc1yZ>>05HRGLh zgG;?CwyH}Ketph0Yvd;gt~#LLSyHp{4c%!RgqoBPFgK@W6ucOo0y85 z=2#K@9J?Ub-B0jxfo$xVkY-&)HS{=KX7vRNrl)d>B*%xy4pYYmHLtX%9yoa&I;O!b zPveLTI;^=E{3)oJ5S)DrKC(^+aT>Jay$4?z#95exEUIRBgX7;Wi%VzvobV`|^b-b^ zVUH*Z2N%{RFDg}LGWGQX1@nFy3dwJq;k2ISr}|3C-&HAaV}d6eC2KraO(MMrU2H?@!Gc5JN>(u9^5poC1=*@U= zTk3xN;%U1Tr{W-DQ@&?C0(6e1$T8F(fvE@MZ>13ckKD%$fLb-(s%j_H2iKV+qt$c5 zjebOZLOauBqZQOL7AaCyQ==&G89Lz#Xv9iwCW-VL+HKLfUe!{&#&?ZO+YQRoZX$dR z0qW}NqO)}8dZF6#^76`=&*01ieSQ7C;3gGiVJ?Z(i;;8K+lg>OsY; O+Cc_m>(okFnco2}##{LS diff --git a/src/main/resources/schematics/ruins/DeadEnd_Balgor0-ArrowHall_Closed_75.schematic b/src/main/resources/schematics/ruins/DeadEnd_Balgor0-ArrowHall_Closed_75.schematic index 12855b2ec04aea0fa529522bb3c43363e3acecb2..75295d365df799621af82bc18a2fa2bc8544e2c9 100644 GIT binary patch literal 1986 zcmdUu>st~C7RKpjGclXHvED68+(sA4CrKGE;7;Be(x_Z<02NC`MZBeHA!+HDcav=K zmb%&E1sGkx$<0Dd!x6b?A()!dNUWL~C?=Yw>$Lk1?6aTt_u+gw=XuUK?|Bcn=nKHF z>;){2hbGowt#2;nl$=bPQrgNJTUjsJQwyM#)__j47CGyui;fVo++4T|m_NRduyKBa zw#PmEa*s7AzeK-z;*6!IE9%Y2_T3*HsbC|Beo*)0x53TPw-di$!cBJ?l*sW0BlHFD z3=IdlO@6EZ0PK!Ar(p-(G}t|W5w8+s0{Lq_d!tBg=k8u6zQ~T6C}%}#V~kgsO1TCr z9xXKn4F7ij(j~%*k{(0}ZWtRnjGr)6@9yyr>WHAOX){Ah4jLrbae@u-j>ujWGJ^KJ+=~RZg&#gt@F(2jrrBhW2>qFOiMR&rJ zxGo7`IOMKYKqX*~pb4lmw!x)*G?uV=;xQcN$zNI6-n$>rT(}T3|4!6Lw$&C7lJvy4 zlk4$Q4daO(8?U2x_4t+@j>qAAyVDJ2<=?eFvhUuf7}a;@0RV#{b1=+@JlL*ra)yYH z8nT`P15V5jM!hEO`h0}{HQX$&8&-{XX$Xx?KV&I=w8njiP_cPNgP!VPVS(gsys)gf zpfqM>Vp1~=Qub^HUU@$CoL}QiNA7aEj@kD{9iZcaXq%=qTACHIAh^?&-zu~IIq3P+ zfG*QHe!{v7;Sk&|ELGzh7p=N9uYUPhIBO)DNMwL%)R^nhqpP`dubLozJQZ#=N~Z{o zzC51Q*%a|JJa0M;t!ilOS>uR4^jS6kz^y?^&E zkE>>Puvy^H2woDbeZq%$h6rSSjC;Ur6(VJnsgxTJmrQt=;ovTSv3D$LEHGYlH13*`As&$qy5Ze3&j&rkn85yCDV)Yk;Ht1s@v^D* zSpwLpXj1Jg{gbk}xJoD)ucNHKci>jr82)C(xZ1uZK+^5eWb;^jzv^a!Z=-1&gO7+B zyJt`T4jIcyJ^l%F_Z9{2L^6fPWjG;e%n!Z(K$WV!moqM4+CkeI|L~rFXx@&Dfl9J* zr^KgVbf#)1kgZunQ46yIs0jM$MB zGw0KGnivp<5RINnHWGRsb9M0ue0S~T>DSSUqADL#LANk3)dk|tZ?AoO3?iN=_hxY9 zfg~>V&{mxzlJCUZLbFX40&vyBCf6ZGNXJ|{C$-+hQ@lKyDzfn4QGR-X&94e_B$sNVp#1Nh0UYpZ)Kf6f=N@Ev0H!jiwzqp4yu%9=TbVU zWZK?zu;AR%J)FH9pPLb=k*y>!GNddiTJU`&5O<7(6;$FPYpONmbB{z76`YX&tY)zT zoNd38+d;x<3@6cdILWWhuJZBq_3f9C50Fg%ABtWvJ`cQ_58ru+qT=FWj=cqZ#|1k} zDDQn%3j%?}q5CDf0hEfX#`h1bcpC&KU2dpGazJi}hVqn(;p7ml!m&Sk)bjo}#B*Ct zC0vc_DPj`JO^+J;XODB&TH9A*6O2A(iBcCf0h(dYRrjTg-mko!*g2iI{_xo-QpJ_( z+Zb`j!8%%8()AP+w>M9iynO4ZalQ89W+k^&`;Q#@wL02XxZe!$j%TfB-T35mN^M4j zn!gsirFf9?>AE%T`d0X5RaaaLF7EN`QWb$_W;Ow)e#7YNu1mcLV+fR_C_W literal 2421 zcmdT^`8OMg8clU{OPBYkoDoz})rc_m>d>kdrFI&U5}hF_iD;+Mu|%2HB&BJ(kxUcY zgo-t2LliaXC=VfuG&GjjDwd#@pwf~z@67x#f53Y`y!*@doqNtb_k8EO=jv1T0RF@R zb0l`i4NN{Gc>*!IH1KBXZYKKOhbeonr+ix05<5N-=}W_Xs*aaSi0;biO!4`owEF+J zg|zt(?JPO(``{w3t+7y?v=aa*aW?QrQ`O9BhG$(SZBg04LPKwmP8JxCJS)i52bujhft{o@M|fb)g0hY@ea2&!s*+xT~$ zR2WMgZ-svFj+t(HKdC|LN#$H;U){HG3~P8q&ac!3ou)1W)B)A`OHv(seBbCubn7eo8N)) z-QP&E-Yj*Ll<__rTCCww^nd9)>M!T01A6v)6?zvzzL?Ciovr6N(9t^whc>4T006%O zuF1M<_XA|_z2s0Eb&Sdo<FtIE9CzC2=fYffMJPPIu<5yn(s zB&y8;j>2PDWHHSxU!7WMF!41vu}{r62Z<;jO}ID*dRwPl68D^0f$4PZN%hqY-;_;D z1gbTWM7ZfoIV75z5Kl$&609#LD<0;-nr0^&<-w~{LWK)2?UR{x`t2F=mZSarjNb1R zMEBpnP2%fybZmaWu6zgHk6*%WioRc~%TuI2wFutAS8eH6nV>K*A6{-s>?=@{a$w?E z9Vq@Of+u<_pHb9%6q{&mTnV{aoNwDZyBb=YvilmFa;W^Gw!;mjxV3d)b?Wm&dqciT z^7_CIKvo6eBx?Kp*=Q7sfbDBu%Nl$76-U+AVHRJKh=575KlnBzmJTQaL!dQl2GKCF ze_o~81#6}z>P<9fSuhx-6nI8=NWGvJ1-@tNkIHlCukAQRrvxIJdOcsT;%HJ%b1Dsf zX53E*Mo1SQ{cK^J*wvY96NYHCjI>p8B+rX%TD?juh=ovKpC5W*ai~#_&;3oRyL{#s zhbMh@y9;nVp}_5-=6mKv~Zh3rAVGuQGMAhY!EM>OKjtzOeW!uD_2 zQ6R1(z$c5hh+63GgjD8qI1wULWtu$D#Nplu1m+>@5qW&hZ}cPN@V(p1S+bLP$W8^1 z{>39V2Ce=PQexKX1q6NY>1+(woRltJZ1op4AcQHb zDPO5(#<_`MQ*rSxr8k&yq`AO^85#+m?S}S8Ly4e6me1VY9gJTWP#LD>4+7$F&N+;^=@Gt{A-s$A91k>$G{_=54;?<4zTj+-byfk42o93BvAz?A> zYGUFEMs0lep|D13wintOlTzLVlqe3!k)M%ilD@-m7_ZW&-o=H}-u2 z#`K=;NnCi0;fZ(KmxnJ0Sj+LM_pxmeg^UNIa|5tFoPmb0uc?`G%*)~o?U|}aYNska zG)=_K1UUB*BC2-_7Q2E>kH*wnWKvzA;LO|fnpH?-9LlPiqSYHYP&n0>5t}IkHIi54Xu>rachY8 z;NFdLjBU|lL?j3qn2j#O?|NK6?mj7yHMi>-XZw9_7Oo#Jj0^l#dmVm~M?~3+3H?st z28Z1Lra~GZVTY{-*&CtBpM3Q{qGkfwSu!cM&CV`68VL>MCe?aoljyxQj}Sr^4D044 zXv+~!XD0>j{ntrkGT99yQDcz)f0t%fBnS)!5AN)5H?smBIB-A+qIMZ_d;UO7@82jj Xz)x=q7G9U8sdj?AH8|wQYJh(OVP~YJ diff --git a/src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic b/src/main/resources/schematics/ruins/DeadEnd_Cere-FloatingAltar_Open_75.schematic index 3e9d65485337b42cc4cbef17feca6ec5f52dfbd4..7f9b422761340f3829da6d98e8be14578e6e64e2 100644 GIT binary patch literal 1616 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 K4w_fa`Tzh)O%OK# diff --git a/src/main/resources/schematics/ruins/DeadEnd_SK-EyesOfTricksters_Open_50.schematic b/src/main/resources/schematics/ruins/DeadEnd_SK-EyesOfTricksters_Open_50.schematic index dd9b40c30d95fb90834ff2962b068e420c2d4403..5c7c6110d08b00ebc80198c6f7d4f13d86c80b78 100644 GIT binary patch literal 3963 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 literal 4733 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 D^t-}t diff --git a/src/main/resources/schematics/ruins/DeadEnd_SK-FarAwayInTheDark_Open_100.schematic b/src/main/resources/schematics/ruins/DeadEnd_SK-FarAwayInTheDark_Open_100.schematic index 8dd9432f06168f7737371288d9480d6c920b2551..511aab2bb239bdca323117d492934aade1408c05 100644 GIT binary patch literal 1197 zcmV;e1XBASiwFP!000040PUPxZ`(E)hCkAhY$xstWWxp&#gMCA4EqJW>)H()&;i3X zpqGYfGqn);0Et`I{rXV{QY3Yj<%q6&Z-7n^KYepqWpyaU-JwC=Ep?No&q4uN+iSYJHL)YoXTBZeV3-O?k8_ z5osr#>w3)>v_Tz4pOPp0Ho(niU8h_5dET+(IIbQj=YM1%^f{+>HtS#V9tAntzB9$k zL0f7m7rL!CPw{aySaP zp3dky1VNCafFDF72!bF8f*@zjBfrq%#}f#GAPr1m^3#R~JYaD;T~A>8o6lJk_+bq0 z>u|U7r!e~~2${@wC2~1aaDU}&En{e~1ozE~#e4+hKS=%~49Mpsqd5Kx$=}qvMqIZ> zcvi%?HG<|5V--Qcd&f2(`3k-l;jfp=AH(h9J_h*uy8#CQK@bE%5ClOG1VIo4K@bEv zIVgC)u;Am0!wm)ZeX!&!cs>SCevUlkY8^ypxN4DeBsT~t)=wbXVhEOv#F3<1MJl?k z9%4atE<%!);WwA(AS3JOq^@%ET#n<6$VlvSNz#l&N=K*>$x_jEB}nPlv)Xm8j*war zB}olQ?aanv7z8{`dSIn?D>;*6B@^g`=50=Hs@P|XdE_^mR(6nd(tdK(dOC@AvhN<- zu9Fj{oC-}Tu@@q-R-mbjRT7AHwIoSpYIQ7-4$>~UR?1EGjq0P!Zl0Vcn!CW1))&9+ z%$;1nkc3>Yzz+`FHG!P6g9- zmBX!?Z`@2-R$Arw5)P0?QR(di7{7$31vA%qRBatyH`COt#dR&RQ^{pHOP9Kt$(wC- zT}fspELzj(I{j$MD%WW*iI%Kv$zZN4wF>r@#Efl{M9KU_?#0-6x#v2&?nI@Dx~gZQ z=5idSbcJ+{M3t<)jFe?opKCl}WnY(NUGu?|)lb-pXPH(}9|>LLz9lQGX$CAFv0m=H z%XM7~)AlS1TK5fhHP0DStTnOi*PiY)S9DydcWRTAk5o{jQj88Iec$U&RQ7OP7cS6s z_UwCnX^)CBA1x2kdCG@&UER~Us@lO^cjDB!u4<6ZQ$DckYI&q;&jNJaL-BysKI_?> zlaVd1yErh}R%hYSz84v|b@{JS4A&e=q$ zFW}ia*sw+9-|<&|5W$OOuwHJrQT*y>|3efkZnt;0e=t7`_-FX4$QtwQh9&9udI5aH z;hRE6Y?#omJvwCnFwq~y1-4nvciV{j;ruT0*9`s# L$ATTmTyX#Z($7TR literal 1332 zcmV-41|GBW*(hZi0GqJ+#~-oX5~$91+{6`RKdra!HU z6~OoJ06`FhLMZfue-T>O$U}S~QWEi@4&K~6B~F4?x+@i-$B~^8J3`E$9#T(Jg~>m} zI7zI*0+~3aCt%{}u3BU_i13M6x5-TnG?pSrl9un@GkXohtv``vE5s??33{8h^hdfX zk$(7I7qwrI4z(XKJ>Ts*ftlQOr(yle*kn4L&di2t|3^l`+;e(&v-qBO=xAzu22;Nr z^wl<^&~4FNDUd`dl-#5>h3VTDNrgND6T4Y<*hHRc-_TxHxDQ;l$FR*_R29tkSAT2)u`#ZJJ z7GLzXxOG}2y)B4rk?0l#Zr^1eKNM^Djy8Y$^z_5?Uypyj0DSXpR60ve61y4~N=}cG zl@wO69I;b*nI~GFR_aQLP`RAe0i`t_FmLiBQ3p*G56wk0kx3B6$)qml%eqVI)MTAn zu*#m`L^`WX_#gH)si)B@EmZ1Qa%sWRslpTI0_s}1DC{dcRm!$f8ntYytTwl$3N|JC zVY5l<)RkkVF1G_)q?I~$0x2+cg{E z!Na7E!SCh)Qm48Sxnd^_S<2cnH)Y9W$)(yrM&0YeH!YSpal^7%i`1$6#ZH}Z!`63M zE~IGNlptkpOJ8uA^Bb1Qqoghzl{$GR)wk1$<3l_Q&R_Si@Hd+^XLrkNLlKR3_sMi<~3UAlfLE{86VZ8_}}jho=@@ z*G}b-np}jedX~Sk%Ie-J7u;0~8MRm}?yGzHDP_e2D9xx6684Z*SN!q;teeobpm1H5>Lbu~OG7PtT-PImdTz=k+m&FcF1FKk4Jk}m&!*FL zW@$^G>x`E~M|x*6n(G>~f}Le$x9yUZmhy}Gq-&E&&jq{gM5T>BYX->&reAKU+**~o z+ISghN-^Hndcvw)H)Y%O!Iu6ftmj!~3=|_FMDE(NwwhtU`VpH+=UuMrdU)s$(WH?2 zrQYYPE!NrCcAHN)-2)9P&7^io^+*N1D)s85RqT7+iOLAqg>Zqcb9dk2rMoKHd}(u$ z&Ql)Rb!|^)->{>(?!;+xoo|uOQy$oLtsH6CvjAOpC=NL6r^xA?jO=mU#Sy$((Hv=5 q)ItL&gVPH#{*fw3jpdE}-j>@j=%in*RX~OMspdZ~y=;-=KQ{ diff --git a/src/main/resources/schematics/ruins/DeadEnd_SK-UnstableDesert_Open_50.schematic b/src/main/resources/schematics/ruins/DeadEnd_SK-UnstableDesert_Open_50.schematic index cfa3e00ad00c482f73739d7d122253e37e4d0e12..244e83867222ec72159518912c6a3b763c0404d2 100644 GIT binary patch literal 1817 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 HrKs=+ZD90O diff --git a/src/main/resources/schematics/ruins/Exit_SK-HotSuspense_Open_75.schematic b/src/main/resources/schematics/ruins/Exit_SK-HotSuspense_Open_75.schematic index b658c79f1e1d744615f817049f76aabfe952ef21..e5fd15befea51e8ce120621e61359d8779c58702 100644 GIT binary patch literal 1338 zcmZ{ieNfV80LOpM4cEl8ZY}3T&7F~V!|YITW@=?-CYhDtA$IBn6*Ws8G?4Tbt~|Xi zi`1A(PTQ=&)qa?ihMaP#KS@}cD59B~l0v@FlsCb#HEr8n&mYg-bN79|pU?B+UivZc z*Z2^4Ju1sRegf!P%wu69$vFpNoKOhrBio>xx9kzllndMPlnJj~`-&p#&iiyq9;p1W zhQU5e@I}87HN;J8GyF0W!4th z8OJ^Ki;X-?_S}|do9PGu_daPB2>S0_%a-3HLGwSx*pzuv=s}TDZJRJGm?(3>#-b|W zh5$ew%5YX6EE3yw$F`0}bC0!9TMtV1&9)+A0Z+X4#ddGnL_ge`V_>YAx5W3)@_yW_ z;LoGg>Ia4QmZAb1J1K$Ji+b~!PIgncAw#`etUH*=&!~5br-U-hi*N2y)#A~o z=?O(@yQ!BA8DH~^mwV`l;pBY3U%BH=)$;mrO_VbHmGr8ekDBb&afuF^R10|jFP?{b zsmH~1J!4r>^RzTWuhv_V{B9fh5t~;LLX~EctLW-gbXD>%2ZS*%dPTd|@r%MXms+YG z7%Ur=aXG~k&pfChZgrpSa^#NlXZAkmcOdADW_MVfw52Vcr-1|serqEHKjLnn5{WUNGSXHT*G5! z=64fE-+)J+pS38Y4Bv3ipp+W09I-+@Bo6_bP=+irUM+za#A9@;yr!IkJv)YB%)%DQ zHw#WZ(+(D8VhJ%kcX`I-E|R8R(L%U03(D7*XrBsco7h++A$kjGp|aeW!NyYWMFXm%C}^kRy5JoED1Jbv}*Vr!U<>Uj}RHpK`d8b}R^)8At7a_gScTP21I z-8*hjT1K;Mn-sik9JQ^Pin_hL{vi4*R;0t2lb8m;2KuFyw)H~<||g;KBA zRm$LPDAvE0xo!j1G9-a+wR7pV>VT3oC{#R;G{Z&8NXb>sbecZ1e61BF$_kp~L!h({ zUSNxt2JEj$OkE(^ryhlgzDKECzLfa*>cNlrUd*vQ6>l7_OjSBF6zA8)wGwz+R{J{J zK!PPUC#`c=&`ck~&Qi4AffzWp5nsS=uk^nD4*cYWWXqFxSgMf}oyH>7tOfpaXJ|za zaZQN@;gD;kY-}@n-G&I3Lu-9VRwH&zww6Zt$#e@5+fN>-5)N+|)2YRlbU)6B`L_|5L6acj$mvyFIg@UjJ?b9< z7fi3x^|SZfaHdJ^%pY^LD_r;(Ld3yFh-YsVx@9vM9h12$6U%cNck$9B$m<$cPF9-g zg~Gi{%M#h{d59P@_rtuDLEV+#={d4{(U3b-s4FI@LJZK@RMHu({p@18o_M!9cq-KN LlDua_#0S8iZMmYk literal 1777 zcmb2|=3sz;w|5WvNr#IxJWS@{Nx9@Y+xNbL^nMqvz}+5Ky;fe?%DLEpYol(#)FtaL zJa^pV^R2Sis^MeBy0_Ikigy-E{I8D=Jdu9?V?oW7ORn=yKD=F?e)RamEj80mzWZ2U zCGxXO*98e|yOsHysiPw!*ShwaiQvVuk^}qHm2S1&_y$oEt8u<~?xh_wFB*Pb$>r+e zvTDof^7ySM%TxWgelQlZ6TB$A{`xmo0l|y2l>YPmZ@B+ZSWt59{r9h@9Q*p)R#x~e zM3a(!%~iEF#UX5)^~@pQ^7w!{(BwYce?-h$LRy|4Z)GKel-B=0wY?;6A%E`+n8fXu8$M z$jt56@4kF9_{+b)bJudFc8jOMIjJL#3*P<&Tcub$yZ>LkMHYX*Y+O0>@7|I;-&|%Goz`b$ zt2TIj=}`Qi+qS3Qt*`ypy?wn!bkfx8700K=Z4Z%)NS(POr!w@)j5P_9ErqA2T7~_N z`g`HzoK(H&nzf(2(zic<_Wr2%ioI*1&3>v(ewsbozU<}AXWuthRZoBQ>(Kd_Z57UU zH|G>ybLKyLB(*y`Ug}fm`_@qBxS!Y7SLo~9mpfXW_-Io*-%qV=Stq8;N6o)i{cYtc zvwh;P+RyEqU+x@NseeZ9^*-@;a{K?Bjk@x+RX;NIME3K08-8^f+%V#n{S+o%XSOo$ zQ`kG{H<_CsD8?Uj3GZpu*QvQ7ruRo@^#)||H~)WasHwi4B7FGzH9PM4=F>I1t5>|e z&24;2>dfrJF5=wwyvYyqlOBG4W|UgUzqJ;qbY@><9cTY>sJuLOZFCd9t#+CxKKk{V zgL^D}N;ZB-e7pHWW%0~SJKAsU+iS3xM#6^@bd8_hiLT=`xN%sLTYg(_Pb>dzFE^L% zZ%_Qocm4SEb%Oj#S!f7Wa_`{rK#t-sDj)o1eU z-Wo1F*V#6=Mqes8es>jsbKY8e zZbpOnb|Fl8dG}^BI*+lkKO}GDwQt#Iqi7(p#`ughx4oG4&Y#(;n-KzxAa?bde=C<}H_uE1 zYUZ5rl(W$^eK*jn*Uz&xFFxpSu&>VUlEK~0n(KXkdL`TrwU zUv7QadeFx>U*`|YnNKYTW&w+~GaR3f9r8b*m#18`ro^7f?j{>>ThoD@YG}k-Jm6aBKIr+c0 LV)=|$u1pL77vx*Y diff --git a/src/main/resources/schematics/ruins/Exit_SK-LockingExitTrap_Closed_50.schematic b/src/main/resources/schematics/ruins/Exit_SK-LockingExitTrap_Closed_50.schematic index e9bed7c64bdfaa89d6ffcff654092198dae9b937..496d4cdcd47af62dc48f41d50aaebe05486d5be1 100644 GIT binary patch literal 1807 zcmdUuYdF&j9LHBGgmhB5KQ7ZK3Df2>tdw;**pUYzjSRty4&Y)MBdNtVlO2anid znbX!3BTCrJI5o>|pJzWT-HMi#| zZP40LsufSmSXiU)-hnhg$R;#wDrU2~hm`LQ_oG{t&<-iYDK+^F^E(FwdpQ}sx)oH0 zs`$AG%bP+rDaw#G0WmfcOAUyD>~zhL8UllJPy9(zAikqPw)H<$9PY{KvK0nKP*NVy zAxpibEF!mVRcwcltB)A8q#d-Ov1^|BUjig?aCMBuY}Y*Z>CwoJ;c!_)-C=Q%+;`LU z7xpnAcqbObVkOS;2xa5W0i=xp?^07$%mC%k10;~$8!l)NNPX-NIxG3inq7? ziUfF;iNl34N@x|3q*&&^oY_pneMBs~=_umgjM^`504@IcVAV49?y?p^f|+}rQEIx|+A@Tndp#x?F4s2? z-Cjx5Yxk}TIg$h>eVDpfRGny)Np2EPSY+KT1S7N0UVU*4A7|~VT5c~8UT{{;EZ?h# z>Fsbi71z@{SdjeLk!SUa)Qy41cLO5{TzwxgoWX?$dZXh zooyte4rL>AHxC8#9BJdfPX?a%?2DbsEmTz!#C4a zQ0O4E{u(*Yx5Rc{z@H5xTy(SMR~)2{?(=yVz= z9Yao6JWSfs1D$;T7|{lH681(DDj`1O7Y%2);q?53-WyqvX+kB9Bx{)YaWDe|ma*=9)A=Gb0qvO9_3o56|6ED_UfyHxJ+nT&|q- z7uqQVJsZ{6cv!C=*f9bRWkoW(z08;#!92m~>uiGO<9WVFlO;UYd5eM$WvJ)^fgELy z=ya~e$zV^Xg>Tnjo&aL?gM+SV%AT<3Z7sFNygo)r_I+CPCnjn$WhILsIa|flJwv@C zq61)TuR7Bdl z1{8o|iC7*t(lLi47Pgsy!A#HZAkME>b8p}7gNV-!`{x3UNBDd`jvQq>Z^@5-V}iwE zxq^o}%e%1fx$RIWdjK1#zP1%gO;pj<4TynSZ6R)^h!9t@v+u+Ip`rY!{~t{1x6(k_ z_z3m&g>5DH_Uhjhl(*gzKEKXP31rLwH$GB092b|>#JcQ6XUgO@Ib^{Ca!vC@()>Z! z)YSv?9ihpe;Ky^?M#ehYmO4Ur8ki|US5x!ay>kt}S`fR2n6nOpNL5a2ISJpQsU;Wp ziOh7owENK`qak-NvJZTQjq39erjogwamY}DzD#aGXB=J2MZjH#6c+PW-+IsD)+SPI z+jwSlmu>`L!_3gv9lN`A_*jiA2(utQ`o literal 2207 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 s>RDpd(rxOgo~~0by|!sgl%P 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 diff --git a/src/main/resources/schematics/ruins/Hub_Balgor0-OmniMaze_Open_50.schematic b/src/main/resources/schematics/ruins/Hub_Balgor0-OmniMaze_Open_50.schematic index 077e4e70db5c441e349e4ec4145a524d1ae73b9e..56aa6394a0ec2de0aa599e896adaf71f03259193 100644 GIT binary patch delta 6506 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 delta 6593 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 diff --git a/src/main/resources/schematics/ruins/Hub_Cere-GreatHall_Open_40.schematic b/src/main/resources/schematics/ruins/Hub_Cere-GreatHall_Open_40.schematic index e639e589fbdb90122736f608ac7b7c37f8a85431..4f9f440fc84af7c16cde1cc61807647b9f6525ae 100644 GIT binary patch literal 8066 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 diff --git a/src/main/resources/schematics/ruins/Hub_SK-Claustrophobia_Open_40.schematic b/src/main/resources/schematics/ruins/Hub_SK-Claustrophobia_Open_40.schematic index c0471be79ee755b51706b9f3a9923e5c71402a4c..b64e031e01fbe0aa27947881ea38232f34882341 100644 GIT binary patch literal 2394 zcmah}dpy$%AO1Nxags|aMZ@uyWJ{DwEb>t&m&B6WF%c>JTqbi%3(0Zj9J$*{n7d(? z+mOp#61ik*a|!JbMz&_e+-CObegA*o?;p<}-_Q5+e4o$fc|MP7q9pKR!~rgoho1PP z_-^IoFXK--4f{%&OX2Xy#<34kjgtYyT<}tEgRX!cmt^35<(Wh#iUH$De~WUwvUA81 zPERA`$8AOHbskq18eWN^d3~8~V+&Vz)i!lxh#SuL95xNVk|7ywM)iwum|`v<8G z4Go`M>ac5CiX>|T0KM60_l7Oyi#Tp%Cvhu`W0`3k@Uoo;~(E7WXro2s$#F;Se2$}%DH%^sFg`Da?i zrhjweV@Mfoq;uz5sL@@N*cd7`hI>c<#)*nf51m#OH(80UuX}rc(cO(C(|{KS6D0Jj z#Fvht+$#IoDq5N6#Lcaipq0C+8yc#fc>;J32D+0J~}eP zr^t)voe(bXnvxtcaTWNqKzY^qli^7x=S|>poGzRlxFh_t!8h7ALbnkbVk(eq4@~pq z)XM=KksNOnKO_-}H(*#O-d4Djab@JLRo1(3;3h&NEHUFt1jJ(ct!n(H@*-vS?&dy# z6FH$d?~voL)0Kj{{&f=4fM-O6+0*r-vg1ad(unA>#GsPB6dXdK{?i%$NF4Hh}3*k17ORUWU@dPBb5;=r$tY7#>t$tOS(r@VpVS zvjn9bf4G#v;0yxfu4jrCbT+G9dU9Vml?_X{;TSL<3JO82GP03yjs>4iWAL-%3m&PcdJMoywkAB(nPT!erq|!Y353R zanPFu_lUeG(ESEI?H7K3J}yLVOZ|PyP)z%J$2lCQ2Pp* zll|}|COG)Zff6fc8LLzrZr@&JVL5kL9^gczql_OPQGrh2$XUZAVo@dZvOTAt^v65Eh4(t z)YiWc4J7ye4KJ=nmpNl4on_i?v*ePF^jqg8OVcl$oStt7?&C?B;nij5$XArpGZeIN z*-i!MUh9@4HUm6YT)&zIce;Q*BkbIO1~Q=Fcz=O!3<;07H=0wC!qLkhz=_}YnkDQS z;}p3JU6$qKVDv&n@B>--*1A=Yb!0@*k1{x41)+m|Ot+M0P;4v3v1+EzP-}Hdjn?** z;vS9k&Ms}lf>X7E$!&uDNv(IMBdA(RPBK~gfeuFZ*5%UrJ?jNfs6>ZCt;OHVb^$M( zZW+BOJ?bFifBN}(gCT;m(WwPT8)P(VdJ&3^)3Ye)*}vMaHqxvbTsR5SXdA1tH!5Z{ z$8o=zH3m;CKN?0ndxiZI%p!l_{Zl!AYGaUIi@Pf7)*+lvXy?I-C=em4_J%0_R@X6M zP6X^3J>AUcP!)(`rM9%QN|cw>Y^KOx%`v=&I0u<0%HLi=9{<(vnO%B{BR4jE>p}RL zkHp0xJS}`p8zQzLP)KnU*sPmp@y|FJ!+Auv`-EyMWP>0btnfpc2}hZz{TXdX1DD)> z_DOXrbDDzoDsmFn8-K!JEN7=uKTl#-p%O*9zc>F)%SEsNhvgh7wpOpMzu*+t<2{{_ zb^|6M9H$#xz5fjx8!Cojy=%MWZ{Dr2)KPE%x^ z>;4aiRd*j(n4H8Bw34O-y$I`+;Bss|Da$Iv_K)nQks%w@rEa_2_vDP`Jn4_(3a|Bi zVHN!7MMD!#~LKKD-=tK_+YXYIE<;k1}Y3l+Pt#Htx4T zB%TcF2}-vU?O6BqKS}0=VU5(7BiB@F2E>JYQ^2RN1<`r zu@QYEbLMJA&U8?{Rr^NIHk~qNj*FYtouqEyJt`$0+~_*N98RGjqXH9$kCZTdiF4GT zsB8y+{coJo5lzR*f0<}5nET^OgV3LlH}ytaU=2ZZ&Jgh?Th;7)=eEW#~oj2^ zrTBL@xNbTw?|Dq7MS3Emgn4rDR5bTrTQtbZcK?!+lBKbAfw+*RZ=>Q)>xp2`FOM@w mFDMwK_yFtOwNM`gllVtXOa;^AV~9TUP1A!sM^x{M81Qe9YsYy2 literal 2514 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 diff --git a/src/main/resources/schematics/ruins/Hub_SK-FractalCage_Open_40.schematic b/src/main/resources/schematics/ruins/Hub_SK-FractalCage_Open_40.schematic index d66f82afae8fb11d004c309d96ba871cadb0e5ba..b6d1279238e3317cced2e9c8831ed056b0d04dc7 100644 GIT binary patch literal 9128 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 E0M~+x0{{R3 diff --git a/src/main/resources/schematics/ruins/Hub_SK-HeartOfDisorder_Open_50.schematic b/src/main/resources/schematics/ruins/Hub_SK-HeartOfDisorder_Open_50.schematic index ab5e68e5afd81ecd48ee9a00a9d385fcc541e48f..b376e70eb214999bce8d8372fd0b27fe50b4b001 100644 GIT binary patch literal 9094 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 Q@exyP{u@IN3pU{Y09_+m_y7O^ literal 8974 zcmbuDRZtv2*QSRMBmn{gVSr#^kYEGBH9&B8x8UyX1RofjV8I7>9T+@Vu;A_%Jh&5N z^VR;l_1|o5)ox$(Io*9upL#FfhZ2Sf_@C=2OD>M4-}$R=k)=n&x0_8E3MI}Orw~c5 z@vXQFy4???4w07_or%!}6hq&oD}jN*T)?`Tz0RY-~M-HYQ z@GHkgRS(0k^JnG7<#)vHIr_j4EoS3jToS#_DFIi`T7o=WX~Qk6ID?>$Hf@A-Mba)0 z6CVD=5~gGNFqbD32@3oUz4UVW@(>pnSK3__?W-cnbSRE#$N_I}Pu2+OzGX2kcARFz zKQ{h&<)SYDFZoy?G($0Y_`9et*uIJQ{PicFKsF&h195iP{(Dm0;JCS%+)JWMVbjQPoK*L;VF5;|b`aOc~w&Gn(Z#EfY;1g`Brbz1S6hf1zu zy~U9AA#j|dYqNwAHHOUrVuw~fb%I> zR42yqSyZ>j6Bk+I5bwwU^C&MuKo^#17F^uZuNq1mOE}`qseKe&2WQ-6z8j?K5K`Da zWLAac4HP?bx>gnA#iDZ3?EhMtQNrZsVEZAC#o4izwQ$syt?IM5CHJtF=vm z(5?dQ>ONg2WY?~|meVJqa`h}jKb99WvS;g?8B{|x*6Z;UxBR04H86mNvAU_ik=W;( zOXJxJ7BT^%v+EBAYkR}%ngy0|OYh!#ye;KcoY$z}(t=pV!98Dys6@SSmq~xwYNl3N zFF^W3p5^lsyYwKO)mv3fIKAGMEvvC~7@qaZ{@#foK}*li^+Bx#biY4Rp}PwDAFW~KE%oGMnUZcajP6S_ z8!@~OpMOx0sxR;NConGGs|U?>7=u*4$upkNPhbOnbfaScC|Oxq%N@m8#d2=zujWQh zG#GbrRu-rAL#M@@+Jhuu*&y zE)9GhTkBhg^roluL%G3IQN)-2Fz9X08;mb)c3DOBXXrMCd+W=0;!j=P3&f{MzaUtB zU&$48mcGpj+EgX#FC&P31b;RW-y3KGQ-2j8!gT=vVNKuc7NjdDge@jjl4)_uOuGp3 z4y}$z|E6f`fTLX@T;eAr(7B~QNiel~S_~6Pyybb^XXrlo!+J-TTai|EGH2&fEs{3t zKx9ycQm+k$R(ZH3*1fOK(`+xHO|$amk0w{dw*rd(_8`aAiCpRGi~Ss7v6EOUEUvEd zeQ{!#vvRd2L|nmF2DbYL=LutU&BYGwWf_Pk{#{+BIg$ypA0VOvA_bNsZbHN+D?!LA z*IA}zrCN)jpg>i%_rA@GkJcGuBT7vlyvuj8W3ejgRdx?;8GVmqn8>7_)5N1`3!#`b zR^4Gp#aW>}YWtP^V={ieGx4|*C9^@o^tVrH$S@_15@CPO)dMECA@;iErO5J9y*CY! z#M#K~+^{nrz&wua8|8qh)?6tr%GJw$PYYFAVa2%Osu9)KbdJ>We3*vG%%TnQkD8kj zoxJU_Gn`>iumYzN`@=l(9?YH|{^>LI45lz^rj2@!3Og31su6U6Y^Bp2b~L?Q-aaw@ znN|WfX9DV!QmTlR3e`yU;r69b+u?JKOsn|hw??x21KiyvJ*Js!>yzdD#%iM~SuwO% zEEYN-eTIMwLfGF+{0%O|dI>lXHOHUT-+oiz;S;+!|J{4(=3RJffyWgM;Rb6}@o@1V zc)4>P3WLrD)PYuem{=&GvvNJMRW&xY1~cUINsO~8)ol!1T!Hr;930(jz?HWRe~m3d zL%^U~H5e^UNlT0#EFIJTRfV@zZ*nD0E_IpOYS#Y7wCY^q3YZL{qXTZf;L{>O#lS|r z_TM-}NHaua=uE#M?n!as7`1_*ljnZNxkP-_Z6i*N;hdcR*-xPlei`$pQljyUtr(MB zBJ~{bo&$zt9kv*ijwt!jA|k<2-u=g_wQPm3bCsm!Q@$Dllk@Jdd_zsUrRC z1zbZg8uu4OmYXjuMQu2Nd9z}B({>rYOjQgGE3WPD;Y9Q^Tb%aj%Aj^_{7UBh$U4#& zCs0Ne*bRX%LV9dc^bT~2Xv^pJ<+6Q_@l+TaHSO6a7xOAtpiWXnZeU5!@-$~;9Lk?~ zn@(x^iA_Pu?sSgepmV;WFnRH>O+hZ+!g&=0t(!tuBJT2tQ=FXFbC#chLPgY`2!Bs= z8@+x9k~uB?;oyCHEG5!W2qGi+ei!~3IMb-ElJ59~%pch*quY+{)5TF>scTRTumdt%-?tBfZoz_7wu#dKRrP~N(jlguiuL%4B zq&o`-9mvbHX?RgL|2=NTTMUlB=|})kIy{#W3;Ys;n31`*9`(~M)5yUltP=LUVtY%W z=b^YUMp>At?K0EdQ*@?;wmgIxpZw&$mZ>k-w!X7-VkzU*zR^~QIok_44SLMVN+HFkPt!F> zfEbxdziQHI?Fz!WcFXvqQ5vX}O$obUyotQ3Zh`@HO~@Hr_D65v6H%-yRgy5T;s+X& zz3jh4d)+{h5WsfMHIfdeG+b}B$&om>(P!%}A=md$opKVp4$Z`JT z-B~w+yGzvoCL?zNbS@Cy#y(He<+q4q%ciP4 zyq@hwy_f}j3(0#6JmcH8ckrm621$pzS9E^`wEgSUrsxC#r?t(Fctc$;s`aI61kMo| zW&4NoYJ1{V(`}K+W}ZsS88Xwh4=NHpInr z&mZ-U$oyUc*>K7NUf3x$PHkQ%F-jERkRLg58Le5hX6*`cdqk5k;j3}JI&F`Yfn6J78ofV|xx3{u& zNHLp~B!JEIst)=}5lC+*ftQHYyPVIV@#&a3S<3P}BSl4ll3B9{ zl>xSk8g>$F@YRQA!Uv8n>YY?F>Kv?r_a?HB|Xqsk9-YG}cbh-=nPl$|d)u4IXA3b$?t=+t-f?dCM zdTdvjnG1(o8H(Gb1a5tSRzY_J`Q)*?lGRs!0&z|0wCGN+O=oeEwJt-M$dlXvhhzr& zzKq*3StbBiU9WyXl3+pW3<^+nLJ=sH3}qsqCMHzj#C6{sovmd~@-;6ut%P64wz#0x zHRCcNz53b)3O3>4OlXErSI1lhL*q7mcRhaEAuuXn+_hEFJ=Nr3CI z;2`I)J#26TT+THoqKKTCr2L{*p4EgML_#KKa_$*DNv`Tw4h=6{$%|6Nt9oJUt?e=F zEfq2|+{4LYj$Ilq`E$VZf$|2d1zkp$tr=*uDZ;&A9FXhE%Wong#35gpKhz}z0PNBP zaEw2*IYoqybK&NT<_aFB|7Rq6C z_R)@jrly+aIDIXB0e}XVzWi78_3!4&cIVrw2)|TA^J+<$X&Hz$_4$7}P<=t+4<{a8 zLV`kcFkV3#7%zpIgkZ5BE5Uyi{K?q;ePNr8@yyyE&>&q6{9k?liB6|ar}cpkkGo3$ zeD1@>ImAdEW4*a_~~^TXX% zY5VTkR8z$67yp~Hh_U{jp69m5eaF?O$CLWoroiXJqqR={-s9V)CGx<4)-C_b*v_2g zGtUWufPW{}UQa*ge?g#<0{7%;d+Q|d?_Fz8wc(qS&im`7F9FXHjsZ748yl2Qo>}ky zKVA2Km;8Usw#TK~89v;Hrg82{Dv)t#Q4@x_1p;{Tp%e=TZwaWj(j_BpGK4gjdY5W@n9 zXnNRbD)|E0s5H%O8IR^@pM6h4$UTve`1)I=V)>Zm67}`{7m-9q<(y85Blhjl*%WTMBXt~YxSV9$b}Eq;HE;M9 zYo&r)t(#eABa!r<>|041N>E_cJPfZ(p(0dv+{zkA6Q)1S2+rWA)Zr;$mTt2~vhe63Z+qmesvsu@qJ%na5j(JEfD{zgy<*qaIlo#KKB><< zOLa)U5r#j5dEl1|Z?)K4(24K^d}UMpi-#PtFWlMEk?z&U+T|^4G{0iGoo8UL`9v*d|245NS2|Q?8D1qn-WOIOieN z;ETRt4hwK0wg3FaO72myVg8BH2;H(h6yunltMV~@HmjaB)YkHR|4u6cQ-Rd^ON9+} z2<(t-0nJvGP87U|4zjk=`;NhgUn1pbKMZ~4?g9g8#E%Pivr-?_7`HO8lV*W}oCT$~ z?iNJVq}*@-9+5wC`_M_6bjahNz`)tczPs#EkA?7-q40j@Eq8^|6gGpGr1a`7p%!z_ zaMy?Vm?HFUgO&^a^UW?b0xbiQX7 zqWQ0(^clRvB*tOl@Nb4LR{#6FHyLC7OU=+zBhIX;Z2fRK!s72={Pv^1Q#m`Gjo_JE z-6;69I$8+NOU%<+C21aJ5ixR>|MXal2%fr(aOIe5pVRNvvz%(zs(wD2@PYV{#m(M# ztmIcJx{mG`IBKDMZOz?Np40hZAWr~Vh8h+__sz`-e&@Fun%ra@IDRKh$#&12j8^1< zRE!CQ!dPj%kX%D062j@W^`X<|&QtJCHii|3jn%i}qt<79Lo$_p6@pg=SB+TQ@4>oW zF>1*P(0NchT}vxiEGqDNDaC)(PKDMyW2f>3zG_O5uAM(t$o;7KyTMu5gscs=Ln7DG zQC{+qfUP5i#fTwHh1ujDqaDOXm}I_3ktX%45EHW(@Z+(L8q2FiSr^8&_ocq-V2bF; zPb$T*cfMTRqBoOFw;`RZ$RI3c%TX7Ik|Rr)%TY{pbyM`~(|M$FUE)7pBRfrFlNVWc z*F?{35@M3E#ZKbmI-t!gdj9g6OJRLW2Z#pJm_AvMz&t_-%)q^t*;7HPDI}S!tnt^N ze@KK$4hFK`Hdd<0EUdqj{#&aj&QY7INmx(z%~aZ7t}Om=Jeh72KcxBFdY0EQK$%I? zRMQU}F9!1idD-rNeBz0V+*{?$yKniE9O|8UFm`OaQk5y$`zueKk0f|y)Wi35sO@ol>z~IU;usLy!RxDPNtLxSU!)c+Yz9Vl$1>4<7TL(a z#}CD=$68r+9P1mwOB{_4tuV7<;P^jA*} zP1?X0|COlPJGLnGBqh02lZ21*wGxc5v}tXEx(meBmV&(2t7ymwQ>wz&OHgXLw%tX~qn^l1#I>*P~AP zZ66*Z*Klz?^`NxykHPRcdS;LK@-i?El7@fdA#@BhEa50vh>OV>i}fNAA0AYVu77Om zO8fig(%XK9&xGj-d8eQ3N}6ri`?A5Q!N;CSvoBV)Kr_1yGM3m@sZApBYqX)>+PIAZ zU?XY1F)MG3Q$deJX!oujt|6o7!w7a;)ddpb*fjlWSrz9Z@rrmY8C~=Q7_uF52~`Rr zvnP)RW$Lk*Sl|jcN?bCKCN@Ia#raGRwY? zR9zV=Ju9lEV||@J?vNKb1cC@cR_MElld_fz^%aJ*I|Mp@dTR+QIF>_l!&)_cfWbDf ze~?C3&2TX%W$;8x)BuH9hLl{tUY-~Sz&$LBs?I9fBEO~eE5EPh0>QrtX(o`1qAF?8 zu5zry^ek&r#hPO!c-4&`$3&2@~X2 zsDoZtgSkR2xU{67dZ1g!tGYeM9RhMzTzQ@avN4}NS+;{1ww+qF1dROnN)ngabs^#8 zKc3Jvcth?;C_99nq#5BP$aFQ}mnikU4waFruqz)xNxB5{N!>8tq%mEtM0WZNg=D2H zyGdeH-S9b&?7re>JV_l(GZ;ew?comD16dcdIY-7t* z-HD&s=S=dxg>1)6SJ_Ug8H5&gY10t2eG1i;a#EJk9#_$@Ih>vy{G zval!)6SEoh>ZcH;)OSoo=c%FO3N?h1jNRv6Co_vE23|w1-`EGG>p%a>lMuHG4`@uS z^0839$Y&7Ci7oM7wHh+I;9AiI{3t5DhK1tKX^x(YmS%PL4lCOfn>`WT-MZ_0VSVh_2QWN_SC?kH$7$iOvS~a?)=NzG zIJ7_&Sp0-m9^YG%%*`D12>OyZqmFl0drj&W_9noWh0E@A>Gl)oG9&+a%g?s zG!QrhQjvJt4@Nf1r@b`Kpz#c5_9^Li`w~LW@dGlY-Wbo_7=^iD@qTR0{)jzZ-4x!i zg$D30xe;kPUlKKyYvXIsUS-oe%H+5SEfC0@JX^R6JVT#X=xPJQahw)Y!V^PvqfeUN z+L)CG8HSdgD2ijlj+v{I8BYAEA%>36g(aNhqLN8V<%2AzbetOEjkc&@{CvXW46JDO z*iFTmZdcC=lcSv`zv!u+#S8jA5P259yIt8Q_00&b<`?dF9|l2@7rqB+53eOI4|eUy zJRSugnyeDL_i8TshUvg0Djp<-D=OeU)md&!IrfzpA^4rOq^Jn2uhW1hAYxi3>9g-agvF}e-$J}txnqt z6(N*URF0KSpG&(L-fai}<|@c%ztyYTz*APOCAF$1`5i z4=M>iHsAtD+J4Zq>YMQ?Ukvfh#u;`p|GkRmvvjo4nZ#41k2m+NQ^O*TKc(G2I2bqx zOB?wq(tAFk!ggNwhtjGM^B;nmxiW)DIwOyj5;y%wFYcp!%X>B;#XQv8D|j<*`PnDPImQk4qL*$5_{tIC1JP|kC`!^J;=RQ@(h;r|#Q zcBb1&I&iE?tEfUAlz{G>t8*^;BhLYyDC|Ha>y;@8*fPZg?yqr6m$|ugd2jku` zf0a#iaYX}8Y#?5Sc%{_q;H-8rgB7sc11s5$lywWS>$e$)2`Ass!R}}2z#V6KniAzh8ymP-(j;7>U+@MJJ zFqxL=r7O!k6$srKTLehP&C=HWS?@O+mLFHQxX$pOnvn+C@qI@4e75q9-UrrGv-FMa zZ0z1B>C-lCiC2b#3b3w~*-h&;s=P#egz}o2dAG`bGh-03Q-W#5%3i8`EMK8gZYEgt z*nHg)jObgUbw+hFIgFOB`nT) zW|#7|n)gil`*pqC&m+^6T9^5`j3M{C7zpCQi}*a32e7K{^3kW2BW^ONHLQeiV-_+` zNe5mY5dSASg$ggpI{46mn{k3ep=e7jH}tz<(!^Cg)hI)k_svEN3dFhgz75Brt-tR> z_tF`QE_C2s1@BUL@1LIfFn&axotrN6V5Z|siimk zes|98t-*^zQ(}1}N;fmIP=spHbN?R0EJk}0+UV%v8!j`_r7)Xl^P+QQphl46hmlJ0 zYvRnVeJJC&NlHM4BX%vRJPDf(ury9P{#|O0YrGBa@O!2RBiDo($&XpI60o+6iIF2X zZZAD|$i0yE3K|#W+n49P4viL5uGqSPC zsFguCeDwK| z)Ts@5l58hpB9ADR*!a1>-GWKn0ku!LAa3N+*bot@iPOtGU7_L2c(YJ()1rw60FV~l zFTa>4k(KJ55jp80m)-mB?$;z5yAlvmDPv-MHQ(UFIXFYP%19A#K;&I|*ras?Z z^#;6JnS(5~THI@Wy3(B=g!gH+gSd6}xn2Njs7??5LuuBl22S1QMh?p#-zAP*)R*(Ad`_ zPMkR!*-e&I63$qLEQN$(FqY)#-1|KDpZnbN{pbBW@B2RQ=kqSlSN)D8%dxHN=^QmG=^HN}Zkp z3G;yM!>gFcs1?0wHB))_)a?9feL1D$c}`iGrgp9NH2tZ1z2Dy?5J<>TWT7quq6TTF zbqez=aerV3Gs%w4;kC$nbmawP=k0jf-Z#OF>V70J>aMi=Vs zW!x6?WC^~!CBiV07P^bEga5@grb9EjLnOEl@lm(L0wy=ltJC5O?L+GFp-@zO+wZbf1Qt|&lEQBdT<*# z$G+MWrSX*V1~S9Ty?v#gr8v~+N%AA#XMFgT)4W$?Ld{P7y8qHmZ1{?<0^QzeS3*;5 zoKnQkUydAgr#pRMckjjoTh0$(!w^G$IVgK$@N?WJFlya3xWgKH|3Zzwb(|b}${`m$ zc4<*T5;ea*RjS=#M{e4LF((!xJPL#lF+wS-{fIuw=Swplna}K%R#Bch0k-O!195dN zjNzOq8E^42I}*q$Nk|m?4uSYF8F*Ih zF~V&F2!vp+Hn9nGtpXJEe>U<@W|E#kzQ!&4wR&H~ka~Qz=c>h>YQdQo0j(8!XTDJG zWSDK9%yUbTapxwT$;(jB317Mh-K^F`B@@xU+MZDU-jcF4&%% z4B1l=PLS(Am=PCxNaE`932t36r9V?sd()fyZ7?8wBe=ECV>9fU2>7QF{5wt%+bVL| zc}Vc*jA3KNmy+|FnkDRZ3%jLpQ2~2}-#EUxjK^EPP2e>vZ`Ui=60adiL>6aB$kd%x z(Pl0TS(MmGN`5yDSus-g(Mt&NoHDe@45-$ddXsatyNB9;O140xkJLC^3hCN~+m_u- zhI%!-5E*!RcXtPgl~dV5o5ZQ@`$3FXY)IsZY*-@CF+|5Ykt$F2TNS^cLC}z#Pa6vn za|8~;qEy=+2z>O4hOnK$^_;f<(m23`BhW-yXku)G~qkE3=T%j200zaP3 z=2zrZTXklhf8@?^1owC;4ha2C7LMINW*J~=v5zzaR=mnZAr9{$mSWRrR7_q8*MUKi z595%`8Y*q4G!9eHf2zptCdLG#U1&O_0|<81LoYb4^tNk$hJ$woNw^yBGPv-g>v1pyUp)m%?biRCU)?|N=eVZ~-bE>7#LBaYX zOR3t+I7$EXj$q#ln`s)mw($Ym!kN`%gn!TBy5<00%=HztPF&;*%HbtCq8SBGsnkj<9XkPIq6oj8Gg(cS-G5 zZiBr9Q*Wk)Wmi*7VZC}BydnQ47wan3Q2#JhI-?wAZ~3CewiqPgU}@ zOCa7dk5=-Wd)WR0_ODFm_^^*?eJ!nEJ)es3lIN*=Dq|WK9L>1m&r=o}rAk;Vz-8kISlpz3}EUZyXP2NEP zxJcv98Z^lh@JQE&Qf20Y-2J#~z$r^Q9=VA{!Fi~@LC~oP&%xnXtg&{bHi2v()cYon z`yRm?nG6>maCf4&D8F*0YuMwF4q5WGo2eprH@GGqZV137pyI%MEY%J0H{ok_kIhC% z7SMkGa>|=ta}QT3ajdI?4Ij|X!0*K&p#Y5*ZKcu=PJ{xXHC1bOp|%SF-eDQhsjnUDMx5lr&WX z_X1KrdY0JRC^#0XCjC|?GMS>lfEDd*bAJ0dWQElI+=jhv?eKlSMDyND9&aBX5fvy- zWFw*(y9E-Khh(KGI_KPEMmVpr^2z8XX=qpx`eg*v>i_<_-a9@9E)+ODxJ>@z=BKgN znHOY^Zh6&{$#IE+|G1p6q5rCK6&2td zbaDC9%Es#eVRzYZ>G9?J#?N%F9J)TT_J^Q%MtU3+5z{AB*OLxJ^&&iGrwgVZ&%cTi zcK4R7*at6(PkVEwh5mBxLBWffRUa3ogB&ghKllZtrSy`y!;a~fpGIBozx!Lv@-^pg h<$|XtlUJU5uh*UJPkJ`+BwoF*oD)SKvP6nO{sLnQb;AGv literal 2824 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 diff --git a/src/main/resources/schematics/ruins/Hub_SK-RandomSwamp_Open_75.schematic b/src/main/resources/schematics/ruins/Hub_SK-RandomSwamp_Open_75.schematic index b3a086e0c80def1f1a197be52120464e8fbd6137..af31d9002f45c8861ed7ed3c7a0ef9b464e9dc8f 100644 GIT binary patch literal 2940 zcmai$X*|?xAI7I6aZab^=_%B)Oq&v+%`(;P}8OtAI&7*Uk=e#*Dp6`qMbAPTE*ZukZt{2yhh!TZ;XE%(O!NGBQ z#lnukk_@^p1f-e3Q=iSHMVTRvdKYBKICmA~@l2Goqkpq{ACCw8lyJ0s z*KEVrLq~&01+tMot2A2Ku31Eo+{CSOt9@)!oTgnaO5)0k?|@qSP*7$s&gM%NyOm2 z+=dA3MFrV+OUk_UkuA+RO@yZWg(IWk?tjXOxEXk;?JFUjkk(U z_Fgt!H*7$G2Bz_J2=OYem1kzmPj$|K?6UMCVzKuVC>l5tqKE7;QCj9Ee!D78hoalXz@F7@ z77n5eBcDnevPuuwBF~C9=Tza-o`g?$C~>2v)5$~THJBmwZ$v|5q2tQNtwQfUV|xOX zx`FDzb8j=CCOr@dhrv1z$z)m0ueG^?+k_F+JY&B601Ors^7%gN?|?7AY7P{*EJq{_ zJ_Vx0ewEnCJS-gZck=(dm?d24-1cLbq&#|Kwf(e}bZ&LSC-qbJg5!au+BARK5qNOZ zw%O?xOJb6B1LcW$Mx7Xu*EGN{ZN+mExm>x zHM@~FOC$$u{}G@I-{1Lx>wB=KI${Ws9ic35D)r=v}8 z564Q>4;O);uBkIh_iXU6?)GEX6_J0g=Km@|{DXVAfu>yowYFiZL+6HSjoskxK$<9v zy6s(LuOq|I+p(AueR$s!`zIV+i!b^+1L0r-MBCx?T-bfoJ^pkUCJ+ouSAHrPW`;$m zp_yHzzD8}dHT=F{6{i#F>SIVy*mpTa9!12d&Mv_#laOL6}k#%d`2U-7<0!$fNLPR#Gmj5 zny2-}R5a*hxaoC^9C9qGUb1nN8i1A%E8c5(1h-TEPmwkYp zZOlH*x7U#uNRtmJXtcxBl{}1-4M1~8^_AAR?cMswIv=Hg%Pe2V---t@#ol8X%$P0n z05%#>#_3pQl{BX_C&*O#HE|8Vs-@j1MAkQ;!oKA}yShYa;V1AHZ$X;ho>f}>72Y+5 z+h>H3{#{fc`W{YYh2F@{yxxM-!O`rF*jUIS5f-*yfWfG~STb3eUUVQL`E$gWdf_V? z)WvYCRN`~J9ZW0u2(9!2^V_BBvnjv$+e%e1Q+@V4zDhA;(?Zb21q_m@>ut&n_KMg*vIWpPnmd5s`&doMv4klZe%Cb(zYthN|?}#3z>@wgTFR-9_kM27lgIxLn`sVL@QTyJVpT45suo z@lynFxR5W6>mDUs;v&+$zM22_C17;Kbw+0atj{Md&5!Tj`uY{1TN>K;4M`iKiKi zJrSMDEtonoRbW%1spSdJ5qM5+x>V$P+f9G)5J3^oL5DP=tawZgI~0- z+wU{rvOWh45O9g)CLROSQB!nLGWRzqnq#9A&;KcKxU#ALf?j$ztwnLWAvV-X##(eT#Xks+! zhODts0;iI6uXI!+o7h3F3jtS;7@ZFxIy!KW%G31vy1u#rQcGcPfss)a~w&Mn;$p*=NDBoPNAR$L7TEfTmL0% z?QOkt@-kb#)h3hm2d_!qC}nT-P5T!N)}=-376|t`h1k#e`6LdW>b|Ct{_J$=pkr)4 ze`C$3{3e3NFcfbae&ciR0uiA##9k+8ZI_+NmfQJfROg?4cQV7@Jbm*FQ*5)4whj2N xKuZ8GHY$D1jUcIIF?jCCcGB744u!o-810*L;%&2lc>VS+)ed^OqVx~2{{Ur25jy|? literal 2951 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 L0#_*7Un%_;@j5W! diff --git a/src/main/resources/schematics/ruins/Hub_SK-TheNexus_Open_40.schematic b/src/main/resources/schematics/ruins/Hub_SK-TheNexus_Open_40.schematic index 572dbc97afcc03ec2561aea5d728cdf0706ea272..ab6c856cbc653612d0bf38aaba03577fbad52a7d 100644 GIT binary patch literal 13367 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 diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-LeftDownStairs_Open_50.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-LeftDownStairs_Open_50.schematic index 5ae15e7eb35a77aba0d60277017630ef0359071b..2c6bacf8128bd78971faca179d5a7ae47f0851e6 100644 GIT binary patch literal 662 zcmV;H0%`ppiwFP!000040PWq~P7^^KhVlRIcKc!U#CU=d!+}@98KxRdG$CrjAsO3& zPT00&cTT)dufnTv3l%Dz8CxRkEIhvhlJYR^Zt^C4COnbB*U>~zl{KTDbcV_*k&izG z0000000000pzYG8F8~PZH+=!Ximd4iz~jQ;5QU`a3jjhGC|Zhd#PQ%TYT!2bN(PbR z=du6*00000005vV1L?n;S!0c^E`F=lm%(Rcb!k*lNq$hAPt-u3elvys>%&s%e$um3 zJCRpC861qqZ;ScptP*+itJ(Vj000000000000000fK8;*{h-b1#L8|e`H>mhiR|>G z`{!?=LjN%@ajQe>LLh7we7o8n6D8b9V4{S`0}~}g9+)U0^1wt1kq0J9h&(XSKuDZn zaaW!YIFW31!u#T(;JuG_2PPT_TTV2~JSVb+t3#Wd@V9W($q7!8{f`qORh2#agaTqhFW zMB@xMv@kHyK*)W;x!qt`8BiO-ipB#I{jb44>g#Wr+7MPW9+>DO2w9hjGSR356J?^2 z2R_j=QNkStCQ67rFi}F}fr%0#4@{I0d0?W1$isb1lt8$H0JPLVdWWje*6M!!s3)(- zW;&kF%WD6<`d*sR-uz_mi&llPKMr*{m6!f5&!%RkN2NNk`^uE^;`(7_=QF+d@H5%D wdV-;u>RDyxGga&j>-Wg+jRVIQCypyyKU*cwuMQrm^8E6|ZzMRC$J@C805H@(ng9R* literal 776 zcmb2|=3sz;x3ezhT?&wBsK5BO;UjBL+%F~LSvy?Tn|z$*WGwYEXNl+iY|f9aWiN$) zh+H~&%<)|Pg2l1^4}a@zJ9s?P|9@@c#)-M+{CK&2FC#N)!I;vg-twx5zTH!1HC!USBj^#D#4G zQqInM%pz>s3nFtP<|HgS%O$indV)qLn;zKBSB1BRE9`NauOZ{-f6o5s$*U^Ux7%9& zp4aoabB|e3-T(ao)3?`$Jj)Y1RH?<1WWTU9R948rMD*UHeY4{K(GM=hLpNBzp{7uys9`&Z1!5Yg0LG^yS7_nH9zcfzkqOQI*NaJSLB z_;cG1K~M3CS=w52;HnGQw|j-~>fI7Ee|r3iqDRSgg^N#RZy)T`IJj0QwAnlMP;HUW zUFQiImBn(o?COhHwtHQvToKkPvs~fg(X|?0cMt7sa+x1C;l-n;W~CiP??h`8@ww7DSmQnDpTA&bb6gYG$7ODrj fG^6r*4tCp diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-LeftUpPath_Open_50.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-LeftUpPath_Open_50.schematic index e63b1e7be7a264266b9244a2feb51554f5871b9d..097b32330bd3de49b5d1624d5e733124c047786b 100644 GIT binary patch literal 749 zcmb2|=3oE;7KXQT&-&eVkYKRCt!N)wy|QYdt7y9&tNE%eSxdv5a#j0I`0_+PR5@|a z`~GJCi_2F;Dl9#h*L1M+x1=P}p_=o!7PP?5j7&1u1fphL^lH)QTGv9p!xo%P_s zy#jT{xX&-%i!XTlfmt5Oq>4>EOa3P=n;PbsSNHzT^n=$U)Ms{Gjw$22-0f*I;kkXt ztUuqk1ni2RbaUps6SL>>@Ew2r{bfzbyzV`}FTeSTWDt~jr!`>Le4$dai<`txo!cn& zy7SGqCDos|2dw^=9G9?MU?DHdqr5{`LrXnGHVQf};yBORsbnLr()A%`g2tg@gh1A@ ztz8H7xNfP$s7vHUPgo(jUf`T)N!JOzMJqy+J}!9KsuXC(FiWeFCyVxdC@rcIm`)>aBlZwXs)dt$y8Bo<3Wp_7@S~H1g{!`-U#v3wRQC4i;=!igZjm*s_>-odTwQ-S z=6w3erHMQFr~cxOcz$E| I?VSt^0J85^GXMYp literal 905 zcmV;419to$iwFP!000000PUJVZqq;%K!-r<1aScbOD<9b5|v;D66?5)8jGZis3qSE z$>Jhiasp04GO^={Gn2%z9e+3PZCdwr9M8;)V-;Si(bt>lWIm3gn?SwzFpkGcT|X)S z000000000000000XprY!Ux15eU0(pShREQmGwk{TpeEd8_VGmCs(pn(p{ESGzJRvj z)_8t&8a2Ve(eNYzqIvSq3($A?gAV`z00000000000Gur&HT-xVM{zWHF#qm6RHHBB zc=9V6&mPpp)l5&vBlYTAG@ESv+CW`?p4{KXQ}rfLqpRE7_p_fjKOU5N_iy9$NkO2C zA8Qp92Z)uh*Gl=&)^7=&ha6$Al@}5{T##tff<#GFxFAsy6)prM8dyU6MNo+4wXQ|d zoTxXCl@O5V<|1m(A|ANxjftZtC?Qc_C2cLD-Zvt@$i5~TSR!#v(0pxB1ews5FgJpH zL>^Z^6VPf$Rj8^TUBv4pO-h{dV&YNDic|g-u)xaEYW&* z(L)lgGmm~Gs;oqpA13yQHWIBfkNzd9Nwnca>pd-zD0k6w7s3+lzaY`31&NZVa8W%` zdjw*q@UJM;XP_=WO`^MLtlkdP#rNnoo~qY@y3GGC)b-S8<5>^)gd zbp63!K2?~O){;a|C>HxPcZ>D5$O^8y*uGh2L6$`rrpli9TFgnbLy-r%EqsY?@8CXh ziV~eKzS;)Qh|nYEjuGXhBvA=s?nu;ZxNmDyk4TS*y1H<_`0{#vm%EstM>yUFBq~z) z5_R3k%#U4rZW?h_V$SZ(r@C+kXRf!2J2i=l6jc&kKGZp52+gCeXGH5y0F5PDhD1e( zW)l5vj@=_jbe|y6oq|NW-wzVqDH{5qH^&u3cHD>{Q4+OBG#Uemk|?4NfL7bJ=hE>4js0?~p1=qc(yn3Pq-9=QMjIwho- diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-RightDownStairs_Open_50.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-RightDownStairs_Open_50.schematic index a42b476b3aae90f07bab7f58e2804dcaf24eacab..ce1ed6a30a2060014e1944ee14c6ed95df1e65f3 100644 GIT binary patch literal 641 zcmb2|=3oE;7KXQXm`OYasPGP?CNrPi+e?By+-HHnKwe)+WBS2s4ke$MaLCCTjNu6F;$z=i{f zhHKrk_Ax9t_0)mgH=eaD?#>t1gzW|v3=H!uu6|){r-PI4S zl^0gcQ8fs3deGP@#KiA2MW7;KQOf~lVO18n85yn}dlo*hTx{dA_56y8&$qr`e0RV_ z`;fDm)bVm>k)z(G=T_9fM4k3_x}7rKk+eW|=`Nosop~lMr;OW92bf)qsAStNqaj>d zaN}#I+eGyk-gDxo)NTceHV6MxH40RV5`9#WyJS22^U9T%I#-=CmQ$Q^&;9q|b^alx zT@!zuOIW1XGI#!qq9yx`A6*rB@3+PEVVfA6T9lyGz6bK9l^uEi%mwQrE(0Ac%{wn} zy`4y|E12hRcf?lhluI)o&@F6oKb+6Ia7Oc@`c6af!vPo0#`fbgG#WRwGHkgL@XOuG z@Z3ztk1O=^mzUYa>TLS+VDZ11H&131TK!5ZNxHjUdGgt(Tlb&t-syW*c z*2+E0n>g#~<@2fkuU(vc`mp*=ZNHPL?|(f#UY2+1j$Y8*o?}M^D=X*rm6jEjzR_2_ L;H`IiCj$cj&h0CR literal 744 zcmV8izSoR`CAW;ccAhEU+tFcImMJ)MV zNER3Ak`r(W@>e`==X2uLuE+6vi%RXwc*dVz)5^+A8Go6~qD7F#6C*F)2WcR3c_RP- z0000000000006z`S=R>usA3c7S=Xn4!SlT91HiB#H~;{EBWKk00RWnYr~&H3Ls{?~ zp2z|K000000000006=$)%E`q%nFV8c^);SHrI(H5 z^iy!@Lrt`5BwC{Nr`zCh z_lnLFEsM=5{wHdz={6>sJg!4@pJ;87WR}QGW1^wsdX{MaMGq5wq)1xcV|a<0cJ~-w zqHT-eCEBte(WV87lBnl`L`l?hQ9n_81)@^u6NSe!lGBe-d^Jnu?MP0(#nW^quZ^7E zeirKT=8sD5W+j|kArOZNt*iQwD54cXq6p6gi6T4~B#Q7{kSM})L81uH1&LOOToo&n z6>gE&UQw}m?fdArAkhl(kVM1qzR2@%O^p?mo7cXNehU(<5cLwxMG0;d=tATdiIQle zA{Qlwjc_FziW1y9P!fHx79%wt_@`5Q9&29jUe=EKf9OdR(W)R(gy(`p5uOVYMR+bq6ydob aQH1B>DH25>S`Yv|Mg9TAbF@buxc~q|wp0KB diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-RightUpPath_Open_50.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-RightUpPath_Open_50.schematic index 783dc45a713eb045eb3f93b80f5f9730487b03ae..2f5de5eb779456f789bf091511d0ccc2b4772c36 100644 GIT binary patch literal 744 zcmb2|=3oE;7KXQTPv>2B5OH{aBU6sUtiyMqQ|t%PyP~2jLLQeP#Tz_C5dQz(+azmDe^OQB|5>&kZ&m zM%c`_@tx(B;XZW+ZKVqjrY(P6&BP#AVI-dr5xv7Uf?w&raD?d`9&`TnfxeX+!I`!W5BTIMsZgSf8ZS&{EOOv15=S&NW6Z8D-ZDm*L zTzProy?+TG>}G#C&o!~U{?9sOgCJ%;&~v%;Z_2I93n$O@*w**v0B`DU<+t_wTcf_n zfA+Cm+VRRk;hox+b<^5i1hoZKx;SDcXebppF6ubI+Ns1Oju2R;m>3ec$;~PDfsM+q zh@_hjOaxae^qR| zH2%$Baj~qlR=wbNe}+$tepcGmh8rJT7KeRJF)}_R;o1_hNJ}j4#o04EPOa1H?VKvq zn|ZZ+R-~zdneD}HkJm@P?p&1Ca&O)B6<;G~zC6BG=?m+&SFWjiDzBnL`Y!)jI9Kk= zDuYuUH>2;dUt7mzx+B6nBsO75N0)lw{iKI`S4_${?Q{HWsE~G``z?;QXG0gVFIU}_ z(D-%HBhM?_cla+7*Xql5pJKlEtCQ@)eLpWPdg&q`K4FELl%Gl0Efudty<9?jb(Q3s zTud)kEQ)#Ixh1mjzROfWJJwFSvo3;-973)vdLANzI}`$49y9?3x{rH^G)6QsL+>W#^V?yVoafH_Gy=P2O|k_l!Sha_h^BHvQK1HF{kqyX>b&-0Qfwo;Mb6pP%f! z?VY2yewjbFx#V(jef!CCcdk7?eRe;0IG^T|r)S^wPx@2yeL;=JZS&iFZ!~1Z%Z&Us QX@30csu`ttuyI=8I;3c#bA6ZC+A}` z8uaDWw_-f>KGu`d&%>MRawKmu>7QR+y&wO){BbMt?w@z~X+>tLe>Rd;zaSRE-7C>B z&ZiPxM>@jYD-{ymT##sJL82s@xFAsyO9Or1?MS-S;Bzl$12EHCQ* zzUR}qTZ*Z(y9?LJL|x%0>hA8;74D%n+eGhB^K|NW*PB&W6Lp1q1Gt}Cm5*`6)Knw% zZC7hwJl>zai<)-pNI22OTh4OjnQ?a4I6@rZo{n9c^BO@(U$AzOroxk z4Yp+aL|d+-lZhH>xQVVH(Yf{$tqw(^+(qXf+f$+kA(Be;5Cn;a79>idiHqimx+4&4 zg}$S(Jv}-7G%T)1rM&IQ$@k)_9LeiUP9Odj>f-LNimhiRYEOkgY$mj>nnR+9od^;| zBrZr4k+>jHMB;)(5s3>DMI diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-SpiralHallway_Open_100.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-SpiralHallway_Open_100.schematic index 417191facc2b373984aeb6567e490baa6197bd25..59772eec1287487b5940bb66f197b3dc668a2485 100644 GIT binary patch literal 542 zcmV+(0^$81iwFP!000040PWgKPr^VD0N`N@v^5eFW8xzoh`+*k)1dL7iBS`dWN8<= zp|qsC7yrGjMo6(0`(!Eeagm{2cE_2tC3^too8_=MmE6*yJ)n{ToGkzq)a&(%hY?a; zC$cF_NGtj5swp8^1%^I&%Gx(kPzaQMz$7CVeU_lbE^>A;l^=B;htxxO_M0EgGxT@OMCA%qY@ zXcvT!6pxHg9SH`3&XC*T!^No%-Jd55+#B_$R%BC{5R!CmwlIqPE8nqr$|%Ld`ygYw z2}vy8cvxF*euxdDwUWcTxHl?y!%u>&*8iyV(ty zibSP!ugRO_KAufdgp-GDM`aKmT2B}%zDLuiMYpubR;Ny(!9u?F0Ar{Qu>b%7 literal 452 zcmV;#0XzO5iwFP!000000PWgOPlGTN0PrUp1I#$<*)u0kUS~A%peIc{v#lA8Fc;TP zW@7w$G831ulwoNLZ{_{Cz3``fyf@0WbBLZ787or37Xgg#Qjr2&Zh&Zt<5)jT2zLHX zQ`qy) z>2Pp3A9Le!a|Y^az{WtbG){rD8>|}OlnJTf{&I^DJtKN%5a&b?-me80oNa%xS<#-%U=l8uBT~ uXEzv8SKprw&)KH0z6W5R!<9kZKomLL@M=q&mkI#?t$V4FaVUQPJV3qB-OlS&r&zU4Uw1?AeOAXZW#cL=z8)Wq zvR+vIoW}7yw$h|J-Ox_M@MJoF(od6qQIreeQBkIt*IAv4{B*-sSRQ57_HnA4;aaNt z-|~Z4I@@7sC*}wBD7;z@z1PFxn{hEXtU~zmW`-X|k#QG);7aYV^e(1@Q5{~k!{S~V zo;_w@>HHZ3KY!fzJA}E_x>KO(@b96sef|~tz0W-jbXY4APQtUR*Td64TUB+D$J6!0us%JapC&P{Qjurljeau|)}~8) RS$T9e_Y2Hy!zM-K0RT-C1*HH0 literal 582 zcmb2|=3sz;w|5==F9$HNf7ot#qb=skvx_eF90o%C68y6&wr*&qg)`|pz7CAmwUkL_h)(2?e{jIWcFI3Iqp0h=BY zmYm1%V1DT{HmGd`sRq$2ymR-i>2UQ??|r#Pc-Q+$O0vgOEI41^K73K(W!u{R!WnVL z%}$4`7M`_He%}2x^S?eS)IWbb`(dPAUuKw!>zU0j`J@-xdZ<+|->6|8f5h{BcG-+) zH{U6A-mE**ck1fenki}TkMBNQGwIvmsEiuz``=f|oIh2#R>uGIN7slyhVgnIW~^1W zIDhSIrP<+Qb+cr}nm;U)-F5r#zjFrm7PDGDRHiqID{lz$OUql|lcxPPs%6FGYP$zF zQ%uBv?cH}~;qK}BTZ{bd&&EyvcPeN4=8H8R8?Qx|c9&XZYhMcux|_6DI%v(;Z(qtC z{u{Gk1V+d`PKN%~l4kdoeJluQxqf!TKh1CJ<%~BJ{_SZz{dxJix)p2Y7q^5Nv)HU^ zueH?A6I>PMvGLF$+q8{!J2$SlP?9{=xl44~rAOUgt3ID!xccuOU6b4XzRvg8JK2k9 zhx8@IUYn5Adg@cK16bW8`}MEng4S#(;MWdYSk;c<8VrF4+qfARBC;Ne-?jcyyzDU} F0{~C2_VWM$ diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-UTurnRight_Open_50.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-UTurnRight_Open_50.schematic index cc180b4b379ee0a727293a1af15d65fe761a89fd..15d19bfad1a5389c1fa5d058091cc5bd3e409852 100644 GIT binary patch delta 527 zcmV+q0`UFD1lt5}ABzY8000001OV;bK~EDw7zW^JDbOMwBwp}fFwsB3O)16$MxrKM zUE6_9Xm`o(nt*42m_N-$LWKiLA}JJ}=kiTw-kt3x?Uzk^*p<-xG#JH6R;R&o==8HX z3*qOF0000005G>&mkI#?t$V4FaVUQPJV3qB-OlS&r&zU4Uw1?AeOAXZW#cL=z8)Wq zvR+vIoW}7yw$h|J-Ox_M@MJoF(od6qQIreeQBkIt*IAv4{B*-sSRQ57_HnA4;aaNt z-|~Z4I@@7sC*}wBD7;z@z1PFxn{hEXtU~zmW`-X|k#QG);7aYV^e(1@Q5{~k!{S~V zo;_w@>HHZ3KY!fzJA}E_x>KO(@b96sef|~tz0W-jbXY4APQtUR*Td64TUB+D$J6!0ur@tnFDs8W`pqz`Pv`n+67wn* Rc{V;<`USo$u^&a`0RTlO1o;2} literal 582 zcmb2|=3sz;w|5==F9$HNf7ot#qb=skvx_eF90o%C68y6&wr*&qg)`|pz7CAmwUkL_h)(2?e{jIWcFI3Iqp0h=BY zmYm1%V1DT{HmGd`sRq$2ymR-i>2UQ??|r#Pc-Q+$O0vgOEI41^K73K(W!u{R!WnVL z%}$4`7M`_He%}2x^S?eS)IWbb`(dPAUuKw!>zU0j`J@-xdZ<+|->6|8f5h{BcG-+) zH{U6A-mE**ck1fenki}TkMBNQGwIvmsEiuz``=f|oIh2#R>uGIN7slyhVgnIW~^1W zIDhSIrP<+Qb+cr}nm;U)-F5r#zjFrm7PDGDRHiqID{lz$OUql|lcxPPs%6FGYP$zF zQ%uBv?cH}~;qK}BTZ{bd&&EyvcPeN4=8H8R8?Qx|c9&XZYhMcux|_6DI%v(;Z(qtC z{u{Gk1V+d`PKN%~l4kdoeJluQxqf!TKh1CJ<%~BJ{_SZz{dxJix)p2Y7q^5Nv)HU^ zueH?A6I>PMvGLF$+q8{!J2$SlP?9{=xl44~rAOUgt3ID!xccuOU6b4XzRvdRobHQi zhx8@IUYn5Adg@cK16bW8`}MEng4S#(;MWdYSk;c<8VrF4+qfARBC;Ne`~JzOTlScd F0RT&a_M-p* diff --git a/src/main/resources/schematics/ruins/SimpleHall_SK-WatchedForkLeft_Closed_80.schematic b/src/main/resources/schematics/ruins/SimpleHall_SK-WatchedForkLeft_Closed_80.schematic index 4601cc00dfbd11c7029c8be51093928a91235c28..57008050bd71a042343755ddb7273cd6e6247e80 100644 GIT binary patch literal 1650 zcmdr~do&XY7++UW%dwj>k7HOY^0?lQwitD7+{Bq07rDDJ6Af`{%R4FZ*!7q&3teu> zv&+WRXq0M3kCB9Jm{*0E9omN6x~J2*f8P7={r&Ns@B8ET{m$?Ee)>5(0bj5kuqYHp z??r1}njDcJ^RtiK8USN&#Da7+tTqeoWCPVR`RbMuleMPSUrxTI#M(N~IlxKkV+~|y z>YIx4hVdGp--09KY~o6D9H z_dZi;oX8~+K{4PQ;jwH6=f#3aEKFc}c-lwR>418mSDu5bopDDD8ARW5Gs}N>{ zC*xbsonSV=`-VpS>PPgLq1bJ%G*e4uh#tFf%T~X=mJ?W#$6FaZ%No6v*Vu3y6lu+S z0gB{%vN@W7n}ItX4Jy)$3h!K}bFb1mWYwovp(V`2hJ8b%#Fw2LG5e@DPj5~d0Ay}B z>e#8Gd26lGyVdjrdwP9T`Ho_h)?RZnfD=&>GA8!L2C8A_LH_1wX7CeZIN;Ywpufyv z&_57+imLR@?tgD&)yDTN#a>~iWy*{tcGbu5QukUQ`UF1#UZ(n}qFsujRP`+sH^GCU zL#|2e_N@~*%DQKvviOXacWREvs_WS5_A^Ia|XY}BVNdyJkW*msyhs85E`QpyDRK#V08NW%qXoASfRFu@MqQR6oj%nJBa?H#8 zDk13UWQ0-5t{>;)SD?=?yV~LM3Kv!y=rIH5;+o&4=eV8wfb zW?;N(C^QeW{X9cFo^%=0slI`DUocsN&~hd00Ebshb|mmx!iL*r_XGVlyfjB< zHG5nTsleOjsorDw8SVyG?d*i3?0&*Gq z`iI`Y?hAhFic@~in`AVeAgXt_@A2Y9Q&>Rr(f(X5nVL-{+2gUc5@#i?l4B9?Mqoke z8wM8_h^@!yjF8MyZR=$S-eoC2o3ZgYD7G!7!2fOvn1OWc@VLKZO8&; z64o0i;j6$EVm(pfO~saKAbR?*r7amq<1;@$Xz0K>HTw% zBPf&~{r^n)63c=`+kfQK(9jT(pPS}`LZL_o+5muALY351*F6AyVU;|7tx_fOut(u} z#q{uUaGkdvY)O9;a@Fv9a)QRKP)VqKO3ZG~uBO^0RXWoMp1RNUkb999OAsS{5v6KM zp8j+YBlFg^&{xHpru^I>@}DxPs54SS=P49=u`!aDV^-xi#y?t-yQbuORuu`2@7}-b z!8qg&*uAQeZmx*TvDDO)IuH-G@F9xz;s0 Sh)m7cQc_r^sMLCV2lxx5p9Q`E literal 2022 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 RruZpU77uiK6{5F;{s!B#Mb!WR literal 2126 zcmd^<`&ZHj0L6D)F&CoC5}ULvmNu0olj&9(u8njWYBgWzhPe5dn30!He%k%zo_o&c{&Ih~wk4)-{3Bp) z^b#y+|D)CG!l6{mX_H;kQE!&CTJ9c_|GuAT+KO>v672#O?0=68_=<>i$ehGE% zuLxOkM=neaJx+a*>5_~}Mj4EIIS@}pmQ3~=b$2{#OE!33p2D`}nnopdOp}VUwm!gM zdZ|!o&_%oeGgw&ox;hEc8;!wWmKSSX;P9mBUiYqh4sD81arIYTn96RTeH8MttG4@k z^qkM>q)7MhBBPkaj#_a%6zM0J@IDqcbB@{WcRoQ?dK+l>g`#=BM;dA_p>TOH*h`ma zbLU=QOH%kfD7<+Kq>ED*uQbj22a`I}CN8|VQ&BBid%h@o?7XYc5v#31O1i4H~_(Nd3VOgyuf4OfrlAkanTvreovPRfk&h&HxBdY@w8+6sA^>rbwZ zaLbKjq!%QqT}UzSlwX-;YHYSb$#C9NyWTz!TkFyG1m%A-NcL{(LG*$QcSa!}9>XP@ zE8hYw&51-t9 zHNLDKMeA9d7<8qS<2S62rfD``4&&P>8|$341~t7di)U@D6Rk<#mNZc~9#=F%#brR* zsP3veI9WpBNZemPIDtMOc_xGP^wgx|B&53*+uo{g4!2pDo0HLs2WijuY1LA>F}#Qv ztO3FozB{cG94#>-LkX;FqDwxj?E&_S1tzo*#;j}TJI$dJaTSTxf19;mbWWK=z}b(Y zFFEgV%6BO6D2cA4!&Hc1LdN}*bPwPvQ+X=3CDk+LH2-kQXgb)1e_?ne9sD?|CI8cy zio`Jf`;Fht4`88<5IrcQXaHXGdqX zi6PAKSH{|J42*~&FWZM%W4GFRmaNLp{gL0O%9;-#;|3A52j9-&LIhdlyrk*0hLMhZ zdHL<7BrYhM%)QP0Oc2h zrr3)1Np8_`D4LN$rAV;!5#WrT%tZ#^a?(+>rElj4T4S}ZMx&mJ@#8C#V0GpH4xa?u zg4(DKYVBS^XFLjuzG(k0*w(EC>%NIeA>pZ%gfj)+*;+E5YA7^+W)O4_FBs)OQ+bf| z$lf5yVV}N@jg7BaImOG0(m;LF#anNKa;>6=Y!G!0D+$@zb9Ue$Y&xl|Dll;jK9X?5 z!^F%j^J4a`S*m}PO0qF1&ec}sIl7q!X{c7<`h1JrmQY$F;mzk>dkWqn(qbU^T%dW1 zFnP{?b{gW^)Do&X9u<-pCN9%U?iA(=`wRL489ztG3cV>a{-O_cG@pToppL%%PAAiS z2m47&!JOiJ2oNWPmHI*rT*u>Kc}!&_O5j2XCJ!LY*k3PpSYv-#7cC&ga}H0vtYPfo zU)-i%Ce^$7s!dmU?UezonWU$}&t3Obya(o))@()4BfD=xc&v~ABw4}q%XtvzwB=SD zqIR=uDlV9+do5Ee)!9kKerN(qiQ8oCC2z_Z7Lo585^39;5 zF-_=Zv}eC74GaE3UX?K~r&aQlPK46r2^!z=1hB!nqNDl;Vd=Z?uaB(mjH6;*LFig{ zXi#pS7#WYyS<;02Omh2(0}Q6}ECC&0Y6fb9u=)MYIa-e+$O8gpVma&qyo^?+CO?k&YQ*_aWrk?0GI3$ch2k%Kq=^WbGxg^va+bqyP`F zNjioiZxBGO6#{7SXf@vBF$4_-^~#&7;J7?q`%dq{?+mmcBHBB#QH52N;N$EV7!j-A zoP$Clgqzhqi#UQ5c39Y(!BI33a*s`3pguBq@nz(4L>Yx@IGkAvhqdB{CWx~3jPIgX zWJ#yvqaac*ns|gnO2=Jbc6^2M;^sy=b46l^$UPGulL>^$eAAXAaWD*udn^hNLcCC@ zFNLh108^p@d=3K3CgQRWLB6m{^@vrk&|xu-MtJ7pB7c|nqFECy=|vR{esT7^Ati$m zBOetFD<_+(rE-;mX!}7PP$kC4E|`2|XW%D`ZI2z74Ejv2O$|p$EEAS_Hol%{moPG6 zw}q3&QW!~+%Lq5-A+AKCj2YWUhC@?nz-z#(Gjr@b<>ror3Bj|ZHO0%1MC-vGAfi*z zGF{Q}`E`?DgIphc&x7$NjnYf!C^N}LsTg}=*d8y6FOGCs;W+4{uBEeVb^lu4n|8#z zAEmvrfgT%$w&he6pV3T#*1>&Wd&d?Hr9iRd$CrXGA6 z?`E6~nllvV50Rdyq#jIiv&2N{nEg9k4~_=()N8U@#|TfyNFd@u8i=FF;=|KUEH)Ph zc}k)MTKjS6Qz=^y_KO`2n=*&Q!JN;@=y_kgcotcJ8Zsd#%(=Xr{VgI(Cy5|rje=}C z9RXpClAX|Ww;%~xB~M zW2m7X%y^Xb*JQlI#H(Ziz4G;7Qt;9?r=Jg!;dz6CLM0C!7THOU ziL)W`*j5+C>Or~&DaQlIdZv*!8L~?c;M0#ADWL48S!;jl~@BTNIh-=om+hPiJFal^`E3LK>nsEaC*_ z{_iMTQPhrRp6i#}z}J59Ilhje+we6Evmncb&ElZ=5NbgyXltqTQU3U{_$?vh{eCU`_?~pX`ZT0)zsaJPr~*0ueyg<>-DA* zPu82RUG0{;ZoRS{N-@7%ZomGq+nKk|y6vlXt2ga>_401nt-k42Z_U-k`mtU8ee?2u zy=`xe66JqPyM=juZ(fyo{n5P6#ZNb8^)rn5+n-^~--R(7G5hPTeegD51(?0OYqz_h z#e8V-hoMD%bPHQ&*Wa|OH@iFW)C~C5?d_lL*EessLVWh$;$}V3L=#Ok(L@tXG|@y8 zO*GL&6HPSHL=#Ok(L@uSLrT|2m_ShV}Xg2!MHKN3NOiu;w46r07PqF)Yz`hBI~XwK)PTYUtuAuJvKSV zAJfEL)`{Oj6U#W6Q>j84985<_$feWW3ptKRss`O9bB2wdu6^p;kAp<~txUaW;t_~6 zk{}w~2u2iT1wGNp!XrUvcRD}{Q6l%OfCkMtGQ+2V2QNB~D0T?|QO6vYbxD8- zVoiS7NzSoH(DqvsUW3i07Fz4*WV8;SfVJ1ar=ba(Xb{?QfWV4+r8ImG9u);2{N%E@Xi@a4}wP*Wh8<7FXnp2t$DeJr_2ooB2sd1Nc90!%m z*Mmm^REddZrki*|$7$kKF8z(3jd#_+f-ZIN&y_8w=FxlGEEr}oXRSqSq8Tp=;leQC z@X>05vDgX+dRySSwqVYTFNPDX3RM$*JqQ=KNCDDsNyaUUCPHv{F*`gRaDg}Gr4h(h z6pVwlDp&C0u12;jVm&B(rNl-aN5pGu4Gl9@Z1pvp$)KEA$s!u85WuQ}yK2smfEe5w z6ycq8)l)>IOoY5_grK=7_FHJq@V4Qp8cgd!v?s%@K~jDXnaqI5Xla1pqM#6b^^^${ zxl~P_qd`&+;{8aVL0d{8X|UzGdXRe2@Q&(tk7G`@EYw-mM7|!Bt{w!#Y9N&Kzg-=3 zvj!o81z?mFAt9+6vU*v>M0 zlowURi<*c8eVeTZ`vMqfVYD8MK_nKuNj=DAf5gd@tR_NIWCv2%c{gO%VW1!Qh}T(k zV4E~dV24ExU*J+H2T-cSi=w4(2d;w<@p8|FdXS`QeHYFJq1}L?9%OeSQBGX29!z(( zq02J}pfu6x^yxFI2i=u9)vpjDaWWxH46A)GQMfmx3VlsjrN?KvR4uJ0KrZUrBzQ?2 z91HX)lPPyTm?YcO<>hy_$*vj`CWd-26X=y+{m#|l^TE-2@QCw4yqwt+Ug~7niav{% zq-xki<7E<$)swM$@Tl{_bPdweN?P#lsp!L9xGzdHh+q2p57mR}37Gb?&IeU`Mo*8= z_%J~NAD60yFi~Nns47K`f}HTGa`hl{gq{1uK)MD8UW5YB?@?4SOprj2ybCVOV!}}u zJ3bR!!OQ1W^n4IRcH#fTJqk(Ap77+<`#xn+Y~!~=g~?D4s<<*DphOEp9LyoYXHU{k z2da~F?2^f3P6SB(EoY*<%cEY@*6d(U#vmeLqOa%yKuyxV24`>@g^ANm6hj;d^fmUP zB$g>@vY3d7sV4gS3INK6370c95a3y<8mtH1XNqFSXe}tUuoQgyVgYz12G*~^F;<1P zVb0t=FlR=+C>K31*^UUEF@PM<;R^L26v_fLFP^s|UYh?RqD!N~OOHq_8cPeW!G(Q# zu}}ygtXmqovt7i=2y)y{G&lhC_22+d4d-PGD`bE${PI`?IIt0*eLN-&4q&#LC|52? zv`Maz;S2!1Q0DEG)1Vw4y)y7VS_}oCX?WEG^zZ>d=>bM3gGVA^LY}uL1BqlZcx6}& z7GNC^T?uby(s1*q;$sh?zZ(z2OCPNvt9=OZEs?uxi1 zT_ev*uR$qf1Za&vh7rqEP%0YIN&rMD69I_5=(yXYENF`W!Z;bYL8?kXB~}$yY2ZHT zDR8dszz^KO2hQ<;vpnQ1e=;i&Zv~BfFSh4B2*+0uQV%Eq3~i%|=nK`Hdn={ytM9~* zH1L+~#Rsg$EV>KY!k&eM;|eSXmNE*9%uWvfaU_{{{1rdOGdP%pZ-jXETs(i4y-V62 zG;&UAgs298kD;35f{h1d7>w9xK-h6i3J>0I>o9&n1EjN!Z?C%$er?J6qy}7v)pTU03`0uYDJKKl& zb!h$PrIqZ(`ui9EXqWfh?mcX@X>a=>f9N)?_&nZtw|ZRv(3;!VoA$A_zh@IkM?c5d4MDCHr=Bg?D}rKek;C!BbvvrgFrpLUoxV;w%>~oAICcb r_TpEvfGm&E@7QZZXUT6+Kh&&&fA literal 3591 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 N`Y#3%Ei7kw008Q9BN6}r diff --git a/src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic b/src/main/resources/schematics/ruins/Trap_SK-RaceTheLight_Closed_50.schematic index 8206a43ee3c2951a3f1a6583aa506534bb437bd9..523e53381b2470b4748f8ccb5ef7b6a86df066bd 100644 GIT binary patch literal 1658 zcmY*YX;71g7Da+=23Z=wN(qZvR(%K(QXmpY!X}_B3W^wrQ1(Pz9|>Gf?l>xO!&n3$RczakAuf;i-G^Ax!(p zckW}&RDS20tQc*F86$1*WR-y_3UKu)ZZk_~$wWg!*dS}e5mv-n-PrGsd?*5i=XmBl-C=_xagX5&nMH?^6b4$+ zatCtlPYe3+*srFOXwslteudkKahaw6Su8q#c>_USKqbX+jcS9AL5{|dUV2=I($Ra2 z6>JptJR}8_vG>u$-BS2C!!Er1%e+5p0@{tv==o#NzIRWvpe$Ck6?H?*iJ{H3iN+os zclK;GR9OeTskeJ-)@c#&?p|EqA903BGJM}*YH**Q>oW~Z8ch{Tor!i^~~f< z2YL3mxbsP@tr;P7rUO3_HGHuU$afFkO3(Vdt|LAsHJaM$qkjqt+ebiuRp)-`_YAa! zp61R^k>-CdG$#S|_9o9%!8n^8*|Hnprt(#Jgm@&DJ=!d}F=fSzE0DO#E^vP#ZTC*b z)?4s3_kXkXrgXP6d=v6&YO!Yb1V>5zv*|+niAMEtZZLakJ!@q<@(f~yRBj!pJ-$-N&y8mXgMMhQ#-u22MEFT>V!YXB#d^Kx@MPTgE@WB>%cRqO2OoAp zH*-vW9*S1<`5EotaueDsu}9aTTs9zq_sefskAI7T zyk!T6hdFY)_A)==*CdP*|G7^MKHytQ{D(f(3`nll^y&mZetp9lhAp6!tw|ETEF=1| z>LVNKAC3(+mb|}Wv2({Xjy{TZk07RR5vK$2*&dAl#-umpOTnS=*%<%G~6M+Gc?zvN2W<2<#hv zd$f94I2xCkHG0oI_$N*6hPacE?*S+XfDVNq27tBz;94=0`y3qMrS2-sWiZ`hw1OV1 zd)6&eGjy}T#(@c3=uP64Em_6q&tDtN>-=s`Zp*tF z>pl8S_N$gbGw4u^wV}SioxD@oO~~ZPl+KU>^T0ILx=OP#ig?199J+f~vhHaSbw1fn z<%7lu%CpF+4Cu;Uv;;QcZMk5L+k}H5Jr_oaJ#z#aGYW&WnGQXQOBOAQYYxN|5kRU8 zpW7qEmbs1d`J|kEYwA^$Ze{b~;zPjCQq?a2mT5jyzl-#=3+V>@cJbV3{e4@@b)!)# zn$&aTjH9dCebfAs2T?|XFSG*O4A>R{Bb?-DVeu;+QlgLiDjDVHX5d@-+3Nr|)!>5^ z-z<|Vvy_T7J}v8~xl4{|?lACT7SRx~Aj8cBcyr7Ko@_Ies_|FfNU_`9DHAfO2P0b5 zqlsYlzVONs_MJ58o{yISH+W?6^dAieFEtBS<^#8y?4$3BWGjhIOVbqH+Zhc_LC{8@?Y%=d&Dts5l|G z=@c_Hu#6CO{#f%}^Aj1#^n=kk2m+zTuc#U#INVV_gJH$fOJ*~(z0UTnDk}d29n3VZ literal 1565 zcmY+EeKgYx7{`CJY^%KHEf=+1Coj3kZr9sxQPPN6-c|`6FEhpFWqFM@ymk$FmGegL5P(thK#7#T8iAe#?`sEb5GAd&w0L|=X}p|p7We%cMc5rH$>C`Vi8Wg zSDC*?++ij13A5rRx)u1+royS73{T_*4-=6|0p?kt7c|%HMXXe_Ad!1xzw!9(zD(`2 zs3ndxF(tqP5>xEYpI?YkN{J`)2oF|ElTvKzs@r;=nksJD>lMQ_W(#XLj@{C zl%2Ozt1Z?7cXR92dZ`4vB2>^+@yp0^hyqyaLnxRa|LLRw;#ar6^G;V_!es10Kriywh=@Vep+U^R_23Fm~oO z5l*Vd^~Jb4*wZ5IDk zy>opha@C&cna{1bG;J(!IC{+pX2y|GyVjD!V6+Tij-}{B|HAdRM|KSXPjyiO_u1%*ozgfrGNqS1a z?m0|&9T;Whg*HsEQmSvJxaOauZ+wj+Y6q(aQvdA4_Dv5Mrho z4c5wO9hoED?BwhUjRI?JZ=vM8nPgL+Ok#xS8x8;Ye=`sgNJ6yxj~*BEdlb)@&Oyuy z19F6$9n4wuG+m$~dLbmeUl?;ET^J0v zzOXQ6y%l3Pl`XanV$M9dE4}tIBr$H%;Z%jSqlW8%j|rq3as6^A(s?kqDIl+LBdmX2 z4pCaF@Hsv1aGy9m^2Ba+Fd9&i>T!Q%yuN1dL8P~Xl(S2!wpOjk zn48x0TE4_=JECuI4|utLRnD3^Rysr;9RejvGJ(=i4d?-PDG#$V9V%Vak{v%`Ujxf( zccD1;fPZ)BLbymb=zhGQr-hU#O@gk&PmUU!FM&LASDTfBli+9|38i>*FJ^_fGqioA zUWItfM|ShcCw`q43NEcn$jO)i=A$H|P*fo#BQC2dS?9 zLX#CT>dE+!J6dZ+icXso!MgC~xVd?8W&HzLLgWQ=TM^r11YWzk?rSTz5eWdW)ZuOo zpyW$11p0PkIsDkuAf2%3o<_Zs;{!}J6opD}@8!i(L+zC9jb}ag*Vc(h5yPq|nx7mn zXyiG5J}F{Y<6b1YPn3POXMLEj9_(!Qfe1R66k&+@jf}nrrNSP{0zc*|HFkk3Zr_TP zlTVGP3U&k@Q0@D;Ls#(E$)o7AcJ_Nk6PgdG?AUL5GP{FD1waXyA!a`6Xk`|Yb19Zf Jr~5Ymz(1dc5vc$G diff --git a/src/main/resources/schematics/ruins/Trap_SK-RestlessCorridor_Open_40.schematic b/src/main/resources/schematics/ruins/Trap_SK-RestlessCorridor_Open_40.schematic index 99a5ebfa504be1b8143f4ede8be80b79ac583fa3..6e7ca2ab892a40f272efb482dab4eec95e3b242c 100644 GIT binary patch literal 3324 zcmcImeK^y58(*E1mlHZtaXhi7CVE3TjGC7)rc>T3Dnt&kjd?f8a4Kw3O;pNjtRjxL zVawL+MDnuaeX}u3BC&b5%&=$bI?r`EJLTa+zY||%njHX0-=MH-FLiuvQ#bEQ=yL=B)hHOCMzP~s*)meBW>T0hrlW-cWkbn zy6=})01N;I+zn*hT`aI3*I#PB61NWyyPunD-TGGEn$hGp-N3eq_{m|o%6jfyw27kq z6e~~h%jf>%Qsk=<+)u%>^~nN_ids}JYy$vL(d|3Y=_zEOs4L0OM;09gP)hg2CK4b06FM_nn7(7r|-FqZ>ADNFr! z*j{ghw-tk_SR-_uQ3~q(CE;`lBWXKhcqtML0Q7;%^v^Y>xN_auNW<{(O;(c>8R~q0 z=7DX2t3GpG?`IC+8QdVvdx}q{aam0VNni`743|<`^z)j=BOheXfD1~t^k->QJm5qY zKgPu*>E8iV1O$#uc}V)uW;A9w;<9=%@x^#J=GggynXYC=tZzB9N!z%6ywJs_;8Sjq zM=yBu1)h7Q-ZOP)u9pJ8>pjPN%u`b`5RnNKWy%I`3u8}u$N?%MiNG@*^Gk2`(?s+H zY9LkJ`I&2cQtdLWVGsWWp7~l!Jmwcl4vUM5BwgYupEcJmw4c&Odl(eh9^hgZO5A)j zpQCn^^IZ)Jdg&)!EVg@~)5o5n<{a-0E^nACMXk2DqVZ`ue`u?l51{r?%sE+k^K@?J z061Q}j0A?*oYV=R!3A zphsRw>413`zy9j@Cf};lzprr8{Gj$OQy?i*2J|f#uxB!EPUw}f$8Gq%NZ}fPgmxl} z(>xFLAx!k>d#^e{7d@rFURMCCX;)pN^t;bLm|>Tj12pu(F@76D;; zi*P(xC|O8CW! zxIJs{2OzsAVHbNy=j*2Qw0dV+X&-c#r1`0~LW`1x)bcANegcX@-L z9Y<36YmDe4Jz-{U3L1X&0g_SvKdG>HBmo@S72C5_dI9v|Zz3TUG>$o=@gOn^2I2sA zS;g!O6X^_SZRiXzokV|ist zi4$A3JjS4=bsaX!pc;Lrl6o2hEm|CNuqsRGe0Sxr8>Lur<7bKHCX#A)AECSSwjBjO zsdYDa>uzWfbsbzLZPgr$|he0H9`F$+~*Cv#~kqYQ~BHjX><5D+<;>y{(M zuHfBla|)p&?4Fbm+{ATdgp;ky$}ujO{PR9%>=CC@z9@nH+pBvlQt9I;Drt*^+gk$~0&NI&0Ch)XkGPP3Ut5C85xw z{prGi{(XiWB6cBg^)$h{BfYNg%MxnHw--rs%mrnwZq98zRHyRf34V=~6)&+yxt zg0f(dACXxH@q%uOODPiCI#N03UA4d%u2*?IN~&>uT+bqq90h_zPTZ2Ju(MTFGpnB& zXUSpWIPslA2_9s%eO+@*ooZe=B|lZDP4zt&)x|=gFx4!7JeT>pv3F)L+bl?(!>VdR z<=MsMn8i75?aG-)i8mo){PDV~ho{`vGa3!)S*oYhKXit~us39&&Yqsr)8fExnX^hS zN1Lj_%jPu#^x^zumDbPR$b?Do88q_u8hfkEsT~kAvm9Ls(RlkV)@E4;0RmiLIfBb}tn~Bw zlp~XOR~KIcO5=mr&i!)IE+8~Sr7-Tv5{)X1%(#Zz=G6x-_t5dzSz7qVT<5p?V*;re&+s)T2rBN>u+>!XtuAm zw-@IIl1hr_di8>TwAPIm-k88KNBbR7duW>>;?<-x`tf^W@&VkaxNrefqHWdCnCzN;h7_LpcW5E}dyb>DVM{nIG@>ZA_w5C_C&hew7_rReNLvyid z^ood12vKvic!BFWF^5=aYHPV0QihSy~) zG@KRH+erT>o{9Lv`%#3@S@YJT`t50q&<9E9_gU0@f@ewu;<0<83oQ~!Y_{zv{u0|z z9X4br&Rg}a)X!_m=!9?8A%rZ7=J@xQFPDW48)lvye8Pq_@GD0@z0bEu{IocJ7$5GF g?PzY?W{e2V3`;xf0^B%T_nku;HE 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 L#(pI?uuSG3m>si_ diff --git a/src/main/resources/schematics/ruins/Trap_SK-SimpleLeftTrap_Closed_50.schematic b/src/main/resources/schematics/ruins/Trap_SK-SimpleLeftTrap_Closed_50.schematic index cc8efed5bb48e0eb3e28e1686c09e1bc65c57c40..19576772f0ab316e976e3258c88f65f30734c35c 100644 GIT binary patch literal 1316 zcmdUudoUXY0LDYt)~t$if{S{#I%{&y>P>aKw$w^9yLm(_St|tfm?{x8ai#Us|mpz$V%p!P8Z(JzJgxD2bgvwGx@y_?d1D5(w*@;`#u#x`Z`;JVbz|Org+goiIn>oN zOlROlIXKtP5YKI%=8AcH!Y~7}E-Crre_JGPSUx0`H24vD>q4w$F5>BY~9wrkNJY^bVvi@y!9Vu`nR5W^*ulfy23--cRnemT9@3jtwkwC&#|LaaE8oOYgH6WzAaJBhhQSL8}|MruqO<+Fu3 zBKxGQcc4Ji=W?IAHr8RAQqj;|985p#pDN8kSl(c`EW>|7)RqUJ`>gny_x=6zt*D$i zG_o;tIG!OFKUPWNE>v=7Bc;1Rsb<72-MEcgOHnIEJ?=oeg~mBCBb#Ev_sexAMeLL< z0@&k@nR?O~B1v|@C%c1^mBCnY?zTEp9rqP=2}G=V@*}FKRkm=Xa1Yuhom_pg`lU11 z1g7XH+GXt~uOi#xn(RbY4tSOi{sS89Bnb{M{HEUib7JddE9aY-XX8j32l;=4{(0Fl zQ1w6*WT|z0X^|0KM!Iu)JwE~C)Am}lIZfTiLD<4To^j+=v%INZ|f2z|Twm+Rca8n=fC!))jX8-^I literal 1447 zcmd5+X)qfI7)|U1Eo!wGsjF%oou;czJ8{HOW=c`VPDjgF1QA!rOj(4wmS{WfMpa}b zTFPjsBdu)&QC343S+QY5s4Hjcu|%H$%y}GP+Y(W#zdz@7jkgECG3dOS5?FA_km3vkJV+sn zd7(OLulZfZ0g}U%51doxpo-in=Qz>7_O|f=ono zmD0WDzDVU(PNXuK+1|@IILbm>ZW4Ru)*86!jh=KkS_>a4dvFy7S%0hAI`%X?{c{jB z=4iqxQPyPxZ>i5HOaAmqCXvcFBw>vVuylO)0vt>ym^N97E4~4gvnl80YdH~e;6zC7;(`-5dPd+@an?* zeTstFkHa!gNJ%u?!~&~gOT4mhU_lZ_oTjOc@YiLKf$Z?-FA~F-LAWi$B&%CR~KJJjPlenFouAv>+ zVcQ+y*#@eJM`QLi`G?MVJiisrW7&KF3Iv(SK`xMBrG;H>cQ^7S;TzV7cSE)P*Cl{| zpIJ`4{ie<>iXkx<=2-vhFZ}Pik&v+viYH;lKD(wXVra?eYJ~nja&9p(pG21hCt7k1K z@DeGeZ=9oCdWcG);>nHV>mBT+47LYT)2=#7J9WikH0}4``#Kc_5yZR~!3;Y^#1%n4 zcO$~t8pX9MxM3{^+xQzoNAPUc8fg~Y!CS$&=-8eIdQinn!d62#Hm&kQ0plV}1I%;k z$lEo);7xX3%n`E=rek__=J}2O?6LubX zi8?F6y4HT`1O-HqRs097eSx|FuXi*<9#L~-!}n7XkvNop?TJPr6QS1rq;H{6sO^^w zFqlBpJY8XxUsN>eqY7f3b8~kWTIQ(;PMMjTC*fUlck;{1%W1>4H?eL*LqmMzS5f9a Vzo|-he~Kk_Ib&y$o9Lke_zM*b!Vdrd diff --git a/src/main/resources/schematics/ruins/Trap_SK-SimpleRightTrap_Closed_50.schematic b/src/main/resources/schematics/ruins/Trap_SK-SimpleRightTrap_Closed_50.schematic index 7fc1d345b25cd96b3e8405e8110cee83fb6fb164..2c27928ab92cfbc9acaf18beceb8f61a2f097c31 100644 GIT binary patch literal 1369 zcmdUuZBWt&0LH1N>n@S)wl&L}<}%Uqt>xW+OB1fmXr18OG$ZOy7DfgonQth;Hm7rf zb0;YZBD-+CLB3IH0!itZFCiMK!z48m5??@(ln_|E+vnZB?)Uk*=XdwqJ-*DXkiU5c zvZ$Mk+dZ~PF&*L2W|Ji3umgCvtB%V1ax~y<81&Z8pv2q$Nnyhu!t(E)b=OLCd%~+Z zb5}s&ncOW(?}cHdBJH)EMW}FCmX|5ntf}w$%?{mgAW~&~aqc|;)*88O+925c)vj%Li~s%z5O3>5if3 zENL%;a+&yXS9bWZti9Q!UseXmpxX))e6)r zMimEc4Wu2|`b+@*(dCtTSbg0O?P_VvU--NR%^2L_;ho7ba6S?;w&N{enmns-4nxQ#3jmvZ4Efai%MfKc@) z#Z8epb~>s6g5_cEab6e5t8m%l@pgxEC1la62^L9GB4RbUI6C{@&GAEP>^p1Tlerhg z*j84Ek^GD2@pRl`Yp(D&T!yH9FFtg~1?kASxj0FMxSvZfWWl?Fq+UdW_2E)ERGsz_Es9h*m7dPk(kABs~)wlI?VZw)}sKB!%13kMd z$osLH)K`M6@y)cAxCTuxLnS2g`kFr$6;L=pZn`fXe6rowcWkY~TXIkeMPeDF`X73? z-*u>9r0S5}Y#mq~Fh>6=`>t&L zRFxgcHyO=`03Y8tCVQWZkz=^q*iQqLl4eGZ=?i=2c0^qhcWT2du9=;NrNU&L2Fg`p zw~by23wKA*645K>8=`mXIm8jBjJiwG4z@p{40_%ew$!t-#7HRJ%@@|}5jHVPRS sXURIAoDR?nh9*An!6R0`0`?c?OtSH{NhdKsqo!T%)L7E^*P9`K0o^31-T(jq literal 1495 zcmb2|=3sz;w|9O0rNc$qKQbTVNl8??+<@w=B)l?ASa)pVy_D6pp!w&gVf8PT&QvwXaUvK-iX0lr5rC0jA@7CY^HUI3E(m5vmzrt#Z zu4J2E&;6WQbmiBS+?1=wX6dT4Z~LTV`DRVz*VNZKe=9%i4Bswy|IV+c&#tXc6OFE# zUi<3so5z*k3N3$EOsoBK?v(ZQ@2c}&w+o&Bn%w!k>WAp_Uzw-g?BDtG*F5t{+k5lA z??~GEuJF>UC1*`uma%aspIlV7`TrXo&&{*%tNlIZ`Fz9Gw>G)vlh4Ins+=r)_szGc zxzCUL_wV|9&GFx_)z|xX8n++6bJq5m&HU$C?<(`^>(1<-bUpLvqR-FQ$A6E0`QV^d z*xmQ@O4zplKk@HL&JX`Z<%hqAt>1NAetp5?4?C)FNzPd}|L*Fqx9?6~+`RhqN&kee zX-ucL?YjO-W?62v$jx7qo15?V?fRYnEA8)pzlY&hHpl(Daf9)Ibhl2u#;)$y49_}w z<@dQfw*L9x_XE!MqSrRFCd}=VW#H<4zjFEG)t_E(+SnX;L23U#N56lca0NBG=96cpOp!a)1R63tl?9|Nf%@GDaXB+&9Yoz6K8Z0q;%5CG(L^~={_dK4wZXSR?$a` zBsihYNc@m(U!Skq{`QKTZuHmpPaZthXNdj#<+i*VUETCOs!*(Gn`1->!-4DEH~PdBxNnA(Kbkvt z?jc>Pd%fl5<>~1k&*lAzEDS42EtJ{zG(FNmRP3&A*gJ8%FSi1WX1DrStv>#B!JE(s zv9fJHLS?>)w5^s*|E>Na=cDVkev#D3qQcFS{ZFquS6o>8{QkT&FahA-&@w$)x;W` z{rUCbXIlP`?{(_@XWTYCye~MrwdW1@=Dly$T68nV*|~l1Um0neb9now%@Z0YJZ<^+ zgk5!Wy=5qcm z|EoLeJ%28)mi>RFy64yRI=R^2sU>g2cdjk9S+jL-QHGcKxZz^Xvo?jg3@2&Md_PHg4- z@!O;JS2})H5~?iU^=l>@mN0+_MX-8n?ce=skL>A{s!#n_iEe+|zA7YdzvHvht4~%> zS;luKJu)nFU1j6JSvs#59%A`do^Wh^hl3+?^vrdMfkuj@hjNztO3dWDqdkLVnUp|< zMt~o8gl1zWA3sYAL*viJRNt#UnTJ|V1~v$~I8-M@2Ac-Y(kYo%vOeL}<$Vf`PCX00 zNSZb}Tx2>u>vqCKHJ=&B*}4pyw7v_kJg>==Ef#U@4x8JooE(L>JgVZxTBR(Z!D>9p z8E2WJ%=b@JV-e$hlEQLz%}z$Q3svk}^6Hd*IWo81XLor-p_z)qf2*&aAs2@Az#_!@}=PL0UTh z8GEltPL-PR=Y4WrB*b2h48A9i{Dpa0`Yxr32)8jb>M*fNI{M6*$;%;dqEta#eroJL zn{H0$28PBOR!C?FC``EDaP4gV5>7@YmQT_bcKz%%QFLfPp498b&_Kpe@?_=kS6iACdgAsK+qJK%l$ta5-&?DBUHMO5#+r07-+z0z zPEr3|->$mV7kLle_$ZaW@N(hP*@0Vkz1mT?gz5fAzt<-Pf0iwZSRB7r@aRb`rOKl6 z*Ha%?_Ik|yT~tthq4;0nlbaQtPtKY5u6uP=YQJJhbn~Zht&-(+O>R#t=Rf_ud-3$T zPm|5u%Db93+?0!dwe&vkx;sz4sa!6ddxQ7*?4t``efwo{%dtRF{j&Lq&+K7l8AV1_ WE9@*2%Rfl`WiQOupK=}@}> literal 1299 zcmb2|=3sz;w{yJnZ-)uExo`TqiTBCH=V}hOO3i8+ZmIPKiLB_>6I!rZ&!u}q$B8M4 z8&_P;-E(HWrofl?p_4R^R!z7b{$%f-CFf2$Z7DKwK5iWEa`4i`lDPT2f4l2M=4^ek z;d=isCHZ;W3{#q_E~+QAH!t!}sJ}6}lWB+d?ia!hsxATyA{>G&46KuEo1`q~urj>S z1POV>@)?IIG%+NkcPKDu2q*1 zUiT!P_3uR&DSfx;hwI$^?y)G>FFb2^_QMk0uL%nM)4uP2%__e4+^pWHI{GKA7%>dn|rU?Xy2E^_t(eu9TTosU=RA8 z{%yz0x4VCQtE&1P@aF59^Ad#*xp((Djudde@^wKpj;D|c3j(PH*_(_xRt2xCTs%3u`-1*kPpjzpP zsX@8>@q_uoiu#R>ju(U^Bv^FuGj1qt5n^RyORU6r9Vgc&$UmqS?m3{KS6-^>FjAH;`0?gKm7U2qxQ~@WYP1V?UqeaJHzeQ zn%gS4rL{#~(8;y+wbS{;@D$$ELw{C#N!%0(J$v@-@AJxM&EOA< z>s$9m+5}=8$E0t69)@|WGw5HC*Ol;ctAcCmoBRs_X;XqC{(rKw*8w|*sVVVbXT0wg zg+I$rX$Y|~F63CKBAgbWe+D$jtZ}yO2VPVL8AHT;Pxe8dnYp3ntvg aea>QHsOI8iW_UK?KVu~S9J`ogMg{=<_boO6 diff --git a/src/main/resources/schematics/ruins/Trap_SK-TrappedStairsUp_Closed_50.schematic b/src/main/resources/schematics/ruins/Trap_SK-TrappedStairsUp_Closed_50.schematic index ab1d150d90785471d572b672a87a51df9851cf00..bfb7bddda4f1d448940ebcf1342cb1bdc87d05e0 100644 GIT binary patch literal 1333 zcmb2|=3oE;7KXQX?&jYLlQ{md`S9$M*_%CYugXmN&Ht_F>guwkSM{uNqqM&Y?JN-L zOUg;H_TIFAVf_~##TJJHz8@@Qj^Fp!S9o^(v&5C>f(nzS72N;MR`f!3)pdcZebXzP zYU(r@7!GJz-?nS~v?Av>OT(Rw4sR~r`Nqk>f0T*QYxTB5Rxyr%C>;TY{%tRrR&I1? z_>|PhP+=m*(crFqh-u~151zaXyj>d{7$Uk@nG&+E=}mYgE+UcsqsuJ7Z&rMxjFpqg ztFOOKiF?&lN^6+hJH+5GdYRWj{vH$9XV{1afpr=CIEAKaNc#WN$_d_4U)9+&<@xbN z-%iQ%+JwKU4cND*bL*umalsa=^yi)Ji!Z&hLAdQ=-wj@6)#fAKArd{@VJ^uJj^^uy zPKvV)D|~KaF*Wf+)q|A}=5n38w7B}A2V1@C`o9L#YBwrt{a^Y$d-?S6$G?|PpZ@ac zM1$*>BVR<;uJ>zRwxV{z^pocwKhG$7JN@R?`1I>_!sc81mTg^SdBtkZwN+08UMEDY zp69&wZ{}JzzOCPuZJlL#<<{J5Ma3(w&bpTMG~o2yYqv~))bFx-Te+ikp8Mu`eJl1) zKA34FU~k&;d)58_cloQ+Hwxt6{`uYnTOfeN9OPsI|2wa`?5K3BZ$)j$-xP(qoQ_{- z<0t(5V{|@mY9$MY1eZmhbHe2VE>aPdx4Rrt4}NNt(YY3rHK9Dgy`G!t7?YpdgEYM` z_EnLMT#ccP)|U?a3M|ihdc%N)OC+H&LUuU~vHI{8+H!2z} z&L-(hU}cdLxM20iZI-|V(F^+>V#H2N=FgC=Q}*SsF-kbh~Axnwgp-A?C3WEIfG<8`nmM3RWkF*B_)aKbbIRi+31re93h3u`CyN zi-Q|jIOvSSwHIq+71q687q758l3Qi(QmdcO*KmdGd*Li3#?jc*aP6V_r6cDKw8f`h z|Esua_j8Ni?Ck8nSDT%AxMSbrHMaw~`9JO}R&W5Dwn--9Pod_7pMO`Jt-qRjIDgTr z|2!(Sl3Vf`d;Akm)+p4q6I3_ zZLCfU7@%B*;=>WYtdsb;b(9#n@G3YQxJQbS|Mtvc(9ksFVW>4S@6nd3uiob) zbkpbY`6HkANqswP&=tSutDWnr>wNyV{(GDcKRNY={3?fUO7B%FAFlMMsr{Wir=?Nm zI8gQN#YQj6-4mx&)O}a^)D~2;zo7r!6TQ0@o~MsKs<`%Rv3T#TxnEZOc=b(AeBS%= z+#bu_b(EOb`S_{yv-z!`6GY-pY>Bv)rLxz>?a}U=n=b@9 XOCHhUvHAb&CgQyCcm0Qg^% literal 1303 zcmb2|=3sz;w{yJnZ-)uE9p5x>TlDU`;sv|UE#p6M+h)oFhuD&d46&t(Q7x`6%UHTy z=j1(3t@CYMRIfk9iCa;#YoF5lr%NmP#H)T}xS6Ecc{9CLmfW*%)(-Q<2X?>mthV5C zQ<9(01+*olFygCl1|NH2eGO;j}E#qUnr1@~N6vG7vSs-5rsH5T34Jn1U?jjLZa~APl@G;rXWSQIf zW!K%jXWXiO_t;jL?rCMb5q=|&;R1U;Bh-g@C>OR%^)K1u9_;MCTHpHi^n>q#5AIbh ze(7X&e%a@f84Bw8dshBlAlrJ)Gd}8G#JycmFksWR;#Y+F1!{VxHgV+tKXuizd~8E?pxVZuUK_u$xaQ(7Px9>k>JLBM;181(YYFYTSY--_RUp8H!L{7~ql8L!_fl7#lff~Q?LLH!z zkg6FRshm7KO_P9@X%Nj=keIOGq=CT#m#l=SOMkC^U8mkSXZw=R%gy=JKGpi~;{WgX z?D6IQUMkn57!OW(V8Q1UnCPmJQm5}cf#s#OmqMiR)de{Z{pz_{lA9(g+q`kzRxnwe z!)cm;vdFgeyFS+&3$ZP9V`5C&D$v~GxWV_t`S!mY6CSl^t`ul4_vA=pJuWGv@LTuD z315k$Pw(GIVK0(axS{!kt>dxGbw!6yX4>E9MonVljGBJmL%8Ks%OS=`HR1gXo(&5W zGGgnLeFaK5e=$F4Vz^oD`1+G{X48hn3C;~Ir{(YezY-{*U@E>vZ~sI!j@hizOe*$? z^G-~j)1v6`N*AnEO6!V}Lj`Nog3_P8CO7>Pvl}e5yVyJ=-v@9Aw8(&s3-VXY|GJIs z#L=TizcKvO)pt1b{?3|xb95Z#zAADuHce0l8}vqmYu>4Kzn!midmsNYj`*HuWCR;FNot0qcS`W2`F%w3V=P8sc4?4^HY}T90%Y@>^OE_iU=TRfvQOG0eCs});2{P zil}I%9>WrE<58U5Xm?8!&i!EhXsq+%B#6cnm4xv2O#t3UOLG_k;KZ#aq4g%AwMl{HZf|8RwaH2VGq&EO%+;ZV52m%! zM2)`FcAA6$=G9`8P^(F(eYF#rx`hi309V$%(2=nvk-!9h{15d)_i=FOAm(ogQOSMp2uN&8e18qx?wT)L;G3W$+}_bd3sQNJDPjc`)=I(e%$*Z zgjQJivz~gVZVyL0)$Kvu+z$VKt&thn_2KwF9&X0H%{(t!VKpyenpH^^ z^K3L_AuJD9lJfCEtm^JYEH__eJ87Oh8YD4$60_a<=vuy?X1^4VhIyIxPxt)lWY5;g zo*UP&=Pa+YeGS*y9$)8T=sZcYooW!iSq{Ai{r$Xe#}7U^ce$h-(2?@!i}|X!MueQ=P)#n_vxx3V5*wEIa}vUC)94Y z8-$jch1yL*ooR&HqZ6MP>Ws|rW?mXnSYhU-Sy0*6tQur9h!tD zZP%H6;&muA2u=EI8I6X}>;qm%VTJiJ`@(wKy*zZh&ZN*$rCVtdYP8biP-smn)S47p zJua+k3M#a}1G;Z_-UvT*0!lfuVm6Ur*j($V;CxOH}P znEa81PtRT#Y5yp=^*R>m`GK;kXC7|t$I)>3i|s+U`?nL> x+Aq?wd{xw)VN#`GV|)=Wl4AefX59_9$Hz9~UYeCL&ywNs&|ecH8Dt&i0RTJ&t0({f delta 823 zcmV-71IYaS2J8lZABzY800000008aXO;6iq00-~~2si<{X}#^GhfUiD*o(xuZ9471 zv_mWHx&$m@l_nAKRJwCN(Im8MKgd4JoB$cb8MeR+PWb(hu;cvw*a?sSA#licXuUk> z#cw)kau9_^yOVZ8`0zdet7x-^ApkCXR3`MOOlY?#5H(vb+dE}O0$8v|Woj-9t$ke8 zNQFxMPP$Yu`=R zzMroB5W+@S`y<=+vuycpe57o7nk_yJw;${C3dj1Q!m*zG$5@|CpT~FYVch@aV?6k1OY51$Ls zYw8wi*DzGa=jpB?pi<>7&a*4333a>O5}}=Pp>CPbUKOG4_{0lCdt(cHGH(niR#>D_hXq*sga69;jF6ASyAY(^J4u|vBJ_>_F^sUr|jNP$53JWDppupb^cR8 znYZ1QyrW*)kYa^ey03p;2`wt5SYhGH6|2x{hmo-&5#Xvb005}9@DGImYTDN10RRc7 BlvMx# diff --git a/src/main/resources/schematics/ruins/complexHall_buggyTopEntry1_open_100.schematic b/src/main/resources/schematics/ruins/complexHall_buggyTopEntry1_open_100.schematic index 6da42a7540671ffb86b42321bd57dd12597e6afa..8d70849f70a4a8c8e5b9213a87bd1a8ae7678067 100644 GIT binary patch literal 1353 zcmdUuZ7|yh0LHa?v!P*URLgPgDvY#*6{(=pmeMw+RYXQgyrs10jSwa?${lkt@1^FZ zhgK#^f>x09G(sXWVTgE18nj*_5fT3g>1wyHyW7`2pMTH&?)mUo7k{dAm}5H9dCmii zJC+Qw3yXU^x766exOig^G;eD9=IGgD*CIl|sTQPH!5waJB)Z@SblwaiyPoshbJBJ~ z#%b)>-X5KSX^E0x_6hM4k5c^l4gn7L&<~7MvJQ;B`iu@0m+D{2ban2A_D3c!-$I&T zp2R^H&=4ND$B2X?t?4B2#Nw!cZm)_7UuAjGhG-L$w(ei2yQcKv-*$l-{5B&^0rI<_ zEHN;Dsu%SQqVafirMVeOn%nN9gN=WqIgF zDP=jbzxVx{ZzIsKkZxFze11rbHPmw~d`I!t!2|MXZ|}av-OqidiqhHcq4d|8Qwym_ z{&-dsPy~*MIQb4KwL`PldTTNwf#C^1j9G0Dwa@cMR8#CA@V?`~o zr==~#(sV@)9JCWpucUHEGYeFemvQIn@|32sr5_ateQc4M}WmMq<8*vt8JG5r)5X zuaPMU$#Rpx6Rm)bOkb7;5+$;YDF?d-D&8dVnM2n0&3@GtkEjzqG{M2hv&?fg1FWl@ zqKmZH{>b)55;vNUXb6tc!&y6^ioZgUE_Sn9ZwuHKkUN6GCVpa%04s>ELqgO^nxrj# zx@zVYr7#rO+5H;k5FMnRjVgxR2sF4UQ0{l&Y5b>?+1}r1i{LPrd6>xbP_)9%lyYb^2Q;+{A z&_8Fp>%sJQ-|Hv9%!zs|+zH~~?z=(Kc3qutoYJ5nEP{B5$4O6Givn5Is1EC|h8AD6H65?~rWAFe5fFmqy|!3t0@ZN$1;ivqO61n*WB*R{=YLj_x|&|Gw(bfe>^kq zUrM%sex1b$X@btoKVwmN4y+u*DzT#K9l>LerWK`A4oLMD{B$)T{40 z-k_K>pTs6x-W1 z9haQ^O2VrdC3Y(D{Eh1TP7(dC@&0{RP`uu3{;>)T%g}zXA%++59SPd5EDA`Rym{o_ zoFeKXdg=W6DA&YXkUn$X&6zo_JH4%C286%_TDSMcdi2hm+8q#(bZFN{9w2M9Nw@Pi z+dm3J<9R~c>`I#ChBjO>Mx*a+Wk|8(4wO{Ha3^UdV3Y$Ry7dVCnxKOS4PbO_*mH7V z8obUn!GuIiI5!+G)3=m6{k`F2;`q@bAIBTRg>d{l&T&()9r14iZGsAhZ@Q4O%3LtlTB5wRhe?)$8`lJU7 zE#zi%I`)sQ|FGbLTD#$2;?qoeP}lpus$So?eB!<3Z>05WmW|RRlX|Gg`nrL6tuGO> zjy{eL$e(os}PMYbpJEn&O(p6`j&J@|Y-? zWY!TC-#9Omy)SK+yW)0nTgWnThF`=?%NkRW!dw@umSGqrOE?*p9MhzkLZkSCdBklk#)q?a`ksH;i2TcYBJE( z*P6s0DH+Bz+CMjVw`cU(5G26B7^uP0D~%*<7%ZRnNOgk{-e6sbzGZx-8(Eer|iioPdCOLhY-nw$ziLv7#>r z?RN{9Pl@7b7trb${iSSYwzw4;fv=6D!VUAe`aE56b-9N4leB5x0h&zSooH^Aziq)_ zY`82>_uArbl@MnO)*hO1p~2J7>6Yd@7<@7zD2#lP+BBxSFvpm+0^cwCMNO+Twe3rD z!s?iR>x)0nZ<{@?sSrZ#L8oQLFOnX&gB^vGo-C@y3F_n+#Se1v4swxY?@K?z@nk z7sIQL)n*DQS915H=qM4#DNyrs+t``N&ao7zjkjpIT^NE=+idat%Bl|hFWsJnO$h6s+fhsj3l!8gU(C1mW?cE}4*+AMf-vJk6J2GBC zQ6*(*tN_Q_8yru>%6A! znOsNeA6A4NdB<%Kb@}R51jl{bb;1@;Pb|`Nho5RY63GLQe#hR@0AK((b}RI={{H^T zfm@N(E7vM2;8p+n+U)M_>l?T4TbEhSsOV^R{Qp~M)9;TXD1M96bs=-#-r>(&K>r0( CQIGck diff --git a/src/main/resources/schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100.schematic b/src/main/resources/schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100.schematic index e18f8e7ff76b74c4ca57ae360988be3a64097dd6..9884a036e1de10c933666b9a6d00669b942cd269 100644 GIT binary patch literal 1097 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 N`^%3db-u1l3;+OUNA3Us literal 1334 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 Zc0iIN(5zB7wHJ1*esetU;);0R>>ry+mD~UT literal 1524 zcmb2|=3sz;w|CFx$+$|iK0M`c$?TEUrlhlW94cZPm^yRrc8W$DCc5aTUT;k)RF5n) z{Bhs*^4;L4^S+ z`hxl0r=r)?C)TWexLzk{NoLO1$;*T0*?wc=N`Al5ykVzD=AoTpyOvu>A2p3Dl)lGk z#lH1owcnAnvVzTX*aPe$_x0D_n025>f6c9G7KL=N-Ss=-&-~bF#-Q@)hpIrMM!_WXK_pRdpU?pNIN|6O4`{|4r1^Q&yWu6XI{dm=G@QC-R+;YDgK zTUS)i&#UA2)qnLzbG3L#@s}g&yIyY17p}T^;76Rx>M&uen{Ow4zsGg>ch)4GK(8%} zJLN2HEu1FZH!H5>v+;i6){HA(u4h$+=lptXZL&K2+NSTlr>(OsFFk1vj8JnezrSNo z#pAVWuCAGXKjBNJ!mbKu-OK&SrmyZFTBz}Hi*<_W#j~4?_nm$9=(Edd|Jv7|`m-br*5ryMB*@=Vk<^2Hq3i zE0kKe-({!!=iZnX$&2LevnH+SQWDl(rEPR^(JmS@v@#aCE}HA678MenvdFd66~x#A zj0iiMy7CgKIK4xk?fdS>{cVrZ&--V-R)76}W`-%}BDvP6=e4rD{&TSWnD(ZKuhCYs zO#4fJ9z2}(`rGHu6H(8dno1p|?_XEY2{WA5S9dDRqvG3MjngYi@9us3EKYXii_q1d z13w?DovXUW^wff@+JAWbI*zVdwfMI8r8T9w-m80~)3Z`?v zNarT6zZaFhTE3@e&DL*=A0GR4Cp!C2*LR!aruo*{FS^8?3rf|bzg_({Bk${0$JcMF zf^M}}mgj7`bnc^~pLG)N;>GT3xBX3DQfqxaHuw4U-OJa=Mm#^VwqV;Y70aa3EoZOA z{H|*GZ94htx`_G5*Oo;c<$=bG0y>`)auhcsGp1Frt?OlBR=Gmy*F&p=4A6`=Xb$xZd z_Qu8Ux3AAy%V+g#-n9$%exEGg9_gF6zV@N4E*h_W{deeU zQCD~W4Tsbs*8E)aul&hI{cAa4BC@szPkr4IsS}nt%7%x-*`$pTYx2-Gm)?K? diff --git a/src/main/resources/schematics/ruins/complexHall_mediumPillarStairs_open_100.schematic b/src/main/resources/schematics/ruins/complexHall_mediumPillarStairs_open_100.schematic index 5470f3ceff83de8f5199fc8d129cff4c304c4aae..cf48047ff1fb0ea84a6c604d15810fc2ccb4feea 100644 GIT binary patch literal 1163 zcmb2|=3oE;7KXQX&*lk-OEf$*HvZ?i%5Cbcyr|NHebou>uB-K;R%U5$>}fk9zf! zFZ=SWlnHDL14GBMxYeH?{oAzc`r@alzMKEtd?MS+pZZUfp*7=QwTsBlJ6#1E-U>66 zMehZY3PR>U<{WDShQP0N^Y6*3unS1|klrP;|bIj^-e7W)YwY#bq3i|IfGBPx5y3x)r5FEU;iu-%wro5f` zFYhp%NU&qRv;AO3$(EX&GnYPOY^Z$wxMI((e>)7Vt)guE%u-)pe)aKAoBOs@rkp4C z=8SJTo1b*6!F&Vt6f)&%;lpl!c6X-vT%A={U$ejbuzlO?7{A*$m3ZaP$Iac^{_^zx zWt&fKUE{YnUj4K9-N-5nzxIBA|N1$xbN0k6+43WO_jP7u^U&G1gO^{_pZv0Wv!3mm z%O75T`SMD-q3>SZ_w(lKx7W5oRDZAx(cV3G=^VCqv9;H4+qnO0>eQ<}i*@;@P1Id)^w=x^_VG8n4#vK}5ncW-@N3nU6WT6eW!vO_NZ!19=Kh?u zbtx&OVcVpB?2TRdMvVFYXQL0P7dO3WoNvD9^{SKBQP(Cvn;ZRX>M0JTPh1nH&i!il z;j>+7{wE{m`v>#`o`@=GTc4Kw5qj@H{;$1DlOIU`VC~xDl#-gh_x@pdsUMBTN*zG% z?wMcrdM`hBJACsm8GB{vv^?HZr#`LwvaR+^hXT;lw`tRMMi!dRD|RdS{O#zn;??W+ zR~^3?cK+7=oj0dtK6pO`?BZ#a~AVgtS#Pc_+Pu5-9bN)kqO~j7n#ghe{z&^! zyjWwk;#F2a?kT1CrZ@E|E&`RUC%Vq@{P}wd>@U%|p|ABFa~{0+1}pbb(^gY%0{TU5 zvgl+%N1)AMv;bKXB*92Goyz?X}!QqpD-U{jDe=751FqH zoBZ25*LPQ5(T19@2DSB8w)T5>?1-`XwX?R&(zdeT7EzU-p4Fie_!@rX7$fk2PZ$(za0L)-o3oA zvZ(BJWuN%wZ;`*AHE-Yc`SRE5OXctTzNb{#&D38e{<*BI^hQ17?ShGp>s^=_02aVD A5dZ)H literal 1236 zcmb2|=3sz;w|CF_MZ3$iKRj3?v1-$M*_6XtJ)mNES;A6|Y1Ly1Q`3*8_ zJ_Cd29Uq1p1@8_pERp(S_p^b$m|uRu;e)6C?aImjT6ZGn%H+4aKNme-x>eF4^0e+u z+uKIvQP-~>-*)StMbE{Ik6nxV>hHd_**^C*J462oSqTP)6-VuA8hmzJ=YC=Np13P- zr~Sp9j2906;`wmn8y{bvc>mVO+xGXO_kS(4iOZ{xnJp`?FMs^?rmLB}6?wmpZ%bub z^VHs)F{ktJv)O7)P#;I zU+?To0~z)#{jph}?e_IE$TSR}{lEZhI3Mxv#`*c@maRYk{O!#ZZ~xoXmi}dS;J5qt zP^?GHr-sJon7l5Ewe^B zIwtk_)O%ZdZ~AWAd#CJu0B_ZnCz495=dKm|)Ay$8Z2WxP`&OH-P1P0ub8uZqSv%|h z*P9-kzO?Bb>;C-CyvdRGFYb!l^8Sw1`VhAcus+^>55CvFw0nJ8=ZDyzrb+1?Ys#+e ze&GL0?9a^&+e;9FW@;=B} zlAJ&za*Q{hJKJ^o>CW`dd9^j$-`!C&x8L(T<8-*}yE{3jw>-$70=ByJUhK}j6Yftx zTP5~q;rX@iGmM;6&I?4oT~i&nck7h<(<47DHWmVlzU}X)`*o;p#Xvh9SK@$9o{>b1K|{L=1! zeRJvM&0iHom(vGR{Ot5iIS-Sb;{mEvP_L0+7h zz2xtygY95oXgD8!@e3=%2DkOorzSir$KDb1y z{c_2Vq#y4Vy;-jRe@$C+>zc_``+3~*Uv+$63E=dE6TNG-Md&$?i*|Ng(95C2}aUI3)#M!M_8FQN<|EM{8&4BPxh zz2EQEnJ3o{B#VBZcv5c4+44`mk*`Y9_4&#P@>d7gXo`j7egYfrD^|FC&oZt=9r<(rlnDRtN=Zkn6A zT6|h~_a5H*Z@CU(*Up~$v`+W4U#f2^k^yOX7iUV>P5l04VtMY&a;AlR|nHs^dj^eJoNcGu^5KPvs@E3ad->b~T@98DxMu1fBEvrtmd zWuCyzUvJL!?J|qr{^`J*R|0D4-gDQydE6~~&nfWE-|oq&>5=}AvW=BA-YIj>UK<-3 zG3Wn@OK;_)s#3yY{;mk|yLLBe+tKJ9QEznCuKA_2fj@XspG^-kHi$+i7;+`-9RHi||w*O=Z^lCCpW^6&6b%l6%NBGMnhZoA(D^y}o4 zQIiE7pKwk*nX>j|hr*|p6DganrGSITC^8!yk|1NiewgWVZB`El)G%Cg2KFwo z#z51Yjn74Y_x)23JI3<&rSn(6-2M60ry84iKJ)*F{4-s7&hOZI|2p|8hgbcxt}Tu1 zWlNv@sr2ujHEJ(s|CjT7{V}6p>VDt*_akdd_x{O>I)5)^*1o-!-b%7 literal 1368 zcmbVMe=yr;91a;>Tb9|KwdFM3Y?KteOyXJ+bS2p3moA zbkX~WjiXViqFuwc=S+Gs-Ud-7l?-n}grKSRUnsRU;Qk(57UJ|4Ds-+HJyCO!0;Siw zqwNuW&iA!1T!h9w8I=T}07{a3r=zi$`g$8R8H7uF7J ze%tzAuN=XUbhe&2@L0ImYf#B(*_0tJp`KzQ5XJX=+q%WI)Vli01umLKVbeX;`l=$- zLUNTliZs-n{r7x9i+J3eNs$`F0SLtHQmo$QLHn6Ke=%L8`)~3ay(rKxN;Wr>8_>DW zztV@6o&f9Tm0@_w(^(Oo(%m5=o%|M#K9`VNH@?-GE>8($@n%^B)^h-`VAYSotMhkk zmz88RpxeuDRSYJaeFH>c$Yxc?T;m-u6mLpmI`;>45g2mW5#yTR^-_GbZ*U>ppO)Zi zp1HJHrjG&aut(Er@Jjhlry&%>O~jjuL{-M_(&>#?dIL-`ic>6LXya9zV=(J@?tuIc z5))b*71-7^Df8=bEg@5{HD1EW>=X-jKi#+tH+HaBD`Pv&(wSQ=udXS;#?1_hNYO2C zZOS>)Crm;z$ix{;4F0okx;XRzjX`lmAs5KMPFQ<6F%8^Jd5+%N($T?feDZlUrX|Gu z6!WCYB1c+obpi_DQKc!gEb~W3gz#5pfq{2u>UAY!(0ik@giHVKKxRTqN+8vyNXhR9=v_>m2F_}KQ2@SS;mE>XrETsU7y6S&;5)9d2K#sEwp=#w z&Y`cS$sj~CQ-mc#6c>|b(3bKMQywj)MF?*2_vYUSaeAaF! zJBB|NW?vI`Q6LgU(r)$SBS{Z19cmgWc94?jDZ=n@y#0chk+RC?83&{q(cwdHm$ z>(Na7h8s0dt4nv9fX?JFd$kw%syr&q4pcAXF&Y9dxsi+Z#C1wa%Ur_N8&*heO7O6@ z;Bw~A{dDjk(n^*v6^@gnx)LQ3J6L~z!8cw7~i-$ErkBZm| ms{sq2)vSepUbexyk=B2tvDx@v9;6*!Mv<5w6ezy5Mf?MzP^+^5 diff --git a/src/main/resources/schematics/ruins/complexHall_ruinsO_open_100.schematic b/src/main/resources/schematics/ruins/complexHall_ruinsO_open_100.schematic index f89fd2a0fa75821143909f1ce2ef75676455d286..d919619d0913dffd6e3e672846001cf435e28d63 100644 GIT binary patch literal 1181 zcmb2|=3oE;7KXRC&gKb+OEf$*W`43Xz4<*z^O+b0ltV ze#!equWG%o4A(>TZ{{g#-yYiVb9a1xR+09{QoZblmh6ASxu(k}ubV5kZ1;J!yDFjI zN`J8S zkKTD*@s7@qpwQiR3|$54H(KLsMSl0lUJW!U`Dt(V#`NY-(R*hZThs;elBQg@JHk`% z`?+??F{@8;`R`c6dHxrO?f(4X_pIjCZ2R9FUhfgu!{2k%UxwigtF#cq}CJ|ni=L9;^+qb(}h;QKCa2$y)80STwZ?Z<9PMh%{l6yLw9{o`B!CT=@o3Sry>6i2SciYMnw90O!AG^Kz+tZQL<*vQF_xanB z*-P8oUp{zQV_3V@>*`7Dw2SVI1GZffY!Q>(b9g>LE5ldwOwW#6@p4_8(5 zzCI9qR&J&F&a)qCYMc^9`Cms=T;!`U`q}#4w$i+{oGt#Nn|iS8VY%{JON*=DHXM%) z&;QpFzGhqN-tap|4dZM$SD)y5tz8#e5gK}bZL;*Gqg@LxT-)kymtNq`xw`sbtm2;Y zH6Qk7>7TF4KNMrW#PE=RZjt%k*Qa&!PP|>LSLD2^{r-f!UrKWoYtKFC6REPDe7Mb| zW=Hw-<;UB;6z)>w+53!ZeT5|ZzMJje51GF|>>9@NF6N==>sJfxIQBVpy*0jCb<`u` z_JnU9dr!V?`zE=tU{1mP_&K#-rv2S2eTifLahb2?`@VdxysRw3wVCUCt@ACBpuUI8 z-8Dq+`APii7k~IxS*-1T=j&pl>+MsLf4mgrYCXj0d}`uh8z7@;Xfxo6u3_sh3)z2W zGtFbK%gn8>m{Dhu>F+Pr{q)sG|H=EOz5R0V(b4Anvrq1M`_J$G+->P+ODrod+QyZ3 zZ+`aZ^ZHAF%eVX8O8xckEz|j1m!IWa)jOy5nf?5^e9!y){$BZf^3&I+x%c<{e)V!q YWNCQ*3$fELb^fv&dTn`QvxtcS03i1=TL1t6 literal 1410 zcmb2|=3sz;x3>=F35Sa`Je1y^5HyuN@wTh#v;|?W7R7E2x;|52Vu#40V?y~Cw!iQW z>H1aWo3w&s-i`DVK5r&}uGMLHc>e2|JFjDoeek{g|LcbzFZ!F0o_x5c_V3|?j~2YO zt-S}ef}uhnZF54Iu7I1ntOQ$3pK15ghpRI;|2WMrzUTYJ)m{7+PnNkIX4J1cJ>C8N zv4&5-uCYEV5UcxpGu?iD<=gXh8|(J;s((1y@cOj>zmmhAZ2p2;Gaghw+AuBF=J9G`3)c6 zzr1I&$<>+szY6p%l78r?ZxrXRUuU^%@5TJzKa_*Io-zl2H0NU|YvSc>c*%1^*zK=F z%{J!$ubE-KA&zcnPu*|(^W)n`DTPHP`^vxmR?q!Ez4_?H`ReS;pTE7>eR=ca=D*+G z=BqDvH{TRl{pa(=+t<4vf6KY|Eq+hc*H2&WKAipe+P`1FZGqMWoVmHpKSBG}tA&-> ztKFl|A6#AVblun5!uK72*`IHppVdEabN&5dzv=6*8t?vmZ~ePyw!Q4;yd{+dPm}cc z*Tt3WermQ(CdZZ?sI&6^!KWJ!bWBgbYyV&S_@nK=8h89`eDcZaxjDbxj}2d2(k~WV z*Gqf-@X{ZhKhIwM4x8-PHgl$p&1=r;eE;|z+2WhOemFe;O!NDh_jIl2^B5bK-q?Nq z%ii=HkH!ywkJqHGJ^R~i$-ZRH)ESbAt3EtF^eQrUFaP4hay8|lZ8HVaxUx?f7#|8r z^p#9=o1wWz^Y9st;8s(R;$<6_@fa)nh+dnLnAS4$&@7`fJqDo>!F1Nd2#Q<1t-$EG zeDUP#$F9|8+5L6)m0KRvpb_awoisnr<+4tet?DE(j=U*t_ zdzrK=!{Wix>DV?doB<1n1O#X9KS%j-qx$VltL|d-b zLx&VgQzH7E7H%l;kd?f)I6y;3Cdj?*tA+>{cl)4L0xM`47z);I{m-CexLs}bLM8?P DT5F@u diff --git a/src/main/resources/schematics/ruins/complexHall_smallBranchWithExit_closed_100.schematic b/src/main/resources/schematics/ruins/complexHall_smallBranchWithExit_closed_100.schematic index 37a9c095ec851a14fe8b1e77d4f9053cdc4f105b..e9f01c7d15d20b6ae52ce63cda4cbe56ab0721ee 100644 GIT binary patch literal 929 zcmb2|=3oE;7KXQX&*n*oN;Et)E_{4ssp}%v&P`o6zR2y;E^Txb6jdm-J#x81BwcM2 z`^tyMs*K-MOIz^%%+$7In{@8_>MP9e05J(OM1ry5mqa#8TIjr)-;V7JK*V z)kPL{d*-^?PmMKQfBL3UuH8IYzte%cK1bWG_S<~>bk>f!X0JSdJ$m!!;to5B?Qi#Z zlrMk!sC`xDs*|5L&0FsHYt7v2p_iw|-ZeX3u5sy_QRS~y@217yTP^;my+<9*5IIH(&R?e0Z%%mCei=^X&5P;+neuc73zY zz~^UwT^4VV${Iwfn}G|DE*NR-Z^Q`*SsX^TXR8>{XjXQ#QRm-_<{R?wfPk zo4Mb=SW~){JNnM4+4tVOk-hix<;eumnLcW}XZ3I>`FHrJomNwBIw7ny`Q)aP9SWaX zPNZzgF;eQVQ8b#VGkd5iVTMFf!~Zk`ujuoqBd?ZT{r2ghL9Ovhezjcdc$;7Q{?x|3 zf44=yyl&;G$h)#j_4!{dyES*Z{%-f~b-Ak^KmUIDFL(Osv`^n=mVEz{5_$e|^XAok mubWpzUdatUS9a{Q@ymNRgY{4Se0Xx_e#XTv%?CT&nHT^Mv#VbK literal 1099 zcmb2|=3sz;w|5Wvg``Uyf5^XvC*t;!+*vnr&EwidFYD#pTH?EF-o(y19mXun0;?l^ zIm|Eb-TrXFqK1??N>%^%*qu)+`BZ%Fxb=E=Bk8;?z4mfB{qp?jcbgr5Cly;rZ~OLV z10&Rqn8NG7><(Cm{kA)hp0M;iGed2}``--jPgn=qrtv`45J`O~%-Qm_dUB-s>tnyQ z-RtA?rT6otKi-?SWApuW_ix_3E0?!rc72)keCcXZNe~ zAHRI^?%PE3o%em^&d%R!c~{oI?)L88#&_lO&&DS`o&R(H@4A0Ka{g7+{`*n#uVVGr zf)4p}GLK%{@qK(e)4AsQamBv-eOp_$C+j|Z8&UnaY|XZy_x$oxGSGDr`)mMD|wDYq6+f(<%o~JZ>?|ShrVdWd={Vm=ni{bjna_3{0GKmU9H zr5_LTSHBq;YNYahFvuUx*!lZ)YU<+YM-RQZ_G0b#xc3Psb2Ja$6pDZH|HKQ=Xcx8L z4Q~=w=6rddv2snU)35Khm@7-msf5xw7(dH|w=k7SFyXVF8xpN;)oncML1qLrLmxQ0+Ef_!(um_woRF?wRTs=QmwU9QcYOZdy?Lq znCH7*$NX|_-eNO>uFfp^L+5MkZ2DQc9)5i&QEQcav+IYF?4QCCBdgq9-!k-h=b6V& zzSRDmlc6Jj`+MFyaaX^yF>E_jcVD`~U>!F@%+p;A2SS02FFEPvZ`1Y|Z=Sq4iVZ+-r7j(<(y;K;r+Gk^r55K z`laU__t~7W+3`QYZqkNuBdUc6oD^|}66tqneF zF3i{Bt(V-I@3-sA60fhPzy0{b-@s@8@9TN~_rLEcZr^+v7%V%MYU$tJd--bBNw!K! zhm~^Y8{h9@uqm2&{@#h1ubDQK8lB%B7q&Zk;(G3{cT>OaY(M=~ntrzR^q1oB-6!vTl6$GN=GD~Ow zX`S3NX7=j#+Uru9OWEu08UH!6_o>|_-Lqj8PnWA-wK9rq(0RYYvU+Asa@h6m#pQ1| zzj)|c_VZ3%#q6tjo3_7k{<`b!i4KKNEhkdE%YTY|dGz

CF$1qe{;;?$6v>UBNN` zR$mW?l7ENKwfL~-se9k#Y8xwc*eDuB*5CX(d*ZikQzZpm<_XMPv;R!v`vdv`PdF!@ zOgWn3B2ej+Viaizk@N}kabuaN?xHqXbh4o1AXEZPB_AqRHE;P|Z7f%MH>19=SiiRZ z&OAB)<(q$Ao%ep+BacQ&a&?} z-E!@edOB?z-hTf4qf%vpMOCqd+~1kW(yle(e)aX`b!M;p+um0_z3TthbN>|m`P>W> z-miGgU9t1!&^*JTAjM0zxF&wCU$IWo(`921R<9vOm0*~gW@n!ji{`b}1>|B0| z{nd4egyJ`@(HrddyD(o{Z@$^edS2b0s3@5$sZ-N;pN#WgdyXMu`D4-Tt+&6&^<|rV zx)~NXm2pD)!@X?zb_`qAHvXT*4)qveYIaGKU)?_oNx!!A>Fk@=`=5H5|M%og`@{c^ zrdrlj8``~}Kkfa0iMTmuQ`?_@U7s#*?{n_->^RHX-~ayhi`Vb}{d&`s)BpeF-r4b* zyTNz0%qRCv_o9q%EIWQ|lhNnR2j1QK@#R;f!Ub-#KVR!E`~E-S6TijQ=EiKf=$T*h z;?(=XQ|?-X7x)VV*c`*>CVpUbh=X4hBN)#m)W5TRB*;qJL}Rpl$+dd0;> zW|U>`IecDV^7Qa&v+kZfXUwMO`svfV(6aIhnTlNg&1@?A@8eP*?`Gb+Cp-Ft)Py~I zHeFc5c=Gh_@|!#KUjI`xQK+o^uJ`(C>RkI4pxX61rr8dkKAmy`X&fjHGcby#&G>us zeEhjK`E%+|&n8;_EB^8C8GpmReZODNkGHE&TK@OKS5}4(PD}Mx?@11yw{~()$aKan zS@mW$-&qsRtG?fRa^`QQ4aHjDxBH#j7I*S{>%m`}4)(rHZMKZwx6Oa`X8+K$Y@1fC zGg_>iDmin_=bT;5G4*Rsxh*!53Qf7}e|q!5(&E?IzwT_deR}Ja+)ERk=AG-ym1i6O zc(d<9=cXQ?Yn5TUAKw4{XVaU1b@sQ<`d+3~jf6M-tkCY;T0x_`>e zSbOu;^C#DLSKrLI*%tquXaA>LS@JLY(u((dz6?=!HP`fd{^a#%*qUEn+x;c-%hlX( zUw8h!>V59plUVH z_;>hRi#1zu+G^*vxo12k*eDuBmft+AKY3lQx-nEX?eO-8<{FhwDMpdTlAM#&UDPI< aPM)YR*ae`u)y7}*KeHuAoaHrVCI$dQAty}$ diff --git a/src/main/resources/schematics/ruins/complexHall_tntPuzzleTrap_closed_50.schematic b/src/main/resources/schematics/ruins/complexHall_tntPuzzleTrap_closed_50.schematic index c0aa9548281372e1fce6ff5030de381e9c6b54ab..b808dd1f9f0498dc562eb9d4d80398b9f32f9d13 100644 GIT binary patch literal 1682 zcmd^)TT~JT0ERi0vzlhhyqBETAstQ)XFYJlcwDfz2*4(8l}a|WHAI{8COn7**bDC zorbz)4ud?u(R?s9xQVSDBw0roBp*oFGKbo3=$%1x006FXocgGLnE-(OV>YN7Q=kE$ z)UUQmCOg1$$^4C#JR zL`hkwW@}+{GZ%Xf(0+8U7zlUX=7ss_sGnLe6#odews#(aQaNH5vSJe;Y0Uig7+e@? zub6*}x5=9qNKecuO#$tW^?8D--pWML;CcUz?T}9}uMK}c`j3%x%D4VX@r%>Dt~)$l zBZQ@{Z5~asG7vKHt)=0J%>1eK-M!CRs`soY#QJ3txJ-0>aw1xzjf1THykk_1n4}*5 zm%he+>u2kZx$h8B>gGLn64_lJfUh;eD*-C4oB-U@7x3oEhMN~z6)F6JeavS2XdH9$ z0&darWZ>z6%1F3EE{TJCxKoRzNMs4!YPH=#_)XetNibToFQ|X27u}D?g1+VXA(3`9 zEU5tL!r?}{BkC9$KS3I^l1IH?V$-?XY_Y+^DWp1@d}N8oO~qbsR5n^i1gA4XCQ6XT zZKKC;MJRwZ;1HF^gKd7vfpL5Zb;kMLBop&^QmFhb27wGG=4)|JWFVH5!mJA7fOXZi zyn=XD&5$n+WW3n$uGr4ASn*0Aqs8-4b;5XJG9hMW@p9Dn%;8^y&=#H0z-sFuG_iq_ zJ3T95(9&k9{T_$EGEjTcN)>x0BbI+^Hs77e9BS?1amu#fn1#Cn z2k`|Kw4x|D5LxDz2ZjZQgXC|*gbcdhQmcRWxNy|ABw%`>fQNCNGmc4xxp54qotLeK z+XiwItb3=%jaWTXy%8+w1=HZ!UcBCCITCJz?3toqK!jM5R(_s%|J~rC2Rt7MB~zqc zL0DfKf2{DL2d8C0g@EbrmrC_O@PQcbS(Bbum}Ns$NO~HicpGEdlCV(3+#BOKSxymJ)8)WsFeGiH;{((kqivb@XSPHS0>QKgg>)Da)7Z>P+7&r?@)7^+Z^&ura4r`P9Zit zkbtpJj^{dmVHsRE+U9ns*|#w527@$@)U~{fgohyo0#}p|&ILo&XIljjb^q+RTqQad z!f^y+FeP+4FX4YzJmCI8iW&3{olchw)2#x0e0(MnI&&-8Y<9{cW%e7@IrHbqZ%@J1 zQR>tk;Q{736Uxror?77PN}PIjsQmo?oKZxrc!K%)1NhF3G2AC7+C#d9HfcCxJA&8d zmwOotDa+!YF}m!wNg8x`XjM&CL(XOucH>C9zesM}shD{L5>=&<^pMajy)pmbp=*fS zgHp2av#UrnU(_9I>EB@@-IXBi4(Y74?T#%3zro@&ShxelbWaV{E*U6bxi zU|nAay;w<26Srx{jn3MB98nD~>V%yyQiIn@JG5t3SPI{f>J<}%BQAC})*Ar71D4Y` AT>t<8 literal 1813 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 literal 1562 zcmd6nZBP;h7{{^g%JpV%;7f+-)SODSS(uf&xe#AY%nCCoG0Ox=U6|qT zS{-U~Dj*6{3c7UXTM2;&nhKTcinVYlbY^WnMs|L=bHyT_r>67Xr} z6e`4axJ~!C)z+p1A>(Ta0o4l?*R+@FoRFQqAvIv$ZR>^@pcKhbdo&ZieOkh(n=^DS z-#cS9xmmfTl{CRg*~gaS_?)y}{pc6e zUE~#icZ)}GQObVoI>5`?Ya?5|05R6>_$>YSbZ?IT_lY~!eMayvR%2NnA^Tkhv@&d$ zaZNpy8uzCr9r_{uV7sua%8EZTknWaDzOO`t@U95JVSeOtMX!;z-v2aa{d!b!63(Za^8Q}& z6c9NDEZF9HS4c|}>WD#o8ybm{G1=Nn@Z>_1pvr}*Xm~)J-{^3%cnpwbT|=vqWy8hz zb2UY7b9N;?{o2l1LAL0vNbGv3TD^L>0~<{}*0ZCsqqN`r=7y9-6aS&mVjol$)JaUR z9P~E&Qrpw-X_J(qj5jn#N=qrjexSKl9Lvpi(t>=tGo^y{5q#cM{{(S7Y1dW&!-riq+nZmtT3Mo|L;$m|Mr1o+pEF24u*SseK@-l-Vx4j zCOc_UmvvnvbIWI8avLXHI%01{E={*hMcS`$%A>zazynRu%*v3=ix%luVrNpHIQJnc zoLBY+&#pPzeI0w8JyP6bj^<&b|!C$wcMeKUK26hL^#m*$`_by~Q zE3;3N`NJbi7=*{UIQUFgNwbeLF|?*MXuQlBzuTWZGI9fXm*;6U+%^mJ?cVb4UYWYf z6Wqbd<6$}wk;hN(YZ&UP7}C4D>@LXOOx5T3$`?jL{ra}+GKT!5bc297mB0apemG2c z=uVVbg(_U+xup&5&FGz8~Nivm@W5diMB$yb%>+^`8r$gm#?F|)oS@NzZD%0yE zUM-`v-IPJuowkaXs18vMMbZ?lx!^SICzebTw0e7zC}keR8WpxLd<22r50;j2+$VR} z*%6EaFlLdjoD;~pe)ko>708~nQqLtC=;0WDX&wlY$ULxMhc{U7vJdM4P6jkF800Av zGJ_#vp5JDKmJ*-q@E1?9TR;J~J`$cI*XI-`JYfk_T9#i1$GdlpJOGgC=Q^4ttLJpMgHNv79pAtA?fTv4ZpF9ky?;#oY~1p-sM~|Kz zEZCU2@5iO*eCE;lo1RvS+3&w3dUjFo_1AWB_gFaV=XWOh#1`(8=lm@swtH^Cx?k6s zPdNNf5KrE^MdquSF2DQVf-N;iw|d)Liub(JeeuNc(mUG^{%2JP{;Rxp`=bdb+;e^zDE7bD{l94AtKAImk`o zPj_z9bia6oId6?#@4CF8Ls>UI{HoN?zZ@P@TenwuUEHU0aq9DThLsoh&-=$XPwVRe zp?H;f8FIC!|2_FI(K!57;g`(g9~%8VX3H=8A5$T_eE)j}k178-HA}_w`c8Xh{#x}? zU-9G4$%nNnk6yXUcH;1Z>2KJq6;lscGCqhGT7T-xx_dhNr(E8DX7i&({`r@`9{XaNVOj7<){ww_jox!WRqjjjN{KGj$J9}T_31%r^Db*^_5GxDf;b|HGK<(Ck4!q z2b%qHvntk03ww(Hf|-KW!Zx~uZquq*8hXu MSvW7>a}g5*0Ez$%`v3p{ literal 1408 zcmb2|=3sz;x3>cQq{BrT9(HFw4lw0D$)@$xFi`vJ!rH8*c8^(DMLgCdb;_2A-*s8K z;mP65e!O_|;hQIKchr7<{P4|&w|gtD zGB8wd{r3O0$N%>m2J1tfybWtV{8ofVCs=gl6>gMotj)Z>TUO(GubczZ z;mLP1wrt;YN8VbL(c+!;qYv+TwH}9)=_ubz1L!efDV{VvC z|HqKSYA?*VK~%>B8UVyo8$$VReV%W3&M!^f{dx80^Ygbi$MdJV*UyugH*b4>{CvND ze*RnE_s^dr$Ga)8`rGM?$G>lW{H^E?U)=uc@6WzmzRmx9?ccB8S>q2^)cn@|TsZUI zx@Ylwg#Glb9{$PKc$2f~>pW?>gL5nGug|V7KfF8G#A@c@&2^AT>a;pM$fyKIZA z?_b}&P3pV&p?lsva#t?L-LOu1Ab3RYQ4;s1Y2SN16bqeCHyzLIWkGc?y|4u~cJP=a_6B)v7= zUViQ#`*~ZZFaGvcUj2RA@wZQR*j5++dil2f^S1AguBP9Ref#OWty+AJ(Vl-lz8-EZ z^S7GWQqHc>{^4cLa#~eMGye$3WW3v(QeRMU{*YJPWwRh?a0@UQRW zAM2O=xI4AymenElw)FILbGiNh)(HEtJxnQ;xclf?`Ll%&KP+9x9c|K+SNPdl`Ocz( z1%F?^d&76yK)&2?4o}m`S06az7YFPRedti)*tI|Sq}WNYjLTv5nqH@eVJ-9XYp@K7*0#+u84K(;^WX(KXwRR2oqoJwN+axZqp#t*CZ4{iv%HTjJSpRs%o?n zmYZ868WF0^7jD;539ikh8XB}d>mxzr2uZU`wjaCe-@QNHd+)vXd7gWod!5LK0fsUK ztjm9Z$E4T{Z1yePyEODX!NM#FB$x`ksDyFZWXtE?%b4$=oo#8~Ta*#$#jV8ZVp1xT zLp`(i=g|C%%^lY-JM==|rQI#-dYd3uzY>L_#)`z*RJ39P?8hqp;Fm-iWen{&li^s- zh1DXF55x4oF>yKqj+l+b$zQQs9)bMA6^&U3=Rvl7A5_P>`i=F}YM=r1bxZ!aHYd@f zuSDY#qax)Jz$}8`f~yZc2-a1Xkd&b=Y-8TWl;On9v!{Su!b$ahQ&z?c_5FBOC$Q$- z&fU2FMKxEk*Xsw4(ZxYM#776Ky=;Dk001}Oteyf;k6da{0VFhBOZn;62I+lHvYPTH z4FHTfMjUUEj_*r+6_(L}2xg`xAp5Ped58<__au)#uZ;tMgwfJ4K%sfz&!K(C7>wCd zJC#-g?W((<8TmeGUBd|3#}7BWsnu78RPpb-V)4cHW5JTmjoByLR7bwtNpWXfZ|79y zjzNCV!(fDfDUTW8$e2VRZ~~s;W!;8r_Gi>o;3vHQU36S){OCd7T-Bj8Z7zbPIRPiW zXevnG*{7W8+&_FEs_x1^*EiwPhf%nUNMxIPZDT|v@4{F9l4V?(r6k{lAoG+Ap6$Zi zZ4_0iA&7V!K~+ zL>5~0F#jT212Kumi>fRjN^6u*JkTVEIG2h2&^g^!Rn4%wy*ceFtw&Xmtm z%(8mqOcVRm)L=78-tZpBn>KQNLQ=kt*y`Xc+EVpAN=qDz+YHolfS?q%bTXiv97D#O zzJp72mP3uqIusJwF&^!Bo$ZFlsz9!Bbx5a*-GaQhl4htpv3Hg&U%NVyT`)BrVwpZR zd|YKEdw_LtCODv=`W#)FfRVS5MqbioMDk?p(?Y)Et9L@o^odxJok{BD9kVhYyAed@ zR&(LYBj%b?sk@@PB-gPo4vfd{+`Pag()e6z?tBeb(uA6H_H)+@0{)b6M?qPMA0)r5Im z|18sMFW54)o0p8PEg%hdV@4C7x}{f5OVRA4Bh-gXwJ~8?d-7n4KfGTmjSe_O`DNxZ zC9e`2&RMP$YO~=c{SsSS^z@1D&`}0H9(liDth8WxmrWh`WN{+CJaaZ(Z%!1w@46m- G5b!t0dT{Fi literal 1384 zcmc&z`%{u>82wx)*`^iUt;ri^W}B5VHJCAxnI&nHS#6HeXNjAEPH5`pqNs>&Hnp>q zNGuq#Lep)wxYg%)2|;4Z1eG zOJKPs`oGKeOI%krK(Fa>PYba0p*PT@23`13gL_`Z#ADBF_f>IZF3)3nVrHWzc9Bp% zt-+f3;STL=V4^22rTCacf-sVsLt#pJL}ao*zeawBqnPsOgvU87%_|fD5Y>}qJM=pb z1{p*h`ckZ}S7D-ldf%)yvnP#3iXQg#E$Z5hO0}w(S4WbzVk7)M!arl9&JSuX9|{%b z-Qy+Nb{`)Z$KlBhM7CeCw|my+n<7OEZ7Z)88uHGFw`}&1Ik3s05>qe7abdV_c4W`o zyx2O{nW>)}<#Q61xOr99*L{cEiCbNPvSeGF_UbJ%&UH~=**0zsy+x&5CkW#S=wdg^ zW$kUj6RX`k??lYHAOS`e-Vt^&ViWA}_9ASnDSPB83@Br+N(F4IZ9qbU*TZxbt1k=# zB$$KN{^R#whws$~3T@ALwX9m!odRC!phbk3qf+u`%$k9bCTL-BX5#(80mrDG_3BQD zK@>{E6j`0)jZ{S_YzJQ9oSb1)DU~5Z(uEg_4c@Irr3(P`WP@!_tDLE)OCK!MW$w>I zo-pd53uoekg2K8eLN6Wf#ZZ{Mh(AjyOHj$j=+ODkqfsq zB(6Gqqm@DgYuyMNq@m|^WgTzXM6GXSp&Yskx}q5WJLt1j0L^8$Fk*wHjLtT6Ewo_N z2(78qrbfHCA;9DX@UN6EzxA66S>36++A-M)FZGe`?ri2N=`IZV=1o&vml4l}HLC{N`WX?|y(92||lB6}J1`FG!ndGH>n5th;m5-JboSg6kn?=ILWPR$6t`b&a zr{v-rMvxWG9BN0{p}pyZ%EGJaX(F6z@DD?&<Qs@uQXq3lNZz8lAf98Q*cfFC2<0F=rsHsXFWcq35FvG1J?b{YH4M|kDZnE0W7^%z0nFUtOhNL5LL#`QDSuL)Ju|UcX>wF$K5ab z-1fCx`wBJXX|Rc!X3X)Re*X+5V|vah`{uys=He@8$V> z&j0&a{oHEL?7X*9?{{|eOD1gITlfFi#kUWS`j+H>ep`}nu%nO#?i6Af{FgO&>uoaA z->!)aO_%4t{Nj4yZJqSTKegW4&)+}0&;8|T`}EJxyuz0M(?5GM(Aw9ZE%VEt4~{r0t9FFW{bg^yd2#0Kc~>(3UwyM-?lSe}EA@u)KKIrIeSPtA-TDbR zp{2_WwzD;Cebc-6)ZK~KV#9JSGd-Bqvo>+B;?pf-uKI}>A{PrX`o^pAZ_k=c^}*UnC; ze5Gq+JJ-H{W@4>i+LpWXs-Exq_cgiPxlrm`S;?!f=dGU4v^iU~Gx2!xw%&uf3H!Xm zb3gqn(AQsc{=WU5q`mb^Zx_6JlYNHwbyoWFbG)199k1J8|Mx7ytUY z%L#|W^Vi%rbmFJE0;zQ66t z+h##7&J{pGuGU89M;eK8txky#CRljQa9H*wWjpEf z(_Y>_%^&{u(Gttk_m{obv#;J`5xMp3rv;W)Uh%PYRYtjCxxb!$65jmu(US*XD|UL> w$3%Zh*!%3@DqGw8TD7%>x$BReF7J<@C-<-ZZrR2;K9~0wWEuNqFJfW<0D-CvBLDyZ literal 1349 zcmb2|=3sz;w>MAcMTLtrJnYRszHS!#Nt0#|Nwut{e76F%OL_RZ0^hJ)^{8v!=PJMW z)N4`U(^C(d-8|BMAgMM!snf!~ow>Sjo4);&&G*mi9}7Qx^T{4<4d0#LO+0+*!z6hbo`3syTFKs#&)=}gT1Mx7)fQc83GN@4 z!qo-mooU^aYdTNh8BytKBeqF&H8s@Br>)vl${aJLZ4*f9Uxsh8*F(x-vut9JJCem`qn$UWnw+x%}X zdf@leHh9{06=@-xb*tYP$IjH-Kk?L-O^Ukvx86v+e5!T*>blUtziO5JA@k$DO3ymg zQNDE3(vsAlM|G#}J|BPcl-87&pOUZ3{qlTX5qwjA`SypOX7BxEa8=nZ@b#3fcCY^( zUiU3%$}I+yeGlFy9?%b#`{(fKbMPyfbU|u#M~er&Ds*_Z(&Y z^D`L8cjL-`_vw`Qo2&XavSMun!`vja&S)Mw#i874=^7!KxWZsLhqiK$$TN||)Ru*Z z<|wV{F$kIg(%8mT+_k~zkVm55z-R(Ta`DpzbN(33+p~Md)aUF^f1E#g`=)E%%U^n{UYB)E=9V9~(<^S9O@FiC+g0hU>q@dMq_$2?Ej;oqzb49T z$@$~C7k*rjuBfc4mz6$zvG&G=Z@(`@U;jQ`{Lh^o089#+u9ay+S;DSJ3H?9>eZ{4Mt?0R`F&si zeZKAAjoWi-ujN`?991o={aR* zZs`Z4@=0Fr@BPEG7cwyb0L++hs{jB1 diff --git a/src/main/resources/schematics/ruins/deadEnd_hiddenStaircaseO_open_100.schematic b/src/main/resources/schematics/ruins/deadEnd_hiddenStaircaseO_open_100.schematic index ae42008be4f41bf5075f4efc55e97aa9cb0f979a..9d47bbfe8491a4d3b7f88dc66238ef989078e3d6 100644 GIT binary patch literal 1066 zcmb2|=3oE;7KXPs&gMylOEf%WK2jgL)+;nTRQ%pAp-Hiew!B(2b=8)jX@W;p6q1Dx z=2S87?Y@_7I5CM|;X$DxY^!b8w5=@v zWy1)z0z^2df0@O@ZocXKjWq{f9ktu~#qn_MCwYdSvDy7o>h{n7`MmVT8|6K@mDg|F zGn#z9X-od`+<1mNS^pRV4k@cvKh#RHef7_1a{ktgZMB>Z(R^X+*UcAXNSM#&T62&M zZV8bLg~Og!|9{Oz@^P%}2z?_G8{u58Bd$)D>>zDe$1!@B9~-(1rL<%=&G)H+`OAUQu_Zl=wd zy{{b~&-c;)FYedQV|MrMrv!@(^%&pC0|mjsiCJoY{yclP(fZtt`1}|4b-jPTDyyph zQTe}4nkQU7;ji(X-|i9$Yve!Ye80DLb9%}ATW2OL-)75kclPmHeOH+kKKHQq&foZQ z_RX5UcYN2^uPK-yesBN7d$T>8Z#fmm&yc$vvHMtW>a*ANw$b0jqb7V4xW-@A#j3ga z@yV$M{aadU{?_4xVl*yNv$8>UO%`?K6T@5c|x>+h?+_Quy6&$g0SxBqDAAE|Es z?R>Yk7B4U}&>@>^WispHV(pXne7L;(*Rgf6k0-Z?EwODW<$t%PG*S|zg3DUK zZriyf3%D;m6Mw@Om;6z&aEd|yA*MrfqpeDM4;eW>(nyqRWo^05UiMz9HMQ+XAW%;< z&-T7sf_eX2`0n*=I5EM(YleH`>_n+2YmI@*KBTp%LX@>0Isi7!X`w-Zhm7i(#Q_>T zGD7a0pEX3dnA^c74H6}Yw3gjGx#Y|70<(3iK7M@lHt^TSq^eTG`TEoJ>m>i}ozZvh z+57YNdfGQmmw-k*0jN%@JNE~(mG{?)Gb q|IaV^?cM$9>%;&1+`p@~_+&-o-May2#TR@2lCRLTQM6yg!~g)*+1Eb+ literal 1330 zcmb2|=3sz;w>J*v3A;-i_~@w-88nss;Voy?z6D{g7TRtNI`7%h;mQ=2+-d$I`itSB zeQ~nvOxgJ-6t3O-`RQ-n#DG1&zgL+X-#hqkpUl6)qOz*OEi>kpJl#FNU(7xA{maix zP#b`h?+t0=nv%7@Iv!VT`I9(ZO)5hosGfPnd$rw5-@JbxzHcwzvAwPSYv0K%k4}3P zIic+B$t&s%^Ly%z{j`?%w{i-9G*K^1V6xW&V`? z`u6qF8k^Ur9(ISXkDIsOy0SR(l>PsG>_E$w8OYzb#+xh6)xM24Plo6H4X?>;>JHJn zg3QdP85KNgzMXaW)pws#i!Ya!eoJCI%>L+c_{7h%>%(vF`nP?`-wie^3hYG6{(h*s zz9*XhxqSbnb4Rxb*4;3cuTkdR8!vxk_UmuwFK@Lry3N&opDVWVKL7LiW#%=8Z(HO) z<$eBZxPymZf5Jl-iJ7^rpDVXZmffwgi2u8P`D)9gmeu#le*8<`XL<9LeQ~RBV#+eU z{C6{R=O;TqWN)7T$jsbUM9?km`okLCInfjLRXLtgJ9NTFuI``r>gPB7W(2oPoN2Y^ zuh*i7#X0I{G!LD4WAcXW&~0^-qQ2aAOIL}RbK7Re-;Di#@0z8V>@$(Xl$M2u<|y^_ z7zBZ|3bt_-cNrKR@<{X(baRu?0vW)e+zQkunYhAWIft@xj|i1DDT3ntK+sKn_WkqD z#m(0}wfXO-AM0YCrreesA&UXx8DQf1g)u+_m&di}|bdRYwXe8~z&J`6-~r@%#MG_wV*fyRUzd zck9%I+}m?F-kv>vukR`Ef=?axy>&-6>Zkp+t192|YbBR=ti_(h4@v91@)t^St$%m> zhV}8Ssn2fzw~;OrkD5>>@NNE`eSivu)#WWeT$a0#~$CMD2h0;IH;{^9?r LnqM`0Ark`th9GC+ diff --git a/src/main/resources/schematics/ruins/deadEnd_lavaTrapO_open_100.schematic b/src/main/resources/schematics/ruins/deadEnd_lavaTrapO_open_100.schematic index fc1fc846d3a22f4818d692fe3acd3b8affe1ccc4..b253a40735904d72205aad0008aa565cd4032a45 100644 GIT binary patch literal 1598 zcmc(eYg7^j6vy4#5>wz*nl=>-ORdbu^6g5~`RZ6kIcv2~KO7n$^ zva)GqiH|}{k%Y{*q@5Js4}64@U?dL_+-&D;AN#ob;hy{9{_pR9&$$j8?QCr6R zE#E}qQ+k$H!SM=@EKN;8S9{4HK9QRRZzd*%vGZ-%yHF1LZr6qH zS8D(VKakkQg5xA7qH|iLSUPS_=NzH_R4qP53tv?|#U|EJweFOrC0H&dYmotiLBK>O z&KgJ=&?;`AiI+}(mDr9PqTDVrO?s!sVL4l?zd-yny$@XV~C}Ij5+AjfGao0-(p|Qsts^_W#ChqNPgN82uP#_OaDfFK#fpmFh@$b?KY;vC zPK_RVj2Ilbe}V?p8HS+u+ok@31(wkqf}DPIBv_dAA@)tGc0Dm4#pLEYEH_lwye_=D z8)r=fJHq7W*Qdo^Lx9FEt8C52I=txEEc41)$LybQyTjS?tY?-Sgd$UFx<2!M93jY=mYC=pM{7kOg2ylCwUCSV)^_>PU7Efd zHfPm4YS#RFZ@9Dt!<9afp}k>cimObizvp(XR0vQG~MFK z9hsas|C=JS&$MR0K)Fvak5U3ES#ym-*6TZy5HYP$fTO}zeHL0(4(Caa7eY-v(?>T! zJoK83Z50G;qBX~pEkTodc4uneLFvQ6>x;Fs*B^t$>P;arK>OXE#QT*%#Wku3Z*;xI zI!r*}dk&PKiD?0H$9Xyi7THnaPMlS(ieHOh%v+i(>O*6HdWH1eirLIX&Ks%>0 z46L75z$ib6e2K`MJT|e-eUE3xwih@V-Mle#t)lXc>)g4&MHy~ktONWjY`pfa42{oj z;bz(<2EXUp3B2x}BV#^K{$HE^ds~0G$9w#A%i*2|2Pi@2BinqmrHZoB%Wd265;EDU zg_U*=jbN5+ul$%NYLY6)=i<1E=bKRhpqT7#v5-}>P{~kPrPl9blp|uj7G&LUnE)@R zCbL^crgOLUtJ*em;4EsC_r6y93)#&OO#lD@ literal 1937 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 diff --git a/src/main/resources/schematics/ruins/deadEnd_smallDesert_open_75.schematic b/src/main/resources/schematics/ruins/deadEnd_smallDesert_open_75.schematic index 9a39dc5f9cb8075fbb261923ab141fa2e7cec540..390935a95744e4c8d2b8a5a989eb08fae2f0edd1 100644 GIT binary patch literal 959 zcmb2|=3oE;7KXQX&*w>niyU}(y5WDo*3heAtFBBfe`}mFU2E;GjHRo3r=*%P3iUTB zHf1i|7bv%4{lxMWjK|rQAFw$1?8mR)VG93CW;(jFbL#(4DgFOqF5kIRyI#pIJvVui zUU1cKHAb){3=A9mT{m97Tqbt*Fk9-y7YEezBhQ$0m;ai_C~)OZ@xs*C%r-2pR@**2 z+_vRgE#roiZ&&>f*S=3?d|)@bc4hKppzQm9`?($7y{T?!KXiy4YA6A!VNU7gkNt~x zty+C>i)nS;oL&2;eN70OdN|Xn!ltG+s_gP||J4r@RJAWX)Nj6c`j<&<`IKG#zyHd& zJ-)X()2sgf?)$%C&c|xg13l4~AD%mY{j|mJzWB=rkyqpYe0ckCcl_Sk-)Z;5IS$BX zLbQLFAY!~W>03ha<`Z38BR8h}OQ|mZ_~`ce-8+t~y?M(z!!+|*=<17!-6eNT*KWBz zd3MJ3*{RkxYwlWPU)U<0`j##7_oZ)-x5bNZU-YnkS!(&D*yxqBH~THtDYcsW^j-bB zwGnovx`(!I-;g23Z+7?P)6%*2U7x<4vQvl_zyD*4_viC1&296e-dxl5>3E~O>Gkcp zx0%nm{}(Kc{=P_@d;h_$x_i^+n7eFyp7Wi1zv=CtV*l#y9BMgXrxktoo3!6+lQULx zr}Vx1B9^l0`{vZM`+h_&Icqel(?)UA*_(lzbM&vPO^!W1?QX)u&A}7ZUA9?n{*d}z zBRcWnd(S7F6LZh$)ZDZ^6?XIcZ^25Z6r)J9o2Fv_;#}ql%=DS&>&61qp*A^nvY;bS z?a7pzDJ}vKRg!{(SqU^z9AJO7Z1Me54;QRsKd!m-@t2#Crcz(jo_7BVjP$*<{qL(a z_HzEq`s=jj`>(op^2gDW@0*JvuKr(ge*L9P%U8?SPoH=F@x_E|`@Q1VhJD_@L|?zZ yHq0+>zKv!5jD0(~euq|?$$kA_V<$6z{)eMi<*QQH|I42Bk9p3mYnxJnnHT_j7rRdY literal 1140 zcmb2|=3sz;w|9O0l*1+3E_P2{rtpbrPjd>lWZ4uCNtNa>rBoi1tThw*MAvLsdXM3h z+os-o&Kr17{1@4BaQ*u8l8!GI#_X%vRW_3`e){A1^Lpq0+em&pKkL&~e)YqXgY4?H zpf)h%1TWuwadWPYRJ-meztzIqDo>pA*j=$Wo6TXx$Jd7%W91X%OHNJXm5)1haGO5E zvL3r%nLF=SM>5<$j(>xG&JUQW1n7XxkBh!MKAu>A!+yV& zL~VUYU%jQ|y#IIYcka>3zZb`+=hx@`efz(sKYgxgw%gCI|6{O6c>XLUk#pSVQ zAJs+#A7f8n|7I7@tk;#g@9)o2y*tS{_2j~%Yk&%;w94m-<>^hgx%hPYM(b&Je9Si= zPpO`2s=I0T<7U}^A5{NrSEzoQb3tvk#@R{JXU0za8$H1_P1yUMa_svvx92~3I(2E< z_41E>JU@+2p4R3*E0^|Ml384-vNCn$&AGDke!qA+wKeT~*^geoPoGW&ZRS$ZU$0}b z+F_tM%)m&x_HxSM`R9Ji>$N?-?N|A^`v2c2^7rNL{l9+u{CqBk-w%O-3j__dmt=Ro z?AsS{-)GaiQ){eK|D1h%_inR&-M-!4H73zNdGcPfYitFmWh%KOiI^kqxz zwu6)BZaWuMvV85P%VIZQHXrx@{-gAxQq;fHsBc;~?@Zfe_j>Coul3hwznc~lUH)rL zs?fR`uE}Yij_ykTRS>&9eyPs-H%BkBPU%Blz z@BiI1^R71E%l)CdF87sTv6#!Yr#YXc|DDY^zx`qUac-ZEH{F|V-mN=(vr2b!-1;fy z>wk%)Y&x0~wVS_AEpvBI*(7zBZFbey^=_ZqdNQT><`(swA2}hPT25R`H>V^-_-g2w@k&q!$)nk+U(@R_q(2OPCS`%HATf^p1@3>FkiQ(p&|f@ UR0f9gA^+Gv>EE%~5X8g)0AFM!MF0Q* diff --git a/src/main/resources/schematics/ruins/deadEnd_smallHiddenTowerO_open_100.schematic b/src/main/resources/schematics/ruins/deadEnd_smallHiddenTowerO_open_100.schematic index 7d9acdbe200ee127acd0bab71153e2ea3f62d40a..912585f5d6d34c674e84e68af69f605972947831 100644 GIT binary patch literal 1094 zcmb2|=3oE;7KXRC&*n*mOEf$@Ebu?TbX7=cXz9bX`ieJIy;kc*t<2I+mGu3n($nM1 zviT+N7rmAAu^ZQHfA{{I{Oxn^6(4TP`^(61Vb?^aoi-W@JdO9Rl7#QxDz4*n_ zpu@YaKIh!JBW1S_-FWv97+&n{d>ikEN?z1Gy&{i&5&zvfkA9Ka9IZRsnjLd2dN{(% z#RU1bwT2&kD|^4ZZ~9q<9A5oAp00zZw$0mPq}?U{{r+~Tyc?XgS0B#cY~9OyecDW4 z?x5A}?{XZY?(K-0u+IGZlc|x3j#byJWQ-RY{4J2!t+2Mn5Z`+pH#XdGF@|tIo>kqwn&9!#9oEBu6iD^b~B#~$K8v$S@K_Q_wPLa zA1@}eqrA|8xV{TtMT`Xc} z2C{Z>fW{e%!Ny>LC%p(Qw}%h57e$%+mR1xN+t<_w&7XTF?eo#s^H1%6_Vq``w~sHr zubOl1?EQzkH~-orb^dh!+1IYd*6a1&+w)*2q!ngloWw@|g-Cs*dI(lHPxu0(b^2~a3JQz$C{^iXKsY&CQ;BeJ;$@;L5`)fkV7><}-uw8QT)O&`2XU_XqSXWdSI&a^;8FS{!On+Zzz274Cl-tvr=aH8eJ-U3m z{5r3npVwytZFyke1N02j?3nV^&as-QrGa;Qrgm+7U36Z2{n|^v4{cR0lRlQmcKw(g z|GNIG(ff~7_wCTM5jZXH@$a|Q?x&6q8(Sw|EhyT2X!q9-j?3d_T&XLTZ3}xIwd44P zXijnMJ+Gf%>2BS+Ejs@8gcf$ub-5m?`wmrGeSLe#>dyO_zEN|tA1dd0n4d3?-y{7x z+4$Id?d^>^l3>7Wkr&kGEeyQM!{a4$rsR`1#i({B>b zL=w|lCLWrjbf(83WJYkyOhGrU;w}T@Ljj3?f@y9NnrAc*o#Ak9wRD{!nYaXGi87BU z1)7{dao=$M)C!y5FTecxdvnVknW@Y7&)+|L-qh)_mEWE{x_p~I{OOCMt0kd{jc_FJy(-Rt?wORFuuuGtnnMfC2THLt!c_;uxPyUCIqWsx-AwFX| zT_XBF9-7*y>mKv>pjM5?j)xx?pDo@0eZsfm-h+U$i)3;@u!f)D@z diff --git a/src/main/resources/schematics/ruins/deadEnd_smallPond_open_75.schematic b/src/main/resources/schematics/ruins/deadEnd_smallPond_open_75.schematic index 48e606e9f6739b94f534d9a2ff7d9bfe1ca0f829..c4234badfd2c9061e0ba70cbe060475c86b755ce 100644 GIT binary patch literal 1062 zcmb2|=3oE;7KXQX&*n*oN;Et)ZmvJQUO-4_^_wdGyP~2;m{eFiVi&En^>r(JbV{yq z$EJHczwfban=G(B;rznVSBFo2KGA)nve?GYuC{NAt6a;+^OHCKT9h^Wq`{YYA-ST5 zR!?VqH}m3)36cyayJCNo*GMuj9B>pls<^o@hV8&ZkwWcVH}3FFUAt(9&Zoc4)?s;h zf}uWa2lfV5#53&R_o~0ezC->`8GnKO6z${t*ck3H-w>A4jVZT~K(Rej}mU^oB&_w&`$$?=MN@?8s0@HC`|x>g=o zqvISRo@C6hYf9>!w!Yg>Uh6EnopLvJr(ofna(;zy!Rpt|XVu=9%7?n-ek#3ocWU9y zvzf8s+b#9J)h^t;OKbOjWrqBf_B*b<|9-vvd&=IcYqx8br#1i6dik|$^_uy7lgZ&u&?5em#A|xhmPn_iDFm3&Zao zOQ<*7k;k@s_Um<8pzE6}@lD=b8vv<+%O<#}i-uyPN z_QAT#VK*zZ@65d$c6jgdqbY}1yeYL_|F&1>-Il}@vF}TwH=X)cR{m|tZ8!csx-v%- z>z8fn%h~%W+3)t=llOVPr#!BI`G00^_{403=A4T4n-}ZnboDN7WF z6$6^kK9sdRHu$q~*45nT{;+a;o_OEc-7jnQMcDn?R<$idP5tw8b^EJV*JS?Zm>*{{ z{cB2~ZNB{9xUFB6YRY~ec)94;+Ig+|`SLT(t{(kU^y~HJn>9spc02zb*|cj;-u?Mz z-DSVuTn#*(`s2s9##NCm`rG#Hn;U=ab++~Wf2&+${ii?tykGx+=GKbBPbps$e{e6G LGGW#Z7bXS(F&ztZ literal 1257 zcmb2|=3sz;w|CFyNrj6Xc$l5hw7lv03FDHPtETSC2w!<+>)Z&#RkIgKo%9!bn!4+J z_LTivhRnr}6N+no*i{Pl*U255epog@?B70<{Cjcne@hKz_sdRsU$<*U+>}p0gByj5 z>*`MMG;GK+|Kq-ohk@aN!nt#NGfhh+8QP1(w!6;P-N!fe?4n(3KK(nW{91RP)~Z=N z4U-F>?PDn5s`{5L|G=c8oWDS-%J}#`Himf(cjch&C4!pQziiI`KZ#cJ`qt;2e|CTV z^k>_Bsiw5o7b{O3 zU=^&aOby)p^o7mi@83604;M4>RshN_O5=2ii;KLV(|F>vcK0k*0iY_!%`8g#>vgiG zIXrnfmG!Jp$DTc#RzxyQq?0B|V3ck+{^xw%zarDRdRyJ~RZow~KQ2FQ&+x10?{$0o z`d=LC%QE?9G75xU?%|u!>n6W?SN~Q?hFG`7yJUCesn1Ury{q*4og264^5X9dn^xV} zUKjD^$>DdwrlHn9ZGaM`H-F{ChHtlseOtS5bJVoE+DsoD{@(N2e}8`cZguH%``WsT z(yzTfKk4Cy$h5z)H+AN?`fj#}%}>8Je{Sx+uV$~??@ph(=}np4vp3;4&XkqyJ-W3t zZFPL&JYMTf53O$37M{*qxZVEs+FAGBrClvGJH2kV<)+iCo_*T1dw0x_Z`zM0PN_|4 zKT-Ai@M_&%+Oz*xmv6gy)_=$AoXu~}y6v$3yqVw@pWUFsP3XRdFjaxg-DpOEm*p!e*f*VAZ1TfGCj5D7F#q>U-wJO|(Tt5(1sl%r zz){rv+Ujd>Z~aoF@(+y) zx9ol-=I4jA-?z3u@L%o2?4A{b~KpRXgl$@BR;%I(gU6Y4he^ z7r$B%HqWg6`Q`4);Inq&>FF;|-rat>YTCSedu94oS5BVy_uoYIr*De>SA2Y0bj2tA QaN#dTxn|KXu`Wyu0PMO?-v9sr literal 872 zcmb2|=3sz;w|5Wv1t$u$J(L&m>ivH3UTbxanqJA$&ey^j3j`Y%QFzrsUbkKz* z9M_J`xv>87^P82Q+$NngP%pWhp8MnBhmoZ{O$dUcTw=w%>UrWj3~%znjf$EUcR=_*am&A9gc;QML2r|B>9E7^b3hP^)YmXguUwlrXruDQK?QqDa8y0E1{ zg(t<*YWInErGJ+B6Pnq5BE=}uUXpW?xr^H5sV6-q>`^qDxyHw>=?U+|lPRf2LMr(k zK5E*NCn{7r169uKVL2%cG~!f>ipM>HnLc4^%8sAfPNZxy8YD(QQ|X`i*Xo!Stbcs; Inllpv05@BO1poj5 diff --git a/src/main/resources/schematics/ruins/deadEnd_tntTrapO_open_100.schematic b/src/main/resources/schematics/ruins/deadEnd_tntTrapO_open_100.schematic index 82c5ee0335dcff7acf782cf6c8416adc310c49ce..fbfed73be07fe0e51d9001bf2b266d4365c4efa3 100644 GIT binary patch literal 993 zcmb2|=3oE;7KXPsN`rsuwN}uz6UdZ9A}3aLNsmTssFa7J}SI4^jy^Qc=tCK ze0{hn@1nL;Y{st7u3yLazhwugW6 zXDupzd}i5Sj@Ipmv!97Csm|XmXSac4wpM$kh#9Yb+}>L+Y}Xl63XDc*CT` zvC1Ik&-LT1n!6`h6wPo?yu9I~cbTQljH~V6=iOXj%az}LWa42PuG#J7GWmDpS`Ymf z6>{hMtRce143TI(bU?B2i9x^9LW2Si8Ot+^12lMKhK3SIwgJWNhJY`ZzUluhjJ*Ez z+@BAwzse%!@~BUK`Q|JCU;AZOA0&Kw_~7~``*pAUGygBK(q+H=ul-kPZIr(Jx7C@y zp1mrF;!FSfWQ)zO&9kPxe7#y)EdBg+Tfg|b7Q1WyN80M!$<7UZzJ1C2yeaP8tbJ); z|ExYY?Yd;osmQr;|GsnF`@TG#{r$7~dh28TS8x8DE8D9!`SF)e-*{ijKepnVxONc} F0|4`8xlaH9 literal 1139 zcmb2|=3sz;w>QuFNvDf6JUq`Lv0|3@3)T%MH-$~>3|iS;cGW9ZdP9@wq=x!@l|N)r}uy=0A7zI`QOe${EXVD$m+C{Xc&3RzM zUJPmlLqqAywZEAdly2_|`^~;8zBKz#`sMzs^EQ5dxH)@k`V-Ed=ByVI&wl&%?c6T? zCiP9*-*GcAG@N}HYtf+oNLn6d3eoh2DStP8Kiz&Z!$@l0SH1eZ;os`zecI-`HDBJm z>GP|S8lxNf_WvxcWbd8acIsXJVg7t|^`{Fof3NTBkDp&>Q&k>z>i+*Z%nS^&#(9?4 zwzRHgZ}j%ftW=x2ZPQ!H?SXrOj$Ax*@6XQif|}2Vn+nQw5^h+YZ9Y9uHb>L?f55cz z&v7ZAb5qXVE!TYC>Z&nExbA9C^gNHX>p2bQ#jO2)JvzMZ^Ha(4awBO8zwOIcaw*%) zsD5}gX=`p=&+{`uNnmaa3-u(i#ucRr?Wy-W6s|3{DR_P1 z&jyb9YBlw_i4|X8MF^g&Tg6pBuWrq^o~aM7@Aiq5`Ieqo-x@#fmVO2I!&irIS3SKS zRJ!=3um7e;(K6kk`_=z>+}Ol9_qKatZpGKGXu*5G4C{XUeDvs1v8%;jdtb{v1 zwsN0TK4iz0efZV(H%c}$uD18fy}V$`CExZ$Fj2nsYvSqk*5$oU5C3z4m9-u^qFCv2 z!+l}E3=6PHB3#1lV3kgZk0#hCy;&Tf;UhE2y`@%!tF_blQ^$sWr-cTE9&$i;Xo#rs Y4Y(n&qJ@FMAox_hRa4~W*$bH%0B}eI%>V!Z diff --git a/src/main/resources/schematics/ruins/exit_exitCube_open_100.schematic b/src/main/resources/schematics/ruins/exit_exitCube_open_100.schematic index a023fdb79669900ee1543181600f1beaa711187b..8bc228af49416daed802ab43132ff8b04c80fa57 100644 GIT binary patch literal 913 zcmb2|=3oE;7KXQX&*n*oN;Et)zWnSshuHzHjVIQ9zYrVfsN>)yvhsA+hUI5h^u^xX z{P0wj@tbPtC(C^|dcJXfl3_RB=KL|=zpqk`{ra?Xlh)I2lPW{I-1D>cNy{%ietz~o z&zFaPvw-bjaIG@=!pdOdu>0;_Gt1eb&hZQ)C*P?qc)U=bq3ek{H$)MUWWyAcJHN&8v-ic8oGqEjH_!L}T(iYrp32|d5_|Gh$q#Sq>dW(&sk>)>$uatw zXeGZtcG;Fc)i-`K;<2gW;gy#ko^PuzzO`Jv)T-j9@47n17Y~=;|M&CZ-wWa3AiERz z_2e|2P=!X{$|mujo(`xUFJ=wKA)ub$0~dB z_3YK(uf0*wUtPRuPxk5E!QB5FQ?+&eGy;|UJ;4_JBT{?UI{t0kp1X2+%8{U{lh*@(D4c9&HgvP{!h+7c}*_0a{X=Il+@eOpZqSzXuke5|N5+d zF(r>D|9n09{_V6|U+b6VpWhW}9cQxs_wv(qcG>##>Syo!^=G^9c8~k(UDxZa4nO_x q&&kwZ&*IOUZ9bVgao@gw^YmvQ-97pF^Ln5E3^#+g=j6IDF#rHB7Okx$qT(RdbJWsP@-|wOLE;l9O0ht8DF3b!(g9bKkg^ zjVZ+JnBCSlzxL1Gx`gBC&mBAO-Lg~D5W2tRalHR|HF>{hmoEqY{?$JDr)T#3bs0isB!Y9_kzXF_Zg-VzWdi*u+I{^ ze{TOj>F-68o}Aq4v+tgHd-&`fvzWJz>D$cS?7Ff4=C4-^Z%>JR`!Gv-b?ob!?0Xlj zEvheFTRCrS)!+ZmSNBf0vn$>DvFPiO_^R@Vyff4EzNLJNjW>IDYS+8mn(9gURm=7k zSNoWq$T|4q*6%}(D)}ewZ9c=izjW@C+?OwEjds5~9p!(mJiqq*mB#;PHnH;kVfMT? zAu)yB`or$N7uVLA+qb@3ZTTTJI-R@b`E!R!<|z`9zrugizUQtDFMe=(+c}R3dlV0! zxU|20|K&B`tAEIX%`p-J+GDWk9drGjnwWLxrs_iXCNol3YCr_oQc-#}1=@X`=?D(neM9L;3NzO^;E^3pfo&?!qG;@s) tNc+T-DXAa}I(*c$Cr?zUbWSmfoH;N?K=b7dzwG}EWw!U~t~oO?003hG4k-Wt diff --git a/src/main/resources/schematics/ruins/exit_lockingExitHall_closed_100.schematic b/src/main/resources/schematics/ruins/exit_lockingExitHall_closed_100.schematic index a1c55769b4b8049c2c6248b7cb86c2b935f51065..4006765dc04b1c150c28b5c62cbcd66400fa0067 100644 GIT binary patch literal 1088 zcmb2|=3oE;7KXQXFXr7&k!W~$zwDApYO;_*qkxn3ZQD0F847$3P7PZQpUU2QHELQ& zXX34?Z__O9=RPP&;*~a$OZjO2y>d&lYGvyGv-|$`t@g6@x*YF!Zq@SC;Q2n6Uew*3 zqPe$bBG?j+$B+B1QzO64yUxhK@IG|ocjLbAb;rt0UsW^8E0wzm+)w0xekSPN;mF+; zrG`>>Z^ga)?<5%`-^{W{dj1FVJ3M>L7#KKCEze+JkPw>x0cZwMz|Q1y$&a^tR?glP zmHPU4d*-j?n<1xn%~^Zt$Gtay*34NZz5m+gSNW0i`07?X>z}>3Bz@Ad?|%OKXX^UR zTN4!Z_u~8O%=qm2d-C$Z@1cKxtnn=WWKtI}f8Q_G1?=^Izn!11|0_x9+46MGKt&pd9e@hc$4wJdg1_y6Uxn;va=F-3Iu>1Eb7QNJJV+beuyR_bf}o37LH zPv5ew-?Ojp&3oRT0h@gz%U=9W-K()qX}4bF177>neO-(H&NDf`D^`5d$0faLj|1yM z%L)(mJH6ezH)VFtk6KNz%ICcQGu~I9=*^J6{(AYRz}*koW1|n`1V4ZOXG8MQ(3I<{ zuXjECJ|WfmY}r3mA2rAO+Y4^0N!P`9tv<2N|J$>}2HCUUeaX1FZu7?-&flKtNxXP_ zH{Ok9qPokr<2rBJ_J7vh)t>YB@PgZ$xAST#H=Phxnk;&>H!o7ovU+v*=Wp-yAz~-l zCJQ<~;hcCfrTJus!l#xKDVq+axCm4_r5N2zFjDHUQ8b#FV<0K$GEZQpkJ*eK4kiB% zA2n$ouuW={dDRBe7#?Wa`ZqgimYV(4&8sq39sc(4?3bsRf4`J$j9B-sF5E8Wn)-I} z{=EM&Q#bFboM%@Zb$<2a)SoMM?#>eXob~tD0dW_nd`@EyiWb~ z>eIvg&!3NOUbVJ=`qj!%v#Uj)HC8XPee?P8=c?K@UtS*Le){L?NAvI?eeuta+c&%J zp5!05{;%UsoBg%>|7QPsBp-HNXPSEY%WF@y^KA`R*X3XT^7UEQ?eYgddX@ihP89PL J6m(@`000lp2L%8C literal 1207 zcmb2|=3sz;w|5Wb35QFxJrw4e5u$sy?6GOkw46Q5w1QM$teU#(l#;VjlIha0|Vv=ab4KZ5O4_Kl$*xN8Rbv^wj^$&6lh1mp!{Y-|gwc@9v)$ z2ie7lfh|e0sg0WY_HFI6*9;5|=U;WNo&WLTweuC>{O$W1VxOGk_+%^jU{3YZgAD0w z3yY1bew_VP^xOPYfisU#fw|qo`=3fbY-MC{(3ro7kzs+V-9u)m(+N>;X8ry23@0gW@Y7%CxTjKZqs;nye6!>j{O-e@uH{q+9Sv*G8a)jiF5=<$E)X}-FmHTD}mxJ7+B7xnGmiZjz{xKHoD ztePHSbMTx*?VpOe+Bc7#H&@R*+q6FS#~U}vw;$H3S5~&4aVw4dwEe@+P0~Osqff2# zh>MHN`u6YrjW+$={x^G5`I)ShD=TYPd7hP;uxHQhQ#Qx$8D=|t`gAI2Gn=W^eY7?iy;MuBy|zEXwJea2fBmUa@rYxOzpgKRn91l7^u2J~ z>wRlaYsIh4JN(|u)lBp5lIYEor?1;UzN_x8n;(|)bW=!bYVpn2y!)d5KipR@6fwIrynff~oK1SKzyJAo zwKk=id(-Nhxv}LhpQko!tUmG1TWrt6^1Giu)$CTETT=SHHLvD^JNx6qCs)1s)uO-n z+daokw{w0tYl2jU?R{u}|Cih+t=z}IzF&B<;r<8b^|}VT*Zxws&xwe1EsNiDi?_aE z&FzeBAM+nRP$;?k2(H)v+spXmb#K4A#jm|xVkQ@!GXGtZP4COHgWtY|Q!Aw^ixU zTRw#E?>~M1#+G~cPo(@eyd8P^MA&IX?b~Nhf9ji7e&6VPNLk$0={rBz>g9wz;hcE# z+N!##lfQodC2eyn&EK)i@7tmKef9J8{K0ZMf0Q=ar|e&n{4gJ)_}cnq@m1UQ|GIHU z^F)W@rz226%cIrbu94Jz_5JSRU9n55 z_v`EJ{<$Xdx%}nk;_Gtr<7)T32{VsewmW@a^!a1UU3Yzcoi2B^+n?P(EPfvE?V~ki df7Zp_{q^m=_U@laCZ6{hm1dmsnC!yD003P0c4`0s literal 972 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 diff --git a/src/main/resources/schematics/ruins/hub_doorTotemRuins_open_100.schematic b/src/main/resources/schematics/ruins/hub_doorTotemRuins_open_100.schematic index 820fd5023fbb411fbfa17be0a01a47cf2eb73eb0..336d71b563b83f11b0352712c14d6b8206394716 100644 GIT binary patch literal 1173 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 KYAYkA{J@_BgZc;n diff --git a/src/main/resources/schematics/ruins/hub_hallwayTrapRooms1_closed_100.schematic b/src/main/resources/schematics/ruins/hub_hallwayTrapRooms1_closed_100.schematic index 6fcd735c15e7ee53048179af2f273513de57fa8f..dfa00e90dd4d3f1d59c8009c720d107c7b6ca857 100644 GIT binary patch literal 1636 zcmd6mZ8#GM0LRzun$F287w3@2OL}6A&Cs-USJ~rbNO>$d;t<-rRNi04l2eTqYBjG< z$;eBS_hM#V$3~)#S>E$9GHf@7nR~8J_wk`{6 zTzhZto^>Wdrt8lWDn%L9m&#d6#cMG8=j<$Gtd1e+;#IWCSBo#Ba1yno-8YuH@%eM- z=4sDs0bpgosOT~k^)Qf`$%smt-w_&yPkP~~``S=3HLE~CitV|GE0)E~1ACNy&A%f-@IzEq}*D{*> z_6+RXZIrv=QL^ia2<5~mxvQn>2&@>%O3#VuwP)H~R8&l_Ev!eb5$PYkuy)b9|6c8z zoUtTV$E;%R#ru7j&I@jmegCs9m$fV5E+pydrJ&wlDeTjCFiLcve%)L24d9cp0WZUn zASW7(rvH%*ajL074QE5NWY7KaCatf4Dc%+}Z)OpJ%fLZNODO+3M@T2F_P?z1L>4Tl zyQkkP#B6HXneKG4+te_92^Si>bw9V?zVYKZ5&1}*43?W9id1W$?aWMY-kKpTTJ zLzyEZ++z5Z<+qR>`-y}>Jhx_7I+PsgPuD1_T>$^eN%khvuORX*nADf_N)v8*0=%Td zM905>0;}jq71w^^JQ#*j`e&k@j09fs_bChEupa)tg0TIl+&ml#LPBqjTNfwHPZ&P2j(5^I>CNG}u5 z=^keb+QU9F8kX>m(X+J3^Q#;Bys%nHJrCdK2xK99C6%F58nlpiEpmwnR?*5$?3#FS zPO2JskRfz|*KZB)PZN|j>NWTC4k#(!bOEnE)#UHoh6rML+dN6jiIT;8BTbDU>%xyo zsir**IfQ$^uw1Pe4|k{t`LsfD?cgV#sK2cT&2Kr&;c)VMeSvwn1DcvNxF*3@qO50N zaLXw5Ai+m3ARu5MpqkWgawj8$M^mw?j!S!(m31nI4YFb!g27-xu+g^pqh~Rgc`Qh4 z^#4`%k88JPZhU-S#J0g^SLYG8+)-MXCmlk|LZ%$ibhnr-5egQP)7UnS=$AR%;3KLt zQ=wwm-QT1yWH+hU6Mj?{Zu016_jE+-vptLZ9pc|Tv#CYfIJX8*l&KX&B&4+amK8o0 z6%tj33#7Aa#wyw79uzBU5j({p^~@~C(U(knDxtrJJyaqO{B-E#&@cXB0J*jcvyt~+7N+`%;> r**`&e=lG4t#|52=U}O?wpj@ku(kv4Vkso7^NYAh>GIf}C-vIssegGIu literal 1878 zcmd6oZB!D58ply*bD@`9+DtbivNvB?k~C41Qg%~Q6hYn86%{5! z!WUTP(Us&IT`A?ou4BF-Y9wk-EtS#)o1rOCqDm9R;ZBD6-<5Rv%(JSWtenl-#dO_3k7OCM^BpJoGo&4-VpB)h z0WtZ{!<3v`wkvD2GJXa71Yq!cmu+}Ta(#N{N@s-tBjP{0M=(VCYze3bpWiG%ZOXGi zpVL_Ud5-^ioOJG+Tj`?COVTfs>sCp-W~L&b9%fX8Os3qZ=c$%)5Rkc&jf!fq3LwD^ zt1qX|uy@1AD;w(rNoJAJ7&~h+BUR12fGH`2V;>G%KQ~26r`polJcjb;L1-(~RKaclzNbYKRb;j<}(+J%O zr!`p%+$}ug)F1}t*Q3*vI`=~twu2iEs#|5hIWOKZrroqI8{QS+29cf-p=JATWd`*&iASv}Vi?VExHxG0`Y%(io| zyXf~IARpH7|2qc%{qdT@v;*XgKo;3wSd#SqWpm@a(SQJC$Cwv5abhVzK_Nb)&`Kd3cvrs|JqH9f6`Zqiffe768~i$N7sjn6WpOw`=Fy zE;VJEb=~8u@4ewA|D)B)r zoUQ||NH`Kdx7S}YIFU1-HCU0b|FB}m_=J?fEHd(#ZO78bhG595 zy=jyAQK-k7TEpABl9AZ`-mS{Bw35NMXhVWT}S{SgT5yac7`Xj}`8cu?HdoMzGSwHT_N+lS!#4$Ws_0xHxug{HM z)A-`WwYZ?NWH3p2bi>pRCQ&4WU@HPahB)DKl&W?hJfTc<>t=7z55VH8+oN@)2tCkm zfyXlLL&+ztDgQ!zEGh6ga8}b;)%+s9>JJ>Boy?p&&vVDr#%iKPWAaycG^m*Q7=KFx zzsJcFzu?P&RM%zh?C`o#1{}7hteFh@I=`H=CZ9ly8y5E#vjr|C)15P0A*)?|>ydo5 zaGr*0egP_HAdVQAl*CUeor)aUDe95$RSLNJ!-J~O+vj;R42Zf{U@aDwMx&<+#L`$w zS=3VI0ynqJa8sBJ9(L^wJSYE@ht~6f@JnoNNNbPO3v7z-1d3p3ZTbS}#o$DLqDd&-4D#R^scfUAcNaz+edBkS#{;66VghPPi{Kdq422< zD4S!X)Uij=Xr|8W9uB4a4j;ACYC}v3GbBzL{$GB%Y^wj$1zEGQN`Dnt?tOQi{qMyL zo0}Ekb<)@OZoPQ!*7H>|SI&O_@@Rov*xtgOmvekhCDvc+X$!5gEdKE1z)AkM%b)L` upSD{@eqFBbe&6%wPH&Q19=?C_+FuK#{9aw$ATwv0J)?-IUv!oW69WL-unDxAt%!XD|qD&*Ay*{wmx%pwkQsfKMlvTuUG?3Z(L zr`S7glvcOc_;8<{&3T2OHS=rUm)95=IXzl#_T%$|j6dHC%q(Br>d$Z6oR}Rxofm3; z*ca#f<{Q@C-IxF1q(!Ff`R7ZtZ@>J_mUa96Z? z^$|(sY`+28v|TmSve!@%%B@$RJdTP3aS=Wb<1UboxtRB&zUdHLw7 zOLyMncy9Z$M0?+|)v+a~OFnnszgwsE{+<22`*z!Ybk_dT%wC;(xpdyz;)_SR_0r0t zw#UYEU;cSJR_5t0=9%*EzT4iu;;O8_Yr@@^%e?m;XN&&9x8vKS)AJI`z8T(IXa0xv z1HRr{tonkaI$5@hclDUi8lP4-v zI;R*#&g@}1DXld5zd z9USixoRp!Y;Z=-B__;Rm^oBfcR;W}U(A#rf73QTmGM&;)9WWX9CP^dZ>K$p~g?QEd z(zNjeq>)i;fklyAoCm_v7y7zGF6#zK1^F`;FU&N?1`a8HSNXP*ug)y#wMiSKccPk@ zoTtKldWt&05&c49>&(t*3UB86baA#hyKQR(J^YvhS1I_pc1~csJ~P%qd;AQEJTiFJ z#=5n`V?XnaL_eUklB)u%;Bg8xY1??RNYjs_ta;KP92a2%>d!j;hrw|8@>ujw)Lwql__~x_OE^Cf}@1 zLo{y{F@}=}|C;~ji66f2Vc>SW5x#c6&np2}3A(bcrzBRV7d$pMJk8mwgO5vM)Rt#( zIz8uC@fhk-nNYS-Qz~;L_PWzKm-P-E0S848%^-Kj!nDm#(+IWl$(Jz^QuoNs4?AZ= zw(PXve?+f{n&SeoFc( zpQA`Nt@@iNJY_mgpupwG zC7W4?xxhl!!3P*~hg`v>Ecd5*2ixQ2VsHbC&vsM&G82^v1!5dFXOZ8U2(cQzwz-C$ zt|Y;_$^0PpMBnQn>WlodB%MVO^23YrU`J=au#ubQh}hav&EXyf$h1`+3z(>NnLGfrY&?~ie#9P z4)lzJLgdXgjhq@9e>C4+|1B5rj_R?nt^#&Dh7C_q5mPQtTN|0Ir#tXgUCGpelHdCF z(B+YH!lCHHOGlsIrN~xmli&G-HRIBCOESHgLF%(;)NaiU>6Jv05rkshm0%yQi((Ef zJ({E)lNVbeB8Q_D=VK{iS&2D9qnqlT5Skr&620A@&|fjivbo5#y6p@?xZZzws?O~U zwuI<{y%Z`$K6HzE9NfurzrUbcyI30P#-?}W`!J4Hp}NO!74>$d5E2)x=@}HjeVPgQ zEAeCR*QWUIJ}g2$`vCFHDg#VJxgW)pz-{HSkyP}O%7eyd=w?{11571x_)g1cwNMM` z^(oSL*FrFFN^K9*$DRTS1wet1V;07c0&q&%Ht+O@Pr|*q0HXp^?vADsAI$p=uYTmoWyM6`Z1StJNvl%07)$H*Hlh@*h){`1aVb050AyE89IeoLhIWEy1!;@p|sQgzrg?0 zg&n~je7+S|yQ{mz;Oi7J9+phqP`f+F8k+`Wx0>&GSO?(m_+Z7$=vo>Kd&pF literal 2024 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 X|ICV0d-`#A_fP3XuFo{9*q9jrjyDr2 literal 1248 zcmb2|=3sz;w|CCwg``Rx__+OP@~t3~SEpK~&GI_5g|0amswKr_DBYe}c4$sOn%Z2$ zhUt$|XGr89>n`kSaJ4?0{k&$+^Ox_pYx4a6Rc<~<=j4aR-uJwHHSpJyzmM1RuM%h9eDmbilI*ge-sPtsZkpxmZ~q`n z%BQXS`1(~(UrnDM*4;dR`T1j;UoJkmVV2#>W#_~D-<^N<_~m!?{=W3?kAb_UZL5pi zd;j_B?d$#h3%-84`s!`^%Du_&wpN_6&hOuO|Da+1e*0%-yMCtF)NY%zWOwtH-w$5A zc=++nho4GIy0NLl~&81d?saM-^o>$#*upx zH!*>9sc9zw6(x|t2{^-lWU}cjc#M8Id|Irg;>gdL|LeaVj69L@KZW=A^+=Nit=$^W zCab;mAbfxij8%735O=k5qh`hi8q+XzDe1-&T?%nEJKQs@d{@ppxM{V~hNfC|j-G9E9rWi%uH?r=& zx2igQt!0moTDJ1$%^c^>O*+YxS|)bzW~5Q%f-~ooEUdlNxToBVWJymynbHVU|KN?z zOr3zVbip}uOC7iEvWa{?pY`VdlW%mIHgC?VIP_mv-|2V-sT2ElOrE+{Z|nD&TW7z~S;t_VU0e45pN6*g{b#9_?7o%k zvbA%+x6J=F|8HXY&Bzba=7u^?+nO47|I3x17rX8ml}($=dUnI+s##P27|p%Tw)-^L z4Jn%(X3ljjD4XUZra`KQR422Z!e+?2cXL%IpX@sSMyE=<92gFpw5P$N5Sl3+wqN_l zv0~oIJsvZC)NZT1-p;MRNq*P9)>5)W7`7~V-5T7yE?<#B_hr??D+^vnb2xbKinB0% k@k@;9!lZTLe!NEdTWd*A!^@zmgDC8aaLW&?=~ z$BW;1ZHne@%V$W4y*su2&T(-zm>hBR2ZO4Wztb*V@r^xeZGQajmEQqoSJ&vdf8J7T zvP)vx-Y;LgZC6d(r1W;*dbRYk2C{FK-n*Fap~~d#{PV%H>hr%>;-u(aaNPSbw8d-H1jZ_#@dC3Q8!CZ06Y`~BJX z-}Id9pIXu1W7bC0Zk@kwbE(|J!ZdHI+yC^oEQ)YdyS?KK_y5LCs&PM{TB1L<{;%Jh z6uAB~N566OBYS(Wc*^&b%)M)-R&!4kbbQi!BITp8{vT6grH(xUGkvD{y0J_YSDJis z)5#8nPfjUDk!F&DE^!?`YNyqdn@(^~JehJc#YLb}(P*a5>>ds!eHXRKsgoh*Y|1ej zJcd9c;fJ}a{@Yp|_t48BcV8c#`z0%&pZ)U7oVp*|{#dR4{rmFezy6_?t7hlFJi23E z$lu7yTQcWnzg)7*vVPvYzrVJuNq_nD5!3OnJ7%4E{c?%STlx6-Frd{$UHCrt$5gT7 z{h1oqDvLka?DnbWnLPRMl9OuRZ~ypt^5&PbDVElfTdVukPJ3q0*O!JG%)op@_7{`c zopTq&88)nIzSn-|$N`uXk@UM`J7jI_;?GUn{PO6z?Z?@3|Kx0%vv0QVGx6N_8T%|| z_uOt4-~4mS$|sFJEr|yj^|0e$?(CU*s4V8hpR}4Nm%gA>-@K z!i#6cy1(zw+%GS^b@w^5n=5{Q{PTO`yM?VeD{@LJ1j}<*-<7#LsM6nUt>SI21gt+~-UF-J9muloCf?df*ubJu>I z-}cEg`nhIK+O@)(m$iukYx{k+mCls@Cz~pp_XDcq+Mb91Z?B2H{@SMX>=~Ykb_Ap72gQnUV@IMNND1;4p#_5{L)hZu!P~ M|MFp_YtBpz0GQNN%q3oX z9-jPV^yatJnJtS-l}uxnzWZ_H-@dyh`y=vdOZ?qmnZz%7DZhF4t8F>2Zn|3S)tha! z)O@`#1H*w8BDMDqEVq97n~kCGQ0jg24+(Er8E(B{ZD=pQ_?`DnqCSI-O*LbK8IgF~ ziRwn#$@}sdB$%ren?C-z{}SvCT!hT*%w2y9Z(i|@&AnIm?^o)qe^F*vcj<}GF8P-7 z@zt_9%k=-R5x*K%HtAgb%4zzuW`B91@qP zdH(8OM|~&D&0Vs2`PV;p*&F8l|Ne4*e%$xkb_RiCDJGH!cKG^j>O1W@ak6M-wDdWwWN1{uW8uR3TZb`R(VCoJ*-? z^^?kH%zc*XDj#`o@7qZyozh(dDxLUF?TVHE*5q@|*NtVO`jg_coz;r^o5fQ${Xf~E z@TrC6#G6(Qe@C;H9u6h{6CYE)IkhZT;GQe!_=Hn3CQaX^g3E~gUxn+u2^-Vy{(G%f z?I@GtfK+=BC(&NSBhDEW7+={^(J@j)cT`jc5>>&2}=`RW5_;w;|qFPV^< z#$NcKT<25EiASkBs}ptXuV4Gf-@tEqyJ&jtlc~D@+U{>nlArmexK24izen@-r1A&v z_p-EWe4BXE=}qezoiA|{a%azZD*wap51;7o6Di-C*38cFzSlV4uCDQ}f&Stf?rPSH z*7Sc>JbiB4)7mDNhbr$QHun3N-OBlX+T(lKl$(h%KkjzfC>ll9&t$eg(&)b(=v*H) zX&+E%xTsC$RReox@=3PIAU{t$nbHgnmlG+Q4yJ&@FU9C)f{{`O(1e*e29km<^8{x4 zn9Tr%79nGx>EVIFQIps|VS1~Ut<-zJ&&L1$+1Iy!W^KJ^^Ka#!?AY_`!p^U+TYt*+ z?w`5)cCMX%H7C|CUoL;v)lIwV|EB)>_Sbsd>)Tm7SB9T1DlD!2uKjW~f4;`+(qDDY l|DL}W_u%HToz;bt_tn+UUH-HKh97yzn6xWNDb literal 1115 zcmb2|=3sz;w|5WbNry_bJ#=0$SE5jUZ=ceHhyz?I*UFMi!zK#}dfyQbnmRl2{_Tck zohD^>9-f$cWd3=Z^Xp!&&M5iw{LjiMSME={xjtR|^y;5grPrqB*Ueb}d}+-NU7+EU zKYd*&|KRjonO}?yeTQBG**9-+Gkm$p&2WCb^%rKI4dM**=I>>2AQs1eic2^h-d@L$ z!1bn;gcz)D$|Z7%xtc=y+=y;1k>?EU{MbLL;8c>Vt|XZ7<>bzh%;UHo(8 z&v)CeJ}pwV*3_?$+gH7LpT_!KM%A@-|NcIePtVWy+WGUjzJkN{$H~|I=N@b1u)uwfNpSK>^e9N>c^z!Yu_D{CPa~rgMs@Snh_WCxTYaMx?=RYr(zy0UJR-bKC zO%;Atq%MqPp41;cZ5EN7ySG2O7MO4=f^^<&NRH$zM2g|9<)9%==$K9Mj#~lNXfN=%#qt-8-2Y z`(g9f&5XP2x=jKdBuTeZTs1xj94a&kyhB%jex^W|*&|Hkr}q_M`W!UKa&sZ3>zmTDR@hn^o_QZ5M9{ zo4RUMD|h{!y$ll`y<7hO*lDqD*Ss*kiLs%nkN0sIMaCUlI7KmjhVHR5cK4nrr-heB zTDpXN&$*ql=|vCAN#RZ5X77G&5Kq}uXe6ZKek;`S$3Ld?Zlh)23T{4W{1Dmi{SzAo`ry zpXs&F^38tm)#s#k_=F zprjJeahnP^@s^7J`+dH?>Fox+#XJ*F_Gwrj`86RlefFz+j*E7jbPsDgkuv%0w*ND} zW8v~gm( z*T7E6S$@8Ina9h! zw^_heFfbe_-+B4F@PfT--m5blNjZ7^`4%8UW`-)egq1g+LCG|kgcmxN2QEYwH7wlx zguyxeBxBpTNz6QR(G{Suh zUcUJF>1?W@xBb6Z-P3Dz{Eyd9TOEEjwW?xLTEBRA{Pfp9Ut2Bxb-(VvEjCkOVi)Gy z$o>xuTdz0!i-EuU`PD~{%QIB{dAYoPU-j+p#$eyhXwf;H;(U_fU;J*)&OP}?R@2@q zO)j04YMXL%?wZhPr@zh4-Fa@`rxV+Duhoh=T|V)o&dwbBo71i}zqe=lJr$(Z>f+_d zPd?j@dRy6^1j+w=r*mzE+qrELf95^eePY>U-{)7SmL0zOjeFARs5BRWpKT|;O^p1+ zv0Op9<%GG*Hsj4t1pOS-KD4WR;+>h5c2apx)0qeT0Z*ijcCC3kX?wJ{x1My68_UG} z69q=zat}pP78)yc)HpMxOtU$pdE(dvLB}W3mr}v{a-1XuUG^z%KXq%L@rg;NQ`*mT zEI7UR{^#2tzW=Io@Yb6wYogr5*KcRdWwUBpjGA@Ev4d}ZtSYbgA}mz{l&w_;$?khw ze&N+q)wz4q%ul9lnk^|DGw#=3f`z@18z8t8Uvqi|R13)2n`}-`%|`>}gGK zj7k5iw7pvPHvg>tetEjtb*m?To{Rp!)p1wOer+!O_4Bj*|2;SMSX%G@m-_4J=jZ2E ZuPzD=e;vB<&yNe$IlFWZ7rQVq008ORi-`aL literal 992 zcmb2|=3sz;w|5=$qC-WFKfLYqT4H1Wy2TtSYz9o78|Oy!UfmLLMCiAZ(_Nm=dCXj! zS}rHeQ{MmlzwN($k}vrM=T?`vEME3=(b@VP`(pP-=3KwN`P7p$ktEGXBrba)?A)NpU-6NbITCmE}r zPh$RZ4pqScPRmsc;)m{+u*1y7qz|yp*uFadUf%WFUtj$@*+^f@+gJ5pAH7>! z{q0j;@$MPh_3LBqul=@Z`P-l6tGBP;w*BqVHD}}R-Ki=4{`u?c-`C##{~^l2u**1G zzJ5*auJaG#?c!#=cw1X@t@q}?{PX|+-T2pTW^}VTXS;QO#14^@kEgb#?Y{f-$iex% zH+HfBxl4iE$|HxCddRKUF}eM=@BiWHu_0j&pDI!pMlyosSylSO#b$|4u!)PzA}Dd3 zH)Zk%IMdaOYz-Bk5_rzqvN8+{`rTxVHCME{iOM*@-ugtXG(ArTt(>HeDf30vNIl%yxfnoX-z`9lrhcw?~=P-!A`pHea6M zSIzg!_V@SymIVcV!$;le-jVu}2bS|%E1vxBd+fw5MWdT5Zhqpq`RQy?z_pa+XTSZK z`uF(yH=ma$`>l~xn!NMLrpqbSZ1Oex1ufQ=b@-UQ>fATSd*76|A64fXXSSb6(fj#O z=k*G;^lF(uAikdZ?m6q%@mR+=vtLSKHWpIJ?|36J(|g_rE+ZunJK@+fvI-g2)*8jO7`{kt5Ri`{A>{0xiqE~rH`@|xU5gra;g=?JLnx61V8W*1w zj&m$?l;oUb{v`0`h4(x~CsQ|R8VmLO{G$HP?9b#n`vu;5lYM7ROgOSU{-0P)NNmx} zoJ&0?WoG>9@UM4dzppy|!YSUd7?t4bBa;q%pR7L(n^z0o=Q>iKr;fG7i|2p>zSJS_HbWwW?}#U5~|=+ diff --git a/src/main/resources/schematics/ruins/simpleHall_singleStraightHall1_closed_100.schematic b/src/main/resources/schematics/ruins/simpleHall_singleStraightHall1_closed_100.schematic index 989c30d53c8258dab27657fe09b620069968defe..ba7d7bfc5bee7ff20861c679caed068940a7be95 100644 GIT binary patch literal 714 zcmb2|=3oE;7KXQX&-w`m${c%Wd^kM2B>B#ZF4^w~_?nNks=4__^uKjb|I)l=^T$&= zB){KjQ+4q%UD?}s=Kkg9H_v_%xA2W?JFv_@=>O-05dT%%BxRP|y}W8|(5{_+V6zz* z4lKU)@)yH|rHfuOADCYiE6=d$i8?n_j!5c3;g{g|XSd|uS{5g={rcW3{{yyu-Lvvo z_m*;_eNv%+zkKmFUKhT}=sTCYRmt1 zd3tWSR$7BrWCZKn79J?F>1xj8RkL+k&zaS%=Kt+$eZove zNLKUu&0lM7Xquh!n(4F6E;{hdue}#Ki{`F9Z}TB_6Z@&KiU;LOV$xr4etLho(ablB zn?(P8zC5u=_Ga77_tPhyQ=8m+qC?@6)4%y=nB&!cd%Lkr6jz#ja??qWV2V+snWUgg zT!)X^X*K1h6WkL|rrb<%5vWu&nyE9pheJu=BshGtGDK z7{Ue(_5aJ>EN||=x+CxQuI+p7c&~3en_@BhtoZT#)$2c}67& zVb{eOw!Z~2C#8!)<%pyXJbtl#ule%NA8Tx8<;L3H%l`Yl`R9w<6$Uf6&TT&VCFMfC zzI~ti;?|tqZ}&;hl{@c$t8V>Q{=U9A-+gj*^R}A(E@We1*l_aJmum~-UMuaceUWoA zf8ETvx+kl?pPv?cB6)tv%{yk1`5#~Ze4pIizU;s0>(auYo3fi<-;Mlca!Vxf@!T>n zKl`%kd(qiSm3uZ_d6QQDZexMwq~q0pH}l(PMlzm!{Pm%_skQ=8^1_;iCm&A*ZDyKu zT$}qWmxtVXoq?5L28MIkj$Ln`-@f?cN6Ni#+i#y+{_)~`>4tar?)?4y>5&XL9vb?1 z+MRDEZS%Y8TP8Pm?a$?QZ#=C}T#He$x)fIV>E?&u1#8!wOxbkxX4Avg@2!4YLg&>y zV~tmZ(mBN_a%K<9Nol3YCr_oQc-#}1=@X`=?D(neM9L;3kS-Us$x}~y oOxUAnG;@uQThkNXi6>K12Z<5T+~DiKWt)zN)k!g^wr&}vd?|BY@OKN?&Hxb|L@FMRT`k;W2E)_<xj?bQ5!ApAk zLu*a4F8NKo#{cT!Q}%|unA%^@Z)RQ(hlCJ=?2ErYt^VJ8{q@!+)$+9P=X;;8k54Sy z|L$e_+x1Mb+P6-m+)X`Q{%P8qn`eb{Z(iDYYtz!=lVP*(UW)#_??UIIUY}=e`q92+ z-O_dLU1mm+KcxR^Jd7N*#LyW}e}-pWVZu zr0=3OId!t21yD@{JR>12n(C#MvnNHa-6m$(iewbN?KO((b~ zo=mx!;v!I~Xf#u25E;S)jRd)6FP5Lxf4U=UR@Uo3538!I*Qg)9nX~W4-++HJt~bBE z`S9EIRWjGlp8rx6Gr#v9t#^+R2l7y!RnIHLdn literal 886 zcmb2|=3sz;w|CEH2`7rQKRmz4Px)T^^@SQcE=+BDy@b~+B6~yQz3B>jCBNTm`@c%f z#3#AujQ;WGjbc`{ll}bs)tAh^lf78nUH$U*$4B3+$lfmBFaG$NUA!68;D-OV4_;6| zV3x;Q%XC1_O6C{Kjkb7cs3eipf&GSA?f&P)HXqHYs(XF=dVB7dnmsf2&F}R;e|v8G z^3Rh$uDDxoX+3vc3j5o4n_u31eblr1!q$t2A3t_q{=V@L%rcCW+Y=hfS9tIE*(Jv&FPCNDZY zeD~&e{YCLA{o7rxxD*fSNvw-qIjRPvd1`PTyKfZ07@4tNW zb@lFV4;I|5G`0Tsk!?YF{l4GNpP%lB#Lb8QGi(0;_*H2%^Gm9C-kG|4@7wI_+Ha=a z{g?iCKWp2yUnf!yr=AY~H1Eyf_xV62->**By*oW;`^~PCOP{woZm~0($-OVf{3e(9 zpGF`j@(*kM_M7^fV$)CO{rE5a-{-aRWZt=JceQjLUE@;iLg zv?otgsB}&-ik#WQa#C7p^2t*vDjxR)X8MGwL6mMXlH{CZ?xHq%>Pe3YdlZdkuJLhe ddcr&LWXfPM0-C~a_+`g497@~x^_nvi0|2yXk^KMw diff --git a/src/main/resources/schematics/ruins/simpleHall_smallSimpleRight_closed_100.schematic b/src/main/resources/schematics/ruins/simpleHall_smallSimpleRight_closed_100.schematic index 1d45820802fb1443a4b0aafb0591459fa7bf38fe..58d89b422f382453c50389b2f794cdbdb35c2493 100644 GIT binary patch literal 730 zcmb2|=3oE;7KXQX&-w`m${c%md1C*y7sqy76t#ZWD9hH%?b|bJgWT;#zZdM8>5r!t z8o%4gtLU;ptArWbT-{V&d)L4Ddup)mtD;Rlx7#Ow zF0}OUx4S+$OI7>Qx!qZ1w|XxB%afAnb6c-SdZ`b&7ypNpo*{Aet19s>#a?u?{$l| z-Shmn{wCM|pD#Twx~WxfxVe7%#CN&M#!4M~1ZJ+;eWvmKf%5@RT2G{G$}s|q`AqY5 zW0@$fH2LJFlN}15oKlP;%_Id~;yQfPPOB+5o#38$GUaB9i$JBK(M+A$Jse8b&ZtXsmae0Zk|cM`t@`A%a?Z-r|$L8&x?PsVqVzhRNMJeC+}Un+Wpez+spe- TAN_eY`95Rti_5D*U6>dE7(+V{ literal 864 zcmb2|=3sz;w|5==f)hpB9?C0Ellp$p%3zkog^6l?(HRQ_H%?T0bNa{z$>%wT6(n{B z>AR}_t@>r7T=lu=XK~REUY}oEc<;ZH_qFSLcKNSk^`9gY`K@Jz_n_u7B)rX8`-|Z~ z+RezXjAk=#GQ-4)qiuQ;Z&y|t%|Ew%^5wOsuUqH-NHdvVGq11D|Ms_gAKzq{s-hwb`>fr~W_PSDD(e1Z{y&_Vz5M<;phX_WGw$vy`I?^i{n48>cVCI! zdH3z^zv63RbIT8IU$@cm`}xoE*LO`%+thxV?O^)rlk3XUFRs71%R?^zZ;n{aws~)E z>^V&HL{KuA8!tccmZe+G1yP^H+-b{3o?H*X!^9lIDFc_fDnm@8oNScHj4H5L(;s zv(0WMdtKSJhmHG{z`UEA`2YM)f4nc}22BxR#DO$4zD`wmO!@aCsVNqAUxKZl)*OFhs4qz!6P?ug=J@C$l@ z0=tK#%^3FHrs?_cuV9;KhLR^E!-gBXzy#&?z!wV&4rbu)F1n;^b^aa;&~CEb$pU6K#f1G!7tuhpKkPYvZ~|0onSrT^0C1Q{H{ltODJ8&4)Fhq&h~f-r1% zO$i$fX3)tQLH>??%xm$^saTKIb!_ZfY&A;&dN|fhATY((sw6S_cP%=V2k74@$SS0f z86D0H^6Ah}!E1hjIQyob?afTPsZjSl4K$V~6fr%@>ofr5Wn^K&5(mcP7G>ZEC*zt{$VTsQQW$xE?iPC~vt{Ll`g(>|)U?752Cg6a+sBKK`2<9Hpk1qb)f z7w>Ei4SUv_8R*M}m!TaWOty3%a#)KJwH|&VgBYF6W>dS`=vmkmJgn9l<5tdiCWKe$ zWe(e@QCj~YBKFblzUUM8Coav-9(>MElcs+wEuO5?WGrPw7Kz;EGWyr5V^HO+ddJ%2 zvzdq;PCzn_-Q~(%;a87i?W9keD#uvL#vjD>81CA@ibA@dM+&0T*W(8E^l5}#*4Ymz zI;}^FmT_yRQkOFVZ*D9W73bdg#`#uTaHcm8h_QR94zwg_UDOc^IN;iYL3`HQww0F) zZWc0b$l`X+EEDWum;+ARGuR5@lsW&h5hi5eZ+T9>^FF->N~ujBUe6O6@=lR{q=u4` zkM(2Jw(E0uq}YJc;tQqG3J$))G%LXxWs!bjoea^5D)@`+!()w3*@%NNlE5jo5OLLi zDd$=F6&?i{D@mfm!F=I_8o~Ybv`9pLS&XR}oFMkO_O>7j8`tDd&wicLkYrYd9`4$o zWEK(~In7h2kEqW_iL2{Ek~?I>gE2wf4s|GSd+#8VK`TMKr>Ih_nd)qJuVPY}k@22) zDD{#t{#}1yBJ8{)Mib6~ETADDrDhj~O^H3}KL5Rk&tlf!+^bCZY{YgjhYHWlg;(^r=xm8gI_vVX+*sqX?(OBGT53MGOrv2d zd-tHe(}mwQEn0he(Eeg*nU%L#Q$e4WW9_m|fr`3a(ncL6uBILj%=Y!EFZiS6Bvi_A z49+^IC*IE?TE^8SGxUgFcIUucptp~5ar&|bN-(KRLpxy8D&8cgva$~^ct{um<@ePW z+MjgVX5`8l=@{?IMPzHa3tR5<9A6LnDGtPJW%Me4nH{GbsEUh#VIu9bJtvs0!-w>O WbW}_(H4?sRTW5r=L(|cl0lxz#@X@~j literal 1586 zcmdT^eNfT|82%-hm6q4lB+su>vsE%ID{~FWnBH2ZH6_0=U4o=C&BIAVn$DIrtj#j% zCnA(vw1gxPEpg~9DEFW$`=&M%PtoD+Pe<{S&9;y*G;>z9f0*_4gG z;WsS9ENIq)s;b)$hB*424J&~{q1KpfcVx=}4fykT^t*z|`<+G`)wf{Nsn_l{`GG}r zAp`(KO*eaYq(f<(`Mbl_jdd|K7m`aJU<=VPJI z`WdD{N6a*>8M`oc<}6Wb)C?B$>=2}d{_&I;X^wiyr0CB~ibGCLs zhm7Pz->?QebaSBLNSC3+J9R^-C-W2UqnXG}Xe&jCf)~bi+xN(iJ zXpwK$wa$Hl-?!7d65X!Fk8o`mdcqm`IHNb`9a4+$7}`Q)xxkJVzyaf$1q% zx5vA>*zJ+4ut9&NG7T9*;MPEx>@#i3Q^ACa+xb70&oSmBV ziVbDs@v4w?<7d?Nlq`Jwz*955;L2{9x1HX>6W(4Z;J)(oA)gGN5U+zWmBRwQg?N+D zjN>x3ShP!9oVyOyy;K=z9wa!m1Dh~(ovcf_cZzTV40w>zvWe8fgsCoEw(g5Ss8Q(a zi#$iKi?Juob6U#`PNj~xH95^@zzjk)vWH_S>B7{;)GdN(u`YakJL?d+h!9!k$a#bC z@vA?rf$pTu!ywj#k%gXuM1(N=m4v}H=86pkiD72_!KB9-8^Br7_H%q(TV;80fnoht zN|aMzRJw$@gX+G}5^F{^l$h>@j#?|fQ%3YU;f}K!QMG%koWRkYsyE5keGg{J7Rf3kV-QOzyN5I0nUmdTmf^K^$R6`IPnm=M z@=r*X5+_kipSJ;9!Yx~-R|$PR3N5X!e`1ByzO<9qzm|&$6|jS{o?egQAgm6Fw7{w7 ze-(BZQbsMVp~F(oc-Y_M!<&muEH4<+-=t7q%PA*olChPx{2J^B#c--QK~W!3JH{-p zDB|gp@tJkt{O&7X*kjYB%Z~j5lfKbFds?42DNtMb8ywb_l2$uAgW&%u`R5(xOR}aC Mg-26Ddr>yPU;Z2BwEzGB diff --git a/src/main/resources/schematics/ruins/trap_hallwayPitFallTrap_closed_200.schematic b/src/main/resources/schematics/ruins/trap_hallwayPitFallTrap_closed_200.schematic index 4f878be980dfab06a1805ce3c55f027e9222cbc3..5b94778b0defc2e23cfc8cdfeacc23091741796a 100644 GIT binary patch literal 1373 zcmdT@ZBWt&9HwPhD%x%;XW}rg!itWY!&el#b>`~wNK2Y=M038er53)R__}PZogFSU zIYJ~yic5(C`d6qR{pS=-NExT7D3%jn4lvOjisfv#+vmRS_u+TH56?Z%bH95YWYtc{ z`*DF-CgOAale{aYi&6aSTGAJRc$ZcjKw-os?RNipcVNCBCpAzYzmiH!S|vW5HK(Am zzS+6j;C*I_#YZLn@mr4erg8kc0aor|SQ#EK;(LzI7GkmpdjPOb`IHZV+))4OR?kSW zTOZKRM|of?$xpmebdW;6rQPWQftcG8x?zKJW^9>}1}< z+!0*nw#jE;A4azAA}j~r74VZ4@#!^rYnO#%5-cxhM5lqSw^YrIwC6ciX!gbOd;!UU z?lq1^XxmowZtVU4v3}U$4yA2!r2vh~ykn-?geor(XvBg;SW8Jv6d}NKScMsEeMcrW z8*Piysd3$k{=%M;Qu^{`EWRuxe!iM8Qe650LaoDAM!wxi<66(r%vW-U8(YMG4O_t> zheM716Jr%SJ-&`ve$g-K{LHWWdK+-xqA}7HO(bcxm3Gi}P2$b8+~S2`hGAS%s68KkM|o@ zJ?Va&x(?x>q#@{ax-@ZLRl@{qvv?c^k-GrSqT5#~X!m&eP_RG#DBCB;@u(6Cm=Bp3 zpkxIMd3RtTYy;5<5a!VLWoMc#qq0bU{ORj+y1h*(<1rn5rfB(P?mT?jM9Ofk9}y2w zy`SE%PlwwCZaib#NC6HswfQum^X%7!JE)g;A+Zi|{~Z@9r@l*^tl%9>c1vA*wW`y! z_p?7?r@@u<_Tuwp`7e8roM(+m2ayO3V&+>~7;dIyY=a^T2=9yb_kaeBtjNQOiwff} zhA2ktoYFL*B|pAE#(K$xmd@xW-K@MK8~gRYcRkjj?bYg}L6&N(A~oCoI;~ z-&zfHn%Vn#+)I^`*szWKgGE2|k!~55(qdEV?#}oG)vB4b30G^*-8gk%G5+|jlNa`e zaN5KD_6Kj_QYDlBU(mnJSgME8Y`xR1+2hQ2L950*hb*$K8U;>`xq|66_|A3u7)!fA zMGd~GU3sHtpjOpAJL0t56Fj_9ZZa6w97Qo5j?6^<$W}G)Vc?j6P|MJwa)O2G70%a| z`xO_dpC>=gu)NxeTS+2Os68Mh+)R%<$>(8-#NS`5S5!~HHNPqU%>tW{8G)Or>dEB; z(!=&wbDbQo6G#f>@)}Q|V;0unOJf!j>@qwz?6q`yZc<=i_{Kf1oh>PINAOs^#9`MF Z%$LZ{MtfmIq!O_NuTBVUh75cJ`5VOHlQRGS literal 1514 zcmd5)eNfT|7$%#VX0vP8rH6sVWj0VdCU~7l`IWaTYj#6J3RFHKwK608qR45qEzJ+q zCC;!MQd4JwY4}yi-KG54+K%Zb3 zRh%G1xZTiZhj=Vz*^e=}yXDH6unRb+)d~}e(5=7F zV?+a4*j<*tHed%j(t8weDJw`A z4e|>>KH%4}{;J%=Y@G-_? z+nYf8riUsD`KLeVD6@#~Yoo)Jz(paAqyxo7Y|7%E5oRF;AX8PVunU`7PZ%u7fy|BA)VP1IaoSwQ007hMk z5VJgCo?Wg^7LNjluiH`?r|y~MO7Skgd;E?=nOBK&KHF!>^6A=h$L>63?E6d%Wz3|MN1&c^fH!Rorz%?L$FI8Y&y3hULD!Rl** zyO0;6n`o=HsqQLiN|8=a>OQwAfna`I`Ce5Z6JqZ2DFR!m_GMD$qJS7!fmW69;VOOL zuNGL?D&&o_<_xW7w7)#2x)e2W>)qH(QY~U;AGQT2^L@{Ovq(}*2WcPJ3)@mE^DP~7 zUN;tHWKzEsAA{R8`%Pw*QB1qkkN{qrra-jpjOgs%0eBA&=V>y_i)lMIc13k~d*sOm z#QD#Ja@a_{SB#&trn6QSDc|3_SY{xdB;}oubBPj@bym?=YZCRbW8-{K@kYJmoq~pt%X5zY#V2%x!M7)jR<6{arB24#&%x7jlr*2n5-v{m^7}>O0!ra$GABmZ1=;>pTX$JuW42Duy=ZkB?IN$=@Uc63s zF@32S3}QGXFYUrPF&h#7{rMb`b~6KSIO!l(}0lnLKi z9I1Y2l|2|+7;1i3_=-DszmF$1>F(?M_s6e~C@t$P?Mil(CKMG=(O&R1gE>zcF}UP3 zMCXcLnK=<#J2gA7bYq*m_zO~bS$*P=Rh=u^A?3+tgq1**#N#p%{eeqXSEJ@#Gi@<6 z6;S0rzvh-T>@rCk4<+U?7kpKBoFvi}+x3?|7b=2cm)gU{RF5XxNMr!S&|33h_-gzC zEP0PC`T#-4c{ZFYl0s4!yj%YcQmqY2?3usy%!C}Q$ok+N<7nsq+ok>`8> diff --git a/src/main/resources/schematics/ruins/trap_lavaPyramid_open_100.schematic b/src/main/resources/schematics/ruins/trap_lavaPyramid_open_100.schematic index 22919494d6adba9f2051e6d52d115bc1097194cf..d9876f0cb3750cdeba74d4d927da7508c0b91424 100644 GIT binary patch literal 1757 zcmdUueK->c9LFbTT&A8>CvH)fBoa0eWozp4l9#(DwqtEmX2eEaHO7?dV%{e`h@ltZ zsl0TXTX`Fa*oI=nteG{olW8#xO?G$n&;5J%-~Imh{qcRipXd8~zR&Zs$~FT0JzoLl z#G<&(s4c0|a!=VwBiCy$_3P~3jYm!9Wg*+5s~*&KRUODQgmlgy(*WM&Cf?=%RWIF_ ziS#8qb7dh{r+2pte&Gy@pv0addR)PsN=G3~F^xI8?|jxpz*1a3X9Q0j8~cz%6RJ3u zk}-&BbKH}*N(LANczrqds8z@QLQAl|RflEpppr4V8+Xr=}iXF+p5J+fLkz zF1tTM@Q#J6@a3Tog+x~{S}or;1=tWz#+^&|Y}jL7gb@|uX9B;kbUU;^H-WxlT}(0o z#BCDNdSKOZ^A|>ZNmw9!)NAw!dN}{Jq+VlL&Q|i`!|Q zR{tWo0~RV+b;!ZuY~*`lEgUNm^BX0uQM$KtHFO%x3(!#k);n;f22SQ7+X9;02$7*2 zckUn;vQt`3Jl{F;-cDqiibgEn3r~@RNy>%k*3eh+E>s1Uwbb}LVLOJrJo7CUQFy$* zTwbDTfk?I_Un=)Xa?Ub-+`?`L>COV36z|CRbwrK&<(?sEczRa_7_K1 z^OUwNC&#-Ttrb6%_K%D8&OsTvLrJsHkU3`Z2yqS{aux}a%-}w5FX6&Q2W}zz2lna4 zddgSSFJizYd$`0>aWNkAB2g?3)r^Ve2og*WA=&fBK7cOqilWgnsC z^`M^h!g{3efnlWMWcE<27YC0V>?kIP;*3SiRnAKYe-}RX)$5x}Xx7Rmch;NDtKv|P zy8@Bd==Ca^>^ocJ^v z#(XE5Mf~Of3OJftLxxjD?T07)SWt-(6Phd^7@DCHYBtUvddwy}+HsNau)Qykw|e;vqD*Zw2|*To zf!zjNpQC-*uzh@pz`39{!eeV(0GY^yijT2tzBsgeWK?7*`3xO(JU*06r0*^v#&$-C zj#S(K3M@q#m2mp9AlflMi1d{m%m4yh6IW5v^2OshzJcrtgnqyMwVa$E)Hjeimo!2_0 zG{HACJlpYgkDNA*5@0lncK6I4vtl{Jf#HCqJW8DQ;9-A)UGpulRM6HI(|Tsl>L4JX zT(pweo>AX9Xr1N#^!-fsqCMXbqlCie*Q|XV$M6*InI>F!B|=BtR%0e_sWN->Sn=!; zZuK44>7e9EQ8y|`VK@)jhBHf6Iq=?`Dkk5|shm|dYaC^X(?Mr6S1HVk?AhX$mPFFF RR^z@a_kZJ!@PgL?{sh3IS6%=B literal 1872 zcmc(fe>~F(7{{05l&(Zenjhs*EZ1!UJj3oaHs*$5gLepSAuUpa4no{cH)dw%*Bn;YxBck-g9l7T~pGKt(Bnjs@#gBC6te- z9;dx}>7T&X*=tSqZGG<%%x+BEL<7p`*dRB`U)fp3;3Q>;3Xg}NJ~Y=z^9p71xxi1R z#(sx`jlJ_z-+QJF7xYD|PJK}LV0&K>AdkF9t)XFmJE871@yki+5nST>F^cCqB@%&ATarn*80p0Z!{Z^9mrhx zZ~XtStvxlu(rQ#^&$_yj)OR#9mtZE%{_ z&{)6c$KnKMNB5O8{9dNP6~ts=V}V(H(dp<)j$W0tr-}6P9y8bewJqswXb(} z8oAm)kqih-O^H>=SkaNVKz&Xq(g=^pJYKhx(9?zMh;U0yptn5hY`GuKiy%PBy*G2p zH&9~&DC1u^#fTt5RaP9hIAC-#7#>y%x`T`TEQ1|-;0pvibV-5jP7;ytQN74+`6fmr z9U^;UYbr7+a%%+30KHslzPBSfSvi?~H{!bvA?NSlS-1$VjddW!B)n@r9+NV(j$KaC z5dNA8Y0_zX7C`)Y>(^Q*&6FP6B2Tn$-V!Yoh=42IbaQiOS-I(lj=EaJ0-~{Z{1TL~ z@#!#Q#{;k%L!|<->~7K+N74hODqa;A3vNn$gmB?WV6?2M-N)LB7WukLIge$OX#>tLF09fViv*Ybyym}`~GXN7nK1besWrC}1 zu1LH7*pYvuG>}%&pRug4_Bbj{=dQjWzcuxw*$L?g$sS$~cTSPjL)n}u0=e~Rh#@UL z4Z5S=m)BdSPr(K8FB>Ikm7xHi&9*2J+fB!b36!B%xxlBI=Xk6T0#9MfkyuJOX$@%4 zI)aWRmp;|`u-fATkC_RW+_>lW`Y`Zn*4@wnhoI4!E)?{r7iBh8W)WB|=Wd65D4A}# znW8?-52vWBYd+TZ-U}p``p#VGf-122@#XiC8;4YvFjCPurz{+fPi7@z_=JwA#(pNW zwyB}v31(cP9b^f2*f50E?&z($i{O#f(m?)`q|)b%6%6apU&G_(9waVQdyy^-V0xeb z9xd9PpX%oyY_@D*+{C0y1(PRkZg9PE%D*XPh$%zICIOPm;Pe}XOd1T25vNCvNNAY% zmjTlBWY##rRw0Nus#L*GL94f|(#rf;)*G+prBm4m>(+Y#=_;(zL6?}A+Ug0$QBm;W zxfQ}PvFE0f49eUa9#vg+1{+)$9?{7Y740Nl$gGKQ7N`C~A6jb#Rttl$gk0A>gprJ4 zpn03s^t=7!vEI@9o(Mo!k*B(sv~LgIm_((v!6bp`3W7-Uoa(E)A_)`?yGAsf#Dqf z#z+EgB8Zm`9qM0}kdZ?VcJtIB>vk y6cFTtenoD3Iy*bF`SV+4W!dKJIiO8j=VA diff --git a/src/main/resources/schematics/ruins/trap_pistonFallRuins_open_75.schematic b/src/main/resources/schematics/ruins/trap_pistonFallRuins_open_75.schematic index 0ed8a39edfe1ba3b38e109c5a8562eed2d7e5874..89aeb6618052a1cb95935e8e2d3843c11fa35fd7 100644 GIT binary patch literal 4016 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 diff --git a/src/main/resources/schematics/ruins/trap_pistonFloorPlatform2_closed_100.schematic b/src/main/resources/schematics/ruins/trap_pistonFloorPlatform2_closed_100.schematic index 9cef5ac9032b2c9a5b37c4eea684428c4b0e5eb2..cc337440fbee38777423934f3c1f82c2fe747ef5 100644 GIT binary patch literal 1677 zcmdr~YgEz)9A&v_rD-dt`HGd6g+q_1SZG>#lwA1Q6!HONsAyrRndW%zZE2?h1PCOeyEikD6BQEzcluJSi|$ea3~Yt*dKK@vE!%VZYD9k z;mxlOUcPdOxTUR&26V+pN^>Aieh|1as z?Q#Wsx4oi0?X>v!8Qr%-!D3^H3$nNs>zn2CBVzqF@a_K%j02kenAc zmS|UuxL{SY0m>QT<3i;m|VN}zE zC#F=~22S~}Eu%cM`co*kW)p9C+0k1@;{VvWR_a??g<>d+BNq2|p?Up~RD0?QtP0yO9Tpw`&x<^8aIa|!A&2C{;EqBk$g9`;G2FnHaNlqPM_3HO`RtcW7{a@?%Bn&Q| z(d~hm1v;UQLkCXJoJnKiv@=!Hjnc8J-nJYWc|lcoVScA^BXZV5W2>iv@I4IB{8%c6 zcU@2v%_<|*MBc_MHC5Oe>v5P9RP6yeSC8yIL!=JR7L|l>0{Z}*_UYS8|gO^`DgVv_%R&=4vfTx zb3$_(3$(I+89uvAAxj{D5R4S~*u0Z*(DJejsV%p{ zJX7NA7Og6q09TtiSj6J^!{3qaRKSm8rhp!QieT7MzQ=46Mko@j8bCM~$B$9AfUh!V zADnz<$a6IJX8M=KSa8tWJI}UhP;IKeP;;o>4m-BKg)5BL(moTukr|%x(m9e9`kRTG zNzzc78;2=Uc*HuAm==A=FP>g5s?D;G<_VF3?bEHDJ>^6S50;wsW^U6iOUwDaLV;5B zu9sLyP_nhxjH7I6TVXI58FsT8rrl{{eW{>;TgkngEk5%3-{F)b`Pzf@qw5uZ2o&s4 zTSR=8SZZhLPzV11lG2iOSilI94@1?l{%&haOG}rMf^0u8FR!HCCLmBK;)hq|vyQ<0 z>pJzshzzjmpmHZiU%n&Hb_J)Z64#cccyCvqc>}xBDX&8>vbqpm-b5hCsB4J!B!=E8 zTuUh75xuEhLGEYCgA`z{Xdt~Bi)GMSmL67$hQ!u=tL4E7m5);>HDJ?BvBvSZLVS;% zk5tE{RF)+(Xz=pXk{4D@o(NhW|F&@-R0gc(K^j(>3H$vZ<(Vm!d-D6*>(s#gR#Vk< qloS)6)E+WFySVhsc1@GE1hrGlA+A`9)&p2Cs zz#+Q+UUd3{zVCMhj~3odpK@;Q8L2^k>i#Tk{I}L6l=>q6`0$jWl%V*jqx5WStapFdu6s_Lu2nW-AIWOicy-8V z0fXgpqMq6obZVQf1>QjP!KhzCABfR<{4Xx;UGI@htCG z7j=OaSY^w@l?K>9PKv-icVN>&zy+aFWqMb#G6+7>W3LI)FHqKk~ahNB!o z079Ti4B3=9jkR_pO)t(5(?pwq*nERO5_x4Rw8?SqbOlGbHO9s{IXa&F1+_a~CXg#@{<`dUA!) zMuUT)d(7ju1bqdnbD~kus)}tbXx})LtD%WzU6jY(SFZ=`kp7)DUSl(anKHHih$6;g zaNjHa-hhCJ8&sSMAW6lT^7VTn$y)WyLOkC!GtU5GW{3kAR_}qdVJs|39HWE>6@X|&{i76ZEUdM)5-EXkp) zf!gN{1`&yk5`N(C*)%tS$>5V1sK)OAxEJ=#-#GmM9NWt}vcwKr2k2JdfSqoe8{A8C zf(Sc2b}I0qZoM#~#|fyJ|yQ;{bRL zAJbsy(^s`h<-?BxQ~O@gamf=hV|#4r0@~)^V|suu1O3K6XfF`)ey_^8=%)V z%C5c|dtYpvFnp$2BN>zI7o4BXPAzQSQh1A((M(W3`o#F_y&jf*X7g`f(|9@tZ?!1_!Z=PYbcPFX3h` z&aG6FszM5xnO2)0u;zCryzRt8l@eE86CJJLY6#LPMw+Mtluq-lnqw}jT5?!LQ5UO) zNWQz7!~~-nCM1|pgFHv!L{~;+om;I%2(9C=kfH{mGhILn9C|@1M34knbd!|DGl-F7 zm9Uk_bd{-{9&QfFwVF!{n)|{UV$3e@39wD?*ORav9GwyiCYb>MfTXwhu7uouQt!<2 zwuZEe>2)PKwZ)yd=5{8-z?!^VTUQ61jM=ZBHO-3SZHAj^(njsad)B`2lA`_p*4-!t&a= d2%G8^dd1q}Tm8&nu%_)Rc3lDfNh=2(*F{^s-DtIn)zWrJNQ>jCk+xJvwDT;BA*~V*MT%-YC82j%s~8r+ zNGcKa(8?rjs;cZLvn5DTLn&3Io)Qt3h(vOu==SEmyJvSV_IdF;=l|;WJ>T>FegB4; z{{*bD4Zt7njylk;lQLH3)Qt(h>)1<;blaD3bL6dQ>Vdb^?Kjw`On3SO9%^BJ>bB!X zBg&9b9>k?$o?aGoq|;u_JG^dvvBK--7%v>XeNux(pp=-5bo6uck6aYRG?6oY2|=p8 z-}C<*F-7``DM{p4t5@PNRhWYCKMb`LQ++JK$uA>k)H}N~P?uHM2EiP6=|U~Fe<5{4nm9qY&n{O8|hw;?nc20D!)|v+E6xGyr~TFu7?P0Pwo* zXW^a;caDCZVPMqUeOK?$I8C4Uj%R+xzBZ@F!X-_xB(#`xe_oS|gBk(=DYp4ALOMgK zq4Q_ibO*u`F3saVn|_ozkrOg2?!hb-{dpamU8g)xthvNzC)??{4L`z z=EhYwn-%MwWlS)wS`w?|Oya95uliKMvOvK|`_n9y*tyj{IFDsS%m&9{6;7(eZ1*-x z#thU;zZ;#(MMepb1&E(LoQr{tHMiTu1YAC17P!RF#s~8B^qHVxh#KO zGe;)!`)QFtE+*g7W#6ce{TqnDg)K9yPF67IaW}z{0vE5aI5Y?ojUL`BX~RuVH8qxg z(k|9BFl|Zl`Dtj#wo7#IMjj}-Ra`}-_E0@UV!gxOnd2kG9YgOXQ^)y8_IPV2CQ(*$ zv6wknNWaUv{U#*H1alLNIi88?@DM>h;X=kR1)ZZg`HIT|j5;~HV(4a`fE(X%|F*$P z!nhU+)cr{PrFR5HWe*Be8cES^jviP-Ra2RR2V%Y6UsZO5N7V;_kPO=q%00N{5_D~(~N4lRngKXkSt1sL+>j1Iy)zekl%nCDWGQTl5mDJ*{(V| z#8og5OQ9`)UuXhCv3XY{Y0*kfm+=X7fJ05^SvrN-txj>NT8ndXP%tdA&T1qn)HceF zn@wf&iuj(6j`R`)awue_#^35N3S`BgI@f$H6!ck}1oR~+Q-_dC!;4ek(?HK)FR35G zal(kWAaDegHRj|Z;({BJx)sE*S=6<;)eahS4^xih!ib;^RVsgF_=4){VYy9w74cY- zr0KACg--73^}Ok4;9aO9_|${yGrg6Sa!ukmj5SA2{dL|wn-kAmgg?A@jyzEbOK2K3 zU!LJCELl4Q7t@*iw}n97Jn5iaWsq%F5l9bywwG-FKt=%SP~b}V`QNs2p{|qxpB}-cbLZKSP{vr3_?2g$@zF)J2BYKn1$PttH4se zN@|)cuioQ}3}?8h`tdVnjO2ov>bhX*oZ96BzvevcnM8fd|LB_?mt?R|x>$3)hlvJW z`*;2jDBE_3&FlK(rk>CgouMPU>u}css-D`fS2A6lcy{Z(0eI>+eAXg@ud~tZc9j0<#&Th`zaK9VjtL2#_sCMFnI_;roBt&7 literal 3966 zcmeHKYgAI{8g|OEvZ*GImDQ0mn%Lkd4nEd;jDHF}ripqI2tzjT9{V@_G8^hJeS5KdGt?D|T4>)!%K`41&EKcglm$ z9S4C|9ty09334rJed)1Vk5+32`g=p>rV5>1caOTWG!dDT_qNIV^|Gm_l0sCbc0`P1 z2!)LNrSFXW?;i0PnWN^7M_Et$Z&i!cwrI$*AYpUyF4GhVSez`#~TeCP6DR4vbzFmGSG`n9yK>Halhd6 z!n9q(#-4lD9JRp2T`vLw4Tgpp|A2~>LH$tpd;=U*!8j{ zD&cQx!N8x(RIl@1RX#gPY8cs&-;Hy}+vz=Hwh7s9vib9pgZwIP?Fy zfz#nN<5M{*$qVQUPTw_8-!5psULkziq$)#YPL2`1@H2YxHZOt?JaSfE$FZh|MiyQL zU|P5;s#MqB2H^YLA5L)$YgfNoojbnP!hpRtg1Kk|e)aKYMfn@BF3V>oCkwz*+s~wU zX9JFGvgw0@4fxUfPeIn&z@PU(?a8Yq&q>9Bfm0dE{5J=8rEMmb+?Cy=?YF$H~m*1UJE&Y?R3bT`p9n$u{gQM#_m1oKp*AdwvIc;&C2d@6LjWa>G<7k&IJ>%#`_L8 zKEz=o6KAJI{464zWP2bJhvj3jH=^?B zv)zKkBVD@p<7_9I%<&u@5|(zv3=O4<9hsBeXV_hGxs#IAN8SuV0kyZUFa`#@2X36n z$3dw5DrmQ`=AN#s^Z|3a-{{BC?NR^WX)EL4qcZV)7*Ou!hGjP}0>F5ZO zPgfnc4g6rIIJ(B8k%0M)F!8kD4c`1)SUdqsIbh={G*~ET%K%nv`kLspGo^KPx%AgxG{G1h~pCN52xfE@0`t2t}(@Vv(k_Lsmxyk zBuK4}0Ys(ApeZnz6(Bj)2FW490YPG806iKUvM@P(68C)v`Fe6dktb zJ?xGx+Pqd;5EA$vS*TBVe^D5t@qZHwt71hD-sR>qa&Ql$mLM6P3JSEU5@_A%ZPlea z#U&*r0-dmhpS}yS5XsUHc~+E{o6-?y&<)8t3U!NuHzo_F<{VoZgSH5(!cvxbl|B1Xd>sK(ba9xRE>C+6Snb00v~9p9uyia2=+ z-iljvcO1RE+zo}+HaBLl*AQW`XG28PeKJ2X=|DHLv^~PkGBQU@doHVq zpVQOiGC|cw19k*^%3*Vch?>Ay2H&b|l3NYi*>4cL{Ek6w;n?mN2)kx!ymVz@ z9V>Xu(jH8shQr9#pB#T=b*AMSgHirE4fRk=etL8cj;-*cP4+Cj6kG%YI*pE4yaNZ* zUvBMfLhP3e_lDjQ%s%StC)b5yQj}=@oSrsT&}j%2G;w`jtwPPgAC!pp)Jp6V0b>EdR->xM(Alzy zwsfTfwp+c zc66R6Le|3~g}dxGkmEu^c5w283{BEqTXPkZbh1}1z$Q;H6PBiFu~Jn&c1wXYw8DX;%wruI z3LEW(egi&Op>hkMBh(l-FBL;YsZ;NsoPmM}nU&2czkiLlJ{X6MCHj%&&gbKn;TjRqnV2p9WCBLvCLSl)3>HeL?WPr@S zko^`sQwRzjnhZEs1T$lta(Xv0zz4b8TeF4sj|Ws9XN;}_-nyLk6Iq26!Okx(>$>l7 z-P|}$$V(A5{GSI^OWoXYD?X0HUoQWrQHFn**Q3VdA9_EpX_>|ZBaF!n46KMWCh^0} erz3$xUGyvaz+p+|SssqouZ+EctlQ+g%;XQk+7-tD diff --git a/src/main/resources/schematics/ruins/trap_pistonHallway_closed_100.schematic b/src/main/resources/schematics/ruins/trap_pistonHallway_closed_100.schematic index e7b891e597c55309802509234399312e21d72fd1..f8efdc36190ea9184c1e391f738e20fbe9b6fbef 100644 GIT binary patch literal 1474 zcmdT^dr%Sv7$?(OE4AgS-8OL6(r&UIYM6?8)p|Im)V#Rxfo0$em4rmm33*+ylWiFo zg$(G%CIzO+Q$-$~tu!A|9X2w_P4N{El^`AhtM>nH|L*(a`|JBXzTbWKg;U=Hysbch zd3?BH^4He*<5%jI3c{G8?Iyx?{0oaNAIy zDDA{1T!j6(gTkfl2s&x%Nd^7m{Xcc+aWTqmFUTqv;MkCG7+ue$W^@Z0U5R=RjzmNb z(PsQNrqNe{qdHUzN{3i_h9PxGPZ)8A3sBS!0GYH*RI?z#U?z&+RGAQhO?; zDI`Tr-j2=r?9IBrSfz`tK9kLe?sg8&3thN8&Nd>=r||W_=H=FTd7XXC`ckfjkz9C^ z!;p~b0?e4&@%|Okm5=}f( zMPcJ=N{7!QAbT@w?}vq^TQQP`=s*xl6Fz&LyIjam>vOQ~fCoiq>r8EtRac6}AH`?a z@`~WZmcpm!&7fP%>}MI+A~<(DR?raD4!o(t?6J)&&eeWBw~!}Ps=z?EtfJ%0M9vlI z#mr}%F6`0*dBELoY1VnrCkQ|X+K!~>o0(pov78Z#rkgus)5$VAUvW77wM^t?>pve~ z`{|eFRyn?cm{KApV8+>dJb0EAmIGrTFEQ-s)#XVg6(I+B(&`qU$s1}ttxOjE@X_7g z{h%BM1znPOTPHbYScbDg%~K_@*?!;XHNxSZBo=z^Psi-|FHbBZP4+Tpxi(lBa#3!nqs8fhodDBzGu(~a{NZwB2L;G-!!~u#jZMZm zfwRK)d#yOPd3X{_ei##NKV$5M4h;iP+fN^G8a^8s+3?F?!G$*$$gDZ(PBWlB_fPg&2AQ{9c32G;!! YEJ*Ecq}xP$(@6m*uU(e(9|{2c4eVLy+5i9m literal 1622 zcmds1|5MTj0R2?AY??VWwa&`B`7JNVi=kAgES2KiqbX7<~5(1$47Id<2eZ5)xYX z=9uL>BNohKiXx8{)5e#kJcxf>@VdEQY-2b_g{Z_S$hCb=GBl`|iq(Jl006mEIJ*S^ z3Tj>Os+5wTo!e_}(?$YwD$2>>Nts~~o`H5HIbO#QTbGNWbnfA8b>P?%2v3qMmaP5;|@hHVX?^PY{b_a?>@wiV(9tRM+ zq0}|nOQ8eR6ZsC~!esCz@Z#69J;&AnrCt@ay)Dh&V6P57t?#1Z`{Q|V{FIhwI+D&f z9w-^N>X8RI0AQXGNBxujUy?J#vMhV}Y6JOOTe$hE_~(u)Or^mYuY-$uTHJI~yY6iC zLLkCCrpivyYC7tdo>8ugoR%PJ1!U8ai3j#a^dAu$Y|_Qz0}Zcg%H$+wc+8|h&qVyn z45hm3Uel_kaU$}QA(tY0TEN;wM|Y8*LP29XkU~O*bGuWRDCxT->C@^BG`+#wZXH`P zN+SYJ(+EmiSH}hWM4fiJX0FU$1v7k9slHc*<8Tm-9vHC*DqONf13;%pE^v90!+W{n zVROpV%(l(#iv`_DZhlx!v0}5 zf-Zj}xi2RxSqd35fqr+FZ732p4iS`O9ExOD5-G6@M-P8C{WhQ@wKbE9=S8quphC%b z!nPq4oKIk_BCue?1-z#w-`v@o*k;iSFvR65CoTICrtPs5546Zlv)#d~NF zG*~0$W~8!46E&)yG;otFw$0ejR-o2_pFJWBR=Z)bKCI4}eG+8zrZkQF`Z!k$2USM( z&A}*Dn-hLYy|Ua9Sw1||L#%Rf`Vr#zsVEZ@uYwi~REt9DOsqNF02f5ZYE{G6&lBLM z@?$bi?#gZSZ!bK_I>|ra(OOb~R<_(fMj*;%jxHG&Pw4M?U7%!~=Bf)9i@&OGAwA{c zU{qoC8-Di2^;=tO_Yd6XfxdiwC`5 zyOywnqx~RmM)a&R(i4%<$&M%*elB3pV_1%H4ST;1{fQY$K7BCqC_4Sl14WM<63Ugsm4Rj{`4r} zxjQ?mR!;fECh&Ej0YR85UCJ+c*YE=f1OofNk-wkt;f#gp3A6>95Z$HE!*0c|1bzoH CkmS4o diff --git a/src/main/resources/schematics/ruins/trap_pistonSmasherHall_closed_100.schematic b/src/main/resources/schematics/ruins/trap_pistonSmasherHall_closed_100.schematic index 92d7fb521486e6b0567439a1a0889738dd390810..a2ee7f1e129fdeee23dc7b4010e4a1a5a9f699c7 100644 GIT binary patch literal 2130 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 We5#1e diff --git a/src/main/resources/schematics/ruins/trap_raceTheTNTHall_closed_1.schematic b/src/main/resources/schematics/ruins/trap_raceTheTNTHall_closed_1.schematic index b3489e2e1d1b152cef5d6c88144640fe03b97f4c..01ba26c93394e0ba7884f09c3aea5cb7f702c7db 100644 GIT binary patch literal 966 zcmb2|=3oE;7KXQX&*n*oN;Eu7KK`?Cp@O0ci<8Fgd(P#qj2js^8H1)@Oz?jlC~Ga{ zA6l5YSMuB5-d!S(Zp?F;Jnc%n|Gab^%f5Jd|26*Zedhb7x9#s&dm4E$Wbt7W3(Z+d zOT+brL3SMY|0LtOI*{?^(7j(vegCta{;D6F_r-xB@A|!8rLU*m|M&5NsJs-f**Zp` zB9Hl{Z{Fq0y#00h>otCmb|S%!oEd#}GfYE+r*_|)ecL_rhxf%PrJ+9Jng1_-sR`n_ zyu3c-a*^)q<<0X?-@KeQNls?j!^Ize{C-*UC1>KLNAK_cv&Co82J62iAA%!o=bF59 zw0~>A?pXeQhA$8H=l`$yT68@f7?uZ)uif6w)4;#}zV7YU+ak7KwX#!Zm|Joulzr~K zDc`G3pPqH)TiL$rufA%mcfPjo>$h#2p7#FzdOG1Ni}=lh ziMJ=qZe6==-?h5iS+eKX{w?*syJ_2X-)+BpIF$TP%ssX4-YNa`zkHG3dFy|?f8Vxx z^;_QkUr*jL|8tf#_s1p|jfv_{^iuccN&hqb&lwY9UeUh)?Y7O|Z+_VRFX-m+DT0nq zICnZnuD_nB?ti^@QSoQq{n=(WtnQ_oO8<*J+oABO<<7!2_um@-+1t1JZLUoCnrpW$ zqBh^#yLNHuR_*N{%c~qyZl<~jR63;?MVd(py37-p=`+pOjb);`i`wMW$spq=o=mx! zGQ^ZXWB)@Q+u@QQ*@n8am)S(!`=e58yzbnw&y{;Cek6ZPkL~Sy?%!9h-JN;$&(wW3 ztJ9vY(3@w%FMhTrY~RlRk-xIO-rgnizxepe?p1o1x39LIcmCXS{ZmixE-$T&6Z4H+ z{(E(G_bR{n>+|~5o-Xo?kC}7g@gh5WyU2et_T9E*7oU9kJU`91ig)tlbD!_JFfjlCEV#Uz literal 1064 zcmb2|=3sz;w|CF_El!m<{?Pr|;)E-gXUy%6(}4Q4pg{KlAqbH-F3S-1=x=&&ZH1yY`;xtJ4oI zU)}j+?R#Uz3l~=L<&;S8t=B61$ho-tdHVDHqTJ_iUQ2VAexPI~Q0wsqSI?q5vX*E(ZO!;_EqGRwN(%AT;QPo2bG)D0Fn-B|xw=b3fs zgK`hK_jA+AcR%@G{2>2XbjL|954rU^rrHXXdp2DFDLoamnQ78-ZSJ#!Kmrt@*DAi} z+t<%H7bkz__U5(Uo?O5Aul_&7mzVAT|NZ>-g$1Z0FR@5ol0p7{Ui`OJ?~`i7U)T6B z>?)bJYVGU(PbZ(e$vt`U!u-#Z9cP~p+qa{U=SIu6zBh|gch}xrqAYD!rLKMRCcFN$ z`?roV&q-f?pWpVzedqA#eb>4dt}d<1JzQ-4@^srXwcY=FSWZfRTCiz#|EHrl+m&D2 zf0)02|NEaucVA_$|8TI4|Icahk_V^#IwtK=U$9KM8-*?XUo%5OJsH^;i?J7%?lktLs zMlTbKo|L!U9Y4pT0=3+SlYubt2ms2ve$Hg1+bxIVSr?(k$gV<65c&9o2qo2IpwYXd zs`1eBX2w?dLZ3e6ezIk|8ou&QdT3ZA7gHEcsuN1-UWDXL-z_RCnc&6bt?Irw*bjYO zvE%8CGXOHuWjZ_*NhPct2hbh+0s`KAU+t?PEZ{RL_9yCPrT%9$iE4l=H&w3C_V`fgK^o8msZxvy;s zcO+?2MZ|=FeN*?Ht;_uG>JGsT)Sy-OK6dK|gBOG~cj3OoE zy!2?f{h3Yv$5~s@;}(|Gdm?)mMBzZ}vTb7D(}P?)XtwE88rl_R)2e6|$o@t2Bsk^^ zwwTpn%hsz_I(|!(YPzY_i#Ap_Lb(TS>2oAmoVRwET)(F5BdSjQ-z%{RZS|l$!?jzt zpr3-Ub9L2a3wMSSQw_0ponR0;Csw+Q^!)PK{F)1aOunec)vq74ciltv9kLoAIQwNHPCmY8<_cTB zSo7wA-zlznA_20*&#y;tls#B6K-560jJ?^&VUK;~Vq;3r){_~dFF5pgg#|W*q&t@$ zSc!@%pQue<{~kwE=6@<-^y;!ki>}8TKdjXlfA((2bO2RV$UsV!-`Sm-n?`$OUYo^V%jCD4IpV4Qa1EhNq?qPzxZh5`yP zbPjT5mWqEBSH0)QIx9rM!gxeJa=V?3LXo^rx_<4+)S=B(-J zLp;-cv+;_jAU4Oe=;1w?;9RZos@dL*OzBZ8$Jt&6qod=*V6*Wz$~@ z0^kCPcJO%EhXYLEiMa?tvp21Gtv1m(ZdoQzvJys)m(hC%PxoL+|GHBAhxH-SaT(*w)w3TSj2? zXwU8&A3?`+jcCz7e7|X1c;+IV{zrEII0(hjs5;*bFYDl6&ezT`EoJM6S!Tmg(%$j# zvGm#1nQ8t&UwYKMm80-+bCVQv<%nOnfuCV-Y*}D4E2vtK4wtqoXIBLHgH1_>o3qkW z>lePiAkGghiW;u1qDhnIF@>!{hE4xDQP{hW93qEVVbokQOYeuD>JP4SbnTRRII~ti!4k+bm^NNXuOYF; Qe{);QWL~X}$5xd;0W*0lH~;_u literal 2007 zcmd6oYcSi18phqLy4Wq%ZD<|aqx9m~wF!!fHZHO4zqERdV2i0lidJar646yjZAz-z z&?t?HQ1{(LQjt{4X>1XqBveRBC4@ysr3q1XcRI5(=lhv6=l$@0dFFYancqA!uRY0B z@AJ%;2@|D()`3pwt%4``^5>+BML}=90>Z6twZ-3PWWE1q;DI3^Z!}w8mt9z_@@+b? z4$pVK`~6uPM;xdu$LLB)=Yv*_MHAdBJF2xZN*)#UDJ{(d_oy`vij+loX%tMuKXdL( zpoX_(52XD%XZ%+xy&uIvx^{t3VRn5&1**{37DEHBctVUvw)Xdry~@LObt#H3U>nO4 z;x2f{?oxRoI^9c$j{v*ttvh_J-biTzkG9C?vaNiwcf$Iuh>uQ8=<#7>zw&EEfqHpL zD^=DN-8qvr%cquoxvGaecd}Vg|CHa=qzda{#qGhIVsBV?#N-++HCbC9d?*Ed1CUSb zZm|rk*4G=sKE-ZA-Pu?eN7;4E&6_3zH@9uv< z3dVZuq2s_J<18nnw!J+isQpiZpAPYPt*QNTne}jS(1Mnu5}rPqF&l|Q;#RL;o0r8d z%*+!l?w0{pCse_}ey>&Ioz5!b!eatNPIveCRe2@i3pGk2_H7vR+!H`%pXeMqy z8bEw;jH`n85Rz`Q76bR`r~f3^wtU-cOW`j}r(PUGiCAzHV5<&7oJ*x9*YoYPqptTSoE*yV@N8XmR!aAc;}yn4O$H z;NM~tdfb&-OVR6A1z3r<`W@t>Y7qv`)!TtnNA(oTkDtVErag=VpK#H?_rEpie=en8 z_H0+ydM4!4b=*Uz?N@S*yh?B@B^h>(V6WN_qNu09m+ zAJ2d87PHY0?^>?iNA#iQl#yCyVp(WS|1i2&SHc8q# z0EDqvxeKK$7JyOjm%qtJuaCcb*Rh%g+jeT(Xy8;4#Qwa0}YMuT{8uN z5N;r68V@ECiS7>g=__{rL?BRZo0vH-ehCJ%V!@$)X+&B@g=6IngKlplb90v+{|~4B U^Y3JLO^o4_rlCJbU Date: Mon, 9 Mar 2015 16:09:35 -0500 Subject: [PATCH 19/58] Where'd that ++ come from? That shouldn't be there. --- .../java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java index 2013b38..0016d9f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/schematic/Schematic.java @@ -73,7 +73,7 @@ public class Schematic { Block[] blockObjPalette = new Block[blockPalette.length]; for (int i = 0; i < blockPalette.length; i++) { - blockObjPalette[i++] = (Block)Block.blockRegistry.getObject(blockPalette[i]); + blockObjPalette[i] = (Block)Block.blockRegistry.getObject(blockPalette[i]); } for (int i = 0; i < blockIds.length; i++) { -- 2.39.5 From 198d1ac56fe879d107e98817d76049c53a1d6a1c Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Mon, 9 Mar 2015 16:10:02 -0500 Subject: [PATCH 20/58] Remove the procedural rift rendering --- .../mod_pocketDim/mod_pocketDim.java | 30 ------------------- .../tileentities/TileEntityRift.java | 10 ------- .../mod_pocketDimClient/RenderRift.java | 1 - 3 files changed, 41 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 971aff6..537d31c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -333,36 +333,6 @@ public class mod_pocketDim DDLoot.registerInfo(properties); proxy.loadTextures(); proxy.registerRenderers(); - - LSystem.generateLSystem("terdragon", LSystem.TERDRAGON, 4); - LSystem.generateLSystem("terdragon", LSystem.TERDRAGON, 5); - // LSystem.generateLSystem("terdragon", LSystem.TERDRAGON, 6); //degenerate - LSystem.generateLSystem("terdragon", LSystem.TERDRAGON, 7); - // LSystem.generateLSystem("terdragon", LSystem.TERDRAGON, 8); - // LSystem.generateLSystem("terdragon", LSystem.TERDRAGON, 9); - - - // LSystem.generateLSystem("vortex", LSystem.VORTEX, 8); - LSystem.generateLSystem("vortex", LSystem.VORTEX, 9); - LSystem.generateLSystem("vortex", LSystem.VORTEX, 10); - LSystem.generateLSystem("vortex", LSystem.VORTEX, 11); - // LSystem.generateLSystem("vortex", LSystem.VORTEX, 12); - - LSystem.generateLSystem("twindragon", LSystem.TWINDRAGON, 7); - LSystem.generateLSystem("twindragon", LSystem.TWINDRAGON, 8); - LSystem.generateLSystem("twindragon", LSystem.TWINDRAGON, 9); - LSystem.generateLSystem("twindragon", LSystem.TWINDRAGON, 10); - // LSystem.generateLSystem("twindragon", LSystem.TWINDRAGON, 11); - - - LSystem.generateLSystem("dragon", LSystem.DRAGON, 8); - LSystem.generateLSystem("dragon", LSystem.DRAGON, 9); - LSystem.generateLSystem("dragon", LSystem.DRAGON, 10); - LSystem.generateLSystem("dragon", LSystem.DRAGON, 11); - // LSystem.generateLSystem("dragon", LSystem.DRAGON, 12); - // LSystem.generateLSystem("dragon", LSystem.DRAGON, 13); - - } @EventHandler diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 63993c9..43be0e9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -51,7 +51,6 @@ public class TileEntityRift extends DDTileEntityBase public int spawnedEndermenID = 0; public int riftRotation = random.nextInt(360); - public int renderKey = random.nextInt(LSystem.curves.size()); public float growth = 0; public TileEntityRift() @@ -265,7 +264,6 @@ public class TileEntityRift extends DDTileEntityBase this.shouldClose = nbt.getBoolean("shouldClose"); this.spawnedEndermenID = nbt.getInteger("spawnedEndermenID"); this.riftRotation = nbt.getInteger("riftRotation"); - this.renderKey = nbt.getInteger("renderKey"); this.growth = nbt.getFloat("growth"); } @@ -280,7 +278,6 @@ public class TileEntityRift extends DDTileEntityBase nbt.setInteger("zOffset", this.zOffset); nbt.setBoolean("shouldClose", this.shouldClose); nbt.setInteger("spawnedEndermenID", this.spawnedEndermenID); - nbt.setInteger("renderKey", this.renderKey); nbt.setInteger("riftRotation", this.riftRotation); nbt.setFloat("growth", this.growth); @@ -320,11 +317,4 @@ public class TileEntityRift extends DDTileEntityBase { return null; } - - public PolygonStorage getCurve() - { - - - return (LSystem.curves.get(renderKey)); - } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java index 762bca4..7c7394c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -35,7 +35,6 @@ public class RenderRift extends TileEntitySpecialRenderer */ TileEntityRift rift = (TileEntityRift) te; // draws the verticies corresponding to the passed it - this.drawCrack(rift.riftRotation, rift.getCurve(), rift.growth/15, xWorld, yWorld, zWorld); GL11.glDisable(GL_BLEND); // reenable all the stuff we disabled -- 2.39.5 From 42a04ff156ecbb64943a1f3b78baecde0f0bb8c4 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 02:55:15 -0500 Subject: [PATCH 21/58] Fix sounds for 1.7 --- .../resources/assets/dimdoors/sounds.json | 26 +++++++++--------- .../dimdoors/{sound => sounds}/crack.ogg | Bin .../dimdoors/{sound => sounds}/creepy.ogg | Bin .../{sound => sounds}/doorLockRemoved.mp3 | Bin .../{sound => sounds}/doorLockRemoved.ogg | Bin .../dimdoors/{sound => sounds}/doorLocked.mp3 | Bin .../dimdoors/{sound => sounds}/doorLocked.ogg | Bin .../dimdoors/{sound => sounds}/keyLock.mp3 | Bin .../dimdoors/{sound => sounds}/keyLock.ogg | Bin .../dimdoors/{sound => sounds}/keyUnlock.mp3 | Bin .../dimdoors/{sound => sounds}/keyUnlock.ogg | Bin .../dimdoors/{sound => sounds}/monk.ogg | Bin .../dimdoors/{sound => sounds}/rift.ogg | Bin .../dimdoors/{sound => sounds}/riftClose.ogg | Bin .../dimdoors/{sound => sounds}/riftDoor.ogg | Bin .../dimdoors/{sound => sounds}/riftEnd.ogg | Bin .../dimdoors/{sound => sounds}/riftStart.ogg | Bin .../dimdoors/{sound => sounds}/tearing.ogg | Bin 18 files changed, 13 insertions(+), 13 deletions(-) rename src/main/resources/assets/dimdoors/{sound => sounds}/crack.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/creepy.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/doorLockRemoved.mp3 (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/doorLockRemoved.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/doorLocked.mp3 (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/doorLocked.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/keyLock.mp3 (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/keyLock.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/keyUnlock.mp3 (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/keyUnlock.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/monk.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/rift.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/riftClose.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/riftDoor.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/riftEnd.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/riftStart.ogg (100%) rename src/main/resources/assets/dimdoors/{sound => sounds}/tearing.ogg (100%) diff --git a/src/main/resources/assets/dimdoors/sounds.json b/src/main/resources/assets/dimdoors/sounds.json index d676cc3..0fc825e 100644 --- a/src/main/resources/assets/dimdoors/sounds.json +++ b/src/main/resources/assets/dimdoors/sounds.json @@ -1,15 +1,15 @@ { - "crack": {"category":"hostile", "sound":[{"name":"crack","stream":false}]}, - "creepy": {"category":"ambient", "sound":[{"name":"creepy","stream":true}]}, - "doorLocked": {"category":"player", "sound":[{"name":"doorLocked","stream":false}]}, - "doorLockRemoved": {"category":"player", "sound":[{"name":"doorLockRemoved","stream":false}]}, - "keyLock": {"category":"player", "sound":[{"name":"keyLock","stream":false}]}, - "keyUnlock": {"category":"player", "sound":[{"name":"keyUnlock", "stream":false}]}, - "monk": {"category":"hostile", "sound":[{"name":"monk", "stream":false}]}, - "rift": {"category":"master", "sound":[{"name":"rift", "stream":false}]}, - "riftClose": {"category":"player", "sound":[{"name":"riftClose", "stream":false}]}, - "riftDoor": {"category":"player", "sound":[{"name":"riftDoor", "stream":false}]}, - "riftEnd": {"category":"player", "sound":[{"name":"riftEnd", "stream":false}]}, - "riftStart": {"category":"player", "sound":[{"name":"riftStart", "stream":false}]}, - "tearing": {"category":"hostile", "sound":[{"name":"tearing", "stream":false}]} + "crack": {"category":"hostile", "sounds":[{"name":"crack","stream":false}]}, + "creepy": {"category":"ambient", "sounds":[{"name":"creepy","stream":true}]}, + "doorLocked": {"category":"player", "sounds":[{"name":"doorLocked","stream":false}]}, + "doorLockRemoved": {"category":"player", "sounds":[{"name":"doorLockRemoved","stream":false}]}, + "keyLock": {"category":"player", "sounds":[{"name":"keyLock","stream":false}]}, + "keyUnlock": {"category":"player", "sounds":[{"name":"keyUnlock", "stream":false}]}, + "monk": {"category":"hostile", "sounds":[{"name":"monk", "stream":false}]}, + "rift": {"category":"master", "sounds":[{"name":"rift", "stream":false}]}, + "riftClose": {"category":"player", "sounds":[{"name":"riftClose", "stream":false}]}, + "riftDoor": {"category":"player", "sounds":[{"name":"riftDoor", "stream":false}]}, + "riftEnd": {"category":"player", "sounds":[{"name":"riftEnd", "stream":false}]}, + "riftStart": {"category":"player", "sounds":[{"name":"riftStart", "stream":false}]}, + "tearing": {"category":"hostile", "sounds":[{"name":"tearing", "stream":false}]} } \ No newline at end of file diff --git a/src/main/resources/assets/dimdoors/sound/crack.ogg b/src/main/resources/assets/dimdoors/sounds/crack.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/crack.ogg rename to src/main/resources/assets/dimdoors/sounds/crack.ogg diff --git a/src/main/resources/assets/dimdoors/sound/creepy.ogg b/src/main/resources/assets/dimdoors/sounds/creepy.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/creepy.ogg rename to src/main/resources/assets/dimdoors/sounds/creepy.ogg diff --git a/src/main/resources/assets/dimdoors/sound/doorLockRemoved.mp3 b/src/main/resources/assets/dimdoors/sounds/doorLockRemoved.mp3 similarity index 100% rename from src/main/resources/assets/dimdoors/sound/doorLockRemoved.mp3 rename to src/main/resources/assets/dimdoors/sounds/doorLockRemoved.mp3 diff --git a/src/main/resources/assets/dimdoors/sound/doorLockRemoved.ogg b/src/main/resources/assets/dimdoors/sounds/doorLockRemoved.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/doorLockRemoved.ogg rename to src/main/resources/assets/dimdoors/sounds/doorLockRemoved.ogg diff --git a/src/main/resources/assets/dimdoors/sound/doorLocked.mp3 b/src/main/resources/assets/dimdoors/sounds/doorLocked.mp3 similarity index 100% rename from src/main/resources/assets/dimdoors/sound/doorLocked.mp3 rename to src/main/resources/assets/dimdoors/sounds/doorLocked.mp3 diff --git a/src/main/resources/assets/dimdoors/sound/doorLocked.ogg b/src/main/resources/assets/dimdoors/sounds/doorLocked.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/doorLocked.ogg rename to src/main/resources/assets/dimdoors/sounds/doorLocked.ogg diff --git a/src/main/resources/assets/dimdoors/sound/keyLock.mp3 b/src/main/resources/assets/dimdoors/sounds/keyLock.mp3 similarity index 100% rename from src/main/resources/assets/dimdoors/sound/keyLock.mp3 rename to src/main/resources/assets/dimdoors/sounds/keyLock.mp3 diff --git a/src/main/resources/assets/dimdoors/sound/keyLock.ogg b/src/main/resources/assets/dimdoors/sounds/keyLock.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/keyLock.ogg rename to src/main/resources/assets/dimdoors/sounds/keyLock.ogg diff --git a/src/main/resources/assets/dimdoors/sound/keyUnlock.mp3 b/src/main/resources/assets/dimdoors/sounds/keyUnlock.mp3 similarity index 100% rename from src/main/resources/assets/dimdoors/sound/keyUnlock.mp3 rename to src/main/resources/assets/dimdoors/sounds/keyUnlock.mp3 diff --git a/src/main/resources/assets/dimdoors/sound/keyUnlock.ogg b/src/main/resources/assets/dimdoors/sounds/keyUnlock.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/keyUnlock.ogg rename to src/main/resources/assets/dimdoors/sounds/keyUnlock.ogg diff --git a/src/main/resources/assets/dimdoors/sound/monk.ogg b/src/main/resources/assets/dimdoors/sounds/monk.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/monk.ogg rename to src/main/resources/assets/dimdoors/sounds/monk.ogg diff --git a/src/main/resources/assets/dimdoors/sound/rift.ogg b/src/main/resources/assets/dimdoors/sounds/rift.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/rift.ogg rename to src/main/resources/assets/dimdoors/sounds/rift.ogg diff --git a/src/main/resources/assets/dimdoors/sound/riftClose.ogg b/src/main/resources/assets/dimdoors/sounds/riftClose.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/riftClose.ogg rename to src/main/resources/assets/dimdoors/sounds/riftClose.ogg diff --git a/src/main/resources/assets/dimdoors/sound/riftDoor.ogg b/src/main/resources/assets/dimdoors/sounds/riftDoor.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/riftDoor.ogg rename to src/main/resources/assets/dimdoors/sounds/riftDoor.ogg diff --git a/src/main/resources/assets/dimdoors/sound/riftEnd.ogg b/src/main/resources/assets/dimdoors/sounds/riftEnd.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/riftEnd.ogg rename to src/main/resources/assets/dimdoors/sounds/riftEnd.ogg diff --git a/src/main/resources/assets/dimdoors/sound/riftStart.ogg b/src/main/resources/assets/dimdoors/sounds/riftStart.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/riftStart.ogg rename to src/main/resources/assets/dimdoors/sounds/riftStart.ogg diff --git a/src/main/resources/assets/dimdoors/sound/tearing.ogg b/src/main/resources/assets/dimdoors/sounds/tearing.ogg similarity index 100% rename from src/main/resources/assets/dimdoors/sound/tearing.ogg rename to src/main/resources/assets/dimdoors/sounds/tearing.ogg -- 2.39.5 From 2ca661cc45191caf83da085d1506e1d99b674baf Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 02:56:18 -0500 Subject: [PATCH 22/58] Fixed decay trying to decay limbo blocks then crashing --- .../mod_pocketDim/world/LimboDecay.java | 66 +++++++++++-------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java index 16ab005..2669762 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/LimboDecay.java @@ -22,39 +22,51 @@ public class LimboDecay { private static final int DECAY_SPREAD_CHANCE = 50; private static final int CHUNK_SIZE = 16; private static final int SECTION_HEIGHT = 16; - + //Provides a reversed list of the block IDs that blocks cycle through during decay. - private final Block[] decaySequence; + private Block[] decaySequence = null; private final Random random; private final DDProperties properties; - private final Block[] blocksImmuneToDecay; + private Block[] blocksImmuneToDecay = null; public LimboDecay(DDProperties properties) { - decaySequence = new Block[] { - mod_pocketDim.blockLimbo, - Blocks.gravel, - Blocks.cobblestone, - Blocks.stone - }; - - blocksImmuneToDecay = new Block[] { - mod_pocketDim.blockLimbo, - mod_pocketDim.blockDimWallPerm, - mod_pocketDim.transientDoor, - mod_pocketDim.dimensionalDoor, - mod_pocketDim.warpDoor, - mod_pocketDim.blockRift, - mod_pocketDim.unstableDoor, - mod_pocketDim.goldenDoor, - mod_pocketDim.goldenDimensionalDoor - }; - this.properties = properties; this.random = new Random(); } + public Block[] getDecaySequence() { + if (decaySequence == null) { + decaySequence = new Block[] { + mod_pocketDim.blockLimbo, + Blocks.gravel, + Blocks.cobblestone, + Blocks.stone + }; + } + + return decaySequence; + } + + public Block[] getBlocksImmuneToDecay() { + if (blocksImmuneToDecay == null) { + blocksImmuneToDecay = new Block[] { + mod_pocketDim.blockLimbo, + mod_pocketDim.blockDimWallPerm, + mod_pocketDim.transientDoor, + mod_pocketDim.dimensionalDoor, + mod_pocketDim.warpDoor, + mod_pocketDim.blockRift, + mod_pocketDim.unstableDoor, + mod_pocketDim.goldenDoor, + mod_pocketDim.goldenDimensionalDoor + }; + } + + return blocksImmuneToDecay; + } + /** * Checks the blocks orthogonally around a given location (presumably the location of an Unraveled Fabric block) * and applies Limbo decay to them. This gives the impression that decay spreads outward from Unraveled Fabric. @@ -135,9 +147,9 @@ public class LimboDecay { { //Loop over the block IDs that decay can go through. //Find an index matching the current blockID, if any. - for (index = 0; index < decaySequence.length; index++) + for (index = 0; index < getDecaySequence().length; index++) { - if (decaySequence[index] == block) + if (getDecaySequence()[index] == block) { break; } @@ -149,7 +161,7 @@ public class LimboDecay { //last ID in the array, which is the first one that all blocks decay into. //We assume that Unraveled Fabric is NOT decayable. Otherwise, this will go out of bounds! - world.setBlock(x, y, z, decaySequence[index - 1]); + world.setBlock(x, y, z, getDecaySequence()[index - 1]); return true; } return false; @@ -165,9 +177,9 @@ public class LimboDecay { return false; } - for (int k = 0; k < blocksImmuneToDecay.length; k++) + for (int k = 0; k < getBlocksImmuneToDecay().length; k++) { - if (block == blocksImmuneToDecay[k]) + if (block == getBlocksImmuneToDecay()[k]) { return false; } -- 2.39.5 From 8368c55478932414fa7e709a57a843c816862d20 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 02:56:42 -0500 Subject: [PATCH 23/58] Obelisk eyes don't draw through walls now --- .../StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java index b87e6c8..6296016 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java @@ -57,8 +57,6 @@ public class RenderMobObelisk extends RenderLiving GL11.glDisable(GL11.GL_CULL_FACE); GL11.glDisable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_BLEND); - GL11.glDisable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(false); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); this.mainModel.onGround = this.renderSwingProgress(par1EntityLivingBase, par9); @@ -101,8 +99,6 @@ public class RenderMobObelisk extends RenderLiving GL11.glEnable(GL11.GL_CULL_FACE); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_DEPTH_TEST); - GL11.glDepthMask(true); GL11.glPopMatrix(); MinecraftForge.EVENT_BUS.post(new RenderLivingEvent.Post(par1EntityLivingBase, this, x, y, z)); } -- 2.39.5 From c46e08c76e376d6129885aa690f57f675536adf0 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 03:24:02 -0500 Subject: [PATCH 24/58] Make parts other than the monolith eye visible --- .../mod_pocketDimClient/ModelMobObelisk.java | 21 ++----------------- .../mod_pocketDimClient/RenderMobObelisk.java | 2 +- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ModelMobObelisk.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ModelMobObelisk.java index 564a9ca..88ae914 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/ModelMobObelisk.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/ModelMobObelisk.java @@ -39,11 +39,6 @@ public class ModelMobObelisk extends ModelBase wholemonolith = new ModelRenderer(this, 0, 0); wholemonolith.addBox(-48/2F,-108F/1.3F, -12/2F, 48, 108, 12); - wholemonolith.setTextureSize(256, 256); - wholemonolith.mirror = true; - this.wholemonolith.rotationPointY=0; - this.wholemonolith.rotationPointX=0; - this.wholemonolith.rotationPointZ=0; } @@ -51,22 +46,10 @@ public class ModelMobObelisk extends ModelBase @Override public void render(Entity par1Entity, float par2, float par3, float par4, float par5, float par6, float par7) { - super.render(par1Entity, 0, 0, 0, 0, 0, 0); this.setRotationAngles(0, 0, 0, 0, 0,0, par1Entity); - - + + GL11.glScalef(((MobMonolith) par1Entity).getRenderSizeModifier(), ((MobMonolith) par1Entity).getRenderSizeModifier(), ((MobMonolith) par1Entity).getRenderSizeModifier()); wholemonolith.render(par7); } - - - - - - @Override - public void setRotationAngles(float par1, float par2, float par3, float par4, float par5, float par6, Entity par7Entity) - { - super.setRotationAngles( 0, 0, 0, 0, 0, 0, par7Entity); - } - } diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java index 6296016..1189983 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java @@ -121,6 +121,6 @@ public class RenderMobObelisk extends RenderLiving protected ResourceLocation getEntityTexture(Entity entity) { MobMonolith monolith = (MobMonolith) entity; - return new ResourceLocation(mod_pocketDim.modid + ":textures/mobs/Monolith" + monolith.getTextureState() + ".png"); + return new ResourceLocation(mod_pocketDim.modid + ":textures/mobs/oldMonolith/Monolith" + monolith.getTextureState() + ".png"); } } \ No newline at end of file -- 2.39.5 From d4ff48435cfc3c3f4eafad6d89f14fdab65b6786 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 03:29:42 -0500 Subject: [PATCH 25/58] Remove poly2tri because it's for stuff that never got finished --- src/main/java/org/poly2tri/Poly2Tri.java | 124 -- .../poly2tri/geometry/polygon/Polygon.java | 269 ---- .../geometry/polygon/PolygonPoint.java | 39 - .../poly2tri/geometry/polygon/PolygonSet.java | 58 - .../geometry/polygon/PolygonUtil.java | 15 - .../poly2tri/geometry/primitives/Edge.java | 17 - .../poly2tri/geometry/primitives/Point.java | 31 - .../coordinate/AnyToXYTransform.java | 71 - .../coordinate/CoordinateTransform.java | 12 - .../coordinate/Matrix3Transform.java | 38 - .../transform/coordinate/NoTransform.java | 21 - .../coordinate/XYToAnyTransform.java | 74 - .../triangulation/Triangulatable.java | 22 - .../triangulation/TriangulationAlgorithm.java | 36 - .../TriangulationConstraint.java | 55 - .../triangulation/TriangulationContext.java | 171 --- .../TriangulationDebugContext.java | 13 - .../triangulation/TriangulationMode.java | 6 - .../triangulation/TriangulationPoint.java | 112 -- .../triangulation/TriangulationProcess.java | 341 ----- .../TriangulationProcessEvent.java | 36 - .../TriangulationProcessListener.java | 36 - .../triangulation/TriangulationUtil.java | 213 --- .../delaunay/DelaunayTriangle.java | 685 --------- .../delaunay/sweep/AdvancingFront.java | 179 --- .../delaunay/sweep/AdvancingFrontIndex.java | 43 - .../delaunay/sweep/AdvancingFrontNode.java | 84 -- .../triangulation/delaunay/sweep/DTSweep.java | 1290 ----------------- .../delaunay/sweep/DTSweepConstraint.java | 103 -- .../delaunay/sweep/DTSweepContext.java | 280 ---- .../delaunay/sweep/DTSweepDebugContext.java | 105 -- .../sweep/DTSweepPointComparator.java | 35 - .../delaunay/sweep/PointOnEdgeException.java | 15 - .../triangulation/point/FloatBufferPoint.java | 94 -- .../poly2tri/triangulation/point/TPoint.java | 69 - .../sets/ConstrainedPointSet.java | 121 -- .../poly2tri/triangulation/sets/PointSet.java | 95 -- .../triangulation/util/PointGenerator.java | 38 - .../triangulation/util/PolygonGenerator.java | 94 -- .../util/QuadTreeRefinement.java | 17 - .../poly2tri/triangulation/util/Tuple2.java | 43 - .../poly2tri/triangulation/util/Tuple3.java | 45 - 42 files changed, 5245 deletions(-) delete mode 100644 src/main/java/org/poly2tri/Poly2Tri.java delete mode 100644 src/main/java/org/poly2tri/geometry/polygon/Polygon.java delete mode 100644 src/main/java/org/poly2tri/geometry/polygon/PolygonPoint.java delete mode 100644 src/main/java/org/poly2tri/geometry/polygon/PolygonSet.java delete mode 100644 src/main/java/org/poly2tri/geometry/polygon/PolygonUtil.java delete mode 100644 src/main/java/org/poly2tri/geometry/primitives/Edge.java delete mode 100644 src/main/java/org/poly2tri/geometry/primitives/Point.java delete mode 100644 src/main/java/org/poly2tri/transform/coordinate/AnyToXYTransform.java delete mode 100644 src/main/java/org/poly2tri/transform/coordinate/CoordinateTransform.java delete mode 100644 src/main/java/org/poly2tri/transform/coordinate/Matrix3Transform.java delete mode 100644 src/main/java/org/poly2tri/transform/coordinate/NoTransform.java delete mode 100644 src/main/java/org/poly2tri/transform/coordinate/XYToAnyTransform.java delete mode 100644 src/main/java/org/poly2tri/triangulation/Triangulatable.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationAlgorithm.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationConstraint.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationContext.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationDebugContext.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationMode.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationPoint.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationProcess.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationProcessEvent.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationProcessListener.java delete mode 100644 src/main/java/org/poly2tri/triangulation/TriangulationUtil.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/DelaunayTriangle.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFront.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontIndex.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontNode.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweep.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepConstraint.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepContext.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepDebugContext.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepPointComparator.java delete mode 100644 src/main/java/org/poly2tri/triangulation/delaunay/sweep/PointOnEdgeException.java delete mode 100644 src/main/java/org/poly2tri/triangulation/point/FloatBufferPoint.java delete mode 100644 src/main/java/org/poly2tri/triangulation/point/TPoint.java delete mode 100644 src/main/java/org/poly2tri/triangulation/sets/ConstrainedPointSet.java delete mode 100644 src/main/java/org/poly2tri/triangulation/sets/PointSet.java delete mode 100644 src/main/java/org/poly2tri/triangulation/util/PointGenerator.java delete mode 100644 src/main/java/org/poly2tri/triangulation/util/PolygonGenerator.java delete mode 100644 src/main/java/org/poly2tri/triangulation/util/QuadTreeRefinement.java delete mode 100644 src/main/java/org/poly2tri/triangulation/util/Tuple2.java delete mode 100644 src/main/java/org/poly2tri/triangulation/util/Tuple3.java diff --git a/src/main/java/org/poly2tri/Poly2Tri.java b/src/main/java/org/poly2tri/Poly2Tri.java deleted file mode 100644 index ec9f422..0000000 --- a/src/main/java/org/poly2tri/Poly2Tri.java +++ /dev/null @@ -1,124 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri; - -import org.poly2tri.geometry.polygon.Polygon; -import org.poly2tri.geometry.polygon.PolygonSet; -import org.poly2tri.triangulation.Triangulatable; -import org.poly2tri.triangulation.TriangulationAlgorithm; -import org.poly2tri.triangulation.TriangulationContext; -import org.poly2tri.triangulation.TriangulationMode; -import org.poly2tri.triangulation.TriangulationProcess; -import org.poly2tri.triangulation.delaunay.sweep.DTSweep; -import org.poly2tri.triangulation.delaunay.sweep.DTSweepContext; -import org.poly2tri.triangulation.sets.ConstrainedPointSet; -import org.poly2tri.triangulation.sets.PointSet; -import org.poly2tri.triangulation.util.PolygonGenerator; - -public class Poly2Tri -{ - - private static final TriangulationAlgorithm _defaultAlgorithm = TriangulationAlgorithm.DTSweep; - - public static void triangulate( PolygonSet ps ) - { - TriangulationContext tcx = createContext( _defaultAlgorithm ); - for( Polygon p : ps.getPolygons() ) - { - tcx.prepareTriangulation( p ); - triangulate( tcx ); - tcx.clear(); - } - } - - public static void triangulate( Polygon p ) - { - triangulate( _defaultAlgorithm, p ); - } - - public static void triangulate( ConstrainedPointSet cps ) - { - triangulate( _defaultAlgorithm, cps ); - } - - public static void triangulate( PointSet ps ) - { - triangulate( _defaultAlgorithm, ps ); - } - - public static TriangulationContext createContext( TriangulationAlgorithm algorithm ) - { - switch( algorithm ) - { - case DTSweep: - default: - return new DTSweepContext(); - } - } - - public static void triangulate( TriangulationAlgorithm algorithm, - Triangulatable t ) - { - TriangulationContext tcx; - -// long time = System.nanoTime(); - tcx = createContext( algorithm ); - tcx.prepareTriangulation( t ); - triangulate( tcx ); -// logger.info( "Triangulation of {} points [{}ms]", tcx.getPoints().size(), ( System.nanoTime() - time ) / 1e6 ); - } - - public static void triangulate( TriangulationContext tcx ) - { - switch( tcx.algorithm() ) - { - case DTSweep: - default: - DTSweep.triangulate( (DTSweepContext)tcx ); - } - } - - /** - * Will do a warmup run to let the JVM optimize the triangulation code - */ - public static void warmup() - { - /* - * After a method is run 10000 times, the Hotspot compiler will compile - * it into native code. Periodically, the Hotspot compiler may recompile - * the method. After an unspecified amount of time, then the compilation - * system should become quiet. - */ - Polygon poly = PolygonGenerator.RandomCircleSweep2( 50, 50000 ); - TriangulationProcess process = new TriangulationProcess(); - process.triangulate( poly ); - } -} diff --git a/src/main/java/org/poly2tri/geometry/polygon/Polygon.java b/src/main/java/org/poly2tri/geometry/polygon/Polygon.java deleted file mode 100644 index e972033..0000000 --- a/src/main/java/org/poly2tri/geometry/polygon/Polygon.java +++ /dev/null @@ -1,269 +0,0 @@ -package org.poly2tri.geometry.polygon; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.poly2tri.triangulation.Triangulatable; -import org.poly2tri.triangulation.TriangulationContext; -import org.poly2tri.triangulation.TriangulationMode; -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - -public class Polygon implements Triangulatable -{ - - protected ArrayList _points = new ArrayList(); - protected ArrayList _steinerPoints; - protected ArrayList _holes; - - protected List m_triangles; - - protected PolygonPoint _last; - - /** - * To create a polygon we need atleast 3 separate points - * - * @param p1 - * @param p2 - * @param p3 - */ - public Polygon( PolygonPoint p1, PolygonPoint p2, PolygonPoint p3 ) - { - p1._next = p2; - p2._next = p3; - p3._next = p1; - p1._previous = p3; - p2._previous = p1; - p3._previous = p2; - _points.add( p1 ); - _points.add( p2 ); - _points.add( p3 ); - } - - /** - * Requires atleast 3 points - * @param points - ordered list of points forming the polygon. - * No duplicates are allowed - */ - public Polygon( List points ) - { - // Lets do one sanity check that first and last point hasn't got same position - // Its something that often happen when importing polygon data from other formats - if( points.get(0).equals( points.get(points.size()-1) ) ) - { - points.remove( points.size()-1 ); - } - _points.addAll( points ); - } - - /** - * Requires atleast 3 points - * - * @param points - */ - public Polygon( PolygonPoint[] points ) - { - this( Arrays.asList( points ) ); - } - - public TriangulationMode getTriangulationMode() - { - return TriangulationMode.POLYGON; - } - - public int pointCount() - { - int count = _points.size(); - if( _steinerPoints != null ) - { - count += _steinerPoints.size(); - } - return count; - } - - public void addSteinerPoint( TriangulationPoint point ) - { - if( _steinerPoints == null ) - { - _steinerPoints = new ArrayList(); - } - _steinerPoints.add( point ); - } - - public void addSteinerPoints( List points ) - { - if( _steinerPoints == null ) - { - _steinerPoints = new ArrayList(); - } - _steinerPoints.addAll( points ); - } - - public void clearSteinerPoints() - { - if( _steinerPoints != null ) - { - _steinerPoints.clear(); - } - } - - /** - * Assumes: that given polygon is fully inside the current polygon - * @param poly - a subtraction polygon - */ - public void addHole( Polygon poly ) - { - if( _holes == null ) - { - _holes = new ArrayList(); - } - _holes.add( poly ); - // XXX: tests could be made here to be sure it is fully inside -// addSubtraction( poly.getPoints() ); - } - - /** - * Will insert a point in the polygon after given point - * - * @param a - * @param b - * @param p - */ - public void insertPointAfter( PolygonPoint a, PolygonPoint newPoint ) - { - // Validate that - int index = _points.indexOf( a ); - if( index != -1 ) - { - newPoint.setNext( a.getNext() ); - newPoint.setPrevious( a ); - a.getNext().setPrevious( newPoint ); - a.setNext( newPoint ); - _points.add( index+1, newPoint ); - } - else - { - throw new RuntimeException( "Tried to insert a point into a Polygon after a point not belonging to the Polygon" ); - } - } - - public void addPoints( List list ) - { - PolygonPoint first; - for( PolygonPoint p : list ) - { - p.setPrevious( _last ); - if( _last != null ) - { - p.setNext( _last.getNext() ); - _last.setNext( p ); - } - _last = p; - _points.add( p ); - } - first = (PolygonPoint)_points.get(0); - _last.setNext( first ); - first.setPrevious( _last ); - } - - /** - * Will add a point after the last point added - * - * @param p - */ - public void addPoint(PolygonPoint p ) - { - p.setPrevious( _last ); - p.setNext( _last.getNext() ); - _last.setNext( p ); - _points.add( p ); - } - - public void removePoint( PolygonPoint p ) - { - PolygonPoint next, prev; - - next = p.getNext(); - prev = p.getPrevious(); - prev.setNext( next ); - next.setPrevious( prev ); - _points.remove( p ); - } - - public PolygonPoint getPoint() - { - return _last; - } - - public List getPoints() - { - return _points; - } - - public List getTriangles() - { - return m_triangles; - } - - public void addTriangle( DelaunayTriangle t ) - { - m_triangles.add( t ); - } - - public void addTriangles( List list ) - { - m_triangles.addAll( list ); - } - - public void clearTriangulation() - { - if( m_triangles != null ) - { - m_triangles.clear(); - } - } - - /** - * Creates constraints and populates the context with points - */ - public void prepareTriangulation( TriangulationContext tcx ) - { - if( m_triangles == null ) - { - m_triangles = new ArrayList( _points.size() ); - } - else - { - m_triangles.clear(); - } - - // Outer constraints - for( int i = 0; i < _points.size()-1 ; i++ ) - { - tcx.newConstraint( _points.get( i ), _points.get( i+1 ) ); - } - tcx.newConstraint( _points.get( 0 ), _points.get( _points.size()-1 ) ); - tcx.addPoints( _points ); - - // Hole constraints - if( _holes != null ) - { - for( Polygon p : _holes ) - { - for( int i = 0; i < p._points.size()-1 ; i++ ) - { - tcx.newConstraint( p._points.get( i ), p._points.get( i+1 ) ); - } - tcx.newConstraint( p._points.get( 0 ), p._points.get( p._points.size()-1 ) ); - tcx.addPoints( p._points ); - } - } - - if( _steinerPoints != null ) - { - tcx.addPoints( _steinerPoints ); - } - } - -} diff --git a/src/main/java/org/poly2tri/geometry/polygon/PolygonPoint.java b/src/main/java/org/poly2tri/geometry/polygon/PolygonPoint.java deleted file mode 100644 index a0e3cf1..0000000 --- a/src/main/java/org/poly2tri/geometry/polygon/PolygonPoint.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.poly2tri.geometry.polygon; - -import org.poly2tri.triangulation.point.TPoint; - -public class PolygonPoint extends TPoint -{ - protected PolygonPoint _next; - protected PolygonPoint _previous; - - public PolygonPoint( double x, double y ) - { - super( x, y ); - } - - public PolygonPoint( double x, double y, double z ) - { - super( x, y, z ); - } - - public void setPrevious( PolygonPoint p ) - { - _previous = p; - } - - public void setNext( PolygonPoint p ) - { - _next = p; - } - - public PolygonPoint getNext() - { - return _next; - } - - public PolygonPoint getPrevious() - { - return _previous; - } -} diff --git a/src/main/java/org/poly2tri/geometry/polygon/PolygonSet.java b/src/main/java/org/poly2tri/geometry/polygon/PolygonSet.java deleted file mode 100644 index d7e33bb..0000000 --- a/src/main/java/org/poly2tri/geometry/polygon/PolygonSet.java +++ /dev/null @@ -1,58 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.geometry.polygon; - -import java.util.ArrayList; -import java.util.List; - -public class PolygonSet -{ - protected ArrayList _polygons = new ArrayList(); - - public PolygonSet() - { - } - - public PolygonSet( Polygon poly ) - { - _polygons.add( poly ); - } - - public void add( Polygon p ) - { - _polygons.add( p ); - } - - public List getPolygons() - { - return _polygons; - } -} diff --git a/src/main/java/org/poly2tri/geometry/polygon/PolygonUtil.java b/src/main/java/org/poly2tri/geometry/polygon/PolygonUtil.java deleted file mode 100644 index 3ca71de..0000000 --- a/src/main/java/org/poly2tri/geometry/polygon/PolygonUtil.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.poly2tri.geometry.polygon; - -public class PolygonUtil -{ - /** - * TODO - * @param polygon - */ - public static void validate( Polygon polygon ) - { - // TODO: implement - // 1. Check for duplicate points - // 2. Check for intersecting sides - } -} diff --git a/src/main/java/org/poly2tri/geometry/primitives/Edge.java b/src/main/java/org/poly2tri/geometry/primitives/Edge.java deleted file mode 100644 index 49b00b6..0000000 --- a/src/main/java/org/poly2tri/geometry/primitives/Edge.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.poly2tri.geometry.primitives; - -public abstract class Edge -{ - protected A p; - protected A q; - - public A getP() - { - return p; - } - - public A getQ() - { - return q; - } -} diff --git a/src/main/java/org/poly2tri/geometry/primitives/Point.java b/src/main/java/org/poly2tri/geometry/primitives/Point.java deleted file mode 100644 index 680c141..0000000 --- a/src/main/java/org/poly2tri/geometry/primitives/Point.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.poly2tri.geometry.primitives; - -public abstract class Point -{ - public abstract double getX(); - public abstract double getY(); - public abstract double getZ(); - - public abstract float getXf(); - public abstract float getYf(); - public abstract float getZf(); - - public abstract void set( double x, double y, double z ); - - protected static int calculateHashCode( double x, double y, double z) - { - int result = 17; - - final long a = Double.doubleToLongBits(x); - result += 31 * result + (int) (a ^ (a >>> 32)); - - final long b = Double.doubleToLongBits(y); - result += 31 * result + (int) (b ^ (b >>> 32)); - - final long c = Double.doubleToLongBits(z); - result += 31 * result + (int) (c ^ (c >>> 32)); - - return result; - - } -} diff --git a/src/main/java/org/poly2tri/transform/coordinate/AnyToXYTransform.java b/src/main/java/org/poly2tri/transform/coordinate/AnyToXYTransform.java deleted file mode 100644 index 97026a5..0000000 --- a/src/main/java/org/poly2tri/transform/coordinate/AnyToXYTransform.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.poly2tri.transform.coordinate; - -/** - * A transform that aligns given source normal with the XY plane normal [0,0,1] - * - * @author thahlen@gmail.com - */ - -public class AnyToXYTransform extends Matrix3Transform -{ - /** - * Assumes source normal is normalized - */ - public AnyToXYTransform( double nx, double ny, double nz ) - { - setSourceNormal( nx, ny, nz ); - } - - /** - * Assumes source normal is normalized - * - * @param nx - * @param ny - * @param nz - */ - public void setSourceNormal( double nx, double ny, double nz ) - { - double h,f,c,vx,vy,hvx; - - vx = -ny; - vy = nx; - c = nz; - - h = (1-c)/(1-c*c); - hvx = h*vx; - f = (c < 0) ? -c : c; - - if( f < 1.0 - 1.0E-4 ) - { - m00=c + hvx*vx; - m01=hvx*vy; - m02=-vy; - m10=hvx*vy; - m11=c + h*vy*vy; - m12=vx; - m20=vy; - m21=-vx; - m22=c; - } - else - { - // if "from" and "to" vectors are nearly parallel - m00=1; - m01=0; - m02=0; - m10=0; - m11=1; - m12=0; - m20=0; - m21=0; - if( c > 0 ) - { - m22=1; - } - else - { - m22=-1; - } - } - } -} diff --git a/src/main/java/org/poly2tri/transform/coordinate/CoordinateTransform.java b/src/main/java/org/poly2tri/transform/coordinate/CoordinateTransform.java deleted file mode 100644 index f00cb1c..0000000 --- a/src/main/java/org/poly2tri/transform/coordinate/CoordinateTransform.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.poly2tri.transform.coordinate; - -import java.util.List; - -import org.poly2tri.geometry.primitives.Point; - -public abstract interface CoordinateTransform -{ - public abstract void transform( Point p, Point store ); - public abstract void transform( Point p ); - public abstract void transform( List list ); -} diff --git a/src/main/java/org/poly2tri/transform/coordinate/Matrix3Transform.java b/src/main/java/org/poly2tri/transform/coordinate/Matrix3Transform.java deleted file mode 100644 index f8422bc..0000000 --- a/src/main/java/org/poly2tri/transform/coordinate/Matrix3Transform.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.poly2tri.transform.coordinate; - -import java.util.List; - -import org.poly2tri.geometry.primitives.Point; - -public abstract class Matrix3Transform implements CoordinateTransform -{ - protected double m00,m01,m02,m10,m11,m12,m20,m21,m22; - - public void transform( Point p, Point store ) - { - final double px = p.getX(); - final double py = p.getY(); - final double pz = p.getZ(); - store.set(m00 * px + m01 * py + m02 * pz, - m10 * px + m11 * py + m12 * pz, - m20 * px + m21 * py + m22 * pz ); - } - - public void transform( Point p ) - { - final double px = p.getX(); - final double py = p.getY(); - final double pz = p.getZ(); - p.set(m00 * px + m01 * py + m02 * pz, - m10 * px + m11 * py + m12 * pz, - m20 * px + m21 * py + m22 * pz ); - } - - public void transform( List list ) - { - for( Point p : list ) - { - transform( p ); - } - } -} diff --git a/src/main/java/org/poly2tri/transform/coordinate/NoTransform.java b/src/main/java/org/poly2tri/transform/coordinate/NoTransform.java deleted file mode 100644 index 2f43cbc..0000000 --- a/src/main/java/org/poly2tri/transform/coordinate/NoTransform.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.poly2tri.transform.coordinate; - -import java.util.List; - -import org.poly2tri.geometry.primitives.Point; - -public class NoTransform implements CoordinateTransform -{ - public void transform( Point p, Point store ) - { - store.set( p.getX(), p.getY(), p.getZ() ); - } - - public void transform( Point p ) - { - } - - public void transform( List list ) - { - } -} diff --git a/src/main/java/org/poly2tri/transform/coordinate/XYToAnyTransform.java b/src/main/java/org/poly2tri/transform/coordinate/XYToAnyTransform.java deleted file mode 100644 index 6c0a30f..0000000 --- a/src/main/java/org/poly2tri/transform/coordinate/XYToAnyTransform.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.poly2tri.transform.coordinate; - -/** - * A transform that aligns the XY plane normal [0,0,1] with any given target normal - * - * http://www.cs.brown.edu/~jfh/papers/Moller-EBA-1999/paper.pdf - * - * @author thahlen@gmail.com - * - */ -public class XYToAnyTransform extends Matrix3Transform -{ - /** - * Assumes target normal is normalized - */ - public XYToAnyTransform( double nx, double ny, double nz ) - { - setTargetNormal( nx, ny, nz ); - } - - /** - * Assumes target normal is normalized - * - * @param nx - * @param ny - * @param nz - */ - public void setTargetNormal( double nx, double ny, double nz ) - { - double h,f,c,vx,vy,hvx; - - vx = ny; - vy = -nx; - c = nz; - - h = (1-c)/(1-c*c); - hvx = h*vx; - f = (c < 0) ? -c : c; - - if( f < 1.0 - 1.0E-4 ) - { - m00=c + hvx*vx; - m01=hvx*vy; - m02=-vy; - m10=hvx*vy; - m11=c + h*vy*vy; - m12=vx; - m20=vy; - m21=-vx; - m22=c; - } - else - { - // if "from" and "to" vectors are nearly parallel - m00=1; - m01=0; - m02=0; - m10=0; - m11=1; - m12=0; - m20=0; - m21=0; - if( c > 0 ) - { - m22=1; - } - else - { - m22=-1; - } - } - - } -} diff --git a/src/main/java/org/poly2tri/triangulation/Triangulatable.java b/src/main/java/org/poly2tri/triangulation/Triangulatable.java deleted file mode 100644 index dddc620..0000000 --- a/src/main/java/org/poly2tri/triangulation/Triangulatable.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.poly2tri.triangulation; - -import java.util.List; - -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - -public interface Triangulatable -{ - /** - * Preparations needed before triangulation start should be handled here - * @param tcx - */ - public void prepareTriangulation( TriangulationContext tcx ); - - public List getTriangles(); - public List getPoints(); - public void addTriangle( DelaunayTriangle t ); - public void addTriangles( List list ); - public void clearTriangulation(); - - public TriangulationMode getTriangulationMode(); -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationAlgorithm.java b/src/main/java/org/poly2tri/triangulation/TriangulationAlgorithm.java deleted file mode 100644 index 497aada..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationAlgorithm.java +++ /dev/null @@ -1,36 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation; - -public enum TriangulationAlgorithm -{ - DTSweep -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationConstraint.java b/src/main/java/org/poly2tri/triangulation/TriangulationConstraint.java deleted file mode 100644 index 0e3f0d2..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationConstraint.java +++ /dev/null @@ -1,55 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation; - -/** - * Forces a triangle edge between two points p and q - * when triangulating. For example used to enforce - * Polygon Edges during a polygon triangulation. - * - * @author Thomas Åhlén, thahlen@gmail.com - */ -public class TriangulationConstraint -{ - protected TriangulationPoint p; - protected TriangulationPoint q; - - public TriangulationPoint getP() - { - return p; - } - - public TriangulationPoint getQ() - { - return q; - } - -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationContext.java b/src/main/java/org/poly2tri/triangulation/TriangulationContext.java deleted file mode 100644 index 71b26bc..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationContext.java +++ /dev/null @@ -1,171 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation; - -import java.util.ArrayList; -import java.util.List; - -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - -public abstract class TriangulationContext -{ - protected A _debug; - protected boolean _debugEnabled = false; - - protected ArrayList _triList = new ArrayList(); - - protected ArrayList _points = new ArrayList(200); - protected TriangulationMode _triangulationMode; - protected Triangulatable _triUnit; - - private boolean _terminated = false; - private boolean _waitUntilNotified; - - private int _stepTime = -1; - private int _stepCount = 0; - public int getStepCount() { return _stepCount; } - - public void done() - { - _stepCount++; - } - - public abstract TriangulationAlgorithm algorithm(); - - public void prepareTriangulation( Triangulatable t ) - { - _triUnit = t; - _triangulationMode = t.getTriangulationMode(); - t.prepareTriangulation( this ); - } - - public abstract TriangulationConstraint newConstraint( TriangulationPoint a, TriangulationPoint b ); - - public void addToList( DelaunayTriangle triangle ) - { - _triList.add( triangle ); - } - - public List getTriangles() - { - return _triList; - } - - public Triangulatable getTriangulatable() - { - return _triUnit; - } - - public List getPoints() - { - return _points; - } - - public synchronized void update(String message) - { - if( _debugEnabled ) - { - try - { - synchronized( this ) - { - _stepCount++; - if( _stepTime > 0 ) - { - wait( (int)_stepTime ); - /** Can we resume execution or are we expected to wait? */ - if( _waitUntilNotified ) - { - wait(); - } - } - else - { - wait(); - } - // We have been notified - _waitUntilNotified = false; - } - } - catch( InterruptedException e ) - { - update("Triangulation was interrupted"); - } - } - if( _terminated ) - { - throw new RuntimeException( "Triangulation process terminated before completion"); - } - } - - public void clear() - { - _points.clear(); - _terminated = false; - if( _debug != null ) - { - _debug.clear(); - } - _stepCount=0; - } - - public TriangulationMode getTriangulationMode() - { - return _triangulationMode; - } - - public synchronized void waitUntilNotified(boolean b) - { - _waitUntilNotified = b; - } - - public void terminateTriangulation() - { - _terminated=true; - } - - public boolean isDebugEnabled() - { - return _debugEnabled; - } - - public abstract void isDebugEnabled( boolean b ); - - public A getDebugContext() - { - return _debug; - } - - public void addPoints( List points ) - { - _points.addAll( points ); - } -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationDebugContext.java b/src/main/java/org/poly2tri/triangulation/TriangulationDebugContext.java deleted file mode 100644 index a6eca87..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationDebugContext.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.poly2tri.triangulation; - -public abstract class TriangulationDebugContext -{ - protected TriangulationContext _tcx; - - public TriangulationDebugContext( TriangulationContext tcx ) - { - _tcx = tcx; - } - - public abstract void clear(); -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationMode.java b/src/main/java/org/poly2tri/triangulation/TriangulationMode.java deleted file mode 100644 index 946862d..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationMode.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.poly2tri.triangulation; - -public enum TriangulationMode -{ - UNCONSTRAINED,CONSTRAINED,POLYGON; -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationPoint.java b/src/main/java/org/poly2tri/triangulation/TriangulationPoint.java deleted file mode 100644 index 37686a5..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationPoint.java +++ /dev/null @@ -1,112 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation; - -import java.util.ArrayList; - -import org.poly2tri.geometry.primitives.Point; -import org.poly2tri.triangulation.delaunay.sweep.DTSweepConstraint; - - -public abstract class TriangulationPoint extends Point -{ - // List of edges this point constitutes an upper ending point (CDT) - private ArrayList edges; - - @Override - public String toString() - { - return "[" + getX() + "," + getY() + "]"; - } - - public abstract double getX(); - public abstract double getY(); - public abstract double getZ(); - - public abstract float getXf(); - public abstract float getYf(); - public abstract float getZf(); - - public abstract void set( double x, double y, double z ); - - public ArrayList getEdges() - { - return edges; - } - - public void addEdge( DTSweepConstraint e ) - { - if( edges == null ) - { - edges = new ArrayList(); - } - edges.add( e ); - } - - public boolean hasEdges() - { - return edges != null; - } - - /** - * @param p - edge destination point - * @return the edge from this point to given point - */ - public DTSweepConstraint getEdge( TriangulationPoint p ) - { - for( DTSweepConstraint c : edges ) - { - if( c.p == p ) - { - return c; - } - } - return null; - } - - public boolean equals(Object obj) - { - if( obj instanceof TriangulationPoint ) - { - TriangulationPoint p = (TriangulationPoint)obj; - return getX() == p.getX() && getY() == p.getY(); - } - return super.equals( obj ); - } - - public int hashCode() - { - long bits = java.lang.Double.doubleToLongBits(getX()); - bits ^= java.lang.Double.doubleToLongBits(getY()) * 31; - return (((int) bits) ^ ((int) (bits >> 32))); - } - -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationProcess.java b/src/main/java/org/poly2tri/triangulation/TriangulationProcess.java deleted file mode 100644 index 35baf1f..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationProcess.java +++ /dev/null @@ -1,341 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation; - -import java.lang.Thread.State; -import java.util.ArrayList; -import java.util.List; - -import org.poly2tri.Poly2Tri; -import org.poly2tri.geometry.polygon.Polygon; -import org.poly2tri.geometry.polygon.PolygonSet; -import org.poly2tri.triangulation.sets.ConstrainedPointSet; -import org.poly2tri.triangulation.sets.PointSet; - - -/** - * - * @author Thomas Åhlén, thahlen@gmail.com - * - */ -public class TriangulationProcess implements Runnable -{ - - private final TriangulationAlgorithm _algorithm; - - private TriangulationContext _tcx; - private Thread _thread; - private boolean _isTerminated = false; - private int _pointCount = 0; - private long _timestamp = 0; - private double _triangulationTime = 0; - - private boolean _awaitingTermination; - private boolean _restart = false; - - private ArrayList _triangulations = new ArrayList(); - - private ArrayList _listeners = new ArrayList(); - - public void addListener( TriangulationProcessListener listener ) - { - _listeners.add( listener ); - } - - public void removeListener( TriangulationProcessListener listener ) - { - _listeners.remove( listener ); - } - - public void clearListeners() - { - _listeners.clear(); - } - - /** - * Notify all listeners of this new event - * @param event - */ - private void sendEvent( TriangulationProcessEvent event ) - { - for( TriangulationProcessListener l : _listeners ) - { - l.triangulationEvent( event, _tcx.getTriangulatable() ); - } - } - - public int getStepCount() - { - return _tcx.getStepCount(); - } - - public long getTimestamp() - { - return _timestamp; - } - - public double getTriangulationTime() - { - return _triangulationTime; - } - - /** - * Uses SweepLine algorithm by default - * @param algorithm - */ - public TriangulationProcess() - { - this( TriangulationAlgorithm.DTSweep ); - } - - public TriangulationProcess( TriangulationAlgorithm algorithm ) - { - _algorithm = algorithm; - _tcx = Poly2Tri.createContext( algorithm ); - } - - /** - * This retriangulates same set as previous triangulation - * useful if you want to do consecutive triangulations with - * same data. Like when you when you want to do performance - * tests. - */ -// public void triangulate() -// { -// start(); -// } - - /** - * Triangulate a PointSet with eventual constraints - * - * @param cps - */ - public void triangulate( PointSet ps ) - { - _triangulations.clear(); - _triangulations.add( ps ); - start(); - } - - /** - * Triangulate a PointSet with eventual constraints - * - * @param cps - */ - public void triangulate( ConstrainedPointSet cps ) - { - _triangulations.clear(); - _triangulations.add( cps ); - start(); - } - - /** - * Triangulate a PolygonSet - * - * @param ps - */ - public void triangulate( PolygonSet ps ) - { - _triangulations.clear(); - _triangulations.addAll( ps.getPolygons() ); - start(); - } - - /** - * Triangulate a Polygon - * - * @param ps - */ - public void triangulate( Polygon polygon ) - { - _triangulations.clear(); - _triangulations.add( polygon ); - start(); - } - - /** - * Triangulate a List of Triangulatables - * - * @param ps - */ - public void triangulate( List list ) - { - _triangulations.clear(); - _triangulations.addAll( list ); - start(); - } - - private void start() - { - if( _thread == null || _thread.getState() == State.TERMINATED ) - { - _isTerminated = false; - _thread = new Thread( this, _algorithm.name() + "." + _tcx.getTriangulationMode() ); - _thread.start(); - sendEvent( TriangulationProcessEvent.Started ); - } - else - { - // Triangulation already running. Terminate it so we can start a new - shutdown(); - _restart = true; - } - } - - public boolean isWaiting() - { - if( _thread != null && _thread.getState() == State.WAITING ) - { - return true; - } - return false; - } - - public void run() - { - _pointCount=0; - try - { - long time = System.nanoTime(); - for( Triangulatable t : _triangulations ) - { - _tcx.clear(); - _tcx.prepareTriangulation( t ); - _pointCount += _tcx._points.size(); - Poly2Tri.triangulate( _tcx ); - } - _triangulationTime = ( System.nanoTime() - time ) / 1e6; - sendEvent( TriangulationProcessEvent.Done ); - } - catch( RuntimeException e ) - { - if( _awaitingTermination ) - { - _awaitingTermination = false; - sendEvent( TriangulationProcessEvent.Aborted ); - } - else - { - e.printStackTrace(); - sendEvent( TriangulationProcessEvent.Failed ); - } - } - catch( Exception e ) - { - e.printStackTrace(); - sendEvent( TriangulationProcessEvent.Failed ); - } - finally - { - _timestamp = System.currentTimeMillis(); - _isTerminated = true; - _thread = null; - } - - // Autostart a new triangulation? - if( _restart ) - { - _restart = false; - start(); - } - } - - public void resume() - { - if( _thread != null ) - { - // Only force a resume when process is waiting for a notification - if( _thread.getState() == State.WAITING ) - { - synchronized( _tcx ) - { - _tcx.notify(); - } - } - else if( _thread.getState() == State.TIMED_WAITING ) - { - _tcx.waitUntilNotified( false ); - } - } - } - - public void shutdown() - { - _awaitingTermination = true; - _tcx.terminateTriangulation(); - resume(); - } - - public TriangulationContext getContext() - { - return _tcx; - } - - public boolean isDone() - { - return _isTerminated; - } - - public void requestRead() - { - _tcx.waitUntilNotified( true ); - } - - public boolean isReadable() - { - if( _thread == null ) - { - return true; - } - else - { - synchronized( _thread ) - { - if( _thread.getState() == State.WAITING ) - { - return true; - } - else if( _thread.getState() == State.TIMED_WAITING ) - { - // Make sure that it stays readable - _tcx.waitUntilNotified( true ); - return true; - } - return false; - } - } - } - - public int getPointCount() - { - return _pointCount; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationProcessEvent.java b/src/main/java/org/poly2tri/triangulation/TriangulationProcessEvent.java deleted file mode 100644 index dce9e04..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationProcessEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation; - -public enum TriangulationProcessEvent -{ - Started,Waiting,Failed,Aborted,Done -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationProcessListener.java b/src/main/java/org/poly2tri/triangulation/TriangulationProcessListener.java deleted file mode 100644 index 922e3c9..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationProcessListener.java +++ /dev/null @@ -1,36 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation; - -public interface TriangulationProcessListener -{ - public void triangulationEvent( TriangulationProcessEvent e, Triangulatable unit ); -} diff --git a/src/main/java/org/poly2tri/triangulation/TriangulationUtil.java b/src/main/java/org/poly2tri/triangulation/TriangulationUtil.java deleted file mode 100644 index 9da0328..0000000 --- a/src/main/java/org/poly2tri/triangulation/TriangulationUtil.java +++ /dev/null @@ -1,213 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */package org.poly2tri.triangulation; - - -/** - * @author Thomas Åhlén, thahlen@gmail.com - */ -public class TriangulationUtil -{ - public final static double EPSILON = 1e-12; - - // Returns triangle circumcircle point and radius -// public static Tuple2 circumCircle( TPoint a, TPoint b, TPoint c ) -// { -// double A = det( a, b, c ); -// double C = detC( a, b, c ); -// -// double sa = a.getX() * a.getX() + a.getY() * a.getY(); -// double sb = b.getX() * b.getX() + b.getY() * b.getY(); -// double sc = c.getX() * c.getX() + c.getY() * c.getY(); -// -// TPoint bx1 = new TPoint( sa, a.getY() ); -// TPoint bx2 = new TPoint( sb, b.getY() ); -// TPoint bx3 = new TPoint( sc, c.getY() ); -// double bx = det( bx1, bx2, bx3 ); -// -// TPoint by1 = new TPoint( sa, a.getX() ); -// TPoint by2 = new TPoint( sb, b.getX() ); -// TPoint by3 = new TPoint( sc, c.getX() ); -// double by = det( by1, by2, by3 ); -// -// double x = bx / ( 2 * A ); -// double y = by / ( 2 * A ); -// -// TPoint center = new TPoint( x, y ); -// double radius = Math.sqrt( bx * bx + by * by - 4 * A * C ) / ( 2 * Math.abs( A ) ); -// -// return new Tuple2( center, radius ); -// } - - /** - * Requirement:
- * 1. a,b and c form a triangle.
- * 2. a and d is know to be on opposite side of bc
- *

-     *                a
-     *                +
-     *               / \
-     *              /   \
-     *            b/     \c
-     *            +-------+ 
-     *           /    B    \  
-     *          /           \ 
-     * 
- * Fact: d has to be in area B to have a chance to be inside the circle formed by - * a,b and c
- * d is outside B if orient2d(a,b,d) or orient2d(c,a,d) is CW
- * This preknowledge gives us a way to optimize the incircle test - * @param a - triangle point, opposite d - * @param b - triangle point - * @param c - triangle point - * @param d - point opposite a - * @return true if d is inside circle, false if on circle edge - */ - public static boolean smartIncircle( final TriangulationPoint pa, - final TriangulationPoint pb, - final TriangulationPoint pc, - final TriangulationPoint pd ) - { - final double pdx = pd.getX(); - final double pdy = pd.getY(); - final double adx = pa.getX() - pdx; - final double ady = pa.getY() - pdy; - final double bdx = pb.getX() - pdx; - final double bdy = pb.getY() - pdy; - - final double adxbdy = adx * bdy; - final double bdxady = bdx * ady; - final double oabd = adxbdy - bdxady; -// oabd = orient2d(pa,pb,pd); - if( oabd <= 0 ) - { - return false; - } - - final double cdx = pc.getX() - pdx; - final double cdy = pc.getY() - pdy; - - final double cdxady = cdx * ady; - final double adxcdy = adx * cdy; - final double ocad = cdxady - adxcdy; -// ocad = orient2d(pc,pa,pd); - if( ocad <= 0 ) - { - return false; - } - - final double bdxcdy = bdx * cdy; - final double cdxbdy = cdx * bdy; - - final double alift = adx * adx + ady * ady; - final double blift = bdx * bdx + bdy * bdy; - final double clift = cdx * cdx + cdy * cdy; - - final double det = alift * ( bdxcdy - cdxbdy ) + blift * ocad + clift * oabd; - - return det > 0; - } - - /** - * @see smartIncircle - * @param pa - * @param pb - * @param pc - * @param pd - * @return - */ - public static boolean inScanArea( final TriangulationPoint pa, - final TriangulationPoint pb, - final TriangulationPoint pc, - final TriangulationPoint pd ) - { - final double pdx = pd.getX(); - final double pdy = pd.getY(); - final double adx = pa.getX() - pdx; - final double ady = pa.getY() - pdy; - final double bdx = pb.getX() - pdx; - final double bdy = pb.getY() - pdy; - - final double adxbdy = adx * bdy; - final double bdxady = bdx * ady; - final double oabd = adxbdy - bdxady; -// oabd = orient2d(pa,pb,pd); - if( oabd <= 0 ) - { - return false; - } - - final double cdx = pc.getX() - pdx; - final double cdy = pc.getY() - pdy; - - final double cdxady = cdx * ady; - final double adxcdy = adx * cdy; - final double ocad = cdxady - adxcdy; -// ocad = orient2d(pc,pa,pd); - if( ocad <= 0 ) - { - return false; - } - return true; - } - - /** - * Forumla to calculate signed area
- * Positive if CCW
- * Negative if CW
- * 0 if collinear
- *
-     * A[P1,P2,P3]  =  (x1*y2 - y1*x2) + (x2*y3 - y2*x3) + (x3*y1 - y3*x1)
-     *              =  (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)
-     * 
- */ - public static Orientation orient2d( TriangulationPoint pa, - TriangulationPoint pb, - TriangulationPoint pc ) - { - double detleft = ( pa.getX() - pc.getX() ) * ( pb.getY() - pc.getY() ); - double detright = ( pa.getY() - pc.getY() ) * ( pb.getX() - pc.getX() ); - double val = detleft - detright; - if( val > -EPSILON && val < EPSILON ) - { - return Orientation.Collinear; - } - else if( val > 0 ) - { - return Orientation.CCW; - } - return Orientation.CW; - } - - public enum Orientation - { - CW,CCW,Collinear; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/DelaunayTriangle.java b/src/main/java/org/poly2tri/triangulation/delaunay/DelaunayTriangle.java deleted file mode 100644 index c93fcb0..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/DelaunayTriangle.java +++ /dev/null @@ -1,685 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.delaunay; - -import java.util.ArrayList; - -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.delaunay.sweep.DTSweepConstraint; -import org.poly2tri.triangulation.point.TPoint; - - -public class DelaunayTriangle -{ - - /** Neighbor pointers */ - public final DelaunayTriangle[] neighbors = new DelaunayTriangle[3]; - /** Flags to determine if an edge is a Constrained edge */ - public final boolean[] cEdge = new boolean[] { false, false, false }; - /** Flags to determine if an edge is a Delauney edge */ - public final boolean[] dEdge = new boolean[] { false, false, false }; - /** Has this triangle been marked as an interior triangle? */ - protected boolean interior = false; - - public final TriangulationPoint[] points = new TriangulationPoint[3]; - - public DelaunayTriangle( TriangulationPoint p1, TriangulationPoint p2, TriangulationPoint p3 ) - { - points[0] = p1; - points[1] = p2; - points[2] = p3; - } - - public int index( TriangulationPoint p ) - { - if( p == points[0] ) - { - return 0; - } - else if( p == points[1] ) - { - return 1; - } - else if( p == points[2] ) - { - return 2; - } - throw new RuntimeException("Calling index with a point that doesn't exist in triangle"); - } - - public int indexCW( TriangulationPoint p ) - { - int index = index(p); - switch( index ) - { - case 0: return 2; - case 1: return 0; - default: return 1; - } - } - - public int indexCCW( TriangulationPoint p ) - { - int index = index(p); - switch( index ) - { - case 0: return 1; - case 1: return 2; - default: return 0; - } - } - - public boolean contains( TriangulationPoint p ) - { - return ( p == points[0] || p == points[1] || p == points[2] ); - } - - public boolean contains( DTSweepConstraint e ) - { - return ( contains( e.p ) && contains( e.q ) ); - } - - public boolean contains( TriangulationPoint p, TriangulationPoint q ) - { - return ( contains( p ) && contains( q ) ); - } - - // Update neighbor pointers - private void markNeighbor( TriangulationPoint p1, - TriangulationPoint p2, - DelaunayTriangle t ) - { - if( ( p1 == points[2] && p2 == points[1] ) || ( p1 == points[1] && p2 == points[2] ) ) - { - neighbors[0] = t; - } - else if( ( p1 == points[0] && p2 == points[2] ) || ( p1 == points[2] && p2 == points[0] ) ) - { - neighbors[1] = t; - } - else if( ( p1 == points[0] && p2 == points[1] ) || ( p1 == points[1] && p2 == points[0] ) ) - { - neighbors[2] = t; - } - else - { - // throw new Exception("Neighbor error, please report!"); - } - } - - /* Exhaustive search to update neighbor pointers */ - public void markNeighbor( DelaunayTriangle t ) - { - if( t.contains( points[1], points[2] ) ) - { - neighbors[0] = t; - t.markNeighbor( points[1], points[2], this ); - } - else if( t.contains( points[0], points[2] ) ) - { - neighbors[1] = t; - t.markNeighbor( points[0], points[2], this ); - } - else if( t.contains( points[0], points[1] ) ) - { - neighbors[2] = t; - t.markNeighbor( points[0], points[1], this ); - } - else - { - } - } - - public void clearNeighbors() - { - neighbors[0] = neighbors[1] = neighbors[2] = null; - } - - public void clearNeighbor( DelaunayTriangle triangle ) - { - if( neighbors[0] == triangle ) - { - neighbors[0] = null; - } - else if( neighbors[1] == triangle ) - { - neighbors[1] = null; - } - else - { - neighbors[2] = null; - } - } - - /** - * Clears all references to all other triangles and points - */ - public void clear() - { - DelaunayTriangle t; - for( int i=0; i<3; i++ ) - { - t = neighbors[i]; - if( t != null ) - { - t.clearNeighbor( this ); - } - } - clearNeighbors(); - points[0]=points[1]=points[2]=null; - } - /** - * @param t - opposite triangle - * @param p - the point in t that isn't shared between the triangles - * @return - */ - public TriangulationPoint oppositePoint( DelaunayTriangle t, TriangulationPoint p ) - { - assert t != this : "self-pointer error"; - return pointCW( t.pointCW(p) ); - } - - // The neighbor clockwise to given point - public DelaunayTriangle neighborCW( TriangulationPoint point ) - { - if( point == points[0] ) - { - return neighbors[1]; - } - else if( point == points[1] ) - { - return neighbors[2]; - } - return neighbors[0]; - } - - // The neighbor counter-clockwise to given point - public DelaunayTriangle neighborCCW( TriangulationPoint point ) - { - if( point == points[0] ) - { - return neighbors[2]; - } - else if( point == points[1] ) - { - return neighbors[0]; - } - return neighbors[1]; - } - - // The neighbor across to given point - public DelaunayTriangle neighborAcross( TriangulationPoint opoint ) - { - if( opoint == points[0] ) - { - return neighbors[0]; - } - else if( opoint == points[1] ) - { - return neighbors[1]; - } - return neighbors[2]; - } - - // The point counter-clockwise to given point - public TriangulationPoint pointCCW( TriangulationPoint point ) - { - if( point == points[0] ) - { - return points[1]; - } - else if( point == points[1] ) - { - return points[2]; - } - else if( point == points[2] ) - { - return points[0]; - } - throw new RuntimeException("[FIXME] point location error"); - } - - // The point counter-clockwise to given point - public TriangulationPoint pointCW( TriangulationPoint point ) - { - if( point == points[0] ) - { - return points[2]; - } - else if( point == points[1] ) - { - return points[0]; - } - else if( point == points[2] ) - { - return points[1]; - } - throw new RuntimeException("[FIXME] point location error"); - } - - // Legalize triangle by rotating clockwise around oPoint - public void legalize( TriangulationPoint oPoint, TriangulationPoint nPoint ) - { - if( oPoint == points[0] ) - { - points[1] = points[0]; - points[0] = points[2]; - points[2] = nPoint; - } - else if( oPoint == points[1] ) - { - points[2] = points[1]; - points[1] = points[0]; - points[0] = nPoint; - } - else if( oPoint == points[2] ) - { - points[0] = points[2]; - points[2] = points[1]; - points[1] = nPoint; - } - else - { - throw new RuntimeException("legalization bug"); - } - } - - public void printDebug() - { - System.out.println( points[0] + "," + points[1] + "," + points[2] ); - } - - // Finalize edge marking - public void markNeighborEdges() - { - for( int i = 0; i < 3; i++ ) - { - if( cEdge[i] ) - { - switch( i ) - { - case 0: - if( neighbors[0] != null ) - neighbors[0].markConstrainedEdge( points[1], points[2] ); - break; - case 1: - if( neighbors[1] != null ) - neighbors[1].markConstrainedEdge( points[0], points[2] ); - break; - case 2: - if( neighbors[2] != null ) - neighbors[2].markConstrainedEdge( points[0], points[1] ); - break; - } - } - } - } - - public void markEdge( DelaunayTriangle triangle ) - { - for( int i = 0; i < 3; i++ ) - { - if( cEdge[i] ) - { - switch( i ) - { - case 0: - triangle.markConstrainedEdge( points[1], points[2] ); - break; - case 1: - triangle.markConstrainedEdge( points[0], points[2] ); - break; - case 2: - triangle.markConstrainedEdge( points[0], points[1] ); - break; - } - } - } - } - - public void markEdge( ArrayList tList ) - { - - for( DelaunayTriangle t : tList ) - { - for( int i = 0; i < 3; i++ ) - { - if( t.cEdge[i] ) - { - switch( i ) - { - case 0: - markConstrainedEdge( t.points[1], t.points[2] ); - break; - case 1: - markConstrainedEdge( t.points[0], t.points[2] ); - break; - case 2: - markConstrainedEdge( t.points[0], t.points[1] ); - break; - } - } - } - } - } - - public void markConstrainedEdge( int index ) - { - cEdge[index] = true; - } - - public void markConstrainedEdge( DTSweepConstraint edge ) - { - markConstrainedEdge( edge.p, edge.q ); - if( ( edge.q == points[0] && edge.p == points[1] ) - || ( edge.q == points[1] && edge.p == points[0] ) ) - { - cEdge[2] = true; - } - else if( ( edge.q == points[0] && edge.p == points[2] ) - || ( edge.q == points[2] && edge.p == points[0] ) ) - { - cEdge[1] = true; - } - else if( ( edge.q == points[1] && edge.p == points[2] ) - || ( edge.q == points[2] && edge.p == points[1] ) ) - { - cEdge[0] = true; - } - } - - // Mark edge as constrained - public void markConstrainedEdge( TriangulationPoint p, TriangulationPoint q ) - { - if( ( q == points[0] && p == points[1] ) || ( q == points[1] && p == points[0] ) ) - { - cEdge[2] = true; - } - else if( ( q == points[0] && p == points[2] ) || ( q == points[2] && p == points[0] ) ) - { - cEdge[1] = true; - } - else if( ( q == points[1] && p == points[2] ) || ( q == points[2] && p == points[1] ) ) - { - cEdge[0] = true; - } - } - - public double area() - { - double a = (points[0].getX() - points[2].getX())*(points[1].getY() - points[0].getY()); - double b = (points[0].getX() - points[1].getX())*(points[2].getY() - points[0].getY()); - - return 0.5*Math.abs( a - b ); - } - - public TPoint centroid() - { - double cx = ( points[0].getX() + points[1].getX() + points[2].getX() ) / 3d; - double cy = ( points[0].getY() + points[1].getY() + points[2].getY() ) / 3d; - return new TPoint( cx, cy ); - } - - /** - * Get the neighbor that share this edge - * - * @param constrainedEdge - * @return index of the shared edge or -1 if edge isn't shared - */ - public int edgeIndex( TriangulationPoint p1, TriangulationPoint p2 ) - { - if( points[0] == p1 ) - { - if( points[1] == p2 ) - { - return 2; - } - else if( points[2] == p2 ) - { - return 1; - } - } - else if( points[1] == p1 ) - { - if( points[2] == p2 ) - { - return 0; - } - else if( points[0] == p2 ) - { - return 2; - } - } - else if( points[2] == p1 ) - { - if( points[0] == p2 ) - { - return 1; - } - else if( points[1] == p2 ) - { - return 0; - } - } - return -1; - } - - public boolean getConstrainedEdgeCCW( TriangulationPoint p ) - { - if( p == points[0] ) - { - return cEdge[2]; - } - else if( p == points[1] ) - { - return cEdge[0]; - } - return cEdge[1]; - } - - public boolean getConstrainedEdgeCW( TriangulationPoint p ) - { - if( p == points[0] ) - { - return cEdge[1]; - } - else if( p == points[1] ) - { - return cEdge[2]; - } - return cEdge[0]; - } - - public boolean getConstrainedEdgeAcross( TriangulationPoint p ) - { - if( p == points[0] ) - { - return cEdge[0]; - } - else if( p == points[1] ) - { - return cEdge[1]; - } - return cEdge[2]; - } - - public void setConstrainedEdgeCCW( TriangulationPoint p, boolean ce ) - { - if( p == points[0] ) - { - cEdge[2] = ce; - } - else if( p == points[1] ) - { - cEdge[0] = ce; - } - else - { - cEdge[1] = ce; - } - } - - public void setConstrainedEdgeCW( TriangulationPoint p, boolean ce ) - { - if( p == points[0] ) - { - cEdge[1] = ce; - } - else if( p == points[1] ) - { - cEdge[2] = ce; - } - else - { - cEdge[0] = ce; - } - } - - public void setConstrainedEdgeAcross( TriangulationPoint p, boolean ce ) - { - if( p == points[0] ) - { - cEdge[0] = ce; - } - else if( p == points[1] ) - { - cEdge[1] = ce; - } - else - { - cEdge[2] = ce; - } - } - - public boolean getDelunayEdgeCCW( TriangulationPoint p ) - { - if( p == points[0] ) - { - return dEdge[2]; - } - else if( p == points[1] ) - { - return dEdge[0]; - } - return dEdge[1]; - } - - public boolean getDelunayEdgeCW( TriangulationPoint p ) - { - if( p == points[0] ) - { - return dEdge[1]; - } - else if( p == points[1] ) - { - return dEdge[2]; - } - return dEdge[0]; - } - - public boolean getDelunayEdgeAcross( TriangulationPoint p ) - { - if( p == points[0] ) - { - return dEdge[0]; - } - else if( p == points[1] ) - { - return dEdge[1]; - } - return dEdge[2]; - } - - public void setDelunayEdgeCCW( TriangulationPoint p, boolean e ) - { - if( p == points[0] ) - { - dEdge[2] = e; - } - else if( p == points[1] ) - { - dEdge[0] = e; - } - else - { - dEdge[1] = e; - } - } - - public void setDelunayEdgeCW( TriangulationPoint p, boolean e ) - { - if( p == points[0] ) - { - dEdge[1] = e; - } - else if( p == points[1] ) - { - dEdge[2] = e; - } - else - { - dEdge[0] = e; - } - } - - public void setDelunayEdgeAcross( TriangulationPoint p, boolean e ) - { - if( p == points[0] ) - { - dEdge[0] = e; - } - else if( p == points[1] ) - { - dEdge[1] = e; - } - else - { - dEdge[2] = e; - } - } - - public void clearDelunayEdges() - { - dEdge[0] = false; - dEdge[1] = false; - dEdge[2] = false; - } - - public boolean isInterior() - { - return interior; - } - - public void isInterior( boolean b ) - { - interior = b; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFront.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFront.java deleted file mode 100644 index e7994f3..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFront.java +++ /dev/null @@ -1,179 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.delaunay.sweep; - -import org.poly2tri.triangulation.TriangulationPoint; - - -/** - * @author Thomas Åhlen (thahlen@gmail.com) - */ -public class AdvancingFront -{ - public AdvancingFrontNode head; - public AdvancingFrontNode tail; - protected AdvancingFrontNode search; - - public AdvancingFront( AdvancingFrontNode head, AdvancingFrontNode tail ) - { - this.head = head; - this.tail = tail; - this.search = head; - addNode( head ); - addNode( tail ); - } - - public void addNode( AdvancingFrontNode node ) - { -// _searchTree.put( node.key, node ); - } - - public void removeNode( AdvancingFrontNode node ) - { -// _searchTree.delete( node.key ); - } - - public String toString() - { - StringBuilder sb = new StringBuilder(); - AdvancingFrontNode node = head; - while( node != tail ) - { - sb.append( node.point.getX() ).append( "->" ); - node = node.next; - } - sb.append( tail.point.getX() ); - return sb.toString(); - } - - private final AdvancingFrontNode findSearchNode( double x ) - { - // TODO: implement BST index - return search; - } - - /** - * We use a balancing tree to locate a node smaller or equal to - * given key value - * - * @param x - * @return - */ - public AdvancingFrontNode locateNode( TriangulationPoint point ) - { - return locateNode( point.getX() ); - } - - private AdvancingFrontNode locateNode( double x ) - { - AdvancingFrontNode node = findSearchNode(x); - if( x < node.value ) - { - while( (node = node.prev) != null ) - { - if( x >= node.value ) - { - search = node; - return node; - } - } - } - else - { - while( (node = node.next) != null ) - { - if( x < node.value ) - { - search = node.prev; - return node.prev; - } - } - } - return null; - } - - /** - * This implementation will use simple node traversal algorithm to find - * a point on the front - * - * @param point - * @return - */ - public AdvancingFrontNode locatePoint( final TriangulationPoint point ) - { - final double px = point.getX(); - AdvancingFrontNode node = findSearchNode(px); - final double nx = node.point.getX(); - - if( px == nx ) - { - if( point != node.point ) - { - // We might have two nodes with same x value for a short time - if( point == node.prev.point ) - { - node = node.prev; - } - else if( point == node.next.point ) - { - node = node.next; - } - else - { - throw new RuntimeException( "Failed to find Node for given afront point"); -// node = null; - } - } - } - else if( px < nx ) - { - while( (node = node.prev) != null ) - { - if( point == node.point ) - { - break; - } - } - } - else - { - while( (node = node.next) != null ) - { - if( point == node.point ) - { - break; - } - } - } - search = node; - return node; - } -} \ No newline at end of file diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontIndex.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontIndex.java deleted file mode 100644 index 8305416..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontIndex.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.poly2tri.triangulation.delaunay.sweep; - -public class AdvancingFrontIndex
-{ - double _min,_max; - IndexNode _root; - - public AdvancingFrontIndex( double min, double max, int depth ) - { - if( depth > 5 ) depth = 5; - _root = createIndex( depth ); - } - - private IndexNode createIndex( int n ) - { - IndexNode node = null; - if( n > 0 ) - { - node = new IndexNode(); - node.bigger = createIndex( n-1 ); - node.smaller = createIndex( n-1 ); - } - return node; - } - - public A fetchAndRemoveIndex( A key ) - { - return null; - } - - public A fetchAndInsertIndex( A key ) - { - return null; - } - - class IndexNode - { - A value; - IndexNode smaller; - IndexNode bigger; - double range; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontNode.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontNode.java deleted file mode 100644 index d986925..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/AdvancingFrontNode.java +++ /dev/null @@ -1,84 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.delaunay.sweep; - -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - - - -public class AdvancingFrontNode -{ - protected AdvancingFrontNode next = null; - protected AdvancingFrontNode prev = null; - - protected final Double key; // XXX: BST - protected final double value; - protected final TriangulationPoint point; - protected DelaunayTriangle triangle; - - public AdvancingFrontNode( TriangulationPoint point ) - { - this.point = point; - value = point.getX(); - key = Double.valueOf( value ); // XXX: BST - } - - public AdvancingFrontNode getNext() - { - return next; - } - - public AdvancingFrontNode getPrevious() - { - return prev; - } - - public TriangulationPoint getPoint() - { - return point; - } - - public DelaunayTriangle getTriangle() - { - return triangle; - } - - public boolean hasNext() - { - return next != null; - } - - public boolean hasPrevious() - { - return prev != null; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweep.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweep.java deleted file mode 100644 index bd9fd35..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweep.java +++ /dev/null @@ -1,1290 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.delaunay.sweep; - -import static org.poly2tri.triangulation.TriangulationUtil.EPSILON; -import static org.poly2tri.triangulation.TriangulationUtil.inScanArea; -import static org.poly2tri.triangulation.TriangulationUtil.orient2d; -import static org.poly2tri.triangulation.TriangulationUtil.smartIncircle; -import java.util.List; -import org.poly2tri.triangulation.TriangulationMode; -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.TriangulationUtil.Orientation; -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - -/** - * Sweep-line, Constrained Delauney Triangulation (CDT) See: Domiter, V. and - * Zalik, B.(2008)'Sweep-line algorithm for constrained Delaunay triangulation', - * International Journal of Geographical Information Science - * - * "FlipScan" Constrained Edge Algorithm invented by author of this code. - * - * Author: Thomas Åhlén, thahlen@gmail.com - */ - -public class DTSweep -{ - - private final static double PI_div2 = Math.PI/2; - private final static double PI_3div4 = 3*Math.PI/4; - - public DTSweep() - {} - - /** Triangulate simple polygon with holes **/ - public static void triangulate( DTSweepContext tcx ) - { - tcx.createAdvancingFront(); - - sweep( tcx ); - - if( tcx.getTriangulationMode() == TriangulationMode.POLYGON ) - { - finalizationPolygon( tcx ); - } - else - { - finalizationConvexHull( tcx ); - } - - tcx.done(); - } - - /** - * Start sweeping the Y-sorted point set from bottom to top - * - * @param tcx - */ - private static void sweep( DTSweepContext tcx ) - { - List points; - TriangulationPoint point; - AdvancingFrontNode node; - - points = tcx.getPoints(); - - for( int i=1; i - */ - private static void turnAdvancingFrontConvex( DTSweepContext tcx, - AdvancingFrontNode b, - AdvancingFrontNode c ) - { - AdvancingFrontNode first = b; - while( c != tcx.aFront.tail ) - { - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( c ); } - - if( orient2d( b.point, c.point, c.next.point ) == Orientation.CCW ) - { - // [b,c,d] Concave - fill around c - fill( tcx, c ); - c = c.next; - } - else - { - // [b,c,d] Convex - if( b != first && orient2d( b.prev.point, b.point, c.point ) == Orientation.CCW ) - { - // [a,b,c] Concave - fill around b - fill( tcx, b ); - b = b.prev; - } - else - { - // [a,b,c] Convex - nothing to fill - b = c; - c = c.next; - } - } - } - } - - private static void finalizationPolygon( DTSweepContext tcx ) - { - // Get an Internal triangle to start with - DelaunayTriangle t = tcx.aFront.head.next.triangle; - TriangulationPoint p = tcx.aFront.head.next.point; - while( !t.getConstrainedEdgeCW( p ) ) - { - t = t.neighborCCW( p ); - } - - // Collect interior triangles constrained by edges - tcx.meshClean( t ); - } - - /** - * Find closes node to the left of the new point and - * create a new triangle. If needed new holes and basins - * will be filled to. - * - * @param tcx - * @param point - * @return - */ - private static AdvancingFrontNode pointEvent( DTSweepContext tcx, - TriangulationPoint point ) - { - AdvancingFrontNode node,newNode; - - node = tcx.locateNode( point ); - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( node ); } - newNode = newFrontTriangle( tcx, point, node ); - - // Only need to check +epsilon since point never have smaller - // x value than node due to how we fetch nodes from the front - if( point.getX() <= node.point.getX() + EPSILON ) - { - fill( tcx, node ); - } - tcx.addNode( newNode ); - - fillAdvancingFront( tcx, newNode ); - return newNode; - } - - /** - * Creates a new front triangle and legalize it - * - * @param tcx - * @param point - * @param node - * @return - */ - private static AdvancingFrontNode newFrontTriangle( DTSweepContext tcx, - TriangulationPoint point, - AdvancingFrontNode node ) - { - AdvancingFrontNode newNode; - DelaunayTriangle triangle; - - triangle = new DelaunayTriangle( point, node.point, node.next.point ); - triangle.markNeighbor( node.triangle ); - tcx.addToList( triangle ); - - newNode = new AdvancingFrontNode( point ); - newNode.next = node.next; - newNode.prev = node; - node.next.prev = newNode; - node.next = newNode; - - tcx.addNode( newNode ); // XXX: BST - - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( newNode ); } - - if( !legalize( tcx, triangle ) ) - { - tcx.mapTriangleToNodes( triangle ); - } - - return newNode; - } - - /** - * - * - * @param tcx - * @param edge - * @param node - */ - private static void edgeEvent( DTSweepContext tcx, - DTSweepConstraint edge, - AdvancingFrontNode node ) - { - try - { - tcx.edgeEvent.constrainedEdge = edge; - tcx.edgeEvent.right = edge.p.getX() > edge.q.getX(); - - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setPrimaryTriangle( node.triangle ); } - - if( isEdgeSideOfTriangle( node.triangle, edge.p, edge.q ) ) - { - return; - } - - // For now we will do all needed filling - // TODO: integrate with flip process might give some better performance - // but for now this avoid the issue with cases that needs both flips and fills - fillEdgeEvent( tcx, edge, node ); - - edgeEvent( tcx, edge.p, edge.q , node.triangle, edge.q ); - } - catch( PointOnEdgeException e ) - { - } - } - - private static void fillEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - if( tcx.edgeEvent.right ) - { - fillRightAboveEdgeEvent( tcx, edge, node ); - } - else - { - fillLeftAboveEdgeEvent( tcx, edge, node ); - } - } - - private static void fillRightConcaveEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - fill( tcx, node.next ); - if( node.next.point != edge.p ) - { - // Next above or below edge? - if( orient2d( edge.q, node.next.point, edge.p ) == Orientation.CCW ) - { - // Below - if( orient2d( node.point, node.next.point, node.next.next.point ) == Orientation.CCW ) - { - // Next is concave - fillRightConcaveEdgeEvent( tcx, edge, node ); - } - else - { - // Next is convex - } - } - } - } - - private static void fillRightConvexEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - // Next concave or convex? - if( orient2d( node.next.point, node.next.next.point, node.next.next.next.point ) == Orientation.CCW ) - { - // Concave - fillRightConcaveEdgeEvent( tcx, edge, node.next ); - } - else - { - // Convex - // Next above or below edge? - if( orient2d( edge.q, node.next.next.point, edge.p ) == Orientation.CCW ) - { - // Below - fillRightConvexEdgeEvent( tcx, edge, node.next ); - } - else - { - // Above - } - } - } - - private static void fillRightBelowEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( node ); } - if( node.point.getX() < edge.p.getX() ) // needed? - { - if( orient2d( node.point, node.next.point, node.next.next.point ) == Orientation.CCW ) - { - // Concave - fillRightConcaveEdgeEvent( tcx, edge, node ); - } - else - { - // Convex - fillRightConvexEdgeEvent( tcx, edge, node ); - // Retry this one - fillRightBelowEdgeEvent( tcx, edge, node ); - } - - } - } - - private static void fillRightAboveEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - while( node.next.point.getX() < edge.p.getX() ) - { - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( node ); } - // Check if next node is below the edge - Orientation o1 = orient2d( edge.q, node.next.point, edge.p ); - if( o1 == Orientation.CCW ) - { - fillRightBelowEdgeEvent( tcx, edge, node ); - } - else - { - node = node.next; - } - } - } - - private static void fillLeftConvexEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - // Next concave or convex? - if( orient2d( node.prev.point, node.prev.prev.point, node.prev.prev.prev.point ) == Orientation.CW ) - { - // Concave - fillLeftConcaveEdgeEvent( tcx, edge, node.prev ); - } - else - { - // Convex - // Next above or below edge? - if( orient2d( edge.q, node.prev.prev.point, edge.p ) == Orientation.CW ) - { - // Below - fillLeftConvexEdgeEvent( tcx, edge, node.prev ); - } - else - { - // Above - } - } - } - - private static void fillLeftConcaveEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - fill( tcx, node.prev ); - if( node.prev.point != edge.p ) - { - // Next above or below edge? - if( orient2d( edge.q, node.prev.point, edge.p ) == Orientation.CW ) - { - // Below - if( orient2d( node.point, node.prev.point, node.prev.prev.point ) == Orientation.CW ) - { - // Next is concave - fillLeftConcaveEdgeEvent( tcx, edge, node ); - } - else - { - // Next is convex - } - } - } - } - - private static void fillLeftBelowEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( node ); } - if( node.point.getX() > edge.p.getX() ) - { - if( orient2d( node.point, node.prev.point, node.prev.prev.point ) == Orientation.CW ) - { - // Concave - fillLeftConcaveEdgeEvent( tcx, edge, node ); - } - else - { - // Convex - fillLeftConvexEdgeEvent( tcx, edge, node ); - // Retry this one - fillLeftBelowEdgeEvent( tcx, edge, node ); - } - - } - } - - private static void fillLeftAboveEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) - { - while( node.prev.point.getX() > edge.p.getX() ) - { - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( node ); } - // Check if next node is below the edge - Orientation o1 = orient2d( edge.q, node.prev.point, edge.p ); - if( o1 == Orientation.CW ) - { - fillLeftBelowEdgeEvent( tcx, edge, node ); - } - else - { - node = node.prev; - } - } - } - - private static boolean isEdgeSideOfTriangle( DelaunayTriangle triangle, - TriangulationPoint ep, - TriangulationPoint eq ) - { - int index; - index = triangle.edgeIndex( ep, eq ); - if( index != -1 ) - { - triangle.markConstrainedEdge( index ); - triangle = triangle.neighbors[ index ]; - if( triangle != null ) - { - triangle.markConstrainedEdge( ep, eq ); - } - return true; - } - return false; - } - - private static void edgeEvent( DTSweepContext tcx, - TriangulationPoint ep, - TriangulationPoint eq, - DelaunayTriangle triangle, - TriangulationPoint point ) - { - TriangulationPoint p1,p2; - - if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setPrimaryTriangle( triangle ); } - - if( isEdgeSideOfTriangle( triangle, ep, eq ) ) - { - return; - } - - p1 = triangle.pointCCW( point ); - Orientation o1 = orient2d( eq, p1, ep ); - if( o1 == Orientation.Collinear ) - { - if( triangle.contains( eq, p1 ) ) - { - triangle.markConstrainedEdge( eq, p1 ); - // We are modifying the constraint maybe it would be better to - // not change the given constraint and just keep a variable for the new constraint - tcx.edgeEvent.constrainedEdge.q = p1; - triangle = triangle.neighborAcross( point ); - edgeEvent( tcx, ep, p1, triangle, p1 ); - } - else - { - throw new PointOnEdgeException( "EdgeEvent - Point on constrained edge not supported yet" ); - } - return; - } - - p2 = triangle.pointCW( point ); - Orientation o2 = orient2d( eq, p2, ep ); - if( o2 == Orientation.Collinear ) - { - if( triangle.contains( eq, p2 ) ) - { - triangle.markConstrainedEdge( eq, p2 ); - // We are modifying the constraint maybe it would be better to - // not change the given constraint and just keep a variable for the new constraint - tcx.edgeEvent.constrainedEdge.q = p2; - triangle = triangle.neighborAcross( point ); - edgeEvent( tcx, ep, p2, triangle, p2 ); - } - else - { - throw new PointOnEdgeException( "EdgeEvent - Point on constrained edge not supported yet" ); - } - return; - } - - if( o1 == o2 ) - { - // Need to decide if we are rotating CW or CCW to get to a triangle - // that will cross edge - if( o1 == Orientation.CW ) - { - triangle = triangle.neighborCCW( point ); - } - else - { - triangle = triangle.neighborCW( point ); - } - edgeEvent( tcx, ep, eq, triangle, point ); - } - else - { - // This triangle crosses constraint so lets flippin start! - flipEdgeEvent( tcx, ep, eq, triangle, point ); - } - } - - private static void flipEdgeEvent( DTSweepContext tcx, - TriangulationPoint ep, - TriangulationPoint eq, - DelaunayTriangle t, - TriangulationPoint p ) - { - TriangulationPoint op, newP; - DelaunayTriangle ot; - boolean inScanArea; - - ot = t.neighborAcross( p ); - op = ot.oppositePoint( t, p ); - - if( ot == null ) - { - // If we want to integrate the fillEdgeEvent do it here - // With current implementation we should never get here - throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle"); - } - - if( t.getConstrainedEdgeAcross(p) ) - { - throw new RuntimeException( "Intersecting Constraints" ); - } - - if( tcx.isDebugEnabled() ) - { - tcx.getDebugContext().setPrimaryTriangle( t ); - tcx.getDebugContext().setSecondaryTriangle( ot ); - } // TODO: remove - - inScanArea = inScanArea( p, - t.pointCCW( p ), - t.pointCW( p ), - op ); - if( inScanArea ) - { - // Lets rotate shared edge one vertex CW - rotateTrianglePair( t, p, ot, op ); - tcx.mapTriangleToNodes( t ); - tcx.mapTriangleToNodes( ot ); - - if( p == eq && op == ep ) - { - if( eq == tcx.edgeEvent.constrainedEdge.q - && ep == tcx.edgeEvent.constrainedEdge.p) - { - if( tcx.isDebugEnabled() ) { System.out.println("[FLIP] - constrained edge done" ); } // TODO: remove - t.markConstrainedEdge( ep, eq ); - ot.markConstrainedEdge( ep, eq ); - legalize( tcx, t ); - legalize( tcx, ot ); - } - else - { - if( tcx.isDebugEnabled() ) { System.out.println("[FLIP] - subedge done" ); } // TODO: remove - // XXX: I think one of the triangles should be legalized here? - } - } - else - { - if( tcx.isDebugEnabled() ) { System.out.println("[FLIP] - flipping and continuing with triangle still crossing edge" ); } // TODO: remove - Orientation o = orient2d( eq, op, ep ); - t = nextFlipTriangle( tcx, o, t, ot, p, op ); - flipEdgeEvent( tcx, ep, eq, t, p ); - } - } - else - { - newP = nextFlipPoint( ep, eq, ot, op ); - flipScanEdgeEvent( tcx, ep, eq, t, ot, newP ); - edgeEvent( tcx, ep, eq, t, p ); - } - } - - /** - * When we need to traverse from one triangle to the next we need - * the point in current triangle that is the opposite point to the next - * triangle. - * - * @param ep - * @param eq - * @param ot - * @param op - * @return - */ - private static TriangulationPoint nextFlipPoint( TriangulationPoint ep, - TriangulationPoint eq, - DelaunayTriangle ot, - TriangulationPoint op ) - { - Orientation o2d = orient2d( eq, op, ep ); - if( o2d == Orientation.CW ) - { - // Right - return ot.pointCCW( op ); - } - else if( o2d == Orientation.CCW ) - { - // Left - return ot.pointCW( op ); - } - else - { - // TODO: implement support for point on constraint edge - throw new PointOnEdgeException("Point on constrained edge not supported yet"); - } - } - - /** - * After a flip we have two triangles and know that only one will still be - * intersecting the edge. So decide which to contiune with and legalize the other - * - * @param tcx - * @param o - should be the result of an orient2d( eq, op, ep ) - * @param t - triangle 1 - * @param ot - triangle 2 - * @param p - a point shared by both triangles - * @param op - another point shared by both triangles - * @return returns the triangle still intersecting the edge - */ - private static DelaunayTriangle nextFlipTriangle( DTSweepContext tcx, - Orientation o, - DelaunayTriangle t, - DelaunayTriangle ot, - TriangulationPoint p, - TriangulationPoint op) - { - int edgeIndex; - if( o == Orientation.CCW ) - { - // ot is not crossing edge after flip - edgeIndex = ot.edgeIndex( p, op ); - ot.dEdge[edgeIndex] = true; - legalize( tcx, ot ); - ot.clearDelunayEdges(); - return t; - } - // t is not crossing edge after flip - edgeIndex = t.edgeIndex( p, op ); - t.dEdge[edgeIndex] = true; - legalize( tcx, t ); - t.clearDelunayEdges(); - return ot; - } - - /** - * Scan part of the FlipScan algorithm
- * When a triangle pair isn't flippable we will scan for the next - * point that is inside the flip triangle scan area. When found - * we generate a new flipEdgeEvent - * - * @param tcx - * @param ep - last point on the edge we are traversing - * @param eq - first point on the edge we are traversing - * @param flipTriangle - the current triangle sharing the point eq with edge - * @param t - * @param p - */ - private static void flipScanEdgeEvent( DTSweepContext tcx, - TriangulationPoint ep, - TriangulationPoint eq, - DelaunayTriangle flipTriangle, - DelaunayTriangle t, - TriangulationPoint p ) - { - DelaunayTriangle ot; - TriangulationPoint op,newP; - boolean inScanArea; - - ot = t.neighborAcross( p ); - op = ot.oppositePoint( t, p ); - - if( ot == null ) - { - // If we want to integrate the fillEdgeEvent do it here - // With current implementation we should never get here - throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle"); - } - - if( tcx.isDebugEnabled() ) - { - System.out.println("[FLIP:SCAN] - scan next point" ); // TODO: remove - tcx.getDebugContext().setPrimaryTriangle( t ); - tcx.getDebugContext().setSecondaryTriangle( ot ); - } - - inScanArea = inScanArea( eq, - flipTriangle.pointCCW( eq ), - flipTriangle.pointCW( eq ), - op ); - if( inScanArea ) - { - // flip with new edge op->eq - flipEdgeEvent( tcx, eq, op, ot, op ); - // TODO: Actually I just figured out that it should be possible to - // improve this by getting the next ot and op before the the above - // flip and continue the flipScanEdgeEvent here - // set new ot and op here and loop back to inScanArea test - // also need to set a new flipTriangle first - // Turns out at first glance that this is somewhat complicated - // so it will have to wait. - } - else - { - newP = nextFlipPoint( ep, eq, ot, op ); - flipScanEdgeEvent( tcx, ep, eq, flipTriangle, ot, newP ); - } - } - - /** - * Fills holes in the Advancing Front - * - * - * @param tcx - * @param n - */ - private static void fillAdvancingFront( DTSweepContext tcx, AdvancingFrontNode n ) - { - AdvancingFrontNode node; - double angle; - - // Fill right holes - node = n.next; - while( node.hasNext() ) - { - if( isLargeHole(node) ) - { - break; - } - fill( tcx, node ); - node = node.next; - } - - // Fill left holes - node = n.prev; - while( node.hasPrevious() ) - { - if( isLargeHole(node) ) - { - break; - } - fill( tcx, node ); - node = node.prev; - } - - // Fill right basins - if( n.hasNext() && n.next.hasNext() ) - { - angle = basinAngle( n ); - if( angle < PI_3div4 ) - { - fillBasin( tcx, n ); - } - } - } - - /** - * @param node - * @return true if hole angle exceeds 90 degrees - */ - private static boolean isLargeHole(AdvancingFrontNode node) - { - double angle = angle(node.point, node.next.point, node.prev.point); - //XXX: don't see angle being in range [-pi/2,0] due to how advancing front works -// return (angle > PI_div2) || (angle < -PI_div2); - return (angle > PI_div2) || (angle < 0); - - // ISSUE 48: http://code.google.com/p/poly2tri/issues/detail?id=48 - // TODO: Adding this fix suggested in issues 48 caused some - // triangulations to fail so commented it out for now. - // - // Also haven't been able to produce a triangulation that gives the - // problem described in issue 48. - -// AdvancingFrontNode nextNode = node.next; -// AdvancingFrontNode prevNode = node.prev; -// if( !AngleExceeds90Degrees(node.point, -// nextNode.point, -// prevNode.point)) -// { -// return false; -// } -// -// // Check additional points on front. -// AdvancingFrontNode next2Node = nextNode.next; -// // "..Plus.." because only want angles on same side as point being added. -// if( (next2Node != null) -// && !AngleExceedsPlus90DegreesOrIsNegative(node.point, -// next2Node.point, -// prevNode.point)) -// { -// return false; -// } -// -// AdvancingFrontNode prev2Node = prevNode.prev; -// // "..Plus.." because only want angles on same side as point being added. -// if( (prev2Node != null) -// && !AngleExceedsPlus90DegreesOrIsNegative(node.point, -// nextNode.point, -// prev2Node.point)) -// { -// return false; -// } -// return true; - } - -// private static boolean AngleExceeds90Degrees -// ( -// TriangulationPoint origin, -// TriangulationPoint pa, -// TriangulationPoint pb -// ) -// { -// double angle = angle(origin, pa, pb); -// return (angle > PI_div2) || (angle < -PI_div2); -// } -// -// -// private static boolean AngleExceedsPlus90DegreesOrIsNegative -// ( -// TriangulationPoint origin, -// TriangulationPoint pa, -// TriangulationPoint pb -// ) -// { -// double angle = angle(origin, pa, pb); -// return (angle > PI_div2) || (angle < 0); -// } - - /** - * Fills a basin that has formed on the Advancing Front to the right - * of given node.
- * First we decide a left,bottom and right node that forms the - * boundaries of the basin. Then we do a reqursive fill. - * - * @param tcx - * @param node - starting node, this or next node will be left node - */ - private static void fillBasin( DTSweepContext tcx, AdvancingFrontNode node ) - { - if( orient2d( node.point, node.next.point, node.next.next.point ) == Orientation.CCW ) - { - tcx.basin.leftNode = node; - } - else - { - tcx.basin.leftNode = node.next; - } - - // Find the bottom and right node - tcx.basin.bottomNode = tcx.basin.leftNode; - while( tcx.basin.bottomNode.hasNext() - && tcx.basin.bottomNode.point.getY() >= tcx.basin.bottomNode.next.point.getY() ) - { - tcx.basin.bottomNode = tcx.basin.bottomNode.next; - } - if( tcx.basin.bottomNode == tcx.basin.leftNode ) - { - // No valid basin - return; - } - - tcx.basin.rightNode = tcx.basin.bottomNode; - while( tcx.basin.rightNode.hasNext() - && tcx.basin.rightNode.point.getY() < tcx.basin.rightNode.next.point.getY() ) - { - tcx.basin.rightNode = tcx.basin.rightNode.next; - } - if( tcx.basin.rightNode == tcx.basin.bottomNode ) - { - // No valid basins - return; - } - - tcx.basin.width = tcx.basin.rightNode.getPoint().getX() - tcx.basin.leftNode.getPoint().getX(); - tcx.basin.leftHighest = tcx.basin.leftNode.getPoint().getY() > tcx.basin.rightNode.getPoint().getY(); - - fillBasinReq( tcx, tcx.basin.bottomNode ); - } - - /** - * Recursive algorithm to fill a Basin with triangles - * - * @param tcx - * @param node - bottomNode - * @param cnt - counter used to alternate on even and odd numbers - */ - private static void fillBasinReq( DTSweepContext tcx, AdvancingFrontNode node ) - { - // if shallow stop filling - if( isShallow( tcx, node) ) - { - return; - } - - fill( tcx, node ); - if( node.prev == tcx.basin.leftNode && node.next == tcx.basin.rightNode ) - { - return; - } - else if( node.prev == tcx.basin.leftNode ) - { - Orientation o = orient2d( node.point, node.next.point, node.next.next.point ); - if( o == Orientation.CW ) - { - return; - } - node = node.next; - } - else if( node.next == tcx.basin.rightNode ) - { - Orientation o = orient2d( node.point, node.prev.point, node.prev.prev.point ); - if( o == Orientation.CCW ) - { - return; - } - node = node.prev; - } - else - { - // Continue with the neighbor node with lowest Y value - if( node.prev.point.getY() < node.next.point.getY() ) - { - node = node.prev; - } - else - { - node = node.next; - } - } - fillBasinReq( tcx, node ); - } - - private static boolean isShallow( DTSweepContext tcx, AdvancingFrontNode node ) - { - double height; - - if( tcx.basin.leftHighest ) - { - height = tcx.basin.leftNode.getPoint().getY() - node.getPoint().getY(); - } - else - { - height = tcx.basin.rightNode.getPoint().getY() - node.getPoint().getY(); - } - if( tcx.basin.width > height ) - { - return true; - } - return false; - } - - /** - * - * @param node - middle node - * @return the angle between p-a and p-b in range [-pi,pi] - */ - private static double angle( TriangulationPoint p, - TriangulationPoint a, - TriangulationPoint b ) - { - // XXX: do we really need a signed angle for holeAngle? - // could possible save some cycles here - /* Complex plane - * ab = cosA +i*sinA - * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx) - * atan2(y,x) computes the principal value of the argument function - * applied to the complex number x+iy - * Where x = ax*bx + ay*by - * y = ax*by - ay*bx - */ - final double px = p.getX(); - final double py = p.getY(); - final double ax = a.getX() - px; - final double ay = a.getY() - py; - final double bx = b.getX() - px; - final double by = b.getY() - py; - return Math.atan2( ax*by - ay*bx, ax*bx + ay*by ); - } - - /** - * The basin angle is decided against the horizontal line [1,0] - */ - private static double basinAngle( AdvancingFrontNode node ) - { - double ax = node.point.getX() - node.next.next.point.getX(); - double ay = node.point.getY() - node.next.next.point.getY(); - return Math.atan2( ay, ax ); - } - - /** - * Adds a triangle to the advancing front to fill a hole. - * @param tcx - * @param node - middle node, that is the bottom of the hole - */ - private static void fill( DTSweepContext tcx, AdvancingFrontNode node ) - { - DelaunayTriangle triangle = new DelaunayTriangle( node.prev.point, - node.point, - node.next.point ); - // TODO: should copy the cEdge value from neighbor triangles - // for now cEdge values are copied during the legalize - triangle.markNeighbor( node.prev.triangle ); - triangle.markNeighbor( node.triangle ); - tcx.addToList( triangle ); - - // Update the advancing front - node.prev.next = node.next; - node.next.prev = node.prev; - tcx.removeNode( node ); - - // If it was legalized the triangle has already been mapped - if( !legalize( tcx, triangle ) ) - { - tcx.mapTriangleToNodes( triangle ); - } - } - - /** - * Returns true if triangle was legalized - */ - private static boolean legalize( DTSweepContext tcx, - DelaunayTriangle t ) - { - int oi; - boolean inside; - TriangulationPoint p,op; - DelaunayTriangle ot; - // To legalize a triangle we start by finding if any of the three edges - // violate the Delaunay condition - for( int i=0; i<3; i++ ) - { - // TODO: fix so that cEdge is always valid when creating new triangles then we can check it here - // instead of below with ot - if( t.dEdge[i] ) - { - continue; - } - ot = t.neighbors[i]; - if( ot != null ) - { - p = t.points[i]; - op = ot.oppositePoint( t, p ); - oi = ot.index( op ); - // If this is a Constrained Edge or a Delaunay Edge(only during recursive legalization) - // then we should not try to legalize - if( ot.cEdge[oi] || ot.dEdge[oi] ) - { - t.cEdge[i] = ot.cEdge[oi]; // XXX: have no good way of setting this property when creating new triangles so lets set it here - continue; - } - inside = smartIncircle( p, - t.pointCCW( p ), - t.pointCW( p ), - op ); - if( inside ) - { - boolean notLegalized; - - // Lets mark this shared edge as Delaunay - t.dEdge[i] = true; - ot.dEdge[oi] = true; - - // Lets rotate shared edge one vertex CW to legalize it - rotateTrianglePair( t, p, ot, op ); - - // We now got one valid Delaunay Edge shared by two triangles - // This gives us 4 new edges to check for Delaunay - - // Make sure that triangle to node mapping is done only one time for a specific triangle - notLegalized = !legalize( tcx, t ); - if( notLegalized ) - { - tcx.mapTriangleToNodes( t ); - } - notLegalized = !legalize( tcx, ot ); - if( notLegalized ) - { - tcx.mapTriangleToNodes( ot ); - } - - // Reset the Delaunay edges, since they only are valid Delaunay edges - // until we add a new triangle or point. - // XXX: need to think about this. Can these edges be tried after we - // return to previous recursive level? - t.dEdge[i] = false; - ot.dEdge[oi] = false; - - // If triangle have been legalized no need to check the other edges since - // the recursive legalization will handles those so we can end here. - return true; - } - } - } - return false; - } - - /** - * Rotates a triangle pair one vertex CW - *
-     *       n2                    n2
-     *  P +-----+             P +-----+
-     *    | t  /|               |\  t |  
-     *    |   / |               | \   |
-     *  n1|  /  |n3           n1|  \  |n3
-     *    | /   |    after CW   |   \ |
-     *    |/ oT |               | oT \|
-     *    +-----+ oP            +-----+
-     *       n4                    n4
-     * 
- */ - private static void rotateTrianglePair( DelaunayTriangle t, - TriangulationPoint p, - DelaunayTriangle ot, - TriangulationPoint op ) - { - DelaunayTriangle n1,n2,n3,n4; - n1 = t.neighborCCW( p ); - n2 = t.neighborCW( p ); - n3 = ot.neighborCCW( op ); - n4 = ot.neighborCW( op ); - - boolean ce1,ce2,ce3,ce4; - ce1 = t.getConstrainedEdgeCCW(p); - ce2 = t.getConstrainedEdgeCW(p); - ce3 = ot.getConstrainedEdgeCCW(op); - ce4 = ot.getConstrainedEdgeCW(op); - - boolean de1,de2,de3,de4; - de1 = t.getDelunayEdgeCCW(p); - de2 = t.getDelunayEdgeCW(p); - de3 = ot.getDelunayEdgeCCW(op); - de4 = ot.getDelunayEdgeCW(op); - - t.legalize( p, op ); - ot.legalize( op, p ); - - // Remap dEdge - ot.setDelunayEdgeCCW( p, de1 ); - t.setDelunayEdgeCW( p, de2 ); - t.setDelunayEdgeCCW( op, de3 ); - ot.setDelunayEdgeCW( op, de4 ); - - // Remap cEdge - ot.setConstrainedEdgeCCW( p, ce1 ); - t.setConstrainedEdgeCW( p, ce2 ); - t.setConstrainedEdgeCCW( op, ce3 ); - ot.setConstrainedEdgeCW( op, ce4 ); - - // Remap neighbors - // XXX: might optimize the markNeighbor by keeping track of - // what side should be assigned to what neighbor after the - // rotation. Now mark neighbor does lots of testing to find - // the right side. - t.clearNeighbors(); - ot.clearNeighbors(); - if( n1 != null ) ot.markNeighbor( n1 ); - if( n2 != null ) t.markNeighbor( n2 ); - if( n3 != null ) t.markNeighbor( n3 ); - if( n4 != null ) ot.markNeighbor( n4 ); - t.markNeighbor( ot ); - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepConstraint.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepConstraint.java deleted file mode 100644 index 636cbd9..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepConstraint.java +++ /dev/null @@ -1,103 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.delaunay.sweep; - -import java.util.logging.Logger; -import org.poly2tri.triangulation.TriangulationConstraint; -import org.poly2tri.triangulation.TriangulationPoint; - -/** - * - * @author Thomas Åhlén, thahlen@gmail.com - * - */ -public class DTSweepConstraint extends TriangulationConstraint -{ - - public TriangulationPoint p; - public TriangulationPoint q; - - /** - * Give two points in any order. Will always be ordered so - * that q.y > p.y and q.x > p.x if same y value - * - * @param p1 - * @param p2 - */ - public DTSweepConstraint( TriangulationPoint p1, TriangulationPoint p2 ) -// throws DuplicatePointException - { - p = p1; - q = p2; - if( p1.getY() > p2.getY() ) - { - q = p1; - p = p2; - } - else if( p1.getY() == p2.getY() ) - { - if( p1.getX() > p2.getX() ) - { - q = p1; - p = p2; - } - else if( p1.getX() == p2.getX() ) - { -// throw new DuplicatePointException( p1 + "=" + p2 ); -// return; - } - } - q.addEdge(this); - } - -// public TPoint intersect( TPoint a, TPoint b ) -// { -// double pqx,pqy,bax,bay,t; -// -// pqx = p.getX()-q.getX(); -// pqy = p.getY()-q.getY(); -// t = pqy*(a.getX()-q.getX()) - pqx*(a.getY()-q.getY() ); -// t /= pqx*(b.getY()-a.getY()) - pqy*(b.getX()-a.getX()); -// bax = t*(b.getX()-a.getX()) + a.getX(); -// bay = t*(b.getY()-a.getY()) + a.getY(); -// return new TPoint( bax, bay ); -// } - - public TriangulationPoint getP() - { - return p; - } - - public TriangulationPoint getQ() - { - return q; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepContext.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepContext.java deleted file mode 100644 index 4605479..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepContext.java +++ /dev/null @@ -1,280 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.delaunay.sweep; - -import java.util.ArrayDeque; -import java.util.Collections; -import org.poly2tri.triangulation.Triangulatable; -import org.poly2tri.triangulation.TriangulationAlgorithm; -import org.poly2tri.triangulation.TriangulationConstraint; -import org.poly2tri.triangulation.TriangulationContext; -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; -import org.poly2tri.triangulation.point.TPoint; - -/** - * - * @author Thomas Åhlén, thahlen@gmail.com - * - */ -public class DTSweepContext extends TriangulationContext -{ - - // Inital triangle factor, seed triangle will extend 30% of - // PointSet width to both left and right. - private final float ALPHA = 0.3f; - - /** Advancing front **/ - protected AdvancingFront aFront; - /** head point used with advancing front */ - private TriangulationPoint _head; - /** tail point used with advancing front */ - private TriangulationPoint _tail; - protected Basin basin = new Basin(); - protected EdgeEvent edgeEvent = new EdgeEvent(); - - private DTSweepPointComparator _comparator = new DTSweepPointComparator(); - - public DTSweepContext() - { - clear(); - } - - public void isDebugEnabled( boolean b ) - { - if( b ) - { - if( _debug == null ) - { - _debug = new DTSweepDebugContext(this); - } - } - _debugEnabled = b; - } - - public void removeFromList( DelaunayTriangle triangle ) - { - _triList.remove( triangle ); - // TODO: remove all neighbor pointers to this triangle -// for( int i=0; i<3; i++ ) -// { -// if( triangle.neighbors[i] != null ) -// { -// triangle.neighbors[i].clearNeighbor( triangle ); -// } -// } -// triangle.clearNeighbors(); - } - - protected void meshClean(DelaunayTriangle triangle) - { - DelaunayTriangle t1,t2; - if( triangle != null ) - { - ArrayDeque deque = new ArrayDeque(); - deque.addFirst(triangle); - triangle.isInterior(true); - - while( !deque.isEmpty() ) - { - t1 = deque.removeFirst(); - _triUnit.addTriangle( t1 ); - for( int i=0; i<3; ++i ) - { - if( !t1.cEdge[i] ) - { - t2 = t1.neighbors[i]; - if( t2 != null && !t2.isInterior() ) - { - t2.isInterior(true); - deque.addLast(t2); - } - } - } - } - } - } - - public void clear() - { - super.clear(); - _triList.clear(); - } - - public AdvancingFront getAdvancingFront() - { - return aFront; - } - - public void setHead( TriangulationPoint p1 ) { _head = p1; } - public TriangulationPoint getHead() { return _head; } - - public void setTail( TriangulationPoint p1 ) { _tail = p1; } - public TriangulationPoint getTail() { return _tail; } - - public void addNode( AdvancingFrontNode node ) - { -// System.out.println( "add:" + node.key + ":" + System.identityHashCode(node.key)); -// m_nodeTree.put( node.getKey(), node ); - aFront.addNode( node ); - } - - public void removeNode( AdvancingFrontNode node ) - { -// System.out.println( "remove:" + node.key + ":" + System.identityHashCode(node.key)); -// m_nodeTree.delete( node.getKey() ); - aFront.removeNode( node ); - } - - public AdvancingFrontNode locateNode( TriangulationPoint point ) - { - return aFront.locateNode( point ); - } - - public void createAdvancingFront() - { - AdvancingFrontNode head,tail,middle; - // Initial triangle - DelaunayTriangle iTriangle = new DelaunayTriangle( _points.get(0), - getTail(), - getHead() ); - addToList( iTriangle ); - - head = new AdvancingFrontNode( iTriangle.points[1] ); - head.triangle = iTriangle; - middle = new AdvancingFrontNode( iTriangle.points[0] ); - middle.triangle = iTriangle; - tail = new AdvancingFrontNode( iTriangle.points[2] ); - - aFront = new AdvancingFront( head, tail ); - aFront.addNode( middle ); - - // TODO: I think it would be more intuitive if head is middles next and not previous - // so swap head and tail - aFront.head.next = middle; - middle.next = aFront.tail; - middle.prev = aFront.head; - aFront.tail.prev = middle; - } - - class Basin - { - AdvancingFrontNode leftNode; - AdvancingFrontNode bottomNode; - AdvancingFrontNode rightNode; - public double width; - public boolean leftHighest; - } - - class EdgeEvent - { - DTSweepConstraint constrainedEdge; - public boolean right; - } - - /** - * Try to map a node to all sides of this triangle that don't have - * a neighbor. - * - * @param t - */ - public void mapTriangleToNodes( DelaunayTriangle t ) - { - AdvancingFrontNode n; - for( int i=0; i<3; i++ ) - { - if( t.neighbors[i] == null ) - { - n = aFront.locatePoint( t.pointCW( t.points[i] ) ); - if( n != null ) - { - n.triangle = t; - } - } - } - } - - @Override - public void prepareTriangulation( Triangulatable t ) - { - super.prepareTriangulation( t ); - - double xmax, xmin; - double ymax, ymin; - - xmax = xmin = _points.get(0).getX(); - ymax = ymin = _points.get(0).getY(); - // Calculate bounds. Should be combined with the sorting - for( TriangulationPoint p : _points ) - { - if( p.getX() > xmax ) - xmax = p.getX(); - if( p.getX() < xmin ) - xmin = p.getX(); - if( p.getY() > ymax ) - ymax = p.getY(); - if( p.getY() < ymin ) - ymin = p.getY(); - } - - double deltaX = ALPHA * ( xmax - xmin ); - double deltaY = ALPHA * ( ymax - ymin ); - TPoint p1 = new TPoint( xmax + deltaX, ymin - deltaY ); - TPoint p2 = new TPoint( xmin - deltaX, ymin - deltaY ); - - setHead( p1 ); - setTail( p2 ); - -// long time = System.nanoTime(); - // Sort the points along y-axis - Collections.sort( _points, _comparator ); -// logger.info( "Triangulation setup [{}ms]", ( System.nanoTime() - time ) / 1e6 ); - } - - - public void finalizeTriangulation() - { - _triUnit.addTriangles( _triList ); - _triList.clear(); - } - - @Override - public TriangulationConstraint newConstraint( TriangulationPoint a, TriangulationPoint b ) - { - return new DTSweepConstraint( a, b ); - } - - @Override - public TriangulationAlgorithm algorithm() - { - return TriangulationAlgorithm.DTSweep; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepDebugContext.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepDebugContext.java deleted file mode 100644 index 103815f..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepDebugContext.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.poly2tri.triangulation.delaunay.sweep; - -import org.poly2tri.triangulation.TriangulationContext; -import org.poly2tri.triangulation.TriangulationDebugContext; -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - -public class DTSweepDebugContext extends TriangulationDebugContext -{ - /* - * Fields used for visual representation of current triangulation - */ - protected DelaunayTriangle _primaryTriangle; - protected DelaunayTriangle _secondaryTriangle; - protected TriangulationPoint _activePoint; - protected AdvancingFrontNode _activeNode; - protected DTSweepConstraint _activeConstraint; - - public DTSweepDebugContext( DTSweepContext tcx ) - { - super( tcx ); - } - - public boolean isDebugContext() - { - return true; - } - - // private Tuple2 m_circumCircle = new Tuple2( new TPoint(), new Double(0) ); -// public Tuple2 getCircumCircle() { return m_circumCircle; } - public DelaunayTriangle getPrimaryTriangle() - { - return _primaryTriangle; - } - - public DelaunayTriangle getSecondaryTriangle() - { - return _secondaryTriangle; - } - - public AdvancingFrontNode getActiveNode() - { - return _activeNode; - } - - public DTSweepConstraint getActiveConstraint() - { - return _activeConstraint; - } - - public TriangulationPoint getActivePoint() - { - return _activePoint; - } - - public void setPrimaryTriangle( DelaunayTriangle triangle ) - { - _primaryTriangle = triangle; - _tcx.update("setPrimaryTriangle"); - } - - public void setSecondaryTriangle( DelaunayTriangle triangle ) - { - _secondaryTriangle = triangle; - _tcx.update("setSecondaryTriangle"); - } - - public void setActivePoint( TriangulationPoint point ) - { - _activePoint = point; - } - - public void setActiveConstraint( DTSweepConstraint e ) - { - _activeConstraint = e; - _tcx.update("setWorkingSegment"); - } - - public void setActiveNode( AdvancingFrontNode node ) - { - _activeNode = node; - _tcx.update("setWorkingNode"); - } - - @Override - public void clear() - { - _primaryTriangle = null; - _secondaryTriangle = null; - _activePoint = null; - _activeNode = null; - _activeConstraint = null; - } - -// public void setWorkingCircumCircle( TPoint point, TPoint point2, TPoint point3 ) -// { -// double dx,dy; -// -// CircleXY.circumCenter( point, point2, point3, m_circumCircle.a ); -// dx = m_circumCircle.a.getX()-point.getX(); -// dy = m_circumCircle.a.getY()-point.getY(); -// m_circumCircle.b = Double.valueOf( Math.sqrt( dx*dx + dy*dy ) ); -// -// } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepPointComparator.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepPointComparator.java deleted file mode 100644 index 65e1754..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/DTSweepPointComparator.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.poly2tri.triangulation.delaunay.sweep; - -import java.util.Comparator; - -import org.poly2tri.triangulation.TriangulationPoint; - -public class DTSweepPointComparator implements Comparator -{ - public int compare( TriangulationPoint p1, TriangulationPoint p2 ) - { - if(p1.getY() < p2.getY() ) - { - return -1; - } - else if( p1.getY() > p2.getY()) - { - return 1; - } - else - { - if(p1.getX() < p2.getX()) - { - return -1; - } - else if( p1.getX() > p2.getX() ) - { - return 1; - } - else - { - return 0; - } - } - } -} diff --git a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/PointOnEdgeException.java b/src/main/java/org/poly2tri/triangulation/delaunay/sweep/PointOnEdgeException.java deleted file mode 100644 index dfc4467..0000000 --- a/src/main/java/org/poly2tri/triangulation/delaunay/sweep/PointOnEdgeException.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.poly2tri.triangulation.delaunay.sweep; - -public class PointOnEdgeException extends RuntimeException -{ - - /** - * - */ - private static final long serialVersionUID = 1L; - - public PointOnEdgeException( String msg ) - { - super(msg); - } -} diff --git a/src/main/java/org/poly2tri/triangulation/point/FloatBufferPoint.java b/src/main/java/org/poly2tri/triangulation/point/FloatBufferPoint.java deleted file mode 100644 index ad815fc..0000000 --- a/src/main/java/org/poly2tri/triangulation/point/FloatBufferPoint.java +++ /dev/null @@ -1,94 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.point; - -import java.nio.FloatBuffer; - -import org.poly2tri.triangulation.TriangulationPoint; - - -public class FloatBufferPoint extends TriangulationPoint -{ - private final FloatBuffer _fb; - private final int _ix,_iy,_iz; - - public FloatBufferPoint( FloatBuffer fb, int index ) - { - _fb = fb; - _ix = index; - _iy = index+1; - _iz = index+2; - } - - public final double getX() - { - return _fb.get( _ix ); - } - public final double getY() - { - return _fb.get( _iy ); - } - public final double getZ() - { - return _fb.get( _iz ); - } - - public final float getXf() - { - return _fb.get( _ix ); - } - public final float getYf() - { - return _fb.get( _iy ); - } - public final float getZf() - { - return _fb.get( _iz ); - } - - @Override - public void set( double x, double y, double z ) - { - _fb.put( _ix, (float)x ); - _fb.put( _iy, (float)y ); - _fb.put( _iz, (float)z ); - } - - public static TriangulationPoint[] toPoints( FloatBuffer fb ) - { - FloatBufferPoint[] points = new FloatBufferPoint[fb.limit()/3]; - for( int i=0,j=0; i - * A constraint defines an edge between two points in the set, these edges can not - * be crossed. They will be enforced triangle edges after a triangulation. - *

- * - * - * @author Thomas Åhlén, thahlen@gmail.com - */ -public class ConstrainedPointSet extends PointSet -{ - int[] _index; - List _constrainedPointList = null; - - public ConstrainedPointSet( List points, int[] index ) - { - super( points ); - _index = index; - } - - /** - * - * @param points - A list of all points in PointSet - * @param constraints - Pairs of two points defining a constraint, all points must be part of given PointSet! - */ - public ConstrainedPointSet( List points, List constraints ) - { - super( points ); - _constrainedPointList = new ArrayList(); - _constrainedPointList.addAll(constraints); - } - - @Override - public TriangulationMode getTriangulationMode() - { - return TriangulationMode.CONSTRAINED; - } - - public int[] getEdgeIndex() - { - return _index; - } - - @SuppressWarnings("unchecked") - @Override - public void prepareTriangulation( TriangulationContext tcx ) - { - super.prepareTriangulation( tcx ); - if( _constrainedPointList != null ) - { - TriangulationPoint p1,p2; - Iterator iterator = _constrainedPointList.iterator(); - while(iterator.hasNext()) - { - p1 = (TriangulationPoint)iterator.next(); - p2 = (TriangulationPoint)iterator.next(); - tcx.newConstraint(p1,p2); - } - } - else - { - for( int i = 0; i < _index.length; i+=2 ) - { - // XXX: must change!! - tcx.newConstraint( _points.get( _index[i] ), _points.get( _index[i+1] ) ); - } - } - } - - /** - * TODO: TO BE IMPLEMENTED! - * Peforms a validation on given input
- * 1. Check's if there any constraint edges are crossing or collinear
- * 2. - * @return - */ - public boolean isValid() - { - return true; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/sets/PointSet.java b/src/main/java/org/poly2tri/triangulation/sets/PointSet.java deleted file mode 100644 index d4ff5b6..0000000 --- a/src/main/java/org/poly2tri/triangulation/sets/PointSet.java +++ /dev/null @@ -1,95 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.sets; - -import java.util.ArrayList; -import java.util.List; - -import org.poly2tri.triangulation.Triangulatable; -import org.poly2tri.triangulation.TriangulationContext; -import org.poly2tri.triangulation.TriangulationMode; -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - -public class PointSet implements Triangulatable -{ - List _points; - List _triangles; - - public PointSet( List points ) - { - _points = new ArrayList(); - _points.addAll( points ); - } - - public TriangulationMode getTriangulationMode() - { - return TriangulationMode.UNCONSTRAINED; - } - - public List getPoints() - { - return _points; - } - - public List getTriangles() - { - return _triangles; - } - - public void addTriangle( DelaunayTriangle t ) - { - _triangles.add( t ); - } - - public void addTriangles( List list ) - { - _triangles.addAll( list ); - } - - public void clearTriangulation() - { - _triangles.clear(); - } - - public void prepareTriangulation( TriangulationContext tcx ) - { - if( _triangles == null ) - { - _triangles = new ArrayList( _points.size() ); - } - else - { - _triangles.clear(); - } - tcx.addPoints( _points ); - } -} diff --git a/src/main/java/org/poly2tri/triangulation/util/PointGenerator.java b/src/main/java/org/poly2tri/triangulation/util/PointGenerator.java deleted file mode 100644 index baf2c17..0000000 --- a/src/main/java/org/poly2tri/triangulation/util/PointGenerator.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.poly2tri.triangulation.util; - -import java.util.ArrayList; -import java.util.List; - -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.point.TPoint; - -public class PointGenerator -{ - public static List uniformDistribution( int n, double scale ) - { - ArrayList points = new ArrayList(); - for( int i=0; i uniformGrid( int n, double scale ) - { - double x=0; - double size = scale/n; - double halfScale = 0.5*scale; - - ArrayList points = new ArrayList(); - for( int i=0; i scale/2 ? scale/2 : radius; - radius = radius < scale/10 ? scale/10 : radius; - } while( radius < scale/10 || radius > scale/2 ); - point = new PolygonPoint( radius*Math.cos( (PI_2*i)/vertexCount ), - radius*Math.sin( (PI_2*i)/vertexCount ) ); - points[i] = point; - } - return new Polygon( points ); - } - - public static Polygon RandomCircleSweep2( double scale, int vertexCount ) - { - PolygonPoint point; - PolygonPoint[] points; - double radius = scale/4; - - points = new PolygonPoint[vertexCount]; - for(int i=0; i scale/2 ? scale/2 : radius; - radius = radius < scale/10 ? scale/10 : radius; - } while( radius < scale/10 || radius > scale/2 ); - point = new PolygonPoint( radius*Math.cos( (PI_2*i)/vertexCount ), - radius*Math.sin( (PI_2*i)/vertexCount ) ); - points[i] = point; - } - return new Polygon( points ); - } -} diff --git a/src/main/java/org/poly2tri/triangulation/util/QuadTreeRefinement.java b/src/main/java/org/poly2tri/triangulation/util/QuadTreeRefinement.java deleted file mode 100644 index f3ab2ed..0000000 --- a/src/main/java/org/poly2tri/triangulation/util/QuadTreeRefinement.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.poly2tri.triangulation.util; - -import org.poly2tri.geometry.polygon.Polygon; - -/** - * Use a QuadTree traversal to add steiner points - * inside the polygon that needs refinement - * - * @author thahlen@gmail.com - */ -public class QuadTreeRefinement -{ - public static final void refine( Polygon p, int depth ) - { - - } -} diff --git a/src/main/java/org/poly2tri/triangulation/util/Tuple2.java b/src/main/java/org/poly2tri/triangulation/util/Tuple2.java deleted file mode 100644 index 4c5fa7d..0000000 --- a/src/main/java/org/poly2tri/triangulation/util/Tuple2.java +++ /dev/null @@ -1,43 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.util; - -public class Tuple2 -{ - public A a; - public B b; - - public Tuple2(A a,B b) - { - this.a = a; - this.b = b; - } -} diff --git a/src/main/java/org/poly2tri/triangulation/util/Tuple3.java b/src/main/java/org/poly2tri/triangulation/util/Tuple3.java deleted file mode 100644 index b81d8a5..0000000 --- a/src/main/java/org/poly2tri/triangulation/util/Tuple3.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Poly2Tri - * Copyright (c) 2009-2010, Poly2Tri Contributors - * http://code.google.com/p/poly2tri/ - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * * Neither the name of Poly2Tri nor the names of its contributors may be - * used to endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.poly2tri.triangulation.util; - -public class Tuple3 -{ - public A a; - public B b; - public C c; - - public Tuple3(A a,B b,C c) - { - this.a = a; - this.b = b; - this.c = c; - } -} -- 2.39.5 From ff890fe7b6084ed9946d24eba2ba1bfa6d64ec2e Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 03:49:59 -0500 Subject: [PATCH 26/58] If obelisks are just going to watch in limbo, make them act like that --- .../mod_pocketDim/ticking/MobMonolith.java | 18 +- .../mod_pocketDim/util/l_systems/LSystem.java | 557 ------------------ .../mod_pocketDimClient/RenderMobObelisk.java | 8 +- 3 files changed, 19 insertions(+), 564 deletions(-) delete mode 100644 src/main/java/StevenDimDoors/mod_pocketDim/util/l_systems/LSystem.java diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index daf20e6..34bb72e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -50,6 +50,10 @@ public class MobMonolith extends EntityFlying implements IMob properties = DDProperties.instance(); } + public boolean isDangerous() { + return properties.LimboDimensionID != worldObj.provider.dimensionId; + } + @Override protected void damageEntity(DamageSource par1DamageSource, float par2) { @@ -145,7 +149,7 @@ public class MobMonolith extends EntityFlying implements IMob if (player != null) { this.facePlayer(player); - if (!this.worldObj.isRemote && !(this.worldObj.provider instanceof LimboProvider)) + if (!this.worldObj.isRemote && isDangerous()) { // Play sounds on the server side, if the player isn't in Limbo. // Limbo is excluded to avoid drowning out its background music. @@ -158,7 +162,7 @@ public class MobMonolith extends EntityFlying implements IMob if (visibility) { // Only spawn particles on the client side and outside Limbo - if (this.worldObj.isRemote && !(this.worldObj.provider instanceof LimboProvider)) + if (this.worldObj.isRemote && isDangerous()) { this.spawnParticles(player); } @@ -166,7 +170,7 @@ public class MobMonolith extends EntityFlying implements IMob // Teleport the target player if various conditions are met if (aggro >= MAX_AGGRO && !this.worldObj.isRemote && properties.MonolithTeleportationEnabled && !player.capabilities.isCreativeMode && - !(this.worldObj.provider instanceof LimboProvider)) + isDangerous()) { this.aggro = 0; Point4D destination = LimboProvider.getLimboSkySpawn(player, properties); @@ -189,7 +193,10 @@ public class MobMonolith extends EntityFlying implements IMob { if (this.worldObj.provider instanceof LimboProvider) { - aggro++; + if (isDangerous()) + aggro++; + else + aggro += 18; } else { @@ -211,7 +218,8 @@ public class MobMonolith extends EntityFlying implements IMob } } // Clamp the aggro level - aggro = (short) MathHelper.clamp_int(aggro, 0, MAX_AGGRO); + int maxAggro = isDangerous()?MAX_AGGRO:180; + aggro = (short) MathHelper.clamp_int(aggro, 0, maxAggro); this.dataWatcher.updateObject(AGGRO_WATCHER_INDEX, Short.valueOf(aggro)); } else diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/util/l_systems/LSystem.java b/src/main/java/StevenDimDoors/mod_pocketDim/util/l_systems/LSystem.java deleted file mode 100644 index 46d83ec..0000000 --- a/src/main/java/StevenDimDoors/mod_pocketDim/util/l_systems/LSystem.java +++ /dev/null @@ -1,557 +0,0 @@ -package StevenDimDoors.mod_pocketDim.util.l_systems; - -import java.awt.Point; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import javax.swing.SwingUtilities; -import org.poly2tri.Poly2Tri; -import org.poly2tri.geometry.polygon.Polygon; -import org.poly2tri.geometry.polygon.PolygonPoint; -import org.poly2tri.triangulation.TriangulationPoint; -import org.poly2tri.triangulation.delaunay.DelaunayTriangle; - - -public class LSystem -{ - public static ArrayList curves = new ArrayList(); - - /** - * An array containing the args to generate a curve. - * index 0 = rules - * index 1 = angle - * index 2 = start string - */ - public static final String[] TERDRAGON = {"F>+F----F++++F-","60","F"}; - public static final String[] DRAGON = {"X>X+YF:Y>FX-Y","90","FX"}; - public static final String[] TWINDRAGON = {"X>X+YF:Y>FX-Y","90","FX--FX"}; - public static final String[] VORTEX = {"X>X+YF:Y>FX-Y","90","FX---FX"}; - - - - /** - * Generates a fractal curve - * @param args: 0 = rules, 1 = angle, 2 = start - * @param steps - * @return - */ - public static void generateLSystem(String key, String[] args, int steps) - { - //Parse the rules from the first index - String[] rules = args[0].split(":"); - HashMap lSystemsRule = new HashMap(); - - for (String rule : rules) - { - String[] parts = rule.split(">"); - lSystemsRule.put(parts[0], parts[1]); - } - - //get the angle for each turn - int angle = Integer.parseInt(args[1]); - - - //String to hold the output - //Initialize with starting string - String output = args[2]; - - //generate the l-system - output = (generate(args[2], steps, lSystemsRule)); - - //get the boundary of the polygon - PolygonStorage polygon = getBoundary(convertToPoints(angle, output, (steps))); - - //replace the boundary of the polygon with a series of points representing triangles for rendering - polygon.points = tesselate(polygon); - - curves.add(polygon); - - } - - /** - * Naively returns all of the points comprising the fractal - * @param input - * @return - */ - public static PolygonStorage getSpaceFillingCurve(ArrayList input) - { - // store max x and y values to create bounding box - int maxY = Integer.MIN_VALUE; - int maxX = Integer.MIN_VALUE; - int minY = Integer.MAX_VALUE; - int minX = Integer.MAX_VALUE; - - // store confirmed duplicates here - HashSet duplicates = new HashSet(); - - // store possible singles here - HashSet singles = new HashSet(); - - // list to store confirmed singles and output in the correct order - ArrayList output = new ArrayList(); - - // sort into Hashmaps and hashsets to make contains operations possible, - // while testing for duplicates - for (double[] point : input) - { - // convert doubles to ints and record min/max values - - int xCoord = (int) Math.round(point[0]); - int yCoord = (int) Math.round(point[1]); - - if (xCoord > maxX) - { - maxX = xCoord; - } - if (xCoord < minX) - { - minX = xCoord; - } - - if (yCoord > maxY) - { - maxY = yCoord; - } - if (yCoord < minY) - { - minY = yCoord; - } - output.add(new Point(xCoord, yCoord)); - } - return new PolygonStorage(output, maxX, maxY, minX, minY); - - } - - /** - * Takes an unordered list of points comprising a fractal curve and builds a - * closed polygon around it - * - * @param input - * @return - */ - public static PolygonStorage getBoundary(ArrayList input) - { - // store max x and y values to create bounding box - int maxY = Integer.MIN_VALUE; - int maxX = Integer.MIN_VALUE; - int minY = Integer.MAX_VALUE; - int minX = Integer.MAX_VALUE; - - // store confirmed duplicates here - HashSet duplicates = new HashSet(); - - // store possible singles here - HashSet singles = new HashSet(); - - // list to store confirmed singles and output in the correct order - ArrayList output = new ArrayList(); - - // sort into Hashmaps and hashsets to make contains operations possible, - // while testing for duplicates - for (double[] point : input) - { - // convert doubles to ints and record min/max values - - int xCoord = (int) Math.round(point[0]); - int yCoord = (int) Math.round(point[1]); - - if (xCoord > maxX) - { - maxX = xCoord; - } - if (xCoord < minX) - { - minX = xCoord; - } - - if (yCoord > maxY) - { - maxY = yCoord; - } - if (yCoord < minY) - { - minY = yCoord; - } - singles.add(new Point(xCoord, yCoord)); - - } - - // find a suitable starting point - Point startPoint = new Point(minX, minY); - Point prevPoint = (Point) startPoint.clone(); - - while (startPoint.y < maxY) - { - if (singles.contains(startPoint)) - { - break; - } - startPoint.y++; - } - - // record the first point so we know where to stop - final Point firstPoint = (Point) startPoint.clone(); - - // determine the direction to start searching from - Point direction = getVector(prevPoint, startPoint); - - //output.add(startPoint); - - // loop around in a clockwise circle, jumping to the next point when we - // find it and resetting the direction to start seaching from - // to the last found point. This ensures we always find the next - // *outside* point - do - { - // get the next point - direction = rotateCounterClockwise(direction); - Point target = new Point(startPoint.x + direction.x, startPoint.y + direction.y); - - // see if that point is part of our fractal curve - if (singles.contains(target)) - { - if(target.equals(firstPoint)) - { - output.remove(output.get(output.size()-1)); - break; - } - // get the vector to start from for the next cycle - direction = getVector(startPoint, target); - - // prune zero width spikes - if ((output.size() > 1 && output.get(output.size() - 2).equals(target))) - { - output.remove(output.size() - 1); - } - else - { - - if(output.contains(target)&&!target.equals(output.get(0))) - { - int index = output.indexOf(target); - while(output.size()>index) - { - output.remove(output.size()-1); - } - - } - output.add(target); - } - startPoint = target; - } - } - while (!(output.get(output.size() - 1).equals(firstPoint) && output.size() > 1) && output.size() < singles.size()); - - return new PolygonStorage(output, maxX, maxY, minX, minY); - } - - /** - * using a point as a 2d vector, normalize it (sorta) - * - * @param origin - * @param destination - * @return - */ - public static Point getVector(Point origin, Point destination) - { - int[] normals = { origin.x - destination.x, origin.y - destination.y }; - - for (int i = 0; i < normals.length; i++) - { - if (normals[i] > 0) - { - normals[i] = 1; - } - else if (normals[i] == 0) - { - normals[i] = 0; - } - else if (normals[i] < 0) - { - normals[i] = -1; - } - } - return new Point(normals[0], normals[1]); - } - - /** - * rotate a normal around the origin - * - * @param previous - * @return - */ - public static Point rotateCounterClockwise(Point previous) - { - Point point = new Point(); - - point.x = (int) (previous.x * Math.cos(Math.toRadians(90)) - previous.y * Math.sin(Math.toRadians(90))); - point.y = (int) (previous.x * Math.sin(Math.toRadians(90)) + previous.y * Math.cos(Math.toRadians(90))); - - return point; - } - - /** - * Take an l-system string and convert it into a series of points on a - * cartesian grid. Designed to keep terdragons oriented the same direction - * regardless of iterations - * - * @param angle - * @param system - * @param generations - * @return - */ - public static ArrayList convertToPoints(double angle, String system, int generations) - { - - // determine the starting point and rotation to begin drawing from - int rotation = (generations % 2) == 0 ? 2 : 4; - double[] currentState = { ((generations + rotation) % 4) * 90, 0, 0 }; - - // the output for a totally unordered list of points defining the curve - ArrayList output = new ArrayList(); - - // the stack used to deal with branching l-systems that use [ and ] - ArrayDeque state = new ArrayDeque(); - - // perform the rules corresponding to each symbol in the l-system - for (Character ch : system.toCharArray()) - { - double motion = 1; - - // move forward - if (ch == 'F') - { - currentState[1] -= (Math.cos(Math.toRadians(currentState[0])) * motion); - currentState[2] -= (Math.sin(Math.toRadians(currentState[0])) * motion); - output.add(new double[] { currentState[1], currentState[2] }); - - } - // start branch - if (ch == '[') - { - - state.push(currentState.clone()); - } - // turn left - if (ch == '-') - { - currentState = new double[] { (double) ((currentState[0] - angle) % 360), currentState[1], currentState[2] }; - } - // turn right - if (ch == '+') - { - currentState[0] = ((currentState[0] + angle) % 360); - - } - // end branch and return to previous fork - if (ch == ']') - { - currentState = state.pop(); - } - } - return output; - - } - - /** - * grow and l-system string based on the rules provided in the args - * - * @param start - * @param steps - * @param lSystemsRule - * @return - */ - public static String generate(String start, int steps, HashMap lSystemsRule) - { - - while (steps > 0) - { - StringBuilder output = new StringBuilder(); - - for (Character ch : start.toCharArray()) - { - // get the rule applicable for the variable - String data = lSystemsRule.get(ch.toString()); - - // handle constants for rule-less symbols - if (data == null) - { - data = ch.toString(); - } - output.append(data); - } - steps--; - start = output.toString(); - } - return start; - } - - // a data container class to transmit the important information about the polygon - public static class PolygonStorage - { - public PolygonStorage(ArrayList points, int maxX, int maxY, int minX, int minY) - { - this.points = points; - this.maxX = maxX; - this.maxY = maxY; - this.minX = minX; - this.minY = minY; - } - public ArrayList points; - - public int maxX; - public int maxY; - public int minX; - public int minY; - } - - - public static ArrayList tesselate(PolygonStorage polygon) - { - ArrayList points = new ArrayList(); - - ArrayList polyPoints = new ArrayList(); - - for(int i = 0; i tris =(ArrayList) poly.getTriangles(); - - for(DelaunayTriangle tri : tris) - { - for(TriangulationPoint tpoint : tri.points) - { - points.add(new Point((int)tpoint.getX(),(int) tpoint.getY())); - } - } - return points; - - } - - /** - public static ArrayList tesselate(Polygon polygon) - { - ArrayList points = new ArrayList(); - - Tessellator tess = new Tessellator(); - double[] verticesC1 = new double[polygon.points.size()*3]; - for(int i = 0; i< verticesC1.length; i+=3) - { - Point point = polygon.points.get(i/3); - verticesC1[i]= point.x; - verticesC1[i+1]= point.y; - verticesC1[i+2]= 0; - - } - - tess.gluBeginPolygon(); - - for(int i = 0; i vIndex = prim.vertices; - - if(prim.type==GL11.GL_TRIANGLE_STRIP) - { - for(Integer ii = 0; ii < vIndex.size()-1;ii++) - { - points.add(new Point((int)verticesC1[vIndex.get(ii)*3],(int) verticesC1[vIndex.get(ii)*3+1])); - points.add(new Point((int)verticesC1[vIndex.get(ii+1)*3],(int) verticesC1[vIndex.get(ii+1)*3+1])); - - - } - } - - if(prim.type==GL11.GL_TRIANGLES) - { - for(Integer ii = 0; ii < vIndex.size();ii++) - { - points.add(new Point((int)verticesC1[vIndex.get(ii)*3],(int) verticesC1[vIndex.get(ii)*3+1])); - } - } - - - - - - { - if(prim.type==GL11.GL_TRIANGLE_FAN) - { - Integer firstIndex = vIndex.get(0); - // points.add(new Point((int)verticesC1[vIndex.get(firstIndex)],(int) verticesC1[vIndex.get(firstIndex)+1])); - - Integer[] vertexList = new Integer[vIndex.size()*3]; - for(Integer ii = 0; ii < vIndex.size()-2;ii++) - { - vertexList[ii*3] = vIndex.get(0); - vertexList[ii*3+1] = vIndex.get(ii+1); - vertexList[ii*3+2] = vIndex.get(ii+2); - - - - - } - - for(Integer vertex : vertexList) - { - if(vertex!=null) - { - points.add(new Point((int)(verticesC1[vertex*3]),(int)(verticesC1[vertex*3+1]))); - - } - else - { - break; - } - } - System.out.println(vertexList); - - - } - - //points.add(new Point((int)verticesC1[vIndex.get(firstIndex)],(int) verticesC1[vIndex.get(firstIndex)+1])); - // points.add(new Point((int)verticesC1[vIndex.get(ii)*3],(int) verticesC1[vIndex.get(ii)+1])); - // points.add(new Point((int)verticesC1[vIndex.get(ii+1)*3],(int) verticesC1[vIndex.get(ii+1)*3+1])); - - // points.add(new Point((int)verticesC1[index],(int)verticesC1[index+1])); - // System.out.println(verticesC1[index]+","+verticesC1[index+1]+","+verticesC1[index+2]); - - - - } - //System.out.println(tess.primitives.get(i).toString()); - } - return points; - - } - **/ -} diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java index 1189983..9dc1ab7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderMobObelisk.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDimClient; +import StevenDimDoors.mod_pocketDim.world.LimboProvider; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.entity.RenderLiving; @@ -35,8 +36,11 @@ public class RenderMobObelisk extends RenderLiving final float maxScaling = 0.1f; MobMonolith monolith = ((MobMonolith) entity); - // Use linear interpolation to scale how much jitter we want for our given aggro level - float aggroScaling = minScaling + (maxScaling - minScaling) * monolith.getAggroProgress(); + float aggroScaling = 0; + if (monolith.isDangerous()) { + // Use linear interpolation to scale how much jitter we want for our given aggro level + aggroScaling = minScaling + (maxScaling - minScaling) * monolith.getAggroProgress(); + } // Calculate jitter - include entity ID to give Monoliths individual jitters float time = ((Minecraft.getSystemTime() + 0xF1234568 * monolith.getEntityId()) % 200000) / 50.0F; -- 2.39.5 From 07a986d39d75be8932ee8ea9e0068bcc39923b7a Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 03:50:50 -0500 Subject: [PATCH 27/58] Remove the procedural stuff more completely --- .../mod_pocketDim/mod_pocketDim.java | 1 - .../tileentities/TileEntityRift.java | 2 - .../mod_pocketDimClient/RenderRift.java | 122 ------------------ 3 files changed, 125 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 537d31c..ed80388 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -68,7 +68,6 @@ import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoorGold; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; -import StevenDimDoors.mod_pocketDim.util.l_systems.LSystem; import StevenDimDoors.mod_pocketDim.world.BiomeGenLimbo; import StevenDimDoors.mod_pocketDim.world.BiomeGenPocket; import StevenDimDoors.mod_pocketDim.world.DDBiomeGenBase; diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index 43be0e9..a292a9c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -21,8 +21,6 @@ import StevenDimDoors.mod_pocketDim.core.DimLink; import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.util.Point4D; -import StevenDimDoors.mod_pocketDim.util.l_systems.LSystem; -import StevenDimDoors.mod_pocketDim.util.l_systems.LSystem.PolygonStorage; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; public class TileEntityRift extends DDTileEntityBase diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java index 7c7394c..0344060 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderRift.java @@ -8,8 +8,6 @@ import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityRift; -import StevenDimDoors.mod_pocketDim.util.l_systems.LSystem; -import StevenDimDoors.mod_pocketDim.util.l_systems.LSystem.PolygonStorage; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -44,124 +42,4 @@ public class RenderRift extends TileEntitySpecialRenderer GL11.glPopMatrix(); } - - /** - * method that draws the fractal and applies animations/effects - * - * f - * - * @param riftRotation - * @param poly - * @param size - * @param xWorld - * @param yWorld - * @param zWorld - */ - public void drawCrack(int riftRotation, PolygonStorage poly, double size, double xWorld, double yWorld, double zWorld) - { - // calculate the proper size for the rift render - double scale = size / (poly.maxX - poly.minX); - - // calculate the midpoint of the fractal bounding box - double offsetX = ((poly.maxX + poly.minX)) / 2; - double offsetY = ((poly.maxY + poly.minY)) / 2; - double offsetZ = 0; - - // changes how far the triangles move - float motionMagnitude = 3.0F; - - // changes how quickly the triangles move - float motionSpeed = 2000.0F; - - // number of individual jitter waveforms to generate - // changes how "together" the overall motions are - int jCount = 5; - - // Calculate jitter like for monoliths - float time = (float) (((Minecraft.getSystemTime() + 0xF1234568 * this.hashCode()) % 2000000) / motionSpeed); - double[] jitters = new double[jCount]; - - // generate a series of waveforms - for (int i = 0; i < jCount - 1; i += 1) - { - jitters[i] = Math.sin((1F + i / 10F) * time) * Math.cos(1F - (i / 10F) * time) / motionMagnitude; - jitters[i + 1] = Math.cos((1F + i / 10F) * time) * Math.sin(1F - (i / 10F) * time) / motionMagnitude; - - } - - // determines which jitter waveform we select. Modulo so the same point - // gets the same jitter waveform over multiple frames - int jIndex = 0; - // set the color for the render - GL11.glColor4f(.1F, .1F, .1F, 1F); - - // set the blending mode - GL11.glEnable(GL_BLEND); - glBlendFunc(GL_ONE_MINUS_SRC_COLOR, GL_ONE); - GL11.glBegin(GL11.GL_TRIANGLES); - for (Point p : poly.points) - { - jIndex = Math.abs(((p.x + p.y) * (p.x + p.y + 1) / 2) + p.y); - // jIndex++; - // calculate the rotation for the fractal, apply offset, and apply - // jitter - double x = (((p.x + jitters[(jIndex + 1) % jCount]) - offsetX) * Math.cos(Math.toRadians(riftRotation)) - (jitters[(jIndex + 2) % jCount]) - * Math.sin(Math.toRadians(riftRotation))); - double y = p.y + (jitters[jIndex % jCount]) - offsetY; - double z = (((p.x + jitters[(jIndex + 2) % jCount]) - offsetX) * Math.sin(Math.toRadians(riftRotation)) + (jitters[(jIndex + 2) % jCount]) - * Math.cos(Math.toRadians(riftRotation))); - - // apply scaling - x *= scale; - y *= scale; - z *= scale; - - // apply transform to center the offset origin into the middle of a - // block - x += .5; - y += .5; - z += .5; - - // draw the vertex and apply the world (screenspace) relative - // coordinates - GL11.glVertex3d(xWorld + x, yWorld + y, zWorld + z); - } - GL11.glEnd(); - - GL11.glColor4f(.3F, .3F, .3F, .2F); - - glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); - - // draw the next set of triangles to form a background and change their - // color slightly over time - GL11.glBegin(GL11.GL_TRIANGLES); - for (Point p : poly.points) - { - jIndex++; - - double x = (((p.x) - offsetX) * Math.cos(Math.toRadians(riftRotation)) - 0 * Math.sin(Math.toRadians(riftRotation))); - double y = p.y - offsetY; - double z = (((p.x) - offsetX) * Math.sin(Math.toRadians(riftRotation)) + 0 * Math.cos(Math.toRadians(riftRotation))); - - x *= scale; - y *= scale; - z *= scale; - - x += .5; - y += .5; - z += .5; - - if (jIndex % 3 == 0) - { - // GL11.glColor4d(1-jitters[(jIndex + 5) % jCount] / 11,1- - // jitters[(jIndex + 4) % jCount] / 8, 1-jitters[(jIndex+3) % - // jCount] / 8, 1); - } - GL11.glVertex3d(xWorld + x, yWorld + y, zWorld + z); - } - - // stop drawing triangles - GL11.glEnd(); - - } } \ No newline at end of file -- 2.39.5 From c72a03b5587a9df6efe9149298e98ab0aed05550 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 04:03:45 -0500 Subject: [PATCH 28/58] Fixed limbo music --- .../StevenDimDoors/mod_pocketDim/EventHookContainer.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index d2875db..e693738 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -87,7 +87,7 @@ public class EventHookContainer public void onSoundEffectResult(PlaySoundEvent17 event) { ResourceLocation playingSound = event.sound.getPositionedSoundLocation(); - if (playingSound != null && playingSound.getResourceDomain().equals("minecraft") && playingSound.getResourcePath().equals("music.game")) { + if (playingSound != null && playingSound.getResourceDomain().equals("minecraft") && (playingSound.getResourcePath().equals("music.game") || playingSound.getResourcePath().equals("music.game.creative"))) { if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID) { ResourceLocation sound = new ResourceLocation(mod_pocketDim.modid + ":creepy"); @@ -145,11 +145,8 @@ public class EventHookContainer PocketManager.load(); } - if (FMLClientHandler.instance().getClient().thePlayer == null) - return; - - if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID && - !Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(limboMusic)) { + if (event.world.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID && + event.world.isRemote && !Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(limboMusic)) { Minecraft.getMinecraft().getSoundHandler().playSound(limboMusic); } } -- 2.39.5 From 7c11003686e52a1b65d88c9a18e298f85df634a1 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 04:20:29 -0500 Subject: [PATCH 29/58] Key monolith behavior in to config file --- .../StevenDimDoors/mod_pocketDim/config/DDProperties.java | 4 ++++ .../StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index 949ee8e..7b34129 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -64,6 +64,7 @@ public class DDProperties public final boolean DoorRenderingEnabled; public final boolean TNFREAKINGT_Enabled; public final boolean MonolithTeleportationEnabled; + public final boolean DangerousLimboMonolithsDisabled; /** @@ -160,6 +161,9 @@ public class DDProperties MonolithTeleportationEnabled = config.get(Configuration.CATEGORY_GENERAL, "Enable Monolith Teleportation", true, "Sets whether Monoliths can teleport players").getBoolean(true); + + DangerousLimboMonolithsDisabled = config.get(Configuration.CATEGORY_GENERAL, "Docile Monoliths in Limbo", true, + "Sets whether monoliths in Limbo stare at the player rather than attack").getBoolean(true); MonolithSpawningChance = config.get(Configuration.CATEGORY_GENERAL, "Monolith Spawning Chance", 28, "Sets the chance (out of " + CustomLimboPopulator.MAX_MONOLITH_SPAWNING_CHANCE + ") that Monoliths will " + diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 34bb72e..8f74b47 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -51,7 +51,7 @@ public class MobMonolith extends EntityFlying implements IMob } public boolean isDangerous() { - return properties.LimboDimensionID != worldObj.provider.dimensionId; + return properties.MonolithTeleportationEnabled && (properties.LimboDimensionID != worldObj.provider.dimensionId || !properties.DangerousLimboMonolithsDisabled); } @Override -- 2.39.5 From e15bfbd2d14d2c84d14e6b09a6b5bb1050586b7c Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 04:28:31 -0500 Subject: [PATCH 30/58] Some tweaks to the monolith- make it look great. --- .../mod_pocketDim/ticking/MobMonolith.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java index 8f74b47..b259375 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ticking/MobMonolith.java @@ -131,7 +131,7 @@ public class MobMonolith extends EntityFlying implements IMob public void onEntityUpdate() { // Remove this Monolith if it's not in Limbo or in a pocket dimension - if (!(this.worldObj.provider instanceof LimboProvider || this.worldObj.provider instanceof PocketProvider)) + if (!(this.worldObj.provider.dimensionId == properties.LimboDimensionID|| this.worldObj.provider instanceof PocketProvider)) { this.setDead(); super.onEntityUpdate(); @@ -191,12 +191,12 @@ public class MobMonolith extends EntityFlying implements IMob // Rapidly increase the aggro level if this Monolith can see the player if (visibility) { - if (this.worldObj.provider instanceof LimboProvider) + if (this.worldObj.provider.dimensionId == properties.LimboDimensionID) { if (isDangerous()) aggro++; else - aggro += 18; + aggro += 36; } else { @@ -206,16 +206,16 @@ public class MobMonolith extends EntityFlying implements IMob } else { - if (aggro > aggroCap) - { - // Decrease aggro over time - aggro--; - } - else if (player != null && (aggro < aggroCap)) - { - // Increase aggro if a player is within range and aggro < aggroCap - aggro++; - } + if (isDangerous()) { + if (aggro > aggroCap) { + // Decrease aggro over time + aggro--; + } else if (player != null && (aggro < aggroCap)) { + // Increase aggro if a player is within range and aggro < aggroCap + aggro++; + } + } else + aggro -= 3; } // Clamp the aggro level int maxAggro = isDangerous()?MAX_AGGRO:180; @@ -244,7 +244,7 @@ public class MobMonolith extends EntityFlying implements IMob float aggroPercent = this.getAggroProgress(); if (this.soundTime <= 0) { - this.playSound(mod_pocketDim.modid + ":monk", 1F, 1F); + this.playSound(mod_pocketDim.modid + ":monk", 1F, 1F); this.soundTime = 100; } if ((aggroPercent > 0.70) && this.soundTime < 100) -- 2.39.5 From f9addaf1158841d17ad2c0451b0d327378e6c6b6 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 05:17:09 -0500 Subject: [PATCH 31/58] Update these field names --- src/main/resources/mcmod.info | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 7a43be9..04b8a3e 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,6 +1,6 @@ { -"modinfoversion":2, -"modlist": +"modListVersion":2, +"modList": [ { "modid": "dimdoors", @@ -12,7 +12,7 @@ "mcversion": "$mcversion", "url": "http://www.minecraftforum.net/topic/1650007-147smpssplan-dimensional-doors-v110-physics-what-physics-updated-with-fancy-opengl/", "updateUrl": "", -"authors": [ "StevenRS11", "SenseiKiwi" ], +"authorList": [ "StevenRS11", "SenseiKiwi" ], "parent":"", "screenshots": [], "dependencies": [ "Forge"] -- 2.39.5 From 6aeed2c0e5201dea16bc2eb97c1983a867cf6007 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 05:50:49 -0500 Subject: [PATCH 32/58] Fix version --- src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 2 +- src/main/resources/mcmod.info | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index ed80388..e41efd6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -94,7 +94,7 @@ import cpw.mods.fml.relauncher.Side; @Mod(modid = mod_pocketDim.modid, name = "Dimensional Doors", version = mod_pocketDim.version) public class mod_pocketDim { - public static final String version = "@VERSION@"; + public static final String version = "2.2.5-test"; public static final String modid = "dimdoors"; //TODO need a place to stick all these constants diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 04b8a3e..891a327 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -6,10 +6,10 @@ "modid": "dimdoors", "name": "Dimensional Doors", "description": "Bend and twist reality itself, creating pocket dimensions, rifts, and much more", -"version": "$version", +"version": "2.2.5-test", "credits": "Created by StevenRS11, Coded by StevenRS11 and SenseiKiwi, Logo and Testing by Jaitsu", "logoFile": "/dimdoors_logo.png", -"mcversion": "$mcversion", +"mcversion": "1.7.10", "url": "http://www.minecraftforum.net/topic/1650007-147smpssplan-dimensional-doors-v110-physics-what-physics-updated-with-fancy-opengl/", "updateUrl": "", "authorList": [ "StevenRS11", "SenseiKiwi" ], -- 2.39.5 From 8073ee6a32f0637e6d75e1b4d7c6fd72dbb519c1 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 08:57:08 -0500 Subject: [PATCH 33/58] Localize ALL THE THINGS! --- .../mod_pocketDim/config/DDProperties.java | 2 - .../mod_pocketDim/items/ItemBlockDimWall.java | 2 +- .../mod_pocketDim/items/ItemDDKey.java | 4 +- .../items/ItemDimensionalDoor.java | 5 +- .../mod_pocketDim/items/ItemGoldDimDoor.java | 4 +- .../mod_pocketDim/items/ItemPersonalDoor.java | 5 +- .../mod_pocketDim/items/ItemRiftBlade.java | 3 +- .../items/ItemRiftSignature.java | 7 +-- .../items/ItemStabilizedRiftSignature.java | 8 +-- .../mod_pocketDim/items/ItemUnstableDoor.java | 3 +- .../mod_pocketDim/items/ItemWarpDoor.java | 5 +- .../mod_pocketDim/items/itemRiftRemover.java | 4 +- .../mod_pocketDim/mod_pocketDim.java | 56 ++++------------- .../resources/assets/dimdoors/lang/en_US.lang | 59 ++++++++++++++++++ .../dimdoors/textures/mobs/Monolith.psd | Bin 111831 -> 0 bytes .../dimdoors/textures/mobs/Monolith0.png | Bin 3382 -> 0 bytes .../dimdoors/textures/mobs/Monolith1.png | Bin 3585 -> 0 bytes .../dimdoors/textures/mobs/Monolith10.png | Bin 4210 -> 0 bytes .../dimdoors/textures/mobs/Monolith11.png | Bin 4230 -> 0 bytes .../dimdoors/textures/mobs/Monolith12.png | Bin 4295 -> 0 bytes .../dimdoors/textures/mobs/Monolith13.png | Bin 4336 -> 0 bytes .../dimdoors/textures/mobs/Monolith14.png | Bin 4371 -> 0 bytes .../dimdoors/textures/mobs/Monolith15.png | Bin 4490 -> 0 bytes .../dimdoors/textures/mobs/Monolith16.png | Bin 4594 -> 0 bytes .../dimdoors/textures/mobs/Monolith17.png | Bin 4598 -> 0 bytes .../dimdoors/textures/mobs/Monolith18.png | Bin 4984 -> 0 bytes .../dimdoors/textures/mobs/Monolith2.png | Bin 3602 -> 0 bytes .../dimdoors/textures/mobs/Monolith3.png | Bin 3659 -> 0 bytes .../dimdoors/textures/mobs/Monolith4.png | Bin 3943 -> 0 bytes .../dimdoors/textures/mobs/Monolith5.png | Bin 3978 -> 0 bytes .../dimdoors/textures/mobs/Monolith6.png | Bin 3971 -> 0 bytes .../dimdoors/textures/mobs/Monolith7.png | Bin 3998 -> 0 bytes .../dimdoors/textures/mobs/Monolith8.png | Bin 4065 -> 0 bytes .../dimdoors/textures/mobs/Monolith9.png | Bin 4112 -> 0 bytes .../assets/dimdoors/textures/mobs/eye.psd | Bin 52196 -> 0 bytes .../mobs/newer Monolith/Monolith0.png | Bin 3382 -> 0 bytes .../mobs/newer Monolith/Monolith1.png | Bin 3628 -> 0 bytes .../mobs/newer Monolith/Monolith10.png | Bin 4390 -> 0 bytes .../mobs/newer Monolith/Monolith11.png | Bin 4404 -> 0 bytes .../mobs/newer Monolith/Monolith12.png | Bin 4467 -> 0 bytes .../mobs/newer Monolith/Monolith13.png | Bin 4522 -> 0 bytes .../mobs/newer Monolith/Monolith14.png | Bin 4603 -> 0 bytes .../mobs/newer Monolith/Monolith15.png | Bin 4730 -> 0 bytes .../mobs/newer Monolith/Monolith16.png | Bin 4887 -> 0 bytes .../mobs/newer Monolith/Monolith17.png | Bin 4910 -> 0 bytes .../mobs/newer Monolith/Monolith18.png | Bin 5321 -> 0 bytes .../mobs/newer Monolith/Monolith2.png | Bin 3628 -> 0 bytes .../mobs/newer Monolith/Monolith3.png | Bin 3735 -> 0 bytes .../mobs/newer Monolith/Monolith4.png | Bin 4024 -> 0 bytes .../mobs/newer Monolith/Monolith5.png | Bin 4112 -> 0 bytes .../mobs/newer Monolith/Monolith6.png | Bin 4114 -> 0 bytes .../mobs/newer Monolith/Monolith7.png | Bin 4146 -> 0 bytes .../mobs/newer Monolith/Monolith8.png | Bin 4228 -> 0 bytes .../mobs/newer Monolith/Monolith9.png | Bin 4277 -> 0 bytes .../textures/mobs/oldMonolith/Monolith.psd | Bin 116238 -> 0 bytes .../textures/mobs/testMonolith/Monolith10.png | Bin 4210 -> 0 bytes .../textures/mobs/testMonolith/Monolith11.png | Bin 4230 -> 0 bytes .../textures/mobs/testMonolith/Monolith12.png | Bin 4295 -> 0 bytes .../textures/mobs/testMonolith/Monolith13.png | Bin 4336 -> 0 bytes .../textures/mobs/testMonolith/Monolith14.png | Bin 4371 -> 0 bytes .../textures/mobs/testMonolith/Monolith15.png | Bin 4490 -> 0 bytes .../textures/mobs/testMonolith/Monolith16.png | Bin 4594 -> 0 bytes .../textures/mobs/testMonolith/Monolith17.png | Bin 4598 -> 0 bytes .../textures/mobs/testMonolith/Monolith18.png | Bin 4984 -> 0 bytes .../textures/mobs/testMonolith/Monolith2.png | Bin 3602 -> 0 bytes .../textures/mobs/testMonolith/Monolith3.png | Bin 3659 -> 0 bytes .../textures/mobs/testMonolith/Monolith4.png | Bin 3943 -> 0 bytes .../textures/mobs/testMonolith/Monolith5.png | Bin 3978 -> 0 bytes .../textures/mobs/testMonolith/Monolith6.png | Bin 3971 -> 0 bytes .../textures/mobs/testMonolith/Monolith7.png | Bin 3998 -> 0 bytes .../textures/mobs/testMonolith/Monolith8.png | Bin 4065 -> 0 bytes .../textures/mobs/testMonolith/Monolith9.png | Bin 4112 -> 0 bytes .../textures/mobs/testMonolith/monolith0.png | Bin 3382 -> 0 bytes .../textures/mobs/testMonolith/monolith1.png | Bin 3585 -> 0 bytes 74 files changed, 89 insertions(+), 78 deletions(-) create mode 100644 src/main/resources/assets/dimdoors/lang/en_US.lang delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith.psd delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith0.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith1.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith10.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith11.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith12.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith13.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith14.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith15.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith16.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith17.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith18.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith2.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith3.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith4.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith5.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith6.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith7.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith8.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/Monolith9.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/eye.psd delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith0.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith1.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith10.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith11.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith12.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith13.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith14.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith15.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith16.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith17.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith18.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith2.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith3.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith4.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith5.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith6.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith7.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith8.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith9.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/oldMonolith/Monolith.psd delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith10.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith11.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith12.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith13.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith14.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith15.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith16.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith17.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith18.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith2.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith3.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith4.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith5.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith6.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith7.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith8.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith9.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/monolith0.png delete mode 100644 src/main/resources/assets/dimdoors/textures/mobs/testMonolith/monolith1.png diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java index 7b34129..3816a6d 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/config/DDProperties.java @@ -65,7 +65,6 @@ public class DDProperties public final boolean TNFREAKINGT_Enabled; public final boolean MonolithTeleportationEnabled; public final boolean DangerousLimboMonolithsDisabled; - /** * Other @@ -82,7 +81,6 @@ public class DDProperties public final int WorldThreadRequirementLevel; public final String CustomSchematicDirectory; - //Singleton instance private static DDProperties instance = null; //Path for custom dungeons within configuration directory diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java index 0075035..434ee1c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemBlockDimWall.java @@ -8,7 +8,7 @@ import StevenDimDoors.mod_pocketDim.mod_pocketDim; public class ItemBlockDimWall extends ItemBlock { - private final static String[] subNames = {"Fabric of Reality", "Ancient Fabric" , "Altered Fabric"}; + private final static String[] subNames = {"tile.blockDimWall", "tile.blockAncientWall" , "tile.blockAlteredWall"}; public ItemBlockDimWall(Block block) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java index dcc7eb4..bcee2eb 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java @@ -45,11 +45,11 @@ public class ItemDDKey extends Item { if (DDLock.hasCreatedLock(par1ItemStack)) { - par3List.add("Bound"); + par3List.add(StatCollector.translateToLocal("info.riftkey.bound")); } else { - par3List.add("Unbound"); + par3List.add(StatCollector.translateToLocal("info.riftkey.unbound")); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java index 945ddd3..bb4c69c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDimensionalDoor.java @@ -21,10 +21,7 @@ public class ItemDimensionalDoor extends BaseItemDoor @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Place on the block under a rift"); - par3List.add("to activate that rift or place"); - par3List.add("anywhere else to create a"); - par3List.add("pocket dimension."); + mod_pocketDim.translateAndAdd("info.dimDoor",par3List); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java index 92514b8..c2114d4 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemGoldDimDoor.java @@ -22,9 +22,7 @@ public class ItemGoldDimDoor extends BaseItemDoor @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Similar to a Dimensional Door"); - par3List.add("but keeps a pocket dimension"); - par3List.add("loaded if placed on the inside."); + mod_pocketDim.translateAndAdd("info.goldDimDoor", par3List); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java index f8c6577..212c4f9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemPersonalDoor.java @@ -21,10 +21,7 @@ public class ItemPersonalDoor extends BaseItemDoor @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Creates a pathway to"); - par3List.add("Your personal pocket"); - - + mod_pocketDim.translateAndAdd("info.personalDimDoor", par3List); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java index 162479d..03e83ed 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftBlade.java @@ -184,7 +184,6 @@ public class ItemRiftBlade extends ItemSword @SideOnly(Side.CLIENT) public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Opens temporary doors on rifts"); - par3List.add("and has a teleport attack."); + mod_pocketDim.translateAndAdd("info.riftblade", par3List); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java index 7a30b0d..fd29e56 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemRiftSignature.java @@ -8,6 +8,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -118,13 +119,11 @@ public class ItemRiftSignature extends Item Point4DOrientation source = getSource(par1ItemStack); if (source != null) { - par3List.add("Leads to (" + source.getX() + ", " + source.getY() + ", " + source.getZ() + ") at dimension #" + source.getDimension()); + par3List.add(StatCollector.translateToLocalFormatted("info.riftSignature.bound", source.getX(), source.getY(), source.getZ(), source.getDimension())); } else { - par3List.add("First click stores a location;"); - par3List.add("second click creates a pair of"); - par3List.add("rifts linking the two locations."); + mod_pocketDim.translateAndAdd("info.riftSignature.unbound", par3List); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java index 62dbfd4..63801ac 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemStabilizedRiftSignature.java @@ -8,6 +8,7 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -169,13 +170,12 @@ public class ItemStabilizedRiftSignature extends ItemRiftSignature Point4DOrientation source = getSource(par1ItemStack); if (source != null) { - par3List.add("Leads to (" + source.getX() + ", " + source.getY() + ", " + source.getZ() + ") at dimension #" + source.getDimension()); + String text = StatCollector.translateToLocalFormatted("info.riftSignature.bound", source.getX(), source.getY(), source.getZ(), source.getDimension()); + par3List.add(text); } else { - par3List.add("First click stores a location,"); - par3List.add("other clicks create rifts linking"); - par3List.add("the first and last locations together."); + mod_pocketDim.translateAndAdd("info.riftSignature.stable", par3List); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java index dd3b02c..aad3e52 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemUnstableDoor.java @@ -6,6 +6,7 @@ import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; @@ -21,7 +22,7 @@ public class ItemUnstableDoor extends BaseItemDoor @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Caution: Leads to random destination"); + par3List.add(StatCollector.translateToLocal("info.chaosDoor")); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java index 4f24600..206dc24 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemWarpDoor.java @@ -21,10 +21,7 @@ public class ItemWarpDoor extends BaseItemDoor @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Place on the block under"); - par3List.add("a rift to create a portal,"); - par3List.add("or place anywhere in a"); - par3List.add("pocket dimension to exit."); + mod_pocketDim.translateAndAdd("info.warpDoor",par3List); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java index dfad4f0..8d380dc 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/itemRiftRemover.java @@ -130,8 +130,6 @@ public class itemRiftRemover extends Item @Override public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) { - par3List.add("Use near exposed rift"); - par3List.add("to remove it and"); - par3List.add("any nearby rifts."); + mod_pocketDim.translateAndAdd("info.riftRemover",par3List); } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index e41efd6..db026a5 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -1,6 +1,7 @@ package StevenDimDoors.mod_pocketDim; import java.io.File; +import java.util.List; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import cpw.mods.fml.common.FMLCommonHandler; @@ -14,6 +15,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemDoor; import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.StatCollector; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.ForgeChunkManager; @@ -161,12 +163,6 @@ public class mod_pocketDim { return mod_pocketDim.itemDimensionalDoor; } - - @Override - public String getTranslatedTabLabel() - { - return "Dimensional Doors"; - } }; @EventHandler @@ -272,43 +268,6 @@ public class mod_pocketDim throw new IllegalStateException("There is a provider ID conflict between PersonalPocketProvider from Dimensional Doors and another provider type. Fix your configuration!"); DimensionManager.registerDimension(properties.LimboDimensionID, properties.LimboProviderID); - - LanguageRegistry.addName(goldenDoor, "Golden Door"); - LanguageRegistry.addName(goldenDimensionalDoor, "Golden Dimensional Door"); - LanguageRegistry.addName(transientDoor , "Transient Door"); - LanguageRegistry.addName(blockRift , "Rift"); - LanguageRegistry.addName(blockLimbo , "Unraveled Fabric"); - LanguageRegistry.addName(warpDoor , "Warp Door"); - LanguageRegistry.addName(unstableDoor , "Unstable Door"); - LanguageRegistry.addName(blockDimWall , "Fabric of Reality"); - LanguageRegistry.addName(blockDimWallPerm , "Eternal Fabric"); - LanguageRegistry.addName(dimensionalDoor, "Dimensional Door"); - LanguageRegistry.addName(transTrapdoor, "Transdimensional Trapdoor"); - - LanguageRegistry.addName(itemWarpDoor, "Warp Door"); - LanguageRegistry.addName(itemRiftSignature, "Rift Signature"); - LanguageRegistry.addName(itemGoldenDoor, "Golden Door"); - LanguageRegistry.addName(itemGoldenDimensionalDoor, "Golden Dimensional Door"); - LanguageRegistry.addName(itemStabilizedRiftSignature, "Stabilized Rift Signature"); - LanguageRegistry.addName(itemRiftRemover, "Rift Remover"); - LanguageRegistry.addName(itemStableFabric, "Stable Fabric"); - LanguageRegistry.addName(itemUnstableDoor, "Unstable Door"); - LanguageRegistry.addName(itemDimensionalDoor, "Dimensional Door"); - LanguageRegistry.addName(itemRiftBlade, "Rift Blade"); - LanguageRegistry.addName(itemWorldThread, "World Thread"); - LanguageRegistry.addName(itemDDKey, "Rift Key"); - LanguageRegistry.addName(itemQuartzDoor, "Quartz Door"); - LanguageRegistry.addName(itemPersonalDoor, "Personal Dimensional Door"); - - - /** - * Add names for multiblock inventory item - */ - LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 0), "Fabric of Reality"); - LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 1), "Ancient Fabric"); - LanguageRegistry.addName(new ItemStack(blockDimWall, 1, 2), "Altered Fabric"); - - LanguageRegistry.instance().addStringLocalization("itemGroup.dimDoorsCustomTab", "en_US", "Dimensional Doors Items"); GameRegistry.registerTileEntity(TileEntityDimDoor.class, "TileEntityDimDoor"); GameRegistry.registerTileEntity(TileEntityRift.class, "TileEntityRift"); @@ -318,7 +277,6 @@ public class mod_pocketDim EntityRegistry.registerModEntity(MobMonolith.class, "Monolith", properties.MonolithEntityID, this, 70, 1, true); EntityList.IDtoClassMapping.put(properties.MonolithEntityID, MobMonolith.class); EntityList.entityEggs.put(properties.MonolithEntityID, new EntityList.EntityEggInfo(properties.MonolithEntityID, 0, 0xffffff)); - LanguageRegistry.instance().addStringLocalization("entity.dimdoors.Monolith.name", "Monolith"); CraftingManager.registerRecipes(properties); CraftingManager.registerDispenserBehaviors(); @@ -334,6 +292,16 @@ public class mod_pocketDim proxy.registerRenderers(); } + public static void translateAndAdd(String key, List list) { + for (int i=0;i<10;i++) { + if (StatCollector.canTranslate(key+Integer.toString(i))) { + String line = StatCollector.translateToLocal(key + Integer.toString(i)); + list.add(line); + } else + break; + } + } + @EventHandler public void onPostInitialization(FMLPostInitializationEvent event) { diff --git a/src/main/resources/assets/dimdoors/lang/en_US.lang b/src/main/resources/assets/dimdoors/lang/en_US.lang new file mode 100644 index 0000000..5be8614 --- /dev/null +++ b/src/main/resources/assets/dimdoors/lang/en_US.lang @@ -0,0 +1,59 @@ +itemGroup.dimDoorsCreativeTab=Dimensional Doors Items +tile.doorGold.name=Golden Door +tile.transientDoor.name=Transient Door +tile.dimDoorGold.name=Golden Dimensional Door +tile.quartzDoor.name=Quartz Door +tile.dimDoorPersonal.name=Personal Dimensional Door +tile.blockDimWall.name=Fabric of Reality +tile.blockAlteredWall.name=Altered Fabric +tile.blockAncientWall.name=Ancient Fabric +tile.blockDimWallPerm.name=Eternal Fabric +tile.dimDoorWarp.name=Warp Door +tile.rift.name=Rift +tile.BlockLimbo.name=Unraveled Fabric +tile.chaosDoor.name=Unstable Door +tile.dimDoor.name=Dimensional Door +tile.dimHatch.name=Transdimensional Trapdoor +item.itemGoldDoor.name=Golden Door +item.itemDDKey=Rift Key +item.itemQuartzDoor.name=Quartz Door +item.itemQuartzDimDoor.name=Personal Dimensional Door +item.itemGoldDimDoor.name=Golden Dimensional Door +item.itemDimDoor.name=Dimensional Door +item.itemDimDoorWarp.name=Warp Door +item.itemLinkSignature.name=Rift Signature +item.itemStabilizedRiftSig.name=Stabilized Rift Signature +item.itemRiftRemover.name=Rift Remover +item.itemStableFabric.name=Stable Fabric +item.itemChaosDoor.name=Unstable Door +item.ItemRiftBlade.name=Rift Blade +item.itemWorldThread.name=World Thread +info.riftkey.bound=Bound +info.riftkey.unbound=Unbound +info.dimDoor0=Place on the block under a rift +info.dimDoor1=to activate that rift or place +info.dimDoor2=anywhere else to create a +info.dimDoor3=pocket dimension. +info.goldDimDoor0=Similar to a Dimensional Door +info.goldDimDoor1=but keeps a pocket dimension +info.goldDimDoor2=loaded if placed on the inside. +info.personalDimDoor0=Creates a pathway to +info.personalDimDoor1=your personal pocket +info.riftblade0=Opens temporary doors on rifts +info.riftblade1=and has a teleport attack. +info.riftRemover0=Use near exposed rift +info.riftRemover1=to remove it and +info.riftRemover2=any nearby rifts. +info.riftSignature.bound=Leads to (%d, %d, %d) at dimension #%d +info.riftSignature.unbound0=First click stores a location; +info.riftSignature.unbound1=second click creates a pair of +info.riftSignature.unbound2=rifts linking the two locations. +info.riftSignature.stable0=First click stores a location, +info.riftSignature.stable1=other clicks create rifts linking +info.riftSignature.stable2=the first and last locations together. +info.chaosDoor=Caution: Leads to random destination +info.warpDoor0=Place on the block under +info.warpDoor1=a rift to create a portal, +info.warpDoor2=or place anywhere in a +info.warpDoor3=pocket dimension to exit. +entity.dimdoors.Monolith.name=Monolith \ No newline at end of file diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith.psd b/src/main/resources/assets/dimdoors/textures/mobs/Monolith.psd deleted file mode 100644 index 72510aa3251a9c9c80ff6b8e51da53b90939b299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111831 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith0.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith0.png deleted file mode 100644 index ec09cbe6df4dbfe528b5db6fab4c2617973381dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3382 zcmeH})n63)7R7%E(k0S}hc4-qh8a2q24^T?r~wfPQA%*=JRl3cYj3!zaM!k%x~jk0BJwJnQ&P~$ zEEeLliPX~+tGsVgqTa?Q4xB87zV(`HCaw>k*H39|R32dJMkv}SX)_JvEELeRWssZK zzD4zR^(?JQYDG{B_yR`CI#=FDXZ$4KI9yHb7GE31XFw7(PD2UWO!L~LZ^T_NY(aAD zNzlQfB*5+^ zFAGUQ8sNF^7Ow+5R6*s)-9%l0kOs`|#$C!_S^`KL!rcu(O#^7dGt$%oN?IUo5g#K8 z$U=crA3uK(h|U4bdi!v-e{NMXZirnbl~b#R6HwNTu%ndlqkzLDZ;Idz*={i_BCjBG zwIn-&b2wxp!C4TVz8a5LOu^DSN^G@~U+_6Qubi)qRQPHEuoMtJ zdM++i$B9-YM|+>Y5!@y7xJOg)n3&{V%b-;c3N~lq2fqJiqg(hKH#4)gx;kyt1+ha8 zz{Ac_9gc1Avj@Mz)lP{=-##x3M94Zs=#w3P>livTDY`N8f-2g1Zar21w1MX0lzW`7 z%g`Bz5My4kVDd}R$xS|xE#ganyb$dc9J_E`UKBqe)mT&jHTN}0LenHl9b8C%8VfTb z0@{{|0PHvUw0{+$Bt?5fEsX?T>}j6q7YG8hyWtBz0Pg7sNWuo{G@ENBm z7|2*A!g#C=xcAlluPDda>oumS_5s<*)7WNxnU@i@7V2MV>!G+(CC+HQH#A>d17vbj zSqt*M_M&vGNoRZVhoLkb}0!kB|v3`anG+9es~8PV;a*NduYkODPEQ*Z@|f) z-aqT=RZF4#Qk>^jU(70IwR2T&m1~uE-;NsNtmXIa*lJnCa^SuZ#~S0B{2IAiwyd`G z+g!`}(n8oZg;ZNeRUy{$y+vHuzZ!*R?J=i>mp6|a0G+vv}xM`O4 z1wJ;ossBCeJLzE{EnO^2RBt>=gd>lgf*r*X$o@Xtq?ltoiK7=Ltt7LZy^+I^<715w z!-_p+NgJTfFv<|h;1ZL9m6aElFO<_*A6O5d)^9>3-JmW zn{Juz=31KKibac6O;k;KhlhsW3{U1L8Nl4~V6vvjkH{7F=2%|F}tDE5G>FwS0uiMixw_>-fTi=GM}fC&zk#$$6Hoir9~#{McQ*eNI9=*Iu^Bs zT6cdkSm_p1d*1ypsX^*y21UPD-Sf(;HWJiWNbz@=t;m!ZMJ>t=?%q0_Frb`Sk$-D= zXQ*y~@LcKD-s_7UrVgg17ucd$W4Hu2V!fsEzH+UaUoe4sh2`q4*t_JFYM&CZV%`(x z6+7^(>hKn!5L2&+d+h^}?e!#H+cehHYcXNlb5lDG<_Ia9#d_rLSPYj2OG08bGl4CO z<=M2zT+kX-U>`F(YQS2u}Ni^Q9BDzi_LLo1gk#{YW4jpCNN56Run z)yuQWJ+X7PYcwCy7@gc&2sza!{KfD}Ud<-h=m6I5IlCD-o{ridNycPg!onqg%{dX? zU_&=t@Qe2ueD)d{1D3{gFOoJ?n^p1l`=0{#YYA)D;h*5S?^PVVw*t1*&eO-udz)T0 zPoBE%l-9#7(YzCH(whOYlFe7n2kD%Ifni2O&PhZsO4*>wLJs@ELxvX(mv3 zx2oB^+3`?oM|%c3A2*?CcRn}0H}~v*TVTP#=$t;0JSJ-7Jnblz0eUqxCv`BEE_OTr zwuZ9uvZnvp=4lCZ#C1d{pY8n3`Cv60t5o>$#P$?^G<&o#YdFF0_q}d0jE^-ot z%f89uVqj?sK!_j!=qLbwU0muW0FR{s*m43uB^v-XpBIkZdH`HO8tQ1nf@XhwmAUM# zl%3LTts6){A;1*!F`fB8;|72numdN6Cizq5&yoJO(f^TuE`dKs0$Eo9xVRt%8v|r# UMt3N^E*}#Z>YC|PL!2W23-Ta%9{>OV diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith1.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith1.png deleted file mode 100644 index 54215c2dcab96664f1e6a3af72deb4648fd29393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3585 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith10.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith10.png deleted file mode 100644 index 5460b622002eb9aa3096d537df5a1a60a105794d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4210 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 u@t-|XOg#a#HJo|qkV zWbZxB2p30*8LK5G0wwd+lMU1EC=D9#ncJ-;%FXFM-q^NKuLtei1;R}iq#wf82s>lM z8ykz4=d1neyID$tfI>OVxX<3Z#-^gCrgTZG?P|x{XeYOWVG^#FN^!{GhO zv1ZETyC32F;7^X>LR|k(feCxg;}5k{@c!e~2wd83?Xutg0db7msj>}D3Y9n!oECrN z94Cwt&SlLFJ0Z^2IgST?dd-+LU|}yM{6zi1z*3v9(kOZ4T(sz diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith11.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith11.png deleted file mode 100644 index cb0152826e2578756bbf0a31bcecef5116602d5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4230 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith14.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith14.png deleted file mode 100644 index 6757ad380f78544f4937070bb1188abdbd320cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4371 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith15.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith15.png deleted file mode 100644 index 3acb2e9e613549dbd9c4f1eb0915602d339d610e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4490 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith16.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith16.png deleted file mode 100644 index 59f2d23f60fdb4eaaaae3cccfec5d540784c3e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4594 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 I2JVmk2Lpo;*Z=?k diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith17.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith17.png deleted file mode 100644 index 305166f491fec43994a9918130016ae8754517ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 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 M$kMRJ!0q9G03>bu+W-In diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith18.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith18.png deleted file mode 100644 index b02ffcf50f51484ccf646c3ce61a3ebead4eff83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4984 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 P1~9s7s#mGw{QQ3aidX%k diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith2.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith2.png deleted file mode 100644 index 6b4d956ee26dc9eb0834f52d0ded6b5460384469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3602 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 F{{pe1=^g+8 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith3.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith3.png deleted file mode 100644 index e45e6c0349d40b6c5d19807bf5d6aa50d3d54f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3659 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith4.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith4.png deleted file mode 100644 index a1b1df6e2a3fc3edfcde3cf277f40b9e62fc3fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3943 zcmdT{S2P@a^Zsp!UZX_~A&BTTI=gxemQ|yLRl;fsAy`BUAtHJfDeAIXvZ6(A(SodA zqD2srC|Qa2dC&Qu|IK&%-h6Y;oaecEX689_F_U=9M3dBbNp=rvX zJd9srdb@g-R>d`!~;OephZixXWp~$b}0F61!34;K; z=X@-X!Zg6k3n*xSq*+4j zbwC;hocj3rL%^dPz^t>2Q2BKO$FMGP?o>{#N`ru+c9b23m_IoJAE}A zbFPMX$AcVp=_pzHFMERk6sED9PrG*#GE9dX9+pqR(>aQ5wvwG)b#YlaT^qsrX#lVk z6ft@#DpALQRwhIHoW8oYL+Wvxy6_$`$-S0d;~gm6m_h9M{o{@H%cl*~(`&1%QwCj7 zJLivx@Ka=mV;kb+?w<&iW8%S=56c2k(hgC&q=#QR2KSAMxJI5)K607+nyPzTPknaG zJ$|)I-=)D?gn7m6l7EU;Zt|XV(bYugv+Ld0#?J06FNz+Ks4dEYYA-cNSejU=gDc5z zLm>w1ptfZq0J}}7_Rqo;BxsMArIFyXAL=K%h1USuUH_Rs0JpUS#Ni+7)O#ra&?<}) zsn+D&Z@(E*h&5oRG_N^$^fOhgXRiwx?T|t6^7^tA-u?t; zv#W+_a(YtckKw$QdfdCJ0T&eG?R6T{l>2~m^l@CXuGI6WS~JzpH1A*yr3xI6bY4+^ zx)UUoo61_4_bK2lhibC?%k@uK5Bix@HCV4?+qcW)GF^8i#d|uTH8({m(_IH@u2#@s zdpN4CDoC0V4_rrTf=Mq$X}3|zlLkY1oq06%tc|Qqru0gAxddbxXDAgYNgkPX2whDt zHGC`B$oQx0vWv7-ytSSv|HP$KCJBbH1X!1Xz@IrWx&41uqL}k z=9Vq3Y56+We7^K0oKY^-7FzidZ(d~tf*G7567aI};_`)ZYRf�eEWJZHsW6j-`ynN*U$nOsr)& z=GK-4rvNtl zLRG?Qtg3W?6EF8J;(Xbp72N7uvXh77HCY{v z0NE_f@MV>5Ie(N2w?yykFEf}!rv|LZIm09-p4q zf@Fexf`-PM#yh#@#tp^Sik%z_$U+N>)k>xx+7Z)Wf^? zGdCoV)*}ofQ!*=frh)5So*0X~aa|-EvLP^LFCi(>FnT~dOHDkFvuD1qWz`_)z~5mh zbnF0=SC`kZT{>H}BfsOh6F*llC|htn-$o|zQ)eISi`m+!I(0#Yr1xS)gelB43i)oG zU&2))4N*B+U0)PjPIUgkruJJcpkPI9MMYsjdcnqVP@%29uYSO^6P526y9kTqKf7}l zdNvA5(AOYHlEf&@D7y^SLdY82pXZ-_*g`odWv6yHOHt_mR#`Y94v5A>#tU()U)yC0zLrAupo6;uc~xRmel%eU zW-r2Hva2Uz9Qy2gTC>~(fo_>1(Y1z0LS;{zjcASL^OW*gbMN!|NUJKfNX0x$d+HA@ z=QB>nBR7#>-R}=nxW(3psptRe15E;B5O+$EBrb_@X#Ngc!H=*Om$|#ab2r2eVWwEEjLYS&>z! zynl=r@gbOEw-H&mh!(+6WACWj?H{At-$A^$s4c11V#BxQCbu0-ttD(0-#Pz{!*Hsx zBtFJ5&$4B)L{16Mg{*PLqdvCg%sqcwhV5#&GvYqxzVUTIEZ>eUvpnl-7M(Bc^vqk@ zMXR^l2fwvvC9;NuXPaX1u!h&ID({=!O8SR~l-1#H;QR2uaQU6F`FGBfhrXjboMFws zWxo?PWETXPyVA5T!XJDr>QF&F987F@VDI;Tq{i;WpMO*=@Xhh0p~ zNgarzjoZqhrMZ zWV3CHy=u0nqlf21e~66K?R~4G?e^fgVD2BU7wJt`AM!>DpLzVLIk5Ota+J=Vo_X{n@5PA&&bPNE0&dzZIfP0bvY&rp;lnnqI>X~D=4gjRj^tCkM zAv51+RTH?}xZ0K$1{$$%Ye`1;SMId7@Je)hydzS`0CDChe3c@Fn;7LV64O`ge&KhNHF>VgY^ z0`LMf__xS^E44*-W)va^H;I~Zr=Ml*4GAF z9T?8#?K;!S5+51x({y0mF{`&9L3!gQWDt@aQ67O6hv#vQ&!pt`{Jp6p&i&b28Gq4J z)NXJ3j|1N)Fv4|jP~FI+F+_c@U?QZU7~#bsw^P1x_rS{dsJxDl zWyri^O?TKbU~>k4!eq#B-x4(uvY2zl>fwbc`HOciuBYWL;C9M>xg6XxriYJMnaWCB zjzEN)gB7zaRUdylQA!K}B6z2Irx#ZK8#P HIz|5nhun+E diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith5.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith5.png deleted file mode 100644 index 1ea2a2281cec0d15d9599b2f67c97b92ff5123cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3978 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith6.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith6.png deleted file mode 100644 index bd9bcc18bc16aebdea0d584c69cfeefc8154566c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3971 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 O1HjbK(g36Hp74K{*vAV1 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/Monolith8.png b/src/main/resources/assets/dimdoors/textures/mobs/Monolith8.png deleted file mode 100644 index f8a43951954f481ca33ca49dfb541ea822294880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4065 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 T#dh`s_}K@0c5~F!C}209cF+^{fD(`eUg8 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 Pa)HrpbG;f}_qhK6NhS(l diff --git a/src/main/resources/assets/dimdoors/textures/mobs/eye.psd b/src/main/resources/assets/dimdoors/textures/mobs/eye.psd deleted file mode 100644 index 54fabf734fdada61dbc3fd603a604dac4911e33a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52196 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 UMt3N^E*}#Z>YC|PL!2W23-Ta%9{>OV diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith1.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith1.png deleted file mode 100644 index ad139ec7e6e67242587efc3ea9549ce1abe9ae59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3628 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith11.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith11.png deleted file mode 100644 index f2b512c35f0c685bcbca739aa690591c49ec4795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4404 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 E0AJ>#i~s-t diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith12.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith12.png deleted file mode 100644 index 26cc3dacbd78e491d85afc901fa14fd4eecde415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4467 zcmds)=QA8!8^(|5T_gxX2tm~7(aY*JSkZe}C9B5@u~DK$5RvFBMDK~R%IbuK=uvkO z(aVxYTS=7HJM;bt&!_jyoVl(~_uThy?z!fi_yOzK`(r z0yb~CnTYaI0M|9wI1S*g04hfwzSIPk_rP^G{a!gRBLeQ}TDa+ekBy*nn1Q+$P|$#T zCUMbs0ZAxu{KCT%3|?e{>stF3ivI{zGpq|xhrgIS4>L9zg?d-gKzB*Fj zs|vtUAad+nSgejMT!Abce*WRkE{VH6b>0&~f?F-UY6HmIoU=Ia{VyBM{MXI1v#TpB zGkU%1HckT;Vdt=Jhfa&L$G?$^r-Y*)?LT=VB*fNx;gTO@`W>QEm`}t zk^174W8!wNu5+`c;Pqt_M!zJDtXBsTMYrSC-`xFtXZ+&P&qd+C#LA1(;G?H9QD}-t zshtb)u|7Y8Wnkw|0s#9MpRVr$6vW}~QA;C;i#?Sy?Yui6+)ek59{~0myrR&7I+cD3 z05tL<1V5^=A9mdk?j*a}MT+a9K6R9Nq0ZaetHj!U((e6wgX#&dVP4uV+(wC6m8CTH#JVm#hrwzt_2OgIu!r@jcPL9`#T6g(*{A z20z`dq^am*`}nYu7!!ZwGV%#Q!Wg01Nhw2uQ0H>uRMW9Eur!*{DdoD!D|K~_QkIhV zg-JL6?bK5JdcKyczk6>uONhr>>Im~pF(zLVV+f6d^vd!w#zQ3dn_pki{Zt4YXB^iW z_crC(6fVn_(qZFC{W|x^tCn2utuU9+m*^GLO3#Yq3i}H8z6}-1S=F!b#O$Yl>42vm z>ng*l)GC>4hJ>1VL6+%!X+HF-bh5R2RX*CZ#w51%n$(jlxuGa#UHzh}5AP<}+*#ZS z9yJ?*Em!B?aT=wMT8s~FYHy@(5Fa9FXk(b7`r}{%tl2lnZ@^d)H)=8ridiQTSo@*( zWW~2L)-&ldeatNd(SpyIQU<8r>AmB7$1W%aEh{fBUnr+GKQJGJCYRZpg;i^rOPVd0 zQGQRWFfT_v*fwJ~gOw?i#+JiMeV{6ZNUO7WGOHeg9%D$MN!}-i<<>qfY8TeJU}0`A z+KQMb5z@VUpN3|i1qos@&Nwg$O66twau7*9NsBtugST!fp@$->jN^*=Ym#Ll2+@INI- z+BBAAbu_$WSeoG*il3$Zd=xpv`mz6*K4Yv$;vrG+}i|-aI7$_L@4}BZ@Ff^4ZovkE3EwP@xo;{tt*yv~- zY%Po~MK`(X)~;9=TkWD-y`!z=tconnt?lZxs!&yTrZ82QlB*@nMyW;>xl^#7kN=>* zqRSdtKd#P@VXM(_beI#&nFZGPxw>aJwJkNQB`onwiJUfemac-sngbb7?|)tXq5MMD zaL%qu*yqEvO);3|2*b#XTi{j&11qU?gif|bKJ+0MovdCh7}YRQpRk*i%* z-0oj?URQAw)-#4vhCS$_A0RiTM#-JloDzDFH2l%A(H1c(NxpHGY-8f-(ugq}Bw$hF zk4BotLN-j?SguAyPg+p9T+~x>PPRp=MWs*F&Fb5vCCXCwvHndtQNd~%@5k+nr}%@| zpQxYI%b_e8VqffhpXLvDA4Zojmx(e8%crRt#2MXx`%8^Mu$1}Lo&9TwJ4sYeyE(dH zx5dU}#^Pomwt}2S`#OS#A#Zk4TBV=zewHi}UTuECU-r7yfYx9>TRxXLD~Jm&p(NiX z9`z>WwV!%9w_z$8wgp>r3mU9+jjlca?48gk#`%u?t5@CYN>VEkDztj>2Gm+$T9CXJ z=4#>AF%&-_msXK0G=%?FH-LRDo3r=+0?*jZxby~H6r*n;!eP1AR_Q5MtLXO>OSQ~I zDirgOtWvS*C0Y{jaZR4i#cE*-sR*MZz ze_~MV%1rSutFL2O(wUym2;hQO*<*bMIx=x@>&q&7n;(t1jk|5GEr{gW(5029ucgy@ z)6UM-(=I-&#~&SQV#U&j1hAMWG^DwpL$RsVwdCvYkb(-d5PAsx1C`kwpKoxQKJgyg zWe;sVmfD%b+O!hRl)tuP&56tnC*3Ap|LXp&BdAozmv5e={e|0A8NvPV{lw$MXXHF| z=;`L~lN{qpP}Afop>1ut{#)(ms6B)TtqiSsVou*r9$$^8E1Lw$MFJ9YDW&%xy+aq{8+` zUZLKh!jPiBagNvz=+JeS;YCk+pS>1_z@>4`i-dKBR)t~P{ieYETI}jIizbV#8hHo! zR^XQ6dFq65KPCs0Ro!gs)w~J{e>OabnMLsLR<#Ea+FLD zAx+Lq9*m)l+0MPMEGPF<#s6&cv;;EpXoN49<^03>U^NS~81iItdwO^*V=O;?KRvYr z{;cS1t8<&R2HV%&$JzchSW?{n@Zn#47XpXi*eh71H(q(h^<3b>{r9IMv(b{jsjR7~ z7bL_P2d6HQBG}9KCYOtjsUZL%cK`^F0^s+>rEUW7Cp@H2CJbfg zC!-nWHR4Ie8^|I}GHDX(AgfSawgN2v#L-aP;Tl)Bo9@Hde zZuD@QX6IeZF`_=!dZ#a!GZ$VIi#ZjE1;GIYPB+fACByUW@EkJIy8-a+iJ^vuGQLSq zh!Cv^dah5)uzXVs?ummI^i3}DouP|%w~BH%-RawODZYUpG+9JD-pHA8sBB}~NRUy0 z;gkA&C63()I;q7JI`o_#L^4r+ZnVjyF0rMF)^5>OAsg=kha+G|!Lcn3u$U70@hCSE zUpKNJJa`VY^yE5r!4U4HzxwteiW9j;Gn(z#-O zUY&r*TUVG$;WLa;BmEIb;us{wsXS{dD>Y3z6c~K=@?wJdPr#r^eMooGxyo4{ODtBN zaI$^tSY3tHULJ}2?k@G%9TzA+Hzz*1c=dOm~lMZ`uS52xHx*mS*5aJx%e$0e$k zOM+tZqdXitdsX)s@ z&DcTQ+8atGTDTB}B(0$t&LdUja$Ky}@*1M|@v&+#^lMQgZ zBx-_mND7*ao{17Uw$wjs9kiEpWdQekuKeobZmLfVD@l;=$n=CCcsIz87t$tXd3=W! z#B4oCZC?yfnlp{f&iRP&-TJ`-?k`{Q^`r=DKxDvi=I~v!p`!(vh9bX$DQ{xYstdMX zW6aozl-w;H`W%U0#vG?tK#4f;5n;5*IsCJXXCHeE((!{{NKB`F$=9qVQ!-&qytWz~#}^ LG}5S6cZ~cGX0yHY diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith13.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith13.png deleted file mode 100644 index b02d041071dc21f29ebe5b3dc5f5d5d6a0297b88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4522 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 Ry*PmrGdH$2sxfqX{6EnG*o^=H diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith14.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith14.png deleted file mode 100644 index 60c170bc1c6e7892b243d9ace8a19f046755761e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4603 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 VS;ECJcEjKzwAA!fOI7S&{vYCQfFA$= diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith16.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith16.png deleted file mode 100644 index 32e07c8e0df95a4867c7ce8f234dc904b533a519..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4887 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith17.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith17.png deleted file mode 100644 index 5b80bf9bf729f4f31cafb3531a2b040d46f63541..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4910 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 a2~-9>Ru_6=#(qAK0D6y%w6Gcuul^6&DCpDx diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith18.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith18.png deleted file mode 100644 index 1fedb643cecc73d7f85570ef7fee60d71e94d361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5321 zcmb`JaO2&hL57i+f%B)xGY|wfDOB6>q4Ipde)>1pt6TOH<7l06@1T2p}fB6&t?_ zms=t6(X{jj0LuP$}0#Zq1KLrmMk(D_0p)T6M%<{Y6$cMb?gU*v{>0P74W z1E@F^fY3R|sR6EXK+V*{1a-hd44`+>8IS=MgaI)va~DmZz6I!+q$X z06_>~H_XKq1VrZo^cqLz^1tuZQSS-fI+fcX-^MMY9$`%^>`P>BF2cb-sl{}UUdkTN zK2KSsFF2P)JVKJ{>+v`M6sI!W(jH$2O;XlPPD&*=Q`!oD`$&l6ba2?Z*_o>LQ3imG zfY6y6A<;(Ga5=(o&zsjghXk&V$%_AVp6Jp*rThUX#x9v3`~2G*^%7Lu;^NNs_Ja0+ zsLHaEtTHj=~yrg6CQqFkQG=V{$S)9}6y3i%Q;`)7{{)r+eBvrWLkt6<@ z4j;8eK+onm033CA_kQ9h#t(Om+L#K&{ZzU}6!QS#E?Q~60Pt9iTf}sj z1nX76C%w!;!5eRrzBk>e&VDL_aCBOZFJK z#-#gDiu9SaQY!dR{k119?B(x_AR$m0CZ@B8F2#Wy5-hlqiJ5X=UO;;_31}0!AtQ10 zMw~jS_cdY038oM;P4*)NKRlUO8;$lpO z#M@5uXMov392RS#Da7@KHib@I;FL*Gv`=cnOx7^-t7mp)2wE4 z=x0xx&yHac``P>WCxPS?F$_^daY%lad}bnMBugOkyByszmbpZhAyYAF*!P^hT&i4e zGYi3H!RHLAqokSInY@``K~dAnsNLzGOtvaXK4n##RiO>P zn}AJ_m2wraRmci&Q>C||me=uwmi@Z@2Jp8=#qVvmIx!G3N0!DQA*ee=bp3VcuwboZ+HGw3Xv~Q4pX{vd3SZeH@ywM*mY_Qvh5h zsoMr~wsEh@%FeQ=)~q(FMttv*syir0mvyOkSYAd@stjrK+3+EdDU)~5dnSt}tL3ES zjCu;Pr*$G#?xo<84z<9KUgd{5h24+C3w6EA*MhtD{<6Igy*9n}{9AsCAh#fFBwhBZnl z7FHB#F-1MKAhFdj zQAg2K^V<3PmeRngbNio6if4*`MO%tn^3rSKYnHa-(mgH1En^1#-i5X=*WqDYI49gQ z+ze12&I3Z?$496{SmRw@JbMoPn5-nb?0nX+c%YJ0+@`{yk`h@Pxzk$3F~4Bh`SO=Q1opV%Kt&i69*rFo1}vQL}^>kKUWe&Eas+<#r|uUeMcT0RnH zAoEUG`@W!JmBCVG=>D}*UW zboh}^aLHuf$;)!aN)cKi*(_zKdX{jh*)hei7 zdNcAHa@XbQSdH_`hMPgJ#1>JGOrjC@MpVrmOJUMx)v|q4EB<*wq6Vb1xy#3i_)(dx z>cV>y2jh*S%P8rBpGCL>+CJKiwC2(n9dluJi`}l8Co&E4zQN0+TMT#Z#XKaek#9|C z7WDjVP<>#YT^HKL`%KS0;&Jb2WbX%%`*$)k(w&ztzOT$5JTkBlwOs#T|2GB=R%D1z zsH0zI%4P^#;9m*a0mpiee#~9TXsWCpXmgr!nRUVLt_c@fQ)X3V?`BhaQ7kSsQLH~~ zIygO3Ulz@t;9u^DYKFJH`6%Do>0CZCIU%QH`quQs^slMZ;q2-M`}qs6nL}_$=b7Y> z&&$@G=huoO-OFYmGri9)pPetYE*sC4>f)=g7g?8{k81TjeGi84XYsFzxG0oP$Dk>1k3(%?8oj-KXqG zcF`xQc}IB~`6hXn)(+O~2IGn|U%st9yFx7Ar7Dn=w+z-kHXU(W!bZ-eBafz%(3$8L zp(1})?3Q0QhwM2{u0Nsj{@G3)uraHSOWc#|l$*3UY7IDQSl*#CZ#B<*Cu{5ZE#RB{ zP5PX{P)9*WUR|4wd)wi&t`8wD=U8x|^yKPESMYB}+?UUVG776*$Iraa2hUH}8COI7 z_^v0%Iu--@4r@CNI&Dvs4^$T6tFfPztZ!Bpey)T)=?N@8o>@Vh6TXa^x=B4vp@QE@ z$xRuHp@{ij_&`xcW>d-U8hcd^pK_YwEo8cReKS_a#3&ki@%j7w_ zrPtqjzO%er#`Ix0x<`T}V2@88ULN!Yt^~6Ge6vnvu>Bko#*cIT^ZwLiy8JSoB|RNS zfS+@GkNdF#z~x2LQ4;0Knv(W;>{H8%EHmHS{FFgIuZw_9e3pH&ry0*sUPP7bOE< z)HuK99uxWEqGJ%ceylikTo?$&#J!a;*-TLu2hzyHx$z+*faZT$x@{2HK~7@IPy-&C zo67qX_$Bk^nzAN%^${iC)VEu6*uX4Re~&bghJcmUf?C9~r7j#9}Wk;qj)$ zK5yP6X@0u*Tqco?M7kkPiZ*lzTIa&A*k1+sw~#X9VVg*m??%B8eLUNLD0SKro@SLI zUO1WthX)2l8r|pzR-_CT2-lE;nG--4k69zC1*SD(hL|@PpANPNG=5;jN#NR6nVKY6*}tS#(aaZyt+@cHE%geo(jm15~oOv+7-yVxOTuro~D(c$y;Uz zheqJ6$%cW0Vj-iyL~tbo=}F?WV}#08#}U$?uz{ocLWfQioB8zUDgFNIc=BnrK0eo- ze4#ClGv6Q1I3rOp6$V#*M9@7%PFY0VongA?|3JTIPH&aT&4LyB>`O5l(D-{>F7 zOsS42fzWhH+z;B~o3qVfjhIb^ny-RO{B!~)&PjqH{J)LcseX~Bf1ryIY(yj+;%na3 z23Svxl03O<%A>%RYN9d?1Tg}~kIw27b5DM7=wB^(odx*{=v{^H)Ibe#hnX3k!X_M( z8qg#$mGy1SpIom(@gWobz?vu?a817@E8F@?(5xkFdK-E=8vPOTO%KKEAug>8T_P(`(c+* z{-Dn#`O~VF1@1ih1iiio(k#~kSm!suED6X|XN7~6Ne4ftQ!KHte@uvNL%fu zN9^2Rzaq>S)i3&D0N+q)czK^BwxYiAa0W7G%2L+%5c93Oe@nrwm!Mb?&l*c&&FmN{ zXvTT_)7_HoMt=RJLnaBF(%f=Bh3Pq+(M5zg6Np}x-r)#e1cklo8m~udX{*Il9+8@S z&}!bLEK#=4d-Gj>SMSw#@%+xYI=|;R&&@fpca5~^sIOB40O)jeG)w^?xu7I~lKcX! zy^EbMfXY+H!Uq8Qj(>)v8&m8E0JX6z9Det%3&t1YqtjdRT`!M~O&{z5xQx-~YQ&@Z`bCQ4v4;7%aNI$Rq(tD8_+FW#mK4mB~Pzy|e6#_Lal2B}hfEmam1GfDR_RHX|7_b$5wl)evu}7IfB*5ww z4+}|N65zh-6r%xLltB5=y*N#Pk^s!k`ke}3QVdAwBAsmnCUW!6CP{0f?3R+M616iB2vmk>dh?KZQV-6gv$ zHSzXjb{E!{M6Ly%F3i(C(O#O z4;g%hZhz2;F7CBnRH!sL~pk@aFvs(?2ZmMr}F*2uZz(!A&~smi=8sB%*w2}%+xzVAT#OJ9%? z<=eV+2*7S5rtPZ`C26Qj_~MY?`481o?Yvtc)LA##3jiApesM%!t!g(V02+B=B30@f z`)$`mTgh*!x&-Ij-fZaZH3F9!-S#+t2jk$Az#%vWm-*KqEbBR z#oNt4(kpv1{IR3VZ4+t=qasu9p}cCxGaW->ABW;gpk&L8JmP87A!CZ?=kASRHsRGz zlGTwkjYDvo>u~NWdtXwBw$^G$QtAOx&rhP7v?X7K)tD%MrLBYGi{-CJXuYBN;^-@x zmB^Zx{l)vkb>$aw`RiZGTo|SkRp8wct>3OuNOwMz5bx@MRo@Y%N^$6~<}If!>$+Zb zubi|o_P}AN+K-GWOtY0rj?53nZO5gqgEBxFP3jbL-{6=DZ}&v5U{^X;q*pjrcy_I*vG!_S?~crtgiQO~^w?J!S7lbooie1< z&EIC3&KBn*uE-`@!YcA{rteLni?7N&&Qcf*XVuj&sCbh)dfkQ1<0gi|{Ttff(!Y`J`_a-xv4nTWpoQ48uTfk>v-@3ppJ7nQJ{r&7jgXL++{#$bWXQyr zqeO5bPg#=ss8jV)1yVUgAc&IE!qT}?8uLB#eneu4jahJ|mbtXqatYPfv@-Kj?AT#HCr$F`K z)YB&-jTxt$jq%E*CHV?)X+3FVt?Aw?XH|;j46macUn8n@p`!G?khnSKAHqw*9ECCl zcu6N~_tLcVG*p>RnMs-UR=s=qmMP5tGPfnyI zT!Vg=^};|oA>G8ECh+?mYVZQPRJ-)Wh$Q?l^zE3|Us?<=T)V87`IkMqJi6WrkPGk# z=o@Yt?qr!7;tPcfl?;>&x(5da-wcjt%4RD|PDrh1uV+tW&)3^p`dfj9=Yu!1;yuN=EJDtXYVha%v<(Ov zHN-eHDZPxl+ArMciZ#m~)kd?S@jl^uG4Zkb&-=yGRm8J7x@LQtSM+=jyzVasjvQdK zYqQ(8i;3@diV!`x~$*u4BTg4f0ix~UByQTmb`2-pfi}wR?KD1dcy4?rL5R28J?W<(hF9~W0--#119$Vj)UXheu92%aw_U23@WK2-XZo8e-LszBeQjO6GxARcQ}HYe#v|vBU&{b zo~rb=5Y0)<4ac0voQ`#mYY$Z`V@o%V(vCguR~UJCZFiH7ke*WT(c>oYU&lB{lo6(h zAP>XoMC_XiP6c?ng5m3wZ!MC5wNmxNHu@RMW;CZ0=aBwZ_fHF*;pYVM`K$PgyD?g{Pf-QlusT{3r;s%x7gnk zyV|?BT6+DZC2jWa9dEb!&G>QtcstKvyz-R$nb5h*@9G1yFGa^G>?tYdWTY8;Cl1nL z#EZPi?Vw|72teR107An7_FpQ?6y zWx^P>h&lTnRqh;HY+Jf5!)l2tqjc?T=RI67zpMml*CUfeO;WM)s*@>c-nC|<{f@G@ zCTbe-a$#?uG+O%a+$Dq`#gQsqB_IQg;37`{xgg00}MuO27?5!M{cRJ*EF{ k^#385WB=)*{+*wbf!4a$@?%lGs)y6bIwdMiH{7mC`g$}0RR*_+Uh0%;N7HnfSB+G z>;lT%Z-B&4+d2>c%AS7(UO&9d6#!BrPbl=!BM*2GJkSH~$F2i~vik+V-94YU0T42e zGKHC$ZZjyIE+0Yk5)g0o;3o9M>?V+81YJ6h00#-RZURT)9KCTDjfMsR%RoT_erhTr zh2B_*Jc)FcXr1FjYD`f=($M)zc#-#X+v(=$Rnv^}R@EV@ag3;wm^@2c(pVZnUJhZS z`4Q9K+qbeVq8dfY?FXod8(ld9FS+o*S)`((AZI7h7l0QsNk$Ah4UnB;_u{Xqb|ATS zc!-yHok8gj^@tI4Ks78CQUX*p@ersS9#c?2033&1oY%l3Vc^L7VsjE8P-nT}c)<28 z2R&XvI$*!!mY@zi6hPIOMUn=v5(9MZdcAUBRv3usSh{P2x@ORcr6y|t#NnaOe&hvL3pQw@S4-vdF^UrtkO>vfR&)g z@hc(GMrMQpA;RbC!-IVSkH=&MPfwHG8>m#9K*9FB<)Podw9zPhjhUO__*=k$&;Lu{R_yofkLLv@V*-t}j?8 zIeT@SF;)U}YsR$xsp@$thZ4n{iI6w^Umr|dyRPDd&heFT(xA>u8819txXj)K|3r_M z+A64X^%Q`ER(RKUK4N@?N6gAt@bxd1ORa(j0O79l#vg#k>f9n`Lyao^!~m!lLGuk2&4 zv#7#vO+0oPs}Clijne2Oks%0%usgA-X!|gfb;)&>b&dmDQk1i*|Hm`aRX&p;FI}b$>J6z4Lbn_V zHS?l8lclmkGaBhM8%T8_+N9PvzU+?F(>%G+7zQ1^;_45Xlgu8B9;cqQKZ9CmmNMB4 zv%gtR3~y`w%>Idg6iiMLM<3Il0OMmq-X*#VV+y`oo1Z zw-P`LJf}||BF)szio|J*(2Z0`+Lu zl*JTQu22?V0V{)>seFvIzDy*v?$Pftf_^kEsCQUv>tiQ#VQLH!;_#-ZjC&d--OE!y zI`{mUKx@t=YiqJnMR}ndR8m*cveD%5t-A`*T8{tOyC6f7Exyw1!^os%x?lXO{46C> z`WSIHJMW6D>@2HF?MmZHt=)E+n!Qp~NxMd?^?4MfTE8x@9j_KF4SO54WjbfNR7zUP zV4x&_Tq9E9UCdJ0svg|oTe_c<|K%|vUmsq&9NND1_g;kPrP-y=-_m0(ax20{a&E!} za_n8juhRZ-MOM-Nh2O?d`yN$ju~Vi~_R7n2%(!CFl;$f z4jw&&9fSQm69Y^Me~E&=f`0$#$moaB>0D`~lK70o7IF(YgTysE+Jx8$q07*p-EIc)U)vcv8r5M8u!^-?=SWn$=^dP#tnW=7LmT;j4 z?SqbRf;lt7n!ncc>}RxRM6^V_x>O>fh@YdZWVK<94Ez*8CvPFYoQHk4uM+X~C~I33 zW;I4VHY>S?zBA0<>xnW&PHMpzVVJ;}!-V8Sz35?)Y-JH7OW)E!`?_w>vA_LF*u*gk z*@*1kD_f}Dm)ZB+k6(O0BK4j>-&!*8Th9RWhw;X^3fcQiF>hQ|q!H983f8p6CF&xY zZdpB3*IXQ2aq9GoQTaqU;QgBNnxgEo#Im)+h-_!`K=ZIs4?N!?76*O7b?tf`c0CSC z5fAWS_=!q-kKSBQ8i&dat)wW#!oxLc1*S)r_Sp6K0^6A`G9@qO|Icd>UEzlvHVTMK8*5goAi z3oXQUAH|k3l#9>`$!DqRCm23_`(J9*0%Z&-4-W1GKS(7F?Pl$Uaf*)1j3>-O?F85i z53~gg!ruIo-X}I*U+>X&)2_Th7su&Y3bR^mwpV${H7NRrE|9L#-xiFsAgogSoP-we znKG)}v&^oEZ089x@Q!-iH5A>|gy+3WW=^^h8?n1MvuAH)C2Eapa{3#GVo|0~Osb(< zV9cg}G0V3YvcVD$AL__meEX@qvKQkz=04%Ry}2x$Z%dg~k-eEs=}R#;|A_);@oDe) zL}NiTdz5dXH3kjE6m=+mZgVRg#EvScn0+)mGW%;Lvp=!ax7b- zN!qmFt`=qg{V!LjU%|o@G8E>o-u10=`KgDlZ=aIjPT45r=bxp7SFI3D-hajlV-@v+ zZzQ@xW?v<}rhG#m7s-;SQlfE|pbpfXVrks^N< z9Tz^J!?#?pI4>&ruNLZ{l?jdOf_4L}!;$Kq+8lH#eoDpmYH{}0;tQ|N;DW>PMXgi9*qE`a^y4%t=QlPExL) z`-(f3l!y94m2PnfnZemg?V2nc?e{y>F-hV6h*%`hj{`+*kcO76SlpkJ102pgVt(nj4iQqeWxSO~MQB2>GffGODIZgq*w}w{L%LPfVeL&ZNL39sPPUKsU9jK}ZXYmcl_~v*z#0raAWD3bI0Ca*&oAfDd#>ZwesVqO1oicEj|Z5*Y3@dC0>cFzWG1RS^}TQ=a2mf=cewnb z(4pU}5sRMJs+RHIdDO^;o-5j1+SZr}gJttxbyN}n20nm*|9fWqC%yZh9r*u1NsRbE lT-|?5kUFiKvj*4K_@IO_(6OC7K<%akIvR%RH4w+>{{~QnEiV87 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith4.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith4.png deleted file mode 100644 index bdd4165a515d9050cddf90c84a975e73a43a8507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4024 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 j>3=Kwe=oU`^*fUcbT8~%e%sGl2j^y>W2)Vt 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith6.png b/src/main/resources/assets/dimdoors/textures/mobs/newer Monolith/Monolith6.png deleted file mode 100644 index a3e8ea6b7488789340ac2b56f2f677d3b5d6265f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4114 zcmds4X*?8s)cuR>h8BbrkuCfB*q5=dVeFJ8#u9^MLNu}`Bw42siLoooXl#uolPY?z;o99{z-P3HywZD8H>S2)zJsahry^xh@|KD2Q0KT_jn&1^HG5P2o;rEHwZK>fa1|G11%t!pb3&!<4&2^wXz*4 zP|*~GpwxeiXi=AeMrg8D5zx@3Kw+{3EI}R>aPDz)T?DtqfV1F}m0^Iw>}Q8j0Ebt+ ztQ2{vfaj8Xyf*Mu2Ic+M&vbyTB)IHh)S(E*#ek%NjfXyXUk?apS+|lM2hkdP4@1g}jJ1lIM~_0`t%Q>_d~&hpV({2gstEL!yUP*($;h0C963B~rl=N566_^!b%OECA0 zP4kC{w^@CJsQNP>xX|Xd3N=O2QE7J5UUK1`jHhsYX3LjM%bp#x&)cd`bup2j=S%!$ z^BYE~a{5vh&tN=O`rO;9f#($C9CaH~mAirT)1%lXJ*iib)#j?-8S9|GnI}`!pk0!LA6IB(I_^t~ceZPN_(zm3&8_FdjdI4a zPR{q%<&=#Hdv5(7kW?2VbqI9wR7fozmus5(w#K%m@U4lK zpk?(r`O>~j-t(!ZQG6xJbE`XM3A5C`B(ub|#JlZ4k8#xqc(-r4AY}2?+mK_KWm$Ha z+C58J)2blHV!AjVc0n%1UaKM>XHjJySA0qKVUA*N6q|ujVa40@VNOqWPqJ6lkD!JN z)9KetGY4#jde-!QWd5MsMKUtQvPN~q!-Y7|S7@%lIgnSXvW$y3h7&ouV3G<_8(FK_ z%-IMlTM?YdW7gEK^y!A_0_j{L60nleqSBdC2CE&b9#~4r9n0`aT`L*O#S*&j8D&<>I(fcrgN|{w~7qIDy)(-MHNh`p!J>!`;QEP96p~j+#fJygp22u@58V zIs`uSPCO14Y0Nt2ZcJ1yEy-7e${5Pn)L87i@=&K)%nI0l9b`(kDum74iFh`1c}sXf zn5#(E7%%1S=u?`JnPFR|UuIsWx6v$LNy1`^nsplO4kIC&U50{=f_m_jzVnz>%L&VA zEIpRZL{(|8QoPiskSo7Y8~Mo(yP1{SatD=bjKI!>G_M|94VO5E9s3?&_w*QTscRVd zsfmnzS5!XB1t3(oCAx^e&7n^18qh+QbeGKe=v4fmO2LS3k}mUeuTIBB{zczT-_8O7 zY5`sWBa?NL%^V98e35XGvazypSMRspx4om;a%felG3izGDtZh(TkmZD$X*mzjQi+r zP`zYdWVeZH@{6%ov@5i=vUjS{t-w^=9Br&<#9qMSP18)va!29q?|LwM4$Dh*TI1f-1Ho;%_}ZQx}kYo(c-zSo=T;h%Ri z)+FGz{Ve_CGK;uNJ;EJc7)$i99-JMHe-O13pO|3uv`0KsO&rbDIo;j7WEiv;;4~jP zw1+|0pxa2r#HvmCO|Q+ksW;zb-w5a0$vhZn?}pBqFAu6Syh)eznJtengPKLc>sI+B z+$2(MD#qT|7a~i^E?ewsf7AlsEUGQ4D9lLD*xmi6K&bDo?=fpf$g+Adsy>}XV zItZ|+n-p-$gh9$H@d1QE>bD)cfV!!h_n;8fLUNz3}erd z=yviC$?t31jlr^&h+h;{%Fr;5H~r_;FHIJaVz%cuw=W@YCew$saks&5NDRsk#*afC zMXs4{>x-C#zWkZmBp1T}S*B2Q86PcJ@}kL@$#@#Al*^VA%;PJqs?;nM^)mHEfL1B5 zNg58m4qx#I?kRVVsXqDamsl@xEuH3zPtA++^LAqNIIW@|Fnggf5t?eayN$=E-h{7; z8D+V*dP(1Ez7k(3yxw|qO1ju~asDN)FxJRMjN5jlx!hZ^S|uQaNWaK>{#L9tb-BvN zXE+hx5wkLqO=e|8vp}ecPvo7}uTNX+D10^;tmv0x!Z)VINKR(95_Yq7E(fs~E;ZJK zXO)+U?3t`j#)YOHEpx>ozJAJ{dR1Fe)`7p*?=j@DwlX7@>j23p&0NWZ_%TgP)-ugn z*OK=B=ny3`dxeONQ8*~R;FHS7CU@+YzFuW@*gM!R>;NXeIW%48GPdtGxXBgP^hfsR z2+^U5e604Rg=j@#WisM1;(lmwSVLB?OekI3&p7mTsxb8pAazj=Q6AIqL2zUE?<3qp zsxXU`(OVmOkgn@3Czvgy7?V7cRnqIu1wMc6kfk*;-7NVUlhS1H^RV)Hn&Iog+;DCQ zZ>^l|99^_!&Y^>=Lxb5jwZYN#nb0FW;&tZNvMP2VhC8q?UXyE2htuHO{m(J!nD7Yk zzf;b{x45uXx4v0#X2ezlOVIp~&S~PRa+7kOPxtm*Eq21#=QIvqEn?r<_SzBTp4n}E#Q8JyB1Q^!R0pQP@kFhkF$WT*7R zGR1D>{-dU-xS$?*ymo|z_TTFl$Ynoyd(uaKjH3I)j(Sl_Gt1a zQT4tPl7lcmiyyoG;nHw)L>6O(&_Far0)=L3o-oJw_$?1-XLwWs1+P?ON88tL(aw1n zVVc=5ShQd_ATNb^Cf`8>qymlt!kHYKsU3P}$#h)O-ZF#stsQd&bHAzQ)_={H zia+#q^qI7=-&!6$@Tq}tI`|IR_NLH;H`;|Iam#M`?eyVpCnb&84|jSO<`cVCPv7N} z>jqq*Rk&etXk&$k(^}iF_a^7|uhZmpiq}b*aveP0A|=e(fd!b`c2fKn991u z$3T^=%tkfq@O;6rCr04~^#>;89GkPrwFkld!5=Jr6*kb*KXhyUi%u=s3)N%NxxxfYJ=W)Nsnog!t2paKA#knf6ndK^y9`O+z<*r z`AWmJ><**{7}DR2u;%HOkzPN!4S2Kv>>Lrybx`FUYWd?g7XPvx+OLM?FUu3R>Vgj* zk{brg+dDHj?Y)L%#CEes5AJWRS=U4iVIl^CiOh<7OzN+H0hp7wo62-;rt)xRSVLVA zDd_w3%JgP&x`3EM?Tjl@*}JizWwuBV+fU`2tG1acr Ha(?%?Ah-$%04ebm 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/oldMonolith/Monolith.psd b/src/main/resources/assets/dimdoors/textures/mobs/oldMonolith/Monolith.psd deleted file mode 100644 index 411e055d7fcee87e0105676ad68bf2a73f64699e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116238 zcmeFa2Yg+{(f7Z5&h1ydS6j`JyP7S@a+PGcU>l5WYDmDy!gi2lBg?c@64LXgkc1Rc z2}wv#$U{k^Cy>yq!GJLkYUp4v&3eDHN4M%0Imz??htDhdBl(_l_Uzd+J3BKwGrzeV z-D}q?t(+g1G9NkgDcd>K|E-Shm1|sF;isWOAFu54Da(`oZz*LRbD}c$OfmQ54D?q% z`hhLq{afY8r*Hq(g=Jqh*Xrcj%3my4eCCdgeW&&hSDoCydF$Z9niu|fRZZ2_O$%#| znY*TG&5oY_En8QdJ=DMc?87(ooqcNGyiGNW7X=oa*?H!+9ozbcH&&gwZD4R`=a~y@ zHg4K}a(^eE<#c0Bm1#13>cW~XxlncNnzdCu+lTtA=FV=K)z{S4RMplzySa5vdwcuL zs+OkarpBh0#^#n;&F!77EuBqGRii&OivoOFFtq8E&UH(djXsW}g*97-hj(-~HlA_D z8MDu5oxOc%b7S+odGn;3mX=wxn6>k)!QqW(&KlfV>vR(8XKDY=zM-uhKMO^xB6xp4tB>FgQm-#EN| zXv6mH1B;wDU%O@d@b;Zsw(qFwSwFYxn5~1Gwx6+cL1TR5$kQYJ^e^2w+`kCww9aap zJFBH>L-V}OrjE|0=2=a1pixvOPRqDH)@p@4sAbW>p=gao$Ho&SFP;rX=|R>);6nU zc5`$$QSJWIFAs~aS(Et1L+fYTw#G#3Zs&0C=`6|7B_2bv(49LsoVBCBab5q;?YoBh z`g>1@2_ox!bTzJ7)46hR=kUhCzW$X<7crdKTeoh4_1ik;G`Dv(FYRdQZEbGu=$PBn z-P_*XysTwePj5FwHUp2oHHyN{wWZtpb_w5&cDspgTiToEHnp_1xA*k4^|mxOcg>r# zw0GIO-leTQ?QL!C&T3^uQMZoi_K2aaNa2kGQEg<@(tUf=(yre2mezS`x=+x>n8&Qx zx)T|7R%j_YLeDJ7_5G*Co(-+kfvskN?$|iAvtKB`uqH(MXc6f2B=?vZ?A+KVi*8Y$ z2*v(Q3mRk2MuruC+t#s@mj3mfzN2nU-v1d}`Ug{qRi`V{DtRY6x1Tb6#>S!kuFdd4 zYFY2}7kfi|$Bv*J*!sUf{+%07|M!SL566lnwA$9a`%fsIGj+SK|O>>uZ|8LA!TW9OM z&bgTD6Y|h8AO8LM>X?|Xca#1?5Oy~=H@7wQ_Oy#B{hyVG2*cJ1dxH(ue@q^Bx3#gQ zYVH1Co3FW@txXg1@IN+R9lb5BtsPy>Eltk)>Ymr$y{w~kZu7jBrlzHHm;HP8Mu+&9 zn%gJl>pwPMy&c^ht;^b)yO;Jbb+{IA1N8PTTh=wVr+r>W&(eQmzUFOcY3gig?Zjs~ zVQ-AOEBemTm2I|mmo_Ppc2o!Bq`+w+y)Blz#lSB$^? zT|HmUE;`mr81k3Kc@-0T{++Xga)=@|hQml>oL;ee_y5pQyb1gt>Nd8UiHF3}BhAqS zxzZ3Q_VNU|V(F3QXo6g62o!sHf?TomNOLqnt~3OSy*xp#SbC&6njlvi0>xgQAXh9s z(i}~YD-D5SFHevwmL6%2CdieBK(Uu6$Q4VEG)EKUN<*O7%M;{^rAL~h338<&Q0(Oi za>ddk&Cvw8(hw;2@&vhJ>5=AWf?R0`6nlAsT(R^>b2LG&Gz5yhJVCBldZam;AXgd! z#a^BuS1di!98Hib4S`}WPmn8?9%+sy$d!gbv6m;v6-$paM-${qL!j8p6Xc4eN1CGv za-|_q?Bxk^#nL0q(FD2D5GeNY1i51Ak>+TETxkdtdwGIfvGhoDG(oO31d6>pL9SSO zq&Z4Su0W(PQ~w~%FOr_KO~326o+-_{w+_pBY3n?% zf9UXy+xj>39=m~4(%g)1zBJI6@Fz09yr}UVVd^gJfb{45_D9CNOFU~IeYp-mf(8XR6$yKX>cBK*@mu&FB1`E@%7 zhRyl4XAUemW~A<;&K-f%`}-)+Ld_*=Q#o^?)^1+AGc;-PSz7YHnb6h!r#RijJ$3^{ zrxHDOecym{e(g}-lH;6b%Iw+Cna?@u#JA6bG&=OZnb~@CEz4;we;0q$nREMjb1pMu z!_daTom7bFAM88J;f6wUWfFfg)dn@BHmX6jQ|;jYA=S_4K6Tb;A1|1e^gc3TJ}I?H zJAKSG$GQAvvc_DkG*?Y^G&9P~@bM&bTpD|9zhaL4<}ZJoXEX?}Dix3?m>oI5a=$RjU^IPFFEnLy+c>adk$hftd6**)2JixJn0=!A0ANwh}oaoBP z$iH*V&_cSVJe)Fb=b};^KeNr>asM&>G@0hbI`NM)Yx3Sg3!!MIxyxtHj7kM-2?ODG zRB8x^C>5E-GC8z+`QuPi4oz2Pf_!R?+79<@R|9IR8dh6IFPc_Se?qeveQ(rdr^lER z9E=W7P7m%H5P2tr@=zmgaMR8>snIvw%r!G?S!x5@2RCzUeq>2TA9oLL-{u@UqguCl z%jk7;?Ab|$vi_Y%53H7jtz(|!HrF^U64PrARxXX|+q-#a`>q`^r##zDA*oS$kZ)+Bo1emNRl?<+jaL{P(~8{x&7uqErb_6ynF8 zS+jF9@f07e>fHsj>&!!XpC^FgM4OMG*)`liZ*R0hA+;up^zP0}hKHtsfx`AEW zw(?n|biua%jVwl&(5!B_zYi(nYT|Ro(1vwrUDpDNbY^Uh`h0TK=V3UIwyJ0Qjb{TRc&<{H-4^ve zMZzyp1v|I)_stf9hJVsF2)9iBA?kUv<$2+9hgD0RC0r$3-A6UWT|-saDSiD_v*MZf zU%oMFSW)Acxvu||ezAx8tB!`twhnG)x(7FHHMK{#4#pH^jOyWEye+B+`RMR9AM!6c zs0vP;t#WQFQ1){-D_4F{*(ZFLD>^)HtNlkSS$W4ye$wH4K6Bmtjrn7Jkwa_eR-+bF z&$M z>VxVW^-1+P^(FN+^)2;1b&>k1`jxswU9SG5u2FwgH>umzJ?a6qPd%>wsa{mCskbmZ zygF0o>ry>gPth}Ui|){ibgy2m*XiT*NqVy$)VuTt^~d$+^m+PQ`Um=_`nUS``WpQ= zeTTkZKcb)3FY7lg+sd#CtV*liYP346E^C#w!FsQ?**eWS+d9|!g7ppSLhBdSW!5#; zP1ZfuKI@;>ep}f=yU4D#XW1Qgk9~xFynTv2WPjNHtbM+Hq5UiS5B3fAUG_fvS^Eu_ z$CdA@a?Nthcdc+8k-$Bu7mDOcZGX~yVJeWeXM)4 z`waId-RHZ1?7r0f7xz8x$K9`aJf0#?gQwlI!gHMG{hkkaKJWRC=hvRAJ$HB>^X&I} zy`|n6-i6*Hyc@m4-cNeJ>HUTGD({`%$Gr!9LEmIwi*K3lc;BG!W4`l!Kl5GbyVLii z?=63he~Q1;e}sRN|1AF({TKQF;J?lPxc{v{ZlEEsFt8!;{=hkbZv=i7_)Flyz$?LE zuqHS!cw}&E@T0+R1b-8}G5AREjf}jE=@~s4CuHo(_(H}{GOo_JKjW3m%*^`CC7H)( z4rhKL^QW2DW$w*9kd>b`J8NaurmT--U66HI)}2|;XZy3KWOrr1FZ=B5^Rs`KeOvak zIsTmboSvMGIUmlsAm{fvyL0yE=I1u&9+A5(_w%_w%l%vKQ+eLJ`n=w}O?l_${V?yk zyvOqG{M!7U{J#8;=UIJOvE}D+}IV@VSCt7Tj9!Vqsq4oWi3E&n@Xv+& zitM8LqLoDhMPDqsr0CwFH;XHayNdgZKU4gx;ya69FDWlsQqo`Y*^*zE+*9&qX;o=& z>8Yh(F1@_;p)yz5^s*z%&M5nC*#+44)u_f%LF(<|0he4yfo6*pJx zubfo5ymCk7H!H8Je0EaNq$QKyKk2KJuAKDr)ex|Chs;g?C>Kj$p zSG`zWQN5yiSM?97Z>@f-rlIDjnvd1|y5^zUKy63uDYaj%y|(tny2*8G>ONTa^SV7# z{8KunY?<=)DK|`cy}qITnEFrEUta%ILrKHRhO--f-tgem%&Ci~o;LNusdrEFOzW6- z>a_1nyM4MfeeU!v(=V8Q+YD<)+l;L(thsO?v6Pq){#pVa>C_T3!?9cw#2 z-*MwS_q^_TADQ>3d2e*Kbq;r4()q&tS@Tbw|Fii|EofNKzu=+;k1ecOxN+eR7VcYA zwdkZp-(R$EarNSji!WUK=#ttco0j}|$&+2vy58UQi>~Lpo4SX(FYSK4r?clnJy$Qa zmo8uW*`>Gk=Jg)c`>o!+%W9TwUiR~4FD{?E`~%CcUg2J`YQ>jV>|R;9vTx;2SH5^y z`(YnC?D|z1tJbgj)~ZKWPhUN>`VVWYHHWSF%9;lcpK|!%;g=twj#zobSB`jSZNu8r z*8cHG&yj17yx_u=dV9;{m<6FwxN5&7dJd`)YPMP9d+%|*+-vn^iPj| z{g|c4oOjH=V;hhC(6KiiS9aXiX*@9BNd*WUB^33E^Q8M^0aK`UR&SIOFIues^Z>nS*EEeAe`{K6BQSXD>VZM;~x~pzj0M zez5w3=X~&y4|RR$2OriSKKaAfex&vz=YHhzk1qe{#peXhIrW@dKGyWH^FH?K$B+5= zAI_~j_oL@N_KD@6`1vQZJ~{Ns-JhEOsqcN-_35pjzV$P$pZVrz4t{piXaD}Wrq7-K zxwk*x_xZp7pXUGbjsG+9g;Tz8>lfR;_}wpgzBKryd%wK+%NL)Qd*0dSJ@%C~U%Bk7 zRbTz=S6}_wiC_EM`E$2Huxc!$)e|g2PX8r01 zzb^Xq=YFGpv+Fm{{Pv{Z-h0WaORoK0$M1giKU4na+n45F`q|6$WoKRX;^kW|-*?4v zSKRUY!+wA5ALjqz(m&4r<4^un{ih55T=?fNUKzOZ+$%?}I{T{qSMRv`*=sgm^Vqc~ zUi-jx$6j~$^+#TR>t9y=<;K4*`|EW#blq^(jSFx5)89J(_WQqg{QdHq+HSh+=D9at zddu8fF1@ww*2`{dzwL_K=iUB?I~Lq=<(-S~yymW@cm4J5m3QBC&*Asnaqm(0-naXN z-TUs_bl+3=58VIKp40cd^}t6TbU*mnhjJb|e{aR!3m=~L@UQo^?fdg1OCP!U(e;l$ z@L1nt|NO_!f4u$pxld$1asHE&pZw`lEl>UF>19vf{>*!xdHkO{{`uCkpL{O&xoZLhuc`ezT69=Q08jyG<2 z^O!fEeCv$2y>EZxooVm<;oz!+4~}db88Lf}0%Hw`F|gPiiv_Lh*Z3p$#P^+Fy-#T| z*X=#3MCpt5vR#7x=!d zYm}9%?OZ+b5c~hY$n|P4UUpRZki_dj0!(WQU6 z=kfhVpK|&q&;Rjdf4%pK*V>mKv-ylqef=kw-?011*K?I+FeSilR^BjcvJ6DZNvSK zhKG=R1PzfPjO?>?l~_Z(8|dk?Ag?n7#QX!O3{NPudyAdcd%77>uGy3{7zcPHZnu43D< zh0nwM?lhlv&>}xgiz?Nl)+@)wYMxLdPtdd1tWneX;8R|mXTCv0yx2;YnV^U~`ea=m z{``JDb+nB|n`YzatDw!0ZZV%lj(y=%TaANH?!AcL+f~+&&gP3aazg*7_>u?3H#bnj zwYjsUsVelX3v{9E@9W6ezHf#4*T|K~XKBcfN3-GJe=VNS$b0BXk@wK`(eGjDa38a+ zaNnjc`Gcp&NMZB8P%iuXa$09>+c>y&<+^3-XfHdL4TZ)d?$Xc`SN9A?ja%Mz-FD;X^@W~q=<)+|RI%-pAv{8cAEM|mN)Nqa zwbCncMxLfc6TjlOp2u&aa+yfQ_xLPVgnCV;kF%ujLB5w_gl#fpUBVyvnd-zgs@oi(Y;F@|M|eKK^bEeznLtlv&^z;<#-)??ltVWkLLeS+q1TAqMcB1 zri`U;;N$^0mLbaV*1=QG9KCLiPaQmUd-UqRMm-QJga|b!`5y6!V+C~Z+Xdbt=MA5amtxPJ4Wy2zeGRM z0l$Xw9>Z&kZimW39usSd;&+*U`58CW{oSj(dRBGw z8^i13_4TW6Xy1h@Sj8vje~0=JYMa>8e>Jr)Kjq#lKl__>)Rs7>#9mp&_|n`WBTRfu z>3KqJ{z7f*(<2A@e5P<%6wQUxg;Qhu-~>P8o(FgDS^do&F>@g6*o|Zn-fvc+YZ2PF z{MU2(<)<8Z@8EmW(Y~7Z%;$Frza0+ktwBC3^$(#vf1$m;-O%3bcoNV)whwdjA=17* z1?@xEBD8OQ7tsFr3m*AJ&&Nd@ngY?W44Z)A_mB@cqSx@4qCpSI;D&eQY1* z=0l`CM!xhts&QjwPUu>M_Eql!+HZaG>Urt-z5!B+%of_ub!e|2Hsq6B6s1lvv~M!B zzb^^xWBV{S9|G;MGn>)YV`%T#m(60ynQIZ+SHBBrf7%JZ+>nm;=tM(%vE)OvztNCy zouU0YLwjXte`ONd$M$iEwD*XO-`pBcdr#Q5Z&s~ww6A#=(EjxGZ;zy-{j>zMzc>l) zf02atv3>kYv~Nj8dt=uOMEJh;T|oQKOI@*ipL}X4h-+&q5TJ2Iy!p7zl)$JzNtXg}p$K>PFejC?H}?IjFR z$Zs^?pJ2$h$k2X~q5Yo>?LVA^_OX2&BJG9mt9ZKfoq+GFWMt-Ag!c9C0@{D)>if<~ zM|;T=71|5m&l$CIRvYp~%bbf0?axj^``A9r&Ew~LL;KL))$yY_HfG3=7P=OpeZ#we z_7{KYZ+E1lz2yFe_`Y?N_M$ssHpBNFhVLEw{-h+dkL|F2& z+F$y!g=ZfM?L&NDYRI?L(0=J5(jIHv{2Y?5tqSd36VX0&EkgTg?*iKYp*nw7I@*i8 zDB@S-eTeTJ+8=9Zf2^VXPmIh-#`m#(7}6gi--q_DiD)0X7NPz0cLD9MnRKjUKcw&} zh`cD_SLA(*BXiW7hI}U&+Mi%(@5uWtDP&Hh4|DS&(mu3zO+@?9wFvEJybEZ5(~q(< z)A2plvnuBojYfpZ_>jrIl%EF(H<6^8B=hVJtW-Azm`%6}Z9du$(c z$j>3sy@eZ+&^>-XJNsQg_j|AWOy$2q_ahDE{y(Irnl-@4IU1KW^~q%;1v4TVjlIZBosGKD?cwr<)q&>zjevN!UOxxbYJo=xEI z`VDVKC|vp9PvHkwZm9oeY6@%e88XOIC}Mwhd2S?LMH~fx~}z%O_@ysJu1*xNgrk=jIhpo7sE*4Yyo#&qqr1L6!UA$G>sK>m#o} z`P3VCef`QiewL-wJ1XTMO=_38`vT>i){&%E^D$Nlf9 zx0J7E-I<^M;RRnC3cRJ>P%hhD5YTV1Rv4ZvqR2lF-stOJ9vQj**_eOtjJ$IF!I32G z746ltG5=_}RC zhwQI~q>NAJZxiPh5;0$nUDQLi$SQR#$F1yj7ZFqG;LiESJTwiR{R zs7_GtVYG9}M{DGXb*i3LD>yTQmW$~5ePm^>RMo1AYt7ubf%c2k6nDY9(_gS(yAL2sItK>Vo zC%bv_lAAd97HID$ICx6As=d^`c}KbG0Vx!|3V6dUfb@Ji570FOeN2t`fxc?xwYaTl zuTqm^@bX;-&W7l zfRk@4TZ07I&v>8a_bo_Jg%zrcpHn(ebwE9%+!h%+F6((lw_n)|(t<>`3*yy0rL=Dn zkI2e4{cQ(u!bq$_F(41p=qMT$J_+zcUQpZIukFAAhUv+BR=G*s3Am+Qk^5ECtF5OO zS}#BqMpM2IK(3Of1m00L=B$rt3z~+{EA6!zs2zL;z^<++qzm_2`Y!dn2EoYM@-N@7 zZp4_C?9hjKK}#=rTpd&+786>0QeXSoMP5N2?G zh0u?Schf`Lif5Fb?_xZ<5F*--n!BGOv1%`;vf&HhFTQt}))F3N*T6gZ!dP!9dJDe7 z(C<+?$9IoXGZ=-^S3>&NlwIKVl<@#R=X^F3lgkWOJ^4PGQNQOc-OAM_WMMiz7QIzx zJi`!}SF7`RwVSSlH*8+UYsi$vk>_rP&f9n_MwTh>K-c-u!g^WpBo~CWU6!wyd9`?p z5kKjaf%z}U8-otB80(X8O9n)-vbfXDozO)VC7i^f(33Oi0qF2dsAbWCFrePc{kk;c zd1Yk<{RfoJodO%Wz4S8K3m<$KHd8*{&+j`ReHB5)c6QA#GXurS{UB%dv%G_@hh^qk zSs&Wx;k9zgWbu?S#A=r1h(5rEOxRupp~z4`M!*52(yp)5Z6>Wfg?ptB>l)?DufpXW zRQWS_@0{7M$YzdA30LMmSsXmGfRPoum=WFmoT7?`djS&@gsXU#Gd1%03Bd0*d(h0^ zKx!zWp@EON;vtnVl#n+lt6>TgMq^&o`&-8Eay^Em&_Nlu&3t6Lc>N}iko`D5xoier z{(^FELVQe`@lVk9I^V;9a%Ksyv#J{1Zz{V+Srt#vk8-m@0zusPM=%XAsFIcCdqr7Z zmHSV`NvD1mpuTdm9x`Bf5u3W)!+dC!|DX&??@=~rmTA1MTZUqifcDdkS8OH z^bFRY_DkuI!Uxs$tjULX<6x09huT8I*|y3@k|`JLd0h<7V&rhWuFHH~d3}?3^Xc_@55dXlRM5j}k0Fz4fIx2H*}5S8Xb-Go!IvHe zf(s?J!ns4#eO5l4%4<{OfjO0~6a=x`P`U?|n>o>ya@A!&Eo>66dVVeBnv|p5Ue_b?se&6l2$d055o8K0q8}pSjVjVs-9DZ!qKDC!i+YenlF|I8va<8wf9^`9 zhg@0DNWORmLe{dTLP?L5mO=T#G%xbX+h;u}r$7b*|tgSBPrSrAUuLQIl1mW{tvmM`64rQaPxd zETM@=aOH*Y7WY|||CCpOd0og8?u=JD&nuT3S=1s{On&h1tSD|+CE6L;rw6<*C=|+a~te2f1^>q<*Lb7?uz@&`ze>uf-IaQDoNPFhBYxnm4|1$gz0MCbmc>UDfjDCi?VU1s_cWx>t>jf z@|E{_QJD!9)Llx|z72o73;o>ULaY>FsA_qF2Ug6n9u$p(j@^CQB?Ri$+}fYKJ6`s8rkvXX}7+qNy0?eq0m7vW=$8`tiShfnPvTAt~xPggDq{nWNgCfh1~NQ_X4@w=_+%^t?Z-YGaqWYQ)8vi!D_5mk&GllN zWJ-|$`iy8fRzLuaO5<|t5v7;rz)T-6Ylw{TMXL1lC>nELMmE}fgSzV8+z2i}9umE%}ltEb24=RMdm{pj>J0jcDbPlLMyRxO8gIE zcqz4BUaaDNd1^8(DmNlMY`DaoT&BjDAs+_l}J{11EMy!il_S6 z@QD?um+%^aXJsJcQmGFcO}Li6bnsbp?q=(jh!Ryr;_gYRMP;L5xioGCRdpR5G_o8- zHAQq#!3)w`ay5#~ zDPX6}kTPKfm-rH7K8nN=q%XF&{HYO74p!DJWA!R@aj`mSZf``VTa{`iZZBOW&z|&{ zc{l6?vAwldw#TlkL<88eU+cmGK}LuWT+4h2NpvP2&_b2VFj8yQz4T)FGnsRiLA7{E zGwEV6W3`VJ(a4nKBbwNwB~qU<&Ckf5pftcT^)WX0Ng|)`V_Q2`T{4#7%x8o|Id^j- z_KpaS!oZ!#IIR!kvz-UWx#`d2M1sBcbSMrOCDzmw>p{e@`)bTuQRTWC z(?p4f%AHRq8dlU>7#CL-dp@UVyV!FvG&hn(d~dq>IgBn>CJqnS-&G-orX6>kcd=!Q z77*)ETzU3J#y=M$R#;6|xSfaffK!;d(!6sqJr!1t?=ErH(maU!)ynY~Is#M4zHBM4 zNLeIdo`wCg@{^t%Y&r zT|(z|mcnr+bj=n2&g3kn&?oEEjqAK~o!98NG_4pWoI8t4u?AWZmOfai0QykTJQzTl%GpyiaV_H5cvnVzl?me^p zV;AiT*eaurkrm4<)X0Ma7;bQD=9|h}I-7#C0n4eL=@Pcr+9jcr$>IxR1E<7QYc-K0^`%6aIrHBSPhp;_x}G3fL`1qJ{rZ@Jgu`)xz3zB8ajiYwn7V z6&?__5s!ARneIq~-C}y^dsBr7?Mc|m(BJwH9Ga-9rJUd(ZgM0LayCh5@Kv!Z164AT z*N`zOnjaLsm6c74w6VdrrBge=_}sh86b=~^4Aiz_Zx*}+ zPD~#1BgCWbOnCiuxsTm#g0LU@4uNw|{N?>@RT4-0%ndc{!H~n~5+@dTPXw>XT%rDb-030y|MCsa!?5dKXX3S?ueT}qZnoTKP=2y=+x zKl&qo)G`ai4rZh*53y&l1ry|?us2HJAY%P#bOp*cWkSj$YWG+#(LJm< zf>ffMxj$(V%A?#n#x-OI3RNSrO-ybR8>F99k-7CX;#2ia{U16(<54xtq6u43n zMh7KIlip4Aw(`KNadm9`*F{vwzos5Ji`hP*_L4*o;SZcgZy^~IyN~b=u#02I$y&t%NEkAFSmbJ)1Bu0#^Av%jgt5Vg zg?zCtq#MMg78?d+?~O4+%P5c0r6}=2cs^CkkNXyT)H(2%3GTr^M0^l*%xzSP%EK5B zMgYb5lO96mnP{Gf1f*c%EEUPY8n<)lAzncudrUxbQ*;~;`!;vaJ1A5yXop<}`zAaWz21Bgwh zc#15X7MKp>PF_K~~7SGW~sw)|dWRpah3X6c>6pps3QG==3^=0ZjJ zjedc8N*T-BCzBU)AgQbeSSFS@!_#G>9SG~A-F}vvoS7@lLR_P zgLX{E*pQu)B%EA4N)T$iZl~9Xy_%pM=0#M8sZv}+$mq2kJR^W1OigqFLV}xR5$+{Z+9L$Cb$f zLyXTsMeHI_WsKI887>cv*EdCcpG-BgiZBV{l3Y-hjqJT}Nu=>c$udlv>w?Rq4q577 z{Fl;$tJEJEsYIxv zvR{m7C2F72S@kSlab1vx@(Y@OhMAo!6L_fLe`5kCPjPus z?j7T(lEfht^_Y~F7cmQyd#*@U-!D6tq`|sd<@Ur5EKDNy3HZGdMeJ@B|6a7C3fUb= zT7N?XL{f(acBSW8?jMI=%l7-s!ijQWTqsg3xl3zA*6&PACIhLk?8lAhjCNF^xpHQ| zss3X86q2$0IO(KGd{@uG8L_aLtJs35#D1&i*m$PG&A>N)VupzPab~8!EM|IA_>5%! z6K785m5OAizrq}+b5iUTCznpP05 zf7Q=q!xZ*MTqsI7$|H3(JSShqJYRNIDG)KPtf$qV!_&z;!vn_;geGgvg2H zDaIx=<>8?(rJK$Bq@#ET10ERSHiS7@zwwiJ8KX<)QGn{%2QaZr3?@9IKNBZ;(p=;F zOrp8t%uG4GEYc)d$M-{EW`&a4m`~%wIgL&`9(dR)Inc!W2(B)*jmTRg4EB$3ydgyZr4(7a!TTUBr^FpWn;vSh%e$MLTMg3|cxh~Xsh z0bp}keDgWGxUrM#k;!dQVm&9^``;|P%Op-CnPTxQB=i9gp2!f#T++$DSE6099svYq z&;<_`abx17^4%gIQaK0c!otNhF1OKMks@!2`cLFQ*zM$zr}PtH)LY17^mlS+!ov(X z&M_2DCg)`$J_EwR#J8A;=oE5VBuxE%P0XlN^Sz(#SQ@tg57hq+jFT&C}9(nUg6I>>A#@D{`-_^MT}85>VzYf`Y3Fx0bX#Ar{!_2Q{X$wtpfQbD}a zV6UkDaeI_Pd~`s(SaFaTS%2x=N{IBg24wnCD(B*>VU!tTkz~Qu)Z!3vl`4@10F(~&X^c9Qce-9M_;<5Z| z!&v^~c*fyi*Q@y_SpFWqXUW0xFW{`a<2jpbhlEd7l_wP5*YnEnOJ-)6A<^GVSaEdK&(0EDpotC^Kno-@zE@*jiK z3CE6!x@Ko$>gL-HmOl^oYNcTLEwm)U@GzoLs?qFJu473UEPtwx();I9}ke-%DhxYA}T<$(Ds!(e`^=O)gfIkNB>6R>gBdRYeK#!dswUla!O=g~Q7 zn=;Z^Fn`Hjr6#l2l>t_x&tt&+I>&(dD*!R-oE1cm>RB2Nn7>3~zyi9*NVGVMNn_=Q z(fquT_EgJ45;T9X+ClT@@|Z-i(`s_bz2!V3o9#0F4cjh*<_BSB5)iBv(6}gq<`-o4 zD4IVXG(YieXP;7RK>FAZdPY77Aca?0mG2XaTKpp*dPMmOpdwT7C5&Vg%^xsm{>ma0 zu4@f_mw8z72F>3aLi2m=hw0YRi^6FB$p+0|>DE`72T5j|N0kbgKQj#GFTofs6EuK| z1@p^$A(9QCzmBM$_H;mgN&i|-jR<(B-ou_lQtTZ-zh9&zszm|~RtdDVrx-wgE_99< zx>bx?lFCSm)srNF+L}r)l6x(`8P@KC^-^R#iDz{xY<%+4=yr9L4gJm|(E{dB96#w<*sF2T_lo1Yrr5Xp3AF9c;oN z7Bqh$0F-viyg0EA)M-r!&9B=Hnm<}Wd5{s4e| zoj(;r-Xpovm4xKb)VjDzz7 zbJ9Db;r#YTksNVw{=7=1+5)O@mN-wE!f^hqeGqKTgOG)xl?n#YTH?U@=P_WN5YNxI zzN!oz+VwyNAJfH@hVpu8*jx>QC2-I>Aj10F^#MYPP- z^c%+Wdt@JKV;+f(TM29HsjNYRK8(im2MUl32y*h|*tXcJAcW`l<%)EY%|aBOUm$ZZ zC<&-l(c0-MawFpK{3fy5;Q3SNCfGj!ei4}*ZKyU8YmUM5C(%gJcz#&LqEm9RSlqjIs=fzF9*<{TH6?(8dA@MIy3M_dyCG-?$Uwf z0_e{aX=wocv)OxjrZdf14xm3y1@XivKz|qey}APBF1^pZnenz|0_Yb#q{4~_TQ!FV zi+MVV=`Xw=MwF3g$yTxoDh;MTk4ZER8MplqEHH}c7nrFVhSydrW3&oHHVUSHy$k3< z6sA9kT7sDjrk~0&2BzwSM5R1V7}M{L!Sqj##`KR-QgU2B`cWz3;|N4#q?(Y3oB#yVKDtv;?iDf z>S#YP7oF+jwf#j7ray%iW9g*F^c&E8LS1Gs{pFHVloQ7E=fz_BOWX$2Ul76cC)RET z(_byoaj8n{VESi?k_P_=nxWO>cxPfU{a%)C&OOXx1^xHoX+oJ=aSv(fg zZlIPX=0k!(YEBHMKe1ZFS1rB3b|wIt zi_t;?4qmlrOn(yf7LVy)BwGfkzSu2`9g9q5U~QU(4!{*Hno7GN(8Y#W7=`Jl?wZc5 z;!il8nmQHQ!SpY2F#U^o+mw1u7s?j2z{tIsF_`}KvQR^q{yJ>qXiR@%O&9X?xr(M4 z`WRWvd!k6(GXcjR#R~QbU|W}neGCWy2qb?BC5x#A!;|$~w?~7Mei&mAq=BytF~~*HMAP;K>Eqzc3ov?`Tet{WGw~ zqLBUKyTo+KNpw2uc@)ssiH+KR&Tm!-n=C)1~>S%``>SMFF$e=#gF7qBdxfu|^; z8a2>-!NZP8$1Zgs{YjLlxetnjbFtxMNy}y%Y>d*LQAqzd^lAjsKLtsfR|{dh?D@nC zuDcOKfb%&uE{*Cy`d1>PHH82ydmRahCb>v-sLB&ae^MnH1?jIQs;g(S4rD`LsnTiB z2&BI>1nKvSCrFnw?ly6-N0g|6^vA1FERupTkp5QjSCPks3%E6%e zebB2}O1fwJ}!LG{ZHF{p0l1B5~ji~u)P9#(HPClFdm^d&+=d{TN5 zw-=}fl&--$iOs`s0~y#Rf`u08<*HGtPIQn1>QAmmG4c!9E;FJmm>~@67axtmRnHQz zVmzonO0i=2hCuyW1k_)lW(%mlTAp3;n0Yle!3Nat6G)F80rfA5fcn>qp)aHy1@(&o zm{PMEP=6pA)Q@LH&1bA(P=78SJOTA5(4R8V5m3LM@w!iBzZ(VWkJgurB{+KwsJ|rW zfcjTJdKSrN_LH*;oDT3;k%5sr}?FzBJeL@|B z>i1woGR32){-Cag0tVHe@UAebzkDiW4x{=3w}(*u#Z&`Q4REEP`khu`RKIr-OQ0r% z>US4~QT;f$&928wZl>`z$G6mqz(pK%KRv47^N1Nn6so^i2u{>c`(v&-I0uM6D7(8T zRKFnWN6#5le>XgCQ2i8R6PbZYZBYH8^X%?%pUI9U&ln;U0d`RR9*U+~LGKdS!m16U z`t|)u8^aO;WGDdD?=q2Yc+rG+^0<(fxSaS?0E&`{P=M(ETtt?E!246*BPDady9*jh;wTjaI+Vl~47z`ogYI`n(EYSa)z~2WD^QDMl~Xc~4s%&{ zCJ1BdYdgq(mxJuD5oCYT#!Q08i5ePYzlHhgAp4z@H{(+hWWN(M6l6cb2@02$gikuq z{z&Z5K>N!C+8;S5>#}kb+8>D=hN1nE`ySmO5wt%pU^oixx2$tSZ|c}G0H&>_Mq`B$ zw0`19p#k>?t66h^`-v^4Xm2vhvU6#XHdYvi?oWGD7~P*DUKmFAk7?te`+FU9e>iC9 zp!>sTpBI0;7jS>dh@m*2#q*}8WN1b^^a-wf}}-evbUSWq6nTCn4n;O(F_A%o>5s$)*(F9bg)vO3baYUVSOv0_5*VYn z{-nV_OSh{#69xwju0L@AFpTSuy&Q$>kBj@68>Wa0c^|tznL1*d<#UMgz=LG`^4Q5h3ik{mJ-_(r8J7`PY?>c5)q9b%Fe8!(+I9V$`OU{Fe3`r zAC-I(gXrdoIf^l-f*#0UVm7T&qAqv|+)?EaTh$U{#FxdXI2`l15 z8jI~0ZwL^CXl#Gdz@TibCWo>830+FN8Ixf9b0K^3{1k)jAD?H*f%d1*O)=2^WKJe5 zG1M_ZsQB0**%8%Tk=m1SexIX^;mZj3S+ix$inFUxELTx2g8tC#f{|J$IjCE81X1!fa>EJf1Tv? zN3v1~mOvf?^6n)5BP_H`3@tVtW0O*DqtBHNx_{JTB6Er zY!GyR-YB|1J}@XTNQ3TA=qZA$Go>CME)_|t5qmaqh>$%}47xw!D-x5{LHMUkQZWes zc#qLNEI&c`qpC$@Buz|-hWLm4M1t^dM#=#gGy8wM;Zp1*X<~|l@K5I~VxA>2rErdx zfT79U#;-CaV})n>4Z=UI&qxsdL30Gi&{2*9@lWYI5<>^&5C!pfOFU{6 z;-AWoB<#)P^{|CP0VWA1!X&toq9Ojgbd)nmApTkM?Ibu_Fa{E)xkMoT5qA=qr3eACfnOMb_$SL+iG}!wyi21H|1^m!5r}_!S5qQ{ zKP5NWd_^GsNgYaKApR!Oho^KD;-Ap>L+7I&BiYtQLHv`3|H2UeIByZl!GZV}6Fx`B ziK0mu6J(tvbO*8LHyHn-2*!UL;XquJd1)d3i9>(f3SBL~CmF=Q9`2S{qvT^pWwjWH zf0Pr+K>SmM_6)>7Q-UlNkwp%~f86dTf%%UH z@Ywv13E!z&_V3va%747>Cqem}0A6gmOAN~2aXH1J{G%dwVU+(EpA*B$4-$)v57il% zf2TK<=ZUYuV3MN}TS74ZWNxE~zX^wtBx@+X)yTp5OPns8=W>^L4GqRWwX0~URbE5^vH4AN$~wH!R~Y=%64(^{hJ!SCysd8N~#Dp8F+v4cpdwv<#Qy;liYD-lG|;2 zic)`MpqTSIDqd&ADxv!^o+yd?vp&fuzz8%cFf4JOVEdA|rm*L5Od(xT2I?@r8f7Dp z&{2g=hwV!jNi$s{(EezDmE;fMzaNv?Vxav=omX17JJ9}QAv*)@k9ATZA0)HVB(aB~ z{qb?TC}@A2CySlc6bIU$DuLNR`^UPh5c@G1?9tHvQJjo{_K$H`g;UlIwBG^DTn)J* z(EhM53w4##6oK{!3LI$vSQix=O>zW)4Od0`DL`%b)L8G-KTKn={pnJbW3l~X-BM9W z>Z8#9q#lYev_Fw!Dw3$~K>JhsD59bL@jfb?<>JLM(Ed6+bq3m>5Hf=jNbSy&t%QO0 z$Gaweh2~A*vNF*Ausgy)`=gvvW`dce2(({TT>|d|yZUH&zmu;XhWDp{zi^|CkQ5&r z=>8Z!FzEg`|H2)nC5WDMOb|x*XH!umg6>Z`(-CyPEk0sNUP$M4G6?_V>Bc6z%|oFQ z5dNtr)gb)ioeU1bpEA~1NAYv%Ap8@16_~A@Fv34Pu@QuSqO{{N2>(>GY*79Q^N{an zE+tV0Pu`&HV0|CTJO=N?R0c@^#MIM?eFB&Se!hhQb&$$y zWHym*b&J99s~CeCzub7C8DsMze~)3xUPU`7Vx@s+qvs zyBS%VnnNmoBV#^+r_7~CDKIdVdc@1rd(^SqKa=Mir%t4|2;6@uZ|1=L7jbrp>fo+w z{dJ%Vb($5_FcrWic8@eszt|RGjnVQD)7Vtjn8P!_OF6Jq#Xdi+5cR;Tu`kcxW zkLK!X`kSey(Bn$_Zep~D(PJxj9mV)(aZTvHm_FL*wVP)N+zz?ZLNVgDwWfAgI#g8BFQ11e}KFR%kOX|GasY=R}Rd=@XH z>)d=tnX>uvb~{+F*%bkSsxb+c?*X>lzyfhV|MC@(BkmZ?e~Altvy=LV6UEoSYO=}@ z#F^8u4|$d6uy8Sh+!9x%LW1pO$l{omwE6~;leDJcmyy0!Hj1N^5#rK;Yi9^kojK;oXA4=M0F z5PUdtns; zh%Rk6$p5JX1vIp&+}8F}wJZ3zTIZSKV%ugQ;v*$FMV`YwnfkM1y2n z+XfL$?ovB!9?Zwlq@)w?(*pOgnE>|7OR|NpmB}90iJV*I)CH&|Z!sF>H^F)`wE>08il$SFrSC_n*xFnjP zSJSZwz;2>}*QEq&h%$HYgHZf_zsEzvNE-hsR-)RBDWckwqB~2A-++ zfh@Di7_es%aq2>Jh+Vj!g`He?jg|-S7?BG1D4X%ajCvXXO|P$vfzO*;B01K^JC;si znIZvb7TqphDz9*KW0nXbj|d|{Li^Y|LT_#SI05B;GHmtXzsszj?o+>ypiKo^I zzsusuT0mM#egUv*?n?C^R@;*Uea&jkYoY_)#-y3lphMDG5W{A| zsT5!z$*@SEpb(qvBUw&*Jr;@|q%$X787LlB50~O}m#Gxs3BaX-@;19CDY9ZJ1(1U- zB(r>sEl*UJqqdw%0WgOyC_*{qGrP7&g!K(ZO94&NQ`DZ2n!1tENS4kKrcyu|>{BL+ zbvl&-jE;IozM3MTmO@kI3TZ^%o7`A~g{*~ftN`rnk}tkME^>Rko}yd;qR!VYHc)|y ztV$wFe7S&Rx{6g?VCn^A`z}JGG$U9@no+sodI1SFl++8rxdb#zuS16;RXrjf#CY(C zh!W19WC{l))Ju0D+33K9-6-hGHi`#`$n#I5cmT)7pynNN+87N*Diq&^h~b!8Nx_z{ zihz;tZM7th8m#&Xwwv~Mk@1q7C;ew;qf=%O-}E%oZ=O>;AWn1fL}WkS9qG&`XxCY# z$~EbJUMPr+2Y;z@q3?pDfLtBNlFeT-$ zSYV^t>>=UkH`QGbK7+OMMF}ZXOj5n}kW#Itj6iXKQd`JmcMc|$d5VYm z&DIaftV8V*SYEqpojL*u6x=NgiSP-eEET0=Ab))Mf-4`kl~Mwk0@`q)fy4|aZ7o*I z@u*BUe1$RMF7+}4g1u%pp#60$27e)@QMRAg50;ry0x1m1SSJ`CF%GXjSwBw%FUZ3>k5f({TW}AEg@|foS!5!bX*|UyS7L>H_bk-4?CaS>>a`*ZD*}?1 zF;*+?mbX8ku4K3pN3Ajiry!>6`Kl3&QX|MyJF|tYCR4FSDMj#;NdlRpT?{b+c@WY|wWO{wT|;vhINuf(%SD2ayA6 z5mg053#t@q5LT03;6Ppc02@yBpCgvk>Wr=`kVGAtsscdPB+oPlrtW690Nhp|=@A(q z$fs;fSCK{9sVb048;-gW7YS!Gfk;OCFy-YsK9JDLd{xXDhs67 zgVdRa)TXk4O@{d286~!ka7mw7CLT66HWfu@!^0kS!>p(jnh_*^P;6CK=`8wSumUjV z_$F>{q_V&ktY3evyfa^LWfH)PWa>3^Vim{fPbv#cQ#nuyiSHsF?mk{5zZ9VG1sI~2 zEnALHtq^dRsFN9_ph$|ZE5nU;bt(%)^edGGiYjHN*rs>WUWRp_(z9e9*xn{<4|ipL2szvhYqPwix>egc?a)a31~0aw;eIhU*_CDQ*#+ z&7_N}^%zxaY74|FTN?QyH3rTzH3p`L8G=H&k5RJ3#2aPt{ntk2x*1iQsWXsR>7xFY zNS%QouLPsahU&~x8NLy*ijW+YVjr^Gld2hpm)!XnJ|_Pc@x+lp}^W2W`6sFgcc%5FM zN<`V3k^}MTb{|3=wvrWj4;;V^MlK_1=6b{ggOQCdi8+hZ9WY83HMxLUvG$6Pbd`Q>tN8f*>=SX{3`{d=@GP8%RnJxcWqVGB-ICz>*RK36!nO zxhX*~DT75FV0fNwBE#=9P=I*l%2=}Jn-T;CcSB@Ug$R{NSxyOp)qHlB!cyYja7zgS zM01`gLC}!#q;!}eVnDvBxYd48tRX2uK#2+Nlk837pYh^aMDt=5e9Wmq(Bm~V2ztC1 zLwi#WUfh6s0l9m&D>zz%pn_AitiqV$xZ|f{Qoku0VD_nq}hRu^HK;RV=gj0YZk3E)W zvJ7)JY$*i@oK{cE)C5m}Kc|TgL|eE+y;Y|A0NPSP%|I_hX&0_%@z1JS zUc-I7NO4ntK#HZY5l?iTI0^3+@UjRPiW7-=NUQ+y>f0OP<=AVc2!T|7*d;{>-1>4c z-GwhbNRz1ZrVzne7%I9D0W>v*2twy|hQjnHfiAvUq#XPakoD@zWtsy%Dkf{28ob=( z$tZ!;=8TVR;WP+OHxxoNtAM-?Ef|`Xi z%98z#=mEGQ;fECySyw{sZ3zcVVfhYi_|o4k|h}_Q(+z!gC*aXJD$5# z7Ls7HW~btw3`>`ZH7xPFES$&IY`1`j_}1whNj1*EYGlhHV@-8~sZUVJu(D*9!38kO zj1BDsZUT- z9X_d5A-?EHu+!8hs1ofHIS19OV(JsbhB-}r0@0{N^1@LKLiGt!1vl+Fx0t_{^=;AY z`rfgTP)j*+&8T_<38R{(K0)R*EE0BQBkmNqXqxf_E^1I~cNwxO?MD^s8#1HHIpFC!fryEFv~oap6KL@A>hBCosoO&Gj1 z6$&EZOY}@sQ&?k6+%i(3AmphgjY?Sf-CttZI(iUcmMCC( zCE5~ymmRF&p(>ffOB4lr8=od1kGhV^r-`XxFvhKQoOo9?#gs3>&iN6yV-=-H&MEetsHH@=tnFy;;HwYee% z4dR?wNbb>s1~Hj86f_VImAKN9`KY9z0WnP2I%Nb?3K|fZz=nAM zh>ebc8SA-Xd(k0$6Rv6y7q3JC;mZ+@#F}>ROW?SY#YMOJB-U2F;29zbH+RvoQ`sPi zs|wpL8{ezsfQ-qvxs5)ly3Ot_V*BF6Gnu)B(aitb-gn1IRh|9c z>1BI`WgB&dDpe2!m8OUddtyV41$&IW2Gn5Q#2Af=8Z|}J)I|L#7E}~<6jW@0^ku2r zcW2x5JNLZb?>RfWvz`2YpZ718%ig*5+*6+ZJm)zwwL!9Z3YLva;F~pPA7)%5T3P88b-3iRI!s>+)=*L}!DPim2U(fW+FUZxL9c$!YC68U7_NYrgH*DE9{iay*+FO1 zl}dKdDLM!0K9Vp&Do?Uhy$ubMk&t~lDM5qhJG2#~QWS_y+kyVz1YJXMWV!=J1#~iG z$#e((MB~8u*h0h4VVSjLwgb2!F&rIENCc|E^iPcJ(|9G59drxMfps<)OJKo&(vNkD zin2@k=lXF=wr4x&VwwV8SYTqZ!ZIbZ9niVbb9@fxS9do+L64@!6P$zB0n}!ivQe^e3kzz4(I-Xev?o94#WdAn(?ajkq{YbEzJhjuE`uR+0j&?y zmL=1~^dH0nJT67K0GY!uV#!=~X=#W~g#D_ex8NO>3?UJoFNdx#-yzfv zl@K8jtgkU4!r{0I0ohoP6g;rQmer9Ep+Dy!FvpBsT06Shy<|d!gp;tJfE==5W<==A z6oxo|nG)e}19Si!hi4gsV=xV9hruA=|k|Q3Y_|V%NB3Lc05F+Sp|8=GDHZy$Lg0&7YZ&m_D-`TufJE;`2ox~&pj3r>fP?nD3jIt9 zBG;w~LFHBG4i+k}LeKMp7^^cx=2hq)GCsCxvo z%&gD@P+1@+(EicQGSNBeSwl)B?h)5xCd5xzLYy&+o&;v(i4-9aC0S<6vLjFLj2YO(j2UZMNfsSDNkK%m;STN8713hr$_5gGM zm)wx37F#NEZe_tojf6qSa#5(2Xr;&kJO=rFM`fN;SIOkoLJez zsUdML)~d8&A`A}fv*us{C>-QI`%Xzcob^`I%#GWp@W__B!XJ1HQ6e~;_nGsVa;VqUAStWA^bnbJPN0MX{*rRK6@AvJ4CeCo#=E;qo_Y1G(U0_^2dY0s3DBFX#6Qt2Fyi!ksvJH ze)O;Q2t68a+VJ#G3UVw$b6@yoRaiHS_}Y<}EMdD-gu;(a(KY)~^UnHAh`3=`qJQ`~ z5-+)I$F3+3pc`MulrHOZT^PqjwN%TKMl2X=tvm4C=@Su2=d$MBwC-S3d_RJ9n|cib zn9^LUMYQ$MCl4;lbUJNlztfcYvo9i|Y9caPxvZt17?J9aE-rx!GK}QL=Wc8@{C6Y! zs>_tVv^G-n!xb*f@(%OttFlw%!l#8$! zOYXcaB3|*xGT6L;sRsI`Z>q{d@(mD_edI{xPPmdIb*MZ=l2 z6druUubMP_KbsXu#%G+8?e_C@ozQ&^B6(jgqCUS+`vwugaf1l^8iij3eNCcKwECJw zOzic=`q}GZx6cqi`ZQ7Lvk0FM&Av*XE?ThHgdgYCZNFRb*ftcm#|KpDrQlZ4;A<7l zqRH1HnoveFDiT0-{33*^scI%F9z%ob1^0C#?yGOx{~vUmCOfWukMC=;QdB(Qz6&4#6;$8W0d2hZO?QaoD5da9-W^yA_XZLqU5q*>OD;5-tI29@%m2dwky`I}ZB>9BW?nYw~(z?|EeJdDwd)ui=S$ zbx*|0UJTgW>T;Wzho9N4yr{5rQv8P%dA@ zxmWXqyddH7LB3}3pgJM1S$O4l@TgE#Fz~&QR}%(aiF-r19>(KwToX8FGd0vBjAH}e zV%2#KwGpT|uCmsKe1jh*l&A)y_VS*FCu6c5d`rhQL$-%kbyP2mE2_=B62ldCF0ZhI zTSb${jG7a^TICU8EQB&N3|6CHf3XG{2GB2C#JXr0)CTktk2&gSsl3W#c8%dB6l(Z_ zL}0IkL+m@jVP~qQ!~z9lsem-Xo7y@**XgVlLq+l$7bLpe*8|JAj{#@Y9yv8}?AJnq zf{Sn;-yPs3E{JUDQVh!hrsqg}FNMf9Tr0*l zSj)qfk2|^T!deQ(z@ahaRY8g$6*1rTTO`&)D#uIwEw48+wsS#sJQlqcT?+oa@K7ie z(VG@FLMOpcXkovC+GY>x9SlQ-ZllI z(}V~_r>N$d=Z82Hs{LcG=6F01H{$gVBJ?QlHsSyFo~a`pSj#uOL~}kH54KcoeQ|D{fOPukc3qT>z#LmCBsuKQiCDDyv9X*#?64QC zi;9-ZAb2{`SI1(ltA|6pgh-bDdcX)jf&AV!?{*`!>lnb5W=}b>#)zy;4QaOdtwzNg zV4p7Uvy z5#DlxTn#N}UD$W3op@wD>-#gUkgowB4-X}Lm{O6$qYo@+euBi-36qoMp+;dqAZP^R zZvs_{$$b>!LMsG?7BJJj5H=2HUk2f1w=c12q8tKC-|vMWoCHMx@=*Z$0K^sb%@)W| z&8UlxdNrY5jeSwF!)+rl9Bl*@B30o&3i^WY0q0RmVDjPYkv{>VMq)!7K@t0Y4{Zdk zK^sBQuz@zIZ=#L(KH7+Sp^ezfaa4*LmSL3CI1|5=3aI*}f}&6^$dy!s(n7wxnvUyI zO29aRPmqTQFWX11BU_7KwiKM!%eDrw_VlSuEtd1ZS@bM zC<;Za7@o)5k@n|UU0D$klH8Y^nWHD9Frs-lhLkg6Xo3bV-U{g;>S+<+MBwsrJiT%} zvF`yd)7p4!I!2D%wu9@slQB{qBbyXt*G51lSpc+7(Ek{qsTEv|BtHa>1C_=HyFyNQRWT9cO%?N&Z40b7xK;`g6 z6vt$&5tNPvv+&^vKo)tL@Yxuy^BW-?ky7$Jf+MnBeuo6H8PBPzs%rCn(z&P<4A>~F z`h$I<$!s{f&xI~Z0|U(f(C1?tjEy#r;c`Dniq90KGqEXK2T%d)iA;I_@j;L`u!6yw zNXtL@A%|neFZ>aI^>UJ0*WBlugOO<9;7ZJ6!Mr-tgw;k&m|NaKwyB_&Zn^~u^M^0K z^wOVd;>Nf6tbb<8Y7trg#3@5ciZX|Pq>JFsnZeFJZl|buViJ;?+b^y#^rzF2VigRc zWM!+q?dl=mqK=H`b>q{?>5|tt?Kf>Q^z!pF@lpF3F>&y=QY4-RGd<_kL&8{l8Zy4o z^bpfr<||u7aKm*7#ub|L_*E6?{oj-zYeIr;I%bp!{lH6Crn_=)T3;16zFwGyd5+p` zhRC>kOoqi|wmOSv{#}Tc{dc>pdCT7k#l_b}upTJ3i5jN;D;})gxV%VcF2}L|tci*J zQ&TXPMKMmN>orkZb&o^C_&TP33d(V54y$Y`^ciKorJNsYx83}u5qlI1YCBA6iz*^z z&tZ-u%C(gIC$7Kg0f)xnZ=%tCx1e4TJd|-sol*NUL>xO!85ivk(Jg1g=zwmu(zLL7 zX?o7k^S_82fj6cx_}XGR;iYI)SoA};4-Wy(-R8Rv>B0I+|Di8`5&#Z3E^iI)uif^^ zovj#R`_tw1P46tV@Yq`PQNzL8D8QM|e0>?A$(%lH7$T>8GXRiv*d>GPkvTSk0Z}}U zf-$u~p>Gue%n(?4*n15cdYP{R??muh28P)G`$5s@gJ=wmJp>{i0)uSEw;@Q&di;O1 z1w;a6fB~T`*rP50u*2V@Em|3~767-)upQ2uXbUhMZ2>(&Tfhj>7LY7e541(Gy96mL zkjn93V6z({aVD^yHqF8KBleT|kqxGj(Fw3JuuYI>wkL{nwkQaa4o-q2sDK`@HXMa< zM76G2o&`Y2Tjdd%0@;NI!VR^VkAU{$1?qj&^{5$=%JU9>afcj(ca(ldeh40m>(pDx zr1;AZ^9|sxte(2+C%?hvPa<~>Un0e_0Z=w62J$G|=wcu?u=Of*X>)>yn9( z9TC7t%Ui+ff?zi!+Km7;@jQMtoI<<7xhLR ze_&toh;LJ06L?85Zcd zJ`s6(B-j*K+TuSL#@3$|g5WEb<`}hF7aPy_BAW>etqUJQN3U6wn&4#-X} zVEdJ&T#LzJUQ#0(uPDUYDr9KnR%h0V^4|=Kqh?Oa;K%jQ^9!?J%(lC(3r7C(Yors! zGpScJ#J;;89L=8o=Xm2o3(!C`-8Sw6QF-Mc%n7tx=kGK2UYAR`COdOwDDuwv#cs1R zbKYyQ(C16Cp$&$#4A;p&81V!Dx^z{!(6{}5CUOd31T4jO?S_p%8VG%J-yo>b)ZA~~ z@O5qV#@Ekm!O+c`){_<>V1%qEND#i) z=f0fs510-Ty8v^`uuM7XiQm58Lp_0Cv_8pt0^?*omF`4cid!bwOS)t**}x^T7cv*Q zk-4y*r2VXE5R^(8O<7|y6KWkGz&MNGOa~<=4UNew*nB(qBv7#Rm^{-+GBuEk-bPuEA~92InnS?HRIKQ{6yT7u*~Wp*k-{uW1a-3 z(A(Hi)MFwyqmH8JcO0~zwc{1mOwoDLW%(y-$&V|GD5*85xok}gpJ8ozhAN@F2-;8h zpuS1!4^uPxpDc{!#yuPdmP-Byt+O-SBvbqjD`XOkQzamUqy9tXL1{ZAWPZ|fj5X;p z2^A@@q}DhB<;NKno_HI5M=}9BEs*U0Yr0b;LK~QPZ2dXy- zF2XaC0eS*LfN5em1a{Oe3{FHHjkrv$4Um@#D9Zy4FT~$aP;y%S3PHn3#S3sJ8&K!c z95DHu^US}W%}RkQ4O3Qao|U_FVJW|J49s$2EyHm`GenwgZ~N+mXu7We`Jba&j(N<- zBEJ8&nc0@~{9|5@icRO`fNGH%-qa!v-ZMJIf;9jjaG$+b#MaD&D-nd*RJdA%UY?!; zik*7u8xc`|;}BQ?K{Oqwz-WAZu}M*ELrXC^iZ41K^i4Btu-$3q%2`q#Oa_uk=-7K2! z8i7Ue?3wS0z|)hNWJ=O%oAtO#v2zSrvpwa$Xz=BeF^Saye`GZF)lp~;Om^1et71Q# zp8@U4K5l~%e(E^XIfhCcyG_*HG7PD$9p=27UGwhXp7w1m|nvvdTEz6tVq}6k`PgxTD=g_wE(nKF1{p zz-A}Bb~$W_nD=dVA}I(G9CX?UwwP3QleFrn3_nN0O~RwdGOvU5V6O-;i4cht@2iSZ_NI$Q zku^GO6iI^(10{z&?5D6KU+gP7swmPXF~3Bw(V3Fyrz8SKD+iI9X1_4V1#y=y!x)H_ zf&N!yiUdp9R!Feu)&M<{B#i`%mK2JWJXTg33aS)a4V11(793T;8rphzm9`lr?(!*? zKy2W5Bd7ymo%MmyND8EJKmw8@fN-H*j4&CDI1-ATL-9+JMRG+=jDlwdf+(zM+0*7; zJ#EaOEF1DpfMU5X+!E4-t?~WKMz|piMYU{G+WZfMQNL-+r{C=G$Bq5VN?|C`5nSLL z_f|Yse(|s&qeqXOapr9sbmNE93bCLkq%(8wvRb3%`4O1bn`*MUG7Hb$XGGVYln2ZQ zDYH)aMAUtCRtC-}R+30%%>4_5k>5>DrL5qv-O-{~KUIhv_{vlg*If3TW7fos@@unU zxc|i=JzTy5tK%v%1)_1(ysPVl@#;*t59aI^HD{$m$Ze-mwkbb~U00>DU~|r&MDv5J zq#{#J+wrwxdjV2OgHE|0)}ybCf^6-u47sCK|F8u0BdINTBpiQp6og}kbHPp{xHJzl z!68GNbI+*}JC}^hLp2@d5r2m>dNyQP^q6zu_DJa4-<&)uw`kmo2BE)J2ulhmmDPLy zCc_B%D+3tgJr`lI=dhM$PI1g%TMt{S|BY)rh=K_~I=AMGnK5O2j+@!>y3?kFts_BA z?44;(1H{1yC{PUq!Eh&frD)P&mDq{WU_m@U`(94^??QtV{XvNd+#$uGNi-F(r)ZAC zBzp+BOc5*WRc2cXFeEZcjFBRfBqVg`66>kzQrzMh@t)!sah8AbU6e+mL-jZUf`uAN z><>v%M+rcDG9gRJQsldI7Axwa1StxAiE@?Nt4JSdi=-*|0)M$r(3Tj9CBH2Epety9 zf=(#9o7l5g+V0R1sw}8PD!BRqLN&l=3MX;kFcCvi4jhqY2w*zE41bDFC^eQs66pkK z2EHqwN+`Y>%1TfT3QP$lIfOD4)!>Psd_c(YBaD0N!o&Kx>3Kvn__ahuHPB;uUV20Y?q|qPTV)U$DQ(M z6|4pSm@PEh?A@Yl4ir#H3}%2**d~50w%iGq1aP+KGZDBYtIc3atvKV%1L6g{%Lc@E zSjN2@kAE^2%Rt#}rH@ARzd5DeX)C=wY&74HgY3Ny$DFT?&`Vrg1O>Z}`9Z|qn~a7z zEQ9U~84V8&mc+oE`B2P=ynarx%{BO@awGnq^D|+g*D@@V_8LYsSle*Uhud?^#9?{aHl*K6rUVMA5)?rFCeeWgxcY*SOgi?RX+#*( z2?8bhFR`5tG=Q50A%%48JIf*{5mW*tCMbcDHk5Kk`09}k1cBX9K7fH#xT1lwv~~ zq2vsTJ;{_n${UhW;8{skl#oM8KpBQ-DjtWF0PSb!Ne3lR#xL4A*&|7GfI$&qD9^;2 z4myBbNmN{<5=7W14L~5FRB?#!JQ7mXQSt)m12Lbf57dp79}mT z;&};AnUDesVUVJHP%5PZ;ypbv*&0@lcAL}3&$#H)`))oZ4e-ZQ*|XpD!^2{$`t+)N z8!Z1ZEzg>9p3gACO@}t^*#6@I*luednMe~;Tq|&RAFCFvbsOjBrOv+R?2)5p{(38% z>~G9Uky1c$$zLKyY|VWqWZO(*Aw5mitm)a4-UrqD^eluKxNVDnD_RM{X2*Mw=}_KgH^C+vFJkLD>In4v350@`U*6)Ix`1^~7$+ z@Izw%+yX1=W_R4K@4bwxgu(GKr`*^#7YhVJCvh(gH7w7k$H!i9&7t^9GqBnZa699g z#@MIRt!S3hlse(x@!E4!AVS2n98=otkE4OVjY>;N&B&YixIeO%R4)R`Rj{lY_PRX> z>o7dEw{rP5ptpU(Lw+4l+qh+!R~nUErj(&G7ta}AQiRahPUzSfwRx6=-kp)TL*3}N zgm!f9jJzGH1WHf{tPqyqn=9Ev8~V~;OjHd*S1_dM0wOn#$i^c;FU7bO>XP9T;lP-2 zq~3#NK`~C0k~ktN5|Jn(DB)hAESWn|lPIdL^Erj0Bn7<2XB5*`%vvHP-crn(v0llF zKsRRH1EZ#MgTUShq={*@l0{bn#SDnsNXic+4B|`)@ChcZ1p9;tuSEL}X53YTr>YQx z2v0z1l(q+o@IfH5gn=xepJK%&V8nEmDuEp+skuXtl~c3xPWt8Ve=}>$xJ)L7a+p(# zC*JB5=xntH7i0=*Ue(T*eUv7N)i)z@(>)$;SM$))ebn0rTGP|Bz zx~O>S9&zw!@6^T1eniVEo;^CpqNTfT+9>K9YF<69)Md4p?=(dEJxExVI&R5R+pD2! zz5v{_Pu&#uoivK;Ph9}aya0&d9JF9v|#XcD(AL$!QR} zohH|~r=r2fh5->HTDIfHKy1_L!%|GuEb?1cC z2>LcP<>vj32m%azdB>D=WMdD49ykl9%{Y46{9-JX#pLiv9VnNS?WXy6pdz?#chpN< zL4X-}DnntUMA-3G*CUqFD4< zmWh8Iwna1zED{~mS!A}OfnC*Y$UXtEG=(JzLHQ8yuK|BxGUyyK#SXlqsI1N??BdOK zW~l6b6tanT5tKk6q52L>ADFPhyB4rg#9Sch8T-6Q@K&YIitn z)Rm!=THKjM3om{6rFZ>?aD{j5SbhKE;dyB=kQrKmefBTkt$`!6zP7R{uw(64Kh_70 zaQW(MO2Ez17X51N0a5qui@&|@%1f923kddL>9EO@u6u7sRb@rxH+N1?(@NfN{pQ?3 zX=yH-&AF5qM#(pQ_;FXh;XimL4S8u7ejJYdA{|(va17NkXUzCod^Q>31}@Ea4fTUR zB=6{z<;D-EWCGJ-TDEQMqb@O2Fl!2#?FTv@C8^m6siaIP(G` zEW%ofd-4VA8VnKHw`v%iBw(<%+>sN!C0Ur#fWGZ+S5w$wXV_Ro?DO@sMWrpRpSLmW z`;hv#`-Zm_F4-k(b4zxXkWQs!hHt~vO>l3P;7{PM0l>p*BoT*bAWc`qoCu&CC`Ypw z84pp3$f4m1(MAO+(|FD+ig77+2x~sB@M#7kG1Qyy^GLBS?iI=q36<>%bx%eXv!n){ zQ>K0@##lx_dk2yq~ZB4YuZ||BaPOk zl;N)h9?ml1t|Q~(&zk?eC<8*F>GFwKbJcPDuH83a?F8JijlK50;QOb8huTxGZQXqp zQ|5sk*>b196!>mlI(UuAebnns-(8Xe&IPEqPJXf`_}3H06lCO%Jo@*|dtW^#l^R{9 zwe;dOwR+|E?`|xQHm$pGG;;gFj^i9T^Vi>3G*)c--GrRd zCdFNP#sKgHat>YW_jTW5q8@i53C_}22_S>}vED-04JF_XN=RS=JORK1ig!u6nXH2c zx(48{1%SREEP}94eT!tDj6^XH#WJW}HQ_p;oT6G#8h;g3E3Ha7l9FMa{xCv*1m%)F z5TU5;0s2KfzKuF|Ks@ISlm8{@PZ|{RR=}yDRRExcc2FF^uK}nf;a9GoI4q!mXTUWz zBRYII(6oUN;tA&*M+$hfgK((mAj0Z#ivDK++PRg052z^~d0GatvsyBoSSuPLk$dv+f!3SFq)1$f(ZN=@so4_|qILrv?xNNb>Z$4j?9vg-CdO_7hL!S*r4Hue4J z>&H)+Tv9xt!f1XZB`+@}eQ{IkJ@AY}d$CUbDDrFx)?GEv*JncBvK3z6xaVrPVL-;6 z6CbYm>~w~KIp7)jF7VwsQisX04!&hy_@nuGd8H#tPk1rhy6u`2APKATlY8Z`r^+Qk4=+dUM`a>JGW@`s6pAxrOKe6uA&XJ z6oJTN23#HJwjuT&)13Nv4@06O33k_wG5c-rG0ccU5COLhEbu)<%M#oI0I4Ya7j&$) zNHYP6t0K_KZ%I(4j6$t~BpSg-@|V{MzH0u8BFc(H^JxMqH3|i&xDGj{tv(Dqqeq{0 zQ6?D}mg1-{d>`5&fF}1O%gQ(hfW#TWkz|*D1jl;p36AV{22{aJ2%tqjr9<*3*)0Vi z4uMIIniwK4%oa0dep*d7hZzXq9CzLsN15Tsg4XH=Xj;sf(@&k1VJ>kOPJTO7^Zhfw zID5{-2}h48E*>#`;i4OV{ij`rnqu3gnuJzl$$3Su+FM^+?ced;`ZeEvv$1S<<(AD` zTVsDMHUo7E&5pbEckeoV!KKf>E2`t0|9$V-H~-}Js=dn#O^hkbcibJ@H_zp8xYtK3 zrWd5AkGQ^S%?WuRsyb#Drk>SYvvho_)jDRV%{}C@&;9R}Iv7}!W%q7~d~^44!-fn$ zYVn^!dmbDly?E*7te@5Cb!A^|E!P{ipX{W%>~@r1@#enTP47K&1y;F0e5b``k!z&` z2$DfhWfuV8aXO!l5QiY-@IVqBJpfC1;;)^G_ErX{1JbHW5t1uSCbk10Hi^G>I?6Jv zl7yZhKL8fMqLV^W=oR}VXp&x5;)o(P z#|;zIFh+iWB7@pF2tj}%k_Ib}l3hmdQY|fpBv2qh5^`}Rrh8h@5th^(t6#HWk&84Z z);F}L<&?Mqs{ze03A5Q^vleNtsn>k7>b4Wd7vyK9rn%EnvoZ$_EuM1E!*8vhV=2PA z$0H85?5^Cg?(6T?y}#ja|9tVU@9nOr_lL`mwZdjpVD(n{{^$O;n#1vm>Ya!D!TqZ) zd?&hRx{cnOJj?WoH|ORIJ?WzMfX-oTb0Hy=0{E4xAYZc;2+ z#h1OgrTV+SEX;zvn*p=-%;FJ)sl@_QIqx*Bof?uN$gK)<9(12cAfzYi3;WE%2i?$w z_$uGQwhc-*0G882llL(Qycnv!%0;_?!kqkoC7Lj*GGsi0b?(%La#3U@#yokCatQ*7 za>-V6CD=0TI$g7)z8(Zo3IxD|?0Fc4f^t1@pb81T47H@yN6s`r^dm(AUD8|nc?rnU zC5vkWYoY*ugA&{UW$nNWfdKWQo=I>vA?gGtR6YsmfNe;##(j&~oj^y!Fr3Pww_tuKnkSJF9BT zKKl5xbEIOHZJqR0#geh7{drfz)>j{xy5g;k4**ExTBhZg?Pb58HRZ9Ys|V+w>)UrT zU=)+pQ_lIa;m{W=A9(b!ZCk(kLmu7GY3?bjs$%}C>e?-Lo>GE1@rdSjde2|+)ct21 zlkWxx$5K;R?NAz-s0$H9$-t9(my?DFvV>H~i-jcQ1mEO6!-Zto3UHMUNADu7BBZzg zTg@Irs24$(5R0-AHx0u-21D?Di!dWu78@?;EhD#w!(Cb4FrG8A$;5vL_eUDjNbhqdUe76*7F z7YrP3HZQpx^V2M;i%-<7wyXa$6*dd&h`-&HgO8Y3Zk`d=Y>T$sn#FHg2mf~4(^&V} zddiNbdqHRg;%9P~yb)^N^uhLMbT5_$r9((ksh{#cqGlC(%F+dJOgxO7?KBP1}GGu%TStzZ=bOzBTMJgjd zNrv2}EEo{xA#Fi{Rb37xS#~hlUmWy<%uqR2gak+0htM?5a(syk{)farTXDYq%15Us zPVwtLf3fDgWc`|HZP%u)eDXvryP##=y>0(1%YS*_(_ihn9O)M1zx*p+SiAN8r%rXq zvyN`F>Od*O=a(DiW%-gi44wtLbo_F|J$5%+l?E_!vL|p?0<4PcCV&&%VUvI_9KtH$ zm>zP#ukuDoNYnvm@H}7?RCjQ8kb#Di_fspvv&>9FXiB$0qe19_*^=hA*hZJ6@Gv9O zrrA6T=OAZ?wPZqR0mO=Q_c5p5wBp8J-2S^&i*lq$=yZ)cnZF~s*9shYT6X&=l|4mtrpJV2oeA<%BZoQRPczoh%w_Jxq z2CB3_hqfN^DXs>3V4w#EdSIXj26|wi2adcRI8v847-;uE4-E9cKo1P`z(5ZS^uRz5 Z4D`T24;+y_FtEhaKo1P`z!BR6{|lsyB|rcG diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith10.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith10.png deleted file mode 100644 index 5460b622002eb9aa3096d537df5a1a60a105794d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4210 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 u@t-|XOg#a#HJo|qkV zWbZxB2p30*8LK5G0wwd+lMU1EC=D9#ncJ-;%FXFM-q^NKuLtei1;R}iq#wf82s>lM z8ykz4=d1neyID$tfI>OVxX<3Z#-^gCrgTZG?P|x{XeYOWVG^#FN^!{GhO zv1ZETyC32F;7^X>LR|k(feCxg;}5k{@c!e~2wd83?Xutg0db7msj>}D3Y9n!oECrN z94Cwt&SlLFJ0Z^2IgST?dd-+LU|}yM{6zi1z*3v9(kOZ4T(sz diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith11.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith11.png deleted file mode 100644 index cb0152826e2578756bbf0a31bcecef5116602d5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4230 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith14.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith14.png deleted file mode 100644 index 6757ad380f78544f4937070bb1188abdbd320cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4371 zcmds35kz5 zM}~2bnwR^o`zM@F_gU*%dw<$%?fqe|o&MBFn~I#38~^|+T^$Wm03f)f1OO@VE!YRu zc-{h8fR0Tt08kJ7=Lv@WYuo{V+}Iloe)`nQ|Al|Bmwy1KE*Q)i5ajRa{mcUZ!WN6o zAm(NVOiH-bGj;v6xcB=0ri`SVrs}Wb7_#|=xX5Vr(zwchGMe<=)6^tl8!1a8%*>3- zU^Ee?d_}%Mvd#4|GqED=)%VMd$O_-NZrtwpP20TkULB^mb&>>0N|~!8Wg-(tS*y-* zZ#{8%aA;#&R5hNQHvpg|ZFT1gzUCnS&SMl6A8{i|z5oPaGZdr%(y$OI&Yp^=L96H6 z6T~GEAYWuZ(I<^#08}F~)vEwiErPh>Jbp8vj0kWZb#vVUo{9j@0;FZ&iw<8q^B(bs*vG4XKvlFqJfB4}UYcedGX?-<*^IYtG1p-e)D068vYGAFP9o@DVm!C2>(VAkI_wT_6BBYVeAhe{WS8CItYE zvUs5;HMX<9`@%?K_P)EzeH2&DvPtT^gZ=8X>g4Wm>_N^C>k`xjQ^uP>Le65dsvv2k ziC0Qa0JUhp#b;`z0GbOI(vm*G?szgHwGmQ!7p}!L0@qj8Jej1-`N`*8eL6&RuX#DY zr7@Ur>u1a8NSMAd=d{oPohk+0kxRAL>daOc0VETyQo6Mz-p99?D9uu~fe|&2S(CIr zQv7g#AyJUUR95&S=o70_hHUxX54ac2VwN&^SRA>3pG0c#nYifCfO_*2VX_>z(Pr*C zO85|KlVu%YS31^hvN@E9E?yH!CQB5m&gsITrekejZM2|M!^zGoeQ%NMF&SZ!NxuMh zPL2L2{?2=U2JgE{N~Bur2=mO*Wzmb#My7!WAM?_sgCzwJZ|~?f|7AW+H?1}O+?3}) zxVBJQhm|Mi+oHQ~3yIu&Va`V*$=k)-1KU#DY};I?cI3sbs)2u)C@@{ADL20-lVz)3U*2xoXp&k(FC9`KH=f9(t6y3F@xu(O7qb`6yK(5zq!g^F*euf#5My41IFOLOv;*_wz`KnDco3E!-Tnfso*Ig z@iK$_&Er3#UJ7;PU4yz_E5T~Z<-k&UQdX^|nD?G4BwKlb=S44!$o2%Qp_rIgs|+U( zHy^T9NgE&}JnVg8xzJo|xDMO|u6@`e+i+A}T-Br5Wpf!%tv0MDU@xEz$(p!Zyl3{) zY^9pKn#oW}9@`)a^Q~kn@6rhEeO`T>SMtR%uEfBnF#m>MFg9#$zBC>RWnkBxsEpUamiRFasN+$-EGoG)DKaJCJz6>hI- z|LmdLvTa*sbKKtjJlR&xrqbHN)}d9azPO%muB*PQ`d&4{D8~q1G6xxG`qloey|#m; zX=j0WsiEDkJ=z80$_(lF+AwgO(~}e38U5y3iG(WkCp8>o3yKN;6vQBJDZg4UQFN>l z{q-#OKn!9%Njte9wbf2P`f$*@*sO3y8^R1h1SewBUZ?9PjEX{)MGM)6Rz`ZZ^~m7y@4%L%jcZ{?uUE#)o6$E%X7Hcn%YksTu)qs9aNB~Hm};8-5K zJ3azG1yslJ5kLsjm;S{BHSqq?S>JP-9ffN~llR>8t1R8u|Ne zJr`~-Zz6lbn>zVv%>LXD5|>?<*8?$>0?Db#Rw*i(0cqB(QxZ^_(5Yo`@S4VjMy|$c zAwZ7>$xKp}QWk}T1W(;LrY_0oDpIuH=s6qDmvoC8`N0`*j;!TRJ zNaj4T5r=^A@`?VlAVanh;r4QxHBoFTg^+UMDrevqm z7QpsG97d-)LWU9V{?6`}3FrMPRVloKND`=h+igH)uu>>r!c_2*(@#=KzDFYQUH02R zbr_dnPCEn*+4X!mTIZ46a`W~1>kcuF4pbg+J*d3#_%I6XhTd7e}tiLykp<@guXTc-$M!u@}1=9!{zxS2V-k7o3%EVij_|Uzp1tPp`DO%%4A>I%bRP z{w@7CYRRq}cdh*G%aR3wg(1ol<#DNd*@{zXNQWJq=U)0b)EoH)9t{&t6JC?>P`A$` zW>KJNC3DlPxkrcE)WZ+H+!UXLicrZ?S-dG4+T;n)2;V-yk*(o4sN@%4W<=I)kjy-I z34(yceAEk03$zN&3NGzj?K+Lel&9vlNrSy zilbvh|13K%eQb~1bDLQ6q47WIq4`gFD|tMza@G_6iwQr6Dv?uK>A^(!%;eDt0%^3n$C5KFH8A%+#_rjyO4S@+KRbMFYN@ zm7g`5LX~n@@Jn25kU&4Iz@n*DvnMo|>9CbK9F_kw}4n2kD^!i0r zUZatRER9P;{X-mIzJ*CiIG$Nv9`%JThk{Nj)@Y2kqc~#)@m_zLv1UK2FLPLOa_~fi zd6+9VDUqeyy~*jOV`>Nh5qtm;mk0oV@V9sX03qT4fOZA|`8)t%_J8N}RSN)!m31}L z%)=J{Ubd^LvH&4B)>wln&2n1GC22*Tk{|Z(lQOw`Xlhn5hvzUexoc>UbT><8Wb284 z)JP|9)I<00S0yHtGkjptC28jVAuI?_AH&p%u7+00?LX0M>$p%9r)=&0qnvWx9J3Z% zk6V%2Eh5M=wu_>;omvC{5kL$4TZ9%^4?HBpA2D~k6rGhSW5>{+3WjGtx9 zXc_I7u8ONuTfjV!hE?RY#s}(#*ke^g{Km5^RT_?0LRrNLkX8A>ZcT~J)+w6mP`wwn z%ZHkTb#b`#HdS1Bjz_|SeY+bX4Bs%%bvIr3U{ebe3<;Ya^2e<-hFiaxfjxp(n};@( zE?Zf3oM612-sHfcmTU0mt6Li;e)a7ZjWx|Z5tdkIET-VZx;p+6O192)BFvs7f*+Vy zY8yhK=HV4^r&-0Wi)r~&mDx?aNl18zS;%*e(*0l%)*t@G6my2AIGi_X_*Ku!Y@Qma z@8U)np!0@i?)K_{?2o(;?CV3a+kT<f6! zHh2E*!i2Z}eZJL=RzOLhXnad-5XU5i0zhOmY|SD#5{vdQe*l^N{5c|e6cp=A#POUi zAGK_&)G^eCsvKozNrz4fB3k>u~M~YwZ1@nzF$VOXgoU&c99molEDoznQ z8pJQY+Q$A5c9V}g_)^{?3J2@}vb&Vdz0sGVsTPwBzp~L8GO8VOQU2I#J_ZY=ibcz< zyQpv!W^VXP^Dvc$!ta>C&^!J7l*kya`-eApJ{eIvfw;N5(U%vOWFj3D4-m?~b_-6N zeqSAhC3%B^bxyy*EW$~TjFWdp!O2P@o)0{{R3 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith15.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith15.png deleted file mode 100644 index 3acb2e9e613549dbd9c4f1eb0915602d339d610e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4490 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith16.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith16.png deleted file mode 100644 index 59f2d23f60fdb4eaaaae3cccfec5d540784c3e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4594 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 I2JVmk2Lpo;*Z=?k diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith17.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith17.png deleted file mode 100644 index 305166f491fec43994a9918130016ae8754517ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 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 M$kMRJ!0q9G03>bu+W-In diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith18.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith18.png deleted file mode 100644 index b02ffcf50f51484ccf646c3ce61a3ebead4eff83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4984 zcmdT`X*ARi+x}UyZzW_45t1dzKE|3QA`D{ zv9FCKV=IiEd3(OR=lSq_dfrd(hx=UDxzD+;bFTZ#btOJ9HDG1pV*&tx)yPoK0syG~ zQYwIf?k_kzDf9RXjQ)nU2moN~`qxnP!pqzMfXU2DSNFjKPk104;R*K_HqzA<_J0ER z@OtbH0HIU)mN1Cr8n?#5+@6kc0`jdf+=7ci*g_`>c{xp7N`#T)UV=!`B$s)|#k+TD z`TGhJXi`#;$z0~rEH9ZR=$Ax3q{I{_y!>{u7+&l%)^e~icwRpaUai>8uN$JrF|cG9 zDwr!GS;}>;UR;Rj?e1AzlGTc467vT*80y?a5ND!Pz+of^bn_aHz73!X9c5+!aQAa@ zw*=xT>?ECR2P)(XDqLWiiZKK7GN2WfqEiBB=~E%|v&1cdLR!GN-}Mm@cpw8fOGK@V z0?7Qs>~Jc;{;dcXRbd(+%;}z>2Y9Lj6+_l9?*cZrfXg1n-KxNZ3~R|{}Hvl+1 z2XigJzyjPdPl&w%(1rufeWIeFz>93)vi=Sf^yg+J$EwudPi5DF8pTxaM%y#U1kgjF zvR5VXMm#q!E4fg+uuKF#L69esy=VRrxk3e&j$y4^hs#j{o7@k%LJHYXWUJ00cP zqesN^;Mh>4#%hmBA)#;GF=O36Zg7x>|MS=BhF!+PB`e<=>d76?Wb7uZO3Q>+QWs;fjyIt0z+>Y zUp$&wNi{faV5Xc3j$Z3Fdemqmb(v^>DIi5JCwcew$7_i?Z*F|KK0}#?c9MT$t%#K6O@lp(EDasl%bev)m6Y!8Z#e)p!T}rZn|F;P&&=xE2HXx6!rc z8b4U-bsNi+`CjOMVE*nFD4&zcU6}j*$tOOIWTm3j?`TihiXD-FGb(QF)Go9=m@)9)i$&-u`!)6EE5(G zyK`}hQJInEg?XpMwe&LMPvT7%kGiisx-B1XV<;^;b}5xpjw3ulw_924Qljo{iN@E| zMm7IHMlOx$kN8=Lu1S~Y-ZA78P5(OO=2J_r`c_)_W?$@5{!-VH!V>?I$c{Zz{v)k` ze-15wN?LsLzQ?=Fv3zHl&OPh4wpDSC#cWv->0dMWmHCTiFNB3Pjw_}&0Vc_tdxicAj5p*; zRhCH!?`RTlFXWc8{Cd`EHhVVQ%0>z+^^7a+8`Hac@5JBnOUXgXQ6;E36tmT?RX-%P z{Gnw;rM{JdC9$0GM+VvomH%MflHU?mu3i?8f|bD`n*T)Fo+Z-RcA0dU>HcG0SmQ)& z=@Djj<*f^q7V%+4#|1?zc8k{xPCg5kYR)-Vn_0XgzW(6GP z1)4IhN|t8sM!uZ8ynW;64gQilCXMp$4nC-i%nTc}A=(^mu->XvxmlWD(t5Yq_9U83 zyZ4@igMShixWhWz;L z)!fzG@!a_aXS+~4X>1wxv%694l3j`I7PiGN)=t&-qm7lFW1T)GA9H=I8Pi;Pv9!@N z-4tCg2J5Q+gZ+vvZ{V$7o}inq#QI_*TwsrQU=3d?ySCC>(<7Q9UY%*sv&K)dp#|*( zBN3mTTvoGIo6EuHZD~e)*~?gygV_vm3{5Byv7G%ky1nu(b4LweJg`PY%x*$bqVe;7 z*-Wr(E`QH#U+dDnKyrZNV%P{dKesNobF*x^YD;O$Yb$={{lJ~~HwtVO5Z}A{bQjE* zhc%hszq{o#UlD1hYZeWwUlo;el}m$S#;Y4XhM*2ywt2w&;3w~iU?NC)?)IFm(||Ir zp|7FetP5V?6g#gQB}#Flgi(fpQsi|i7)@fdcCtQ=Uu*tVEdTcD9Dl1i~ zmYU2bjMKYe%PChv=+suVqX+KN-sCQkSKrMV!~=No2yp9 zof9nVds{=TRX*lT+Uo!vl*s*bEQ|zO@d)m(aF4A$|KgX_Ab0g0{a2s5*A*9RWtgx! zCBGnclH*eJwJ>+6NBdynH`NSu!Og+Vfx2(gua)z*-%~a(bzWM0gZ&t143!bIS!u2C zR;>jEJe_7Da$UF?XH8cD`uq|r>B4w;_)akF}LK znF4#Z3{>VyCYvAYpjnxST06`*@pZ(Q z`UY(F(u~lY(TlQS#~XhT1V=O=7O7)5*A3Wuh1$;Zw?kxDl~}D_<@Nj&_1Am4w06Ka ze{hvmZ7Mi9yke1lR47;wCMf5vle3efpKFYVG-GI&5bsIsaXLM5OG|jPvvdZ1}1xe%_lMzTLzTxHxi`lC-McqK7!=7&3Vl^m5mNQjay-@_2C`|Yy1Vu_}RVIr+>I9V}t@# zjoH@SF!;fj1M)ogY~&M(GkkyZWQfETrp2tqX-{iYds25co}g)eJ~OdB6XlHyDcl{N zF*u-$jTt&mBd4@uUV3>Io`>e(9>OiT)QClQXaYU zTt-yf5E#7m@=~{Cc2XjvSj&Su`j=hB0_d)D=uzhYazM;&f4W5}-QWH7F@rUr2FSwOytCzUn=HS=z#;!X^*>1tQ^$?P8v~G19j=Q!u$rkbX}S$5jsU6zFp zqa0dZ83&DseyXW5_n$&W44-SJv-E@~VKwc-&XPo{|FMHnO9 ze@s{sv+HLbXta~X-zuSxAvhD7;5V{fpaZ0g2xG z^ci`BH@(^CXqP01j#!5UZzq3ClS<|6@?yaG5>bQv!Ls?VV;^)Y!XJ!^58msY$iW}f z+RfFloo>=RgJ=Zl6I}_K8ywNh_Hu%4s2=83Fs{RHtNi>aUJ`5(fo-ZfCgo`hT%=a1 zrwVl-|Fqk;)|?8<-a0*kRfvX2WB6YkjP1N6%_?qb20Lp8jztBpS5iD%g%+kroDvB* zvf@LCqkKE1uchU1o=}QzM}t8WfeJQ339D%fv%ZwDJWyd8X zUV<4E?iJC1Ge-3b`l$pdAdAOIJOkPXd1JkyLUnlBo(qTv?adjPW1r#i3X~EUL?}Pz zX?di->6(zAnR9Uu9IB}f1L9X^W8-0ZTku)o(Rro3!Dnd;|R} zTa+X;KT3iSIuI7TWm!LCbGEK#7&3!t4~tviB+PG}%E=N!^~j}|Os>C1{2e{^{t?oO_w>svq?S=VtQs5?6nm+ai7o zWxWqscSzZA%4F!Jv;eppY&gbi)s4OWu0gwDvu(yJ*~hH)rw@Y`mabJNH)7k1df<@M zisd;Ho)m&=u%>UQl-+1~%mJvdQmI73ohQNkp(DvSG6u?wI&aFz9P&D;MKELxCV-lH zWH70$LY2!~W9k4L1-2yina0c^;}tF;iTJkSFg@}P3F`g0?ax6wYMii>Mq(ytAX*=; zdn_yyLdHW~$&Q%JIG_v;{rs_P>^_3j< z;f=%eG4*35Z%}F2-Sv`%XZI&|%1OQ$ex#F1@bB$VuZt=O1tf8N5h4D269HeyAiETC zrc8+<*cZ0ZPL+OD0Yiy?BKtZVDmOiV-a*|>IZOi&C6s(l-hUJ$WcpEI$9ln+=1_~gLeflC+Z{i)`0iBor|sxL zS_gZx2rx~zV?nGW39W{;lhBI$vhDK?JmD+|JRz&n2ZlPo6pBo zQHSiuBSZmX!m7_R?6G4!9li({P&ms(&%;|c$7NdmbMm7y&cN|@Li?&ezvC#qo#8cK z=`#K=sq>$*>ObxNn?(CJoqwbMN2UKg|NkIKz0eNO0vv!AfJAgsSO9C6-#PZH6q~=* P1~9s7s#mGw{QQ3aidX%k diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith2.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith2.png deleted file mode 100644 index 6b4d956ee26dc9eb0834f52d0ded6b5460384469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3602 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 F{{pe1=^g+8 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith3.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith3.png deleted file mode 100644 index e45e6c0349d40b6c5d19807bf5d6aa50d3d54f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3659 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith4.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith4.png deleted file mode 100644 index a1b1df6e2a3fc3edfcde3cf277f40b9e62fc3fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3943 zcmdT{S2P@a^Zsp!UZX_~A&BTTI=gxemQ|yLRl;fsAy`BUAtHJfDeAIXvZ6(A(SodA zqD2srC|Qa2dC&Qu|IK&%-h6Y;oaecEX689_F_U=9M3dBbNp=rvX zJd9srdb@g-R>d`!~;OephZixXWp~$b}0F61!34;K; z=X@-X!Zg6k3n*xSq*+4j zbwC;hocj3rL%^dPz^t>2Q2BKO$FMGP?o>{#N`ru+c9b23m_IoJAE}A zbFPMX$AcVp=_pzHFMERk6sED9PrG*#GE9dX9+pqR(>aQ5wvwG)b#YlaT^qsrX#lVk z6ft@#DpALQRwhIHoW8oYL+Wvxy6_$`$-S0d;~gm6m_h9M{o{@H%cl*~(`&1%QwCj7 zJLivx@Ka=mV;kb+?w<&iW8%S=56c2k(hgC&q=#QR2KSAMxJI5)K607+nyPzTPknaG zJ$|)I-=)D?gn7m6l7EU;Zt|XV(bYugv+Ld0#?J06FNz+Ks4dEYYA-cNSejU=gDc5z zLm>w1ptfZq0J}}7_Rqo;BxsMArIFyXAL=K%h1USuUH_Rs0JpUS#Ni+7)O#ra&?<}) zsn+D&Z@(E*h&5oRG_N^$^fOhgXRiwx?T|t6^7^tA-u?t; zv#W+_a(YtckKw$QdfdCJ0T&eG?R6T{l>2~m^l@CXuGI6WS~JzpH1A*yr3xI6bY4+^ zx)UUoo61_4_bK2lhibC?%k@uK5Bix@HCV4?+qcW)GF^8i#d|uTH8({m(_IH@u2#@s zdpN4CDoC0V4_rrTf=Mq$X}3|zlLkY1oq06%tc|Qqru0gAxddbxXDAgYNgkPX2whDt zHGC`B$oQx0vWv7-ytSSv|HP$KCJBbH1X!1Xz@IrWx&41uqL}k z=9Vq3Y56+We7^K0oKY^-7FzidZ(d~tf*G7567aI};_`)ZYRf�eEWJZHsW6j-`ynN*U$nOsr)& z=GK-4rvNtl zLRG?Qtg3W?6EF8J;(Xbp72N7uvXh77HCY{v z0NE_f@MV>5Ie(N2w?yykFEf}!rv|LZIm09-p4q zf@Fexf`-PM#yh#@#tp^Sik%z_$U+N>)k>xx+7Z)Wf^? zGdCoV)*}ofQ!*=frh)5So*0X~aa|-EvLP^LFCi(>FnT~dOHDkFvuD1qWz`_)z~5mh zbnF0=SC`kZT{>H}BfsOh6F*llC|htn-$o|zQ)eISi`m+!I(0#Yr1xS)gelB43i)oG zU&2))4N*B+U0)PjPIUgkruJJcpkPI9MMYsjdcnqVP@%29uYSO^6P526y9kTqKf7}l zdNvA5(AOYHlEf&@D7y^SLdY82pXZ-_*g`odWv6yHOHt_mR#`Y94v5A>#tU()U)yC0zLrAupo6;uc~xRmel%eU zW-r2Hva2Uz9Qy2gTC>~(fo_>1(Y1z0LS;{zjcASL^OW*gbMN!|NUJKfNX0x$d+HA@ z=QB>nBR7#>-R}=nxW(3psptRe15E;B5O+$EBrb_@X#Ngc!H=*Om$|#ab2r2eVWwEEjLYS&>z! zynl=r@gbOEw-H&mh!(+6WACWj?H{At-$A^$s4c11V#BxQCbu0-ttD(0-#Pz{!*Hsx zBtFJ5&$4B)L{16Mg{*PLqdvCg%sqcwhV5#&GvYqxzVUTIEZ>eUvpnl-7M(Bc^vqk@ zMXR^l2fwvvC9;NuXPaX1u!h&ID({=!O8SR~l-1#H;QR2uaQU6F`FGBfhrXjboMFws zWxo?PWETXPyVA5T!XJDr>QF&F987F@VDI;Tq{i;WpMO*=@Xhh0p~ zNgarzjoZqhrMZ zWV3CHy=u0nqlf21e~66K?R~4G?e^fgVD2BU7wJt`AM!>DpLzVLIk5Ota+J=Vo_X{n@5PA&&bPNE0&dzZIfP0bvY&rp;lnnqI>X~D=4gjRj^tCkM zAv51+RTH?}xZ0K$1{$$%Ye`1;SMId7@Je)hydzS`0CDChe3c@Fn;7LV64O`ge&KhNHF>VgY^ z0`LMf__xS^E44*-W)va^H;I~Zr=Ml*4GAF z9T?8#?K;!S5+51x({y0mF{`&9L3!gQWDt@aQ67O6hv#vQ&!pt`{Jp6p&i&b28Gq4J z)NXJ3j|1N)Fv4|jP~FI+F+_c@U?QZU7~#bsw^P1x_rS{dsJxDl zWyri^O?TKbU~>k4!eq#B-x4(uvY2zl>fwbc`HOciuBYWL;C9M>xg6XxriYJMnaWCB zjzEN)gB7zaRUdylQA!K}B6z2Irx#ZK8#P HIz|5nhun+E diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith5.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith5.png deleted file mode 100644 index 1ea2a2281cec0d15d9599b2f67c97b92ff5123cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3978 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 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith6.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith6.png deleted file mode 100644 index bd9bcc18bc16aebdea0d584c69cfeefc8154566c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3971 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 O1HjbK(g36Hp74K{*vAV1 diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith8.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/Monolith8.png deleted file mode 100644 index f8a43951954f481ca33ca49dfb541ea822294880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4065 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 T#dh`s_}K@0c5~F!C}209cF+^{fD(`eUg8 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 Pa)HrpbG;f}_qhK6NhS(l diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/monolith0.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/monolith0.png deleted file mode 100644 index ec09cbe6df4dbfe528b5db6fab4c2617973381dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3382 zcmeH})n63)7R7%E(k0S}hc4-qh8a2q24^T?r~wfPQA%*=JRl3cYj3!zaM!k%x~jk0BJwJnQ&P~$ zEEeLliPX~+tGsVgqTa?Q4xB87zV(`HCaw>k*H39|R32dJMkv}SX)_JvEELeRWssZK zzD4zR^(?JQYDG{B_yR`CI#=FDXZ$4KI9yHb7GE31XFw7(PD2UWO!L~LZ^T_NY(aAD zNzlQfB*5+^ zFAGUQ8sNF^7Ow+5R6*s)-9%l0kOs`|#$C!_S^`KL!rcu(O#^7dGt$%oN?IUo5g#K8 z$U=crA3uK(h|U4bdi!v-e{NMXZirnbl~b#R6HwNTu%ndlqkzLDZ;Idz*={i_BCjBG zwIn-&b2wxp!C4TVz8a5LOu^DSN^G@~U+_6Qubi)qRQPHEuoMtJ zdM++i$B9-YM|+>Y5!@y7xJOg)n3&{V%b-;c3N~lq2fqJiqg(hKH#4)gx;kyt1+ha8 zz{Ac_9gc1Avj@Mz)lP{=-##x3M94Zs=#w3P>livTDY`N8f-2g1Zar21w1MX0lzW`7 z%g`Bz5My4kVDd}R$xS|xE#ganyb$dc9J_E`UKBqe)mT&jHTN}0LenHl9b8C%8VfTb z0@{{|0PHvUw0{+$Bt?5fEsX?T>}j6q7YG8hyWtBz0Pg7sNWuo{G@ENBm z7|2*A!g#C=xcAlluPDda>oumS_5s<*)7WNxnU@i@7V2MV>!G+(CC+HQH#A>d17vbj zSqt*M_M&vGNoRZVhoLkb}0!kB|v3`anG+9es~8PV;a*NduYkODPEQ*Z@|f) z-aqT=RZF4#Qk>^jU(70IwR2T&m1~uE-;NsNtmXIa*lJnCa^SuZ#~S0B{2IAiwyd`G z+g!`}(n8oZg;ZNeRUy{$y+vHuzZ!*R?J=i>mp6|a0G+vv}xM`O4 z1wJ;ossBCeJLzE{EnO^2RBt>=gd>lgf*r*X$o@Xtq?ltoiK7=Ltt7LZy^+I^<715w z!-_p+NgJTfFv<|h;1ZL9m6aElFO<_*A6O5d)^9>3-JmW zn{Juz=31KKibac6O;k;KhlhsW3{U1L8Nl4~V6vvjkH{7F=2%|F}tDE5G>FwS0uiMixw_>-fTi=GM}fC&zk#$$6Hoir9~#{McQ*eNI9=*Iu^Bs zT6cdkSm_p1d*1ypsX^*y21UPD-Sf(;HWJiWNbz@=t;m!ZMJ>t=?%q0_Frb`Sk$-D= zXQ*y~@LcKD-s_7UrVgg17ucd$W4Hu2V!fsEzH+UaUoe4sh2`q4*t_JFYM&CZV%`(x z6+7^(>hKn!5L2&+d+h^}?e!#H+cehHYcXNlb5lDG<_Ia9#d_rLSPYj2OG08bGl4CO z<=M2zT+kX-U>`F(YQS2u}Ni^Q9BDzi_LLo1gk#{YW4jpCNN56Run z)yuQWJ+X7PYcwCy7@gc&2sza!{KfD}Ud<-h=m6I5IlCD-o{ridNycPg!onqg%{dX? zU_&=t@Qe2ueD)d{1D3{gFOoJ?n^p1l`=0{#YYA)D;h*5S?^PVVw*t1*&eO-udz)T0 zPoBE%l-9#7(YzCH(whOYlFe7n2kD%Ifni2O&PhZsO4*>wLJs@ELxvX(mv3 zx2oB^+3`?oM|%c3A2*?CcRn}0H}~v*TVTP#=$t;0JSJ-7Jnblz0eUqxCv`BEE_OTr zwuZ9uvZnvp=4lCZ#C1d{pY8n3`Cv60t5o>$#P$?^G<&o#YdFF0_q}d0jE^-ot z%f89uVqj?sK!_j!=qLbwU0muW0FR{s*m43uB^v-XpBIkZdH`HO8tQ1nf@XhwmAUM# zl%3LTts6){A;1*!F`fB8;|72numdN6Cizq5&yoJO(f^TuE`dKs0$Eo9xVRt%8v|r# UMt3N^E*}#Z>YC|PL!2W23-Ta%9{>OV diff --git a/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/monolith1.png b/src/main/resources/assets/dimdoors/textures/mobs/testMonolith/monolith1.png deleted file mode 100644 index 54215c2dcab96664f1e6a3af72deb4648fd29393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3585 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 -- 2.39.5 From e5af4f596490464c1ee50996451912a9af2b14c0 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 09:39:14 -0500 Subject: [PATCH 34/58] Fixed some keyhole texture case sensitivity thing- also let's not use the build output resources folder as a dumping ground for textures, thanks. --- .../mod_pocketDim/mod_pocketDim.java | 2 +- .../mod_pocketDimClient/RenderDimDoor.java | 4 ++-- .../resources/assets/dimdoors/lang/en_US.lang | 2 +- .../dimdoors/textures/blocks/BlockLimbo.psd | Bin 26680 -> 0 bytes .../blocks/tile.BlockLimbo - Copy (2).png | Bin 3117 -> 0 bytes .../blocks/tile.BlockLimbo - Copy (3).png | Bin 3292 -> 0 bytes .../textures/blocks/tile.BlockLimbo - Copy.png | Bin 3156 -> 0 bytes .../textures/blocks/tile.blockDimWallPerm.psd | Bin 163660 -> 0 bytes 8 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 src/main/resources/assets/dimdoors/textures/blocks/BlockLimbo.psd delete mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.BlockLimbo - Copy (2).png delete mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.BlockLimbo - Copy (3).png delete mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.BlockLimbo - Copy.png delete mode 100644 src/main/resources/assets/dimdoors/textures/blocks/tile.blockDimWallPerm.psd diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index db026a5..4189cc2 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -191,7 +191,7 @@ public class mod_pocketDim // Initialize blocks and items transientDoor = new TransientDoor(Material.iron, properties).setHardness(1.0F) .setBlockName("transientDoor"); - goldenDimensionalDoor = new BlockGoldDimDoor(Material.iron, properties).setHardness(1.0F) .setBlockName("dimDoorGold"); + goldenDimensionalDoor = new BlockGoldDimDoor(Material.iron, properties).setHardness(1.0F).setBlockName("dimDoorGold"); quartzDoor = new BlockDoorQuartz(Material.rock).setHardness(0.1F).setBlockName("doorQuartz"); personalDimDoor = new PersonalDimDoor(Material.rock,properties).setHardness(0.1F).setBlockName("dimDoorPersonal"); diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java index 585551a..20a1b7b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/RenderDimDoor.java @@ -49,8 +49,8 @@ public class RenderDimDoor extends TileEntitySpecialRenderer { private FloatBuffer buffer = GLAllocation.createDirectFloatBuffer(16); private ResourceLocation warpPath= new ResourceLocation(mod_pocketDim.modid + ":textures/other/WARP.png"); - private ResourceLocation keyPath= new ResourceLocation(mod_pocketDim.modid + ":textures/other/Keyhole.png"); - private ResourceLocation KeyholeLight= new ResourceLocation(mod_pocketDim.modid + ":textures/other/KeyholeLight.png"); + private ResourceLocation keyPath= new ResourceLocation(mod_pocketDim.modid + ":textures/other/keyhole.png"); + private ResourceLocation KeyholeLight= new ResourceLocation(mod_pocketDim.modid + ":textures/other/keyholeLight.png"); private ResourceLocation keyOutline= new ResourceLocation(mod_pocketDim.modid + ":textures/other/keyOutline.png"); private ResourceLocation keyOutlineLight= new ResourceLocation(mod_pocketDim.modid + ":textures/other/keyOutlineLight.png"); diff --git a/src/main/resources/assets/dimdoors/lang/en_US.lang b/src/main/resources/assets/dimdoors/lang/en_US.lang index 5be8614..5cfb372 100644 --- a/src/main/resources/assets/dimdoors/lang/en_US.lang +++ b/src/main/resources/assets/dimdoors/lang/en_US.lang @@ -2,7 +2,7 @@ itemGroup.dimDoorsCreativeTab=Dimensional Doors Items tile.doorGold.name=Golden Door tile.transientDoor.name=Transient Door tile.dimDoorGold.name=Golden Dimensional Door -tile.quartzDoor.name=Quartz Door +tile.doorQuartz.name=Quartz Door tile.dimDoorPersonal.name=Personal Dimensional Door tile.blockDimWall.name=Fabric of Reality tile.blockAlteredWall.name=Altered Fabric diff --git a/src/main/resources/assets/dimdoors/textures/blocks/BlockLimbo.psd b/src/main/resources/assets/dimdoors/textures/blocks/BlockLimbo.psd deleted file mode 100644 index 32443fee8227b97adff2102a3694a518e56e493a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26680 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 Hu0mjfu7k?v diff --git a/src/main/resources/assets/dimdoors/textures/blocks/tile.BlockLimbo - Copy (3).png b/src/main/resources/assets/dimdoors/textures/blocks/tile.BlockLimbo - Copy (3).png deleted file mode 100644 index 7efb9d254c18adc7a848628e40aa187e86a5ede4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3292 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 UJ6C)5KYSLT_innF19a!{|5AM;bpQYW -- 2.39.5 From 585b0685d0f5e1846570ace3954a60819cb0dbcb Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 10:36:39 -0500 Subject: [PATCH 35/58] Fixed a lot of WAILA weirdness --- .../mod_pocketDim/blocks/BaseDimDoor.java | 14 ++++++---- .../mod_pocketDim/blocks/BlockDoorGold.java | 9 +++++- .../mod_pocketDim/blocks/BlockDoorQuartz.java | 9 +++++- .../mod_pocketDim/mod_pocketDim.java | 28 +++++++++---------- 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java index a6dc04d..4333d66 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BaseDimDoor.java @@ -66,7 +66,7 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { - return this.upperTextures[0]; + return upperTextures[0]; } @Override @@ -390,14 +390,16 @@ public abstract class BaseDimDoor extends BlockDoor implements IDimDoor, ITileEn return isUpperDoorBlock(metadata) ? null : this.getDoorItem(); } + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return this.getDoorItem(); + } + @Override public TileEntity createNewTileEntity(World world, int metadata) { - if ((metadata & 8) != 0) { - return new TileEntityDimDoor(); - } - - return null; + return new TileEntityDimDoor(); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java index 9f27eae..b7f8fe9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorGold.java @@ -5,7 +5,9 @@ import java.util.Random; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.IconFlipped; +import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.Item; +import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.mod_pocketDim; @@ -25,10 +27,15 @@ public class BlockDoorGold extends BlockDoor return mod_pocketDim.modid + ":" + this.getUnlocalizedName(); } - @Override public Item getItemDropped(int par1, Random par2Random, int par3) { return (par1 & 8) != 0 ? null : mod_pocketDim.itemGoldenDoor; } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return mod_pocketDim.itemGoldenDoor; + } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java index 58a4048..8abe39e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/BlockDoorQuartz.java @@ -7,6 +7,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; import net.minecraft.item.Item; +import net.minecraft.world.World; public class BlockDoorQuartz extends BlockDoor { @@ -24,6 +25,12 @@ public class BlockDoorQuartz extends BlockDoor @Override public Item getItemDropped(int par1, Random par2Random, int par3) { - return (par1 & 8) != 0 ? null : mod_pocketDim.itemGoldenDoor; + return (par1 & 8) != 0 ? null : mod_pocketDim.itemQuartzDoor; + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z) { + return mod_pocketDim.itemQuartzDoor; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 4189cc2..ea118d0 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -191,19 +191,19 @@ public class mod_pocketDim // Initialize blocks and items transientDoor = new TransientDoor(Material.iron, properties).setHardness(1.0F) .setBlockName("transientDoor"); - goldenDimensionalDoor = new BlockGoldDimDoor(Material.iron, properties).setHardness(1.0F).setBlockName("dimDoorGold"); + goldenDimensionalDoor = new BlockGoldDimDoor(Material.iron, properties).setHardness(1.0F).setBlockName("dimDoorGold").setBlockTextureName("itemGoldDimDoor"); - quartzDoor = new BlockDoorQuartz(Material.rock).setHardness(0.1F).setBlockName("doorQuartz"); - personalDimDoor = new PersonalDimDoor(Material.rock,properties).setHardness(0.1F).setBlockName("dimDoorPersonal"); + quartzDoor = new BlockDoorQuartz(Material.rock).setHardness(0.1F).setBlockName("doorQuartz").setBlockTextureName("itemQuartzDoor"); + personalDimDoor = new PersonalDimDoor(Material.rock,properties).setHardness(0.1F).setBlockName("dimDoorPersonal").setBlockTextureName("itemQuartzDimDoor"); - goldenDoor = new BlockDoorGold(Material.iron).setHardness(0.1F).setBlockName("doorGold"); + goldenDoor = new BlockDoorGold(Material.iron).setHardness(0.1F).setBlockName("doorGold").setBlockTextureName("itemGoldDoor"); blockDimWall = new BlockDimWall(0, Material.iron).setLightLevel(1.0F).setHardness(0.1F).setBlockName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(0, Material.iron)).setLightLevel(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setBlockName("blockDimWallPerm"); - warpDoor = new WarpDoor(Material.wood, properties).setHardness(1.0F) .setBlockName("dimDoorWarp"); + warpDoor = new WarpDoor(Material.wood, properties).setHardness(1.0F) .setBlockName("dimDoorWarp").setBlockTextureName("itemDimDoorWarp"); blockRift = (BlockRift) (new BlockRift(Material.fire, properties).setHardness(1.0F) .setBlockName("rift")); blockLimbo = new BlockLimbo(15, Material.iron, properties.LimboDimensionID, limboDecay).setHardness(.2F).setBlockName("BlockLimbo").setLightLevel(.0F); - unstableDoor = (new UnstableDoor(Material.iron, properties).setHardness(.2F).setBlockName("chaosDoor").setLightLevel(.0F) ); - dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setBlockName("dimDoor")); + unstableDoor = (new UnstableDoor(Material.iron, properties).setHardness(.2F).setBlockName("chaosDoor").setLightLevel(.0F).setBlockTextureName("itemChaosDoor") ); + dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setBlockName("dimDoor").setBlockTextureName("itemDimDoor")); transTrapdoor = (TransTrapdoor) (new TransTrapdoor(Material.wood).setHardness(1.0F) .setBlockName("dimHatch")); itemDDKey = (new ItemDDKey()).setUnlocalizedName("itemDDKey"); @@ -229,15 +229,15 @@ public class mod_pocketDim mod_pocketDim.limboBiome = (new BiomeGenLimbo(properties.LimboBiomeID)); mod_pocketDim.pocketBiome = (new BiomeGenPocket(properties.PocketBiomeID)); - GameRegistry.registerBlock(quartzDoor, "Quartz Door"); - GameRegistry.registerBlock(personalDimDoor, "Personal Dimensional Door"); - GameRegistry.registerBlock(goldenDoor, "Golden Door"); - GameRegistry.registerBlock(goldenDimensionalDoor, "Golden Dimensional Door"); - GameRegistry.registerBlock(unstableDoor, "Unstable Door"); - GameRegistry.registerBlock(warpDoor, "Warp Door"); + GameRegistry.registerBlock(quartzDoor, null, "Quartz Door"); + GameRegistry.registerBlock(personalDimDoor, null, "Personal Dimensional Door"); + GameRegistry.registerBlock(goldenDoor, null, "Golden Door"); + GameRegistry.registerBlock(goldenDimensionalDoor, null, "Golden Dimensional Door"); + GameRegistry.registerBlock(unstableDoor, null, "Unstable Door"); + GameRegistry.registerBlock(warpDoor, null, "Warp Door"); GameRegistry.registerBlock(blockRift, "Rift"); GameRegistry.registerBlock(blockLimbo, "Unraveled Fabric"); - GameRegistry.registerBlock(dimensionalDoor, "Dimensional Door"); + GameRegistry.registerBlock(dimensionalDoor, null, "Dimensional Door"); GameRegistry.registerBlock(transTrapdoor,"Transdimensional Trapdoor"); GameRegistry.registerBlock(blockDimWallPerm, "Fabric of RealityPerm"); GameRegistry.registerBlock(transientDoor, "transientDoor"); -- 2.39.5 From 43e67bdbd3635b5def711e726c74fac91df8a25b Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 10:48:36 -0500 Subject: [PATCH 36/58] Don't crash server on startup trying to use sounds --- .../mod_pocketDim/CommonProxy.java | 7 ++- .../mod_pocketDim/EventHookContainer.java | 26 --------- .../mod_pocketDim/mod_pocketDim.java | 2 + .../mod_pocketDimClient/ClientOnlyHooks.java | 53 +++++++++++++++++++ .../mod_pocketDimClient/ClientProxy.java | 10 +++- 5 files changed, 69 insertions(+), 29 deletions(-) create mode 100644 src/main/java/StevenDimDoors/mod_pocketDimClient/ClientOnlyHooks.java diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java index 9a1666d..eb82a4f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java @@ -2,6 +2,7 @@ package StevenDimDoors.mod_pocketDim; import java.io.File; import java.io.FileOutputStream; import StevenDimDoors.mod_pocketDim.blocks.BaseDimDoor; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import StevenDimDoors.mod_pocketDim.tileentities.TileEntityDimDoor; import net.minecraft.entity.Entity; @@ -12,6 +13,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.IGuiHandler; +import net.minecraftforge.common.MinecraftForge; + public class CommonProxy implements IGuiHandler { public static String BLOCK_PNG = "/PocketBlockTextures.png"; @@ -145,7 +148,7 @@ public class CommonProxy implements IGuiHandler } } - - + public void registerSidedHooks(DDProperties properties) { + } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index e693738..f52eb7a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -51,12 +51,9 @@ public class EventHookContainer private DDWorldProperties worldProperties; private RiftRegenerator regenerator; - private ISound limboMusic; - public EventHookContainer(DDProperties properties) { this.properties = properties; - this.limboMusic = PositionedSoundRecord.func_147673_a(new ResourceLocation(mod_pocketDim.modid + ":creepy")); } public void setSessionFields(DDWorldProperties worldProperties, RiftRegenerator regenerator) @@ -82,24 +79,6 @@ public class EventHookContainer */ } - @SideOnly(Side.CLIENT) - @SubscribeEvent - public void onSoundEffectResult(PlaySoundEvent17 event) - { - ResourceLocation playingSound = event.sound.getPositionedSoundLocation(); - if (playingSound != null && playingSound.getResourceDomain().equals("minecraft") && (playingSound.getResourcePath().equals("music.game") || playingSound.getResourcePath().equals("music.game.creative"))) { - if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID) { - ResourceLocation sound = new ResourceLocation(mod_pocketDim.modid + ":creepy"); - - if (!Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(limboMusic)) { - event.result = limboMusic; - } else { - event.setResult(Event.Result.DENY); - } - } - } - } - @SubscribeEvent public void onPlayerEvent(PlayerInteractEvent event) { @@ -144,11 +123,6 @@ public class EventHookContainer { PocketManager.load(); } - - if (event.world.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID && - event.world.isRemote && !Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(limboMusic)) { - Minecraft.getMinecraft().getSoundHandler().playSound(limboMusic); - } } @SubscribeEvent diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index ea118d0..645f239 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -177,6 +177,8 @@ public class mod_pocketDim hooks = new EventHookContainer(properties); MinecraftForge.EVENT_BUS.register(hooks); MinecraftForge.TERRAIN_GEN_BUS.register(hooks); + + proxy.registerSidedHooks(properties); } @EventHandler diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientOnlyHooks.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientOnlyHooks.java new file mode 100644 index 0000000..24d2622 --- /dev/null +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientOnlyHooks.java @@ -0,0 +1,53 @@ +package StevenDimDoors.mod_pocketDimClient; + +import StevenDimDoors.mod_pocketDim.config.DDProperties; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.ISound; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.sound.PlaySoundEvent17; +import net.minecraftforge.event.world.WorldEvent; + +public class ClientOnlyHooks { + private DDProperties properties; + + private ISound limboMusic; + + public ClientOnlyHooks(DDProperties properties) { + this.properties = properties; + this.limboMusic = PositionedSoundRecord.func_147673_a(new ResourceLocation(mod_pocketDim.modid + ":creepy")); + } + + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onSoundEffectResult(PlaySoundEvent17 event) + { + ResourceLocation playingSound = event.sound.getPositionedSoundLocation(); + if (playingSound != null && playingSound.getResourceDomain().equals("minecraft") && (playingSound.getResourcePath().equals("music.game") || playingSound.getResourcePath().equals("music.game.creative"))) { + if (FMLClientHandler.instance().getClient().thePlayer.worldObj.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID) { + ResourceLocation sound = new ResourceLocation(mod_pocketDim.modid + ":creepy"); + + if (!Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(limboMusic)) { + event.result = limboMusic; + } else { + event.setResult(Event.Result.DENY); + } + } + } + } + + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load event) { + if (event.world.provider.dimensionId == mod_pocketDim.properties.LimboDimensionID && + event.world.isRemote && !Minecraft.getMinecraft().getSoundHandler().isSoundPlaying(limboMusic)) { + Minecraft.getMinecraft().getSoundHandler().playSound(limboMusic); + } + } +} diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index 9387b13..d3407fa 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -1,4 +1,5 @@ package StevenDimDoors.mod_pocketDimClient; +import StevenDimDoors.mod_pocketDim.config.DDProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.CommonProxy; @@ -12,6 +13,7 @@ import StevenDimDoors.mod_pocketDim.tileentities.TileEntityTransTrapdoor; import StevenDimDoors.mod_pocketDim.watcher.ClientLinkData; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraftforge.common.MinecraftForge; public class ClientProxy extends CommonProxy @@ -49,5 +51,11 @@ public class ClientProxy extends CommonProxy public void printStringClient(String string) { } - + + @Override + public void registerSidedHooks(DDProperties properties) { + ClientOnlyHooks hooks = new ClientOnlyHooks(properties); + MinecraftForge.EVENT_BUS.register(hooks); + MinecraftForge.TERRAIN_GEN_BUS.register(hooks); + } } \ No newline at end of file -- 2.39.5 From 8d282cb021bcaacae063f01466d8240b02c412bd Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 13:13:26 -0500 Subject: [PATCH 37/58] Decided to actually plug in the network. idea copyright olloth 2015 --- .../StevenDimDoors/mod_pocketDim/CommonProxy.java | 1 + .../mod_pocketDim/core/PocketManager.java | 4 ++-- .../StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 11 +++++------ .../mod_pocketDimClient/ClientProxy.java | 2 ++ 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java index eb82a4f..cdd81d9 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CommonProxy.java @@ -149,6 +149,7 @@ public class CommonProxy implements IGuiHandler } public void registerSidedHooks(DDProperties properties) { + new ServerPacketHandler(); } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 7b97f94..fd03a38 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -56,7 +56,7 @@ public class PocketManager } - private static class ClientLinkWatcher implements IUpdateWatcher + public static class ClientLinkWatcher implements IUpdateWatcher { @Override public void onCreated(ClientLinkData link) @@ -85,7 +85,7 @@ public class PocketManager } } - private static class ClientDimWatcher implements IUpdateWatcher + public static class ClientDimWatcher implements IUpdateWatcher { @Override public void onCreated(ClientDimData data) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 645f239..4f4f314 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -3,8 +3,10 @@ package StevenDimDoors.mod_pocketDim; import java.io.File; import java.util.List; +import StevenDimDoors.mod_pocketDim.network.DimDoorsNetwork; import StevenDimDoors.mod_pocketDim.schematic.BlockRotator; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.event.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; @@ -82,12 +84,6 @@ import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; -import cpw.mods.fml.common.event.FMLServerStartingEvent; -import cpw.mods.fml.common.event.FMLServerStoppedEvent; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; @@ -179,6 +175,8 @@ public class mod_pocketDim MinecraftForge.TERRAIN_GEN_BUS.register(hooks); proxy.registerSidedHooks(properties); + + DimDoorsNetwork.init(); } @EventHandler @@ -292,6 +290,7 @@ public class mod_pocketDim DDLoot.registerInfo(properties); proxy.loadTextures(); proxy.registerRenderers(); + FMLCommonHandler.instance().bus().register(new ConnectionHandler()); } public static void translateAndAdd(String key, List list) { diff --git a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java index d3407fa..4f965c1 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java +++ b/src/main/java/StevenDimDoors/mod_pocketDimClient/ClientProxy.java @@ -57,5 +57,7 @@ public class ClientProxy extends CommonProxy ClientOnlyHooks hooks = new ClientOnlyHooks(properties); MinecraftForge.EVENT_BUS.register(hooks); MinecraftForge.TERRAIN_GEN_BUS.register(hooks); + PocketManager.getDimwatcher().registerReceiver (new PocketManager.ClientDimWatcher()); + PocketManager.getLinkWatcher().registerReceiver(new PocketManager.ClientLinkWatcher()); } } \ No newline at end of file -- 2.39.5 From 0c70b0760b8dd8e557aba36816314ad61cf3d93b Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 13:44:00 -0500 Subject: [PATCH 38/58] This event appeared to be unnecessary and was jacking up SSP --- .../mod_pocketDim/ConnectionHandler.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index de0eb0d..77fd7e6 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -14,26 +14,6 @@ import net.minecraftforge.common.network.ForgeMessage; public class ConnectionHandler { - @SubscribeEvent - public String connectionReceived(FMLNetworkEvent.ServerConnectionFromClientEvent event) - { - for(NewDimData data : PocketManager.getDimensions()) - { - try - { - if(data.isPocketDimension()||data.id()==mod_pocketDim.properties.LimboDimensionID) - { - event.manager.channel().writeAndFlush(new ForgeMessage.DimensionRegisterMessage(data.id(), DimensionManager.getProviderType(data.id()))); - } - } - catch(Exception E) - { - E.printStackTrace(); - } - } - return null; - } - @SubscribeEvent public void connectionClosed(FMLNetworkEvent.ClientDisconnectionFromServerEvent event) { -- 2.39.5 From af0d1450a4918189b847db92b3f6334f4823134c Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 13:57:11 -0500 Subject: [PATCH 39/58] SMP crash on rift creation --- .../mod_pocketDim/tileentities/TileEntityRift.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index a292a9c..bd0231b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -292,7 +292,7 @@ public class TileEntityRift extends DDTileEntityBase ClientLinkData linkData = new ClientLinkData(PocketManager.getLink(xCoord, yCoord, zCoord, worldObj)); NBTTagCompound link = new NBTTagCompound(); - linkData.writeToNBT(tag); + linkData.writeToNBT(link); tag.setTag("Link", link); } -- 2.39.5 From 1464638fffbdb16c20982685676b4e02ce2f3cec Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 10 Mar 2015 16:59:34 -0500 Subject: [PATCH 40/58] Fixed SSP- stop the network code from doubling up adds/deletes --- .../mod_pocketDim/core/PocketManager.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index fd03a38..f889aa3 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -61,9 +61,10 @@ public class PocketManager @Override public void onCreated(ClientLinkData link) { - Point4D source = link.point; - NewDimData dimension = getDimensionData(source.getDimension()); - dimension.createLink(source, LinkType.CLIENT, 0, link.lock); + Point4D source = link.point; + NewDimData dimension = getDimensionData(source.getDimension()); + if (dimension.getLink(source.getX(), source.getY(), source.getZ()) == null) + dimension.createLink(source, LinkType.CLIENT, 0, link.lock); } @Override @@ -71,7 +72,8 @@ public class PocketManager { Point4D source = link.point; NewDimData dimension = getDimensionData(source.getDimension()); - dimension.deleteLink(source.getX(), source.getY(), source.getZ()); + if (dimension.getLink(source.getX(),source.getY(),source.getZ()) != null) + dimension.deleteLink(source.getX(), source.getY(), source.getZ()); } @Override -- 2.39.5 From 8acbada3ba5b8558588c23497d72bdb1a2474cfb Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 11 Mar 2015 07:55:59 +0300 Subject: [PATCH 41/58] Create ru_RU.lang --- .../resources/assets/dimdoors/lang/ru_RU.lang | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/resources/assets/dimdoors/lang/ru_RU.lang diff --git a/src/main/resources/assets/dimdoors/lang/ru_RU.lang b/src/main/resources/assets/dimdoors/lang/ru_RU.lang new file mode 100644 index 0000000..ba3a43b --- /dev/null +++ b/src/main/resources/assets/dimdoors/lang/ru_RU.lang @@ -0,0 +1,59 @@ +itemGroup.dimDoorsCreativeTab=Dimensional Doors: Предметы +tile.doorGold.name=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +tile.transientDoor.name=Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +tile.dimDoorGold.name=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ð¿Ñ€Ð¾ÑтранÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +tile.doorQuartz.name=ÐšÐ²Ð°Ñ€Ñ†ÐµÐ²Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +tile.dimDoorPersonal.name=Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð¾ÑтранÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +tile.blockDimWall.name=Ткань ÐœÐ¸Ñ€Ð¾Ð·Ð´Ð°Ð½Ð¸Ñ +tile.blockAlteredWall.name=Ð˜Ð·Ð¼ÐµÐ½Ñ‘Ð½Ð½Ð°Ñ Ñ‚ÐºÐ°Ð½ÑŒ +tile.blockAncientWall.name=ДревнÑÑ Ñ‚ÐºÐ°Ð½ÑŒ +tile.blockDimWallPerm.name=Ð’ÐµÑ‡Ð½Ð°Ñ Ñ‚ÐºÐ°Ð½ÑŒ +tile.dimDoorWarp.name=Дверь иÑÐºÐ°Ð¶ÐµÐ½Ð¸Ñ +tile.rift.name=Разлом +tile.BlockLimbo.name=РаÑÐ¿ÑƒÑ‚Ð°Ð½Ð½Ð°Ñ Ñ‚ÐºÐ°Ð½ÑŒ +tile.chaosDoor.name=ÐеÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +tile.dimDoor.name=ПроÑтранÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +tile.dimHatch.name=МежпроÑтранÑтвенный люк +item.itemGoldDoor.name=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +item.itemDDKey=Ключ разлома +item.itemQuartzDoor.name=ÐšÐ²Ð°Ñ€Ñ†ÐµÐ²Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +item.itemQuartzDimDoor.name=Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ñ€Ð¾ÑтранÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +item.itemGoldDimDoor.name=Ð—Ð¾Ð»Ð¾Ñ‚Ð°Ñ Ð¿Ñ€Ð¾ÑтранÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +item.itemDimDoor.name=ПроÑтранÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +item.itemDimDoorWarp.name=Дверь иÑÐºÐ°Ð¶ÐµÐ½Ð¸Ñ +item.itemLinkSignature.name=ПодпиÑыватель разлома +item.itemStabilizedRiftSig.name=Стабилизированный подпиÑыватель разлома +item.itemRiftRemover.name=Уничтожитель разломов +item.itemStableFabric.name=Ð¡Ñ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ñ‚ÐºÐ°Ð½ÑŒ +item.itemChaosDoor.name=ÐеÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð´Ð²ÐµÑ€ÑŒ +item.ItemRiftBlade.name=Клинок разлома +item.itemWorldThread.name=ÐœÐ¸Ñ€Ð¾Ð²Ð°Ñ Ð½Ð¸Ñ‚ÑŒ +info.riftkey.bound=СвÑзан +info.riftkey.unbound=Ðе ÑвÑзан +info.dimDoor0=ПоÑтавьте на блок под разломом, +info.dimDoor1=чтобы активировать Ñтот разлом или +info.dimDoor2=поÑтавьте куда угодно, чтобы Ñоздать +info.dimDoor3=карманное измерение. +info.goldDimDoor0=Схожа Ñ Ð¿Ñ€Ð¾ÑтранÑтвенной дверью, +info.goldDimDoor1=но она также держит карманное измерение +info.goldDimDoor2=загруженным, еÑли она размещена внутри его. +info.personalDimDoor0=Создает путь к +info.personalDimDoor1=Вашему карману +info.riftblade0=Открывает временные двери на разломах +info.riftblade1=и наноÑит урон при телепортации. +info.riftRemover0=ИÑпользуйте Ñ€Ñдом Ñ Ñ€Ð°Ð·Ð»Ð¾Ð¼Ð¾Ð¼, +info.riftRemover1=чтобы убрать его и +info.riftRemover2=другие ближайшие разломы. +info.riftSignature.bound=Ведёт в (%d, %d, %d) в измерение #%d +info.riftSignature.unbound0=Первое нажатие ÑохранÑет раÑположение; +info.riftSignature.unbound1=второе нажатие Ñоздаёт пару +info.riftSignature.unbound2=разломов, ÑоединÑющих два раÑположениÑ. +info.riftSignature.stable0=Первое нажатие ÑохранÑет раÑположение, +info.riftSignature.stable1=оÑтальные Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ Ñоздают разломы, ÑоединÑющие +info.riftSignature.stable2=первое и поÑледнее раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑте. +info.chaosDoor=Внимание: Ведёт неизвеÑтно куда +info.warpDoor0=ПоÑтавьте на блок под +info.warpDoor1=разломом, чтобы Ñоздать портал +info.warpDoor2=или поÑтавьте куда угодно в +info.warpDoor3=карманном измерении, чтобы выйти из него. +entity.dimdoors.Monolith.name=Монолит -- 2.39.5 From 45b89abe9083f3b0c48d3c64fb48152ce711203d Mon Sep 17 00:00:00 2001 From: Vexatos Date: Wed, 11 Mar 2015 07:10:32 +0100 Subject: [PATCH 42/58] Create de_DE.lang --- .../resources/assets/dimdoors/lang/de_DE.lang | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/resources/assets/dimdoors/lang/de_DE.lang diff --git a/src/main/resources/assets/dimdoors/lang/de_DE.lang b/src/main/resources/assets/dimdoors/lang/de_DE.lang new file mode 100644 index 0000000..6200c55 --- /dev/null +++ b/src/main/resources/assets/dimdoors/lang/de_DE.lang @@ -0,0 +1,59 @@ +itemGroup.dimDoorsCreativeTab=Dimensional Doors: Items +tile.doorGold.name=Goldtür +tile.transientDoor.name=Vergängliche Tür +tile.dimDoorGold.name=Goldene Dimensionaltür +tile.doorQuartz.name=Quarztür +tile.dimDoorPersonal.name=Persönliche Dimensionaltür +tile.blockDimWall.name=Stoff der Realität +tile.blockAlteredWall.name=Veränderter Stoff +tile.blockAncientWall.name=Antiker Stoff +tile.blockDimWallPerm.name=Ewiger Stoff +tile.dimDoorWarp.name=Warp-Tür +tile.rift.name=Spalt +tile.BlockLimbo.name=Entwirrter Stoff +tile.chaosDoor.name=Instabile Tür +tile.dimDoor.name=Dimensionaltür +tile.dimHatch.name=Transdimensionale Falltür +item.itemGoldDoor.name=Goldtür +item.itemDDKey=Spaltschlüssel +item.itemQuartzDoor.name=Quarztür +item.itemQuartzDimDoor.name=Persönliche Dimensionaltür +item.itemGoldDimDoor.name=Goldene Dimensionaltür +item.itemDimDoor.name=Dimensionaltür +item.itemDimDoorWarp.name=Warp-Tür +item.itemLinkSignature.name=Spaltsignatur +item.itemStabilizedRiftSig.name=Stabilisierte Spaltsignatur +item.itemRiftRemover.name=Spaltentferner +item.itemStableFabric.name=Stabiler Stoff +item.itemChaosDoor.name=Instabile Tür +item.ItemRiftBlade.name=Spaltklinge +item.itemWorldThread.name=Weltenfaden +info.riftkey.bound=Gebunden +info.riftkey.unbound=Nicht gebunden +info.dimDoor0=Platziere auf dem Block unterhalb eines Spalts, +info.dimDoor1=um diesen Spalt zu aktivieren, oder +info.dimDoor2=irgendwo anders, um eine +info.dimDoor3=kleine Dimension to erschaffen. +info.goldDimDoor0=Ähnlich einer Dimensionaltür, +info.goldDimDoor1=aber hält die kleine Dimension geladen, +info.goldDimDoor2=sollte sie in einer solchen platziert sein. +info.personalDimDoor0=Erstellt einen Pfad zu +info.personalDimDoor1=deiner persönlichen Dimension +info.riftblade0=Öffnet temporäre Türen auf Spalten +info.riftblade1=und hat einen Teleport-Angriff. +info.riftRemover0=Verwende nahe eines offenen Spalts, +info.riftRemover1=um ihn und jegliche Spalte +info.riftRemover2=in der Nähe zu entfernen. +info.riftSignature.bound=Führt zu(%d, %d, %d) in Dimension #%d +info.riftSignature.unbound0=Erster Klick speichert die Position; +info.riftSignature.unbound1=zweiter Klick kreiert ein Paar von Spalten, +info.riftSignature.unbound2=welche zu den zwei Positionen führen. +info.riftSignature.stable0=Erster Klick speichert die Position, +info.riftSignature.stable1=weitere Klicks kreieren Spalte, die +info.riftSignature.stable2=die erste und die aktuelle Position verbinden. +info.chaosDoor=Vorsicht: Führt zu einem zufälligen Ziel +info.warpDoor0=Platziere auf dem Block unterhalb eines +info.warpDoor1=Spalts, um ein Portal zu erstellen, +info.warpDoor2=oder platziere irgendwo in einer +info.warpDoor3=kleinen Dimension, um sie zu verlassen. +entity.dimdoors.Monolith.name=Monolith -- 2.39.5 From d2c8877c263470f64b34cf94101ceb42008cb4b9 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Wed, 11 Mar 2015 07:45:51 -0500 Subject: [PATCH 43/58] Give personal dims the right provider on client-side --- .../StevenDimDoors/mod_pocketDim/core/PocketManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index f889aa3..69f7678 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -568,7 +568,10 @@ public class PocketManager // unfortuantly. I send the dimdata to the client when they // teleport. // Steven - DimensionManager.registerDimension(dimensionID, mod_pocketDim.properties.PocketProviderID); + int providerID = mod_pocketDim.properties.PocketProviderID; + if (type == DimensionType.PERSONAL) + providerID = mod_pocketDim.properties.PersonalPocketProviderID; + DimensionManager.registerDimension(dimensionID,providerID); } return dimension; } -- 2.39.5 From 6907350f004f0521a6689084d6b46c5fa5cbbf5a Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Wed, 11 Mar 2015 08:22:24 -0500 Subject: [PATCH 44/58] Personal links set a destination for annoying cruft reasons. Easier to ignore it when someone is generating a personal dim than fix that. --- .../java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java index d7f97c9..adb002f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketBuilder.java @@ -286,7 +286,7 @@ public class PocketBuilder { throw new IllegalArgumentException("properties cannot be null."); } - if (link.hasDestination()) + if (link.linkType() != LinkType.PERSONAL && link.hasDestination()) { throw new IllegalArgumentException("link cannot have a destination assigned already."); } -- 2.39.5 From a4c1d3aa70defd756cbee38d0d92fe7ea4a3b7ca Mon Sep 17 00:00:00 2001 From: Mrkwtkr <1069894992@qq.com> Date: Wed, 11 Mar 2015 21:29:01 +0800 Subject: [PATCH 45/58] Create zh_CN.lang :P --- .../resources/assets/dimdoors/lang/zh_CN.lang | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/resources/assets/dimdoors/lang/zh_CN.lang diff --git a/src/main/resources/assets/dimdoors/lang/zh_CN.lang b/src/main/resources/assets/dimdoors/lang/zh_CN.lang new file mode 100644 index 0000000..e5a720e --- /dev/null +++ b/src/main/resources/assets/dimdoors/lang/zh_CN.lang @@ -0,0 +1,59 @@ +itemGroup.dimDoorsCreativeTab=æ¬¡å…ƒé—¨ç‰©å“ +tile.doorGold.name=金门 +tile.transientDoor.name=瞬æ¯ä¹‹é—¨ +tile.dimDoorGold.name=金制次元门 +tile.doorQuartz.name=石英门 +tile.dimDoorPersonal.name=ç§äººæ¬¡å…ƒé—¨ +tile.blockDimWall.name=çŽ°å®žä¹‹å£ +tile.blockAlteredWall.name=å˜åŒ–ä¹‹å£ +tile.blockAncientWall.name=远å¤ä¹‹å£ +tile.blockDimWallPerm.name=æ°¸æ’ä¹‹å£ +tile.dimDoorWarp.name=扭曲之门 +tile.rift.name=裂痕 +tile.BlockLimbo.name=è¾¹å¢ƒä¹‹å£ +tile.chaosDoor.name=ä¸ç¨³å®šçš„é—¨ +tile.dimDoor.name=次元门 +tile.dimHatch.name=空间活æ¿é—¨ +item.itemGoldDoor.name=金门 +item.itemDDKey=裂痕钥匙 +item.itemQuartzDoor.name=石英门 +item.itemQuartzDimDoor.name=ç§äººæ¬¡å…ƒé—¨ +item.itemGoldDimDoor.name=金制次元门 +item.itemDimDoor.name=次元门 +item.itemDimDoorWarp.name=扭曲之门 +item.itemLinkSignature.name=裂痕å°è®° +item.itemStabilizedRiftSig.name=裂痕å°è®°(稳定) +item.itemRiftRemover.name=裂痕移除器 +item.itemStableFabric.name=稳定构造 +item.itemChaosDoor.name=ä¸ç¨³å®šé—¨ +item.ItemRiftBlade.name=裂痕之刃 +item.itemWorldThread.name=世界纤维 +info.riftkey.bound=绑定 +info.riftkey.unbound=å–æ¶ˆç»‘定 +info.dimDoor0=放在裂痕下方的方å—上 +info.dimDoor1=æ¥æ¿€æ´»è£‚ç—• +info.dimDoor2=或放在任æ„åœ°ç‚¹ç”Ÿæˆ +info.dimDoor3=一个å£è¢‹æ¬¡å…ƒ. +info.goldDimDoor0=类似于次元门 +info.goldDimDoor1=但它放在次元内部时 +info.goldDimDoor2=ä¼šä¿æŒæ¬¡å…ƒçš„加载. +info.personalDimDoor0=生æˆä¸€ä¸ªé€šå‘ä½  +info.personalDimDoor1=å£è¢‹æ¬¡å…ƒçš„路径 +info.riftblade0=在裂痕上开å¯ä¸´æ—¶çš„é—¨ +info.riftblade1=它还拥有瞬移攻击的能力. +info.riftRemover0=在外露的裂痕附近使用 +info.riftRemover1=æ¥ç§»é™¤å®ƒä»¥åŠé™„近的其他 +info.riftRemover2=裂痕. +info.riftSignature.bound=指å‘(%d, %d, %d) ä½äºŽ#%d +info.riftSignature.unbound0=第一次点击记录一个ä½ç½®; +info.riftSignature.unbound1=第二次点击在两地间创造 +info.riftSignature.unbound2=一对相互连接的裂痕. +info.riftSignature.stable0=首次点击记录一个ä½ç½®, +info.riftSignature.stable1=冿¬¡ç‚¹å‡»ç”Ÿæˆè¿žæŽ¥ä¸¤åœ°çš„ +info.riftSignature.stable2=裂痕. +info.chaosDoor=注æ„: å°†ä¼šéšæœºä¼ é€ +info.warpDoor0=放在裂痕下方的方å—上 +info.warpDoor1=æ¥åˆ¶é€ ä¼ é€é—¨, +info.warpDoor2=放在å£è¢‹æ¬¡å…ƒä¸­ +info.warpDoor3=以退出空间. +entity.dimdoors.Monolith.name=巨石 -- 2.39.5 From 4bb42971c8a6ed0a2bf7b57accb5288c8ec449c4 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Wed, 11 Mar 2015 09:28:59 -0500 Subject: [PATCH 46/58] A bunch of blocks weren't properly rift-immune because they weren't initted yet --- src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java index 4f4f314..d5544ac 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/mod_pocketDim.java @@ -200,11 +200,11 @@ public class mod_pocketDim blockDimWall = new BlockDimWall(0, Material.iron).setLightLevel(1.0F).setHardness(0.1F).setBlockName("blockDimWall"); blockDimWallPerm = (new BlockDimWallPerm(0, Material.iron)).setLightLevel(1.0F).setBlockUnbreakable().setResistance(6000000.0F).setBlockName("blockDimWallPerm"); warpDoor = new WarpDoor(Material.wood, properties).setHardness(1.0F) .setBlockName("dimDoorWarp").setBlockTextureName("itemDimDoorWarp"); - blockRift = (BlockRift) (new BlockRift(Material.fire, properties).setHardness(1.0F) .setBlockName("rift")); blockLimbo = new BlockLimbo(15, Material.iron, properties.LimboDimensionID, limboDecay).setHardness(.2F).setBlockName("BlockLimbo").setLightLevel(.0F); unstableDoor = (new UnstableDoor(Material.iron, properties).setHardness(.2F).setBlockName("chaosDoor").setLightLevel(.0F).setBlockTextureName("itemChaosDoor") ); dimensionalDoor = (DimensionalDoor) (new DimensionalDoor(Material.iron, properties).setHardness(1.0F).setResistance(2000.0F) .setBlockName("dimDoor").setBlockTextureName("itemDimDoor")); transTrapdoor = (TransTrapdoor) (new TransTrapdoor(Material.wood).setHardness(1.0F) .setBlockName("dimHatch")); + blockRift = (BlockRift) (new BlockRift(Material.fire, properties).setHardness(1.0F) .setBlockName("rift")); itemDDKey = (new ItemDDKey()).setUnlocalizedName("itemDDKey"); itemQuartzDoor = (new ItemQuartzDoor(Material.rock)).setUnlocalizedName("itemQuartzDoor"); -- 2.39.5 From 79f60fb425c09fd0db9771fcffc55eb89c68a12b Mon Sep 17 00:00:00 2001 From: TheVikingWarrior Date: Wed, 11 Mar 2015 17:09:30 +0100 Subject: [PATCH 47/58] Create it_IT.lang --- .../resources/assets/dimdoors/lang/it_IT.lang | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/resources/assets/dimdoors/lang/it_IT.lang diff --git a/src/main/resources/assets/dimdoors/lang/it_IT.lang b/src/main/resources/assets/dimdoors/lang/it_IT.lang new file mode 100644 index 0000000..3848d42 --- /dev/null +++ b/src/main/resources/assets/dimdoors/lang/it_IT.lang @@ -0,0 +1,59 @@ +itemGroup.dimDoorsCreativeTab=Dimensional Doors oggetti +tile.doorGold.name=Porta d'oro +tile.transientDoor.name=Porta transitoria +tile.dimDoorGold.name=Porta d'oro dimensionale +tile.doorQuartz.name=Porta di quarzo +tile.dimDoorPersonal.name=Porta dimensionale personale +tile.blockDimWall.name=Tessuto della realtà +tile.blockAlteredWall.name=Tessuto alterato +tile.blockAncientWall.name=Tessuto antico +tile.blockDimWallPerm.name=Tessuto eterno +tile.dimDoorWarp.name=Porta distorta +tile.rift.name=Frattura +tile.BlockLimbo.name=Tessuto disfatto +tile.chaosDoor.name=Porta instabile +tile.dimDoor.name=Porta dimensionale +tile.dimHatch.name=Botola transdimensionale +item.itemGoldDoor.name=Porta d'oro +item.itemDDKey=Chiave per frattura +item.itemQuartzDoor.name=Porta di quarzo +item.itemQuartzDimDoor.name=Porta dimensionale personale +item.itemGoldDimDoor.name=Porta d'oro dimensionale +item.itemDimDoor.name=Porta dimensionale +item.itemDimDoorWarp.name=Porta distorta +item.itemLinkSignature.name=Segno di frattura +item.itemStabilizedRiftSig.name=Segno di frattura stabilizzato +item.itemRiftRemover.name=Rimovitore di frattura +item.itemStableFabric.name=Tessuto stabile +item.itemChaosDoor.name=Porta instabile +item.ItemRiftBlade.name=Lama dimensionale +item.itemWorldThread.name=Filo di mondo +info.riftkey.bound=Legato +info.riftkey.unbound=Non legato +info.dimDoor0=Piazzalo sul blocco sotto una +info.dimDoor1=frattura per attivarla o piazzalo +info.dimDoor2=da qualunque altra parte per creare +info.dimDoor3=una dimensione tascabile. +info.goldDimDoor0=Simile a una Porta dimensionale +info.goldDimDoor1=ma tiene la dimensione tascabile +info.goldDimDoor2=caricata se piazzata all'interno. +info.personalDimDoor0=Crea un sentiero alla +info.personalDimDoor1=tua dimensione tascabile +info.riftblade0=Apre porte temporanee su fratture +info.riftblade1=e ha un colpo che teletrasporta. +info.riftRemover0=Usalo presso una frattura +info.riftRemover1=esposta per rimuovere quello +info.riftRemover2=e altre fratture vicine. +info.riftSignature.bound=Porta a (%d, %d, %d) nella dimensione #%d +info.riftSignature.unbound0=Al primo clic salva la posizione; al +info.riftSignature.unbound1=secondo clic crea un paio di fratture +info.riftSignature.unbound2=che collegano le due posizioni. +info.riftSignature.stable0=Al primo clic salva la posizione; al +info.riftSignature.stable1=secondo clic crea fratture che +info.riftSignature.stable2=collegano la prima e ultima posizione. +info.chaosDoor=Attenziione: Porta a una destinazione casuale +info.warpDoor0=Piazzalo sul blocco sotto una +info.warpDoor1=frattura per creare un portale, +info.warpDoor2=o piazzalo da qualunque altra parte +info.warpDoor3=in una dimensione tascabile per uscire. +entity.dimdoors.Monolith.name=Monolito -- 2.39.5 From 74ac7e5e6f54211b1e46cd87c1dbde131fe92942 Mon Sep 17 00:00:00 2001 From: DragonsLover Date: Wed, 11 Mar 2015 17:08:25 -0400 Subject: [PATCH 48/58] Adding French Canadian language --- .../resources/assets/dimdoors/lang/fr_CA.lang | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/main/resources/assets/dimdoors/lang/fr_CA.lang diff --git a/src/main/resources/assets/dimdoors/lang/fr_CA.lang b/src/main/resources/assets/dimdoors/lang/fr_CA.lang new file mode 100644 index 0000000..49c5173 --- /dev/null +++ b/src/main/resources/assets/dimdoors/lang/fr_CA.lang @@ -0,0 +1,63 @@ +itemGroup.dimDoorsCreativeTab=Dimensional Doors + +tile.doorGold.name=Porte dorée +tile.transientDoor.name=Porte transitoire +tile.dimDoorGold.name=Porte dorée dimensionnelle +tile.doorQuartz.name=Porte de quartz +tile.dimDoorPersonal.name=Porte dimensionnelle personnelle +tile.blockDimWall.name=Étoffe de la réalité +tile.blockAlteredWall.name=Étoffe altérée +tile.blockAncientWall.name=Étoffe ancienne +tile.blockDimWallPerm.name=Étoffe éternelle +tile.dimDoorWarp.name=Porte-raccourci +tile.rift.name=Fissure +tile.BlockLimbo.name=Étoffe effilochée +tile.chaosDoor.name=Porte instable +tile.dimDoor.name=Porte dimensionnelle +tile.dimHatch.name=Trappe transdimensionnelle + +item.itemGoldDoor.name=Porte dorée +item.itemDDKey=Clé de fissure +item.itemQuartzDoor.name=Porte de quartz +item.itemQuartzDimDoor.name=Porte dimensionnelle personnelle +item.itemGoldDimDoor.name=Porte dorée dimensionnelle +item.itemDimDoor.name=Porte dimensionnelle +item.itemDimDoorWarp.name=Porte-raccourci +item.itemLinkSignature.name=Signature de fissure +item.itemStabilizedRiftSig.name=Signature de fissure stabilisée +item.itemRiftRemover.name=Enleveur de fissure +item.itemStableFabric.name=Étoffe stable +item.itemChaosDoor.name=Porte instable +item.ItemRiftBlade.name=Lame de fissure +item.itemWorldThread.name=Fil du monde + +info.riftkey.bound=Liée +info.riftkey.unbound=Non liée +info.dimDoor0=Placez sur le bloc sous une fissure +info.dimDoor1=pour activer cette fissure ou placez +info.dimDoor2=n'importe où ailleurs pour créer une +info.dimDoor3=dimension de poche. +info.goldDimDoor0=Similaire à une porte dimensionnelle +info.goldDimDoor1=mais garde une dimension de poche +info.goldDimDoor2=chargée si elle est placée à l'intérieur. +info.personalDimDoor0=Crée un passage vers votre +info.personalDimDoor1=dimension de poche personnelle. +info.riftblade0=Ouvre des portes temporaires sur des fissures +info.riftblade1=et possède une attaque de téléporation. +info.riftRemover0=Utilisez près d'une fissure +info.riftRemover1=exposée pour l'enlever ainsi +info.riftRemover2=que celles à proximité. +info.riftSignature.bound=Mène aux coordonnées (%d, %d, %d) à la dimension #%d +info.riftSignature.unbound0=Le premier clic stocke un emplacement ; +info.riftSignature.unbound1=le deuxième clic crée une paire de +info.riftSignature.unbound2=fissures qui lient les deux emplacements. +info.riftSignature.stable0=Le premier clic stocke un emplacement, +info.riftSignature.stable1=les autres clics créent des fissurent qui lient +info.riftSignature.stable2=le premier et les derniers emplacements ensemble. +info.chaosDoor=Attention : mène vers une destination aléatoire +info.warpDoor0=Placez sur le bloc sous une +info.warpDoor1=fissure pour créer un portail, +info.warpDoor2=ou placez n'importe où dans une +info.warpDoor3=dimension de poche pour sortir. + +entity.dimdoors.Monolith.name=Monolithe -- 2.39.5 From 41c88d1904fd08ae54943fbf655748a26c64af28 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 12 Mar 2015 06:36:36 -0500 Subject: [PATCH 49/58] Personal dim door should require quartz doors, not gold doors. --- src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java index d95bd36..da7c10c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/CraftingManager.java @@ -105,7 +105,7 @@ public class CraftingManager if (properties.CraftingPersonalDimDoorAllowed) { GameRegistry.addRecipe(new ItemStack(mod_pocketDim.itemPersonalDoor,1), - "yxy", 'y', mod_pocketDim.itemGoldenDoor, 'x', mod_pocketDim.itemStableFabric); + "yxy", 'y', mod_pocketDim.itemQuartzDoor, 'x', mod_pocketDim.itemStableFabric); } if (properties.CraftingQuartzDoorAllowed) { -- 2.39.5 From d210b9b91cfe9fec073b2e1781b978bef3c7b154 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 12 Mar 2015 10:55:30 -0500 Subject: [PATCH 50/58] Register the dimensions early in the connection process so we can actually log in and stuff. --- .../mod_pocketDim/ConnectionHandler.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 77fd7e6..1eab95a 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -1,9 +1,15 @@ package StevenDimDoors.mod_pocketDim; import StevenDimDoors.mod_pocketDim.network.DimDoorsNetwork; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; +import cpw.mods.fml.common.network.FMLEmbeddedChannel; import cpw.mods.fml.common.network.FMLNetworkEvent; +import cpw.mods.fml.common.network.FMLOutboundHandler; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.relauncher.Side; +import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.Packet; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.DimensionManager; @@ -11,9 +17,28 @@ import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import StevenDimDoors.mod_pocketDim.watcher.ClientDimData; import net.minecraftforge.common.network.ForgeMessage; +import net.minecraftforge.common.network.ForgeNetworkHandler; public class ConnectionHandler { + @SubscribeEvent + public void serverConnectionFromClientEvent(FMLNetworkEvent.ServerConnectionFromClientEvent event) { + if (FMLCommonHandler.instance().getSide() == Side.SERVER) { + NetHandlerPlayServer server = ((NetHandlerPlayServer)event.handler); + FMLEmbeddedChannel channel = NetworkRegistry.INSTANCE.getChannel("FORGE", Side.SERVER); + for (NewDimData data : PocketManager.getDimensions()) { + try { + if (data.isPocketDimension() || data.id() == mod_pocketDim.properties.LimboDimensionID) { + channel.writeOutbound(new ForgeMessage.DimensionRegisterMessage(data.id(), DimensionManager.getProviderType(data.id()))); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } + @SubscribeEvent public void connectionClosed(FMLNetworkEvent.ClientDisconnectionFromServerEvent event) { -- 2.39.5 From 6651559793f6317addf32bcb40d393b98d60cdb1 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 12 Mar 2015 11:12:51 -0500 Subject: [PATCH 51/58] I MIGHT have copy/pasted this from starmall. --- .../StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java index be8bb7a..e935164 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/DimDoorsNetwork.java @@ -39,7 +39,7 @@ public class DimDoorsNetwork extends FMLIndexedMessageToMessageCodec Date: Thu, 12 Mar 2015 11:33:33 -0500 Subject: [PATCH 52/58] Unload dimensions on discon, don't freak out on TE load if dimensions aren't there --- .../mod_pocketDim/EventHookContainer.java | 1 + .../mod_pocketDim/core/PocketManager.java | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index f52eb7a..2704b29 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -122,6 +122,7 @@ public class EventHookContainer if (!PocketManager.isLoaded()) { PocketManager.load(); + PocketManager.isConnected = true; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 69f7678..9a5090c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -63,7 +63,7 @@ public class PocketManager { Point4D source = link.point; NewDimData dimension = getDimensionData(source.getDimension()); - if (dimension.getLink(source.getX(), source.getY(), source.getZ()) == null) + if (dimension != null && dimension.getLink(source.getX(), source.getY(), source.getZ()) == null) dimension.createLink(source, LinkType.CLIENT, 0, link.lock); } @@ -72,7 +72,7 @@ public class PocketManager { Point4D source = link.point; NewDimData dimension = getDimensionData(source.getDimension()); - if (dimension.getLink(source.getX(),source.getY(),source.getZ()) != null) + if (dimension != null && dimension.getLink(source.getX(),source.getY(),source.getZ()) != null) dimension.deleteLink(source.getX(), source.getY(), source.getZ()); } @@ -81,9 +81,10 @@ public class PocketManager { Point4D source = link.point; NewDimData dimension = getDimensionData(source.getDimension()); - DimLink dLink = dimension.getLink(source); - dLink.lock = link.lock; - + if (dimension != null) { + DimLink dLink = dimension.getLink(source); + dLink.lock = link.lock; + } } } -- 2.39.5 From bb2525d94ec66b3914bae153fd2d13bda3e99969 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 12 Mar 2015 12:16:39 -0500 Subject: [PATCH 53/58] Moved the onlogin network message to do what it should have been doing --- .../mod_pocketDim/ConnectionHandler.java | 10 ++++------ .../mod_pocketDim/EventHookContainer.java | 3 +-- .../mod_pocketDim/core/PocketManager.java | 7 +++++++ .../mod_pocketDim/helpers/Compactor.java | 4 ++-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java index 1eab95a..a978b54 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/ConnectionHandler.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.network.ClientJoinPacket; import StevenDimDoors.mod_pocketDim.network.DimDoorsNetwork; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -42,17 +43,14 @@ public class ConnectionHandler @SubscribeEvent public void connectionClosed(FMLNetworkEvent.ClientDisconnectionFromServerEvent event) { - if(PocketManager.isConnected) - { - PocketManager.unload(); - } + PocketManager.tryUnload(); } @SubscribeEvent public void playerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { - // Hax... please don't do this! >_< - PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.createDimensionDataDangerously(0))); + // Hax... please don't do this! >_< + DimDoorsNetwork.sendToPlayer(new ClientJoinPacket(), event.player); } } \ No newline at end of file diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java index 2704b29..c241004 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/EventHookContainer.java @@ -119,10 +119,9 @@ public class EventHookContainer // fires before we can use DimensionManager and onServerStarting fires // after the game tries to generate terrain. If a gateway tries to // generate before PocketManager has initialized, we get a crash. - if (!PocketManager.isLoaded()) + if (!event.world.isRemote && !PocketManager.isLoaded()) { PocketManager.load(); - PocketManager.isConnected = true; } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java index 9a5090c..a476e36 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/PocketManager.java @@ -629,6 +629,13 @@ public class PocketManager return (ArrayList) rootDimensions.clone(); } + public static void tryUnload() { + if (isConnected) + unload(); + isLoading = false; + isLoaded = false; + } + public static void unload() { System.out.println("Unloading Pocket Dimensions..."); diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java index b5dc629..8a9aba7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/helpers/Compactor.java @@ -33,11 +33,11 @@ public class Compactor { output.writeInt(dimension.id()); output.writeInt(dimension.root().id()); + output.writeInt(dimension.type().index); output.writeInt(dimension.linkCount()); for (DimLink link : dimension.links()) { - Point4D.write(link.source(), output); - output.writeInt(link.orientation()); + (new ClientLinkData(link)).write(output); } } -- 2.39.5 From 44a0d4b3ec4f06b1e2405ff15572ab931506282e Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Sun, 15 Mar 2015 22:19:13 -0500 Subject: [PATCH 54/58] Correct various weirdness with personal doors in pocket dimensions --- .../mod_pocketDim/blocks/PersonalDimDoor.java | 6 ++++- .../mod_pocketDim/core/DDTeleporter.java | 22 ++++++++++++++----- .../mod_pocketDim/core/LinkType.java | 1 + .../mod_pocketDim/core/NewDimData.java | 3 ++- .../tileentities/TileEntityRift.java | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java index c95975c..9c7f297 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/blocks/PersonalDimDoor.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim.blocks; +import StevenDimDoors.mod_pocketDim.world.PersonalPocketProvider; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraft.world.World; @@ -28,7 +29,10 @@ public class PersonalDimDoor extends BaseDimDoor DimLink link = dimension.getLink(x, y, z); if (link == null) { - dimension.createLink(x, y, z, LinkType.PERSONAL, world.getBlockMetadata(x, y - 1, z)); + if (world.provider instanceof PersonalPocketProvider) + dimension.createLink(x, y, z, LinkType.LIMBO, world.getBlockMetadata(x, y-1, z)); + else + dimension.createLink(x, y, z, LinkType.PERSONAL, world.getBlockMetadata(x, y - 1, z)); } } } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index e651fc2..84a5f1b 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -3,6 +3,7 @@ package StevenDimDoors.mod_pocketDim.core; import java.util.ArrayList; import java.util.Random; +import StevenDimDoors.mod_pocketDim.world.LimboProvider; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.gameevent.PlayerEvent; import net.minecraft.block.Block; @@ -499,13 +500,22 @@ public class DDTeleporter case POCKET: return PocketBuilder.generateNewPocket(link, properties, door, DimensionType.POCKET); case PERSONAL: - return setupPersonalLink(link, properties, (EntityPlayer)entity, door); + return setupPersonalLink(link, properties, entity, door); case SAFE_EXIT: return generateSafeExit(link, properties); case DUNGEON_EXIT: return generateDungeonExit(link, properties); case UNSAFE_EXIT: return generateUnsafeExit(link); + case LIMBO: + if(!(entity instanceof EntityPlayer)) + { + return false; + } + + Point4D dest = LimboProvider.getLimboSkySpawn((EntityPlayer)entity, DDProperties.instance()); + link.tail.setDestination(dest); + return true; case NORMAL: case REVERSE: case RANDOM: @@ -515,13 +525,14 @@ public class DDTeleporter } } - private static boolean setupPersonalLink(DimLink link, DDProperties properties,EntityPlayer player, Block door) + private static boolean setupPersonalLink(DimLink link, DDProperties properties,Entity entity, Block door) { - if(!(player instanceof EntityPlayer)) + if(!(entity instanceof EntityPlayer)) { return false; } - + + EntityPlayer player = (EntityPlayer)entity; NewDimData dim = PocketManager.getPersonalDimensionForPlayer(player.getGameProfile().getId().toString()); if(dim == null) { @@ -533,8 +544,7 @@ public class DDTeleporter { PocketManager.getDimensionData(link.source().getDimension()).setLinkDestination(personalHomeLink, link.source().getX(), link.source().getY(), link.source().getZ()); } - - dim.setLinkDestination(link, dim.origin.getX(), dim.origin.getY(), dim.origin.getZ()); + return true; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/LinkType.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/LinkType.java index 2f0311f..ba9567e 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/LinkType.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/LinkType.java @@ -14,6 +14,7 @@ public enum LinkType UNSAFE_EXIT(6), REVERSE(7), PERSONAL(8), + LIMBO(9), CLIENT(-1337); LinkType(int index) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java index f3df3eb..ec76b8c 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/NewDimData.java @@ -428,7 +428,8 @@ public abstract class NewDimData implements IPackable } // Raise deletion event - linkWatcher.onDeleted(new ClientLinkData(link)); + if (linkWatcher != null) + linkWatcher.onDeleted(new ClientLinkData(link)); target.clear(); modified = true; } diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java index bd0231b..c6d38df 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/tileentities/TileEntityRift.java @@ -164,7 +164,7 @@ public class TileEntityRift extends DDTileEntityBase if (growth <= 0 && !worldObj.isRemote) { DimLink link = PocketManager.getLink(this.xCoord, this.yCoord, this.zCoord, worldObj); - if (link != null) + if (link != null && !worldObj.isRemote) { dimension.deleteLink(link); } -- 2.39.5 From d01bbb488efd08a31e942cd43e22b230d5ccd21f Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 17 Mar 2015 10:40:03 -0500 Subject: [PATCH 55/58] Don't crash in SMP when using key --- src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java index bcee2eb..3c6a667 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/items/ItemDDKey.java @@ -82,7 +82,7 @@ public class ItemDDKey extends Item return false; } - if (player.getItemInUse() != null) + if (player.inventory.getCurrentItem() != null) { return true; } -- 2.39.5 From 91f96c825c22598167cd288a6a76eb8957cc4bcb Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Tue, 17 Mar 2015 11:25:11 -0500 Subject: [PATCH 56/58] Don't try to check a dim type before we have dim data. Relight dimension when we get it. --- .../mod_pocketDim/network/ClientJoinPacket.java | 4 ++++ .../StevenDimDoors/mod_pocketDim/world/PocketProvider.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java b/src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java index 9cbd969..98e790f 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/network/ClientJoinPacket.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim.network; +import StevenDimDoors.mod_pocketDim.core.NewDimData; import StevenDimDoors.mod_pocketDim.core.PocketManager; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataOutput; @@ -30,7 +31,10 @@ public class ClientJoinPacket extends DimDoorsPacket { @Override public void handleClient(World world, EntityPlayer player) { + NewDimData dimensionData = PocketManager.getDimensionData(player.worldObj); + if (dimensionData.isPocketDimension()) + player.worldObj.provider.registerWorld(player.worldObj); } @Override diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java index 7caaa26..bebaac7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/world/PocketProvider.java @@ -89,7 +89,7 @@ public class PocketProvider extends WorldProvider @Override protected void generateLightBrightnessTable() { - if(PocketManager.getDimensionData(this.dimensionId).type() == DimensionType.POCKET) + if(!PocketManager.isLoaded() || PocketManager.getDimensionData(this.dimensionId).type() == DimensionType.POCKET) { super.generateLightBrightnessTable(); return; -- 2.39.5 From d91ad394cbca44cb5c9d887cd16049ad602108fa Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Thu, 19 Mar 2015 19:51:54 -0500 Subject: [PATCH 57/58] Make personal links always send players to their own personal dimension. --- .../mod_pocketDim/core/DDTeleporter.java | 1403 +++++++++-------- 1 file changed, 702 insertions(+), 701 deletions(-) diff --git a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java index 84a5f1b..398c9c7 100644 --- a/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java +++ b/src/main/java/StevenDimDoors/mod_pocketDim/core/DDTeleporter.java @@ -39,474 +39,474 @@ import cpw.mods.fml.common.registry.GameRegistry; public class DDTeleporter { - private static final Random random = new Random(); - private static final int NETHER_DIMENSION_ID = -1; - private static final int OVERWORLD_DIMENSION_ID = 0; - private static final int END_DIMENSION_ID = 1; - private static final int MAX_NETHER_EXIT_CHANCE = 100; - private static final int NETHER_EXIT_CHANCE = 20; //20% chance to compensate for frequent exit failures - the Nether often doesn't have enough space for an exit - private static final int MAX_OVERWORLD_EXIT_CHANCE = 100; - private static final int OVERWORLD_EXIT_CHANCE = 15; - private static final int MAX_ROOT_SHIFT_CHANCE = 100; - private static final int START_ROOT_SHIFT_CHANCE = 0; - private static final int ROOT_SHIFT_CHANCE_PER_LEVEL = 5; - private static final String SPIRIT_WORLD_NAME = "Spirit World"; - - public static int cooldown = 0; - - private DDTeleporter() { } - - /** - * Checks if the destination supplied is safe (i.e. filled by any replaceable or non-opaque blocks) - */ - private static boolean checkDestination(WorldServer world, Point4D destination, int orientation) - { - int x = destination.getX(); - int y = destination.getY(); - int z = destination.getZ(); - Block blockTop; + private static final Random random = new Random(); + private static final int NETHER_DIMENSION_ID = -1; + private static final int OVERWORLD_DIMENSION_ID = 0; + private static final int END_DIMENSION_ID = 1; + private static final int MAX_NETHER_EXIT_CHANCE = 100; + private static final int NETHER_EXIT_CHANCE = 20; //20% chance to compensate for frequent exit failures - the Nether often doesn't have enough space for an exit + private static final int MAX_OVERWORLD_EXIT_CHANCE = 100; + private static final int OVERWORLD_EXIT_CHANCE = 15; + private static final int MAX_ROOT_SHIFT_CHANCE = 100; + private static final int START_ROOT_SHIFT_CHANCE = 0; + private static final int ROOT_SHIFT_CHANCE_PER_LEVEL = 5; + private static final String SPIRIT_WORLD_NAME = "Spirit World"; + + public static int cooldown = 0; + + private DDTeleporter() { } + + /** + * Checks if the destination supplied is safe (i.e. filled by any replaceable or non-opaque blocks) + */ + private static boolean checkDestination(WorldServer world, Point4D destination, int orientation) + { + int x = destination.getX(); + int y = destination.getY(); + int z = destination.getZ(); + Block blockTop; Block blockBottom; - Point3D point; - - switch (orientation) - { - case 0: - point = new Point3D(x - 1, y - 1, z); - break; - case 1: - point = new Point3D(x, y - 1, z - 1); - break; - case 2: - point = new Point3D(x + 1, y - 1, z); - break; - case 3: - point = new Point3D(x, y - 1, z + 1); - break; - default: - point = new Point3D(x, y - 1, z); - break; - } - blockBottom = world.getBlock(point.getX(), point.getY(), point.getZ()); - blockTop = world.getBlock(point.getX(), point.getY() + 1, point.getZ()); - - if (blockBottom != null) - { - if (!blockBottom.isReplaceable(world, point.getX(), point.getY(), point.getZ()) && world.isBlockNormalCubeDefault(point.getX(), point.getY(), point.getZ(), false)) - { - return false; - } - } - if (blockTop != null) - { - if (!blockTop.isReplaceable(world, point.getX(), point.getY() + 1, point.getZ())) - { - return false; - } - } - return true; - } - - private static void placeInPortal(Entity entity, WorldServer world, Point4D destination, DDProperties properties, boolean checkOrientation) - { - int x = destination.getX(); - int y = destination.getY(); - int z = destination.getZ(); + Point3D point; - int orientation; - if (checkOrientation) - { - orientation = getDestinationOrientation(destination, properties); - entity.rotationYaw = (orientation * 90) + 90; - } - else - { - // Teleport the entity to the precise destination point - orientation = -1; - } - - if (entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) entity; - if (checkDestination(world, destination, orientation)) - { - switch (orientation) - { - case 0: - player.setPositionAndUpdate(x - 0.5, y - 1, z + 0.5); - break; - case 1: - player.setPositionAndUpdate(x + 0.5, y - 1, z - 0.5); - break; - case 2: - player.setPositionAndUpdate(x + 1.5, y - 1, z + 0.5); - break; - case 3: - player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5); - break; - default: - player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); - break; - } - } - else - { - player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); - } - } - else if (entity instanceof EntityMinecart) - { - entity.motionX = 0; - entity.motionZ = 0; - entity.motionY = 0; - switch (orientation) - { - case 0: - DDTeleporter.setEntityPosition(entity, x - 0.5, y, z + 0.5); - entity.motionX = -0.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - break; - case 1: - DDTeleporter.setEntityPosition(entity, x + 0.5, y, z - 0.5); - entity.motionZ = -0.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - break; - case 2: - DDTeleporter.setEntityPosition(entity, x + 1.5, y, z + 0.5); - entity.motionX = 0.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - break; - case 3: - DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 1.5); - entity.motionZ = 0.39; - entity.worldObj.updateEntityWithOptionalForce(entity, false); - break; - default: - DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 0.5); - entity.worldObj.updateEntityWithOptionalForce(entity, false); - break; - } - } - else - { - switch (orientation) - { - case 0: - setEntityPosition(entity, x - 0.5, y, z + 0.5); - break; - case 1: - setEntityPosition(entity, x + 0.5, y, z - 0.5); - break; - case 2: - setEntityPosition(entity, x + 1.5, y, z + 0.5); - break; - case 3: - setEntityPosition(entity, x + 0.5, y, z + 1.5); - break; - default: - setEntityPosition(entity, x + 0.5, y, z + 0.5); - break; - } - } - } + switch (orientation) + { + case 0: + point = new Point3D(x - 1, y - 1, z); + break; + case 1: + point = new Point3D(x, y - 1, z - 1); + break; + case 2: + point = new Point3D(x + 1, y - 1, z); + break; + case 3: + point = new Point3D(x, y - 1, z + 1); + break; + default: + point = new Point3D(x, y - 1, z); + break; + } + blockBottom = world.getBlock(point.getX(), point.getY(), point.getZ()); + blockTop = world.getBlock(point.getX(), point.getY() + 1, point.getZ()); - private static void setEntityPosition(Entity entity, double x, double y, double z) - { - entity.lastTickPosX = entity.prevPosX = entity.posX = x; - entity.lastTickPosY = entity.prevPosY = entity.posY = y + entity.yOffset; - entity.lastTickPosZ = entity.prevPosZ = entity.posZ = z; - entity.setPosition(x, y, z); - } - - private static int getDestinationOrientation(Point4D door, DDProperties properties) - { - World world = DimensionManager.getWorld(door.getDimension()); - if (world == null) - { - throw new IllegalStateException("The destination world should be loaded!"); - } - - //Check if the block below that point is actually a door - Block block = world.getBlock(door.getX(), door.getY() - 1, door.getZ()); - if (block==null || !(block instanceof IDimDoor)) - { - //Return the pocket's orientation instead - return PocketManager.createDimensionData(world).orientation(); - } - - - //Return the orientation portion of its metadata - return world.getBlockMetadata(door.getX(), door.getY() - 1, door.getZ()) & 3; - } - - public static Entity teleportEntity(Entity entity, Point4D destination, boolean checkOrientation) - { - if (entity == null) - { - throw new IllegalArgumentException("entity cannot be null."); - } - if (destination == null) - { - throw new IllegalArgumentException("destination cannot be null."); - } - //This beautiful teleport method is based off of xCompWiz's teleport function. + if (blockBottom != null) + { + if (!blockBottom.isReplaceable(world, point.getX(), point.getY(), point.getZ()) && world.isBlockNormalCubeDefault(point.getX(), point.getY(), point.getZ(), false)) + { + return false; + } + } + if (blockTop != null) + { + if (!blockTop.isReplaceable(world, point.getX(), point.getY() + 1, point.getZ())) + { + return false; + } + } + return true; + } - WorldServer oldWorld = (WorldServer) entity.worldObj; - WorldServer newWorld; - EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP) entity : null; - DDProperties properties = DDProperties.instance(); + private static void placeInPortal(Entity entity, WorldServer world, Point4D destination, DDProperties properties, boolean checkOrientation) + { + int x = destination.getX(); + int y = destination.getY(); + int z = destination.getZ(); - // Is something riding? Handle it first. - if (entity.riddenByEntity != null) - { - return teleportEntity(entity.riddenByEntity, destination, checkOrientation); - } + int orientation; + if (checkOrientation) + { + orientation = getDestinationOrientation(destination, properties); + entity.rotationYaw = (orientation * 90) + 90; + } + else + { + // Teleport the entity to the precise destination point + orientation = -1; + } - // Are we riding something? Dismount and tell the mount to go first. - Entity cart = entity.ridingEntity; - if (cart != null) - { - entity.mountEntity(null); - cart = teleportEntity(cart, destination, checkOrientation); - // We keep track of both so we can remount them on the other side. - } + if (entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) entity; + if (checkDestination(world, destination, orientation)) + { + switch (orientation) + { + case 0: + player.setPositionAndUpdate(x - 0.5, y - 1, z + 0.5); + break; + case 1: + player.setPositionAndUpdate(x + 0.5, y - 1, z - 0.5); + break; + case 2: + player.setPositionAndUpdate(x + 1.5, y - 1, z + 0.5); + break; + case 3: + player.setPositionAndUpdate(x + 0.5, y - 1, z + 1.5); + break; + default: + player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); + break; + } + } + else + { + player.setPositionAndUpdate(x + 0.5, y - 1, z + 0.5); + } + } + else if (entity instanceof EntityMinecart) + { + entity.motionX = 0; + entity.motionZ = 0; + entity.motionY = 0; + switch (orientation) + { + case 0: + DDTeleporter.setEntityPosition(entity, x - 0.5, y, z + 0.5); + entity.motionX = -0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + case 1: + DDTeleporter.setEntityPosition(entity, x + 0.5, y, z - 0.5); + entity.motionZ = -0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + case 2: + DDTeleporter.setEntityPosition(entity, x + 1.5, y, z + 0.5); + entity.motionX = 0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + case 3: + DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 1.5); + entity.motionZ = 0.39; + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + default: + DDTeleporter.setEntityPosition(entity, x + 0.5, y, z + 0.5); + entity.worldObj.updateEntityWithOptionalForce(entity, false); + break; + } + } + else + { + switch (orientation) + { + case 0: + setEntityPosition(entity, x - 0.5, y, z + 0.5); + break; + case 1: + setEntityPosition(entity, x + 0.5, y, z - 0.5); + break; + case 2: + setEntityPosition(entity, x + 1.5, y, z + 0.5); + break; + case 3: + setEntityPosition(entity, x + 0.5, y, z + 1.5); + break; + default: + setEntityPosition(entity, x + 0.5, y, z + 0.5); + break; + } + } + } - // Determine if our destination is in another realm. - boolean difDest = entity.dimension != destination.getDimension(); - if (difDest) - { - // Destination isn't loaded? Then we need to load it. - newWorld = PocketManager.loadDimension(destination.getDimension()); - } - else - { - newWorld = oldWorld; - } - + private static void setEntityPosition(Entity entity, double x, double y, double z) + { + entity.lastTickPosX = entity.prevPosX = entity.posX = x; + entity.lastTickPosY = entity.prevPosY = entity.posY = y + entity.yOffset; + entity.lastTickPosZ = entity.prevPosZ = entity.posZ = z; + entity.setPosition(x, y, z); + } - // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. - // TODO Check to see if this is actually vital. - DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); + private static int getDestinationOrientation(Point4D door, DDProperties properties) + { + World world = DimensionManager.getWorld(door.getDimension()); + if (world == null) + { + throw new IllegalStateException("The destination world should be loaded!"); + } - if (difDest) // Are we moving our target to a new dimension? - { - if(player != null) // Are we working with a player? - { - // We need to do all this special stuff to move a player between dimensions. - //Give the client the dimensionData for the destination - - // FIXME: This violates the way we assume PocketManager works. DimWatcher should not be exposed - // to prevent us from doing bad things. Moreover, no dimension is being created, so if we ever - // tie code to that, it could cause confusing bugs. - // No hacky for you! ~SenseiKiwi - PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.createDimensionData(newWorld))); - - // Set the new dimension and inform the client that it's moving to a new world. - player.dimension = destination.getDimension(); + //Check if the block below that point is actually a door + Block block = world.getBlock(door.getX(), door.getY() - 1, door.getZ()); + if (block==null || !(block instanceof IDimDoor)) + { + //Return the pocket's orientation instead + return PocketManager.createDimensionData(world).orientation(); + } + + + //Return the orientation portion of its metadata + return world.getBlockMetadata(door.getX(), door.getY() - 1, door.getZ()) & 3; + } + + public static Entity teleportEntity(Entity entity, Point4D destination, boolean checkOrientation) + { + if (entity == null) + { + throw new IllegalArgumentException("entity cannot be null."); + } + if (destination == null) + { + throw new IllegalArgumentException("destination cannot be null."); + } + //This beautiful teleport method is based off of xCompWiz's teleport function. + + WorldServer oldWorld = (WorldServer) entity.worldObj; + WorldServer newWorld; + EntityPlayerMP player = (entity instanceof EntityPlayerMP) ? (EntityPlayerMP) entity : null; + DDProperties properties = DDProperties.instance(); + + // Is something riding? Handle it first. + if (entity.riddenByEntity != null) + { + return teleportEntity(entity.riddenByEntity, destination, checkOrientation); + } + + // Are we riding something? Dismount and tell the mount to go first. + Entity cart = entity.ridingEntity; + if (cart != null) + { + entity.mountEntity(null); + cart = teleportEntity(cart, destination, checkOrientation); + // We keep track of both so we can remount them on the other side. + } + + // Determine if our destination is in another realm. + boolean difDest = entity.dimension != destination.getDimension(); + if (difDest) + { + // Destination isn't loaded? Then we need to load it. + newWorld = PocketManager.loadDimension(destination.getDimension()); + } + else + { + newWorld = oldWorld; + } + + + // GreyMaria: What is this even accomplishing? We're doing the exact same thing at the end of this all. + // TODO Check to see if this is actually vital. + DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); + + if (difDest) // Are we moving our target to a new dimension? + { + if(player != null) // Are we working with a player? + { + // We need to do all this special stuff to move a player between dimensions. + //Give the client the dimensionData for the destination + + // FIXME: This violates the way we assume PocketManager works. DimWatcher should not be exposed + // to prevent us from doing bad things. Moreover, no dimension is being created, so if we ever + // tie code to that, it could cause confusing bugs. + // No hacky for you! ~SenseiKiwi + PocketManager.getDimwatcher().onCreated(new ClientDimData(PocketManager.createDimensionData(newWorld))); + + // Set the new dimension and inform the client that it's moving to a new world. + player.dimension = destination.getDimension(); player.playerNetServerHandler.sendPacket(new S07PacketRespawn(player.dimension, player.worldObj.difficultySetting, newWorld.getWorldInfo().getTerrainType(), player.theItemInWorldManager.getGameType())); - // GreyMaria: Used the safe player entity remover before. - // This should fix an apparently unreported bug where - // the last non-sleeping player leaves the Overworld - // for a pocket dimension, causing all sleeping players - // to remain asleep instead of progressing to day. - ((WorldServer)entity.worldObj).getPlayerManager().removePlayer(player); - oldWorld.removePlayerEntityDangerously(player); - player.isDead = false; + // GreyMaria: Used the safe player entity remover before. + // This should fix an apparently unreported bug where + // the last non-sleeping player leaves the Overworld + // for a pocket dimension, causing all sleeping players + // to remain asleep instead of progressing to day. + ((WorldServer)entity.worldObj).getPlayerManager().removePlayer(player); + oldWorld.removePlayerEntityDangerously(player); + player.isDead = false; - // Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist. - oldWorld.getPlayerManager().removePlayer(player); - newWorld.getPlayerManager().addPlayer(player); + // Creates sanity by ensuring that we're only known to exist where we're supposed to be known to exist. + oldWorld.getPlayerManager().removePlayer(player); + newWorld.getPlayerManager().addPlayer(player); - player.theItemInWorldManager.setWorld(newWorld); + player.theItemInWorldManager.setWorld(newWorld); - // Synchronize with the server so the client knows what time it is and what it's holding. - player.mcServer.getConfigurationManager().updateTimeAndWeatherForPlayer(player, newWorld); - player.mcServer.getConfigurationManager().syncPlayerInventory(player); - for(Object potionEffect : player.getActivePotionEffects()) - { - PotionEffect effect = (PotionEffect)potionEffect; - player.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(player.getEntityId(), effect)); - } + // Synchronize with the server so the client knows what time it is and what it's holding. + player.mcServer.getConfigurationManager().updateTimeAndWeatherForPlayer(player, newWorld); + player.mcServer.getConfigurationManager().syncPlayerInventory(player); + for(Object potionEffect : player.getActivePotionEffects()) + { + PotionEffect effect = (PotionEffect)potionEffect; + player.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(player.getEntityId(), effect)); + } - player.playerNetServerHandler.sendPacket(new S1FPacketSetExperience(player.experience, player.experienceTotal, player.experienceLevel)); - } + player.playerNetServerHandler.sendPacket(new S1FPacketSetExperience(player.experience, player.experienceTotal, player.experienceLevel)); + } - // Creates sanity by removing the entity from its old location's chunk entity list, if applicable. - int entX = entity.chunkCoordX; - int entZ = entity.chunkCoordZ; - if ((entity.addedToChunk) && (oldWorld.getChunkProvider().chunkExists(entX, entZ))) - { - oldWorld.getChunkFromChunkCoords(entX, entZ).removeEntity(entity); - oldWorld.getChunkFromChunkCoords(entX, entZ).isModified = true; - } - // Memory concerns. - oldWorld.onEntityRemoved(entity); + // Creates sanity by removing the entity from its old location's chunk entity list, if applicable. + int entX = entity.chunkCoordX; + int entZ = entity.chunkCoordZ; + if ((entity.addedToChunk) && (oldWorld.getChunkProvider().chunkExists(entX, entZ))) + { + oldWorld.getChunkFromChunkCoords(entX, entZ).removeEntity(entity); + oldWorld.getChunkFromChunkCoords(entX, entZ).isModified = true; + } + // Memory concerns. + oldWorld.onEntityRemoved(entity); - if (player == null) // Are we NOT working with a player? - { - NBTTagCompound entityNBT = new NBTTagCompound(); - entity.isDead = false; - entity.writeMountToNBT(entityNBT); - if(entityNBT.hasNoTags()) - { - return entity; - } - entity.isDead = true; - entity = EntityList.createEntityFromNBT(entityNBT, newWorld); + if (player == null) // Are we NOT working with a player? + { + NBTTagCompound entityNBT = new NBTTagCompound(); + entity.isDead = false; + entity.writeMountToNBT(entityNBT); + if(entityNBT.hasNoTags()) + { + return entity; + } + entity.isDead = true; + entity = EntityList.createEntityFromNBT(entityNBT, newWorld); - if (entity == null) - { - // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. + if (entity == null) + { + // TODO FIXME IMPLEMENT NULL CHECKS THAT ACTUALLY DO SOMETHING. /* * shit ourselves in an organized fashion, preferably * in a neat pile instead of all over our users' games */ - } + } - } + } - // Finally, respawn the entity in its new home. - newWorld.spawnEntityInWorld(entity); - entity.setWorld(newWorld); - } - entity.worldObj.updateEntityWithOptionalForce(entity, false); + // Finally, respawn the entity in its new home. + newWorld.spawnEntityInWorld(entity); + entity.setWorld(newWorld); + } + entity.worldObj.updateEntityWithOptionalForce(entity, false); - // Hey, remember me? It's time to remount. - if (cart != null) - { - // Was there a player teleported? If there was, it's important that we update shit. - if (player != null) - { - entity.worldObj.updateEntityWithOptionalForce(entity, true); - } - entity.mountEntity(cart); - } + // Hey, remember me? It's time to remount. + if (cart != null) + { + // Was there a player teleported? If there was, it's important that we update shit. + if (player != null) + { + entity.worldObj.updateEntityWithOptionalForce(entity, true); + } + entity.mountEntity(cart); + } - // Did we teleport a player? Load the chunk for them. - if (player != null) - { - newWorld.getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); - // Tell Forge we're moving its players so everyone else knows. - // Let's try doing this down here in case this is what's killing NEI. + // Did we teleport a player? Load the chunk for them. + if (player != null) + { + newWorld.getChunkProvider().loadChunk(MathHelper.floor_double(entity.posX) >> 4, MathHelper.floor_double(entity.posZ) >> 4); + // Tell Forge we're moving its players so everyone else knows. + // Let's try doing this down here in case this is what's killing NEI. FMLCommonHandler.instance().firePlayerChangedDimensionEvent((EntityPlayer) entity, oldWorld.provider.dimensionId, newWorld.provider.dimensionId); - } - DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); - return entity; - } + } + DDTeleporter.placeInPortal(entity, newWorld, destination, properties, checkOrientation); + return entity; + } - /** - * Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already. - * Also ensures correct orientation relative to the door. - * @param world - world the player is currently in - * @param link - the link the player is using to teleport; sends the player to its destination - * @param entity - the instance of the player to be teleported - */ - public static void traverseDimDoor(World world, DimLink link, Entity entity, Block door) - { - if (world == null) - { - throw new IllegalArgumentException("world cannot be null."); - } - if (link == null) - { - throw new IllegalArgumentException("link cannot be null."); - } - if (entity == null) - { - throw new IllegalArgumentException("entity cannot be null."); - } - if (world.isRemote) - { - return; - } - - if (cooldown == 0 || entity instanceof EntityPlayer) - { - // According to Steven, we increase the cooldown by a random amount so that if someone - // makes a loop with doors and throws items in them, the slamming sounds won't all - // sync up and be very loud. The cooldown itself prevents server-crashing madness. - cooldown = 2 + random.nextInt(2); - } - else - { - return; - } + /** + * Primary function used to teleport the player using doors. Performs numerous null checks, and also generates the destination door/pocket if it has not done so already. + * Also ensures correct orientation relative to the door. + * @param world - world the player is currently in + * @param link - the link the player is using to teleport; sends the player to its destination + * @param entity - the instance of the player to be teleported + */ + public static void traverseDimDoor(World world, DimLink link, Entity entity, Block door) + { + if (world == null) + { + throw new IllegalArgumentException("world cannot be null."); + } + if (link == null) + { + throw new IllegalArgumentException("link cannot be null."); + } + if (entity == null) + { + throw new IllegalArgumentException("entity cannot be null."); + } + if (world.isRemote) + { + return; + } - if (!initializeDestination(link, DDProperties.instance(),entity,door)) - { - return; - } - if (link.linkType() == LinkType.RANDOM) - { - Point4D randomDestination = getRandomDestination(); - if (randomDestination != null) - { - entity = teleportEntity(entity, randomDestination, true); - entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); - } - } - else - { - buildExitDoor(door, link, DDProperties.instance()); - entity = teleportEntity(entity, link.destination(), link.linkType() != LinkType.UNSAFE_EXIT); - entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); - } - } + if (cooldown == 0 || entity instanceof EntityPlayer) + { + // According to Steven, we increase the cooldown by a random amount so that if someone + // makes a loop with doors and throws items in them, the slamming sounds won't all + // sync up and be very loud. The cooldown itself prevents server-crashing madness. + cooldown = 2 + random.nextInt(2); + } + else + { + return; + } - private static boolean initializeDestination(DimLink link, DDProperties properties, Entity entity, Block door) - { - if (link.hasDestination()&&link.linkType()!=LinkType.PERSONAL) - { - if (PocketManager.isBlackListed(link.destination().getDimension())) - { + if (!initializeDestination(link, DDProperties.instance(),entity,door)) + { + return; + } + if (link.linkType() == LinkType.RANDOM) + { + Point4D randomDestination = getRandomDestination(); + if (randomDestination != null) + { + entity = teleportEntity(entity, randomDestination, true); + entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); + } + } + else + { + buildExitDoor(door, link, DDProperties.instance()); + entity = teleportEntity(entity, link.destination(), link.linkType() != LinkType.UNSAFE_EXIT); + entity.worldObj.playSoundEffect(entity.posX, entity.posY, entity.posZ, "mob.endermen.portal", 1.0F, 1.0F); + } + } - // This link leads to a dimension that has been blacklisted. - // That means that it was a pocket and it was deleted. - // Depending on the link type, we must overwrite it or cancel - // the teleport operation. We don't need to assign 'link' with - // a different value. NewDimData will overwrite it in-place. - NewDimData start = PocketManager.getDimensionData(link.source().getDimension()); - if (link.linkType() == LinkType.DUNGEON) - { - // Ovewrite the link into a dungeon link with no destination - start.createLink(link.source(), LinkType.DUNGEON, link.orientation(), null); - } - else - { - if (start.isPocketDimension()) - { - // Ovewrite the link into a safe exit link, because - // this could be the only way out from a pocket. - start.createLink(link.source(), LinkType.SAFE_EXIT, link.orientation(), null); - } - else - { - // Cancel the teleport attempt - return false; - } - } - } - else - { - return true; - } - } + private static boolean initializeDestination(DimLink link, DDProperties properties, Entity entity, Block door) + { + if (link.hasDestination()&&link.linkType()!=LinkType.PERSONAL) + { + if (PocketManager.isBlackListed(link.destination().getDimension())) + { - // Check the destination type and respond accordingly - switch (link.linkType()) - { - case DUNGEON: - return PocketBuilder.generateNewDungeonPocket(link, properties); - case POCKET: - return PocketBuilder.generateNewPocket(link, properties, door, DimensionType.POCKET); - case PERSONAL: - return setupPersonalLink(link, properties, entity, door); - case SAFE_EXIT: - return generateSafeExit(link, properties); - case DUNGEON_EXIT: - return generateDungeonExit(link, properties); - case UNSAFE_EXIT: - return generateUnsafeExit(link); + // This link leads to a dimension that has been blacklisted. + // That means that it was a pocket and it was deleted. + // Depending on the link type, we must overwrite it or cancel + // the teleport operation. We don't need to assign 'link' with + // a different value. NewDimData will overwrite it in-place. + NewDimData start = PocketManager.getDimensionData(link.source().getDimension()); + if (link.linkType() == LinkType.DUNGEON) + { + // Ovewrite the link into a dungeon link with no destination + start.createLink(link.source(), LinkType.DUNGEON, link.orientation(), null); + } + else + { + if (start.isPocketDimension()) + { + // Ovewrite the link into a safe exit link, because + // this could be the only way out from a pocket. + start.createLink(link.source(), LinkType.SAFE_EXIT, link.orientation(), null); + } + else + { + // Cancel the teleport attempt + return false; + } + } + } + else + { + return true; + } + } + + // Check the destination type and respond accordingly + switch (link.linkType()) + { + case DUNGEON: + return PocketBuilder.generateNewDungeonPocket(link, properties); + case POCKET: + return PocketBuilder.generateNewPocket(link, properties, door, DimensionType.POCKET); + case PERSONAL: + return setupPersonalLink(link, properties, entity, door); + case SAFE_EXIT: + return generateSafeExit(link, properties); + case DUNGEON_EXIT: + return generateDungeonExit(link, properties); + case UNSAFE_EXIT: + return generateUnsafeExit(link); case LIMBO: if(!(entity instanceof EntityPlayer)) { @@ -516,280 +516,281 @@ public class DDTeleporter Point4D dest = LimboProvider.getLimboSkySpawn((EntityPlayer)entity, DDProperties.instance()); link.tail.setDestination(dest); return true; - case NORMAL: - case REVERSE: - case RANDOM: - return true; - default: - throw new IllegalArgumentException("link has an unrecognized link type."); - } - } - - private static boolean setupPersonalLink(DimLink link, DDProperties properties,Entity entity, Block door) - { - if(!(entity instanceof EntityPlayer)) - { - return false; - } + case NORMAL: + case REVERSE: + case RANDOM: + return true; + default: + throw new IllegalArgumentException("link has an unrecognized link type."); + } + } + + private static boolean setupPersonalLink(DimLink link, DDProperties properties,Entity entity, Block door) + { + if(!(entity instanceof EntityPlayer)) + { + return false; + } EntityPlayer player = (EntityPlayer)entity; - NewDimData dim = PocketManager.getPersonalDimensionForPlayer(player.getGameProfile().getId().toString()); - if(dim == null) - { - return PocketBuilder.generateNewPersonalPocket(link, properties, player, door); - } - - DimLink personalHomeLink = dim.getLink(dim.origin()); - if(personalHomeLink!=null) - { - PocketManager.getDimensionData(link.source().getDimension()).setLinkDestination(personalHomeLink, link.source().getX(), link.source().getY(), link.source().getZ()); - } + NewDimData dim = PocketManager.getPersonalDimensionForPlayer(player.getGameProfile().getId().toString()); + if(dim == null) + { + return PocketBuilder.generateNewPersonalPocket(link, properties, player, door); + } - return true; - } + DimLink personalHomeLink = dim.getLink(dim.origin()); + if(personalHomeLink!=null) + { + link.tail.setDestination(personalHomeLink.source()); + PocketManager.getDimensionData(link.source().getDimension()).setLinkDestination(personalHomeLink, link.source().getX(), link.source().getY(), link.source().getZ()); + } - private static Point4D getRandomDestination() - { - // Our aim is to return a random link's source point - // so that a link of type RANDOM can teleport a player there. - - // Restrictions: - // 1. Ignore links with their source inside a pocket dimension. - // 2. Ignore links with link type RANDOM. - - // Iterate over the root dimensions. Pocket dimensions cannot be roots. - // Don't just pick a random root and a random link within that root - // because we want to have unbiased selection among all links. - ArrayList matches = new ArrayList(); - for (NewDimData dimension : PocketManager.getRootDimensions()) - { - for (DimLink link : dimension.getAllLinks()) - { - if (link.linkType() != LinkType.RANDOM) - { - matches.add(link.source()); - } - } - } - - // Pick a random point, if any is available - if (!matches.isEmpty()) - { - return matches.get( random.nextInt(matches.size()) ); - } - return null; - } - - private static boolean generateUnsafeExit(DimLink link) - { - // An unsafe exit teleports the user to the first available air space - // in the pocket's root dimension. X and Z are kept roughly the same - // as the source location, but Y is set by searching down. We don't - // place a platform at the destination. We also don't place a reverse - // link at the destination, so it's a one-way trip. Good luck! - - // To avoid loops, don't generate a destination if the player is - // already in a non-pocket dimension. - - NewDimData current = PocketManager.getDimensionData(link.point.getDimension()); + return true; + } - if (current.isPocketDimension()) - { - Point4D source = link.source(); - World world = PocketManager.loadDimension(current.root().id()); - if (world == null) - { - return false; - } - - Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY() + 1, source.getZ()); - if (destination != null) - { - current.root().setLinkDestination(link, destination.getX(), destination.getY(), destination.getZ()); - return true; - } - } - return false; - } + private static Point4D getRandomDestination() + { + // Our aim is to return a random link's source point + // so that a link of type RANDOM can teleport a player there. - private static void buildExitDoor(Block door,DimLink link, DDProperties prop) - { - World startWorld = PocketManager.loadDimension(link.source().getDimension()); - World destWorld = PocketManager.loadDimension(link.destination().getDimension()); - TileEntity doorTE = startWorld.getTileEntity(link.source().getX(), link.source().getY(), link.point.getZ()); - if(doorTE instanceof TileEntityDimDoor) - { - if((TileEntityDimDoor.class.cast(doorTE).hasGennedPair)) - { - return; - } - TileEntityDimDoor.class.cast(doorTE).hasGennedPair=true; - Block blockToReplace = destWorld.getBlock(link.destination().getX(), link.destination().getY(), link.destination().getZ()); - - if(!destWorld.isAirBlock(link.destination().getX(), link.destination().getY(), link.destination().getZ())) - { - if(!blockToReplace.isReplaceable(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ())) - { - return; - } - } - - ItemDoor.placeDoorBlock(destWorld, link.destination().getX(), link.destination().getY()-1, link.destination().getZ(),link.getDestinationOrientation(), door); + // Restrictions: + // 1. Ignore links with their source inside a pocket dimension. + // 2. Ignore links with link type RANDOM. - TileEntity doorDestTE = ((BaseDimDoor)door).initDoorTE(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ()); + // Iterate over the root dimensions. Pocket dimensions cannot be roots. + // Don't just pick a random root and a random link within that root + // because we want to have unbiased selection among all links. + ArrayList matches = new ArrayList(); + for (NewDimData dimension : PocketManager.getRootDimensions()) + { + for (DimLink link : dimension.getAllLinks()) + { + if (link.linkType() != LinkType.RANDOM) + { + matches.add(link.source()); + } + } + } - - if(doorDestTE instanceof TileEntityDimDoor) - { - TileEntityDimDoor.class.cast(doorDestTE).hasGennedPair=true; - - } - } - } - - private static boolean generateSafeExit(DimLink link, DDProperties properties) - { - NewDimData current = PocketManager.getDimensionData(link.point.getDimension()); - return generateSafeExit(current.root(), link, properties); - } - - private static boolean generateDungeonExit(DimLink link, DDProperties properties) - { - // A dungeon exit acts the same as a safe exit, but has the chance of - // taking the user to any non-pocket dimension, excluding Limbo and The End. - // There is a chance of choosing the Nether first before other root dimensions - // to compensate for servers with many Mystcraft ages or other worlds. - - NewDimData current = PocketManager.getDimensionData(link.point.getDimension()); + // Pick a random point, if any is available + if (!matches.isEmpty()) + { + return matches.get( random.nextInt(matches.size()) ); + } + return null; + } - ArrayList roots = PocketManager.getRootDimensions(); - int shiftChance = START_ROOT_SHIFT_CHANCE + ROOT_SHIFT_CHANCE_PER_LEVEL * (current.packDepth() - 1); + private static boolean generateUnsafeExit(DimLink link) + { + // An unsafe exit teleports the user to the first available air space + // in the pocket's root dimension. X and Z are kept roughly the same + // as the source location, but Y is set by searching down. We don't + // place a platform at the destination. We also don't place a reverse + // link at the destination, so it's a one-way trip. Good luck! - if (random.nextInt(MAX_ROOT_SHIFT_CHANCE) < shiftChance) - { - if (current.root().id() != OVERWORLD_DIMENSION_ID && random.nextInt(MAX_OVERWORLD_EXIT_CHANCE) < OVERWORLD_EXIT_CHANCE) - { - return generateSafeExit(PocketManager.createDimensionDataDangerously(OVERWORLD_DIMENSION_ID), link, properties); - } - if (current.root().id() != NETHER_DIMENSION_ID && random.nextInt(MAX_NETHER_EXIT_CHANCE) < NETHER_EXIT_CHANCE) - { - return generateSafeExit(PocketManager.createDimensionDataDangerously(NETHER_DIMENSION_ID), link, properties); - } - for (int attempts = 0; attempts < 10; attempts++) - { - NewDimData selection = roots.get( random.nextInt(roots.size()) ); - if (selection != current.root() && isValidForDungeonExit(selection, properties)) - { - return generateSafeExit(selection, link, properties); - } - } - } - - // Yes, this could lead you back into Limbo. That's intentional. - return generateSafeExit(current.root(), link, properties); - } - - private static boolean isValidForDungeonExit(NewDimData destination, DDProperties properties) - { - // Prevent exits to The End and Limbo - if (destination.id() == END_DIMENSION_ID || destination.id() == properties.LimboDimensionID) - { - return false; - } - // Prevent exits to Witchery's Spirit World; we need to load the dimension to retrieve its name. - // This is okay because the dimension would have to be loaded subsequently by generateSafeExit(). - World world = PocketManager.loadDimension(destination.id()); - return (world != null && !SPIRIT_WORLD_NAME.equals(world.provider.getDimensionName())); - } - - private static boolean generateSafeExit(NewDimData destinationDim, DimLink link, DDProperties properties) - { - // A safe exit attempts to place a Warp Door in a dimension with - // some precautions to protect the player. The X and Z coordinates - // are fixed to match the source (mostly - may be shifted a little), - // but the Y coordinate is chosen by searching for the nearest - // a safe location to place the door. - - Point4D source = link.source(); - World world = PocketManager.loadDimension(destinationDim.id()); - if (world == null) - { - return false; - } - - int startY = source.getY() - 2; - Point3D destination; - Point3D locationUp = yCoordHelper.findSafeCubeUp(world, source.getX(), startY, source.getZ()); - Point3D locationDown = yCoordHelper.findSafeCubeDown(world, source.getX(), startY, source.getZ()); - - if (locationUp == null) - { - destination = locationDown; - } - else if (locationDown == null) - { - destination = locationUp; - } - else if (locationUp.getY() - startY <= startY - locationDown.getY()) - { - destination = locationUp; - } - else - { - destination = locationDown; - } - if (destination != null) - { - // Set up a 3x3 platform at the destination - // Only place fabric of reality if the block is replaceable or air - // Don't cause block updates - int x = destination.getX(); - int y = destination.getY(); - int z = destination.getZ(); - for (int dx = -1; dx <= 1; dx++) - { - for (int dz = -1; dz <= 1; dz++) - { - // Checking if the block is not an opaque solid is equivalent - // checking for a replaceable block, because we only allow - // exits intersecting blocks on those two surfaces. - if (!world.isBlockNormalCubeDefault(x + dx, y, z + dz, false)) - { - world.setBlock(x + dx, y, z + dz, mod_pocketDim.blockDimWall, 0, 2); - } - } - } - - // Clear out any blocks in the space above the platform layer - // This removes any potential threats like replaceable Poison Ivy from BoP - // Remember to avoid block updates to keep gravel from collapsing - for (int dy = 1; dy <= 2; dy++) - { - for (int dx = -1; dx <= 1; dx++) - { - for (int dz = -1; dz <= 1; dz++) - { - world.setBlock(x + dx, y + dy, z + dz, Blocks.air, 0, 2); - } - } - } - - // Create a reverse link for returning - int orientation = getDestinationOrientation(source, properties); - NewDimData sourceDim = PocketManager.getDimensionData(link.source().getDimension()); - DimLink reverse = destinationDim.createLink(x, y + 2, z, LinkType.REVERSE,orientation); + // To avoid loops, don't generate a destination if the player is + // already in a non-pocket dimension. - sourceDim.setLinkDestination(reverse, source.getX(), source.getY(), source.getZ()); - - // Set up the warp door at the destination - orientation = BlockRotator.transformMetadata(orientation, 2, mod_pocketDim.warpDoor); - ItemDoor.placeDoorBlock(world, x, y + 1, z, orientation, mod_pocketDim.warpDoor); - - // Complete the link to the destination - // This comes last so the destination isn't set unless everything else works first - destinationDim.setLinkDestination(link, x, y + 2, z); - } - - return (destination != null); - } + NewDimData current = PocketManager.getDimensionData(link.point.getDimension()); + + if (current.isPocketDimension()) + { + Point4D source = link.source(); + World world = PocketManager.loadDimension(current.root().id()); + if (world == null) + { + return false; + } + + Point3D destination = yCoordHelper.findDropPoint(world, source.getX(), source.getY() + 1, source.getZ()); + if (destination != null) + { + current.root().setLinkDestination(link, destination.getX(), destination.getY(), destination.getZ()); + return true; + } + } + return false; + } + + private static void buildExitDoor(Block door,DimLink link, DDProperties prop) + { + World startWorld = PocketManager.loadDimension(link.source().getDimension()); + World destWorld = PocketManager.loadDimension(link.destination().getDimension()); + TileEntity doorTE = startWorld.getTileEntity(link.source().getX(), link.source().getY(), link.point.getZ()); + if(doorTE instanceof TileEntityDimDoor) + { + if((TileEntityDimDoor.class.cast(doorTE).hasGennedPair)) + { + return; + } + TileEntityDimDoor.class.cast(doorTE).hasGennedPair=true; + Block blockToReplace = destWorld.getBlock(link.destination().getX(), link.destination().getY(), link.destination().getZ()); + + if(!destWorld.isAirBlock(link.destination().getX(), link.destination().getY(), link.destination().getZ())) + { + if(!blockToReplace.isReplaceable(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ())) + { + return; + } + } + + ItemDoor.placeDoorBlock(destWorld, link.destination().getX(), link.destination().getY()-1, link.destination().getZ(),link.getDestinationOrientation(), door); + + TileEntity doorDestTE = ((BaseDimDoor)door).initDoorTE(destWorld, link.destination().getX(), link.destination().getY(), link.destination().getZ()); + + + if(doorDestTE instanceof TileEntityDimDoor) + { + TileEntityDimDoor.class.cast(doorDestTE).hasGennedPair=true; + + } + } + } + + private static boolean generateSafeExit(DimLink link, DDProperties properties) + { + NewDimData current = PocketManager.getDimensionData(link.point.getDimension()); + return generateSafeExit(current.root(), link, properties); + } + + private static boolean generateDungeonExit(DimLink link, DDProperties properties) + { + // A dungeon exit acts the same as a safe exit, but has the chance of + // taking the user to any non-pocket dimension, excluding Limbo and The End. + // There is a chance of choosing the Nether first before other root dimensions + // to compensate for servers with many Mystcraft ages or other worlds. + + NewDimData current = PocketManager.getDimensionData(link.point.getDimension()); + + ArrayList roots = PocketManager.getRootDimensions(); + int shiftChance = START_ROOT_SHIFT_CHANCE + ROOT_SHIFT_CHANCE_PER_LEVEL * (current.packDepth() - 1); + + if (random.nextInt(MAX_ROOT_SHIFT_CHANCE) < shiftChance) + { + if (current.root().id() != OVERWORLD_DIMENSION_ID && random.nextInt(MAX_OVERWORLD_EXIT_CHANCE) < OVERWORLD_EXIT_CHANCE) + { + return generateSafeExit(PocketManager.createDimensionDataDangerously(OVERWORLD_DIMENSION_ID), link, properties); + } + if (current.root().id() != NETHER_DIMENSION_ID && random.nextInt(MAX_NETHER_EXIT_CHANCE) < NETHER_EXIT_CHANCE) + { + return generateSafeExit(PocketManager.createDimensionDataDangerously(NETHER_DIMENSION_ID), link, properties); + } + for (int attempts = 0; attempts < 10; attempts++) + { + NewDimData selection = roots.get( random.nextInt(roots.size()) ); + if (selection != current.root() && isValidForDungeonExit(selection, properties)) + { + return generateSafeExit(selection, link, properties); + } + } + } + + // Yes, this could lead you back into Limbo. That's intentional. + return generateSafeExit(current.root(), link, properties); + } + + private static boolean isValidForDungeonExit(NewDimData destination, DDProperties properties) + { + // Prevent exits to The End and Limbo + if (destination.id() == END_DIMENSION_ID || destination.id() == properties.LimboDimensionID) + { + return false; + } + // Prevent exits to Witchery's Spirit World; we need to load the dimension to retrieve its name. + // This is okay because the dimension would have to be loaded subsequently by generateSafeExit(). + World world = PocketManager.loadDimension(destination.id()); + return (world != null && !SPIRIT_WORLD_NAME.equals(world.provider.getDimensionName())); + } + + private static boolean generateSafeExit(NewDimData destinationDim, DimLink link, DDProperties properties) + { + // A safe exit attempts to place a Warp Door in a dimension with + // some precautions to protect the player. The X and Z coordinates + // are fixed to match the source (mostly - may be shifted a little), + // but the Y coordinate is chosen by searching for the nearest + // a safe location to place the door. + + Point4D source = link.source(); + World world = PocketManager.loadDimension(destinationDim.id()); + if (world == null) + { + return false; + } + + int startY = source.getY() - 2; + Point3D destination; + Point3D locationUp = yCoordHelper.findSafeCubeUp(world, source.getX(), startY, source.getZ()); + Point3D locationDown = yCoordHelper.findSafeCubeDown(world, source.getX(), startY, source.getZ()); + + if (locationUp == null) + { + destination = locationDown; + } + else if (locationDown == null) + { + destination = locationUp; + } + else if (locationUp.getY() - startY <= startY - locationDown.getY()) + { + destination = locationUp; + } + else + { + destination = locationDown; + } + if (destination != null) + { + // Set up a 3x3 platform at the destination + // Only place fabric of reality if the block is replaceable or air + // Don't cause block updates + int x = destination.getX(); + int y = destination.getY(); + int z = destination.getZ(); + for (int dx = -1; dx <= 1; dx++) + { + for (int dz = -1; dz <= 1; dz++) + { + // Checking if the block is not an opaque solid is equivalent + // checking for a replaceable block, because we only allow + // exits intersecting blocks on those two surfaces. + if (!world.isBlockNormalCubeDefault(x + dx, y, z + dz, false)) + { + world.setBlock(x + dx, y, z + dz, mod_pocketDim.blockDimWall, 0, 2); + } + } + } + + // Clear out any blocks in the space above the platform layer + // This removes any potential threats like replaceable Poison Ivy from BoP + // Remember to avoid block updates to keep gravel from collapsing + for (int dy = 1; dy <= 2; dy++) + { + for (int dx = -1; dx <= 1; dx++) + { + for (int dz = -1; dz <= 1; dz++) + { + world.setBlock(x + dx, y + dy, z + dz, Blocks.air, 0, 2); + } + } + } + + // Create a reverse link for returning + int orientation = getDestinationOrientation(source, properties); + NewDimData sourceDim = PocketManager.getDimensionData(link.source().getDimension()); + DimLink reverse = destinationDim.createLink(x, y + 2, z, LinkType.REVERSE,orientation); + + sourceDim.setLinkDestination(reverse, source.getX(), source.getY(), source.getZ()); + + // Set up the warp door at the destination + orientation = BlockRotator.transformMetadata(orientation, 2, mod_pocketDim.warpDoor); + ItemDoor.placeDoorBlock(world, x, y + 1, z, orientation, mod_pocketDim.warpDoor); + + // Complete the link to the destination + // This comes last so the destination isn't set unless everything else works first + destinationDim.setLinkDestination(link, x, y + 2, z); + } + + return (destination != null); + } } -- 2.39.5 From de6d10dc803d3527bfb54d77dbb4faeb082d2301 Mon Sep 17 00:00:00 2001 From: CannibalVox Date: Sat, 25 Apr 2015 19:45:32 -0500 Subject: [PATCH 58/58] Fix debugging in idea 14 --- build.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build.gradle b/build.gradle index 6de83ba..1929d0d 100644 --- a/build.gradle +++ b/build.gradle @@ -48,6 +48,14 @@ processResources } } +afterEvaluate { + allprojects { project -> + if (project.plugins.hasPlugin("idea")) + { + idea { module { inheritOutputDirs = true } } + } + } +} jar { -- 2.39.5