package net.minecraft.command.construction; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang3.ArrayUtils; import net.minecraft.command.IPermission; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.arg.ArgWrapper; import net.minecraft.command.arg.PrimitiveParameter; import net.minecraft.command.construction.ICommandConstructor.C; import net.minecraft.command.construction.ICommandConstructor.CP; import net.minecraft.command.construction.ICommandConstructor.CPU; import net.minecraft.command.construction.ICommandConstructor.CU; import net.minecraft.command.construction.ICommandConstructor.P; import net.minecraft.command.construction.ICommandConstructor.PU; import net.minecraft.command.construction.ICommandConstructor.U; import net.minecraft.command.descriptors.CommandDescriptor; import net.minecraft.command.descriptors.ICommandDescriptor.UsageProvider; import net.minecraft.command.descriptors.OperatorDescriptor; import net.minecraft.command.descriptors.OperatorDescriptor.ListOperands; import net.minecraft.command.descriptors.SelectorDescriptor; import net.minecraft.command.descriptors.SelectorDescriptorNoContent; import net.minecraft.command.descriptors.SelectorDescriptorNoContent.PrimitiveConstructable; import net.minecraft.command.descriptors.SelectorDescriptorSingleArg; import net.minecraft.command.descriptors.SelectorDescriptorSingleArg.SingleArgConstructable; import net.minecraft.command.type.IDataType; import net.minecraft.command.type.management.TypeID; public class RegistrationHelper { protected RegistrationHelper() { } public static final SelectorDescriptor<?> selector(final IPermission permission, final PrimitiveConstructable constructable, final TypeID<?>... resultTypes) { return new SelectorDescriptorNoContent(new HashSet<>(Arrays.asList(resultTypes)), permission, constructable); } public static final SelectorDescriptor<?> selector(final String key, final IDataType<?> arg, final SingleArgConstructable constructable, final IPermission permission, final TypeID<?>... resultTypes) { return new SelectorDescriptorSingleArg(new HashSet<>(Arrays.asList(resultTypes)), permission, key, arg, constructable); } public static final SelectorDescriptor<?> selector(final IDataType<?> arg, final SingleArgConstructable constructable, final IPermission permission, final TypeID<?>... resultTypes) { return new SelectorDescriptorSingleArg(new HashSet<>(Arrays.asList(resultTypes)), permission, arg, constructable); } public static final SelectorConstructor selector(final IPermission permission, final TypeID<?>... resultTypes) { return new SelectorConstructor(permission, resultTypes); } public static final void register(final String name, final SelectorDescriptor<?> descriptor) { SelectorDescriptor.registerSelector(name, descriptor); } public static final void register(final String name, final List<String> aliases, final SelectorDescriptor<?> descriptor) { SelectorDescriptor.registerSelector(name, aliases, descriptor); } public static final OperatorConstructor operator(final IPermission permission, final TypeID<?>... resultTypes) { return new OperatorConstructor(permission, resultTypes); } public static final OperatorConstructor operator(final IPermission permission, final Set<TypeID<?>> resultTypes) { return new OperatorConstructor(permission, resultTypes); } public static final OperatorDescriptor constant(final ArgWrapper<?> constant, final Set<TypeID<?>> resultType) { return operator(IPermission.unrestricted, resultType) .construct(new OperatorConstructable() { @Override public ArgWrapper<?> construct(final ListOperands operands) throws SyntaxErrorException { return constant; } }); } public static final OperatorDescriptor constant(final ArgWrapper<?> constant, final TypeID<?> resultType) { return constant(constant, Collections.<TypeID<?>> singleton(resultType)); } public static final <T> OperatorDescriptor constant(final T constant, final TypeID<T> resultType) { return constant(new PrimitiveParameter<>(constant).wrap(resultType), Collections.<TypeID<?>> singleton(resultType)); } public static final OperatorDescriptor primitiveOperator(final IPermission permission, final IDataType<?> operand, final Set<TypeID<?>> resultTypes) { return new OperatorDescriptor.Primitive(resultTypes, permission, operand); } public static final OperatorDescriptor primitiveOperator(final IPermission permission, final IDataType<?> operand, final TypeID<?>... resultTypes) { return new OperatorDescriptor.Primitive(new HashSet<>(Arrays.asList(resultTypes)), permission, operand); } public static final void register(final String name, final OperatorDescriptor descriptor) { OperatorDescriptor.register(name, descriptor); } public static final void register(final String name, final List<String> aliases, final OperatorDescriptor descriptor) { OperatorDescriptor.register(name, descriptor); for (final String alias : aliases) OperatorDescriptor.register(alias, descriptor); } public static final List<String> alias(final String... aliases) { return Arrays.asList(aliases); } public static final UsageProvider usage(final String usage, final Object... args) { return new UsageProviderDefault() { @Override protected <R> R create(final List<String> path, final AbstractCreator<R> creator) { return creator.create(usage, args); } }; } /** * Passes the last keyword as first argument to the exception. This means that it should NOT be used in the root command (no last keyword) */ public static final UsageProvider usageAliasAware(final String usage, final Object... args) { return new UsageProviderDefault() { @Override protected <R> R create(final List<String> path, final AbstractCreator<R> creator) { return creator.create(usage, ArrayUtils.addAll(new Object[] { path.get(path.size() - 1) }, args)); } }; } public static final CPU command(final String name, final List<String> aliases, final CommandConstructable constructable, final IPermission permission, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, aliases, constructable, permission, usage)); } public static final CU command(final String name, final List<String> aliases, final CommandConstructable constructable, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, aliases, constructable, usage)); } public static final PU command(final String name, final List<String> aliases, final IPermission permission, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, aliases, permission, usage)); } public static final U command(final String name, final List<String> aliases, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, aliases, usage)); } public static final CP command(final String name, final List<String> aliases, final CommandConstructable constructable, final IPermission permission) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, aliases, constructable, permission, null)); } public static final C command(final String name, final List<String> aliases, final CommandConstructable constructable) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, aliases, constructable, null)); } public static final P command(final String name, final List<String> aliases, final IPermission permission) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, aliases, permission, null)); } public static final ICommandConstructor command(final String name, final List<String> aliases) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, aliases, null)); } public static final CPU command(final String name, final CommandConstructable constructable, final IPermission permission, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, Collections.<String> emptyList(), constructable, permission, usage)); } public static final CU command(final String name, final CommandConstructable constructable, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, Collections.<String> emptyList(), constructable, usage)); } public static final PU command(final String name, final IPermission permission, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, Collections.<String> emptyList(), permission, usage)); } public static final U command(final String name, final UsageProvider usage) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, Collections.<String> emptyList(), usage)); } public static final CP command(final String name, final CommandConstructable constructable, final IPermission permission) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, Collections.<String> emptyList(), constructable, permission, null)); } public static final C command(final String name, final CommandConstructable constructable) { return new CommandConstructor(new CommandProtoDescriptor.Constructable(name, Collections.<String> emptyList(), constructable, null)); } public static final P command(final String name, final IPermission permission) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, Collections.<String> emptyList(), permission, null)); } public static final ICommandConstructor command(final String name, final String... aliases) { return new CommandConstructor(new CommandProtoDescriptor.NoConstructable(name, alias(aliases), null)); } public static final void register(final CPU toRegister) { for (final CommandProtoDescriptor descriptor : toRegister.baseCommands()) CommandDescriptor.registerCommand(descriptor.construct(null)); } @SuppressWarnings("unchecked") @SafeVarargs public static final <T extends ICommandConstructor> T group(final T... elements) { final Set<CommandProtoDescriptor> base = new HashSet<>(elements.length); final Set<CommandProtoDescriptor> ends = new HashSet<>(elements.length); for (final T element : elements) { base.addAll(element.baseCommands()); ends.addAll(element.ends()); } return (T) new CommandConstructor(base, ends); } private static final IPermission[] levels = new IPermission[] { IPermission.unrestricted, IPermission.level1, IPermission.level2, IPermission.level3, IPermission.level4 }; public static final IPermission level(final int i) { return levels[i]; } }