From 5d777995f432ad638fea5d3ccf6dc64e1c8e31df Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Thu, 16 Feb 2023 18:07:30 -0800 Subject: [PATCH] Fix calling UnknownCommandEvent (#8232) --- patches/api/Add-UnknownCommandEvent.patch | 7 +- patches/server/Add-UnknownCommandEvent.patch | 88 ++++++++++++++++++- .../Vanilla-command-permission-fixes.patch | 5 +- 3 files changed, 91 insertions(+), 9 deletions(-) diff --git a/patches/api/Add-UnknownCommandEvent.patch b/patches/api/Add-UnknownCommandEvent.patch index 152c19c168..d43167b7ce 100644 --- a/patches/api/Add-UnknownCommandEvent.patch +++ b/patches/api/Add-UnknownCommandEvent.patch @@ -17,6 +17,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import org.bukkit.command.CommandSender; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; ++import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + @@ -29,11 +30,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + @NotNull private String commandLine; + @Nullable private Component message; + -+ @Deprecated -+ public UnknownCommandEvent(@NotNull final CommandSender sender, @NotNull final String commandLine, @Nullable final String message) { -+ this(sender, commandLine, message == null ? null : LegacyComponentSerializer.legacySection().deserialize(message)); -+ } -+ + public UnknownCommandEvent(@NotNull final CommandSender sender, @NotNull final String commandLine, @Nullable final Component message) { + super(false); + this.sender = sender; @@ -96,6 +92,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + * @return Unknown command message + */ + @Nullable ++ @Contract(pure = true) + public Component message() { + return this.message; + } diff --git a/patches/server/Add-UnknownCommandEvent.patch b/patches/server/Add-UnknownCommandEvent.patch index c9f550790a..21e097112f 100644 --- a/patches/server/Add-UnknownCommandEvent.patch +++ b/patches/server/Add-UnknownCommandEvent.patch @@ -3,18 +3,104 @@ From: Sweepyoface Date: Sat, 17 Jun 2017 18:48:21 -0400 Subject: [PATCH] Add UnknownCommandEvent +Co-authored-by: Jake Potrebic +diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/commands/CommandSourceStack.java ++++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java +@@ -0,0 +0,0 @@ public class CommandSourceStack implements SharedSuggestionProvider { + } + + public void sendFailure(Component message) { ++ // Paper start ++ this.sendFailure(message, true); ++ } ++ public void sendFailure(Component message, boolean withStyle) { ++ // Paper end + if (this.source.acceptsFailure() && !this.silent) { +- this.source.sendSystemMessage(Component.empty().append(message).withStyle(ChatFormatting.RED)); ++ this.source.sendSystemMessage(withStyle ? Component.empty().append(message).withStyle(ChatFormatting.RED) : message); // Paper + } + + } +diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/commands/Commands.java ++++ b/src/main/java/net/minecraft/commands/Commands.java +@@ -0,0 +0,0 @@ public class Commands { + public static final int LEVEL_ADMINS = 3; + public static final int LEVEL_OWNERS = 4; + private final com.mojang.brigadier.CommandDispatcher dispatcher = new com.mojang.brigadier.CommandDispatcher(); ++ public final java.util.List> vanillaCommandNodes = new java.util.ArrayList<>(); // Paper + + public Commands(Commands.CommandSelection environment, CommandBuildContext commandRegistryAccess) { + this(); // CraftBukkit +@@ -0,0 +0,0 @@ public class Commands { + if (environment.includeIntegrated) { + PublishCommand.register(this.dispatcher); + } ++ this.vanillaCommandNodes.addAll(this.dispatcher.getRoot().getChildren()); // Paper + + // CraftBukkit start + } +@@ -0,0 +0,0 @@ public class Commands { + b1 = 0; + return b1; + } catch (CommandSyntaxException commandsyntaxexception) { +- commandlistenerwrapper.sendFailure(ComponentUtils.fromMessage(commandsyntaxexception.getRawMessage())); ++ // Paper start ++ final net.kyori.adventure.text.TextComponent.Builder builder = net.kyori.adventure.text.Component.text(); ++ if ((parseresults.getContext().getNodes().isEmpty() || !this.vanillaCommandNodes.contains(parseresults.getContext().getNodes().get(0).getNode()))) { ++ if (!org.spigotmc.SpigotConfig.unknownCommandMessage.isEmpty()) { ++ builder.append(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.unknownCommandMessage)); ++ } ++ } else { ++ // commandlistenerwrapper.sendFailure(ComponentUtils.fromMessage(commandsyntaxexception.getRawMessage())); ++ builder.color(net.kyori.adventure.text.format.NamedTextColor.RED).append(io.papermc.paper.brigadier.PaperBrigadier.componentFromMessage(commandsyntaxexception.getRawMessage())); ++ // Paper end + if (commandsyntaxexception.getInput() != null && commandsyntaxexception.getCursor() >= 0) { + int j = Math.min(commandsyntaxexception.getInput().length(), commandsyntaxexception.getCursor()); + MutableComponent ichatmutablecomponent = Component.empty().withStyle(ChatFormatting.GRAY).withStyle((chatmodifier) -> { +@@ -0,0 +0,0 @@ public class Commands { + } + + ichatmutablecomponent.append((Component) Component.translatable("command.context.here").withStyle(ChatFormatting.RED, ChatFormatting.ITALIC)); +- commandlistenerwrapper.sendFailure(ichatmutablecomponent); ++ // Paper start ++ // commandlistenerwrapper.sendFailure(ichatmutablecomponent); ++ builder ++ .append(net.kyori.adventure.text.Component.newline()) ++ .append(io.papermc.paper.adventure.PaperAdventure.asAdventure(ichatmutablecomponent)); ++ } ++ } ++ org.bukkit.event.command.UnknownCommandEvent event = new org.bukkit.event.command.UnknownCommandEvent(commandlistenerwrapper.getBukkitSender(), s, org.spigotmc.SpigotConfig.unknownCommandMessage.isEmpty() ? null : builder.build()); ++ org.bukkit.Bukkit.getServer().getPluginManager().callEvent(event); ++ if (event.message() != null) { ++ commandlistenerwrapper.sendFailure(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.message()), false); ++ // Paper end + } + + b1 = 0; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -0,0 +0,0 @@ public final class CraftServer implements Server { + + if (command instanceof VanillaCommandWrapper) { + LiteralCommandNode node = (LiteralCommandNode) ((VanillaCommandWrapper) command).vanillaCommand; ++ dispatcher.vanillaCommandNodes.add(node); // Paper + if (!node.getLiteral().equals(label)) { + LiteralCommandNode clone = new LiteralCommandNode(label, node.getCommand(), node.getRequirement(), node.getRedirect(), node.getRedirectModifier(), node.isFork()); + @@ -0,0 +0,0 @@ public final class CraftServer implements Server { // Spigot start if (!org.spigotmc.SpigotConfig.unknownCommandMessage.isEmpty()) { - sender.sendMessage(org.spigotmc.SpigotConfig.unknownCommandMessage); + // Paper start -+ org.bukkit.event.command.UnknownCommandEvent event = new org.bukkit.event.command.UnknownCommandEvent(sender, commandLine, org.spigotmc.SpigotConfig.unknownCommandMessage); ++ org.bukkit.event.command.UnknownCommandEvent event = new org.bukkit.event.command.UnknownCommandEvent(sender, commandLine, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.unknownCommandMessage)); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.message() != null) { + sender.sendMessage(event.message()); diff --git a/patches/server/Vanilla-command-permission-fixes.patch b/patches/server/Vanilla-command-permission-fixes.patch index a8391225c3..da133efe99 100644 --- a/patches/server/Vanilla-command-permission-fixes.patch +++ b/patches/server/Vanilla-command-permission-fixes.patch @@ -37,10 +37,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -0,0 +0,0 @@ public class Commands { - if (environment.includeIntegrated) { - PublishCommand.register(this.dispatcher); } -- + this.vanillaCommandNodes.addAll(this.dispatcher.getRoot().getChildren()); // Paper + + // Paper start + for (final CommandNode node : this.dispatcher.getRoot().getChildren()) { + if (node.getRequirement() == com.mojang.brigadier.builder.ArgumentBuilder.defaultRequirement()) {