mirror of
				https://e.coding.net/circlecloud/YumCore.git
				synced 2025-11-03 23:06:02 +00:00 
			
		
		
		
	@@ -116,9 +116,8 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
                lookupNames.put(name, plugin);
 | 
					                lookupNames.put(name, plugin);
 | 
				
			||||||
            } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {
 | 
					            } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ignored) {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if ((cmd = plugin.getCommand(name)) == null) {
 | 
					            if ((cmd = plugin.getCommand(name)) == null) { throw new IllegalStateException("未找到命令 必须在plugin.yml先注册 "
 | 
				
			||||||
                throw new IllegalStateException("未找到命令 必须在plugin.yml先注册 " + name + " 命令!");
 | 
					                    + name + " 命令!"); }
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        cmd.setExecutor(this);
 | 
					        cmd.setExecutor(this);
 | 
				
			||||||
        cmd.setTabCompleter(this);
 | 
					        cmd.setTabCompleter(this);
 | 
				
			||||||
@@ -137,66 +136,6 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
        register(executor);
 | 
					        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<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
 | 
					 | 
				
			||||||
        List<String> 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<String> matchedPlayers = new ArrayList<>();
 | 
					        List<String> matchedPlayers = new ArrayList<>();
 | 
				
			||||||
        for (Player player : C.Player.getOnlinePlayers()) {
 | 
					        for (Player player : C.Player.getOnlinePlayers()) {
 | 
				
			||||||
            String name = player.getName();
 | 
					            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);
 | 
					                matchedPlayers.add(name);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -272,6 +212,52 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
        return ret;
 | 
					        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<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
 | 
				
			||||||
 | 
					        List<String> 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,9 +272,7 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
        if (ci != null) {
 | 
					        if (ci != null) {
 | 
				
			||||||
            Class[] params = method.getParameterTypes();
 | 
					            Class[] params = method.getParameterTypes();
 | 
				
			||||||
            Log.d("命令 %s 参数类型: %s", ci.getName(), Arrays.toString(params));
 | 
					            Log.d("命令 %s 参数类型: %s", ci.getName(), Arrays.toString(params));
 | 
				
			||||||
            if (params.length > 0) {
 | 
					            if (params.length > 0 && params[0].isInstance(CommandSender.class)) {
 | 
				
			||||||
                try {
 | 
					 | 
				
			||||||
                    Class<? extends CommandSender> sender = params[0];
 | 
					 | 
				
			||||||
                if (method.getReturnType() == boolean.class) {
 | 
					                if (method.getReturnType() == boolean.class) {
 | 
				
			||||||
                    defCmd = ci;
 | 
					                    defCmd = ci;
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
@@ -296,8 +280,6 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
                    cmdCache.put(ci.getName(), ci);
 | 
					                    cmdCache.put(ci.getName(), ci);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
                } catch (ClassCastException ignored) {
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Log.warning(String.format(argumentTypeError, method.getName(), clazz.getClass().getName()));
 | 
					            Log.warning(String.format(argumentTypeError, method.getName(), clazz.getClass().getName()));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -324,4 +306,14 @@ public class CommandManager implements TabExecutor {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设置帮助解析器
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param helpParse
 | 
				
			||||||
 | 
					     *            帮助解析器
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void setHelpParse(CommandHelpParse helpParse) {
 | 
				
			||||||
 | 
					        help.setHelpParse(helpParse);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,5 @@
 | 
				
			|||||||
package pw.yumc.YumCore.commands.annotation;
 | 
					package pw.yumc.YumCore.commands.annotation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.lang.annotation.Annotation;
 | 
					 | 
				
			||||||
import java.lang.annotation.ElementType;
 | 
					import java.lang.annotation.ElementType;
 | 
				
			||||||
import java.lang.annotation.Retention;
 | 
					import java.lang.annotation.Retention;
 | 
				
			||||||
import java.lang.annotation.RetentionPolicy;
 | 
					import java.lang.annotation.RetentionPolicy;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user