Rednet Adaptor 信号路由

[!INFO] 源码: src/main/scala/gcewing/projectblue/mfr/RednetAdaptorTE.java

RednetAdaptorTE 是 Rednet Adaptor 的 TileEntity,负责在 16 个 Bundled 通道与 16 个 RedNet 通道之间搬运信号。每个通道的方向与连通性都可以独立配置,这是本 mod 唯一的状态机。

配置位

DIRECTION_BIT = 1
CONNECTED_BIT = 2
BUNDLED_TO_REDNET = 0
REDNET_TO_BUNDLED = 1

signalConfig[i] 是一个位掩码:

位 含义
bit 0 (DIRECTION_BIT) 方向:0 = Bundle→RedNet,1 = RedNet→Bundle
bit 1 (CONNECTED_BIT) 该通道是否连通

实例初始化时(RednetAdaptorTE.java:29-34)默认:

  • 通道 0–7 → CONNECTED_BIT | BUNDLED_TO_REDNET
  • 通道 8–15 → CONNECTED_BIT | REDNET_TO_BUNDLED

即默认 8 个往上、8 个往下,且全部连通。

切换语义

toggleSignalDirection(i):未连通时先连通;已连通则翻转方向位。 toggleSignalConnected(i):直接异或 CONNECTED_BIT。 两者都会 markDirty() + markBlockForUpdate()。

信号搬运

transferSignals() 按每通道的配置分三态:

signalConfig[i] 行为
CONNECTED_BIT | BUNDLED_TO_REDNET rednetOutput[i] = bundledInput[i] != 0 ? 15 : 0
CONNECTED_BIT | REDNET_TO_BUNDLED bundledOutput[i] = rednetInput[i] != 0 ? 255 : 0
其他(未连通) 两个输出都置 0

注意强度是二值化的:RedNet 输出固定 15,Bundled 输出固定 255,不传递模拟强度。

输入采集

两条输入路径:

  • Bundled 侧 — onNeighborBlockChange() 轮询 6 个面,对每个面调 ProjectRedAPI.instance.transmissionAPI.getBundledInput(...),逐通道取最大值合并(RednetAdaptorTE.java:86)。任一通道有变化就重算并通知邻居。
  • RedNet 侧 — onInputsChanged(int[] inputValues) 由 MFR 回调,整体覆盖 rednetInput 后重算。

广播接口

RednetAdaptorTE implements IBundledTile, IBundledEmitter:

方法 返回
canConnectBundled(int side) true(六面全通)
getBundledSignal(int dir) bundledOutput
getRednetOutput() rednetOutput(int[16])

方块侧实现 IRedNetOmniNode,getConnectionType 返回 RedNetConnectionType.CableAll(六面均可连 RedNet 线)。

NBT 字段

writeContentsToNBT / readContentsFromNBT:

键 类型 长度
bundledInput byte array 16
bundledOutput byte array 16
rednetInput int array 16
rednetOutput int array 16
signalConfig int array 16

读取时整体以 bundledInput 是否存在为开关:只要有 bundledInput 就一次性覆盖全部五个数组;否则保留实例初始化的默认值。