65 lines
2.5 KiB
Java
65 lines
2.5 KiB
Java
package net.minecraft.network.chat;
|
|
|
|
import com.mojang.brigadier.ParseResults;
|
|
import com.mojang.brigadier.context.CommandContextBuilder;
|
|
import com.mojang.brigadier.context.ParsedArgument;
|
|
import com.mojang.brigadier.context.ParsedCommandNode;
|
|
import com.mojang.brigadier.tree.ArgumentCommandNode;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import net.minecraft.commands.arguments.SignedArgument;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public record SignableCommand<S>(List<SignableCommand.Argument<S>> arguments) {
|
|
public static <S> boolean hasSignableArguments(ParseResults<S> parseResults) {
|
|
return !of(parseResults).arguments().isEmpty();
|
|
}
|
|
|
|
public static <S> SignableCommand<S> of(ParseResults<S> results) {
|
|
String string = results.getReader().getString();
|
|
CommandContextBuilder<S> commandContextBuilder = results.getContext();
|
|
CommandContextBuilder<S> commandContextBuilder2 = commandContextBuilder;
|
|
List<SignableCommand.Argument<S>> list = collectArguments(string, commandContextBuilder);
|
|
|
|
CommandContextBuilder<S> commandContextBuilder3;
|
|
while ((commandContextBuilder3 = commandContextBuilder2.getChild()) != null && commandContextBuilder3.getRootNode() != commandContextBuilder.getRootNode()) {
|
|
list.addAll(collectArguments(string, commandContextBuilder3));
|
|
commandContextBuilder2 = commandContextBuilder3;
|
|
}
|
|
|
|
return new SignableCommand<>(list);
|
|
}
|
|
|
|
private static <S> List<SignableCommand.Argument<S>> collectArguments(String key, CommandContextBuilder<S> contextBuilder) {
|
|
List<SignableCommand.Argument<S>> list = new ArrayList();
|
|
|
|
for (ParsedCommandNode<S> parsedCommandNode : contextBuilder.getNodes()) {
|
|
if (parsedCommandNode.getNode() instanceof ArgumentCommandNode<S, ?> argumentCommandNode && argumentCommandNode.getType() instanceof SignedArgument) {
|
|
ParsedArgument<S, ?> parsedArgument = (ParsedArgument<S, ?>)contextBuilder.getArguments().get(argumentCommandNode.getName());
|
|
if (parsedArgument != null) {
|
|
String string = parsedArgument.getRange().get(key);
|
|
list.add(new SignableCommand.Argument<>(argumentCommandNode, string));
|
|
}
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
@Nullable
|
|
public SignableCommand.Argument<S> getArgument(String argument) {
|
|
for (SignableCommand.Argument<S> argument2 : this.arguments) {
|
|
if (argument.equals(argument2.name())) {
|
|
return argument2;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public record Argument<S>(ArgumentCommandNode<S, ?> node, String value) {
|
|
public String name() {
|
|
return this.node.getName();
|
|
}
|
|
}
|
|
}
|