1111import com .mojang .brigadier .context .CommandContext ;
1212import com .mojang .brigadier .context .CommandContextBuilder ;
1313import com .mojang .brigadier .context .ParsedArgument ;
14+ import com .mojang .brigadier .context .StringRange ;
1415import com .mojang .brigadier .exceptions .CommandSyntaxException ;
1516import com .mojang .brigadier .suggestion .SuggestionProvider ;
1617import com .mojang .brigadier .suggestion .Suggestions ;
1718import com .mojang .brigadier .suggestion .SuggestionsBuilder ;
1819
20+ import java .util .ArrayList ;
1921import java .util .Collection ;
22+ import java .util .List ;
2023import java .util .concurrent .CompletableFuture ;
2124import java .util .function .Predicate ;
2225
@@ -27,12 +30,21 @@ public class ArgumentCommandNode<S, T> extends CommandNode<S> {
2730 private final String name ;
2831 private final ArgumentType <T > type ;
2932 private final SuggestionProvider <S > customSuggestions ;
33+ private final boolean list ;
34+ private Collection <? extends CommandNode <S >> cached ;
35+ private Collection <? extends CommandNode <S >> cachedOut ;
3036
37+ @ Deprecated
3138 public ArgumentCommandNode (final String name , final ArgumentType <T > type , final Command <S > command , final Predicate <S > requirement , final CommandNode <S > redirect , final RedirectModifier <S > modifier , final boolean forks , final SuggestionProvider <S > customSuggestions ) {
39+ this (name , type , command , requirement , redirect , modifier , forks , customSuggestions , false );
40+ }
41+
42+ public ArgumentCommandNode (final String name , final ArgumentType <T > type , final Command <S > command , final Predicate <S > requirement , final CommandNode <S > redirect , final RedirectModifier <S > modifier , final boolean forks , final SuggestionProvider <S > customSuggestions , boolean list ) {
3243 super (command , requirement , redirect , modifier , forks );
3344 this .name = name ;
3445 this .type = type ;
3546 this .customSuggestions = customSuggestions ;
47+ this .list = list ;
3648 }
3749
3850 public ArgumentType <T > getType () {
@@ -57,10 +69,24 @@ public SuggestionProvider<S> getCustomSuggestions() {
5769 public void parse (final StringReader reader , final CommandContextBuilder <S > contextBuilder ) throws CommandSyntaxException {
5870 final int start = reader .getCursor ();
5971 final T result = type .parse (reader );
60- final ParsedArgument <S , T > parsed = new ParsedArgument <>(start , reader .getCursor (), result );
6172
62- contextBuilder .withArgument (name , parsed );
63- contextBuilder .withNode (this , parsed .getRange ());
73+ if (!list ) {
74+ final ParsedArgument <S , T > parsed = new ParsedArgument <>(start , reader .getCursor (), result );
75+
76+ contextBuilder .withArgument (name , parsed );
77+ } else {
78+ ParsedArgument <S , List <T >> parsed = (ParsedArgument <S , List <T >>) contextBuilder .getArguments ().get (name );
79+ if (parsed == null ) {
80+ parsed = new ParsedArgument <>(start , reader .getCursor (), new ArrayList <>());
81+ } else {
82+ parsed = new ParsedArgument <>(parsed .getRange ().getStart (), reader .getCursor (), parsed .getResult ());
83+ }
84+ parsed .getResult ().add (result );
85+
86+ contextBuilder .withArgument (name , parsed );
87+ }
88+
89+ contextBuilder .withNode (this , new StringRange (start , reader .getCursor ()));
6490 }
6591
6692 @ Override
@@ -74,7 +100,7 @@ public CompletableFuture<Suggestions> listSuggestions(final CommandContext<S> co
74100
75101 @ Override
76102 public RequiredArgumentBuilder <S , T > createBuilder () {
77- final RequiredArgumentBuilder <S , T > builder = RequiredArgumentBuilder .argument (name , type );
103+ final RequiredArgumentBuilder <S , T > builder = list ? RequiredArgumentBuilder . list ( name , type ) : RequiredArgumentBuilder .argument (name , type );
78104 builder .requires (getRequirement ());
79105 builder .forward (getRedirect (), getRedirectModifier (), isFork ());
80106 builder .suggests (customSuggestions );
@@ -128,4 +154,24 @@ public Collection<String> getExamples() {
128154 public String toString () {
129155 return "<argument " + name + ":" + type +">" ;
130156 }
157+
158+ @ Override
159+ public Collection <? extends CommandNode <S >> getRelevantNodes (StringReader input ) {
160+ if (!list ) {
161+ return super .getRelevantNodes (input );
162+ } else {
163+ Collection <? extends CommandNode <S >> relevantNodes = super .getRelevantNodes (input );
164+ if (relevantNodes .size () == 1 && relevantNodes .stream ().allMatch (node -> node instanceof LiteralCommandNode )) {
165+ return relevantNodes ;
166+ } else {
167+ if (cached != relevantNodes ) {
168+ cached = relevantNodes ;
169+ ArrayList <CommandNode <S >> commandNodes = new ArrayList <>(cached );
170+ commandNodes .add (this );
171+ cachedOut = commandNodes ;
172+ }
173+ return cachedOut ;
174+ }
175+ }
176+ }
131177}
0 commit comments