package net.minecraft.command.type.custom.nbt; import java.util.ArrayList; import java.util.regex.Matcher; import org.apache.commons.lang3.tuple.Pair; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.command.ParsingUtilities; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.arg.ArgWrapper; import net.minecraft.command.arg.CommandArg; import net.minecraft.command.collections.Completers; import net.minecraft.command.collections.NBTDescriptors; import net.minecraft.command.collections.TypeIDs; import net.minecraft.command.completion.TCDSet; import net.minecraft.command.parser.CompletionParser.CompletionData; import net.minecraft.command.parser.Context; import net.minecraft.command.parser.Parser; import net.minecraft.command.type.CDataType; import net.minecraft.command.type.CTypeCompletable; import net.minecraft.command.type.custom.nbt.NBTDescriptor.Tag; import net.minecraft.command.type.custom.nbt.ParserNBTCompound.CompoundData; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; public class TypeNBTArg extends CTypeCompletable<NBTTagCompound> { private final Tag baseDescriptor; public TypeNBTArg(final Tag baseDescriptor) { this.baseDescriptor = baseDescriptor; } public static final CDataType<NBTTagCompound> parserDefault = new TypeNBTArg(NBTDescriptor.defaultCompound); public static final CDataType<NBTTagCompound> parserBlock = new TypeNBTArg(NBTDescriptors.block); public static final CDataType<NBTTagCompound> parserEntity = new TypeNBTArg(NBTDescriptors.entity); @Override public ArgWrapper<NBTTagCompound> iParse(final Parser parser, final Context context) throws SyntaxErrorException { final ArgWrapper<NBTTagCompound> ret = context.generalParse(parser, TypeIDs.NBTCompound); if (ret != null) return ret; final Matcher m = parser.getMatcher(ParserNBTTag.specialMatcher); if (!parser.findInc(m) || !"{".equals(m.group(1))) throw parser.SEE("Expected '{' "); ParsingUtilities.terminateCompletion(parser); final CompoundData data = new CompoundData(); this.baseDescriptor.getCompoundParser().parseItems(parser, data); if (data.data.isEmpty()) return TypeIDs.NBTCompound.wrap(new NBTTagCompound(data.primitiveData)); final ArrayList<Pair<String, CommandArg<NBTBase>>> dynamicData = data.data; dynamicData.trimToSize(); return TypeIDs.NBTCompound.wrap(new CommandArg<NBTTagCompound>() { final NBTTagCompound compound = new NBTTagCompound(data.primitiveData); @Override public NBTTagCompound eval(final ICommandSender sender) throws CommandException { for (final Pair<String, CommandArg<NBTBase>> tag : dynamicData) this.compound.setTag(tag.getKey(), tag.getValue().eval(sender)); return this.compound; } }); } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData) { Completers.braceCompleter.complete(tcDataSet, parser, startIndex, cData); } }