From 348a8243afd610a8646052cfdd5e307025e47411 Mon Sep 17 00:00:00 2001 From: 502647092 Date: Fri, 21 Oct 2016 22:53:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 502647092 --- .../yumc/YumCore/commands/CommandManager.java | 142 +++++++++--------- .../YumCore/commands/annotation/Help.java | 17 +-- 2 files changed, 75 insertions(+), 84 deletions(-) diff --git a/src/main/java/pw/yumc/YumCore/commands/CommandManager.java b/src/main/java/pw/yumc/YumCore/commands/CommandManager.java index 557ec5d..d9a22ab 100644 --- a/src/main/java/pw/yumc/YumCore/commands/CommandManager.java +++ b/src/main/java/pw/yumc/YumCore/commands/CommandManager.java @@ -116,9 +116,8 @@ public class CommandManager implements TabExecutor { lookupNames.put(name, plugin); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) { } - if ((cmd = plugin.getCommand(name)) == null) { - throw new IllegalStateException("未找到命令 必须在plugin.yml先注册 " + name + " 命令!"); - } + if ((cmd = plugin.getCommand(name)) == null) { throw new IllegalStateException("未找到命令 必须在plugin.yml先注册 " + + name + " 命令!"); } } cmd.setExecutor(this); cmd.setTabCompleter(this); @@ -137,66 +136,6 @@ public class CommandManager implements TabExecutor { register(executor); } - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (args.length == 0) { - if (defCmd != null) { - return defCmd.execute(new CommandArgument(sender, command, label, args)); - } - return help.send(sender, command, label, args); - } - String subcmd = args[0].toLowerCase(); - if (subcmd.equalsIgnoreCase("help")) { - return help.send(sender, command, label, args); - } - return getByCache(subcmd).execute(new CommandArgument(sender, command, label, moveStrings(args, 1))); - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - List completions = new ArrayList<>(); - String token = args[args.length - 1]; - if (args.length == 1) { - StringUtil.copyPartialMatches(token, cmdNameCache, completions); - } - for (CommandTabInfo tab : tabs) { - StringUtil.copyPartialMatches(token, tab.execute(sender, command, token, args), completions); - } - StringUtil.copyPartialMatches(token, getPlayerTabComplete(sender, command, alias, args), completions); - Collections.sort(completions, String.CASE_INSENSITIVE_ORDER); - return completions; - } - - /** - * 通过注解读取命令并注册 - * - * @param clazzs - * 子命令处理类 - */ - public void register(CommandExecutor... clazzs) { - for (CommandExecutor clazz : clazzs) { - Method[] methods = clazz.getClass().getDeclaredMethods(); - for (Method method : methods) { - if (registerCommand(method, clazz)) { - continue; - } - registerTab(method, clazz); - } - } - help = new CommandHelp(cmds); - buildCmdNameCache(); - } - - /** - * 设置帮助解析器 - * - * @param helpParse - * 帮助解析器 - */ - public void setHelpParse(CommandHelpParse helpParse) { - help.setHelpParse(helpParse); - } - /** * 构建命令列表缓存 */ @@ -250,7 +189,8 @@ public class CommandManager implements TabExecutor { List matchedPlayers = new ArrayList<>(); for (Player player : C.Player.getOnlinePlayers()) { String name = player.getName(); - if ((senderPlayer == null || senderPlayer.canSee(player)) && StringUtil.startsWithIgnoreCase(name, lastWord)) { + if ((senderPlayer == null || senderPlayer.canSee(player)) + && StringUtil.startsWithIgnoreCase(name, lastWord)) { matchedPlayers.add(name); } } @@ -272,6 +212,52 @@ public class CommandManager implements TabExecutor { return ret; } + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 0) { + if (defCmd != null) { return defCmd.execute(new CommandArgument(sender, command, label, args)); } + return help.send(sender, command, label, args); + } + String subcmd = args[0].toLowerCase(); + if (subcmd.equalsIgnoreCase("help")) { return help.send(sender, command, label, args); } + return getByCache(subcmd).execute(new CommandArgument(sender, command, label, moveStrings(args, 1))); + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + List completions = new ArrayList<>(); + String token = args[args.length - 1]; + if (args.length == 1) { + StringUtil.copyPartialMatches(token, cmdNameCache, completions); + } + for (CommandTabInfo tab : tabs) { + StringUtil.copyPartialMatches(token, tab.execute(sender, command, token, args), completions); + } + StringUtil.copyPartialMatches(token, getPlayerTabComplete(sender, command, alias, args), completions); + Collections.sort(completions, String.CASE_INSENSITIVE_ORDER); + return completions; + } + + /** + * 通过注解读取命令并注册 + * + * @param clazzs + * 子命令处理类 + */ + public void register(CommandExecutor... clazzs) { + for (CommandExecutor clazz : clazzs) { + Method[] methods = clazz.getClass().getDeclaredMethods(); + for (Method method : methods) { + if (registerCommand(method, clazz)) { + continue; + } + registerTab(method, clazz); + } + } + help = new CommandHelp(cmds); + buildCmdNameCache(); + } + /** * 注册命令 * @@ -286,18 +272,14 @@ public class CommandManager implements TabExecutor { if (ci != null) { Class[] params = method.getParameterTypes(); Log.d("命令 %s 参数类型: %s", ci.getName(), Arrays.toString(params)); - if (params.length > 0) { - try { - Class sender = params[0]; - if (method.getReturnType() == boolean.class) { - defCmd = ci; - } else { - cmds.add(ci); - cmdCache.put(ci.getName(), ci); - } - return true; - } catch (ClassCastException ignored) { + if (params.length > 0 && params[0].isInstance(CommandSender.class)) { + if (method.getReturnType() == boolean.class) { + defCmd = ci; + } else { + cmds.add(ci); + cmdCache.put(ci.getName(), ci); } + return true; } Log.warning(String.format(argumentTypeError, method.getName(), clazz.getClass().getName())); } @@ -324,4 +306,14 @@ public class CommandManager implements TabExecutor { } return false; } + + /** + * 设置帮助解析器 + * + * @param helpParse + * 帮助解析器 + */ + public void setHelpParse(CommandHelpParse helpParse) { + help.setHelpParse(helpParse); + } } diff --git a/src/main/java/pw/yumc/YumCore/commands/annotation/Help.java b/src/main/java/pw/yumc/YumCore/commands/annotation/Help.java index 96a677e..b2651bd 100644 --- a/src/main/java/pw/yumc/YumCore/commands/annotation/Help.java +++ b/src/main/java/pw/yumc/YumCore/commands/annotation/Help.java @@ -1,6 +1,5 @@ package pw.yumc.YumCore.commands.annotation; -import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -15,13 +14,13 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Help { - /** - * @return 当前命令可能需要的参数 - */ - String possibleArguments() default ""; + /** + * @return 当前命令可能需要的参数 + */ + String possibleArguments() default ""; - /** - * @return 命令描述 - */ - String value(); + /** + * @return 命令描述 + */ + String value(); }