123 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.commands.arguments.item;
 | |
| 
 | |
| import com.mojang.brigadier.StringReader;
 | |
| import com.mojang.brigadier.arguments.ArgumentType;
 | |
| import com.mojang.brigadier.context.CommandContext;
 | |
| import com.mojang.brigadier.exceptions.CommandSyntaxException;
 | |
| import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 | |
| import com.mojang.datafixers.util.Either;
 | |
| import com.mojang.datafixers.util.Pair;
 | |
| import java.util.Arrays;
 | |
| import java.util.Collection;
 | |
| import java.util.Collections;
 | |
| import net.minecraft.commands.CommandSourceStack;
 | |
| import net.minecraft.commands.functions.CommandFunction;
 | |
| import net.minecraft.network.chat.Component;
 | |
| import net.minecraft.resources.ResourceLocation;
 | |
| 
 | |
| public class FunctionArgument implements ArgumentType<FunctionArgument.Result> {
 | |
| 	private static final Collection<String> EXAMPLES = Arrays.asList("foo", "foo:bar", "#foo");
 | |
| 	private static final DynamicCommandExceptionType ERROR_UNKNOWN_TAG = new DynamicCommandExceptionType(
 | |
| 		object -> Component.translatableEscape("arguments.function.tag.unknown", object)
 | |
| 	);
 | |
| 	private static final DynamicCommandExceptionType ERROR_UNKNOWN_FUNCTION = new DynamicCommandExceptionType(
 | |
| 		object -> Component.translatableEscape("arguments.function.unknown", object)
 | |
| 	);
 | |
| 
 | |
| 	public static FunctionArgument functions() {
 | |
| 		return new FunctionArgument();
 | |
| 	}
 | |
| 
 | |
| 	public FunctionArgument.Result parse(StringReader reader) throws CommandSyntaxException {
 | |
| 		if (reader.canRead() && reader.peek() == '#') {
 | |
| 			reader.skip();
 | |
| 			final ResourceLocation resourceLocation = ResourceLocation.read(reader);
 | |
| 			return new FunctionArgument.Result() {
 | |
| 				@Override
 | |
| 				public Collection<CommandFunction<CommandSourceStack>> create(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
 | |
| 					return FunctionArgument.getFunctionTag(context, resourceLocation);
 | |
| 				}
 | |
| 
 | |
| 				@Override
 | |
| 				public Pair<ResourceLocation, Either<CommandFunction<CommandSourceStack>, Collection<CommandFunction<CommandSourceStack>>>> unwrap(
 | |
| 					CommandContext<CommandSourceStack> context
 | |
| 				) throws CommandSyntaxException {
 | |
| 					return Pair.of(resourceLocation, Either.right(FunctionArgument.getFunctionTag(context, resourceLocation)));
 | |
| 				}
 | |
| 
 | |
| 				@Override
 | |
| 				public Pair<ResourceLocation, Collection<CommandFunction<CommandSourceStack>>> unwrapToCollection(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
 | |
| 					return Pair.of(resourceLocation, FunctionArgument.getFunctionTag(context, resourceLocation));
 | |
| 				}
 | |
| 			};
 | |
| 		} else {
 | |
| 			final ResourceLocation resourceLocation = ResourceLocation.read(reader);
 | |
| 			return new FunctionArgument.Result() {
 | |
| 				@Override
 | |
| 				public Collection<CommandFunction<CommandSourceStack>> create(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
 | |
| 					return Collections.singleton(FunctionArgument.getFunction(context, resourceLocation));
 | |
| 				}
 | |
| 
 | |
| 				@Override
 | |
| 				public Pair<ResourceLocation, Either<CommandFunction<CommandSourceStack>, Collection<CommandFunction<CommandSourceStack>>>> unwrap(
 | |
| 					CommandContext<CommandSourceStack> context
 | |
| 				) throws CommandSyntaxException {
 | |
| 					return Pair.of(resourceLocation, Either.left(FunctionArgument.getFunction(context, resourceLocation)));
 | |
| 				}
 | |
| 
 | |
| 				@Override
 | |
| 				public Pair<ResourceLocation, Collection<CommandFunction<CommandSourceStack>>> unwrapToCollection(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
 | |
| 					return Pair.of(resourceLocation, Collections.singleton(FunctionArgument.getFunction(context, resourceLocation)));
 | |
| 				}
 | |
| 			};
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	static CommandFunction<CommandSourceStack> getFunction(CommandContext<CommandSourceStack> context, ResourceLocation id) throws CommandSyntaxException {
 | |
| 		return (CommandFunction<CommandSourceStack>)context.getSource()
 | |
| 			.getServer()
 | |
| 			.getFunctions()
 | |
| 			.get(id)
 | |
| 			.orElseThrow(() -> ERROR_UNKNOWN_FUNCTION.create(id.toString()));
 | |
| 	}
 | |
| 
 | |
| 	static Collection<CommandFunction<CommandSourceStack>> getFunctionTag(CommandContext<CommandSourceStack> context, ResourceLocation id) throws CommandSyntaxException {
 | |
| 		Collection<CommandFunction<CommandSourceStack>> collection = context.getSource().getServer().getFunctions().getTag(id);
 | |
| 		if (collection == null) {
 | |
| 			throw ERROR_UNKNOWN_TAG.create(id.toString());
 | |
| 		} else {
 | |
| 			return collection;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public static Collection<CommandFunction<CommandSourceStack>> getFunctions(CommandContext<CommandSourceStack> context, String name) throws CommandSyntaxException {
 | |
| 		return context.<FunctionArgument.Result>getArgument(name, FunctionArgument.Result.class).create(context);
 | |
| 	}
 | |
| 
 | |
| 	public static Pair<ResourceLocation, Either<CommandFunction<CommandSourceStack>, Collection<CommandFunction<CommandSourceStack>>>> getFunctionOrTag(
 | |
| 		CommandContext<CommandSourceStack> context, String name
 | |
| 	) throws CommandSyntaxException {
 | |
| 		return context.<FunctionArgument.Result>getArgument(name, FunctionArgument.Result.class).unwrap(context);
 | |
| 	}
 | |
| 
 | |
| 	public static Pair<ResourceLocation, Collection<CommandFunction<CommandSourceStack>>> getFunctionCollection(
 | |
| 		CommandContext<CommandSourceStack> context, String name
 | |
| 	) throws CommandSyntaxException {
 | |
| 		return context.<FunctionArgument.Result>getArgument(name, FunctionArgument.Result.class).unwrapToCollection(context);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public Collection<String> getExamples() {
 | |
| 		return EXAMPLES;
 | |
| 	}
 | |
| 
 | |
| 	public interface Result {
 | |
| 		Collection<CommandFunction<CommandSourceStack>> create(CommandContext<CommandSourceStack> context) throws CommandSyntaxException;
 | |
| 
 | |
| 		Pair<ResourceLocation, Either<CommandFunction<CommandSourceStack>, Collection<CommandFunction<CommandSourceStack>>>> unwrap(
 | |
| 			CommandContext<CommandSourceStack> context
 | |
| 		) throws CommandSyntaxException;
 | |
| 
 | |
| 		Pair<ResourceLocation, Collection<CommandFunction<CommandSourceStack>>> unwrapToCollection(CommandContext<CommandSourceStack> context) throws CommandSyntaxException;
 | |
| 	}
 | |
| }
 |