import java.util.logging.*; public class HoerupUtils extends Plugin { final static Logger log = Logger.getLogger("HoerupUtils"); private boolean adminDestroy = false; private void registerCommands() { etc e = etc.getInstance(); e.addCommand("/setpos", "[x] [z] - Teleports you to the given coordinates"); e.addCommand("/whereis", "[player] - Tells you the position of another player"); e.addCommand("/fillarea", ""); e.addCommand("/levelarea", ""); e.addCommand("/setsurface", ""); } @Override public void disable() { registerCommands(); } @Override public void enable() { etc e = etc.getInstance(); e.removeCommand("/setpos"); e.removeCommand("/whereis"); e.removeCommand("/fillarea"); e.removeCommand("/levelarea"); e.removeCommand("/setsurface"); } @Override public void initialize() { PluginLoader loader = etc.getLoader(); loader.addListener( PluginLoader.Hook.COMMAND, new HoerupUtilsPlugin(), this, PluginListener.Priority.MEDIUM ); loader.addListener( PluginLoader.Hook.BLOCK_DESTROYED, new AdminDestroy(), this, PluginListener.Priority.MEDIUM ); registerCommands(); } public class AdminDestroy extends PluginListener { public boolean onBlockDestroy(Player player, Block block) { if (adminDestroy == true && player.isAdmin() ) { block.setType(0); etc.getServer().setBlock(block); return true; } return false; } } public class HoerupUtilsPlugin extends PluginListener { final static String USAGE = "Usage: /setpos [x] [z] "; final static int BLOCK_AIR = 0; //block id = 0 is air final static int BLOCK_GRASS = 2; final static int BLOCK_DIRT = 3; //http://www.minecraftforum.net/viewtopic.php?f=35&t=14739 //Y is height // air == blockID:0 private int getGroundLevel(int x, int z) { Server srv = etc.getServer(); int level = srv.getHighestBlockY(x,z); if (level == -1) level = 128; return level; /* int y; for (y=128; y>=0 && srv.getBlockIdAt(x,y-1,z) == AIRBLOCK; y--) ; System.out.println("Groundlevel: " + y); System.out.println("getHighestBlockY: " + srv.getHighestBlockY(x,z) ); return y; */ } private boolean isFree(int x, int y, int z) { Server srv = etc.getServer(); return (srv.getBlockIdAt(x,y,z) == BLOCK_AIR && srv.getBlockIdAt(x,y+1,z) == BLOCK_AIR); } @Override public boolean onCommand(Player player, java.lang.String[] split) { if ( split[0].equals("/admindestroy") && player.canUseCommand("/admindestroy") ) { adminDestroy = !adminDestroy; player.sendMessage("Admindestroy enabled=" + adminDestroy); return true; } else if( split[0].equals("/setpos") && player.canUseCommand("/setpos") ) { setPos(player, split); return true; } else if ( split[0].equals("/whereis" ) && player.canUseCommand("/whereis")) { whereIs(player, split); return true; } else if (split[0].equals("/levelarea") && player.canUseCommand("/levelarea")) { if (validateLevelOrFill(player,split)) { levelArea(player, split); } return true; } else if (split[0].equals("/fillarea") && player.canUseCommand("/fillarea")) { if (validateLevelOrFill(player,split)) { fillArea(player, split); } return true; } else if (split[0].equals("/setsurface") && player.canUseCommand("/setsurface")) { setSurface(player,split); return true; } else { return false; } } int roundPos(double input) { int result = (int) input; if (input < 0.0) { result--; } return result; } private void setSurface(Player player, String[] split) { int valid_block_array[] = {1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 35, 41, 42, 43, 44, 45, 46, 48, 49, 56, 57, 73, 74, 79, 80, 82} ; final int BLOCK_MAX = 86; if (split.length != 3) { player.sendMessage("Usage /setsurface [radius] [blockID]"); return; } int radius; try { radius = Integer.parseInt(split[1]); } catch (Exception e) { player.sendMessage("setsurface: radius must be an integer"); return; } if (radius > 20) { player.sendMessage("setsurface: radius may not exceed 20"); return; } int blockid; try { blockid = Integer.parseInt(split[2]); } catch (Exception e) { player.sendMessage("setsurface: blockid must be an integer"); return; } boolean validblock = false; for (int i=0; i 3) { player.sendMessage("Usage: " + split[0] + " [radius]"); return false; } int radius; try { radius = Integer.parseInt(split[1]); } catch (Exception e) { player.sendMessage(split[0] + ": radius must be an integer"); return false; } if (radius > 20) { player.sendMessage(split[0] + ": radius may not exceed 20"); return false; } if (split.length == 3) { try { Integer.parseInt( split[2] ); } catch (Exception e) { player.sendMessage(split[0] + ": radius must be an integer"); return false; } } return true; } private void fillArea(Player player, String[] split) { int radius = Integer.parseInt(split[1]); int material = BLOCK_DIRT; if (split.length == 3) { material = Integer.parseInt( split[2] ); } System.out.println("Player " + player.getName() + " used fillarea with radius=" + radius); int playerX = roundPos( player.getX() ); int playerY = (int) player.getY(); int playerZ = roundPos( player.getZ() ); Server srv = etc.getServer(); for (int x=(playerX-radius); x<=(playerX+radius); x++) { for (int z=(playerZ-radius); z<=(playerZ+radius); z++) { for (int y=getGroundLevel(x,z); y3) { p1.sendMessage( Colors.Rose + "usage: /whereis (playername|home|warp) " ); return; } Location loc1 = p1.getLocation(); Location loc2; String name2; if (split[1].equals("home") ) { Warp home = etc.getDataSource().getHome( p1.getName() ); if (home == null) { p1.sendMessage(Colors.Rose + "you haven't set a home."); return; } loc2 = home.Location; name2 = "Your home"; } else if (split[1].equals("warp")) { if (split.length != 3) { p1.sendMessage("you have to enter the name of the warp point"); return; } Warp warp = etc.getDataSource().getWarp( split[2] ); if (warp == null) { p1.sendMessage("Found now warp with name " + split[2]); return; } loc2 = warp.Location; name2 = "Warppoint " + split[2]; } else { Player p2 = etc.getServer().getPlayer(split[1]); if (p2 == null) { p1.sendMessage( Colors.Rose + "whereis: no player named " + split[1] ); return; } loc2 = p2.getLocation(); name2 = p2.getName(); } //Location loc2 = new Location(); //loc2.x = loc2.y = loc2.z = 0; //System.out.println("p1: " + loc1.x + "," + loc1.z ); //System.out.println("p2: " + loc2.x + "," + loc2.z ); double distX = loc1.x - loc2.x ; double distZ = loc1.z - loc2.z ; int dist = (int) Math.round( Math.sqrt( (distX*distX) + (distZ*distZ)) ); /*System.out.println("distX:" + distX ); System.out.println("distZ:" + distZ ); System.out.println(">> " + (distZ / distX ) );*/ double angle = Math.toDegrees( Math.atan( distZ / distX ) ); if (angle < 0.0) angle += 90.0; if (distX >= 0.0 && distZ >= 0.0) { //both positive, 0-90 degrees //do nothing } else if (distX < 0.0 && distZ >= 0.0) { // 90-180 degrees angle += 90.0; } else if (distX < 0.0 && distZ < 0.0) {//Both negative 180-270 degrees angle += 180.0; } else { angle += 270.0; } p1.sendMessage( Colors.Yellow + name2 + " is at x:" + roundToPlaces(loc2.x, 2) + " y:" + roundToPlaces(loc2.y, 2) + " z: " + roundToPlaces(loc2.z, 2) ); p1.sendMessage( Colors.Yellow + "Distance is " + dist + " blocks" ); p1.sendMessage( Colors.Yellow + "Bearing: " + (int) angle + " (" + getBearingStr( (int) angle) + ")" ); } public void setPos(Player player, java.lang.String[] split) { int x; int z; int y; int userY = 0; boolean hasY = false; if (split.length <3 || split.length > 4) { player.sendMessage(USAGE); return; } try { x = Integer.parseInt( split[1] ); z = Integer.parseInt( split[2] ); if (split.length == 4) { hasY = true; userY = Integer.parseInt( split[3] ); } } catch (Exception e) { player.sendMessage("/setpos error: non numeric argument"); return; } if (hasY) { if (isFree(x,userY,z)) { y = userY; } else { player.sendMessage("/setpos: that position is not free"); return; } } else { y = getGroundLevel(x,z); } log.info("Transporting " + player.getName() + " to " + x + " " + z + "(" + y + ")" ); Location newLocation = new Location(); newLocation.rotY = player.getPitch(); newLocation.rotX = player.getRotation(); newLocation.x = x + 0.5; newLocation.z = z + 0.5; newLocation.y = y; player.teleportTo(newLocation); player.sendMessage("Whooooooosh"); } } }