信号系统接口

lib/signal/ 目录下 2 个接口(各 10 / 20 行),是 Signal Bus 与 Signal Terminal 之间的契约。

ISignalBusConnectable

lib/signal/ISignalBusConnectable.java(10 行)—— 「我能否在某一面被总线连接」

public interface ISignalBusConnectable {
    boolean connectableOnFace(ForgeDirection side);
    boolean connectableOnCorner(ForgeDirection side, ForgeDirection turn);
}
方法 实现者 实现内容
connectableOnFace(ForgeDirection) SignalBusLogic return placedSides[side.ordinal()];(仅玩家放置过的面)
connectableOnCorner(ForgeDirection, ForgeDirection) SignalBusLogic 恒 return false;

connectableOnCorner 是死方法 —— SignalBusLogic 恒返回 false,全仓无其他实现者(items/blocks/SignalBusItem.onItemUse 另有私有的 _canPlaceItemBlockOnSide 干类似的事,但不实现本接口)。

ISignalTransceiver

lib/signal/ISignalTransceiver.java(20 行)—— 「我是信号的收发端,归属某个总线坐标」

public interface ISignalTransceiver {
    void    setBusCoords(World world, int xCoord, int yCoord, int zCoord);
    CoordTuple          getBusCoords();
    byte[]              getReceivedSignals();
    void    receiveSignalUpdate(byte[] signals);
    int     doUnregister(boolean reHoming);
    int     getDroppedWire();
}
方法 实现者 用途
setBusCoords SignalTerminalLogic Spool of Wire 右键总线时写入 busX/busY/busZ + busDim
getBusCoords SignalTerminalLogic 供世界覆盖渲染绘制 tether 线
getReceivedSignals SignalTerminalLogic 读 cachedSouthboundSignals
receiveSignalUpdate SignalTerminalLogic 总线推送信号,比对后置 doUpdate
doUnregister(boolean reHoming) SignalTerminalLogic 破坏 / 总线消失时注销,reHoming 控制是否重定位
getDroppedWire SignalTerminalLogic 破坏时掉落的 Length Wire 数量

实现者只有 1 个:SignalTerminalLogic。SignalBusLogic 实现的是 ISignalBusConnectable 而非 ISignalTransceiver。

世界覆盖渲染(唯一的接口消费者)

client/SignalTetherWorldOverlayRenderer.java(RenderWorldLastEvent 订阅者)是 ISignalTransceiver 唯一的使用方:玩家手持 Spool of Wire 时,扫描以玩家为中心的 3×3 区块中所有 ISignalTransceiver 实例,画出它到其总线坐标的红色直线。

数值

数值 值
接口数 2
ISignalBusConnectable 方法数 2(connectableOnCorner 恒 false)
ISignalTransceiver 方法数 6
ISignalBusConnectable 实现者 1(SignalBusLogic)
ISignalTransceiver 实现者 1(SignalTerminalLogic)
覆盖渲染扫描范围 3×3 区块(9 个)
线宽 2.5F
线色 glColor4f(1, 0, 0, 1)(纯红)
触发条件 手持 TMechworks:spoolwire
绘制端点偏移 源 +0.5 / +0.5 / +0.5;目标 +0.5 / +0 / +0.5
GL 状态 关纹理 + 开混合 + 关光照(结束恢复)

源码缺陷

  • connectableOnCorner 是死方法(SignalBusLogic 恒 return false):接口预留了「角落连接」语义但从未实现,命名暗示支持斜向布线,实际不支持。
  • ISignalTransceiver 的 6 个方法中 3 个无生产调用点:getBusCoords 只被覆盖渲染用;doUnregister / getDroppedWire 的调用点集中在 SignalTerminalLogic 自身的 breakBlock / notifyBreak 内部,接口抽象未带来跨类复用收益。
  • getDroppedWire() 返回 int 而非 ItemStack:接口层直接泄漏「掉落数量」这一实现细节,调用方需自行 new ItemStack(lengthWire, n)。
  • 接口方法无 public 修饰的差异:ISignalBusConnectable 两个方法都写了 public,ISignalTransceiver 一个都没写。接口方法隐式 public,属风格不统一。
  • 覆盖渲染每帧扫描 9 个区块的全部 TE(client/SignalTetherWorldOverlayRenderer.java:56-76):双层 for 遍历 chunkTileEntityMap.values(),无缓存、无脏标记,玩家手持 Spool 时每帧执行。大型 base 中这是持续开销。
  • 覆盖渲染不检查维度:ISignalTransceiver.getBusCoords() 返回的 CoordTuple 不含 dimensionId,若终端与总线跨维度(当前被 SpoolOfWire 限制为同维度,故不可达),渲染会画出错误坐标的线。
  • 渲染结束只恢复 4 个 GL 状态(glEnable(GL_LIGHTING) / GL_TEXTURE_2D / glDisable(GL_BLEND) / glPopMatrix()),未恢复 glLineWidth —— 遗留 2.5F 线宽会影响后续渲染。
  • 目标端点 Y 偏移为 +0 而 X/Z 为 +0.5(:100):线画在方块底面而非中心,与源端点(方块中心)不对称,视觉上是一条斜线。
  • 无 @SideOnly(Side.CLIENT) 类级注解(但类只 import 客户端类,且只通过 Minecraft.getMinecraft() 访问),依赖「不被打包到服务端」的隐式约定。

相关条目