信号系统接口
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()访问),依赖「不被打包到服务端」的隐式约定。
相关条目
- Signal Bus -
ISignalBusConnectable的唯一实现者 - Signal Terminal -
ISignalTransceiver的唯一实现者 - Spool of Wire - 覆盖渲染的触发条件与
setBusCoords的调用方 - Signal Bus 网络 - 信号在网络中的聚合与分发