捆绑信号网络

[!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。

信号写出

变更通知

FaceUtils.notifyAllNeighbors(part, side):

  1. part.tile().notifyPartChange(part) — 通知同 tile 的其他部件
  2. 对 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),但无容器类注册。