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 }