From ebbbc3a1f0422256ccff4f5dc790f4f938d2dfee Mon Sep 17 00:00:00 2001 From: Marc Baloup Date: Mon, 14 Jul 2025 00:02:07 +0200 Subject: [PATCH] Fixes to support last Paper 1.21.4 build --- .../paper/commands/PaperBrigadierCommand.java | 41 ++++++++++++------ .../paper/reflect/PandalibPaperReflect.java | 4 +- .../wrapper/brigadier/CommandNode.java | 11 +++++ .../paper/commands/PluginCommandMeta.java | 39 +++++++++++++++++ .../paper/commands/PluginCommandNode.java | 43 ------------------- 5 files changed, 79 insertions(+), 59 deletions(-) create mode 100644 pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandMeta.java delete mode 100644 pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandNode.java diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/commands/PaperBrigadierCommand.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/commands/PaperBrigadierCommand.java index af5d598..c8f2997 100644 --- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/commands/PaperBrigadierCommand.java +++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/commands/PaperBrigadierCommand.java @@ -19,7 +19,7 @@ import fr.pandacube.lib.paper.reflect.wrapper.craftbukkit.VanillaCommandWrapper; import fr.pandacube.lib.paper.reflect.wrapper.minecraft.commands.Coordinates; import fr.pandacube.lib.paper.reflect.wrapper.minecraft.commands.Vec3Argument; import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.BukkitCommandNode; -import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.PluginCommandNode; +import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.PluginCommandMeta; import fr.pandacube.lib.players.standalone.AbstractOffPlayer; import fr.pandacube.lib.players.standalone.AbstractOnlinePlayer; import fr.pandacube.lib.players.standalone.AbstractPlayerManager; @@ -46,7 +46,6 @@ import java.util.Set; import java.util.function.Predicate; import java.util.stream.Stream; -import static fr.pandacube.lib.reflect.wrapper.ReflectWrapper.unwrap; import static fr.pandacube.lib.reflect.wrapper.ReflectWrapper.wrap; /** @@ -199,6 +198,10 @@ public abstract class PaperBrigadierCommand extends BrigadierCommand(event.registrar().register(commandNode, description, List.of(aliases))); doPostRegistrationFixes(); + @SuppressWarnings("unchecked") + fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode registeredNode = wrap(vanillaPaperDispatcher.getRoot().getChild(commandNode.getName()), fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode.class); + + if (registrationPolicy == RegistrationPolicy.ALL) { // enforce registration of aliases for (String alias : aliases) { @@ -221,11 +224,13 @@ public abstract class PaperBrigadierCommand extends BrigadierCommand actualNode = vanillaPaperDispatcher.getRoot().getChild(aliasToForce); + @SuppressWarnings("unchecked") + fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode wrappedCommandNode = wrap(actualNode, fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode.class); if (actualNode != null) { - //Log.info("Forcing registration of alias /" + aliasToForce + " for command /" + commandNode.getName() + ": replacing " + getCommandIdentity(actualNode) + "?"); - if (PluginCommandNode.REFLECT.get().isInstance(actualNode)) { - PluginCommandNode pcn = wrap(actualNode, PluginCommandNode.class); - if (pcn.getPlugin().equals(plugin)) + Log.warning("Forcing registration of alias /" + aliasToForce + " for command /" + commandNode.getName() + ": replacing " + getCommandIdentity(actualNode) + "?"); + if (wrappedCommandNode.pluginCommandMeta() != null) { + PluginCommandMeta meta = wrappedCommandNode.pluginCommandMeta(); + if (meta.plugin().equals(plugin)) return; } else if (BukkitCommandNode.REFLECT.get().isInstance(actualNode)) { @@ -235,10 +240,13 @@ public abstract class PaperBrigadierCommand extends BrigadierCommand c.getName().equals(aliasToForce)); } - /*else { - Log.info("Forcing registration of alias /" + aliasToForce + " for command /" + commandNode.getName() + ": no command found for alias. Adding alias."); - }*/ - LiteralCommandNode newPCN = unwrap(new PluginCommandNode(aliasToForce, plugin.getPluginMeta(), commandNode, description)); + /*else { + Log.info("Forcing registration of alias /" + aliasToForce + " for command /" + commandNode.getName() + ": no command found for alias. Adding alias."); + }*/ + LiteralCommandNode newPCN = getAliasNode(commandNode, aliasToForce); + @SuppressWarnings("unchecked") + fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode wrappedNewPCN = wrap(newPCN, fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode.class); + wrappedNewPCN.pluginCommandMeta(registeredNode.pluginCommandMeta()); vanillaPaperDispatcher.getRoot().addChild(newPCN); } }); @@ -296,9 +304,12 @@ public abstract class PaperBrigadierCommand extends BrigadierCommand command) { - if (PluginCommandNode.REFLECT.get().isInstance(command)) { - PluginCommandNode wrappedPCN = wrap(command, PluginCommandNode.class); - return "Node /" + command.getName() + " from plugin " + wrappedPCN.getPlugin().getName(); + @SuppressWarnings("unchecked") + fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode wrappedCommandNode = wrap(command, fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode.class); + + if (wrappedCommandNode.pluginCommandMeta() != null) { + PluginCommandMeta meta = wrappedCommandNode.pluginCommandMeta(); + return "Node /" + command.getName() + " from plugin " + meta.plugin().getName(); } else if (BukkitCommandNode.REFLECT.get().isInstance(command)) { BukkitCommandNode wrappedBCN = wrap(command, BukkitCommandNode.class); @@ -324,7 +335,9 @@ public abstract class PaperBrigadierCommand extends BrigadierCommand command) { - if (PluginCommandNode.REFLECT.get().isInstance(command)) { + @SuppressWarnings("unchecked") + fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode wrappedCommandNode = wrap(command, fr.pandacube.lib.paper.reflect.wrapper.brigadier.CommandNode.class); + if (wrappedCommandNode.pluginCommandMeta() != null) { return true; } else if (BukkitCommandNode.REFLECT.get().isInstance(command)) { diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java index 62951dd..71d5a89 100644 --- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java +++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java @@ -75,7 +75,7 @@ import fr.pandacube.lib.paper.reflect.wrapper.netty.Unpooled; import fr.pandacube.lib.paper.reflect.wrapper.paper.PaperAdventure; import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.BukkitCommandNode; import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.PaperBrigadier; -import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.PluginCommandNode; +import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.PluginCommandMeta; import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.ShadowBrigNode; import fr.pandacube.lib.paper.reflect.wrapper.paper.configuration.FallbackValue_Int; import fr.pandacube.lib.paper.reflect.wrapper.paper.configuration.WorldConfiguration; @@ -210,7 +210,7 @@ public class PandalibPaperReflect { // paper.commands thAcc.catchThrowable(() -> initWrapper(BukkitCommandNode.class, BukkitCommandNode.REFLECT.get())); thAcc.catchThrowable(() -> initWrapper(PaperBrigadier.class, PaperBrigadier.REFLECT.get())); - thAcc.catchThrowable(() -> initWrapper(PluginCommandNode.class, PluginCommandNode.REFLECT.get())); + thAcc.catchThrowable(() -> initWrapper(PluginCommandMeta.class, PluginCommandMeta.REFLECT.get())); thAcc.catchThrowable(() -> initWrapper(ShadowBrigNode.class, ShadowBrigNode.REFLECT.get())); // paper.configuration thAcc.catchThrowable(() -> initWrapper(FallbackValue_Int.class, FallbackValue_Int.REFLECT.get())); diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/brigadier/CommandNode.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/brigadier/CommandNode.java index c89d14e..e6adc0b 100644 --- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/brigadier/CommandNode.java +++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/brigadier/CommandNode.java @@ -1,6 +1,8 @@ package fr.pandacube.lib.paper.reflect.wrapper.brigadier; +import fr.pandacube.lib.paper.reflect.wrapper.paper.commands.PluginCommandMeta; import fr.pandacube.lib.reflect.Reflect; +import fr.pandacube.lib.reflect.ReflectField; import fr.pandacube.lib.reflect.wrapper.ReflectWrapperTyped; import fr.pandacube.lib.reflect.ReflectClass; import fr.pandacube.lib.reflect.ReflectMethod; @@ -11,11 +13,20 @@ import static fr.pandacube.lib.util.ThrowableUtil.wrapReflectEx; public class CommandNode extends ReflectWrapperTyped> { public static final ReflectClass REFLECT = Reflect.ofClass(com.mojang.brigadier.tree.CommandNode.class); private static final ReflectMethod removeCommand = wrapEx(() -> REFLECT.method("removeCommand", String.class)); + private static final ReflectField pluginCommandMeta = wrapEx(() -> REFLECT.field("pluginCommandMeta")); public void removeCommand(String cmd) { wrapReflectEx(() -> removeCommand.invoke(__getRuntimeInstance(), cmd)); } + public PluginCommandMeta pluginCommandMeta() { + return wrap(wrapReflectEx(() -> pluginCommandMeta.getValue(__getRuntimeInstance())), PluginCommandMeta.class); + } + + public void pluginCommandMeta(PluginCommandMeta meta) { + wrapReflectEx(() -> pluginCommandMeta.setValue(__getRuntimeInstance(), unwrap(meta))); + } + protected CommandNode(Object obj) { super(obj); } diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandMeta.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandMeta.java new file mode 100644 index 0000000..5cd1865 --- /dev/null +++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandMeta.java @@ -0,0 +1,39 @@ +package fr.pandacube.lib.paper.reflect.wrapper.paper.commands; + +import fr.pandacube.lib.reflect.Reflect; +import fr.pandacube.lib.reflect.ReflectClass; +import fr.pandacube.lib.reflect.ReflectMethod; +import fr.pandacube.lib.reflect.wrapper.ReflectWrapper; +import org.bukkit.plugin.Plugin; + +import java.util.List; + +import static fr.pandacube.lib.util.ThrowableUtil.wrapEx; +import static fr.pandacube.lib.util.ThrowableUtil.wrapReflectEx; + +public class PluginCommandMeta extends ReflectWrapper { + public static final ReflectClass REFLECT = wrapEx(() -> Reflect.ofClass("io.papermc.paper.command.brigadier.PluginCommandMeta")); + private static final ReflectMethod plugin = wrapEx(() -> REFLECT.method("plugin")); + private static final ReflectMethod description = wrapEx(() -> REFLECT.method("description")); + private static final ReflectMethod aliases = wrapEx(() -> REFLECT.method("aliases")); + + + public Plugin plugin() { + return (Plugin) wrapReflectEx(() -> plugin.invoke(__getRuntimeInstance())); + } + + public String description() { + return (String) wrapReflectEx(() -> description.invoke(__getRuntimeInstance())); + } + + @SuppressWarnings("unchecked") + public List aliases() { + return (List) wrapReflectEx(() -> aliases.invoke(__getRuntimeInstance())); + } + + + + protected PluginCommandMeta(Object obj) { + super(obj); + } +} diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandNode.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandNode.java deleted file mode 100644 index 46db7f4..0000000 --- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/paper/commands/PluginCommandNode.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.pandacube.lib.paper.reflect.wrapper.paper.commands; - -import com.mojang.brigadier.tree.LiteralCommandNode; -import fr.pandacube.lib.reflect.Reflect; -import fr.pandacube.lib.reflect.ReflectClass; -import fr.pandacube.lib.reflect.ReflectConstructor; -import fr.pandacube.lib.reflect.ReflectMethod; -import fr.pandacube.lib.reflect.wrapper.ReflectWrapperTyped; -import io.papermc.paper.command.brigadier.CommandSourceStack; -import io.papermc.paper.plugin.configuration.PluginMeta; -import org.bukkit.plugin.Plugin; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import static fr.pandacube.lib.util.ThrowableUtil.wrapEx; -import static fr.pandacube.lib.util.ThrowableUtil.wrapReflectEx; - -public class PluginCommandNode extends ReflectWrapperTyped> { - public static final ReflectClass REFLECT = wrapEx(() -> Reflect.ofClass("io.papermc.paper.command.brigadier.PluginCommandNode")); - private static final ReflectMethod getPlugin = wrapEx(() -> REFLECT.method("getPlugin")); - private static final ReflectMethod getDescription = wrapEx(() -> REFLECT.method("getDescription")); - private static final ReflectConstructor CONSTRUCTOR = wrapEx(() -> REFLECT.constructor(String.class, PluginMeta.class, LiteralCommandNode.class, String.class)); - - - public PluginCommandNode(@NotNull String literal, @NotNull PluginMeta plugin, @NotNull LiteralCommandNode rootLiteral, @Nullable String description) { - this(wrapReflectEx(() -> CONSTRUCTOR.instantiate(literal, plugin, rootLiteral, description))); - } - - - public Plugin getPlugin() { - return (Plugin) wrapReflectEx(() -> getPlugin.invoke(__getRuntimeInstance())); - } - - public String getDescription() { - return (String) wrapReflectEx(() -> getDescription.invoke(__getRuntimeInstance())); - } - - - - protected PluginCommandNode(Object obj) { - super(obj); - } -}