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 形状一致:
- 单 token
*→ 返回symbolAny(AspectBracketHandler.java:41-43),该字段在构造函数里由MineTweakerAPI.getJavaStaticFieldSymbol(IngredientAny.class, "INSTANCE")赋值(AspectBracketHandler.java:26)。即*仍表示「任意物品」,不因装了本 mod 而改变语义。 - 以
前缀+:开头 → 把后续 token 的文本无分隔符拼接后查表(AspectBracketHandler.java:46-49+find()的:52-65)。所以<gas:hydrogen>查的是hydrogen而非hydrogen chloride。 - 其余情况返回
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,是真正暴露给脚本的。
相关条目
- Thaumcraft 脚本类 - 要素括号的主要消费者
- Mekanism 脚本类 - 气体括号的主要消费者
- Aura Cascade 脚本类 - 灵气括号的主要消费者
- 插件加载器 - 括号处理器与脚本类的两套注册路径