package dk.thoerup.bukkit.hoeruputils; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class WhereisCommand implements CommandExecutor { Server server; public WhereisCommand(Server server) { this.server = server; } @Override public boolean onCommand(final CommandSender sender, Command command, String label, String[] args) { /* if (!(sender instanceof Player)) { sender.sendMessage("Whereis: What are you"); return true; }*/ if (args.length != 1) { sender.sendMessage("Usage: /whereis "); return true; } Player target = server.getPlayer(args[0]); if (target == null) { sender.sendMessage("Whereis: Could not find player: " + args[0] ); return true; } Location targetLoc = target.getLocation(); Player player = (Player) sender; if (player.getLocation().getWorld() != targetLoc.getWorld()) { sender.sendMessage("Whereis: player " + args[0] + " is in another world: " + targetLoc.getWorld().getName() ); return true; } int dist = calcDistance(player.getLocation(), targetLoc); int bearing = calcBearing(player.getLocation(), targetLoc); //target.sendMessage("Whereis: you are tracked by " + player.getName() ); player.sendMessage( ChatColor.WHITE + String.format("Whereis: %s is at %d,%d,%d", target.getName(), (int)targetLoc.getX(), (int)targetLoc.getY(), (int)targetLoc.getZ()) ); player.sendMessage( ChatColor.WHITE + "Distance: " + dist + ", bearing: " + bearing + "(" + getBearingStr(bearing) + ")" ); return true; } 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.getX() - loc2.getX() ; double distZ = loc1.getZ() - loc2.getZ() ; int dist = (int) Math.round( Math.sqrt( (distX*distX) + (distZ*distZ)) ); return dist; } public static int calcBearing(Location loc1, Location loc2) { double distX = loc1.getX() - loc2.getX() ; double distZ = loc1.getZ() - loc2.getZ() ; 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; } }