From 766336a25943f06969d1a1b2754d41938f61591f Mon Sep 17 00:00:00 2001 From: SenseiKiwi Date: Tue, 30 Jul 2013 17:57:05 -0400 Subject: [PATCH] Fixed Door Bugs Fixed the bugs that caused doors not to appear right in dungeons. First there was a bug with filters that caused them not to replace blocks properly. I made some changes to SchematicFilter and its derived classes so that the implementations are a little more intuitive. That should prevent those bugs in any future derived classes. Then doors wouldn't rotate properly. DD was never designed to rotate dimensional doors. I added code to BlockRotator for that and shifted some code from DungeonHelper to BlockRotator. More coherence, less coupling! --- StevenDimDoors/mod_pocketDim/Point3D.java | 6 +++ .../commands/CommandCreateDungeonRift.java | 19 ------- .../dungeon/DungeonSchematic.java | 8 +-- .../dungeon/SpecialBlockFinder.java | 14 +++-- .../mod_pocketDim/helpers/DungeonHelper.java | 42 --------------- .../mod_pocketDim/schematic/BlockRotator.java | 54 ++++++++++++++++--- .../schematic/CompoundFilter.java | 6 +-- .../schematic/ReplacementFilter.java | 1 + .../schematic/SchematicFilter.java | 2 +- 9 files changed, 71 insertions(+), 81 deletions(-) diff --git a/StevenDimDoors/mod_pocketDim/Point3D.java b/StevenDimDoors/mod_pocketDim/Point3D.java index 5d4a03d..2fd653e 100644 --- a/StevenDimDoors/mod_pocketDim/Point3D.java +++ b/StevenDimDoors/mod_pocketDim/Point3D.java @@ -101,4 +101,10 @@ public class Point3D implements Serializable { } return hash; } + + @Override + public String toString() + { + return "(" + x + ", " + "y" + ", " + z + ")"; + } } \ No newline at end of file diff --git a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java index a924fd8..84f2c06 100644 --- a/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java +++ b/StevenDimDoors/mod_pocketDim/commands/CommandCreateDungeonRift.java @@ -81,25 +81,6 @@ public class CommandCreateDungeonRift extends DDCommandBase link = dimHelper.instance.createPocket(link, true, true); dimHelper.dimList.get(link.destDimID).dungeonGenerator = result; sender.sendChatToPlayer("Created a rift to \"" + getSchematicName(result) + "\" dungeon (Dimension ID = " + link.destDimID + ")."); - - /*try { - DungeonSchematic dungeon; - if ((new File(result.schematicPath)).exists()) - { - dungeon = DungeonSchematic.readFromFile(result.schematicPath); - } - else - { - dungeon = DungeonSchematic.readFromResource(result.schematicPath); - } - dungeon.applyImportFilters(DDProperties.instance()); - dungeon.copyToWorld(sender.worldObj, x, y, z); - } catch (InvalidSchematicException e) { - e.printStackTrace(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - }*/ - } else { diff --git a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java index 5827666..35e245b 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/DungeonSchematic.java @@ -46,7 +46,7 @@ public class DungeonSchematic extends Schematic { private static final short[] MOD_BLOCK_FILTER_EXCEPTIONS = new short[] { STANDARD_FABRIC_OF_REALITY_ID, - STANDARD_ETERNAL_FABRIC_ID//, + STANDARD_ETERNAL_FABRIC_ID //STANDARD_WARP_DOOR_ID, //STANDARD_DIMENSIONAL_DOOR_ID }; @@ -108,12 +108,6 @@ public class DungeonSchematic extends Schematic { dimensionalDoorLocations = finder.getDimensionalDoorLocations(); monolithSpawnLocations = finder.getMonolithSpawnLocations(); - //TODO: Debug prints below. Please remove them before the next release! - System.out.println(entranceDoorLocation != null ? "Entrance was found" : "Entrance was not found"); - System.out.printf("There are %d exit doors in this room\n", exitDoorLocations.size()); - System.out.printf("There are %d dim doors in this room\n", dimensionalDoorLocations.size()); - System.out.printf("There are %d monolith spawn points in this room\n", monolithSpawnLocations.size()); - //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, diff --git a/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java b/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java index 94efdd4..ff8fffb 100644 --- a/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java +++ b/StevenDimDoors/mod_pocketDim/dungeon/SpecialBlockFinder.java @@ -70,16 +70,22 @@ public class SpecialBlockFinder extends SchematicFilter { if (blocks[index] == monolithSpawnMarkerID) { monolithSpawnLocations.add(schematic.calculatePoint(index)); + return true; } - else if (blocks[index] == dimensionalDoorID) + if (blocks[index] == dimensionalDoorID) { indexBelow = schematic.calculateIndexBelow(index); if (indexBelow >= 0 && blocks[indexBelow] == dimensionalDoorID) { dimensionalDoorLocations.add(schematic.calculatePoint(index)); + return true; + } + else + { + return false; } } - else if (blocks[index] == warpDoorID) + if (blocks[index] == warpDoorID) { indexBelow = schematic.calculateIndexBelow(index); if (indexBelow >= 0 && blocks[indexBelow] == warpDoorID) @@ -88,15 +94,17 @@ public class SpecialBlockFinder extends SchematicFilter { if (indexDoubleBelow >= 0 && blocks[indexDoubleBelow] == exitMarkerID) { exitDoorLocations.add(schematic.calculatePoint(index)); + return true; } else if (entranceDoorLocation == null) { entranceDoorLocation = schematic.calculatePoint(index); entranceOrientation = (metadata[indexBelow] & 3); + return true; } } } - return true; + return false; } @Override diff --git a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java index 6812ccf..3103893 100644 --- a/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java +++ b/StevenDimDoors/mod_pocketDim/helpers/DungeonHelper.java @@ -9,7 +9,6 @@ import java.util.HashSet; import java.util.Random; import java.util.regex.Pattern; -import net.minecraft.block.Block; import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; import StevenDimDoors.mod_pocketDim.DDProperties; @@ -69,8 +68,6 @@ public class DungeonHelper private ArrayList pistonTraps = new ArrayList(); private ArrayList exits = new ArrayList(); - public ArrayList metadataFlipList = new ArrayList(); - public ArrayList metadataNextList = new ArrayList(); public DungeonGenerator defaultBreak = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, "/schematics/somethingBroke.schematic", true); public DungeonGenerator defaultUp = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, "/schematics/simpleStairsUp.schematic", true); @@ -112,7 +109,6 @@ public class DungeonHelper { copyfile.copyFile("/mods/DimDoors/text/How_to_add_dungeons.txt", file.getAbsolutePath() + "/How_to_add_dungeons.txt"); } - registerFlipBlocks(); importCustomDungeons(properties.CustomSchematicDirectory); registerBaseDungeons(); } @@ -257,44 +253,6 @@ public class DungeonHelper } } - public void registerFlipBlocks() - { - metadataFlipList.add(Block.dispenser.blockID); - metadataFlipList.add(Block.stairsStoneBrick.blockID); - metadataFlipList.add(Block.lever.blockID); - metadataFlipList.add(Block.stoneButton.blockID); - metadataFlipList.add(Block.redstoneRepeaterIdle.blockID); - metadataFlipList.add(Block.redstoneRepeaterActive.blockID); - metadataFlipList.add(Block.tripWireSource.blockID); - metadataFlipList.add(Block.torchWood.blockID); - metadataFlipList.add(Block.torchRedstoneIdle.blockID); - metadataFlipList.add(Block.torchRedstoneActive.blockID); - metadataFlipList.add(Block.doorIron.blockID); - metadataFlipList.add(Block.doorWood.blockID); - metadataFlipList.add(Block.pistonBase.blockID); - metadataFlipList.add(Block.pistonStickyBase.blockID); - metadataFlipList.add(Block.pistonExtension.blockID); - metadataFlipList.add(Block.redstoneComparatorIdle.blockID); - metadataFlipList.add(Block.redstoneComparatorActive.blockID); - metadataFlipList.add(Block.signPost.blockID); - metadataFlipList.add(Block.signWall.blockID); - metadataFlipList.add(Block.skull.blockID); - metadataFlipList.add(Block.ladder.blockID); - metadataFlipList.add(Block.vine.blockID); - metadataFlipList.add(Block.anvil.blockID); - metadataFlipList.add(Block.chest.blockID); - metadataFlipList.add(Block.chestTrapped.blockID); - metadataFlipList.add(Block.hopperBlock.blockID); - metadataFlipList.add(Block.stairsNetherBrick.blockID); - metadataFlipList.add(Block.stairsCobblestone.blockID); - metadataFlipList.add(Block.stairsNetherBrick.blockID); - metadataFlipList.add(Block.stairsNetherQuartz.blockID); - metadataFlipList.add(Block.stairsSandStone.blockID); - - metadataNextList.add(Block.redstoneRepeaterIdle.blockID); - metadataNextList.add(Block.redstoneRepeaterActive.blockID); - } - public void registerBaseDungeons() { hubs.add(new DungeonGenerator(2 * DEFAULT_DUNGEON_WEIGHT, "/schematics/4WayBasicHall.schematic", false)); diff --git a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java index 8960c23..fded0a4 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java +++ b/StevenDimDoors/mod_pocketDim/schematic/BlockRotator.java @@ -1,12 +1,15 @@ package StevenDimDoors.mod_pocketDim.schematic; +import java.util.ArrayList; + 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 StevenDimDoors.mod_pocketDim.Point3D; -import StevenDimDoors.mod_pocketDim.helpers.DungeonHelper; +import StevenDimDoors.mod_pocketDim.mod_pocketDim; +import StevenDimDoors.mod_pocketDim.blocks.dimDoor; public class BlockRotator { @@ -17,17 +20,56 @@ public class BlockRotator private final static int SOUTH_DOOR_METADATA = 1; private final static int WEST_DOOR_METADATA = 2; public final static int NORTH_DOOR_METADATA = 3; + + private final static ArrayList metadataFlipList = new ArrayList(); + + static + { + metadataFlipList.add(Block.dispenser.blockID); + metadataFlipList.add(Block.stairsStoneBrick.blockID); + metadataFlipList.add(Block.lever.blockID); + metadataFlipList.add(Block.stoneButton.blockID); + metadataFlipList.add(Block.redstoneRepeaterIdle.blockID); + metadataFlipList.add(Block.redstoneRepeaterActive.blockID); + metadataFlipList.add(Block.tripWireSource.blockID); + metadataFlipList.add(Block.torchWood.blockID); + metadataFlipList.add(Block.torchRedstoneIdle.blockID); + metadataFlipList.add(Block.torchRedstoneActive.blockID); + metadataFlipList.add(Block.doorIron.blockID); + metadataFlipList.add(Block.doorWood.blockID); + metadataFlipList.add(Block.pistonBase.blockID); + metadataFlipList.add(Block.pistonStickyBase.blockID); + metadataFlipList.add(Block.pistonExtension.blockID); + metadataFlipList.add(Block.redstoneComparatorIdle.blockID); + metadataFlipList.add(Block.redstoneComparatorActive.blockID); + metadataFlipList.add(Block.signPost.blockID); + metadataFlipList.add(Block.signWall.blockID); + metadataFlipList.add(Block.skull.blockID); + metadataFlipList.add(Block.ladder.blockID); + metadataFlipList.add(Block.vine.blockID); + metadataFlipList.add(Block.anvil.blockID); + metadataFlipList.add(Block.chest.blockID); + metadataFlipList.add(Block.chestTrapped.blockID); + metadataFlipList.add(Block.hopperBlock.blockID); + metadataFlipList.add(Block.stairsNetherBrick.blockID); + metadataFlipList.add(Block.stairsCobblestone.blockID); + metadataFlipList.add(Block.stairsNetherBrick.blockID); + metadataFlipList.add(Block.stairsNetherQuartz.blockID); + metadataFlipList.add(Block.stairsSandStone.blockID); + metadataFlipList.add(mod_pocketDim.dimDoor.blockID); + metadataFlipList.add(mod_pocketDim.ExitDoor.blockID); + } public static int transformMetadata(int metadata, int orientation, int blockID) { //TODO: Replace this horrible function with something prettier. We promise we will for the next version, - //after switching to MC 1.6. + //after switching to MC 1.6. PADRE, PLEASE FORGIVE ME. //Hax to fix negative orientations orientation += 1 << 16; orientation %= 4; - if (DungeonHelper.instance().metadataFlipList.contains(blockID)) + if (metadataFlipList.contains(blockID)) { switch (orientation) { @@ -183,7 +225,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.blocksList[blockID] instanceof BlockRedstoneRepeater || Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof dimDoor || blockID== Block.tripWireSource.blockID || Block.blocksList[blockID] instanceof BlockComparator) { switch (metadata) { @@ -402,7 +444,7 @@ public class BlockRotator } - else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater ||Block.blocksList[blockID] instanceof BlockDoor ||blockID== Block.tripWireSource.blockID||Block.blocksList[blockID] instanceof BlockComparator) + else if(Block.blocksList[blockID] instanceof BlockRedstoneRepeater ||Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof dimDoor || blockID== Block.tripWireSource.blockID||Block.blocksList[blockID] instanceof BlockComparator) { switch (metadata) { @@ -629,7 +671,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.blocksList[blockID] instanceof BlockRedstoneRepeater ||Block.blocksList[blockID] instanceof BlockDoor || Block.blocksList[blockID] instanceof dimDoor || blockID== Block.tripWireSource.blockID||Block.blocksList[blockID] instanceof BlockComparator) { switch (metadata) { diff --git a/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java b/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java index 2de3ec6..882faa5 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java +++ b/StevenDimDoors/mod_pocketDim/schematic/CompoundFilter.java @@ -48,11 +48,11 @@ public class CompoundFilter extends SchematicFilter { { for (SchematicFilter filter : filters) { - if (!filter.applyToBlock(index, blocks, metadata)) + if (filter.applyToBlock(index, blocks, metadata)) { - return !filter.terminates(); + return filter.terminates(); } } - return true; + return false; } } diff --git a/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java b/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java index ba99304..e55a7db 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java +++ b/StevenDimDoors/mod_pocketDim/schematic/ReplacementFilter.java @@ -1,5 +1,6 @@ package StevenDimDoors.mod_pocketDim.schematic; + public class ReplacementFilter extends SchematicFilter { private short targetBlock; diff --git a/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java b/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java index db3b374..7e80959 100644 --- a/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java +++ b/StevenDimDoors/mod_pocketDim/schematic/SchematicFilter.java @@ -21,7 +21,7 @@ public class SchematicFilter { for (int index = 0; index < blocks.length; index++) { - if (!applyToBlock(index, blocks, metadata) && terminates()) + if (applyToBlock(index, blocks, metadata) && terminates()) return false; }