命令行解析 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 负责。

相关条目