package org.bukkit.craftbukkit.command;
import net.minecraft.server.MinecraftServer;
import org.apache.commons.lang.Validate;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.RemoteConsoleCommandSender;
import org.bukkit.command.defaults.VanillaCommand;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.entity.CraftMinecartCommand;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.entity.minecart.CommandMinecart;
import org.ultramine.commands.IExtendedCommand;
import java.util.List;
public final class VanillaCommandWrapper extends VanillaCommand
{
private static final Logger log = LogManager.getLogger();
protected final net.minecraft.command.ICommand vanillaCommand;
public VanillaCommandWrapper(net.minecraft.command.ICommand vanillaCommand)
{
super(vanillaCommand.getCommandName());
this.vanillaCommand = vanillaCommand;
}
public VanillaCommandWrapper(net.minecraft.command.ICommand vanillaCommand, String usage)
{
this(vanillaCommand, usage, "A Mojang provided command.", "minecraft.command." + vanillaCommand.getCommandName());
}
public VanillaCommandWrapper(net.minecraft.command.ICommand vanillaCommand, String usage, String description, String permission)
{
super(vanillaCommand.getCommandName());
this.vanillaCommand = vanillaCommand;
this.description = description;
this.usageMessage = usage;
this.setPermission(permission);
}
public VanillaCommandWrapper(IExtendedCommand umCommand)
{
this(umCommand, umCommand.getCommandUsage(MinecraftServer.getServer()), umCommand.getDescription(), null);
}
@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args)
{
if(!testPermission(sender)) return true;
net.minecraft.command.ICommandSender icommandlistener = getListener(sender);
// Some commands use the worldserver variable but we leave it full of null values,
// so we must temporarily populate it with the world of the commandsender
net.minecraft.world.WorldServer[] prev = net.minecraft.server.MinecraftServer.getServer().worldServers;
net.minecraft.server.MinecraftServer.getServer().worldServers = new net.minecraft.world.WorldServer[]{(net.minecraft.world.WorldServer) icommandlistener.getEntityWorld()};
try
{
vanillaCommand.processCommand(icommandlistener, args);
} catch(net.minecraft.command.WrongUsageException exceptionusage)
{
net.minecraft.util.ChatComponentTranslation chatmessage = new net.minecraft.util.ChatComponentTranslation("commands.generic.usage", new Object[]{new net.minecraft.util.ChatComponentTranslation(exceptionusage.getMessage(), exceptionusage.getErrorOjbects())});
chatmessage.getChatStyle().setColor(net.minecraft.util.EnumChatFormatting.RED);
icommandlistener.addChatMessage(chatmessage);
} catch(net.minecraft.command.CommandException commandexception)
{
net.minecraft.util.ChatComponentTranslation chatmessage = new net.minecraft.util.ChatComponentTranslation(commandexception.getMessage(), commandexception.getErrorOjbects());
chatmessage.getChatStyle().setColor(net.minecraft.util.EnumChatFormatting.RED);
icommandlistener.addChatMessage(chatmessage);
} finally
{
net.minecraft.server.MinecraftServer.getServer().worldServers = prev;
}
return true;
}
@Override
public List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException
{
Validate.notNull(sender, "Sender cannot be null");
Validate.notNull(args, "Arguments cannot be null");
Validate.notNull(alias, "Alias cannot be null");
return (List<String>) vanillaCommand.addTabCompletionOptions(getListener(sender), args);
}
public final int dispatchVanillaCommandBlock(net.minecraft.command.server.CommandBlockLogic icommandlistener, String s)
{
// Copied from net.minecraft.server.CommandHandler
s = s.trim();
if(s.startsWith("/"))
{
s = s.substring(1);
}
String as[] = s.split(" ");
as = dropFirstArgument(as);
int i = getPlayerListSize(as);
int j = 0;
// Some commands use the worldserver variable but we leave it full of null values,
// so we must temporarily populate it with the world of the commandsender
net.minecraft.world.WorldServer[] prev = net.minecraft.server.MinecraftServer.getServer().worldServers;
net.minecraft.server.MinecraftServer.getServer().worldServers = new net.minecraft.world.WorldServer[]{(net.minecraft.world.WorldServer) icommandlistener.getEntityWorld()};
try
{
if(vanillaCommand.canCommandSenderUseCommand(icommandlistener))
{
if(i > -1)
{
net.minecraft.entity.player.EntityPlayerMP aentityplayer[] = net.minecraft.command.PlayerSelector.matchPlayers(icommandlistener, as[i]);
String s2 = as[i];
net.minecraft.entity.player.EntityPlayerMP aentityplayer1[] = aentityplayer;
int k = aentityplayer1.length;
for(int l = 0; l < k; )
{
net.minecraft.entity.player.EntityPlayerMP entityplayer = aentityplayer1[l];
as[i] = entityplayer.getCommandSenderName();
try
{
vanillaCommand.processCommand(icommandlistener, as);
j++;
continue;
} catch(net.minecraft.command.CommandException commandexception1)
{
net.minecraft.util.ChatComponentTranslation chatmessage4 = new net.minecraft.util.ChatComponentTranslation(commandexception1.getMessage(), commandexception1.getErrorOjbects());
chatmessage4.getChatStyle().setColor(net.minecraft.util.EnumChatFormatting.RED);
icommandlistener.addChatMessage(chatmessage4);
l++;
}
}
as[i] = s2;
}
else
{
vanillaCommand.processCommand(icommandlistener, as);
j++;
}
}
else
{
net.minecraft.util.ChatComponentTranslation chatmessage = new net.minecraft.util.ChatComponentTranslation("commands.generic.permission", new Object[0]);
chatmessage.getChatStyle().setColor(net.minecraft.util.EnumChatFormatting.RED);
icommandlistener.addChatMessage(chatmessage);
}
} catch(net.minecraft.command.WrongUsageException exceptionusage)
{
net.minecraft.util.ChatComponentTranslation chatmessage1 = new net.minecraft.util.ChatComponentTranslation("commands.generic.usage", new Object[]{new net.minecraft.util.ChatComponentTranslation(exceptionusage.getMessage(), exceptionusage.getErrorOjbects())});
chatmessage1.getChatStyle().setColor(net.minecraft.util.EnumChatFormatting.RED);
icommandlistener.addChatMessage(chatmessage1);
} catch(net.minecraft.command.CommandException commandexception)
{
net.minecraft.util.ChatComponentTranslation chatmessage2 = new net.minecraft.util.ChatComponentTranslation(commandexception.getMessage(), commandexception.getErrorOjbects());
chatmessage2.getChatStyle().setColor(net.minecraft.util.EnumChatFormatting.RED);
icommandlistener.addChatMessage(chatmessage2);
} catch(Throwable throwable)
{
net.minecraft.util.ChatComponentTranslation chatmessage3 = new net.minecraft.util.ChatComponentTranslation("commands.generic.exception", new Object[0]);
chatmessage3.getChatStyle().setColor(net.minecraft.util.EnumChatFormatting.RED);
icommandlistener.addChatMessage(chatmessage3);
log.log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", icommandlistener.getPlayerCoordinates().posX, icommandlistener.getPlayerCoordinates().posY, icommandlistener.getPlayerCoordinates().posZ), throwable);
} finally
{
net.minecraft.server.MinecraftServer.getServer().worldServers = prev;
}
return j;
}
private net.minecraft.command.ICommandSender getListener(CommandSender sender)
{
if(sender instanceof Player)
{
return ((CraftPlayer) sender).getHandle();
}
if(sender instanceof BlockCommandSender)
{
return ((CraftBlockCommandSender) sender).getTileEntity();
}
if(sender instanceof CommandMinecart)
{
return ((net.minecraft.entity.EntityMinecartCommandBlock) ((CraftMinecartCommand) sender).getHandle()).func_145822_e();
}
if(sender instanceof RemoteConsoleCommandSender)
{
return net.minecraft.network.rcon.RConConsoleSource.instance;
}
if(sender instanceof ConsoleCommandSender)
{
return ((CraftServer) sender.getServer()).getServer();
}
return null;
}
private int getPlayerListSize(String as[])
{
for(int i = 0; i < as.length; i++)
{
if(vanillaCommand.isUsernameIndex(as, i) && net.minecraft.command.PlayerSelector.matchesMultiplePlayers(as[i]))
{
return i;
}
}
return -1;
}
private String[] dropFirstArgument(String as[])
{
String as1[] = new String[as.length - 1];
for(int i = 1; i < as.length; i++)
{
as1[i - 1] = as[i];
}
return as1;
}
}