RandomTeleport moved in #45
5 changed files with 261 additions and 0 deletions
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
||||
</state>
|
||||
</component>
|
|
@ -16,6 +16,8 @@
|
|||
<module name="ButtonCore" target="1.5" />
|
||||
<module name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" target="1.8" />
|
||||
<module name="ButtonProcessor" target="1.8" />
|
||||
<module name="ChunkArchive" target="1.8" />
|
||||
<module name="RandomTeleport" target="1.8" />
|
||||
</bytecodeTargetLevel>
|
||||
</component>
|
||||
</project>
|
|
@ -65,6 +65,7 @@ public class MainPlugin extends JavaPlugin {
|
|||
TBMCCoreAPI.SendException("Failed to write plugin list!", e);
|
||||
}
|
||||
ess = Essentials.getPlugin(Essentials.class);
|
||||
new RandomTP().onEnable(this); //It registers it's command
|
||||
logger.info(pdfFile.getName() + " has been Enabled (V." + pdfFile.getVersion() + ") Test: " + Test + ".");
|
||||
}
|
||||
|
||||
|
|
251
ButtonCore/src/main/java/buttondevteam/core/RandomTP.java
Normal file
251
ButtonCore/src/main/java/buttondevteam/core/RandomTP.java
Normal file
|
@ -0,0 +1,251 @@
|
|||
package buttondevteam.core;
|
||||
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||
import buttondevteam.lib.chat.TBMCCommandBase;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
// @formatter:off
|
||||
@CommandClass
|
||||
public class RandomTP extends TBMCCommandBase
|
||||
{
|
||||
private final int radius = 70; //set how far apart the five teleport positions are
|
||||
|
||||
private World world;
|
||||
private WorldBorder border;
|
||||
private double size,
|
||||
usableSize,
|
||||
borderCenterX,
|
||||
borderCenterZ,
|
||||
|
||||
x,z;
|
||||
|
||||
private int centerX, centerZ, centerY,
|
||||
northZ, southZ, eastX, westX,
|
||||
northY, southY, eastY, westY;
|
||||
|
||||
private Material centerGroundMaterial, centerFeetMaterial, centerHeadMaterial,
|
||||
northGroundMaterial, northFeetMaterial, northHeadMaterial,
|
||||
southGroundMaterial, southFeetMaterial, southHeadMaterial,
|
||||
eastGroundMaterial, eastFeetMaterial, eastHeadMaterial,
|
||||
westGroundMaterial, westFeetMaterial, westHeadMaterial;
|
||||
|
||||
private Location center,
|
||||
north,
|
||||
south,
|
||||
east,
|
||||
west;
|
||||
|
||||
private boolean centerUsed,
|
||||
northUsed,
|
||||
southUsed,
|
||||
eastUsed,
|
||||
westUsed;
|
||||
|
||||
private StringBuilder availableDirections = new StringBuilder(5);
|
||||
private char[] chars = {1,2,3,4,5};
|
||||
private int dir;
|
||||
|
||||
/*================================================================================================*/
|
||||
|
||||
public void onEnable(JavaPlugin plugin)
|
||||
{
|
||||
TBMCChatAPI.AddCommand(plugin, this);
|
||||
|
||||
world = Bukkit.getWorld("World");
|
||||
border = world.getWorldBorder();
|
||||
newLocation();
|
||||
}
|
||||
|
||||
/*================================================================================================*/
|
||||
|
||||
public String[] GetHelpText(String alias)
|
||||
{
|
||||
return new String[]
|
||||
{
|
||||
"§6---- Random Teleport ----",
|
||||
"Teleport player to random location within world border. Every five players teleport to the same general area, and then a new general area is randomly selected for the next five players."
|
||||
};
|
||||
}
|
||||
|
||||
/*================================================================================================*/
|
||||
|
||||
public boolean OnCommand(CommandSender sender, String command, String[] args)
|
||||
{
|
||||
if (args.length == 0) return false;
|
||||
|
||||
if (sender.isOp()) return rtp(Bukkit.getPlayer(args[0]));
|
||||
|
||||
else sender.sendMessage("§7 hmm, " + sender.getName() + "... " + sender.getName() + "... nope, no operator permissions.");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*================================================================================================*/
|
||||
|
||||
public synchronized boolean rtp(Player player)
|
||||
{
|
||||
if (player == null)
|
||||
return false; //Pretend it rtp'd an imaginary player successfully
|
||||
|
||||
//if border has changed, or no positions available, find new location
|
||||
if ((centerUsed && northUsed && southUsed && eastUsed && westUsed) ||
|
||||
|
||||
(borderCenterX != border.getCenter().getX() ||
|
||||
borderCenterZ != border.getCenter().getZ() ||
|
||||
size != border.getSize())
|
||||
|
||||
&& !newLocation())
|
||||
{
|
||||
//if unable to find new location, message player and return false
|
||||
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;
|
||||
}
|
||||
|
||||
/*================================================================================================*/
|
||||
|
||||
public synchronized boolean newLocation()
|
||||
{
|
||||
size = border.getSize();
|
||||
usableSize = size - (radius * 2);
|
||||
borderCenterX = border.getCenter().getX();
|
||||
borderCenterZ = border.getCenter().getZ();
|
||||
|
||||
//maximum ten thousand attempts
|
||||
for (int i = 0; i < 10000; i++)
|
||||
{
|
||||
//choose an x and z inside the current world border, allowing a margin for the outer positions
|
||||
centerX = (int) (Math.floor((Math.random() - 0.5) * usableSize) + border.getCenter().getX());
|
||||
centerZ = (int) (Math.floor((Math.random() - 0.5) * usableSize) + border.getCenter().getZ());
|
||||
|
||||
//get center of block
|
||||
x = centerX + .5;
|
||||
z = centerZ + .5;
|
||||
|
||||
//get other coordinates
|
||||
northZ = centerZ - radius;
|
||||
southZ = centerZ + radius;
|
||||
eastX = centerX + radius;
|
||||
westX = centerX - radius;
|
||||
|
||||
centerY = world.getHighestBlockYAt( centerX , centerZ );
|
||||
northY = world.getHighestBlockYAt( centerX , northZ );
|
||||
southY = world.getHighestBlockYAt( centerX , southZ );
|
||||
eastY = world.getHighestBlockYAt( eastX , centerZ );
|
||||
westY = world.getHighestBlockYAt( westX , centerZ );
|
||||
|
||||
//get materials for ground, feet-height and head-height blocks at each of the five positions
|
||||
centerGroundMaterial = world.getBlockAt( centerX , centerY -1 , centerZ ).getType();
|
||||
northGroundMaterial = world.getBlockAt( centerX , northY -1 , northZ ).getType();
|
||||
southGroundMaterial = world.getBlockAt( centerX , southY -1 , southZ ).getType();
|
||||
eastGroundMaterial = world.getBlockAt( eastX , eastY -1 , centerZ ).getType();
|
||||
westGroundMaterial = world.getBlockAt( westX , westY -1 , centerZ ).getType();
|
||||
|
||||
centerFeetMaterial = world.getBlockAt( centerX , centerY , centerZ ).getType();
|
||||
northFeetMaterial = world.getBlockAt( centerX , northY , northZ ).getType();
|
||||
southFeetMaterial = world.getBlockAt( centerX , southY , southZ ).getType();
|
||||
eastFeetMaterial = world.getBlockAt( eastX , eastY , centerZ ).getType();
|
||||
westFeetMaterial = world.getBlockAt( westX , westY , centerZ ).getType();
|
||||
|
||||
centerHeadMaterial = world.getBlockAt( centerX , centerY +1 , centerZ ).getType();
|
||||
northHeadMaterial = world.getBlockAt( centerX , northY +1 , northZ ).getType();
|
||||
southHeadMaterial = world.getBlockAt( centerX , southY +1 , southZ ).getType();
|
||||
eastHeadMaterial = world.getBlockAt( eastX , eastY +1 , centerZ ).getType();
|
||||
westHeadMaterial = world.getBlockAt( westX , westY +1 , centerZ ).getType();
|
||||
|
||||
//test that all five positions are on solid ground with air at head height
|
||||
if (centerHeadMaterial == Material.AIR &&
|
||||
northHeadMaterial == Material.AIR &&
|
||||
southHeadMaterial == Material.AIR &&
|
||||
eastHeadMaterial == Material.AIR &&
|
||||
westHeadMaterial == Material.AIR &&
|
||||
|
||||
centerFeetMaterial == Material.AIR &&
|
||||
northFeetMaterial == Material.AIR &&
|
||||
southFeetMaterial == Material.AIR &&
|
||||
eastFeetMaterial == Material.AIR &&
|
||||
westFeetMaterial == Material.AIR &&
|
||||
|
||||
centerGroundMaterial != Material.AIR &&
|
||||
northGroundMaterial != Material.AIR &&
|
||||
southGroundMaterial != Material.AIR &&
|
||||
eastGroundMaterial != 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)
|
||||
{
|
||||
//set new positions and reset
|
||||
center = new Location( world, x , (double) centerY , z );
|
||||
north = new Location( world, x , (double) northY , northZ + .5 );
|
||||
south = new Location( world, x , (double) southY , southZ + .5 );
|
||||
east = new Location( world, eastX + .5 , (double) eastY , z );
|
||||
west = new Location( world, westX + .5 , (double) westY , z );
|
||||
|
||||
availableDirections.setLength(0);
|
||||
availableDirections.append(chars);
|
||||
|
||||
centerUsed =
|
||||
northUsed =
|
||||
southUsed =
|
||||
eastUsed =
|
||||
westUsed = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
centerUsed =
|
||||
northUsed =
|
||||
southUsed =
|
||||
eastUsed =
|
||||
westUsed = true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -9,3 +9,5 @@ commands:
|
|||
description: Schedules a restart for a given time.
|
||||
primerestart:
|
||||
description: Restarts the server as soon as nobody is online.
|
||||
randomtp:
|
||||
description: teleport player to random location within world border. Every five players teleport to the same general area, and then a new general area is randomly selected for the next five players.
|
Loading…
Reference in a new issue