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 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. 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() ); } }