From 3a135ada91f3d50eaf21c0e006fe20e605edc348 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Fri, 31 May 2024 08:46:42 -0700 Subject: [PATCH] Fire TabCompleteEvent for legacy commands (#10834) --- patches/api/Brigadier-based-command-API.patch | 13 +++++++++++++ patches/server/Brigadier-based-command-API.patch | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/patches/api/Brigadier-based-command-API.patch b/patches/api/Brigadier-based-command-API.patch index 4be5e07741..e6208fc939 100644 --- a/patches/api/Brigadier-based-command-API.patch +++ b/patches/api/Brigadier-based-command-API.patch @@ -1974,3 +1974,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Reload complete."); return true; +diff --git a/src/main/java/org/bukkit/event/server/TabCompleteEvent.java b/src/main/java/org/bukkit/event/server/TabCompleteEvent.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/event/server/TabCompleteEvent.java ++++ b/src/main/java/org/bukkit/event/server/TabCompleteEvent.java +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull; + * themselves. Plugins wishing to remove commands from tab completion are + * advised to ensure the client does not have permission for the relevant + * commands, or use {@link PlayerCommandSendEvent}. ++ * @apiNote Only called for bukkit API commands {@link org.bukkit.command.Command} and ++ * {@link org.bukkit.command.CommandExecutor} and not for brigadier commands ({@link io.papermc.paper.command.brigadier.Commands}). + */ + public class TabCompleteEvent extends Event implements Cancellable { + diff --git a/patches/server/Brigadier-based-command-API.patch b/patches/server/Brigadier-based-command-API.patch index ef780f83b1..e9ec61aafd 100644 --- a/patches/server/Brigadier-based-command-API.patch +++ b/patches/server/Brigadier-based-command-API.patch @@ -1845,6 +1845,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import io.papermc.paper.command.brigadier.CommandSourceStack; ++import java.util.ArrayList; ++import java.util.Collections; +import net.minecraft.commands.CommandSource; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; @@ -1857,6 +1859,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.logging.Level; ++import org.bukkit.entity.Entity; ++import org.bukkit.entity.Player; ++import org.bukkit.event.server.TabCompleteEvent; + +public class BukkitCommandNode extends LiteralCommandNode { + @@ -1951,6 +1956,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + Bukkit.getServer().getLogger().log(Level.SEVERE, "Exception when " + sender.getName() + " attempted to tab complete " + builder.getRemaining(), ex); + } + ++ if (sender instanceof final Player player) { ++ TabCompleteEvent tabEvent = new org.bukkit.event.server.TabCompleteEvent(player, builder.getInput(), results != null ? results : new ArrayList<>(), true, pos); // Paper - AsyncTabCompleteEvent ++ if (!tabEvent.callEvent()) { ++ results = null; ++ } else { ++ results = tabEvent.getCompletions(); ++ } ++ } + // Paper end + if (results == null) { + return builder.buildFuture();