CommandManager

基本信息

属性 值
类 mypermissions.command.api.CommandManager
根权限占位 ROOT_PERM_NODE = "ROOT"

功能

基于 @Command 注解的命令注册器。把一组带注解的方法(一类只允许有一个根节点)转成 CommandTree,再交给 ICommandRegistrar 包装为 CommandModel 下发给 Minecraft;同时暴露根据权限/名称查树的静态接口给 Ticker 使用。

注册流程

  1. 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 里)。
  2. 调用 ICommandRegistrar.registerCommand(new CommandModel(commandTree), 权限节点, false) 注册到 MC。
  3. 注册时若丢失 parent,循环结束后把剩余 entries 当 ERROR log(Missing parent)。

静态查询

方法 行为
getTree(String basePerm) 按根权限查 commandTrees
getTreeFromPermission(String perm) 在所有树里递归查找含 perm 的节点
getPermForCommand(String commandName) 按根命令名查根权限;找不到返回 null(Ticker 兜底为 cmd.<name>)

Registrar 选择

makeRegistrar() 静态构造:

  1. 若 ClassUtils.isBukkitLoaded() → BukkitCommandRegistrar(Bukkit/Cauldron/MCPC 兼容)
  2. 否则若 Loader.isModLoaded("ForgeEssentials") → ForgeEssentialsCommandRegistrar
  3. 否则 VanillaCommandRegistrar

错误条件

  • 同一 clazz 多于一个根命令 → 抛 CommandException("has more than one root command")
  • 完全没根命令 → 抛 CommandException("has no root command")
  • 方法签名不合规 → 记录 ERROR 且跳过

相关条目