Set BL/TR corners inside BuildData

This commit is contained in:
Spencer 2017-11-25 15:23:29 -05:00 committed by Alexander Meech
parent d732d8a551
commit 07ea1bc9c7
2 changed files with 69 additions and 46 deletions

View File

@ -746,36 +746,24 @@ public class Build extends Game
public void teleportPlayers(BuildData data) public void teleportPlayers(BuildData data)
{ {
Location lowestLoc;
Location highestLoc;
// Find the lowest corner by comparing y-values
if (data.CornerA.getY() < data.CornerB.getY()) {
lowestLoc = data.CornerA;
highestLoc = data.CornerB;
} else {
lowestLoc = data.CornerB;
highestLoc = data.CornerA;
}
// We're going to expand the boundaries of the corners // We're going to expand the boundaries of the corners
// by some number of blocks which will give us a square // by some number of blocks which will give us a square
// to teleport players on the edge of. // to teleport players on the edge of.
Location expandedBottomLeft = lowestLoc.clone(); Location expandedBottomLeft = data.CornerBottomLeft.clone();
Location expandedTopRight = highestLoc.clone(); Location expandedTopRight = data.CornerTopRight.clone();
// Move the corners to the same Y-Level // Move the corners to the same Y-Level
expandedTopRight.setY(lowestLoc.getY()); expandedTopRight.setY(data.CornerBottomLeft.getY());
// Set the x of bottom left and top right to be left/right // Set the x of bottom left and top right to be left/right
// respectively... // respectively...
expandedBottomLeft.setX(Math.min(lowestLoc.getX(), highestLoc.getX()) - TELEPORT_BORDER_DISTANCE); expandedBottomLeft.setX(data.CornerBottomLeft.getX() - TELEPORT_BORDER_DISTANCE);
expandedTopRight.setX(Math.max(lowestLoc.getX(), highestLoc.getX()) + TELEPORT_BORDER_DISTANCE); expandedTopRight.setX(data.CornerTopRight.getX() + TELEPORT_BORDER_DISTANCE);
// Set the z of bottom left and top right to be bottom/top // Set the z of bottom left and top right to be bottom/top
// respectively... // respectively...
expandedBottomLeft.setZ(Math.min(lowestLoc.getZ(), highestLoc.getZ()) - TELEPORT_BORDER_DISTANCE); expandedBottomLeft.setZ(data.CornerBottomLeft.getZ() - TELEPORT_BORDER_DISTANCE);
expandedTopRight.setZ(Math.max(lowestLoc.getZ(), highestLoc.getZ()) + TELEPORT_BORDER_DISTANCE); expandedTopRight.setZ(data.CornerBottomLeft.getZ() + TELEPORT_BORDER_DISTANCE);
// Now that we have the two corners of the square, get a list with all // Now that we have the two corners of the square, get a list with all
// the locations for the square's edge. // the locations for the square's edge.

View File

@ -54,8 +54,8 @@ public class BuildData
public Location Spawn; public Location Spawn;
public Location CornerA; public Location CornerBottomLeft;
public Location CornerB; public Location CornerTopRight;
public HashSet<Block> Blocks = new HashSet<Block>(); public HashSet<Block> Blocks = new HashSet<Block>();
@ -85,10 +85,12 @@ public class BuildData
{ {
this(player, spawn); this(player, spawn);
CornerA = UtilAlg.findClosest(spawn, buildBorders); Location CornerA = UtilAlg.findClosest(spawn, buildBorders);
buildBorders.remove(CornerA); buildBorders.remove(CornerA);
CornerB = UtilAlg.findClosest(spawn, buildBorders); Location CornerB = UtilAlg.findClosest(spawn, buildBorders);
buildBorders.remove(CornerB); buildBorders.remove(CornerB);
setCorners(CornerA, CornerB);
} }
public BuildData(GameTeam team, Location spawn, ArrayList<Location> buildBorders) public BuildData(GameTeam team, Location spawn, ArrayList<Location> buildBorders)
@ -97,10 +99,43 @@ public class BuildData
Team = team; Team = team;
Spawn = spawn; Spawn = spawn;
CornerA = UtilAlg.findClosest(spawn, buildBorders); Location CornerA = UtilAlg.findClosest(spawn, buildBorders);
buildBorders.remove(CornerA); buildBorders.remove(CornerA);
CornerB = UtilAlg.findClosest(spawn, buildBorders); Location CornerB = UtilAlg.findClosest(spawn, buildBorders);
buildBorders.remove(CornerB); buildBorders.remove(CornerB);
setCorners(CornerA, CornerB);
}
/**
* Normalizes corners by setting
* CornerBottomLeft to be the "bottom-left"
* corner (lowest y-value, lowest x, and
* lowest z) and CornerTopRight to be the
* "top-right" corner (highest y-value,
* highest x, and highest z)
*/
private void setCorners(Location CornerA, Location CornerB) {
Location bottomLeft;
Location topRight;
// Find the lowest corner by comparing y-values
if (CornerA.getY() < CornerB.getY()) {
bottomLeft = CornerA.clone();
topRight = CornerB.clone();
} else {
bottomLeft = CornerB.clone();
topRight = CornerA.clone();
}
bottomLeft.setX(Math.min(CornerA.getX(), CornerB.getX()));
topRight.setX(Math.max(CornerA.getX(), CornerB.getX()));
bottomLeft.setZ(Math.min(CornerA.getZ(), CornerB.getZ()));
topRight.setZ(Math.min(CornerA.getZ(), CornerB.getZ()));
CornerBottomLeft = bottomLeft;
CornerTopRight = topRight;
} }
public boolean addItem(Item item) public boolean addItem(Item item)
@ -219,27 +254,27 @@ public class BuildData
{ {
if (!block.getWorld().getName().equals(Spawn.getWorld().getName())) return false; if (!block.getWorld().getName().equals(Spawn.getWorld().getName())) return false;
return inBuildArea(block.getLocation().add(0.5, 0, 0.5).toVector()); return inBuildArea(block.getLocation().toVector());
} }
public boolean inBuildArea(Vector vec) public boolean inBuildArea(Vector vec)
{ {
if (vec.getX() < Math.min(CornerA.getBlockX(), CornerB.getBlockX())) if (vec.getBlockX() <= CornerBottomLeft.getBlockX())
return false; return false;
if (vec.getY() < Math.min(CornerA.getBlockY(), CornerB.getBlockY())) if (vec.getBlockY() < CornerBottomLeft.getBlockY())
return false; return false;
if (vec.getZ() < Math.min(CornerA.getBlockZ(), CornerB.getBlockZ())) if (vec.getBlockZ() < CornerBottomLeft.getBlockZ())
return false; return false;
if (vec.getX() > Math.max(CornerA.getBlockX(), CornerB.getBlockX())) if (vec.getBlockX() > CornerTopRight.getBlockX())
return false; return false;
if (vec.getY() > Math.max(CornerA.getBlockY(), CornerB.getBlockY())) if (vec.getBlockY() > CornerTopRight.getBlockY())
return false; return false;
if (vec.getZ() > Math.max(CornerA.getBlockZ(), CornerB.getBlockZ())) if (vec.getBlockZ() > CornerTopRight.getBlockZ())
return false; return false;
return true; return true;
@ -391,29 +426,29 @@ public class BuildData
//Set everything to air first to prevent the forming of obby. //Set everything to air first to prevent the forming of obby.
if (mat == Material.LAVA || mat == Material.WATER) if (mat == Material.LAVA || mat == Material.WATER)
{ {
int y = Math.min(CornerA.getBlockY(), CornerB.getBlockY()) - 1; int y = CornerBottomLeft.getBlockY() - 1;
for (int x= Math.min(CornerA.getBlockX(), CornerB.getBlockX()) ; x <= Math.max(CornerA.getBlockX(), CornerB.getBlockX()) ; x++) for (int x = CornerBottomLeft.getBlockX(); x <= CornerTopRight.getBlockX(); x++)
{ {
for (int z= Math.min(CornerA.getBlockZ(), CornerB.getBlockZ()) ; z <= Math.max(CornerA.getBlockZ(), CornerB.getBlockZ()) ; z++) for (int z = CornerBottomLeft.getBlockZ(); z <= CornerTopRight.getBlockZ(); z++)
{ {
MapUtil.QuickChangeBlockAt(player.getWorld(), x, y, z, Material.AIR, data); MapUtil.QuickChangeBlockAt(player.getWorld(), x, y, z, Material.AIR, data);
} }
} }
} }
int x = Math.min(CornerA.getBlockX(), CornerB.getBlockX()); int x = CornerBottomLeft.getBlockX();
int y = Math.min(CornerA.getBlockY(), CornerB.getBlockY()) - 1; int y = CornerBottomLeft.getBlockY() - 1;
int z = Math.min(CornerA.getBlockZ(), CornerB.getBlockZ()); int z = CornerBottomLeft.getBlockZ();
if (ground.hasSchematic()) if (ground.hasSchematic())
{ {
ground.getSchematic().paste(new Location(CornerA.getWorld(), x, y, z), true); ground.getSchematic().paste(new Location(CornerBottomLeft.getWorld(), x, y, z), true);
return; return;
} }
for (int dx = x; dx <= Math.max(CornerA.getBlockX(), CornerB.getBlockX()) ; dx++) for (int dx = x; dx <= CornerTopRight.getBlockX(); dx++)
{ {
for (int dz = z; dz <= Math.max(CornerA.getBlockZ(), CornerB.getBlockZ()) ; dz++) for (int dz = z; dz <= CornerTopRight.getBlockZ(); dz++)
{ {
MapUtil.QuickChangeBlockAt(player.getWorld(), dx, y, dz, mat, data); MapUtil.QuickChangeBlockAt(player.getWorld(), dx, y, dz, mat, data);
} }
@ -437,22 +472,22 @@ public class BuildData
protected Location getMin() protected Location getMin()
{ {
return Vector.getMinimum(CornerA.toVector(), CornerB.toVector()).toBlockVector().toLocation(CornerA.getWorld()).subtract(0, 1, 0); return Vector.getMinimum(CornerBottomLeft.toVector(), CornerTopRight.toVector()).toBlockVector().toLocation(CornerBottomLeft.getWorld()).subtract(0, 1, 0);
} }
protected Location getMax() protected Location getMax()
{ {
return Vector.getMaximum(CornerA.toVector(), CornerB.toVector()).toBlockVector().toLocation(CornerA.getWorld()); return Vector.getMaximum(CornerBottomLeft.toVector(), CornerTopRight.toVector()).toBlockVector().toLocation(CornerBottomLeft.getWorld());
} }
public double getMaxHeight() public double getMaxHeight()
{ {
return Math.max(CornerA.getY(), CornerB.getY()); return CornerTopRight.getY();
} }
/** /**
* Converts all the blocks inside the build to a schematic * Converts all the blocks inside the build to a schematic
* @return * @return Returns a schematic of the build
*/ */
public Schematic convertToSchematic() public Schematic convertToSchematic()
{ {