--- miscJava/minecraft-plugins/setposplugin/src/Setpos.java 2010/10/15 12:34:50 1166 +++ miscJava/minecraft-plugins/hoeruputils/src/HoerupUtils.java 2010/12/04 11:38:36 1201 @@ -1,28 +1,140 @@ import java.util.logging.*; +import java.util.*; -public class Setpos extends Plugin { +public class HoerupUtils extends Plugin { - final static Logger log = Logger.getLogger("SetposPlugin"); + final static Logger log = Logger.getLogger("HoerupUtils"); + + 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", ""); + e.addCommand("/slopearea", ""); + e.addCommand("/admindestroy",""); + } @Override - public void disable() {} + public void enable() { + registerCommands(); + } @Override - public void enable() {} + public void disable() { + etc e = etc.getInstance(); + e.removeCommand("/setpos"); + e.removeCommand("/whereis"); + e.removeCommand("/fillarea"); + e.removeCommand("/levelarea"); + e.removeCommand("/setsurface"); + e.removeCommand("/slopearea"); + e.removeCommand("/admindestroy"); + } + @Override public void initialize() { PluginLoader loader = etc.getLoader(); - loader.addListener( PluginLoader.Hook.COMMAND, new RealSetposPlugin(), this, PluginListener.Priority.MEDIUM ); + loader.addListener( PluginLoader.Hook.COMMAND, new HoerupUtilsPlugin(), this, PluginListener.Priority.MEDIUM ); + loader.addListener( PluginLoader.Hook.LOGIN, new ConnectedUsers(), this, PluginListener.Priority.MEDIUM ); + + Jail j = new Jail(); + loader.addListener( PluginLoader.Hook.TELEPORT, j, this, PluginListener.Priority.MEDIUM); + loader.addListener( PluginLoader.Hook.COMMAND, j, this, PluginListener.Priority.MEDIUM ); + loader.addListener( PluginLoader.Hook.PLAYER_MOVE, j, this, PluginListener.Priority.MEDIUM ); + + AdminDestroy adm = new AdminDestroy(); + loader.addListener( PluginLoader.Hook.COMMAND, adm, this, PluginListener.Priority.MEDIUM); + loader.addListener( PluginLoader.Hook.BLOCK_DESTROYED, adm, this, PluginListener.Priority.MEDIUM ); + loader.addListener( PluginLoader.Hook.DISCONNECT, adm, this, PluginListener.Priority.MEDIUM ); + + + registerCommands(); } - public static class RealSetposPlugin extends PluginListener { - final static String USAGE = "Usage: /setpos [height]"; - final static int AIRBLOCK = 0; //block id = 0 is air + class ConnectedUsers extends PluginListener { + public void onLogin(Player player) { + List players = etc.getServer().getPlayerList(); + int count = players.size(); + + StringBuilder sb = new StringBuilder(); + for (int i=0; i0) + sb.append(" "); + sb.append( players.get(i).getName() ); + } + + player.sendMessage(Colors.Red + "Connected users " + count + ": " + Colors.White + sb.toString() ); + } + } + + + public static String getBearingStr(int angle) { + if (angle < 22) { + return "N"; + } else if (angle < 67) { + return "NE"; + } else if (angle < 112) { + return "E"; + } else if (angle < 157) { + return "SE"; + } else if (angle < 202) { + return "S"; + } else if (angle < 257) { + return "SW"; + } else if (angle < 292) { + return "W"; + } else if (angle < 337) { + return "NW"; + } else { + return "N"; + } + } + + public static int calcDistance(Location loc1, Location loc2) { + double distX = loc1.x - loc2.x ; + double distZ = loc1.z - loc2.z ; + + int dist = (int) Math.round( Math.sqrt( (distX*distX) + (distZ*distZ)) ); + + return dist; + } + + public static int calcBearing(Location loc1, Location loc2) { + double distX = loc1.x - loc2.x ; + double distZ = loc1.z - loc2.z ; + + 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; + } + + return (int) angle; + } + + 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; + + private HashMap commands = new HashMap(); @@ -57,25 +169,250 @@ private boolean isFree(int x, int y, int z) { Server srv = etc.getServer(); - return (srv.getBlockIdAt(x,y,z) == AIRBLOCK && srv.getBlockIdAt(x,y+1,z) == AIRBLOCK); + return (srv.getBlockIdAt(x,y,z) == BLOCK_AIR && srv.getBlockIdAt(x,y+1,z) == BLOCK_AIR); } + public void slopeArea(Player player, java.lang.String[] split) { + int radius = Integer.parseInt(split[1]); + + System.out.println("Player " + player.getName() + " used slopearea 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++) { + + + int xdist = Math.abs(playerX-x); + int zdist = Math.abs(playerZ-z); + int dist = Math.max(xdist,zdist); + + //for (int y=playerY; y<=playerY+radius; y++) { + for (int y=(playerY+dist); y<=128; y++) { + srv.setBlockAt(BLOCK_AIR, x, y, z); + } + + } + + } + } @Override public boolean onCommand(Player player, java.lang.String[] split) { - if( split[0].equals("/setpos") ) { + if (! player.canUseCommand(split[0]) ) { + return false; + } + + if ( split[0].equals("/levelarea") || split[0].equals("/la") || split[0].equals("/slopearea") || split[0].equals("/fillarea") || split[0].equals("/setsurface") ) { + commands.put(player.getName(), split); + } + + if ( split[0].equals("//") ) { + String cmd[] = commands.get(player.getName() ); + if (cmd != null) { + onCommand(player, commands.get(player.getName() ) ); + } else { + player.sendMessage("//: no recorded command found"); + } + return true; + } else if( split[0].equals("/setpos") && player.canUseCommand("/setpos") ) { setPos(player, split); return true; - } else if ( split[0].equals("/whereis" ) ) { + } else if ( split[0].equals("/whereis" ) && player.canUseCommand("/whereis")) { whereIs(player, split); return true; + } else if ( (split[0].equals("/levelarea") || split[0].equals("/la")) && player.canUseCommand("/levelarea")) { + if (validateLevelOrFill(player,split)) { + levelArea(player, split); + } + return true; + } else if (split[0].equals("/slopearea") ) { + if (validateLevelOrFill(player,split)) { + slopeArea(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); y"); + if (split.length < 2 || split.length >3) { + p1.sendMessage( Colors.Rose + "usage: /whereis (playername|home|warp) " ); return; } - Player p2 = etc.getServer().getPlayer(split[1]); - if (p2 == null) { - p1.sendMessage( Colors.Rose + "whereis: no player named " + split[1] ); - return; - } Location loc1 = p1.getLocation(); - Location loc2 = p2.getLocation(); - //Location loc2 = new Location(); - //loc2.x = loc2.y = loc2.z = 0; + Location loc2; + String name2; -//System.out.println("p1: " + loc1.x + "," + loc1.z ); -//System.out.println("p2: " + loc2.x + "," + loc2.z ); + 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]; + - double distX = loc1.x - loc2.x ; - double distZ = loc1.z - loc2.z ; + } else { - int dist = (int) Math.round( Math.sqrt( (distX*distX) + (distZ*distZ)) ); -/*System.out.println("distX:" + distX ); -System.out.println("distZ:" + distZ ); + Player p2 = etc.getServer().getPlayer(split[1]); -System.out.println(">> " + (distZ / distX ) );*/ + if (p2 == null) { + p1.sendMessage( Colors.Rose + "whereis: no player named " + split[1] ); + return; + } + + loc2 = p2.getLocation(); + name2 = p2.getName(); + } - double angle = Math.toDegrees( Math.atan( distZ / distX ) ); - if (angle < 0.0) - angle += 90.0; + int dist = calcDistance(loc1, loc2); + int angle = calcBearing(loc1, loc2); - 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 + p2.getName() + " is at x:" + roundToPlaces(p2.getX(),2) + " y:" + roundToPlaces(p2.getY(),2) + " z: " + roundToPlaces(p2.getZ(),2) ); + 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) + ")" ); + p1.sendMessage( Colors.Yellow + "Bearing: " + angle + " (" + getBearingStr( angle) + ")" );