捆绑信号网络
[!INFO] 源码:
BundledUtils.java、RednetAdaptorTE.java
Project Blue 自身不注册任何线缆方块。它作为 Project Red Bundled Cable 的终端件(IBundledEmitter / IBundledTile)参与网络。真正的「线」是 Project Red 的捆绑线缆,本 mod 只负责在部件周围做信号采集与把信号写进 RedNet。
信号采集:BundledUtils.getAllSignals
这是本 mod 唯一的「网络遍历」算法。控制面板在 getInputs() 中调用它,一次性扫描 5 组共 13 个位置:
clearSignal(signal);
for (int r = 0; r <= 3; r++) if ((connectionMask & (1 << r)) != 0) {
addSignal(signal, getCornerSignal(part, side, r));
addSignal(signal, getStraightSignal(part, side, r));
addSignal(signal, getInternalSignal(part, side, r));
}
addSignal(signal, getCenterSignal(part, side));
位置分类
| 类别 | 定位方式 | 说明 |
|---|---|---|
| corner | tile().offset(absDir).offset(side) |
斜对角的方块 |
| straight | tile().offset(absDir) |
正对面的方块 |
| internal | tile().partMap(absDir) |
同一个方块内的另一个部件 |
| center | tile().partMap(6) |
同一位置的中心部件(partMap(6),6 = 中心哨兵值) |
其中 absDir = Rotation.rotateSide(side, r),r 遍历 0–3 四个旋转方向。
合并规则
addSignal(dst, src) 是逐通道取最大值:
if (src != null) for (int i = 0; i <= 15; i++) if ((dst[i] & 0xff) < (src[i] & 0xff)) dst[i] = src[i];
⚠️ BundledUtils.signal 是静态共享 byte[16],返回的是同一个数组引用。调用方不得长期持有。
读取路径
getBundledPartSignal(Object part, int r) 只认 IBundledEmitter。对 TileMultipart 走 partMap(side) + Rotation.rotationTo(...) 做朝向换算;对普通 TileEntity 走 t instanceof IBundledEmitter。
信号写出
- 控制面板 —
ControlPanelPart.getBundledSignal(side),见 微型控制器部件 - Rednet Adaptor —
RednetAdaptorTE.getBundledSignal(dir)返回bundledOutput,见 Rednet Adaptor 信号路由
变更通知
FaceUtils.notifyAllNeighbors(part, side):
part.tile().notifyPartChange(part)— 通知同 tile 的其他部件- 对
r = 0..3逐个notifyCorner— 向斜角方块发notifyBlockOfNeighborChange
ControlPanelPart.changed() 会调用它,所以改一个格子会同时刷新同 tile 部件和四个斜角方块。
Rednet Adaptor 侧用另一套:worldObj.notifyBlocksOfNeighborChange(x, y, z, rednetAdaptorBlock)(六个正交面),并触发 onNeighborBlockChange 重新采集。
网络更新闭环
外部方块变化
→ notifyBlockOfNeighborChange(斜角 4 向 / 正交 6 向)
→ onNeighborChanged / onBlockActivated
→ updateInputs() / onNeighborBlockChange()
→ BundledUtils.getAllSignals(面板)或 6 面轮询(Adaptor)
→ transferSignals()
→ changed() → notifyAllNeighbors → 重绘
整个过程是同步的、无 tick 的:没有定时器,信号变化靠邻居通知链即时传播。唯一的定时逻辑是按钮的 20 tick 自动弹起(scheduleTick)。
本 mod 没有的线缆
assets/gcewing_projectblue/models/ 下存在 tubewire_*.json(8 个模型)与 textures/blocks/tubewire.png、redwire_*.png,但:
- 没有任何
PneumaticTubePart/PneumaticTubeItem/PneumaticExtractorPart源文件 ProjectBlue.registerMultiParts()中对应注册行全部被注释掉(pb_pneumatictube、pneumatic_extractor、pb_pr_insulated)registerItems()中pneumaticTube = addItem(...)同样被注释
这些是孤儿资源,对应功能已移除。Pneumatic Extractor 的 GUI id 仍保留在 PBGui 枚举里(ordinal 1),但无容器类注册。