CommandManager
基本信息
| 属性 | 值 |
|---|---|
| 类 | mypermissions.command.api.CommandManager |
| 根权限占位 | ROOT_PERM_NODE = "ROOT" |
功能
基于 @Command 注解的命令注册器。把一组带注解的方法(一类只允许有一个根节点)转成 CommandTree,再交给 ICommandRegistrar 包装为 CommandModel 下发给 Minecraft;同时暴露根据权限/名称查树的静态接口给 Ticker 使用。
注册流程
CommandManager.registerCommands(Class, String rootPerm, Local, IPermissionBridge):- 扫描
clazz.getDeclaredMethods(),挑出标注了@Command且签名合法(返回CommandResponse、参数(ICommandSender, List<String>))的方法。 parentName == "ROOT"的是根命令;如果rootPerm == null,为该方法新建CommandTreeNode作为commandTree的根。- 其它方法进
nodes等待挂载。 constructTree(root, nodes)迭代挂载子节点直到不再缩小(找不到 parent 的节点会被打 ERROR 留在 map 里)。
- 扫描
- 调用
ICommandRegistrar.registerCommand(new CommandModel(commandTree), 权限节点, false)注册到 MC。 - 注册时若丢失 parent,循环结束后把剩余 entries 当 ERROR log(
Missing parent)。
静态查询
| 方法 | 行为 |
|---|---|
getTree(String basePerm) |
按根权限查 commandTrees |
getTreeFromPermission(String perm) |
在所有树里递归查找含 perm 的节点 |
getPermForCommand(String commandName) |
按根命令名查根权限;找不到返回 null(Ticker 兜底为 cmd.<name>) |
Registrar 选择
makeRegistrar() 静态构造:
- 若
ClassUtils.isBukkitLoaded()→BukkitCommandRegistrar(Bukkit/Cauldron/MCPC 兼容) - 否则若
Loader.isModLoaded("ForgeEssentials")→ForgeEssentialsCommandRegistrar - 否则
VanillaCommandRegistrar
错误条件
- 同一
clazz多于一个根命令 → 抛CommandException("has more than one root command") - 完全没根命令 → 抛
CommandException("has no root command") - 方法签名不合规 → 记录 ERROR 且跳过
相关条目
- Command 注解 - 注册依赖的注解
- CommandModel - 包装命令树的 MC 命令
- CommandTree / CommandTreeNode - 树形数据模型
- ICommandRegistrar / Vanilla/Bukkit/FE 三实现 - 不同环境的注册器
- Commands - 实际被扫描的类