summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormd_5 <git@md-5.net>2018-07-16 21:03:46 +1000
committermd_5 <git@md-5.net>2018-07-16 21:03:46 +1000
commit1fccb8950186caae273e45f1b08ebe2797214293 (patch)
tree9129ff519230fff116787b1ec766755d174b4f4e
parent926ea104593c8c91231dea640277b79a9b5b1991 (diff)
downloadcraftbukkit-1fccb8950186caae273e45f1b08ebe2797214293.tar
craftbukkit-1fccb8950186caae273e45f1b08ebe2797214293.tar.gz
craftbukkit-1fccb8950186caae273e45f1b08ebe2797214293.tar.lz
craftbukkit-1fccb8950186caae273e45f1b08ebe2797214293.tar.xz
craftbukkit-1fccb8950186caae273e45f1b08ebe2797214293.zip
Fix completion of multiple arguments in Bukkit commands
-rw-r--r--src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java80
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java5
2 files changed, 85 insertions, 0 deletions
diff --git a/src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java b/src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java
new file mode 100644
index 00000000..23c7c2c0
--- /dev/null
+++ b/src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java
@@ -0,0 +1,80 @@
+package com.mojang.brigadier.suggestion;
+
+import com.mojang.brigadier.Message;
+import com.mojang.brigadier.context.StringRange;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+public class SuggestionsBuilder {
+ private final String input;
+ public int start;
+ public String remaining;
+ private final List<Suggestion> result = new ArrayList<>();
+
+ public SuggestionsBuilder(final String input, final int start) {
+ this.input = input;
+ this.start = start;
+ this.remaining = input.substring(start);
+ }
+
+ public String getInput() {
+ return input;
+ }
+
+ public int getStart() {
+ return start;
+ }
+
+ public String getRemaining() {
+ return remaining;
+ }
+
+ public Suggestions build() {
+ return Suggestions.create(input, result);
+ }
+
+ public CompletableFuture<Suggestions> buildFuture() {
+ return CompletableFuture.completedFuture(build());
+ }
+
+ public SuggestionsBuilder suggest(final String text) {
+ if (text.equals(remaining)) {
+ return this;
+ }
+ result.add(new Suggestion(StringRange.between(start, input.length()), text));
+ return this;
+ }
+
+ public SuggestionsBuilder suggest(final String text, final Message tooltip) {
+ if (text.equals(remaining)) {
+ return this;
+ }
+ result.add(new Suggestion(StringRange.between(start, input.length()), text, tooltip));
+ return this;
+ }
+
+ public SuggestionsBuilder suggest(final int value) {
+ result.add(new IntegerSuggestion(StringRange.between(start, input.length()), value));
+ return this;
+ }
+
+ public SuggestionsBuilder suggest(final int value, final Message tooltip) {
+ result.add(new IntegerSuggestion(StringRange.between(start, input.length()), value, tooltip));
+ return this;
+ }
+
+ public SuggestionsBuilder add(final SuggestionsBuilder other) {
+ result.addAll(other.result);
+ return this;
+ }
+
+ public SuggestionsBuilder createOffset(final int start) {
+ return new SuggestionsBuilder(input, start);
+ }
+
+ public SuggestionsBuilder restart() {
+ return new SuggestionsBuilder(input, start);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
index d69855ed..acd3f17c 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
@@ -47,6 +47,11 @@ public class BukkitCommandWrapper implements com.mojang.brigadier.Command<Comman
@Override
public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandListenerWrapper> context, SuggestionsBuilder builder) throws CommandSyntaxException {
List<String> results = server.tabComplete(context.getSource().getBukkitSender(), builder.getInput(), context.getSource().getWorld(), context.getSource().getPosition(), true);
+
+ // These are normally only set based on sub nodes, but we have just one giant args node
+ builder.start = builder.getInput().lastIndexOf(' ') + 1;
+ builder.remaining = builder.getInput().substring(builder.start);
+
for (String s : results) {
builder.suggest(s);
}