节点改装系统
节点改装(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(...)),改名即断链。
相关条目
- Node Transmodifier - 施放装置与 13³ 扫描
- Node Transmodifier GUI - 4 槽布局
- Node Augmentation - 载体物品与 NBT 键
- 事件处理器 - 同仓另一套 Forge 事件机制