You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
9.2 KiB
Java
272 lines
9.2 KiB
Java
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.minecraft.util.ChatComponentTranslation;
|
|
import net.minecraft.util.EnumChatFormatting;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
import net.minecraftforge.event.CommandEvent;
|
|
|
|
public class CommandHandler implements ICommandManager
|
|
{
|
|
private static final Logger logger = LogManager.getLogger();
|
|
/** 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();
|
|
private static final String __OBFID = "CL_00001765";
|
|
|
|
public int executeCommand(ICommandSender p_71556_1_, String p_71556_2_)
|
|
{
|
|
p_71556_2_ = p_71556_2_.trim();
|
|
|
|
if (p_71556_2_.startsWith("/"))
|
|
{
|
|
p_71556_2_ = p_71556_2_.substring(1);
|
|
}
|
|
|
|
String[] astring = p_71556_2_.split(" ");
|
|
String s1 = astring[0];
|
|
astring = dropFirstString(astring);
|
|
ICommand icommand = (ICommand)this.commandMap.get(s1);
|
|
int i = this.getUsernameIndex(icommand, astring);
|
|
int j = 0;
|
|
ChatComponentTranslation chatcomponenttranslation;
|
|
|
|
try
|
|
{
|
|
if (icommand == null)
|
|
{
|
|
throw new CommandNotFoundException();
|
|
}
|
|
|
|
if (icommand.canCommandSenderUseCommand(p_71556_1_))
|
|
{
|
|
CommandEvent event = new CommandEvent(icommand, p_71556_1_, astring);
|
|
if (MinecraftForge.EVENT_BUS.post(event))
|
|
{
|
|
if (event.exception != null)
|
|
{
|
|
throw event.exception;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
if (i > -1)
|
|
{
|
|
EntityPlayerMP[] aentityplayermp = PlayerSelector.matchPlayers(p_71556_1_, astring[i]);
|
|
String s2 = astring[i];
|
|
EntityPlayerMP[] aentityplayermp1 = aentityplayermp;
|
|
int k = aentityplayermp.length;
|
|
|
|
for (int l = 0; l < k; ++l)
|
|
{
|
|
EntityPlayerMP entityplayermp = aentityplayermp1[l];
|
|
astring[i] = entityplayermp.getCommandSenderName();
|
|
|
|
try
|
|
{
|
|
icommand.processCommand(p_71556_1_, astring);
|
|
++j;
|
|
}
|
|
catch (CommandException commandexception1)
|
|
{
|
|
ChatComponentTranslation chatcomponenttranslation1 = new ChatComponentTranslation(commandexception1.getMessage(), commandexception1.getErrorOjbects());
|
|
chatcomponenttranslation1.getChatStyle().setColor(EnumChatFormatting.RED);
|
|
p_71556_1_.addChatMessage(chatcomponenttranslation1);
|
|
}
|
|
}
|
|
|
|
astring[i] = s2;
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
icommand.processCommand(p_71556_1_, astring);
|
|
++j;
|
|
}
|
|
catch (CommandException commandexception)
|
|
{
|
|
chatcomponenttranslation = new ChatComponentTranslation(commandexception.getMessage(), commandexception.getErrorOjbects());
|
|
chatcomponenttranslation.getChatStyle().setColor(EnumChatFormatting.RED);
|
|
p_71556_1_.addChatMessage(chatcomponenttranslation);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ChatComponentTranslation chatcomponenttranslation2 = new ChatComponentTranslation("commands.generic.permission", new Object[0]);
|
|
chatcomponenttranslation2.getChatStyle().setColor(EnumChatFormatting.RED);
|
|
p_71556_1_.addChatMessage(chatcomponenttranslation2);
|
|
}
|
|
}
|
|
catch (WrongUsageException wrongusageexception)
|
|
{
|
|
chatcomponenttranslation = new ChatComponentTranslation("commands.generic.usage", new Object[] {new ChatComponentTranslation(wrongusageexception.getMessage(), wrongusageexception.getErrorOjbects())});
|
|
chatcomponenttranslation.getChatStyle().setColor(EnumChatFormatting.RED);
|
|
p_71556_1_.addChatMessage(chatcomponenttranslation);
|
|
}
|
|
catch (CommandException commandexception2)
|
|
{
|
|
chatcomponenttranslation = new ChatComponentTranslation(commandexception2.getMessage(), commandexception2.getErrorOjbects());
|
|
chatcomponenttranslation.getChatStyle().setColor(EnumChatFormatting.RED);
|
|
p_71556_1_.addChatMessage(chatcomponenttranslation);
|
|
}
|
|
catch (Throwable throwable)
|
|
{
|
|
chatcomponenttranslation = new ChatComponentTranslation("commands.generic.exception", new Object[0]);
|
|
chatcomponenttranslation.getChatStyle().setColor(EnumChatFormatting.RED);
|
|
p_71556_1_.addChatMessage(chatcomponenttranslation);
|
|
logger.error("Couldn\'t process command: \'" + p_71556_2_ + "\'", throwable);
|
|
}
|
|
|
|
return j;
|
|
}
|
|
|
|
/**
|
|
* adds the command and any aliases it has to the internal map of available commands
|
|
*/
|
|
public ICommand registerCommand(ICommand p_71560_1_)
|
|
{
|
|
List list = p_71560_1_.getCommandAliases();
|
|
this.commandMap.put(p_71560_1_.getCommandName(), p_71560_1_);
|
|
this.commandSet.add(p_71560_1_);
|
|
|
|
if (list != null)
|
|
{
|
|
Iterator iterator = list.iterator();
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
String s = (String)iterator.next();
|
|
ICommand icommand1 = (ICommand)this.commandMap.get(s);
|
|
|
|
if (icommand1 == null || !icommand1.getCommandName().equals(s))
|
|
{
|
|
this.commandMap.put(s, p_71560_1_);
|
|
}
|
|
}
|
|
}
|
|
|
|
return p_71560_1_;
|
|
}
|
|
|
|
/**
|
|
* 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[] p_71559_0_)
|
|
{
|
|
String[] astring1 = new String[p_71559_0_.length - 1];
|
|
|
|
for (int i = 1; i < p_71559_0_.length; ++i)
|
|
{
|
|
astring1[i - 1] = p_71559_0_[i];
|
|
}
|
|
|
|
return astring1;
|
|
}
|
|
|
|
/**
|
|
* Performs a "begins with" string match on each token in par2. Only returns commands that par1 can use.
|
|
*/
|
|
public List getPossibleCommands(ICommandSender p_71558_1_, String p_71558_2_)
|
|
{
|
|
String[] astring = p_71558_2_.split(" ", -1);
|
|
String s1 = astring[0];
|
|
|
|
if (astring.length == 1)
|
|
{
|
|
ArrayList arraylist = new ArrayList();
|
|
Iterator iterator = this.commandMap.entrySet().iterator();
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
Entry entry = (Entry)iterator.next();
|
|
|
|
if (CommandBase.doesStringStartWith(s1, (String)entry.getKey()) && ((ICommand)entry.getValue()).canCommandSenderUseCommand(p_71558_1_))
|
|
{
|
|
arraylist.add(entry.getKey());
|
|
}
|
|
}
|
|
|
|
return arraylist;
|
|
}
|
|
else
|
|
{
|
|
if (astring.length > 1)
|
|
{
|
|
ICommand icommand = (ICommand)this.commandMap.get(s1);
|
|
|
|
if (icommand != null)
|
|
{
|
|
return icommand.addTabCompletionOptions(p_71558_1_, dropFirstString(astring));
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* returns all commands that the commandSender can use
|
|
*/
|
|
public List getPossibleCommands(ICommandSender p_71557_1_)
|
|
{
|
|
ArrayList arraylist = new ArrayList();
|
|
Iterator iterator = this.commandSet.iterator();
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
ICommand icommand = (ICommand)iterator.next();
|
|
|
|
if (icommand.canCommandSenderUseCommand(p_71557_1_))
|
|
{
|
|
arraylist.add(icommand);
|
|
}
|
|
}
|
|
|
|
return arraylist;
|
|
}
|
|
|
|
/**
|
|
* 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 p_82370_1_, String[] p_82370_2_)
|
|
{
|
|
if (p_82370_1_ == null)
|
|
{
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < p_82370_2_.length; ++i)
|
|
{
|
|
if (p_82370_1_.isUsernameIndex(p_82370_2_, i) && PlayerSelector.matchesMultiplePlayers(p_82370_2_[i]))
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
}
|
|
} |