package net.minecraft.command.legacy;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import net.minecraft.command.CommandException;
import net.minecraft.command.CommandHandler;
import net.minecraft.command.CommandResultStats;
import net.minecraft.command.CommandResultStats.Type;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.ParsingUtilities;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.arg.CommandArg;
import net.minecraft.command.arg.PermissionWrapper.Command;
import net.minecraft.command.completion.ITabCompletion;
import net.minecraft.command.construction.RegistrationHelper;
import net.minecraft.command.descriptors.CommandDescriptor;
import net.minecraft.command.descriptors.ICommandDescriptor;
import net.minecraft.command.legacy.LegacyCommand.LegacyParserData;
import net.minecraft.command.parser.Parser;
import net.minecraft.entity.Entity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
/*
* Legacy Support
*/
@Deprecated
public class LegacyCommand extends CommandDescriptor<LegacyParserData>
{
private final ICommand command;
private static ICommandSender legacyICS = new ICommandSender()
{
private static final String err = "Something accessed a method of the legacy command support ICommandSender.";
@Override
public boolean sendCommandFeedback()
{
MinecraftServer.getServer().logWarning(err);
return false;
}
@Override
public Vec3 getPositionVector()
{
MinecraftServer.getServer().logWarning(err);
return new Vec3(0, 0, 0);
}
@Override
public BlockPos getPosition()
{
MinecraftServer.getServer().logWarning(err);
return new BlockPos(0, 0, 0);
}
@Override
public String getName()
{
MinecraftServer.getServer().logWarning(err);
return "Legacy command support";
}
@Override
public World getEntityWorld()
{
MinecraftServer.getServer().logWarning(err);
return MinecraftServer.getServer().getEntityWorld();
}
@Override
public IChatComponent getDisplayName()
{
MinecraftServer.getServer().logWarning(err);
return new ChatComponentText("Legacy command support");
}
@Override
public Entity getCommandSenderEntity()
{
MinecraftServer.getServer().logWarning(err);
return null;
}
@Override
public void func_174794_a(final Type p_174794_1_, final int p_174794_2_)
{
MinecraftServer.getServer().logWarning(err);
}
@Override
public boolean canCommandSenderUseCommand(final int permissionLevel, final String command)
{
MinecraftServer.getServer().logWarning(err);
return false;
}
@Override
public void addChatMessage(final IChatComponent message)
{
MinecraftServer.getServer().logWarning(err + "\nMessage sent: " + message.getUnformattedText());
}
};
public LegacyCommand(final ICommand command)
{
super(command, RegistrationHelper.usage(command.getCommandUsage(legacyICS)));
this.command = command;
}
/**
* Legacy support
*/
@Deprecated
public static class LegacyParserData
{
public final ICommand command;
public String argString;
public LegacyParserData(final ICommand command)
{
this.command = command;
}
}
@Override
public CommandArg<Integer> construct(final LegacyParserData data) throws SyntaxErrorException
{
final String[] args = data.argString != null ? dropFirstString(data.argString.split(" ")) : new String[0];
final int usernameIndex = this.getUsernameIndex(args);
final CommandArg<List<Entity>> targets = usernameIndex < 0 ? null : Parser.parseEntityList(args[usernameIndex]);
return new CommandArg<Integer>()
{
private final CommandArg<Integer> wrappedCommand = new CommandArg<Integer>()
{
@Override
public Integer eval(final ICommandSender sender) throws CommandException
{
LegacyCommand.this.command.processCommand(sender, args);
return 1;
}
};
@Override
public Integer eval(final ICommandSender sender) throws CommandException
{
if (targets == null)
{
sender.func_174794_a(CommandResultStats.Type.AFFECTED_ENTITIES, 1);
return this.wrappedCommand.eval(sender);
}
final List<Entity> eTargets = targets.eval(sender);
sender.func_174794_a(CommandResultStats.Type.AFFECTED_ENTITIES, eTargets.size());
int ret = 0;
for (final Entity target : eTargets)
{
args[usernameIndex] = target.getUniqueID().toString();
ret += CommandHandler.executeCommand(sender, this.wrappedCommand);
}
return ret;
}
};
}
@Override
public ICommandDescriptor<? super LegacyParserData> getSubDescriptor(final Parser parser, final LegacyParserData data) throws SyntaxErrorException
{
return null;
}
@Override
public ICommandDescriptor<? super LegacyParserData> getSubDescriptor(final String keyword)
{
return null;
}
@Override
public final Set<ITabCompletion> getKeywordCompletions()
{
return Collections.emptySet();
}
@Override
public void addSubDescriptor(final String key, final ICommandDescriptor<? super LegacyParserData> descriptor)
{
throw new UnsupportedOperationException("Can't add sub-types to legacy-command");
}
protected int getUsernameIndex(final String[] args)
{
for (int i = 0; i < args.length; ++i)
if (this.command.isUsernameIndex(args, i))
return i;
return -1;
}
@Override
public void parse(final Parser parser, final LegacyParserData parserData, final UsageProvider usage) throws SyntaxErrorException
{
TypeLegacyArg.parser.parse(parser, parserData);
}
@Override
public Command parse(final Parser parser) throws SyntaxErrorException
{
final LegacyParserData parserData = new LegacyParserData(this.command);
TypeLegacyArg.parser.parse(parser, parserData);
// CommandsParser REQUIRES that endingMatcher is in the following state: whitespaces processed + found match
final Matcher endingMatcher = parser.getMatcher(ParsingUtilities.endingMatcher);
if (parser.find(endingMatcher))
parser.incIndex(endingMatcher.group(1).length());
else
throw parser.SEE("Expected ')' or end of string ");
return new Command(this.construct(parserData), this.command);
}
/**
* creates a new array and sets elements 0..n-2 to be 0..n-1 of the input (n elements)
*/
@Deprecated
protected static String[] dropFirstString(final String[] p_71559_0_)
{
if (p_71559_0_.length == 0)
return p_71559_0_;
final String[] var1 = new String[p_71559_0_.length - 1];
System.arraycopy(p_71559_0_, 1, var1, 0, p_71559_0_.length - 1);
return var1;
}
}