001 package net.minecraft.src; 002 003 import java.util.ArrayList; 004 import java.util.HashMap; 005 import java.util.HashSet; 006 import java.util.Iterator; 007 import java.util.List; 008 import java.util.Map; 009 import java.util.Set; 010 import java.util.Map.Entry; 011 012 import net.minecraftforge.common.MinecraftForge; 013 import net.minecraftforge.event.CommandEvent; 014 015 public class CommandHandler implements ICommandManager 016 { 017 /** Map of Strings to the ICommand objects they represent */ 018 private final Map commandMap = new HashMap(); 019 020 /** The set of ICommand objects currently loaded. */ 021 private final Set commandSet = new HashSet(); 022 023 public void executeCommand(ICommandSender par1ICommandSender, String par2Str) 024 { 025 if (par2Str.startsWith("/")) 026 { 027 par2Str = par2Str.substring(1); 028 } 029 030 String[] var3 = par2Str.split(" "); 031 String var4 = var3[0]; 032 var3 = dropFirstString(var3); 033 ICommand var5 = (ICommand)this.commandMap.get(var4); 034 int var6 = this.func_82370_a(var5, var3); 035 036 try 037 { 038 if (var5 == null) 039 { 040 throw new CommandNotFoundException(); 041 } 042 043 if (var5.canCommandSenderUseCommand(par1ICommandSender)) 044 { 045 CommandEvent event = new CommandEvent(var5, par1ICommandSender, var3); 046 if (MinecraftForge.EVENT_BUS.post(event)) 047 { 048 if (event.exception != null) 049 { 050 throw event.exception; 051 } 052 return; 053 } 054 055 if (var6 > -1) 056 { 057 EntityPlayerMP[] var7 = PlayerSelector.func_82380_c(par1ICommandSender, var3[var6]); 058 String var8 = var3[var6]; 059 EntityPlayerMP[] var9 = var7; 060 int var10 = var7.length; 061 062 for (int var11 = 0; var11 < var10; ++var11) 063 { 064 EntityPlayerMP var12 = var9[var11]; 065 var3[var6] = var12.getEntityName(); 066 067 try 068 { 069 var5.processCommand(par1ICommandSender, var3); 070 } 071 catch (PlayerNotFoundException var14) 072 { 073 par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString(var14.getMessage(), var14.getErrorOjbects())); 074 } 075 } 076 077 var3[var6] = var8; 078 } 079 else 080 { 081 var5.processCommand(par1ICommandSender, var3); 082 } 083 } 084 else 085 { 086 par1ICommandSender.sendChatToPlayer("\u00a7cYou do not have permission to use this command."); 087 } 088 } 089 catch (WrongUsageException var15) 090 { 091 par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString("commands.generic.usage", new Object[] {par1ICommandSender.translateString(var15.getMessage(), var15.getErrorOjbects())})); 092 } 093 catch (CommandException var16) 094 { 095 par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString(var16.getMessage(), var16.getErrorOjbects())); 096 } 097 catch (Throwable var17) 098 { 099 par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString("commands.generic.exception", new Object[0])); 100 var17.printStackTrace(); 101 } 102 } 103 104 /** 105 * adds the command and any aliases it has to the internal map of available commands 106 */ 107 public ICommand registerCommand(ICommand par1ICommand) 108 { 109 List var2 = par1ICommand.getCommandAliases(); 110 this.commandMap.put(par1ICommand.getCommandName(), par1ICommand); 111 this.commandSet.add(par1ICommand); 112 113 if (var2 != null) 114 { 115 Iterator var3 = var2.iterator(); 116 117 while (var3.hasNext()) 118 { 119 String var4 = (String)var3.next(); 120 ICommand var5 = (ICommand)this.commandMap.get(var4); 121 122 if (var5 == null || !var5.getCommandName().equals(var4)) 123 { 124 this.commandMap.put(var4, par1ICommand); 125 } 126 } 127 } 128 129 return par1ICommand; 130 } 131 132 /** 133 * creates a new array and sets elements 0..n-2 to be 0..n-1 of the input (n elements) 134 */ 135 private static String[] dropFirstString(String[] par0ArrayOfStr) 136 { 137 String[] var1 = new String[par0ArrayOfStr.length - 1]; 138 139 for (int var2 = 1; var2 < par0ArrayOfStr.length; ++var2) 140 { 141 var1[var2 - 1] = par0ArrayOfStr[var2]; 142 } 143 144 return var1; 145 } 146 147 /** 148 * Performs a "begins with" string match on each token in par2. Only returns commands that par1 can use. 149 */ 150 public List getPossibleCommands(ICommandSender par1ICommandSender, String par2Str) 151 { 152 String[] var3 = par2Str.split(" ", -1); 153 String var4 = var3[0]; 154 155 if (var3.length == 1) 156 { 157 ArrayList var8 = new ArrayList(); 158 Iterator var6 = this.commandMap.entrySet().iterator(); 159 160 while (var6.hasNext()) 161 { 162 Entry var7 = (Entry)var6.next(); 163 164 if (CommandBase.doesStringStartWith(var4, (String)var7.getKey()) && ((ICommand)var7.getValue()).canCommandSenderUseCommand(par1ICommandSender)) 165 { 166 var8.add(var7.getKey()); 167 } 168 } 169 170 return var8; 171 } 172 else 173 { 174 if (var3.length > 1) 175 { 176 ICommand var5 = (ICommand)this.commandMap.get(var4); 177 178 if (var5 != null) 179 { 180 return var5.addTabCompletionOptions(par1ICommandSender, dropFirstString(var3)); 181 } 182 } 183 184 return null; 185 } 186 } 187 188 /** 189 * returns all commands that the commandSender can use 190 */ 191 public List getPossibleCommands(ICommandSender par1ICommandSender) 192 { 193 ArrayList var2 = new ArrayList(); 194 Iterator var3 = this.commandSet.iterator(); 195 196 while (var3.hasNext()) 197 { 198 ICommand var4 = (ICommand)var3.next(); 199 200 if (var4.canCommandSenderUseCommand(par1ICommandSender)) 201 { 202 var2.add(var4); 203 } 204 } 205 206 return var2; 207 } 208 209 /** 210 * returns a map of string to commads. All commands are returned, not just ones which someone has permission to use. 211 */ 212 public Map getCommands() 213 { 214 return this.commandMap; 215 } 216 217 private int func_82370_a(ICommand par1ICommand, String[] par2ArrayOfStr) 218 { 219 if (par1ICommand == null) 220 { 221 return -1; 222 } 223 else 224 { 225 for (int var3 = 0; var3 < par2ArrayOfStr.length; ++var3) 226 { 227 if (par1ICommand.func_82358_a(var3) && PlayerSelector.func_82377_a(par2ArrayOfStr[var3])) 228 { 229 return var3; 230 } 231 } 232 233 return -1; 234 } 235 } 236 }