Fix players being teleported into blocks in BLD in the most overcomplicated way possible

This commit is contained in:
Spencer 2017-11-23 20:59:18 -05:00 committed by Alexander Meech
parent 46c8445f38
commit 333cea3f47
1 changed files with 100 additions and 19 deletions

View File

@ -132,6 +132,7 @@ public class Build extends Game
protected long _voteTime = 14000;
protected long _viewTime = 18000;
private BuildData _viewData = null;
private static final double TELEPORT_BORDER_DISTANCE = 1.0;
private int _countdownTimerState = 0;
@ -735,30 +736,110 @@ public class Build extends Game
return _buildStateTime == 0;
}
private void teleportPlayer(Player player, Location loc) {
player.closeInventory();
player.eject();
player.leaveVehicle();
player.teleport(loc);
player.setFlying(true);
}
public void teleportPlayers(BuildData data)
{
//Teleport
for (int i=0 ; i<UtilServer.getPlayers().length ; i++)
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();
// Move the corners to the same Y-Level
expandedTopRight.setY(lowestLoc.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);
// 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);
// Now that we have the two corners of the square, get a list with all
// the locations for the square's edge.
List<Location> edgeLocations = new ArrayList<>();
Location position = expandedBottomLeft.clone();
// Look directly forward
position.setPitch(0.0F);
// Look in the general direction of the build, which is "up" from
// a bird's-eye view.
position.setYaw(-90);
// Move across the bottom edge of the square, moving right
for (double x = position.getX(); x < expandedTopRight.getX(); x++) {
position.setX(x);
edgeLocations.add(position.clone());
}
// Yaw to "left" from birds-eye
position.setYaw(180);
// Move across the right edge of the square, moving up
for (double z = position.getZ(); z < expandedTopRight.getZ(); z++) {
position.setZ(z);
edgeLocations.add(position.clone());
}
// Yaw to "down" from birds-eye
position.setYaw(90);
// Move across the top edge of the square, moving left
for (double x = position.getX(); x > expandedBottomLeft.getX(); x--) {
position.setX(x);
edgeLocations.add(position.clone());
}
// Yaw to "right" from birds-eye
position.setYaw(0);
// Move across the left edge of the square, moving down
for (double z = position.getZ(); z > expandedBottomLeft.getZ(); z--) {
position.setZ(z);
edgeLocations.add(position.clone());
}
Player[] players = UtilServer.getPlayers();
// Find the number of spaces between each player,
int spacesBetween = Math.max(Math.floorDiv(edgeLocations.size(), players.length), 1);
int spaceIndex = 0;
// Teleport the players to locations every [spacesBetween] spaces
for (Player player : players)
{
double lead = i * ((2d * Math.PI)/UtilServer.getPlayers().length);
teleportPlayer(player, edgeLocations.get(spaceIndex));
double oX = -Math.sin(lead) * 26;
double oZ = Math.cos(lead) * 26;
spaceIndex += spacesBetween;
Location loc = data.Spawn.clone().add(oX, 0, oZ);
loc.setDirection(UtilAlg.getTrajectory(loc, data.Spawn));
// This is supposed to be a quick fix for players being teleported into blocks
// I am not sure the exact cause of this bug, it seems to happen when there is a specific amount of players
if (loc.getBlock() != null && loc.getBlock().getType() != Material.AIR)
loc.setY(loc.getWorld().getHighestBlockYAt(loc) + 1);
UtilServer.getPlayers()[i].closeInventory();
UtilServer.getPlayers()[i].eject();
UtilServer.getPlayers()[i].leaveVehicle();
UtilServer.getPlayers()[i].teleport(loc);
UtilServer.getPlayers()[i].setFlying(true);
if (spaceIndex > edgeLocations.size())
{
spaceIndex = 0;
}
}
}