diff --git a/src/main/java/net/minecraft/server/TileEntityCommand.java b/src/main/java/net/minecraft/server/TileEntityCommand.java index d9a04faefe..1a8317a485 100644 --- a/src/main/java/net/minecraft/server/TileEntityCommand.java +++ b/src/main/java/net/minecraft/server/TileEntityCommand.java @@ -1,5 +1,11 @@ package net.minecraft.server; +// CraftBukkit start +import java.util.ArrayList; +import java.util.Arrays; +import com.google.common.base.Joiner; +// CraftBukkit end + public class TileEntityCommand extends TileEntity implements ICommandListener { private String a = ""; @@ -16,15 +22,69 @@ public class TileEntityCommand extends TileEntity implements ICommandListener { MinecraftServer minecraftserver = MinecraftServer.getServer(); if (minecraftserver != null && minecraftserver.getEnableCommandBlock()) { - // CraftBukkit start - disable command block TODO: hook this up to bukkit API - // ICommandHandler icommandhandler = minecraftserver.getCommandHandler(); + // CraftBukkit start - handle command block as console TODO: add new CommandSender for this + // Commands in command block must start with / + if (!this.a.startsWith("/")) { + return; + } - // icommandhandler.a(this, this.a); + org.bukkit.command.SimpleCommandMap commandMap = minecraftserver.server.getCommandMap(); + org.bukkit.command.ConsoleCommandSender sender = minecraftserver.server.getConsoleSender(); + Joiner joiner = Joiner.on(" "); + String command = this.a.substring(1); + String[] args = command.split(" "); + ArrayList commands = new ArrayList(); + + // block disallowed commands + if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("kick") || args[0].equalsIgnoreCase("op") || + args[0].equalsIgnoreCase("deop") || args[0].equalsIgnoreCase("ban") || args[0].equalsIgnoreCase("ban-ip") || + args[0].equalsIgnoreCase("pardon") || args[0].equalsIgnoreCase("pardon-ip") || args[0].equalsIgnoreCase("reload")) { + return; + } + + // make sure this is a valid command + if (commandMap.getCommand(args[0]) == null) { + return; + } + + commands.add(args); + + // find positions of command block syntax, if any + for (int i = 0; i < args.length; i++) { + if (PlayerSelector.isPattern(args[i])) { + ArrayList newCommands = new ArrayList(); + for (int j = 0; j < commands.size(); j++) { + newCommands.addAll(this.buildCommands(commands.get(j), i)); + } + commands = newCommands; + } + } + + // now dispatch all of the commands we ended up with + for (int i = 0; i < commands.size(); i++) { + commandMap.dispatch(sender, joiner.join(Arrays.asList(commands.get(i)))); + } // CraftBukkit end } } } + // CraftBukkit start + private ArrayList buildCommands(String[] args, int pos) { + ArrayList commands = new ArrayList(); + EntityPlayer[] players = PlayerSelector.getPlayers(this, args[pos]); + if (players != null) { + for (EntityPlayer player : players) { + String[] command = args.clone(); + command[pos] = player.getLocalizedName(); + commands.add(command); + } + } + + return commands; + } + // CraftBukkit end + public String getName() { return "@"; }