命令行解析 API
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizon.gtnhlib.brigadier.BrigadierApi |
| 适配层 | com.gtnewhorizon.gtnhlib.brigadier.BrigadierCommandWrapper |
| 源码 | src/main/java/com/gtnewhorizon/gtnhlib/brigadier/(2 个类) |
| 库 | com.mojang:brigadier:1.0.18 |
| 库的作用面 | 1.7.10 上的真实运行期依赖,由 DepLoader 下载 |
| 触发 mixin | Mixins.BRIGADIER(EARLY,双方,2 个 mixin) |
⚠️ com.mojang:brigadier 容易被误判为 1.21 内容。本 mod 确实在 1.7.10 上使用它:dependencies.gradle 中为 compileOnlyApi("com.mojang:brigadier:1.0.18"),且 src/main/resources/META-INF/gtnhlib_deps.json 把它列为 always.common 依赖,由 FalsePatternLib DepLoader 在运行时下载。这与 gtnhextlib 的情况相同。
功能
把 Mojang 的 Brigadier 命令解析库接到 1.7.10 的指令系统上,让 mod 能用现代的字面量/参数树 + Tab 补全编写指令。README 的描述(README.md Commands 节):
Brigadier command API for modern command parsing, completion, and execution on 1.7.
接入方式
1.7.10 的 ICommand 接口是扁平的字符串数组模型,无法承载参数树。GTNHLib 的方案是双向桥接:
- 写入:
BrigadierApi.getCommandDispatcher()拿到CommandDispatcher<ICommandSender>,mod 往里注册节点 - 读取:
BrigadierCommandWrapper把一个 Brigadier 根节点包成 1.7.10 的ICommand,注册进原版指令表
BrigadierApi 接口
| 方法 | 说明 |
|---|---|
getCommandDispatcher() |
取 CommandDispatcher<ICommandSender>;dispatcher 为 null 时由 Objects.requireNonNull 抛 NPE |
init() |
@ApiStatus.Internal,新建 dispatcher 并注册内置测试指令 |
clear() |
@ApiStatus.Internal,把 dispatcher 置 null |
executeCommand(ICommandSender, String) |
执行一条命令 |
getPossibleCommands(ICommandSender, String) |
给定已输入前缀返回候选指令名 |
getPossibleCommands(ICommandSender) |
返回全部候选 ICommand |
两个 @ApiStatus.Internal 方法(init/clear)标记为内部 API,下游 mod 不应调用 —— 它们由 CommonProxy 在服务器生命周期中调用(CommonProxy.java:124 与 :160)。
生命周期
dispatcher 是可空静态字段,生命周期与服务器绑定:
| 时机 | 动作 | 位置 |
|---|---|---|
serverAboutToStart |
BrigadierApi.init() |
CommonProxy.java:124 |
serverStarting |
若为 Thermos 服务器,把 dispatcher 根节点逐个包成 ICommand 注册 |
CommonProxy.java:135-139 |
serverStopping |
BrigadierApi.clear()(置 null) |
CommonProxy.java:160 |
Thermos 兼容块只在检测到 thermos.ThermosRemapper 时执行(CommonProxy.isThermosServer(),:147-155)—— 普通 Forge 服务器不需要这层包装。
数值
| 数值名 | 值 |
|---|---|
| 包内类数 | 2 |
| 公开静态方法 | 6(2 个标 @ApiStatus.Internal) |
| 内置测试指令 | 1(字面量 brigadier + 一个 greedyString 参数) |
dispatcher 初始值 |
new CommandDispatcher<>()(init() 后重建) |
| 注入的 mixin | 2(MixinCommandHandler、MixinCommandHelp) |
| Brigadier 库版本 | 1.0.18(MIT) |
交互
mod 典型用法:
dispatcher.register(LiteralArgumentBuilder.<ICommandSender>literal("mycmd")
.executes(ctx -> Command.SINGLE_SUCCESS)
.then(RequiredArgumentBuilder.<ICommandSender, String>argument("arg",
StringArgumentType.string()).executes(...)));
泛型参数固定为 ICommandSender —— 1.7.10 的指令发送者接口,不是 CommandSourceStack。指令发送者到 Brigadier 上下文的转换由 MixinCommandHandler / MixinCommandHelp 负责。
相关条目
- 网络处理器 -
PacketKeyDown等键位同步包 - Mixin 枚举 -
BRIGADIER注入组 - Mixin 引导流程 -
removeBrigadierClassLoaderException对本库类加载的处理