package net.minecraft.server;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.annotation.Nullable;
// CraftBukkit start
import java.util.ArrayList;
import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
import com.google.common.base.Joiner;
import java.util.logging.Level;
// CraftBukkit end
public abstract class CommandBlockListenerAbstract implements ICommandListener {
private static final SimpleDateFormat a = new SimpleDateFormat("HH:mm:ss");
private int b;
private boolean c = true;
private IChatBaseComponent d;
private String e = "";
private String f = "@";
private final CommandObjectiveExecutor g = new CommandObjectiveExecutor();
protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender
public CommandBlockListenerAbstract() {}
public int k() {
return this.b;
}
public void a(int i) {
this.b = i;
}
public IChatBaseComponent l() {
return (IChatBaseComponent) (this.d == null ? new ChatComponentText("") : this.d);
}
public NBTTagCompound a(NBTTagCompound nbttagcompound) {
nbttagcompound.setString("Command", this.e);
nbttagcompound.setInt("SuccessCount", this.b);
nbttagcompound.setString("CustomName", this.f);
nbttagcompound.setBoolean("TrackOutput", this.c);
if (this.d != null && this.c) {
nbttagcompound.setString("LastOutput", IChatBaseComponent.ChatSerializer.a(this.d));
}
this.g.b(nbttagcompound);
return nbttagcompound;
}
public void b(NBTTagCompound nbttagcompound) {
this.e = nbttagcompound.getString("Command");
this.b = nbttagcompound.getInt("SuccessCount");
if (nbttagcompound.hasKeyOfType("CustomName", 8)) {
this.f = nbttagcompound.getString("CustomName");
}
if (nbttagcompound.hasKeyOfType("TrackOutput", 1)) {
this.c = nbttagcompound.getBoolean("TrackOutput");
}
if (nbttagcompound.hasKeyOfType("LastOutput", 8) && this.c) {
try {
this.d = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("LastOutput"));
} catch (Throwable throwable) {
this.d = new ChatComponentText(throwable.getMessage());
}
} else {
this.d = null;
}
this.g.a(nbttagcompound);
}
public boolean a(int i, String s) {
return i <= 2;
}
public void setCommand(String s) {
this.e = s;
this.b = 0;
}
public String getCommand() {
return this.e;
}
public void a(World world) {
if (world.isClientSide) {
this.b = 0;
} else if ("Searge".equalsIgnoreCase(this.e)) {
this.d = new ChatComponentText("#itzlipofutzli");
this.b = 1;
} else {
MinecraftServer minecraftserver = this.B_();
if (minecraftserver != null && minecraftserver.M() && minecraftserver.getEnableCommandBlock()) {
ICommandHandler icommandhandler = minecraftserver.getCommandHandler();
try {
this.d = null;
// CraftBukkit start - Handle command block commands using Bukkit dispatcher
this.b = executeSafely(this, sender, this.e);
// CraftBukkit end
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Executing command block");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Command to be executed");
crashreportsystemdetails.a("Command", new CrashReportCallable() {
public String a() throws Exception {
return CommandBlockListenerAbstract.this.getCommand();
}
public Object call() throws Exception {
return this.a();
}
});
crashreportsystemdetails.a("Name", new CrashReportCallable() {
public String a() throws Exception {
return CommandBlockListenerAbstract.this.getName();
}
public Object call() throws Exception {
return this.a();
}
});
throw new ReportedException(crashreport);
}
} else {
this.b = 0;
}
}
}
public static int executeSafely(ICommandListener sender, org.bukkit.command.CommandSender bSender, String command) {
try {
return executeCommand(sender, bSender, command);
} catch (CommandException commandexception) {
// Taken from CommandHandler
ChatMessage chatmessage = new ChatMessage(commandexception.getMessage(), commandexception.getArgs());
chatmessage.getChatModifier().setColor(EnumChatFormat.RED);
sender.sendMessage(chatmessage);
}
return 0;
}
// CraftBukkit start
public static int executeCommand(ICommandListener sender, org.bukkit.command.CommandSender bSender, String command) throws CommandException {
org.bukkit.command.SimpleCommandMap commandMap = sender.getWorld().getServer().getCommandMap();
Joiner joiner = Joiner.on(" ");
if (command.startsWith("/")) {
command = command.substring(1);
}
String[] args = command.split(" ");
ArrayList<String[]> commands = new ArrayList<String[]>();
String cmd = args[0];
if (cmd.startsWith("minecraft:")) cmd = cmd.substring("minecraft:".length());
if (cmd.startsWith("bukkit:")) cmd = cmd.substring("bukkit:".length());
// Block disallowed commands
if (cmd.equalsIgnoreCase("stop") || cmd.equalsIgnoreCase("kick") || cmd.equalsIgnoreCase("op")
|| cmd.equalsIgnoreCase("deop") || cmd.equalsIgnoreCase("ban") || cmd.equalsIgnoreCase("ban-ip")
|| cmd.equalsIgnoreCase("pardon") || cmd.equalsIgnoreCase("pardon-ip") || cmd.equalsIgnoreCase("reload")) {
return 0;
}
// Handle vanilla commands;
org.bukkit.command.Command commandBlockCommand = commandMap.getCommand(args[0]);
if (sender.getWorld().getServer().getCommandBlockOverride(args[0])) {
commandBlockCommand = commandMap.getCommand("minecraft:" + args[0]);
}
if (commandBlockCommand instanceof VanillaCommandWrapper) {
command = command.trim();
if (command.startsWith("/")) {
command = command.substring(1);
}
String as[] = command.split(" ");
as = VanillaCommandWrapper.dropFirstArgument(as);
if (!((VanillaCommandWrapper) commandBlockCommand).testPermission(bSender)) {
return 0;
}
return ((VanillaCommandWrapper) commandBlockCommand).dispatchVanillaCommand(bSender, sender, as);
}
// Make sure this is a valid command
if (commandMap.getCommand(args[0]) == null) {
return 0;
}
commands.add(args);
// Find positions of command block syntax, if any
WorldServer[] prev = MinecraftServer.getServer().worldServer;
MinecraftServer server = MinecraftServer.getServer();
server.worldServer = new WorldServer[server.worlds.size()];
server.worldServer[0] = (WorldServer) sender.getWorld();
int bpos = 0;
for (int pos = 1; pos < server.worldServer.length; pos++) {
WorldServer world = server.worlds.get(bpos++);
if (server.worldServer[0] == world) {
pos--;
continue;
}
server.worldServer[pos] = world;
}
try {
ArrayList<String[]> newCommands = new ArrayList<String[]>();
for (int i = 0; i < args.length; i++) {
if (PlayerSelector.isPattern(args[i])) {
for (int j = 0; j < commands.size(); j++) {
newCommands.addAll(buildCommands(sender, commands.get(j), i));
}
ArrayList<String[]> temp = commands;
commands = newCommands;
newCommands = temp;
newCommands.clear();
}
}
} finally {
MinecraftServer.getServer().worldServer = prev;
}
int completed = 0;
// Now dispatch all of the commands we ended up with
for (int i = 0; i < commands.size(); i++) {
try {
if (commandMap.dispatch(bSender, joiner.join(java.util.Arrays.asList(commands.get(i))))) {
completed++;
}
} catch (Throwable exception) {
if (sender.f() instanceof EntityMinecartCommandBlock) {
MinecraftServer.getServer().server.getLogger().log(Level.WARNING, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", sender.getChunkCoordinates().getX(), sender.getChunkCoordinates().getY(), sender.getChunkCoordinates().getZ()), exception);
} else if (sender instanceof CommandBlockListenerAbstract) {
CommandBlockListenerAbstract listener = (CommandBlockListenerAbstract) sender;
MinecraftServer.getServer().server.getLogger().log(Level.WARNING, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), exception);
} else {
MinecraftServer.getServer().server.getLogger().log(Level.WARNING, String.format("Unknown CommandBlock failed to handle command"), exception);
}
}
}
return completed;
}
private static ArrayList<String[]> buildCommands(ICommandListener sender, String[] args, int pos) throws CommandException {
ArrayList<String[]> commands = new ArrayList<String[]>();
java.util.List<EntityPlayer> players = (java.util.List<EntityPlayer>)PlayerSelector.getPlayers(sender, args[pos], EntityPlayer.class);
if (players != null) {
for (EntityPlayer player : players) {
if (player.world != sender.getWorld()) {
continue;
}
String[] command = args.clone();
command[pos] = player.getName();
commands.add(command);
}
}
return commands;
}
// CraftBukkit end
public String getName() {
return this.f;
}
public IChatBaseComponent getScoreboardDisplayName() {
return new ChatComponentText(this.getName());
}
public void setName(String s) {
this.f = s;
}
public void sendMessage(IChatBaseComponent ichatbasecomponent) {
if (this.c && this.getWorld() != null && !this.getWorld().isClientSide) {
this.d = (new ChatComponentText("[" + CommandBlockListenerAbstract.a.format(new Date()) + "] ")).addSibling(ichatbasecomponent);
this.i();
}
}
public boolean getSendCommandFeedback() {
MinecraftServer minecraftserver = this.B_();
return minecraftserver == null || !minecraftserver.M() || minecraftserver.worldServer[0].getGameRules().getBoolean("commandBlockOutput");
}
public void a(CommandObjectiveExecutor.EnumCommandResult commandobjectiveexecutor_enumcommandresult, int i) {
this.g.a(this.B_(), this, commandobjectiveexecutor_enumcommandresult, i);
}
public abstract void i();
public void b(@Nullable IChatBaseComponent ichatbasecomponent) {
this.d = ichatbasecomponent;
}
public void a(boolean flag) {
this.c = flag;
}
public boolean n() {
return this.c;
}
public boolean a(EntityHuman entityhuman) {
if (!entityhuman.dk()) {
return false;
} else {
if (entityhuman.getWorld().isClientSide) {
entityhuman.a(this);
}
return true;
}
}
public CommandObjectiveExecutor o() {
return this.g;
}
}