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)
{
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
// by some number of blocks which will give us a square
// to teleport players on the edge of.
Location expandedBottomLeft = lowestLoc.clone();
Location expandedTopRight = highestLoc.clone();
Location expandedBottomLeft = data.CornerBottomLeft.clone();
Location expandedTopRight = data.CornerTopRight.clone();
// 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
// respectively...
expandedBottomLeft.setX(Math.min(lowestLoc.getX(), highestLoc.getX()) - TELEPORT_BORDER_DISTANCE);
expandedTopRight.setX(Math.max(lowestLoc.getX(), highestLoc.getX()) + TELEPORT_BORDER_DISTANCE);
expandedBottomLeft.setX(data.CornerBottomLeft.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
// respectively...
expandedBottomLeft.setZ(Math.min(lowestLoc.getZ(), highestLoc.getZ()) - TELEPORT_BORDER_DISTANCE);
expandedTopRight.setZ(Math.max(lowestLoc.getZ(), highestLoc.getZ()) + TELEPORT_BORDER_DISTANCE);
expandedBottomLeft.setZ(data.CornerBottomLeft.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
// the locations for the square's edge.

View File

@ -54,8 +54,8 @@ public class BuildData
public Location Spawn;
public Location CornerA;
public Location CornerB;
public Location CornerBottomLeft;
public Location CornerTopRight;
public HashSet<Block> Blocks = new HashSet<Block>();
@ -85,10 +85,12 @@ public class BuildData
{
this(player, spawn);
CornerA = UtilAlg.findClosest(spawn, buildBorders);
Location CornerA = UtilAlg.findClosest(spawn, buildBorders);
buildBorders.remove(CornerA);
CornerB = UtilAlg.findClosest(spawn, buildBorders);
Location CornerB = UtilAlg.findClosest(spawn, buildBorders);
buildBorders.remove(CornerB);
setCorners(CornerA, CornerB);
}
public BuildData(GameTeam team, Location spawn, ArrayList<Location> buildBorders)
@ -97,10 +99,43 @@ public class BuildData
Team = team;
Spawn = spawn;
CornerA = UtilAlg.findClosest(spawn, buildBorders);
Location CornerA = UtilAlg.findClosest(spawn, buildBorders);
buildBorders.remove(CornerA);
CornerB = UtilAlg.findClosest(spawn, buildBorders);
Location CornerB = UtilAlg.findClosest(spawn, buildBorders);
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)
@ -219,27 +254,27 @@ public class BuildData
{
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)
{
if (vec.getX() < Math.min(CornerA.getBlockX(), CornerB.getBlockX()))
if (vec.getBlockX() <= CornerBottomLeft.getBlockX())
return false;
if (vec.getY() < Math.min(CornerA.getBlockY(), CornerB.getBlockY()))
if (vec.getBlockY() < CornerBottomLeft.getBlockY())
return false;
if (vec.getZ() < Math.min(CornerA.getBlockZ(), CornerB.getBlockZ()))
if (vec.getBlockZ() < CornerBottomLeft.getBlockZ())
return false;
if (vec.getX() > Math.max(CornerA.getBlockX(), CornerB.getBlockX()))
if (vec.getBlockX() > CornerTopRight.getBlockX())
return false;
if (vec.getY() > Math.max(CornerA.getBlockY(), CornerB.getBlockY()))
if (vec.getBlockY() > CornerTopRight.getBlockY())
return false;
if (vec.getZ() > Math.max(CornerA.getBlockZ(), CornerB.getBlockZ()))
if (vec.getBlockZ() > CornerTopRight.getBlockZ())
return false;
return true;
@ -391,29 +426,29 @@ public class BuildData
//Set everything to air first to prevent the forming of obby.
if (mat == Material.LAVA || mat == Material.WATER)
{
int y = Math.min(CornerA.getBlockY(), CornerB.getBlockY()) - 1;
for (int x= Math.min(CornerA.getBlockX(), CornerB.getBlockX()) ; x <= Math.max(CornerA.getBlockX(), CornerB.getBlockX()) ; x++)
int y = CornerBottomLeft.getBlockY() - 1;
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);
}
}
}
int x = Math.min(CornerA.getBlockX(), CornerB.getBlockX());
int y = Math.min(CornerA.getBlockY(), CornerB.getBlockY()) - 1;
int z = Math.min(CornerA.getBlockZ(), CornerB.getBlockZ());
int x = CornerBottomLeft.getBlockX();
int y = CornerBottomLeft.getBlockY() - 1;
int z = CornerBottomLeft.getBlockZ();
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;
}
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);
}
@ -437,22 +472,22 @@ public class BuildData
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()
{
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()
{
return Math.max(CornerA.getY(), CornerB.getY());
return CornerTopRight.getY();
}
/**
* Converts all the blocks inside the build to a schematic
* @return
* @return Returns a schematic of the build
*/
public Schematic convertToSchematic()
{