package net.minecraft.command; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.CommandEvent; public class CommandHandler implements ICommandManager { /** Map of Strings to the ICommand objects they represent */ private final Map commandMap = new HashMap(); /** The set of ICommand objects currently loaded. */ private final Set commandSet = new HashSet(); public void executeCommand(ICommandSender par1ICommandSender, String par2Str) { if (par2Str.startsWith("/") || par2Str.startsWith("!")) { par2Str = par2Str.substring(1); } String[] var3 = par2Str.split(" "); String var4 = var3[0]; var3 = dropFirstString(var3); ICommand var5 = (ICommand)this.commandMap.get(var4); int var6 = this.getUsernameIndex(var5, var3); try { if (var5 == null) { throw new CommandNotFoundException(); } if (var5.canCommandSenderUseCommand(par1ICommandSender)) { CommandEvent event = new CommandEvent(var5, par1ICommandSender, var3); if (MinecraftForge.EVENT_BUS.post(event)) { if (event.exception != null) { throw event.exception; } return; } if (var6 > -1) { EntityPlayerMP[] var7 = PlayerSelector.matchPlayers(par1ICommandSender, var3[var6]); String var8 = var3[var6]; EntityPlayerMP[] var9 = var7; int var10 = var7.length; for (int var11 = 0; var11 < var10; ++var11) { EntityPlayerMP var12 = var9[var11]; var3[var6] = var12.getEntityName(); try { var5.processCommand(par1ICommandSender, var3); } catch (PlayerNotFoundException var14) { par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString(var14.getMessage(), var14.getErrorOjbects())); } } var3[var6] = var8; } else { var5.processCommand(par1ICommandSender, var3); } } else { par1ICommandSender.sendChatToPlayer("\u00a7cYou do not have permission to use this command."); } } catch (WrongUsageException var15) { par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString("commands.generic.usage", new Object[] {par1ICommandSender.translateString(var15.getMessage(), var15.getErrorOjbects())})); } catch (CommandException var16) { par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString(var16.getMessage(), var16.getErrorOjbects())); } catch (Throwable var17) { par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString("commands.generic.exception", new Object[0])); var17.printStackTrace(); } } /** * adds the command and any aliases it has to the internal map of available commands */ public ICommand registerCommand(ICommand par1ICommand) { List var2 = par1ICommand.getCommandAliases(); this.commandMap.put(par1ICommand.getCommandName(), par1ICommand); this.commandSet.add(par1ICommand); if (var2 != null) { Iterator var3 = var2.iterator(); while (var3.hasNext()) { String var4 = (String)var3.next(); ICommand var5 = (ICommand)this.commandMap.get(var4); if (var5 == null || !var5.getCommandName().equals(var4)) { this.commandMap.put(var4, par1ICommand); } } } return par1ICommand; } /** * creates a new array and sets elements 0..n-2 to be 0..n-1 of the input (n elements) */ private static String[] dropFirstString(String[] par0ArrayOfStr) { String[] var1 = new String[par0ArrayOfStr.length - 1]; for (int var2 = 1; var2 < par0ArrayOfStr.length; ++var2) { var1[var2 - 1] = par0ArrayOfStr[var2]; } return var1; } /** * Performs a "begins with" string match on each token in par2. Only returns commands that par1 can use. */ public List getPossibleCommands(ICommandSender par1ICommandSender, String par2Str) { String[] var3 = par2Str.split(" ", -1); String var4 = var3[0]; if (var3.length == 1) { ArrayList var8 = new ArrayList(); Iterator var6 = this.commandMap.entrySet().iterator(); while (var6.hasNext()) { Entry var7 = (Entry)var6.next(); if (CommandBase.doesStringStartWith(var4, (String)var7.getKey()) && ((ICommand)var7.getValue()).canCommandSenderUseCommand(par1ICommandSender)) { var8.add(var7.getKey()); } } return var8; } else { if (var3.length > 1) { ICommand var5 = (ICommand)this.commandMap.get(var4); if (var5 != null) { return var5.addTabCompletionOptions(par1ICommandSender, dropFirstString(var3)); } } return null; } } /** * returns all commands that the commandSender can use */ public List getPossibleCommands(ICommandSender par1ICommandSender) { ArrayList var2 = new ArrayList(); Iterator var3 = this.commandSet.iterator(); while (var3.hasNext()) { ICommand var4 = (ICommand)var3.next(); if (var4.canCommandSenderUseCommand(par1ICommandSender)) { var2.add(var4); } } return var2; } /** * returns a map of string to commads. All commands are returned, not just ones which someone has permission to use. */ public Map getCommands() { return this.commandMap; } /** * Return a command's first parameter index containing a valid username. */ private int getUsernameIndex(ICommand par1ICommand, String[] par2ArrayOfStr) { if (par1ICommand == null) { return -1; } else { for (int var3 = 0; var3 < par2ArrayOfStr.length; ++var3) { if (par1ICommand.isUsernameIndex(var3) && PlayerSelector.matchesMultiplePlayers(par2ArrayOfStr[var3])) { return var3; } } return -1; } } }