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