Signal Bus
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | TMechworks:signalBus |
| 方块类 | SignalBus |
| TileEntity | SignalBusLogic(MultiblockBaseLogic,实现 ISignalBusConnectable) |
| 多方块角色 | 成员(IMultiblockMember),主控为 SignalBusMasterLogic |
| GUI | 无 |
| 库存 | 无(SignalBusLogic 不继承 InventoryLogic) |
| 材质 / 硬度 / 抗性 / 步声 | Material.circuits / 0.1 / 1 / soundTypeMetal |
| 配方 | 1 条 |
| 可连接方向 | 6 面任意,但相对的两个面之间不能直连 |
功能
Signal Bus 是一套红石信号总线网络的传输层。多个 Signal Bus 相邻会自动聚成一个「多方块」,由一个 SignalBusMasterLogic 统一调度;任意 Signal Terminal 或其他 ISignalTransceiver 注册到网络中后,即可跨区块、跨维度(经 Spool of Wire)收发红石信号。
总线本身不产生也不消耗红石,它只负责搬运。每个总线方块 6 面各有一条独立的信号通道,因此一个总线方块可以同时收发 6 组不同信号。
连接规则
SignalBusLogic.connectableOnFace(ForgeDirection side) 直接返回 placedSides[side.ordinal()](:371-373)—— 只有玩家主动放置过的方向才可连接。placedSides 初值 {false, false, false, false, false, false}(:40),由 addPlacedSide(int side)(:421)置位。
connectedSides(ForgeDirection fromFace)(:345-366)枚举邻居,跳过 fromFace 本身与它的对面:
if (i == fromFace.ordinal() || i == fromFace.getOpposite().ordinal()) continue;
因此一个总线方块不会与正对面的另一个总线方块直连(必须绕路),也不会在同一面上既接收又发送。
信号数据
localHighSignals/cachedReceivedSignals均为byte[16]—— 每面 4 bit 的强度编码(红石 0–15)。southboundSignalsChanged/northboundSignalsChanged标志用于增量重算。SignalBusMasterLogic.updateBusSignals(CoordTuple bus, byte[] signals)汇总,getSignals()取出。- 每面有独立通道号
getChannelIcons()/getChannelIcon(int channel)(SignalTerminalLogic侧)。
数值
| 数值 | 值 |
|---|---|
| 注册名 | TMechworks:signalBus |
| TE | SignalBusLogic(继承 MultiblockBaseLogic) |
| 多方块主控 | SignalBusMasterLogic |
| 每面信号通道 | 4 bit(byte[16] = 16 个通道 × 1 字节,共 16 通道) |
localHighSignals / cachedReceivedSignals |
各 byte[16](对应终端的 16 个染色玻璃通道) |
placedSides |
boolean[6],初值全 false |
| 可连接面 | 仅玩家放置过的面(addPlacedSide) |
| 排除规则 | 跳过 fromFace 与其对面 |
| 多方块尺寸 | 无固定尺寸,按邻接图自由聚合 |
| 配方 | 1 条 |
| GUI | 无 |
| 库存 | 无 |
交互
| 触发 | 行为 |
|---|---|
| 放置 | 置 placedSides[朝向] = true,该面成为可连接面 |
| 相邻总线自动拼接 | 通过 MultiblockBaseLogic 的邻接图自动聚合,无手动操作 |
| 终端注册 | Spool of Wire 或终端自身完成,终端坐标存入总线 |
| 跨维度 | 需 Spool of Wire 记录 targetDim 后由总线注册 |
| 破坏 | MultiblockBaseLogic 的 detach 流程通知邻居重算 |
配方
common/MechRecipes.java:110-118,1 条:
w w w
s s s
| 符号 | 材料 | 数量 |
|---|---|---|
w |
Length Wire |
3 |
s |
minecraft:stone_slab(OreDictionary.WILDCARD_VALUE) |
3 |
产出 1 个 Signal Bus ×2(默认 ShapedOreRecipe 输出 1 个)。
源码缺陷
- 硬度 0.1 / 抗性 1(
blocks/SignalBus.java:71-72)—— 与SignalTerminal一致(同为Material.circuits+soundTypeMetal),但与RedstoneMachine的硬度 12 形成极端反差。 - 4 bit 强度编码:
byte[16]的 16 个槽对应 Signal Terminal 的 16 种染色玻璃通道号(0–15)。getChannelIcon(int channel)的 channel 索引无边界检查,越界会ArrayIndexOutOfBoundsException。 placedSides依赖玩家放置方向而非方块朝向:若总线被其他机器(Drawbridge、爆炸)放置而没走onBlockPlaced,可连接面不会被正确置位,导致网络静默不通。源码无自动兜底。- 「不能与对面直连」的规则无文档:源码只在
connectedSides的continue处体现,lang 与注释均未说明,玩家排线时容易困惑。 getNeighboringMembers()手写 6 面枚举(:52+)而非用MultiblockBaseLogic的通用实现,属重复代码。- 跨维度信号同步依赖 Spool 的 NBT 坐标(
SpoolOfWire的spoolWireData.targetDim/X/Y/Z),坐标在写入时快照;若目标区块已卸载,注册会失败且不返还已消耗的线轴耐久(onItemUse中registerTerminal返回 false 时直接return true但不damageItem)。 SignalBusMasterLogic单独成一个类(blocks/component/SignalBusMasterLogic.java)但放在blocks/component包而非blocks/logic,包结构与全仓不一致。
相关条目
- Signal Terminal - 网络的收发端
- Spool of Wire - 跨维度连接工具
- Length Wire - 本方块的配方原料
- Signal Bus 网络 - 多方块框架细节
- 过滤网类型 - 另一个多 meta 方块的实现范式