From 7036beb8ad8dfd3200695537ad7c79a0b49f2387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sat, 26 Sep 2020 17:28:35 +0200 Subject: [PATCH] :bug: Fix command registration for Velocity We need to recreate the Brigadier command node each time a command is extended, and the code was only letting each command get registered once. --- .../commands/brigadier/CloudBrigadierManager.java | 2 +- .../cloudvelocitytest/CloudVelocityTest.java | 15 ++++++++++----- .../commands/velocity/VelocityCommandManager.java | 3 --- .../VelocityPluginRegistrationHandler.java | 8 +------- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/cloud-minecraft/cloud-brigadier/src/main/java/com/intellectualsites/commands/brigadier/CloudBrigadierManager.java b/cloud-minecraft/cloud-brigadier/src/main/java/com/intellectualsites/commands/brigadier/CloudBrigadierManager.java index 9baa17b4..1790e34f 100644 --- a/cloud-minecraft/cloud-brigadier/src/main/java/com/intellectualsites/commands/brigadier/CloudBrigadierManager.java +++ b/cloud-minecraft/cloud-brigadier/src/main/java/com/intellectualsites/commands/brigadier/CloudBrigadierManager.java @@ -282,7 +282,7 @@ public final class CloudBrigadierManager { final LiteralArgumentBuilder literalArgumentBuilder = LiteralArgumentBuilder.literal(root.getLiteral()) .requires(sender -> permissionChecker.test(sender, (CommandPermission) cloudCommand.getNodeMeta() .getOrDefault("permission", Permission.empty()))); - if (cloudCommand.isLeaf() && cloudCommand.getValue() != null) { + if (cloudCommand.getValue() != null && cloudCommand.getValue().getOwningCommand() != null) { literalArgumentBuilder.executes(executor); } final LiteralCommandNode constructedRoot = literalArgumentBuilder.build(); diff --git a/cloud-minecraft/cloud-velocity-test/src/main/java/com/intellectualsites/cloudvelocitytest/CloudVelocityTest.java b/cloud-minecraft/cloud-velocity-test/src/main/java/com/intellectualsites/cloudvelocitytest/CloudVelocityTest.java index a0b5de6b..fb56b341 100644 --- a/cloud-minecraft/cloud-velocity-test/src/main/java/com/intellectualsites/cloudvelocitytest/CloudVelocityTest.java +++ b/cloud-minecraft/cloud-velocity-test/src/main/java/com/intellectualsites/cloudvelocitytest/CloudVelocityTest.java @@ -78,16 +78,21 @@ public class CloudVelocityTest { annotationParser.parse(this); } + @CommandMethod(value = "test", permission = "cloud.root") + private void testRoot(@Nonnull final CommandSource source) { + source.sendMessage(TextComponent.builder("Hello from the root!", NamedTextColor.GOLD)); + } + @CommandMethod("test [str]") private void testCommand(@Nonnull @Argument(value = "str", defaultValue = "potato") final String string, @Nonnull final CommandSource source, @Argument("num") @Range(min = "10", max = "33") final int num) { source.sendMessage(TextComponent.builder() - .append("You wrote: ", NamedTextColor.GOLD) - .append(string, NamedTextColor.RED) - .append(" and ", NamedTextColor.GOLD) - .append(Integer.toString(num), NamedTextColor.RED) - .append("!", NamedTextColor.GOLD) + .append("You wrote: ", NamedTextColor.GOLD) + .append(string, NamedTextColor.RED) + .append(" and ", NamedTextColor.GOLD) + .append(Integer.toString(num), NamedTextColor.RED) + .append("!", NamedTextColor.GOLD) ); } diff --git a/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityCommandManager.java b/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityCommandManager.java index 7bfa6d62..88848ef3 100644 --- a/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityCommandManager.java +++ b/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityCommandManager.java @@ -67,9 +67,6 @@ public class VelocityCommandManager extends CommandManager { @Override public final boolean hasPermission(@Nonnull final C sender, @Nonnull final String permission) { - if (permission.isEmpty()) { - return true; - } return this.backwardsCommandSenderMapper.apply(sender).hasPermission(permission); } diff --git a/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityPluginRegistrationHandler.java b/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityPluginRegistrationHandler.java index 79ae1ee7..1dbbb425 100644 --- a/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityPluginRegistrationHandler.java +++ b/cloud-minecraft/cloud-velocity/src/main/java/com/intellectualsites/commands/velocity/VelocityPluginRegistrationHandler.java @@ -41,9 +41,7 @@ import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; import javax.annotation.Nonnull; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.concurrent.CompletionException; final class VelocityPluginRegistrationHandler implements CommandRegistrationHandler { @@ -53,7 +51,6 @@ final class VelocityPluginRegistrationHandler implements CommandRegistrationH + "Please contact the server administrators if you believe that this is in error."; private static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command. Type \"/help\" for help."; - private final Map, BrigadierCommand> registeredCommands = new HashMap<>(); private CloudBrigadierManager brigadierManager; private VelocityCommandManager manager; @@ -70,9 +67,6 @@ final class VelocityPluginRegistrationHandler implements CommandRegistrationH @Override public boolean registerCommand(@Nonnull final Command command) { final CommandArgument argument = command.getArguments().get(0); - if (this.registeredCommands.containsKey(argument)) { - return false; - } final List aliases = ((StaticArgument) argument).getAlternativeAliases(); final BrigadierCommand brigadierCommand = new BrigadierCommand( this.brigadierManager.createLiteralCommandNode(command.getArguments().get(0).getName(), (Command) command, @@ -137,8 +131,8 @@ final class VelocityPluginRegistrationHandler implements CommandRegistrationH final CommandMeta commandMeta = this.manager.getProxyServer().getCommandManager() .metaBuilder(brigadierCommand) .aliases(aliases.toArray(new String[0])).build(); + aliases.forEach(this.manager.getProxyServer().getCommandManager()::unregister); this.manager.getProxyServer().getCommandManager().register(commandMeta, brigadierCommand); - this.registeredCommands.put(argument, brigadierCommand); return true; }