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,包结构与全仓不一致。

相关条目