From 1fccb8950186caae273e45f1b08ebe2797214293 Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 16 Jul 2018 21:03:46 +1000 Subject: Fix completion of multiple arguments in Bukkit commands --- .../brigadier/suggestion/SuggestionsBuilder.java | 80 ++++++++++++++++++++++ .../craftbukkit/command/BukkitCommandWrapper.java | 5 ++ 2 files changed, 85 insertions(+) create mode 100644 src/main/java/com/mojang/brigadier/suggestion/SuggestionsBuilder.java 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 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 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 getSuggestions(CommandContext context, SuggestionsBuilder builder) throws CommandSyntaxException { List 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); } -- cgit v1.2.3