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 就一次性覆盖全部五个数组;否则保留实例初始化的默认值。