传统 Paper 插件通过
plugin.yml + CommandExecutor 注册命令,存在多个痛点:args[0] 需手动解析、不支持选择器(@a、@p)、Tab 补全须单独维护 TabCompleter 且容易不同步,命令树静态固定,无法根据配置动态改变参数结构。Paper 内置了 Mojang 的 Brigadier 框架,通过
LifecycleEvents.COMMANDS 生命周期钩子注册命令树,无需 commands 块。权限检查挂在树节点上,Brigadier 在构建 Tab 补全时自动过滤无权限的命令,例如 requires() 确保只有拥有对应权限的玩家才能看到 /punish。命令树可根据配置条件化注册——例如 /report 只在启用 severity 时增加 severity 参数,否则注册简化版,Tab 补全和错误提示始终准确。ArgumentTypes.player() 返回的不是 Player 对象,而是一个解析器,支持 Steve、@a、@p 等选择器,无需手动实现。解析后通过 resolvePlayer 转换为玩家,同时处理空选择器的情况。整体注册流程比传统方式更清晰、类型安全,且 Tab 补全自动同步。传统方式的问题:Bukkit.getPlayer(args[0])只能精确匹配当前在线玩家,不支持选择器和模糊匹配;Tab补全必须手动同步,易出错;命令树固定,无法动态调整。
Brigadier 方式示例:在LifecycleEvents.COMMANDS内注册/punish字面量,requires检查权限,then追加target参数并绑定执行方法。对于/report,先读取配置,若启用 severity 则注册含 severity 分支,否则注册简单分支。ArgumentTypes.player()的使用:在命令上下文中获取PlayerSelectorArgumentResolver,调用resolve(ctx.getSource())获得玩家列表,取第一个或处理空情况。这样命令处理器就能直接使用解析到的玩家。
迁移到 Brigadier 可大幅简化 Paper 插件命令开发,消除重复劳动和潜在 bug。虽然旧命令映射仍能工作,但 Brigadier 已成为推荐的首选方案。
#开发者 #工具 #Paper #Brigadier #Minecraft #Command
@DevToolboxHub