modtweaker.* 括号类

基本信息

属性 值
括号处理器数 3
注解 minetweaker.annotations.BracketHandler(priority = 100)
接口 minetweaker.IBracketHandler
暴露的 Zenscript 类 5(3 个接口 + 2 个接口)
注册方式 MineTweakerAPI.registerBracketHandler(...)

功能

modtweaker.* 这组 Zenscript 类不由 MineTweakerAPI.registerClass 注册,而是由三个 IBracketHandler 在括号解析阶段暴露。它们的作用是让 Zenscript 能用 <aspect:...>、<gas:...>、<aura:...> 这样的字面量直接构造非物品的「原料」对象。

括号前缀 处理器 注册点 解析入口
<aspect:NAME> AspectBracketHandler Thaumcraft.java:16 AspectBracketHandler.java:46
<gas:NAME> GasBracketHandler Mekanism.java:30 GasBracketHandler.java:49
<aura:NAME> AuraBracketHandler AuraCascade.java:10 AuraBracketHandler.java:48

三个处理器都带 priority = 100(AspectBracketHandler.java:19、GasBracketHandler.java:21、AuraBracketHandler.java:20)。

解析规则

三个处理器的 resolve 形状一致:

  1. 单 token * → 返回 symbolAny(AspectBracketHandler.java:41-43),该字段在构造函数里由 MineTweakerAPI.getJavaStaticFieldSymbol(IngredientAny.class, "INSTANCE") 赋值(AspectBracketHandler.java:26)。即 * 仍表示「任意物品」,不因装了本 mod 而改变语义。
  2. 以 前缀 + : 开头 → 把后续 token 的文本无分隔符拼接后查表(AspectBracketHandler.java:46-49 + find() 的 :52-65)。所以 <gas:hydrogen> 查的是 hydrogen 而非 hydrogen chloride。
  3. 其余情况返回 null,交给别的处理器。

拼接后交给一个 public static 方法做查表,命中则返回一个自定义 IZenSymbol,其 instance() 产出 ExpressionCallStatic 调向该静态方法(AspectBracketHandler.java:73-84)。查表失败时静态方法返回 null,于是该括号表达式求值为 null 而不是在解析期报错。

处理器 查表调用 命中时返回
AspectBracketHandler Aspect.getAspect(name.toLowerCase())(:30) new MCAspectStack(new AspectStack(aspect, 1))(:32)
GasBracketHandler GasRegistry.getGas(name)(:24) new MCGasStack(new GasStack(gas, 1))(:26)
AuraBracketHandler EnumAura.valueOf(name)(:23) new MCAuraStack(new AuraQuantity(aura, 1))(:25)

三者构造的量都是 1。要写数量得用乘法运算符或 withAmount(见下)。注意 Aspect 走 toLowerCase()(:30、:59),EnumAura.valueOf 则大小写敏感(:23)——<aura:> 的大小写行为与另两者不同。

暴露的类

Zenscript 名 Java 类 @ZenMethod @ZenGetter @ZenOperator 是否 registerClass
modtweaker.gas.IGasDefinition IGasDefinition 0 2 1 是(Mekanism.java:31)
modtweaker.gas.IGasStack IGasStack 1 4 1 是(Mekanism.java:32)
modtweaker.aspect.IAspectStack IAspectStack 2 3 1 否
modtweaker.auraCascade.IAuraDefinition IAuraDefinition 0 2 1 否
modtweaker.auraCascade.IAuraStack IAuraStack 1 4 1 否

未走 registerClass 的三个(IAspectStack、IAuraDefinition、IAuraStack)通过括号处理器的返回类型与 @ZenGetter 签名进入脚本环境;它们合计 3 个 @ZenMethod,这也是 插件加载器 表中 Thaumcraft 记 63、aura 记 4 而其余插件记「仅 registerClass 数量」的原因。

每个 I*Stack 都带一个 MUL 运算符(IAspectStack.java:24、IGasStack.java:25、IAuraStack.java:24),使 <gas:hydrogen> * 64 这类写法成立。IGasStack 另有 1 个 @ZenMethod(withAmount)。IGasStack / IAuraStack 各有 4 个 @ZenGetter(definition / name / displayName / amount),IAspectStack 有 3 个(definition / name / displayName——要素按整数计,没有 amount)。

同名但未暴露的接口

modtweaker2/mods/thaumcraft/aspect/IAspectDefinition.java 只有 5 行,既无 @ZenClass 也无 @ZenMethod/@ZenGetter——它不是 Zenscript 类,只是 IAspectStack.getDefinition() 的返回类型(IAspectStack.java:16、实现见 MCAspectStack.java:151)。Mekanism 与 Aura Cascade 的对应接口 IGasDefinition / IAuraDefinition 则都带 @ZenClass,是真正暴露给脚本的。

相关条目