766336a259
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!
797 lines
16 KiB
Java
797 lines
16 KiB
Java
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.mod_pocketDim;
|
|
import StevenDimDoors.mod_pocketDim.blocks.dimDoor;
|
|
|
|
public class BlockRotator
|
|
{
|
|
//This class is temporary. It's just a place in which to hold the old block rotation and transformation code
|
|
//until we can rewrite it.
|
|
|
|
public final static int EAST_DOOR_METADATA = 0;
|
|
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<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. PADRE, PLEASE FORGIVE ME.
|
|
|
|
//Hax to fix negative orientations
|
|
orientation += 1 << 16;
|
|
orientation %= 4;
|
|
|
|
if (metadataFlipList.contains(blockID))
|
|
{
|
|
switch (orientation)
|
|
{
|
|
case EAST_DOOR_METADATA:
|
|
|
|
if (blockID == Block.hopperBlock.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 2:
|
|
metadata = 5;
|
|
break;
|
|
case 3:
|
|
metadata = 4;
|
|
break;
|
|
case 4:
|
|
metadata = 2;
|
|
break;
|
|
case 5:
|
|
metadata = 3;
|
|
break;
|
|
}
|
|
}
|
|
if(Block.blocksList[blockID] instanceof BlockStairs)
|
|
{
|
|
|
|
switch (metadata)
|
|
{
|
|
case 0:
|
|
metadata = 2;
|
|
break;
|
|
case 1:
|
|
metadata = 3;
|
|
break;
|
|
case 2:
|
|
metadata = 1;
|
|
break;
|
|
case 3:
|
|
metadata = 0;
|
|
break;
|
|
case 7:
|
|
metadata = 4;
|
|
break;
|
|
case 6:
|
|
metadata = 5;
|
|
break;
|
|
case 5:
|
|
metadata = 7;
|
|
break;
|
|
case 4:
|
|
metadata = 6;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
else if(blockID== Block.chest.blockID||blockID== Block.chestTrapped.blockID||blockID== Block.ladder.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
|
|
case 2:
|
|
metadata = 5;
|
|
break;
|
|
case 3:
|
|
metadata = 4;
|
|
break;
|
|
case 4:
|
|
metadata = 2;
|
|
break;
|
|
case 5:
|
|
metadata = 3;
|
|
break;
|
|
}
|
|
|
|
}
|
|
else if (blockID==Block.vine.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
|
|
case 1:
|
|
metadata = 2;
|
|
break;
|
|
case 2:
|
|
metadata = 4;
|
|
break;
|
|
case 4:
|
|
metadata = 8;
|
|
break;
|
|
case 8:
|
|
metadata = 1;
|
|
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)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 12:
|
|
metadata = 9;
|
|
break;
|
|
case 11:
|
|
metadata = 10;
|
|
break;
|
|
case 10:
|
|
metadata = 12;
|
|
break;
|
|
case 9:
|
|
metadata = 11;
|
|
break;
|
|
case 2:
|
|
metadata = 4;
|
|
break;
|
|
case 3:
|
|
metadata = 2;
|
|
break;
|
|
case 1:
|
|
metadata = 3;
|
|
break;
|
|
case 4:
|
|
metadata = 1;
|
|
break;
|
|
}
|
|
}
|
|
else if(blockID== Block.pistonBase.blockID||blockID==Block.pistonExtension.blockID||blockID==Block.pistonStickyBase.blockID||blockID==Block.dispenser.blockID||blockID==Block.dropper.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 4:
|
|
metadata = 2;
|
|
break;
|
|
case 5:
|
|
metadata = 3;
|
|
break;
|
|
case 13:
|
|
metadata = 11;
|
|
break;
|
|
case 12:
|
|
metadata = 10;
|
|
break;
|
|
case 3:
|
|
metadata = 4;
|
|
break;
|
|
case 2:
|
|
metadata = 5;
|
|
break;
|
|
case 11:
|
|
metadata = 12;
|
|
break;
|
|
case 10:
|
|
metadata = 13;
|
|
break;
|
|
}
|
|
}
|
|
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)
|
|
{
|
|
case 0:
|
|
metadata = 1;
|
|
break;
|
|
case 1:
|
|
metadata = 2;
|
|
break;
|
|
case 2:
|
|
metadata = 3;
|
|
break;
|
|
case 3:
|
|
metadata = 0;
|
|
break;
|
|
case 4:
|
|
metadata = 5;
|
|
break;
|
|
case 5:
|
|
metadata = 6;
|
|
break;
|
|
case 6:
|
|
metadata = 7;
|
|
break;
|
|
case 7:
|
|
metadata = 4;
|
|
break;
|
|
case 8:
|
|
metadata = 9;
|
|
break;
|
|
case 9:
|
|
metadata = 10;
|
|
break;
|
|
case 10:
|
|
metadata = 11;
|
|
break;
|
|
case 11:
|
|
metadata = 8;
|
|
break;
|
|
case 12:
|
|
metadata = 13;
|
|
break;
|
|
case 13:
|
|
metadata = 14;
|
|
break;
|
|
case 14:
|
|
metadata = 15;
|
|
break;
|
|
case 15:
|
|
metadata = 12;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case SOUTH_DOOR_METADATA:
|
|
|
|
if (blockID == Block.hopperBlock.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 2:
|
|
metadata = 3;
|
|
break;
|
|
case 3:
|
|
metadata = 2;
|
|
break;
|
|
case 4:
|
|
metadata = 5;
|
|
break;
|
|
case 5:
|
|
metadata = 4;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(Block.blocksList[blockID] instanceof BlockStairs)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 0:
|
|
metadata = 1;
|
|
break;
|
|
case 1:
|
|
metadata = 0;
|
|
break;
|
|
case 2:
|
|
metadata = 3;
|
|
break;
|
|
case 3:
|
|
metadata = 2;
|
|
break;
|
|
case 7:
|
|
metadata = 6;
|
|
break;
|
|
case 6:
|
|
metadata = 7;
|
|
break;
|
|
case 5:
|
|
metadata = 4;
|
|
break;
|
|
case 4:
|
|
metadata = 5;
|
|
break;
|
|
}
|
|
}
|
|
|
|
else if(blockID== Block.chest.blockID||blockID== Block.chestTrapped.blockID||blockID==Block.ladder.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 2:
|
|
metadata = 3;
|
|
break;
|
|
case 3:
|
|
metadata = 2;
|
|
break;
|
|
case 4:
|
|
metadata = 5;
|
|
break;
|
|
case 5:
|
|
metadata = 4;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
else if(blockID==Block.vine.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
|
|
case 1:
|
|
metadata = 4;
|
|
break;
|
|
case 2:
|
|
metadata = 8;
|
|
break;
|
|
case 4:
|
|
metadata = 1;
|
|
break;
|
|
case 8:
|
|
metadata = 2;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
else if(blockID== Block.lever.blockID||blockID== Block.torchWood.blockID||blockID== Block.torchRedstoneIdle.blockID||blockID== Block.torchRedstoneActive.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 12:
|
|
metadata = 11;
|
|
break;
|
|
case 11:
|
|
metadata = 12;
|
|
break;
|
|
case 10:
|
|
metadata = 9;
|
|
break;
|
|
case 9:
|
|
metadata = 10;
|
|
break;
|
|
case 2:
|
|
metadata = 1;
|
|
break;
|
|
case 3:
|
|
metadata = 4;
|
|
break;
|
|
case 1:
|
|
metadata = 2;
|
|
break;
|
|
case 4:
|
|
metadata = 3;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(blockID== Block.pistonBase.blockID||blockID==Block.pistonStickyBase.blockID||blockID==Block.dispenser.blockID||blockID==Block.dropper.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 4:
|
|
metadata = 5;
|
|
break;
|
|
case 5:
|
|
metadata = 4;
|
|
break;
|
|
case 13:
|
|
metadata = 12;
|
|
break;
|
|
case 12:
|
|
metadata = 13;
|
|
break;
|
|
case 3:
|
|
metadata = 2;
|
|
break;
|
|
case 2:
|
|
metadata = 3;
|
|
break;
|
|
case 11:
|
|
metadata = 10;
|
|
break;
|
|
case 10:
|
|
metadata = 11;
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
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)
|
|
{
|
|
case 0:
|
|
metadata = 2;
|
|
break;
|
|
case 1:
|
|
metadata = 3;
|
|
break;
|
|
case 2:
|
|
metadata = 0;
|
|
break;
|
|
case 3:
|
|
metadata = 1;
|
|
break;
|
|
case 4:
|
|
metadata = 6;
|
|
break;
|
|
case 5:
|
|
metadata = 7;
|
|
break;
|
|
case 6:
|
|
metadata = 4;
|
|
break;
|
|
case 7:
|
|
metadata = 5;
|
|
break;
|
|
case 8:
|
|
metadata = 10;
|
|
break;
|
|
case 9:
|
|
metadata = 11;
|
|
break;
|
|
case 10:
|
|
metadata = 8;
|
|
break;
|
|
case 11:
|
|
metadata = 9;
|
|
break;
|
|
case 12:
|
|
metadata = 14;
|
|
break;
|
|
case 13:
|
|
metadata = 15;
|
|
break;
|
|
case 14:
|
|
metadata = 12;
|
|
break;
|
|
case 15:
|
|
metadata = 13;
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
break;
|
|
case WEST_DOOR_METADATA:
|
|
|
|
if (blockID == Block.hopperBlock.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 2:
|
|
metadata = 4;
|
|
break;
|
|
case 3:
|
|
metadata = 5;
|
|
break;
|
|
case 4:
|
|
metadata = 3;
|
|
break;
|
|
case 5:
|
|
metadata = 2;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(Block.blocksList[blockID] instanceof BlockStairs)
|
|
{
|
|
|
|
switch (metadata)
|
|
{
|
|
case 2:
|
|
metadata = 0;
|
|
break;
|
|
case 3:
|
|
metadata = 1;
|
|
break;
|
|
case 1:
|
|
metadata = 2;
|
|
break;
|
|
case 0:
|
|
metadata = 3;
|
|
break;
|
|
case 4:
|
|
metadata = 7;
|
|
break;
|
|
case 5:
|
|
metadata = 6;
|
|
break;
|
|
case 7:
|
|
metadata = 5;
|
|
break;
|
|
case 6:
|
|
metadata = 4;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
else if(blockID== Block.chest.blockID||blockID== Block.chestTrapped.blockID||blockID==Block.ladder.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
|
|
case 2:
|
|
metadata = 4;
|
|
break;
|
|
case 3:
|
|
metadata = 5;
|
|
break;
|
|
case 4:
|
|
metadata = 3;
|
|
break;
|
|
case 5:
|
|
metadata = 2;
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(blockID==Block.vine.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
|
|
case 1:
|
|
metadata = 8;
|
|
break;
|
|
case 2:
|
|
metadata = 1;
|
|
break;
|
|
case 4:
|
|
metadata = 2;
|
|
break;
|
|
case 8:
|
|
metadata = 4;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
else if(blockID== Block.lever.blockID||blockID== Block.torchWood.blockID||blockID== Block.torchRedstoneIdle.blockID||blockID== Block.torchRedstoneActive.blockID)
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 9:
|
|
metadata = 12;
|
|
break;
|
|
case 10:
|
|
metadata = 11;
|
|
break;
|
|
case 12:
|
|
metadata = 10;
|
|
break;
|
|
case 11:
|
|
metadata = 9;
|
|
break;
|
|
case 4:
|
|
metadata = 2;
|
|
break;
|
|
case 2:
|
|
metadata = 3;
|
|
break;
|
|
case 3:
|
|
metadata = 1;
|
|
break;
|
|
case 1:
|
|
metadata = 4;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(blockID== Block.pistonBase.blockID||blockID==Block.pistonStickyBase.blockID||blockID==Block.dispenser.blockID||blockID==Block.dropper.blockID)
|
|
|
|
{
|
|
switch (metadata)
|
|
{
|
|
case 2:
|
|
metadata = 4;
|
|
break;
|
|
case 3:
|
|
metadata = 5;
|
|
break;
|
|
case 11:
|
|
metadata = 13;
|
|
break;
|
|
case 10:
|
|
metadata = 12;
|
|
break;
|
|
case 4:
|
|
metadata = 3;
|
|
break;
|
|
case 5:
|
|
metadata = 2;
|
|
break;
|
|
case 12:
|
|
metadata = 11;
|
|
break;
|
|
case 13:
|
|
metadata = 10;
|
|
break;
|
|
}
|
|
}
|
|
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)
|
|
{
|
|
case 1:
|
|
metadata = 0;
|
|
break;
|
|
case 2:
|
|
metadata = 1;
|
|
break;
|
|
case 3:
|
|
metadata = 2;
|
|
break;
|
|
case 0:
|
|
metadata = 3;
|
|
break;
|
|
case 5:
|
|
metadata = 4;
|
|
break;
|
|
case 6:
|
|
metadata = 5;
|
|
break;
|
|
case 7:
|
|
metadata = 6;
|
|
break;
|
|
case 4:
|
|
metadata = 7;
|
|
break;
|
|
case 9:
|
|
metadata = 8;
|
|
break;
|
|
case 10:
|
|
metadata = 9;
|
|
break;
|
|
case 11:
|
|
metadata = 10;
|
|
break;
|
|
case 8:
|
|
metadata = 11;
|
|
break;
|
|
case 13:
|
|
metadata = 12;
|
|
break;
|
|
case 14:
|
|
metadata = 13;
|
|
break;
|
|
case 15:
|
|
metadata = 14;
|
|
break;
|
|
case 12:
|
|
metadata = 15;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case NORTH_DOOR_METADATA:
|
|
/**
|
|
* this is the default case- never need to change anything here
|
|
*
|
|
*/
|
|
break;
|
|
}
|
|
}
|
|
return metadata;
|
|
}
|
|
|
|
public static void transformPoint(Point3D position, Point3D srcOrigin, int angle, Point3D destOrigin)
|
|
{
|
|
//This function receives a position (e.g. point in schematic space), translates it relative
|
|
//to a source coordinate system (e.g. the point that will be the center of a schematic),
|
|
//then rotates and translates it to obtain the corresponding point in a destination
|
|
//coordinate system (e.g. the location of the entry rift in the pocket being generated).
|
|
//The result is returned by overwriting the original position so that new object references
|
|
//aren't needed. That way, repeated use of this function will not incur as much overhead.
|
|
|
|
//Position is only overwritten at the end, so it's okay to provide it as srcOrigin or destOrigin as well.
|
|
|
|
int tx = position.getX() - srcOrigin.getX();
|
|
int ty = position.getY() - srcOrigin.getY();
|
|
int tz = position.getZ() - srcOrigin.getZ();
|
|
|
|
//"int angle" specifies a rotation consistent with Minecraft's orientation system.
|
|
//That means each increment of 1 in angle would be a 90-degree clockwise turn.
|
|
//Given a starting direction A and a destination direction B, the rotation would be
|
|
//calculated by (B - A).
|
|
|
|
//Adjust angle into the expected range
|
|
if (angle < 0)
|
|
{
|
|
int correction = -(angle / 4);
|
|
angle = angle + 4 * (correction + 1);
|
|
}
|
|
angle = angle % 4;
|
|
|
|
int rx;
|
|
int rz;
|
|
switch (angle)
|
|
{
|
|
case 0: //No rotation
|
|
rx = tx;
|
|
rz = tz;
|
|
break;
|
|
case 1: //90 degrees clockwise
|
|
rx = -tz;
|
|
rz = tx;
|
|
break;
|
|
case 2: //180 degrees
|
|
rx = -tx;
|
|
rz = -tz;
|
|
break;
|
|
case 3: //270 degrees clockwise
|
|
rx = tz;
|
|
rz = -tx;
|
|
|
|
break;
|
|
default: //This should never happen
|
|
throw new IllegalStateException("Invalid angle value. This should never happen!");
|
|
}
|
|
|
|
position.setX( rx + destOrigin.getX() );
|
|
position.setY( ty + destOrigin.getY() );
|
|
position.setZ( rz + destOrigin.getZ() );
|
|
}
|
|
}
|