diff --git a/Chroma-Core/pom.xml b/Chroma-Core/pom.xml index fe76a44..f73c7d4 100755 --- a/Chroma-Core/pom.xml +++ b/Chroma-Core/pom.xml @@ -193,7 +193,7 @@ me.lucko commodore - 1.5 + 1.7 compile diff --git a/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2.java b/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2.java index 7ba6ede..fc4feda 100644 --- a/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2.java +++ b/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2.java @@ -285,7 +285,7 @@ public abstract class Command2 boolean nosubs = true; boolean isSubcommand = x != -1; try { //Register the default handler first so it can be reliably overwritten - mainMethod = command.getClass().getMethod("def", Command2Sender.class, String.class); + mainMethod = command.getClass().getMethod("def", Command2Sender.class); val cc = command.getClass().getAnnotation(CommandClass.class); var ht = cc == null || isSubcommand ? new String[0] : cc.helpText(); //If it's not the main command, don't add it if (ht.length > 0) @@ -303,7 +303,7 @@ public abstract class Command2 val ann = method.getAnnotation(Subcommand.class); if (ann == null) continue; //Don't call the method on non-subcommands because they're not in the yaml var ht = command.getHelpText(method, ann); - if (ht != null) { + if (ht != null) { //The method is a subcommand val subcommand = commandChar + path + //Add command path (class name by default) getCommandPath(method.getName(), ' '); //Add method name, unless it's 'def' ht = getParameterHelp(method, ht, subcommand); diff --git a/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2MC.java b/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2MC.java index 34484fb..644bb8b 100644 --- a/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2MC.java +++ b/Chroma-Core/src/main/java/buttondevteam/lib/chat/Command2MC.java @@ -12,23 +12,21 @@ import lombok.val; import me.lucko.commodore.Commodore; import me.lucko.commodore.CommodoreProvider; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.SimpleCommandMap; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import org.bukkit.event.server.TabCompleteEvent; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Parameter; -import java.util.Arrays; -import java.util.HashMap; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -159,7 +157,7 @@ public class Command2MC extends Command2 implemen .map(comp -> component.getClass().getSimpleName().equals(comp.getClass().getSimpleName())).orElse(false)); } - @EventHandler + /*@EventHandler private void handleTabComplete(TabCompleteEvent event) { String commandline = event.getBuffer(); CommandSender sender = event.getSender(); @@ -260,24 +258,23 @@ public class Command2MC extends Command2 implemen return true; //We found a method } catch (InvocationTargetException e) { TBMCCoreAPI.SendException("An error occurred in a command handler!", e.getCause()); - }*/ + }* } - } + }*/ private boolean shouldRegisterOfficially = true; private void registerOfficially(ICommand2MC command, List> subcmds) { if (!shouldRegisterOfficially) return; - if (CommodoreProvider.isSupported()) { - TabcompleteHelper.registerTabcomplete(command, subcmds); - return; //Commodore registers the command as well - } try { var cmdmap = (SimpleCommandMap) Bukkit.getServer().getClass().getMethod("getCommandMap").invoke(Bukkit.getServer()); var path = command.getCommandPath(); int x = path.indexOf(' '); var mainPath = path.substring(0, x == -1 ? path.length() : x); - cmdmap.register(command.getPlugin().getName(), new BukkitCommand(mainPath)); + var bukkitCommand = new BukkitCommand(mainPath); + cmdmap.register(command.getPlugin().getName(), bukkitCommand); + if (CommodoreProvider.isSupported()) + TabcompleteHelper.registerTabcomplete(command, subcmds, bukkitCommand); } catch (Exception e) { TBMCCoreAPI.SendException("Failed to register command in command map!", e); shouldRegisterOfficially = false; @@ -294,20 +291,37 @@ public class Command2MC extends Command2 implemen sender.sendMessage("§cThe command wasn't executed for some reason... (command processing failed)"); return true; } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { + return Collections.emptyList(); + } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { + return Collections.emptyList(); + } } private static class TabcompleteHelper { private static Commodore commodore; - private static void registerTabcomplete(ICommand2MC command2MC, List> subcmds) { - if (commodore == null) + private static void registerTabcomplete(ICommand2MC command2MC, List> subcmds, Command bukkitCommand) { + if (commodore == null) { commodore = CommodoreProvider.getCommodore(MainPlugin.Instance); //Register all to the Core, it's easier + System.out.println("Registering test tabcomplete"); + commodore.register(LiteralArgumentBuilder.literal("test") + .then(LiteralArgumentBuilder.literal("asd") + .then(RequiredArgumentBuilder.argument("dsa", StringArgumentType.word()))) + .then(RequiredArgumentBuilder.argument("lol", StringArgumentType.word()))); + } System.out.println("Registering tabcomplete for path: " + command2MC.getCommandPath()); String[] path = command2MC.getCommandPath().split(" "); var maincmd = LiteralArgumentBuilder.literal(path[0]); var cmd = maincmd; for (int i = 1; i < path.length; i++) { var subcmd = LiteralArgumentBuilder.literal(path[i]); + System.out.println(cmd.build() + " -> " + subcmd.build()); cmd.then(subcmd); cmd = subcmd; //Add each part of the path as a child of the previous one } @@ -317,6 +331,7 @@ public class Command2MC extends Command2 implemen if (subpath[0].length() > 0) { //If the method is def, it will contain one empty string for (String s : subpath) { var subsubcmd = LiteralArgumentBuilder.literal(s); + System.out.println(scmd.build() + " -> " + subsubcmd.build()); scmd.then(subsubcmd); scmd = subsubcmd; //Add method name part of the path (could_be_multiple()) } @@ -346,14 +361,15 @@ public class Command2MC extends Command2 implemen else //TODO: Custom parameter types type = StringArgumentType.word(); var arg = RequiredArgumentBuilder.argument(parameter.getName(), type); + System.out.println("Adding arg: " + arg.build() + " to " + scmd.build()); scmd.then(arg); scmd = arg; } } - System.out.println("maincmd: " + maincmd); + System.out.println("maincmd: " + maincmd.build()); System.out.println("Children:"); maincmd.build().getChildren().forEach(System.out::println); - commodore.register(maincmd); + commodore.register(bukkitCommand, maincmd, p -> true); } } } diff --git a/Chroma-Core/src/main/java/buttondevteam/lib/chat/ICommand2.java b/Chroma-Core/src/main/java/buttondevteam/lib/chat/ICommand2.java index fc49c75..2672b7f 100644 --- a/Chroma-Core/src/main/java/buttondevteam/lib/chat/ICommand2.java +++ b/Chroma-Core/src/main/java/buttondevteam/lib/chat/ICommand2.java @@ -12,10 +12,9 @@ public abstract class ICommand2 { * Default handler for commands, can be used to copy the args too. * * @param sender The sender which ran the command - * @param args All of the arguments passed as is * @return The success of the command */ - public boolean def(TP sender, @Command2.TextArg String args) { + public boolean def(TP sender) { return false; }