Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 418 lines 24 kB view raw
1package net.minecraft.server; 2 3import org.bukkit.craftbukkit.command.ServerCommandListener; 4import org.bukkit.craftbukkit.entity.CraftPlayer; 5 6import java.util.Iterator; 7import java.util.Set; 8import java.util.logging.Logger; 9 10// CraftBukkit start 11// CraftBukkit end 12 13public class ConsoleCommandHandler { 14 15 private static Logger a = Logger.getLogger("Minecraft"); 16 private MinecraftServer server; 17 private ICommandListener listener; // CraftBukkit 18 19 public ConsoleCommandHandler(MinecraftServer minecraftserver) { 20 this.server = minecraftserver; 21 } 22 23 // Craftbukkit start 24 private boolean hasPermission(ICommandListener listener, String perm) { 25 if (listener instanceof ServerCommandListener) { 26 ServerCommandListener serv = (ServerCommandListener) listener; 27 return serv.getSender().hasPermission(perm); 28 } else if (listener instanceof NetServerHandler) { 29 NetServerHandler net = (NetServerHandler) listener; 30 return net.getPlayer().hasPermission(perm); 31 } else if ((listener instanceof ServerGUI) || (listener instanceof MinecraftServer)) { 32 return server.console.hasPermission(perm); 33 } 34 35 return false; 36 } 37 38 private boolean checkPermission(ICommandListener listener, String command) { 39 if (hasPermission(listener, "bukkit.command." + command)) { 40 return true; 41 } else { 42 listener.sendMessage("I'm sorry, Dave, but I cannot let you do that."); 43 return false; 44 } 45 } 46 // Craftbukkit end 47 48 public boolean handle(ServerCommand servercommand) { // CraftBukkit - returns boolean 49 String s = servercommand.command; 50 ICommandListener icommandlistener = servercommand.b; 51 String s1 = icommandlistener.getName(); 52 this.listener = icommandlistener; // CraftBukkit 53 ServerConfigurationManager serverconfigurationmanager = this.server.serverConfigurationManager; 54 55 if (!s.toLowerCase().startsWith("help") && !s.toLowerCase().startsWith("?")) { 56 if (s.toLowerCase().startsWith("list")) { 57 if (!checkPermission(listener, "list")) return true; // Craftbukkit 58 icommandlistener.sendMessage("Connected players: " + serverconfigurationmanager.c()); 59 } else if (s.toLowerCase().startsWith("stop")) { 60 if (!checkPermission(listener, "stop")) return true; // Craftbukkit 61 this.print(s1, "Stopping the server.."); 62 this.server.a(); 63 } else { 64 int i; 65 WorldServer worldserver; 66 67 if (s.toLowerCase().startsWith("save-all")) { 68 if (!checkPermission(listener, "save.perform")) return true; // Craftbukkit 69 this.print(s1, "Forcing save.."); 70 if (serverconfigurationmanager != null) { 71 serverconfigurationmanager.savePlayers(); 72 } 73 74 // CraftBukkit start 75 for (i = 0; i < this.server.worlds.size(); ++i) { 76 worldserver = this.server.worlds.get(i); 77 boolean save = worldserver.canSave; 78 worldserver.canSave = false; 79 worldserver.save(true, (IProgressUpdate) null); 80 worldserver.canSave = save; 81 } 82 // CraftBukkit end 83 84 this.print(s1, "Save complete."); 85 } else if (s.toLowerCase().startsWith("save-off")) { 86 if (!checkPermission(listener, "save.disable")) return true; // Craftbukkit 87 this.print(s1, "Disabling level saving.."); 88 89 for (i = 0; i < this.server.worlds.size(); ++i) { // CraftBukkit 90 worldserver = this.server.worlds.get(i); // CraftBukkit 91 worldserver.canSave = true; 92 } 93 } else if (s.toLowerCase().startsWith("save-on")) { 94 if (!checkPermission(listener, "save.enable")) return true; // Craftbukkit 95 this.print(s1, "Enabling level saving.."); 96 97 for (i = 0; i < this.server.worlds.size(); ++i) { // CraftBukkit 98 worldserver = this.server.worlds.get(i); // CraftBukkit 99 worldserver.canSave = false; 100 } 101 } else { 102 String s2; 103 104 if (s.toLowerCase().startsWith("op ")) { 105 if (!checkPermission(listener, "op.give")) return true; // Craftbukkit 106 s2 = s.substring(s.indexOf(" ")).trim(); 107 serverconfigurationmanager.e(s2); 108 this.print(s1, "Opping " + s2); 109 serverconfigurationmanager.a(s2, "\u00A7eYou are now op!"); 110 } else if (s.toLowerCase().startsWith("deop ")) { 111 if (!checkPermission(listener, "op.take")) return true; // Craftbukkit 112 s2 = s.substring(s.indexOf(" ")).trim(); 113 serverconfigurationmanager.f(s2); 114 serverconfigurationmanager.a(s2, "\u00A7eYou are no longer op!"); 115 this.print(s1, "De-opping " + s2); 116 } else if (s.toLowerCase().startsWith("ban-ip ")) { 117 if (!checkPermission(listener, "ban.ip")) return true; // Craftbukkit 118 s2 = s.substring(s.indexOf(" ")).trim(); 119 serverconfigurationmanager.c(s2); 120 this.print(s1, "Banning ip " + s2); 121 } else if (s.toLowerCase().startsWith("pardon-ip ")) { 122 if (!checkPermission(listener, "unban.ip")) return true; // Craftbukkit 123 s2 = s.substring(s.indexOf(" ")).trim(); 124 serverconfigurationmanager.d(s2); 125 this.print(s1, "Pardoning ip " + s2); 126 } else { 127 EntityPlayer entityplayer; 128 129 if (s.toLowerCase().startsWith("ban ")) { 130 if (!checkPermission(listener, "ban.player")) return true; // Craftbukkit 131 s2 = s.substring(s.indexOf(" ")).trim(); 132 serverconfigurationmanager.a(s2); 133 this.print(s1, "Banning " + s2); 134 entityplayer = serverconfigurationmanager.i(s2); 135 if (entityplayer != null) { 136 entityplayer.netServerHandler.disconnect("Banned by admin"); 137 } 138 } else if (s.toLowerCase().startsWith("pardon ")) { 139 if (!checkPermission(listener, "unban.player")) return true; // Craftbukkit 140 s2 = s.substring(s.indexOf(" ")).trim(); 141 serverconfigurationmanager.b(s2); 142 this.print(s1, "Pardoning " + s2); 143 } else { 144 int j; 145 146 if (s.toLowerCase().startsWith("kick ")) { 147 if (!checkPermission(listener, "kick")) return true; // Craftbukkit 148 // CraftBukkit start - Add kick message compatibility 149 String[] parts = s.split(" "); 150 s2 = parts.length >= 2 ? parts[1] : ""; 151 // CraftBukkit end 152 entityplayer = null; 153 154 for (j = 0; j < serverconfigurationmanager.players.size(); ++j) { 155 EntityPlayer entityplayer1 = (EntityPlayer) serverconfigurationmanager.players.get(j); 156 157 if (entityplayer1.name.equalsIgnoreCase(s2)) { 158 entityplayer = entityplayer1; 159 } 160 } 161 162 if (entityplayer != null) { 163 entityplayer.netServerHandler.disconnect("Kicked by admin"); 164 this.print(s1, "Kicking " + entityplayer.name); 165 } else { 166 icommandlistener.sendMessage("Can\'t find user " + s2 + ". No kick."); 167 } 168 } else { 169 EntityPlayer entityplayer2; 170 String[] astring; 171 172 if (s.toLowerCase().startsWith("tp ")) { 173 if (!checkPermission(listener, "teleport")) return true; // Craftbukkit 174 astring = s.split(" "); 175 if (astring.length == 3) { 176 entityplayer = serverconfigurationmanager.i(astring[1]); 177 entityplayer2 = serverconfigurationmanager.i(astring[2]); 178 if (entityplayer == null) { 179 icommandlistener.sendMessage("Can\'t find user " + astring[1] + ". No tp."); 180 } else if (entityplayer2 == null) { 181 icommandlistener.sendMessage("Can\'t find user " + astring[2] + ". No tp."); 182 } else if (entityplayer.dimension != entityplayer2.dimension) { 183 icommandlistener.sendMessage("User " + astring[1] + " and " + astring[2] + " are in different dimensions. No tp."); 184 } else { 185 entityplayer.netServerHandler.a(entityplayer2.locX, entityplayer2.locY, entityplayer2.locZ, entityplayer2.yaw, entityplayer2.pitch); 186 this.print(s1, "Teleporting " + astring[1] + " to " + astring[2] + "."); 187 } 188 } else { 189 icommandlistener.sendMessage("Syntax error, please provice a source and a target."); 190 } 191 } else { 192 String s3; 193 int k; 194 195 if (s.toLowerCase().startsWith("give ")) { 196 if (!checkPermission(listener, "give")) return true; // Craftbukkit 197 astring = s.split(" "); 198 if (astring.length != 3 && astring.length != 4) { 199 return true; // CraftBukkit 200 } 201 202 s3 = astring[1]; 203 entityplayer2 = serverconfigurationmanager.i(s3); 204 if (entityplayer2 != null) { 205 try { 206 k = Integer.parseInt(astring[2]); 207 if (Item.byId[k] != null) { 208 this.print(s1, "Giving " + entityplayer2.name + " some " + k); 209 int l = 1; 210 211 if (astring.length > 3) { 212 l = this.a(astring[3], 1); 213 } 214 215 if (l < 1) { 216 l = 1; 217 } 218 219 if (l > 64) { 220 l = 64; 221 } 222 223 entityplayer2.b(new ItemStack(k, l, 0)); 224 } else { 225 icommandlistener.sendMessage("There\'s no item with id " + k); 226 } 227 } catch (NumberFormatException numberformatexception) { 228 icommandlistener.sendMessage("There\'s no item with id " + astring[2]); 229 } 230 } else { 231 icommandlistener.sendMessage("Can\'t find user " + s3); 232 } 233 } else if (s.toLowerCase().startsWith("time ")) { 234 astring = s.split(" "); 235 if (astring.length != 3) { 236 return true; // CraftBukkit 237 } 238 239 s3 = astring[1]; 240 241 try { 242 j = Integer.parseInt(astring[2]); 243 WorldServer worldserver1; 244 245 if ("add".equalsIgnoreCase(s3)) { 246 if (!checkPermission(listener, "time.add")) return true; // Craftbukkit 247 for (k = 0; k < this.server.worlds.size(); ++k) { // CraftBukkit 248 worldserver1 = this.server.worlds.get(k); // CraftBukkit 249 worldserver1.setTimeAndFixTicklists(worldserver1.getTime() + (long) j); 250 } 251 252 this.print(s1, "Added " + j + " to time"); 253 } else if ("set".equalsIgnoreCase(s3)) { 254 if (!checkPermission(listener, "time.set")) return true; // Craftbukkit 255 for (k = 0; k < this.server.worlds.size(); ++k) { // CraftBukkit 256 worldserver1 = this.server.worlds.get(k); // CraftBukkit 257 worldserver1.setTimeAndFixTicklists((long) j); 258 } 259 260 this.print(s1, "Set time to " + j); 261 } else { 262 icommandlistener.sendMessage("Unknown method, use either \"add\" or \"set\""); 263 } 264 } catch (NumberFormatException numberformatexception1) { 265 icommandlistener.sendMessage("Unable to convert time value, " + astring[2]); 266 } 267 } else if (s.toLowerCase().startsWith("say ")) { 268 if (!checkPermission(listener, "say")) return true; // Craftbukkit 269 s = s.substring(s.indexOf(" ")).trim(); 270 a.info("[" + s1 + "] " + s); 271 serverconfigurationmanager.sendAll(new Packet3Chat("\u00A7d[Server] " + s)); 272 } else if (s.toLowerCase().startsWith("tell ")) { 273 if (!checkPermission(listener, "tell")) return true; // Craftbukkit 274 astring = s.split(" "); 275 if (astring.length >= 3) { 276 s = s.substring(s.indexOf(" ")).trim(); 277 s = s.substring(s.indexOf(" ")).trim(); 278 a.info("[" + s1 + "->" + astring[1] + "] " + s); 279 s = "\u00A77" + s1 + " whispers " + s; 280 a.info(s); 281 if (!serverconfigurationmanager.a(astring[1], (Packet) (new Packet3Chat(s)))) { 282 icommandlistener.sendMessage("There\'s no player by that name online."); 283 } 284 } 285 } else if (s.toLowerCase().startsWith("whitelist ")) { 286 this.a(s1, s, icommandlistener); 287 } else { 288 icommandlistener.sendMessage("Unknown console command. Type \"help\" for help."); // CraftBukkit 289 return false; // CraftBukkit 290 } 291 } 292 } 293 } 294 } 295 } 296 } 297 } else { 298 if (!checkPermission(listener, "help")) return true; // Craftbukkit 299 this.a(icommandlistener); 300 } 301 302 return true; // CraftBukkit 303 } 304 305 private void a(String s, String s1, ICommandListener icommandlistener) { 306 String[] astring = s1.split(" "); 307 this.listener = icommandlistener; // CraftBukkit 308 309 if (astring.length >= 2) { 310 String s2 = astring[1].toLowerCase(); 311 312 if ("on".equals(s2)) { 313 if (!checkPermission(listener, "whitelist.enable")) return; // Craftbukkit 314 this.print(s, "Turned on white-listing"); 315 this.server.propertyManager.b("white-list", true); 316 } else if ("off".equals(s2)) { 317 if (!checkPermission(listener, "whitelist.disable")) return; // Craftbukkit 318 this.print(s, "Turned off white-listing"); 319 this.server.propertyManager.b("white-list", false); 320 } else if ("list".equals(s2)) { 321 if (!checkPermission(listener, "whitelist.list")) return; // Craftbukkit 322 Set set = this.server.serverConfigurationManager.e(); 323 String s3 = ""; 324 325 String s4; 326 327 for (Iterator iterator = set.iterator(); iterator.hasNext(); s3 = s3 + s4 + " ") { 328 s4 = (String) iterator.next(); 329 } 330 331 icommandlistener.sendMessage("White-listed players: " + s3); 332 } else { 333 String s5; 334 335 if ("add".equals(s2) && astring.length == 3) { 336 if (!checkPermission(listener, "whitelist.add")) return; // Craftbukkit 337 s5 = astring[2].toLowerCase(); 338 this.server.serverConfigurationManager.k(s5); 339 this.print(s, "Added " + s5 + " to white-list"); 340 } else if ("remove".equals(s2) && astring.length == 3) { 341 if (!checkPermission(listener, "whitelist.remove")) return; // Craftbukkit 342 s5 = astring[2].toLowerCase(); 343 this.server.serverConfigurationManager.l(s5); 344 this.print(s, "Removed " + s5 + " from white-list"); 345 } else if ("reload".equals(s2)) { 346 if (!checkPermission(listener, "whitelist.reload")) return; // Craftbukkit 347 this.server.serverConfigurationManager.f(); 348 this.print(s, "Reloaded white-list from file"); 349 } 350 } 351 } 352 } 353 354 private void a(ICommandListener icommandlistener) { 355 icommandlistener.sendMessage("To run the server without a gui, start it like this:"); 356 icommandlistener.sendMessage(" java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui"); 357 icommandlistener.sendMessage("Console commands:"); 358 icommandlistener.sendMessage(" help or ? shows this message"); 359 icommandlistener.sendMessage(" kick <player> removes a player from the server"); 360 icommandlistener.sendMessage(" ban <player> bans a player from the server"); 361 icommandlistener.sendMessage(" pardon <player> pardons a banned player so that they can connect again"); 362 icommandlistener.sendMessage(" ban-ip <ip> bans an IP address from the server"); 363 icommandlistener.sendMessage(" pardon-ip <ip> pardons a banned IP address so that they can connect again"); 364 icommandlistener.sendMessage(" op <player> turns a player into an op"); 365 icommandlistener.sendMessage(" deop <player> removes op status from a player"); 366 icommandlistener.sendMessage(" tp <player1> <player2> moves one player to the same location as another player"); 367 icommandlistener.sendMessage(" give <player> <id> [num] gives a player a resource"); 368 icommandlistener.sendMessage(" tell <player> <message> sends a private message to a player"); 369 icommandlistener.sendMessage(" stop gracefully stops the server"); 370 icommandlistener.sendMessage(" save-all forces a server-wide level save"); 371 icommandlistener.sendMessage(" save-off disables terrain saving (useful for backup scripts)"); 372 icommandlistener.sendMessage(" save-on re-enables terrain saving"); 373 icommandlistener.sendMessage(" list lists all currently connected players"); 374 icommandlistener.sendMessage(" say <message> broadcasts a message to all players"); 375 icommandlistener.sendMessage(" time <add|set> <amount> adds to or sets the world time (0-24000)"); 376 } 377 378 private void print(String s, String s1) { 379 String s2 = s + ": " + s1; 380 381 // CraftBukkit start 382 this.listener.sendMessage(s1); 383 this.informOps("\u00A77(" + s2 + ")"); 384 if (this.listener instanceof MinecraftServer) { 385 return; // Already logged so don't call a.info() 386 } 387 // CraftBukkit end 388 a.info(s2); 389 } 390 391 // CraftBukkit start 392 private void informOps(String msg) { 393 Packet3Chat packet3chat = new Packet3Chat(msg); 394 EntityPlayer sender = null; 395 if (this.listener instanceof ServerCommandListener) { 396 org.bukkit.command.CommandSender commandSender = ((ServerCommandListener) this.listener).getSender(); 397 if (commandSender instanceof CraftPlayer) { 398 sender = ((CraftPlayer) commandSender).getHandle(); 399 } 400 } 401 java.util.List<EntityPlayer> players = this.server.serverConfigurationManager.players; 402 for (int i = 0; i < players.size(); ++i) { 403 EntityPlayer entityPlayer = (EntityPlayer) players.get(i); 404 if (sender != entityPlayer && this.server.serverConfigurationManager.isOp(entityPlayer.name)) { 405 entityPlayer.netServerHandler.sendPacket(packet3chat); 406 } 407 } 408 } 409 // CraftBukkit end 410 411 private int a(String s, int i) { 412 try { 413 return Integer.parseInt(s); 414 } catch (NumberFormatException numberformatexception) { 415 return i; 416 } 417 } 418}