diff options
-rw-r--r-- | patches/server/1053-Fix-CommandRegisteredEvent-not-called.patch | 96 |
1 files changed, 83 insertions, 13 deletions
diff --git a/patches/server/1053-Fix-CommandRegisteredEvent-not-called.patch b/patches/server/1053-Fix-CommandRegisteredEvent-not-called.patch index c7d6dc01c0..3baed9fcef 100644 --- a/patches/server/1053-Fix-CommandRegisteredEvent-not-called.patch +++ b/patches/server/1053-Fix-CommandRegisteredEvent-not-called.patch @@ -4,42 +4,75 @@ Date: Wed, 29 May 2024 13:15:43 -0700 Subject: [PATCH] Fix CommandRegisteredEvent not called -diff --git a/src/main/java/io/papermc/paper/command/brigadier/LazyCommandNode.java b/src/main/java/io/papermc/paper/command/brigadier/LazyCommandNode.java +diff --git a/src/main/java/io/papermc/paper/command/brigadier/LazyBukkitCommandNode.java b/src/main/java/io/papermc/paper/command/brigadier/LazyBukkitCommandNode.java new file mode 100644 -index 0000000000000000000000000000000000000000..2ca3ca97874c7a8184ee0ef951c15bacf4d4eadb +index 0000000000000000000000000000000000000000..72d7b46fdcfdfc8a9bac4b7f7ef7eb2a5b0a08ef --- /dev/null -+++ b/src/main/java/io/papermc/paper/command/brigadier/LazyCommandNode.java -@@ -0,0 +1,21 @@ ++++ b/src/main/java/io/papermc/paper/command/brigadier/LazyBukkitCommandNode.java +@@ -0,0 +1,33 @@ +package io.papermc.paper.command.brigadier; + +import com.mojang.brigadier.tree.LiteralCommandNode; ++import io.papermc.paper.command.brigadier.bukkit.BukkitCommandNode; +import java.util.function.Supplier; ++import org.bukkit.command.Command; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.framework.qual.DefaultQualifier; + +@DefaultQualifier(NonNull.class) -+public class LazyCommandNode<S> extends LiteralCommandNode<S> { -+ private final Supplier<@Nullable LiteralCommandNode<S>> nodeSupplier; ++public class LazyBukkitCommandNode<S> extends LiteralCommandNode<S> { ++ private final Command command; ++ private final Supplier<@Nullable BukkitCommandNode> nodeSupplier; + -+ public LazyCommandNode(final String literal, final Supplier<@Nullable LiteralCommandNode<S>> nodeSupplier) { ++ public LazyBukkitCommandNode( ++ final String literal, ++ final Command command, ++ final Supplier<@Nullable BukkitCommandNode> nodeSupplier ++ ) { + super(literal, null, null, null, null, false); ++ this.command = command; + this.nodeSupplier = nodeSupplier; + } + -+ public @Nullable LiteralCommandNode<S> create() { ++ public @Nullable BukkitCommandNode create() { + return this.nodeSupplier.get(); + } ++ ++ public Command bukkitCommand() { ++ return this.command; ++ } +} +diff --git a/src/main/java/io/papermc/paper/command/brigadier/PaperBrigadier.java b/src/main/java/io/papermc/paper/command/brigadier/PaperBrigadier.java +index 4acf7c3bcfbe61431bfbfa3c8addb33f671eb498..ab9a71faa6696cfe8cc88cd9513cda8b9fad1b6a 100644 +--- a/src/main/java/io/papermc/paper/command/brigadier/PaperBrigadier.java ++++ b/src/main/java/io/papermc/paper/command/brigadier/PaperBrigadier.java +@@ -64,9 +64,15 @@ public final class PaperBrigadier { + CommandDispatcher erasedDispatcher = before.getDispatcher(); + + for (Object node : erasedDispatcher.getRoot().getChildren()) { +- if (node instanceof CommandNode<?> commandNode && commandNode.getCommand() instanceof BukkitCommandNode.BukkitBrigCommand) { ++ if (node instanceof BukkitCommandNode) { + after.getDispatcher().getRoot().removeCommand(((CommandNode<?>) node).getName()); // Remove already existing commands + after.getDispatcher().getRoot().addChild((CommandNode<net.minecraft.commands.CommandSourceStack>) node); ++ } else if (node instanceof LazyBukkitCommandNode<?> lazy) { ++ after.getDispatcher().getRoot().removeCommand(lazy.getName()); // Remove already existing commands ++ final BukkitCommandNode newNode = lazy.create(); ++ if (newNode != null) { ++ after.getDispatcher().getRoot().addChild((CommandNode) newNode); ++ } + } + } + } diff --git a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java -index f0cc27640bb3db275295a298d608c9d9f88df617..566bf6729e4e0a768b8ec3a2e574ae681f8eaf7b 100644 +index f0cc27640bb3db275295a298d608c9d9f88df617..6e2911a31f6ba06c47b7e22912447912501de602 100644 --- a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java +++ b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitBrigForwardingMap.java @@ -5,6 +5,7 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; import io.papermc.paper.command.brigadier.CommandSourceStack; -+import io.papermc.paper.command.brigadier.LazyCommandNode; ++import io.papermc.paper.command.brigadier.LazyBukkitCommandNode; import io.papermc.paper.command.brigadier.PaperBrigadier; import io.papermc.paper.command.brigadier.PaperCommands; import java.util.AbstractCollection; @@ -68,7 +101,7 @@ index f0cc27640bb3db275295a298d608c9d9f88df617..566bf6729e4e0a768b8ec3a2e574ae68 + final List<String> remove = new ArrayList<>(); + final List<LiteralCommandNode<CommandSourceStack>> list = new ArrayList<>(); + for (final CommandNode<CommandSourceStack> child : this.getDispatcher().getRoot().getChildren()) { -+ if (child instanceof LazyCommandNode<CommandSourceStack> lazy) { ++ if (child instanceof LazyBukkitCommandNode<CommandSourceStack> lazy) { + remove.add(child.getName()); + final LiteralCommandNode<CommandSourceStack> newNode = lazy.create(); + if (newNode != null) { @@ -87,14 +120,33 @@ index f0cc27640bb3db275295a298d608c9d9f88df617..566bf6729e4e0a768b8ec3a2e574ae68 @Override public int size() { return this.getDispatcher().getRoot().getChildren().size(); -@@ -95,7 +119,18 @@ public class BukkitBrigForwardingMap extends HashMap<String, Command> { +@@ -70,6 +94,8 @@ public class BukkitBrigForwardingMap extends HashMap<String, Command> { + // If child is a bukkit command node, we can convert it! + if (child instanceof BukkitCommandNode bukkitCommandNode) { + return bukkitCommandNode.getBukkitCommand().equals(value); ++ } else if (child instanceof LazyBukkitCommandNode<CommandSourceStack> lazy) { ++ return lazy.bukkitCommand().equals(value); + } + } + +@@ -85,6 +111,8 @@ public class BukkitBrigForwardingMap extends HashMap<String, Command> { + + if (node instanceof BukkitCommandNode bukkitCommandNode) { + return bukkitCommandNode.getBukkitCommand(); ++ } else if (node instanceof LazyBukkitCommandNode<?> lazyBukkitCommandNode) { ++ return lazyBukkitCommandNode.bukkitCommand(); + } + + return PaperBrigadier.wrapNode(node); +@@ -95,7 +123,19 @@ public class BukkitBrigForwardingMap extends HashMap<String, Command> { public Command put(String key, Command value) { Command old = this.get(key); this.getDispatcher().getRoot().removeCommand(key); // Override previous command - this.getDispatcher().getRoot().addChild(BukkitCommandNode.of(key, value)); + if (!this.synced) { -+ final LazyCommandNode<CommandSourceStack> node = new LazyCommandNode<>( ++ final LazyBukkitCommandNode<CommandSourceStack> node = new LazyBukkitCommandNode<>( + key, ++ value, + () -> BukkitCommandNode.create(key, value, this.getDispatcher()) + ); + this.getDispatcher().getRoot().addChild(node); @@ -107,6 +159,24 @@ index f0cc27640bb3db275295a298d608c9d9f88df617..566bf6729e4e0a768b8ec3a2e574ae68 return old; } +@@ -187,6 +227,8 @@ public class BukkitBrigForwardingMap extends HashMap<String, Command> { + this.lastFetched = next; + if (next instanceof BukkitCommandNode bukkitCommandNode) { + return bukkitCommandNode.getBukkitCommand(); ++ } else if (next instanceof LazyBukkitCommandNode<CommandSourceStack> lazyBukkitCommandNode) { ++ return lazyBukkitCommandNode.bukkitCommand(); + } else { + return PaperBrigadier.wrapNode(next); + } +@@ -304,6 +346,8 @@ public class BukkitBrigForwardingMap extends HashMap<String, Command> { + private Map.Entry<String, Command> nodeToEntry(CommandNode<?> node) { + if (node instanceof BukkitCommandNode bukkitCommandNode) { + return this.mutableEntry(bukkitCommandNode.getName(), bukkitCommandNode.getBukkitCommand()); ++ } else if (node instanceof LazyBukkitCommandNode<?> lazyBukkitCommandNode) { ++ return this.mutableEntry(lazyBukkitCommandNode.getName(), lazyBukkitCommandNode.bukkitCommand()); + } else { + Command wrapped = PaperBrigadier.wrapNode(node); + return this.mutableEntry(node.getName(), wrapped); diff --git a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java index 10a113b057b0a4d27cce3bae975e1108aaa7b517..dd9a586789995cde207e3b4c79ff3dfeba944135 100644 --- a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java |