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!
This commit is contained in:
@@ -101,4 +101,10 @@ public class Point3D implements Serializable {
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "(" + x + ", " + "y" + ", " + z + ")";
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<DungeonGenerator> pistonTraps = new ArrayList<DungeonGenerator>();
|
||||
private ArrayList<DungeonGenerator> exits = new ArrayList<DungeonGenerator>();
|
||||
|
||||
public ArrayList<Integer> metadataFlipList = new ArrayList<Integer>();
|
||||
public ArrayList<Integer> metadataNextList = new ArrayList<Integer>();
|
||||
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));
|
||||
|
||||
@@ -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
|
||||
{
|
||||
@@ -18,16 +21,55 @@ public class BlockRotator
|
||||
private final static int WEST_DOOR_METADATA = 2;
|
||||
public final static int NORTH_DOOR_METADATA = 3;
|
||||
|
||||
private final static ArrayList<Integer> metadataFlipList = new ArrayList<Integer>();
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package StevenDimDoors.mod_pocketDim.schematic;
|
||||
|
||||
|
||||
public class ReplacementFilter extends SchematicFilter {
|
||||
|
||||
private short targetBlock;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user