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 035 try 036 { 037 if (var5 == null) 038 { 039 throw new CommandNotFoundException(); 040 } 041 042 if (var5.canCommandSenderUseCommand(par1ICommandSender)) 043 { 044 CommandEvent event = new CommandEvent(var5, par1ICommandSender, var3); 045 if (!MinecraftForge.EVENT_BUS.post(event)) 046 { 047 var5.processCommand(par1ICommandSender, event.parameters); 048 } 049 else 050 { 051 if (event.exception != null) 052 { 053 throw event.exception; 054 } 055 } 056 } 057 else 058 { 059 par1ICommandSender.sendChatToPlayer("\u00a7cYou do not have permission to use this command."); 060 } 061 } 062 catch (WrongUsageException var7) 063 { 064 par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString("commands.generic.usage", new Object[] {par1ICommandSender.translateString(var7.getMessage(), var7.getErrorOjbects())})); 065 } 066 catch (CommandException var8) 067 { 068 par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString(var8.getMessage(), var8.getErrorOjbects())); 069 } 070 catch (Throwable var9) 071 { 072 par1ICommandSender.sendChatToPlayer("\u00a7c" + par1ICommandSender.translateString("commands.generic.exception", new Object[0])); 073 var9.printStackTrace(); 074 } 075 } 076 077 /** 078 * adds the command and any aliases it has to the internal map of available commands 079 */ 080 public ICommand registerCommand(ICommand par1ICommand) 081 { 082 List var2 = par1ICommand.getCommandAliases(); 083 this.commandMap.put(par1ICommand.getCommandName(), par1ICommand); 084 this.commandSet.add(par1ICommand); 085 086 if (var2 != null) 087 { 088 Iterator var3 = var2.iterator(); 089 090 while (var3.hasNext()) 091 { 092 String var4 = (String)var3.next(); 093 ICommand var5 = (ICommand)this.commandMap.get(var4); 094 095 if (var5 == null || !var5.getCommandName().equals(var4)) 096 { 097 this.commandMap.put(var4, par1ICommand); 098 } 099 } 100 } 101 102 return par1ICommand; 103 } 104 105 /** 106 * creates a new array and sets elements 0..n-2 to be 0..n-1 of the input (n elements) 107 */ 108 private static String[] dropFirstString(String[] par0ArrayOfStr) 109 { 110 String[] var1 = new String[par0ArrayOfStr.length - 1]; 111 112 for (int var2 = 1; var2 < par0ArrayOfStr.length; ++var2) 113 { 114 var1[var2 - 1] = par0ArrayOfStr[var2]; 115 } 116 117 return var1; 118 } 119 120 /** 121 * Performs a "begins with" string match on each token in par2. Only returns commands that par1 can use. 122 */ 123 public List getPossibleCommands(ICommandSender par1ICommandSender, String par2Str) 124 { 125 String[] var3 = par2Str.split(" ", -1); 126 String var4 = var3[0]; 127 128 if (var3.length == 1) 129 { 130 ArrayList var8 = new ArrayList(); 131 Iterator var6 = this.commandMap.entrySet().iterator(); 132 133 while (var6.hasNext()) 134 { 135 Entry var7 = (Entry)var6.next(); 136 137 if (CommandBase.doesStringStartWith(var4, (String)var7.getKey()) && ((ICommand)var7.getValue()).canCommandSenderUseCommand(par1ICommandSender)) 138 { 139 var8.add(var7.getKey()); 140 } 141 } 142 143 return var8; 144 } 145 else 146 { 147 if (var3.length > 1) 148 { 149 ICommand var5 = (ICommand)this.commandMap.get(var4); 150 151 if (var5 != null) 152 { 153 return var5.addTabCompletionOptions(par1ICommandSender, dropFirstString(var3)); 154 } 155 } 156 157 return null; 158 } 159 } 160 161 /** 162 * returns all commands that the commandSender can use 163 */ 164 public List getPossibleCommands(ICommandSender par1ICommandSender) 165 { 166 ArrayList var2 = new ArrayList(); 167 Iterator var3 = this.commandSet.iterator(); 168 169 while (var3.hasNext()) 170 { 171 ICommand var4 = (ICommand)var3.next(); 172 173 if (var4.canCommandSenderUseCommand(par1ICommandSender)) 174 { 175 var2.add(var4); 176 } 177 } 178 179 return var2; 180 } 181 182 /** 183 * returns a map of string to commads. All commands are returned, not just ones which someone has permission to use. 184 */ 185 public Map getCommands() 186 { 187 return this.commandMap; 188 } 189 }