节点改装系统

节点改装(Node Augmentation)是与法杖改装(Augmentation)完全独立的一套系统:物品是 Node Augmentation,施放装置是 Node Transmodifier 的 4 个槽,共 2 种。两者不共享 NBT 结构、不共享 API 接口、不共享注册表。

两套系统对比

维度 法杖改装(Wand Augmentation) 节点改装(Node Augmentation)
接口 core/implement/IAugmentationWand core/implement/IAugmentationNode
载体物品 法杖本身(无载体物品) ItemNodeAugmentation
注册表 WandHelper.augmentationMap(5 项) ItemNodeAugmentation.augmentationList(2 项)
变体区分 NBT 字符串 IAugmentationWand.getID() NBT 字符串 IAugmentationNode.getAugmentationName()
施放方式 注魔(RecipeInfusionWandAugmentation) 放入 Transmodifier 槽 + 红石脉冲
注入方块 无(物品直接改写) BlockNodeTransmodifier
生效范围 持有者 13×13×13 内全部 TileNode
数量 5 2

Dual Charging

augmentation/node/AugmentationDualCharging.java,NBT 值 "Dual Charging"。

  • handle(TileNode node) → return false;,方法体为空(:15-17)。
  • compatible(IAugmentationNode[]):与自身重名返回 false;与 "Enhanced Recharging" 也返回 false → 两者互斥。
  • compatible 的循环写法有个坑:命中 Enhanced Recharging 时立即 return false(:27-29),意味着它不检查列表中后续元素 —— 结果正确但逻辑脆弱。

结论:Dual Charging 无任何实际效果。 唯一可触发的实现在 TileNodeTransmodifier.doubleRecharge(TileNode)(tile/TileNodeTransmodifier.java:100-110,反射调用 TileNode.handleRecharge(boolean)),但该方法全仓无调用点,是死代码。

Enhanced Recharging

augmentation/node/AugmentationEnhancedRecharging.java,NBT 值 "Enhanced Recharging"。

handle → decreaseRechargeTime(node),用反射改写 TileNode 的私有字段 regeneration:

Field field = node.getClass().getDeclaredField("regeneration");
field.setAccessible(true);
int f = 400;                                    // 无 modifier 时的默认
if (node.getNodeModifier() != null) {
    switch (node.getNodeModifier()) {
        case BRIGHT -> f = 300;
        case PALE   -> f = 600;
        case FADING -> f = 2400;
    }
}
field.set(node, f);
Node Modifier regeneration 值
BRIGHT 300
PALE 600
FADING 2400
null(无 modifier) 400

compatible():与自身重名计数,count <= 2 才允许 → 最多同时装 2 个 Enhanced Recharging;与 "Dual Charging" 互斥(:31-33)。

数值

数值 值
改装种类 2
Transformer 槽数 4
每次脉冲扫描体积 13×13×13 = 2197 格
Enhanced Recharging 叠加上限 2(count <= 2)
Dual Charging 叠加上限 1(重名即拒绝)
互斥对 Dual Charging ↔ Enhanced Recharging
regeneration 基准 400(无 modifier)
regeneration BRIGHT 300
regeneration PALE 600
regeneration FADING 2400

源码缺陷

  • Dual Charging 完全无效(augmentation/node/AugmentationDualCharging.java:15-17 + tile/TileNodeTransmodifier.java:100)。doubleRecharge 是本仓最典型的死代码:方法实现完整(含异常捕获与日志),但无任何调用者。
  • 反射字段名硬编码 "regeneration"(AugmentationEnhancedRecharging.java:41)。Thaumcraft 4.2.3.5 的 TileNode 一旦改字段名即 NoSuchFieldException → 捕获后 log.error 并返回 false,改装静默失效。源码未做字段兼容性检查。
  • node.getClass().getDeclaredField 而非 TileNode.class:若 Thaumcraft 未来把 regeneration 下沉到子类,会抛 NoSuchFieldException(getDeclaredField 不查父类)。
  • handle 在服务端也会执行:TileNodeTransmodifier.updateEntity 中 if (this.worldObj.isRemote) continue; 位于 handle(node) 之后(tile/TileNodeTransmodifier.java:54-57),客户端也会改写本地 TileNode.regeneration,可能与服务端不同步(客户端 TileNode 随后被服务端包覆盖)。
  • 反射写入不触发 TileEntity 同步:field.set(node, f) 后无 markDirty() / updateToClient()。
  • 兼容检查用字符串比较而非对象比较(.getAugmentationName().equals(...)),改名即断链。

相关条目