v5
This commit is contained in:
parent
b8e9810e18
commit
0b3743cb01
1 changed files with 151 additions and 120 deletions
|
@ -22,17 +22,19 @@ public class Main extends JavaPlugin
|
||||||
private double size,
|
private double size,
|
||||||
usableSize,
|
usableSize,
|
||||||
borderCenterX,
|
borderCenterX,
|
||||||
borderCenterZ;
|
borderCenterZ,
|
||||||
|
|
||||||
private int x,z,
|
x,z;
|
||||||
centerY, northY, southY, eastY, westY,
|
|
||||||
northZ, southZ, eastX, westX;
|
|
||||||
|
|
||||||
private Material centerGroundMaterial, centerHeadMaterial,
|
private int centerX, centerZ, centerY,
|
||||||
northGroundMaterial, northHeadMaterial,
|
northZ, southZ, eastX, westX,
|
||||||
southGroundMaterial, southHeadMaterial,
|
northY, southY, eastY, westY;
|
||||||
eastGroundMaterial, eastHeadMaterial,
|
|
||||||
westGroundMaterial, westHeadMaterial;
|
private Material centerGroundMaterial, centerFeetMaterial, centerHeadMaterial,
|
||||||
|
northGroundMaterial, northFeetMaterial, northHeadMaterial,
|
||||||
|
southGroundMaterial, southFeetMaterial, southHeadMaterial,
|
||||||
|
eastGroundMaterial, eastFeetMaterial, eastHeadMaterial,
|
||||||
|
westGroundMaterial, westFeetMaterial, westHeadMaterial;
|
||||||
|
|
||||||
private Location center,
|
private Location center,
|
||||||
north,
|
north,
|
||||||
|
@ -54,21 +56,61 @@ public class Main extends JavaPlugin
|
||||||
|
|
||||||
public void onEnable()
|
public void onEnable()
|
||||||
{
|
{
|
||||||
|
getCommand("randomtp").setExecutor(this);
|
||||||
|
|
||||||
world = (CraftWorld) Bukkit.getWorld("World");
|
world = (CraftWorld) Bukkit.getWorld("World");
|
||||||
border = world.getHandle().getWorldBorder();
|
border = world.getHandle().getWorldBorder();
|
||||||
|
|
||||||
newLocation();
|
newLocation();
|
||||||
|
|
||||||
getCommand("randomtp").setExecutor(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*================================================================================================*/
|
/*================================================================================================*/
|
||||||
|
|
||||||
public boolean onCommand(CommandSender sender, Command label, String command, String[] args)
|
public boolean onCommand(CommandSender sender, Command label, String command, String[] args)
|
||||||
{
|
{
|
||||||
if (sender.isOp()) return rtp(Bukkit.getPlayer(args[0]));
|
if (sender.isOp()) return rtp(Bukkit.getPlayer(args[0])); else return false;
|
||||||
|
}
|
||||||
|
|
||||||
else return false;
|
/*================================================================================================*/
|
||||||
|
|
||||||
|
public synchronized boolean rtp(Player player)
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
//if border has changed, or no positions available, find new location
|
||||||
|
if ((centerUsed && northUsed && southUsed && eastUsed && westUsed) ||
|
||||||
|
|
||||||
|
(borderCenterX != border.getCenterX() ||
|
||||||
|
borderCenterZ != border.getCenterZ() ||
|
||||||
|
size != border.getSize())
|
||||||
|
|
||||||
|
&& !newLocation())
|
||||||
|
{
|
||||||
|
//message player and return false if unable to find new location
|
||||||
|
player.sendMessage("§c could not find a location in 10,000 attempts");
|
||||||
|
player.sendMessage("§c (sorry bud... I did try!)");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//randomly select one of the open positions and teleport the player there, then remove the position
|
||||||
|
switch(availableDirections.charAt(dir = (int) Math.floor(Math.random() * availableDirections.length())))
|
||||||
|
{
|
||||||
|
case (char) 1: player.teleport(center); centerUsed = true; break;
|
||||||
|
case (char) 2: player.teleport(north ); northUsed = true; break;
|
||||||
|
case (char) 3: player.teleport(south ); southUsed = true; break;
|
||||||
|
case (char) 4: player.teleport(east ); eastUsed = true; break;
|
||||||
|
case (char) 5: player.teleport(west ); westUsed = true; break;
|
||||||
|
}
|
||||||
|
availableDirections.deleteCharAt(dir);
|
||||||
|
|
||||||
|
//imply that our server has a personality
|
||||||
|
player.sendMessage("§7 *poof*");
|
||||||
|
|
||||||
|
//if all 5 positions have been teleported to, choose a new location
|
||||||
|
if (centerUsed && northUsed && southUsed && eastUsed && westUsed)
|
||||||
|
newLocation();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*================================================================================================*/
|
/*================================================================================================*/
|
||||||
|
@ -80,127 +122,116 @@ public class Main extends JavaPlugin
|
||||||
borderCenterX = border.getCenterX();
|
borderCenterX = border.getCenterX();
|
||||||
borderCenterZ = border.getCenterZ();
|
borderCenterZ = border.getCenterZ();
|
||||||
|
|
||||||
//MAXIMUM TEN THOUSAND ATTEMPTS
|
//maximum ten thousand attempts
|
||||||
for (int i = 0; i < 10000; i++)
|
for (int i = 0; i < 10000; i++)
|
||||||
{
|
{
|
||||||
//RANDOMLY CHOOSE AN X AND Z WITHIN WORLD BORDER
|
//choose an x and z inside the current world border, allowing a margin for the outer positions
|
||||||
x = (int) (Math.floor((Math.random() - 0.5) * usableSize) + border.getCenterX());
|
centerX = (int) (Math.floor((Math.random() - 0.5) * usableSize) + border.getCenterX());
|
||||||
z = (int) (Math.floor((Math.random() - 0.5) * usableSize) + border.getCenterZ());
|
centerZ = (int) (Math.floor((Math.random() - 0.5) * usableSize) + border.getCenterZ());
|
||||||
|
|
||||||
//GET OTHER COORDINATES
|
//get center of block
|
||||||
centerY = world.getHighestBlockYAt( x , z );
|
x = centerX + .5;
|
||||||
northZ = z - radius; northY = world.getHighestBlockYAt( x , northZ );
|
z = centerZ + .5;
|
||||||
southZ = z + radius; southY = world.getHighestBlockYAt( x , southZ );
|
|
||||||
eastX = x + radius; eastY = world.getHighestBlockYAt( eastX , z );
|
|
||||||
westX = x - radius; westY = world.getHighestBlockYAt( westX , z );
|
|
||||||
|
|
||||||
//GET MATERIALS FOR GROUND AND HEAD-HEIGHT BLOCKS AT EACH POSITION
|
//get other coordinates
|
||||||
centerGroundMaterial = world.getBlockAt( x , centerY -1 , z ).getType();
|
northZ = centerZ - radius;
|
||||||
northGroundMaterial = world.getBlockAt( x , northY -1 , northZ ).getType();
|
southZ = centerZ + radius;
|
||||||
southGroundMaterial = world.getBlockAt( x , southY -1 , southZ ).getType();
|
eastX = centerX + radius;
|
||||||
eastGroundMaterial = world.getBlockAt( eastX , eastY -1 , z ).getType();
|
westX = centerX - radius;
|
||||||
westGroundMaterial = world.getBlockAt( westX , westY -1 , z ).getType();
|
|
||||||
|
|
||||||
centerHeadMaterial = world.getBlockAt( x , centerY +1 , z ).getType();
|
centerY = world.getHighestBlockYAt( centerX , centerZ );
|
||||||
northHeadMaterial = world.getBlockAt( x , northY +1 , northZ ).getType();
|
northY = world.getHighestBlockYAt( centerX , northZ );
|
||||||
southHeadMaterial = world.getBlockAt( x , southY +1 , southZ ).getType();
|
southY = world.getHighestBlockYAt( centerX , southZ );
|
||||||
eastHeadMaterial = world.getBlockAt( eastX , eastY +1 , z ).getType();
|
eastY = world.getHighestBlockYAt( eastX , centerZ );
|
||||||
westHeadMaterial = world.getBlockAt( westX , westY +1 , z ).getType();
|
westY = world.getHighestBlockYAt( westX , centerZ );
|
||||||
|
|
||||||
//CONFIRM THAT ALL FIVE POSITIONS ARE ON SOLID GROUND WITH AIR AT HEAD HEIGHT
|
//get materials for ground, feet-height and head-height blocks at each of the five positions
|
||||||
if (centerHeadMaterial .equals(Material.AIR) &&
|
centerGroundMaterial = world.getBlockAt( centerX , centerY -1 , centerZ ).getType();
|
||||||
northHeadMaterial .equals(Material.AIR) &&
|
northGroundMaterial = world.getBlockAt( centerX , northY -1 , northZ ).getType();
|
||||||
southHeadMaterial .equals(Material.AIR) &&
|
southGroundMaterial = world.getBlockAt( centerX , southY -1 , southZ ).getType();
|
||||||
eastHeadMaterial .equals(Material.AIR) &&
|
eastGroundMaterial = world.getBlockAt( eastX , eastY -1 , centerZ ).getType();
|
||||||
westHeadMaterial .equals(Material.AIR) &&
|
westGroundMaterial = world.getBlockAt( westX , westY -1 , centerZ ).getType();
|
||||||
|
|
||||||
!centerGroundMaterial.equals(Material.STATIONARY_WATER) &&
|
centerFeetMaterial = world.getBlockAt( centerX , centerY , centerZ ).getType();
|
||||||
!northGroundMaterial .equals(Material.STATIONARY_WATER) &&
|
northFeetMaterial = world.getBlockAt( centerX , northY , northZ ).getType();
|
||||||
!southGroundMaterial .equals(Material.STATIONARY_WATER) &&
|
southFeetMaterial = world.getBlockAt( centerX , southY , southZ ).getType();
|
||||||
!eastGroundMaterial .equals(Material.STATIONARY_WATER) &&
|
eastFeetMaterial = world.getBlockAt( eastX , eastY , centerZ ).getType();
|
||||||
!westGroundMaterial .equals(Material.STATIONARY_WATER) &&
|
westFeetMaterial = world.getBlockAt( westX , westY , centerZ ).getType();
|
||||||
|
|
||||||
!centerGroundMaterial.equals(Material.WATER) &&
|
centerHeadMaterial = world.getBlockAt( centerX , centerY +1 , centerZ ).getType();
|
||||||
!northGroundMaterial .equals(Material.WATER) &&
|
northHeadMaterial = world.getBlockAt( centerX , northY +1 , northZ ).getType();
|
||||||
!southGroundMaterial .equals(Material.WATER) &&
|
southHeadMaterial = world.getBlockAt( centerX , southY +1 , southZ ).getType();
|
||||||
!eastGroundMaterial .equals(Material.WATER) &&
|
eastHeadMaterial = world.getBlockAt( eastX , eastY +1 , centerZ ).getType();
|
||||||
!westGroundMaterial .equals(Material.WATER) &&
|
westHeadMaterial = world.getBlockAt( westX , westY +1 , centerZ ).getType();
|
||||||
|
|
||||||
!centerGroundMaterial.equals(Material.STATIONARY_LAVA) &&
|
//test that all five positions are on solid ground with air at head height
|
||||||
!northGroundMaterial .equals(Material.STATIONARY_LAVA) &&
|
if (centerHeadMaterial == Material.AIR &&
|
||||||
!southGroundMaterial .equals(Material.STATIONARY_LAVA) &&
|
northHeadMaterial == Material.AIR &&
|
||||||
!eastGroundMaterial .equals(Material.STATIONARY_LAVA) &&
|
southHeadMaterial == Material.AIR &&
|
||||||
!westGroundMaterial .equals(Material.STATIONARY_LAVA) &&
|
eastHeadMaterial == Material.AIR &&
|
||||||
|
westHeadMaterial == Material.AIR &&
|
||||||
|
|
||||||
!centerGroundMaterial.equals(Material.LAVA) &&
|
centerFeetMaterial == Material.AIR &&
|
||||||
!northGroundMaterial .equals(Material.LAVA) &&
|
northFeetMaterial == Material.AIR &&
|
||||||
!southGroundMaterial .equals(Material.LAVA) &&
|
southFeetMaterial == Material.AIR &&
|
||||||
!eastGroundMaterial .equals(Material.LAVA) &&
|
eastFeetMaterial == Material.AIR &&
|
||||||
!westGroundMaterial .equals(Material.LAVA) &&
|
westFeetMaterial == Material.AIR &&
|
||||||
|
|
||||||
!centerGroundMaterial.equals(Material.AIR) &&
|
centerGroundMaterial != Material.AIR &&
|
||||||
!northGroundMaterial .equals(Material.AIR) &&
|
northGroundMaterial != Material.AIR &&
|
||||||
!southGroundMaterial .equals(Material.AIR) &&
|
southGroundMaterial != Material.AIR &&
|
||||||
!eastGroundMaterial .equals(Material.AIR) &&
|
eastGroundMaterial != Material.AIR &&
|
||||||
!westGroundMaterial .equals(Material.AIR))
|
westGroundMaterial != Material.AIR &&
|
||||||
|
|
||||||
|
centerGroundMaterial != Material.STATIONARY_WATER &&
|
||||||
|
northGroundMaterial != Material.STATIONARY_WATER &&
|
||||||
|
southGroundMaterial != Material.STATIONARY_WATER &&
|
||||||
|
eastGroundMaterial != Material.STATIONARY_WATER &&
|
||||||
|
westGroundMaterial != Material.STATIONARY_WATER &&
|
||||||
|
|
||||||
|
centerGroundMaterial != Material.WATER &&
|
||||||
|
northGroundMaterial != Material.WATER &&
|
||||||
|
southGroundMaterial != Material.WATER &&
|
||||||
|
eastGroundMaterial != Material.WATER &&
|
||||||
|
westGroundMaterial != Material.WATER &&
|
||||||
|
|
||||||
|
centerGroundMaterial != Material.STATIONARY_LAVA &&
|
||||||
|
northGroundMaterial != Material.STATIONARY_LAVA &&
|
||||||
|
southGroundMaterial != Material.STATIONARY_LAVA &&
|
||||||
|
eastGroundMaterial != Material.STATIONARY_LAVA &&
|
||||||
|
westGroundMaterial != Material.STATIONARY_LAVA &&
|
||||||
|
|
||||||
|
centerGroundMaterial != Material.LAVA &&
|
||||||
|
northGroundMaterial != Material.LAVA &&
|
||||||
|
southGroundMaterial != Material.LAVA &&
|
||||||
|
eastGroundMaterial != Material.LAVA &&
|
||||||
|
westGroundMaterial != Material.LAVA)
|
||||||
{
|
{
|
||||||
//IF LOCATION VALID, SET NEW POSITIONS AND RESET TRACKING VARIABLES
|
//set new positions and reset
|
||||||
center = world.getBlockAt( x , centerY , z ).getLocation();
|
center = new Location( world, x , (double) centerY , z );
|
||||||
north = world.getBlockAt( x , northY , northZ ).getLocation();
|
north = new Location( world, x , (double) northY , northZ + .5 );
|
||||||
south = world.getBlockAt( x , southY , southZ ).getLocation();
|
south = new Location( world, x , (double) southY , southZ + .5 );
|
||||||
east = world.getBlockAt( eastX , eastY , z ).getLocation();
|
east = new Location( world, eastX + .5 , (double) eastY , z );
|
||||||
west = world.getBlockAt( westX , westY , z ).getLocation();
|
west = new Location( world, westX + .5 , (double) westY , z );
|
||||||
|
|
||||||
availableDirections.setLength(0);
|
availableDirections.setLength(0);
|
||||||
availableDirections.append(chars);
|
availableDirections.append(chars);
|
||||||
|
|
||||||
centerUsed = northUsed = southUsed = eastUsed = westUsed = false;
|
centerUsed =
|
||||||
|
northUsed =
|
||||||
|
southUsed =
|
||||||
|
eastUsed =
|
||||||
|
westUsed = false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
centerUsed = northUsed = southUsed = eastUsed = westUsed = true;
|
centerUsed =
|
||||||
|
northUsed =
|
||||||
|
southUsed =
|
||||||
|
eastUsed =
|
||||||
|
westUsed = true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*================================================================================================*/
|
|
||||||
|
|
||||||
public synchronized boolean rtp(Player player)
|
|
||||||
{
|
|
||||||
if (player == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
//IF BORDER HAS CHANGED, OR NO POSITIONS AVAILABLE, FIND NEW LOCATION
|
|
||||||
if ((centerUsed && northUsed && southUsed && eastUsed && westUsed) ||
|
|
||||||
|
|
||||||
(borderCenterX != border.getCenterX() ||
|
|
||||||
borderCenterZ != border.getCenterZ() ||
|
|
||||||
size != border.getSize())
|
|
||||||
|
|
||||||
&& !newLocation())
|
|
||||||
{
|
|
||||||
//MESSAGE PLAYER AND RETURN FALSE IF UNABLE TO FIND NEW LOCATION.
|
|
||||||
player.sendMessage("could not find location in 10,000 attempts");
|
|
||||||
player.sendMessage("... sorry bud. I did try.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//RANDOMLY SELECT ONE OF THE OPEN POSITIONS AND TELEPORT THE PLAYER THERE. THEN, REMOVE THE POSITION
|
|
||||||
switch(availableDirections.charAt(dir = (int) Math.floor(Math.random() * availableDirections.length())))
|
|
||||||
{
|
|
||||||
case (char) 1: player.teleport(center); centerUsed = true; break;
|
|
||||||
case (char) 2: player.teleport(north ); northUsed = true; break;
|
|
||||||
case (char) 3: player.teleport(south ); southUsed = true; break;
|
|
||||||
case (char) 4: player.teleport(east ); eastUsed = true; break;
|
|
||||||
case (char) 5: player.teleport(west ); westUsed = true; break;
|
|
||||||
}
|
|
||||||
availableDirections.deleteCharAt(dir);
|
|
||||||
|
|
||||||
//IF ALL 5 POSITIONS HAVE BEEN TELEPORTED TO, CHOOSE NEW LOCATION
|
|
||||||
if (centerUsed && northUsed && southUsed && eastUsed && westUsed)
|
|
||||||
newLocation();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue