diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java b/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java index 4539f471..bf51656d 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitCommandContexts.java @@ -117,7 +117,10 @@ public class BukkitCommandContexts extends CommandContexts getRegisteredRootCommands() { + return Collections.unmodifiableCollection(registeredCommands.values()); + } + @Override public BukkitCommandIssuer getCommandIssuer(Object issuer) { if (!(issuer instanceof CommandSender)) { diff --git a/bungee/src/main/java/co/aikar/commands/BungeeCommandManager.java b/bungee/src/main/java/co/aikar/commands/BungeeCommandManager.java index c8a14347..4d745f80 100644 --- a/bungee/src/main/java/co/aikar/commands/BungeeCommandManager.java +++ b/bungee/src/main/java/co/aikar/commands/BungeeCommandManager.java @@ -31,6 +31,8 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -175,6 +177,11 @@ public class BungeeCommandManager extends CommandManager< public RootCommand createRootCommand(String cmd) { return new BungeeRootCommand(this, cmd); } + + @Override + public Collection getRegisteredRootCommands() { + return Collections.unmodifiableCollection(registeredCommands.values()); + } @Override public BungeeCommandExecutionContext createCommandContext(RegisteredCommand command, CommandParameter parameter, CommandIssuer sender, List args, int i, Map passedArgs) { diff --git a/core/src/main/java/co/aikar/commands/BaseCommand.java b/core/src/main/java/co/aikar/commands/BaseCommand.java index da3076c9..e757da4f 100644 --- a/core/src/main/java/co/aikar/commands/BaseCommand.java +++ b/core/src/main/java/co/aikar/commands/BaseCommand.java @@ -145,6 +145,10 @@ public abstract class BaseCommand { * The conditions of the command. This may be null if no conditions has been provided. */ @Nullable String conditions; + /** + * Identifies if the command has an explicit help command annotated with {@link HelpCommand} + */ + boolean hasHelpCommand; /** * The handler of all uncaught exceptions thrown by the user's command implementation. @@ -327,6 +331,7 @@ public abstract class BaseCommand { sublist = commandAliases; } else if (helpCommand != null) { sublist = helpCommand; + hasHelpCommand = true; } boolean preCommand = annotations.hasAnnotation(method, PreCommand.class); diff --git a/core/src/main/java/co/aikar/commands/CommandHelp.java b/core/src/main/java/co/aikar/commands/CommandHelp.java index c5b4fef5..693c12e8 100644 --- a/core/src/main/java/co/aikar/commands/CommandHelp.java +++ b/core/src/main/java/co/aikar/commands/CommandHelp.java @@ -58,6 +58,12 @@ public class CommandHelp { SetMultimap subCommands = rootCommand.getSubCommands(); Set seen = new HashSet<>(); + + if (!rootCommand.getDefCommand().hasHelpCommand) { + helpEntries.add(new HelpEntry(this, rootCommand.getDefaultRegisteredCommand())); + seen.add(rootCommand.getDefaultRegisteredCommand()); + } + subCommands.entries().forEach(e -> { String key = e.getKey(); if (key.equals(BaseCommand.DEFAULT) || key.equals(BaseCommand.CATCHUNKNOWN)) { @@ -162,7 +168,7 @@ public class CommandHelp { } printEntries.add(e); } - this.lastPage = !(min > 0 || results.hasNext()); + this.lastPage = max >= totalResults; if (search == null) { formatter.showAllResults(this, printEntries); diff --git a/core/src/main/java/co/aikar/commands/CommandManager.java b/core/src/main/java/co/aikar/commands/CommandManager.java index 1d7a68fe..5474047d 100644 --- a/core/src/main/java/co/aikar/commands/CommandManager.java +++ b/core/src/main/java/co/aikar/commands/CommandManager.java @@ -34,6 +34,8 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; @@ -283,6 +285,8 @@ public abstract class CommandManager < return rootCommands.computeIfAbsent(ACFPatterns.SPACE.split(cmd.toLowerCase(), 2)[0], this::createRootCommand); } + public abstract Collection getRegisteredRootCommands(); + public RegisteredCommand createRegisteredCommand(BaseCommand command, String cmdName, Method method, String prefSubCommand) { return new RegisteredCommand(command, cmdName, method, prefSubCommand); } diff --git a/core/src/main/java/co/aikar/commands/RegisteredCommand.java b/core/src/main/java/co/aikar/commands/RegisteredCommand.java index 225c8c9f..af72b1d0 100644 --- a/core/src/main/java/co/aikar/commands/RegisteredCommand.java +++ b/core/src/main/java/co/aikar/commands/RegisteredCommand.java @@ -79,6 +79,7 @@ public class RegisteredCommand getRegisteredRootCommands() { + return Collections.unmodifiableCollection(commands.values()); + } @Override public Locales getLocales() {