Improvements to SchematicLoader #39

Merged
SenseiKiwi merged 3 commits from master into master 2013-07-10 03:55:24 +00:00
Showing only changes of commit 63782c0fef - Show all commits

View File

@@ -33,8 +33,6 @@ import StevenDimDoors.mod_pocketDim.ticking.MobObelisk;
public class SchematicLoader public class SchematicLoader
{ {
private final static int EAST_DOOR_METADATA = 0; private final static int EAST_DOOR_METADATA = 0;
private final static int SOUTH_DOOR_METADATA = 1;
private final static int WEST_DOOR_METADATA = 2;
private final static int NORTH_DOOR_METADATA = 3; private final static int NORTH_DOOR_METADATA = 3;
private DDProperties properties = DDProperties.instance(); private DDProperties properties = DDProperties.instance();
@@ -812,10 +810,12 @@ public class SchematicLoader
Point3D pocketCenter = new Point3D(riftX, riftY, riftZ); Point3D pocketCenter = new Point3D(riftX, riftY, riftZ);
Point3D zeroPoint = new Point3D(0, 0, 0); Point3D zeroPoint = new Point3D(0, 0, 0);
int schematicDoorMeta = 0; //The direction in which the player will enter. Will be set below. The direction is encoded using
//the same values as door metadata. Those values are not the same as Minecraft's cardinal directions.
int entryDirection = 0;
//first loop through the .schematic to load in all rift locations, and monolith spawn locations. //First loop through the schematic to load in all rift locations and Monolith spawn locations.
//also finds the incomingLink location, which determines the final position and orientation of the dungeon //Also find the entry door, which determines the final position and orientation of the dungeon.
for ( x = 0; x < width; ++x) for ( x = 0; x < width; ++x)
{ {
for ( y = 0; y < height; ++y) for ( y = 0; y < height; ++y)
@@ -845,7 +845,7 @@ public class SchematicLoader
else if (indexBelow >= 0 && blocks[indexBelow] == Block.doorWood.blockID) else if (indexBelow >= 0 && blocks[indexBelow] == Block.doorWood.blockID)
{ {
schematicEntrance = new Point3D(x, y, z); schematicEntrance = new Point3D(x, y, z);
schematicDoorMeta = Math.abs(blockData[indexBelow] + 2) % 4; //TODO: Write a function for extracting a door's orientation from its metadata or at least change this to use bitwise operations. entryDirection = Math.abs(blockData[indexBelow] + 2) % 4; //TODO: Write a function for extracting a door's orientation from its metadata or at least change this to use bitwise operations.
} }
} }
else if (currentBlock == Block.endPortalFrame.blockID) else if (currentBlock == Block.endPortalFrame.blockID)
@@ -856,9 +856,6 @@ public class SchematicLoader
} }
} }
//TODO: HAX REMOVE THIS!
schematicDoorMeta = NORTH_DOOR_METADATA;
//Loop to actually place the blocks //Loop to actually place the blocks
for (x = 0; x < width; x++) for (x = 0; x < width; x++)
{ {
@@ -871,7 +868,7 @@ public class SchematicLoader
pocketPoint.setY(y); pocketPoint.setY(y);
pocketPoint.setZ(z); pocketPoint.setZ(z);
//Transform pocketPoint into the pocket coordinate system //Transform pocketPoint into the pocket coordinate system
transformPoint(pocketPoint, schematicEntrance, orientation - schematicDoorMeta, pocketCenter); transformPoint(pocketPoint, schematicEntrance, orientation - entryDirection, pocketCenter);
//Store the transformed coordinates //Store the transformed coordinates
realX = pocketPoint.getX(); realX = pocketPoint.getX();
realY = pocketPoint.getY(); realY = pocketPoint.getY();
@@ -897,7 +894,8 @@ public class SchematicLoader
if (currentBlock > 0) if (currentBlock > 0)
{ {
//Calculate new metadata for blocks that have orientations (e.g. doors, pistons) //Calculate new metadata for blocks that have orientations (e.g. doors, pistons)
int fixedMetadata = transformMetadata(blockMetadata, orientation, currentBlock); //We're using a workaround to get the desired rotation relative to the schematic's entrance
int fixedMetadata = transformMetadata(blockMetadata, (orientation + NORTH_DOOR_METADATA - entryDirection + 16) % 4, currentBlock);
//Convert vanilla doors to dim doors or place blocks //Convert vanilla doors to dim doors or place blocks
if (currentBlock == Block.doorIron.blockID) if (currentBlock == Block.doorIron.blockID)
@@ -946,11 +944,11 @@ public class SchematicLoader
} }
//We'll use an extra block here to restrict the scope of these variables to just inside the block //We'll use an extra block here to restrict the scope of these variables to just inside the block
//This is to avoid conflicts with the loops below //This is to avoid declaration conflicts with the loops below
{ {
//Set the orientation of the rift exit //Set the orientation of the rift exit
Point3D entranceRiftLocation = schematicEntrance.clone(); Point3D entranceRiftLocation = schematicEntrance.clone();
transformPoint(entranceRiftLocation, schematicEntrance, orientation - schematicDoorMeta, pocketCenter); transformPoint(entranceRiftLocation, schematicEntrance, orientation - entryDirection, pocketCenter);
LinkData sideLink = dimHelper.instance.getLinkDataFromCoords( LinkData sideLink = dimHelper.instance.getLinkDataFromCoords(
entranceRiftLocation.getX(), entranceRiftLocation.getX(),
entranceRiftLocation.getY(), entranceRiftLocation.getY(),
@@ -960,6 +958,7 @@ public class SchematicLoader
entranceRiftLocation.getX(), entranceRiftLocation.getX(),
entranceRiftLocation.getY() - 1, entranceRiftLocation.getY() - 1,
entranceRiftLocation.getZ()); entranceRiftLocation.getZ());
System.out.println("Metadata Orientation: " + sideLink.linkOrientation);
} }
//Generate the LinkData defined by the door placement, Iron Dim doors first //Generate the LinkData defined by the door placement, Iron Dim doors first
@@ -971,7 +970,7 @@ public class SchematicLoader
//Transform doorLocation to the pocket coordinate system //Transform doorLocation to the pocket coordinate system
Point3D doorLocation = point.clone(); Point3D doorLocation = point.clone();
transformPoint(doorLocation, schematicEntrance, orientation - schematicDoorMeta, pocketCenter); transformPoint(doorLocation, schematicEntrance, orientation - entryDirection, pocketCenter);
int blockDirection = world.getBlockMetadata(doorLocation.getX(), doorLocation.getY() - 1, doorLocation.getZ()); int blockDirection = world.getBlockMetadata(doorLocation.getX(), doorLocation.getY() - 1, doorLocation.getZ());
//Rotate the link destination noise to point in the same direction as the door exit //Rotate the link destination noise to point in the same direction as the door exit
@@ -999,7 +998,7 @@ public class SchematicLoader
{ {
//Transform doorLocation to the pocket coordinate system. //Transform doorLocation to the pocket coordinate system.
Point3D doorLocation = point.clone(); Point3D doorLocation = point.clone();
transformPoint(doorLocation, schematicEntrance, orientation - schematicDoorMeta, pocketCenter); transformPoint(doorLocation, schematicEntrance, orientation - entryDirection, pocketCenter);
int blockDirection = world.getBlockMetadata(doorLocation.getX(), doorLocation.getY() - 1, doorLocation.getZ()); int blockDirection = world.getBlockMetadata(doorLocation.getX(), doorLocation.getY() - 1, doorLocation.getZ());
Point3D linkDestination = doorLocation.clone(); Point3D linkDestination = doorLocation.clone();
@@ -1069,7 +1068,7 @@ public class SchematicLoader
{ {
//Transform the frame block's location to the pocket coordinate system //Transform the frame block's location to the pocket coordinate system
Point3D frameLocation = point.clone(); Point3D frameLocation = point.clone();
transformPoint(frameLocation, schematicEntrance, orientation - schematicDoorMeta, pocketCenter); transformPoint(frameLocation, schematicEntrance, orientation - entryDirection, pocketCenter);
Entity mob = new MobObelisk(world); Entity mob = new MobObelisk(world);
mob.setLocationAndAngles(frameLocation.getX(), frameLocation.getY(), frameLocation.getZ(), 1, 1); //TODO: Why not set the angles to 0? @.@ ~SenseiKiwi mob.setLocationAndAngles(frameLocation.getX(), frameLocation.getY(), frameLocation.getZ(), 1, 1); //TODO: Why not set the angles to 0? @.@ ~SenseiKiwi