CommandTree / CommandTreeNode
基本信息
| 属性 | 值 |
|---|---|
| 类 | mypermissions.command.core.entities.CommandTree(继承 myessentials.entities.api.Tree<CommandTreeNode>) |
| 节点 | CommandTreeNode(继承 myessentials.entities.api.TreeNode<CommandTreeNode>) |
CommandTree 功能
保存一棵命令树 + 本地化 + 自定义 Bridge。提供命令分发、节点查找、权限校验与按 String perm 递归搜索节点。
接口
| 方法 | 行为 |
|---|---|
commandCall(ICommandSender, List<String> args) |
从根向下按 getChild 匹配,命中后 hasPermission(...) 校验,通过则调 node.commandCall(sender, 剩余 args) |
getNodeFromArgs(List<String>) |
与 commandCall 同流程,但只返回定位到的节点 |
getArgumentNumber(List<String>) |
把 args 消耗完毕前停下,返回剩余参数个数减一(即当前待补全的位置) |
hasCommandNode(String perm) / hasCommandNode(root, perm) |
递归按 getAnnotation().permission() 匹配 |
hasPermission(sender, node) |
拒绝:!console && (sender is MinecraftServer/RConConsoleSource/CommandBlockLogic) 抛 commands.generic.permission;玩家:通过 PermissionProxy 与可选 customManager 任一 hasPermission(uuid, perm) 通过即可 |
CommandTreeNode 功能
包装 @Command 注解方法 + 反射 Method,执行命令并负责 help / syntax / tab completion。
构造
- 传入
parent(可能 null)、commandAnnot、method,构造里建立localizationKey = perm + ".help",并在parent.getLocal()上检查是否存在该本地化(如缺失记Missing helpERROR)。 name/syntax是带 5 分钟过期的Suppliers.memoize(懒求值 + 本地化缓存)。
关键方法
| 方法 | 行为 |
|---|---|
commandCall(sender, args) |
通过反射调 method.invoke(null, sender, args) 拿 CommandResponse;SEND_HELP_MESSAGE 走 sendHelpMessage(首个数字参数作页码),SEND_SYNTAX 走 sendSyntax;InvocationTargetException 的 Cause 是 CommandException → 用 ChatManager.send,是其它 RuntimeException → 重抛;其它打 ERROR |
getTabCompletionList(argumentNumber, argumentStart) |
若该节点的 completionKeys 为空则按子节点 localized name 前缀匹配;否则把 argumentNumber 当索引从 completionKeys 查 CommandCompletion.getCompletionList(key) 前缀匹配 |
sendHelpMessage(sender, page) |
首次按 maxComponentsPerPage=9 构造 ChatComponentHelpMenu,之后走分页 |
sendSyntax(sender) |
用 EnumChatFormatting.DARK_AQUA + getLocalizedSyntax() 发到 sender |
getLocalizedSyntax() / getLocalizedName() |
通过 memoized supplier 取本地化后的字符串 |
getChild(name) |
在子节点里按 localized name 或 alias 查找 |
getCommandLine() |
拼接到根:/name [subname ...] |
getCommandTree() |
一路向上找到 root,再通过 CommandManager.getTree(rootAnnotation.permission) 反查当前所在 tree |
相关条目
- CommandModel - 命令树对外壳
- CommandManager - 构造树
- Command 注解 - 节点元数据来源
- ChatComponentHelpMenu - help 渲染