OpenComputers Integration

基本信息

属性 值
子系统类 gcewing.sg.compat.oc.OCIntegration(compat/oc/OCIntegration.java:19),继承 IntegrationBase
加载条件 integrateWithMod("OpenComputers", ...)(SGCraft.java:123)
FML 声明 after:OpenComputers(软依赖,SGCraft.java:65)
注册方块 gcewing_sg:ocInterface(compat/oc/OCIntegration.java:36)
TileEntity OCInterfaceTE(compat/oc/OCInterfaceBlock.java:23)
GUI SGGui.OCInterface = 枚举序号 4(guis/SGGui.java:9-15、compat/oc/OCIntegration.java:69、compat/oc/OCIntegration.java:74)

功能

OpenComputers 是 SGCraft 唯一被写进 FML dependencies 字符串的外部模组(SGCraft.java:65),因此 OC 缺失时 SGCraft 仍能加载,只是所有 OC 相关内容不注册。

集成提供两条独立通路:

1. OC Interface 方块

放置 OC 星门接口 可以在星门旁放一个 OC 节点。OCInterfaceTE 构造时用 Network.newNode(this, Visibility.Network).withComponent("stargate", Visibility.Network).create() 创建节点(compat/oc/OCInterfaceTE.java:41-43),因此在 Lua 中的访问名是 stargate。

它实现 IComputerInterface / Environment / IInventory / ITickable(compat/oc/OCInterfaceTE.java:32),把 CC 集成 用的 SGInterfaceTE 的 ci* 方法原样暴露(tileentities/SGInterfaceTE.java:55-129)。

rebroadcastNetworkPacket 是跨星门转发 OC 网络包的关键:只有槽内插有网卡时才真正 sendToReachable("network.message", packet)(compat/oc/OCInterfaceTE.java:64-72),网卡判定见 hasNetworkCard(compat/oc/OCInterfaceTE.java:49-55)。

2. 星门本体上的无线端点

每个已加载的 SGBaseTE 会被 OCIntegration.onSGBaseTEAdded 挂上一个 OCWirelessEndpoint(compat/oc/OCIntegration.java:77-79,调用点 tileentities/SGBaseTE.java:657-658)。端点实现 OC 的 WirelessEndpoint,收到无线包时若本门正连着另一座门,就把包原样转发给对端的端点(compat/oc/OCWirelessEndpoint.java:61-73)。这使得两座星门在 OC 网络层表现为一段透明的网线。

端点在区块卸载时被移除(tileentities/SGBaseTE.java:433-434 → compat/oc/OCWirelessEndpoint.java:36-39),不存在泄漏。

数值

配置键 默认值 含义 来源
opencomputers.wirelessRebroadcastStrength 50.0 无线包跨星门转发时的强度 compat/oc/OCWirelessEndpoint.java:20、:27

该键通过 OCIntegration.configure → OCWirelessEndpoint.configure 声明(compat/oc/OCIntegration.java:28-31),而 BaseMod.preInit 会对每个子系统调用 sub.configure(config)(BaseMod.java:122),因此只要 OC 存在这个键就会被写进配置文件。

项目 值 来源
Lua 回调方法数 11 grep -c '@Callback' compat/oc/OCInterfaceTE.java = 11
网卡槽位数 1 compat/oc/OCInterfaceTE.java:37
GUI 尺寸 176 × 125 compat/oc/OCInterfaceContainer.java:20-21
网卡槽坐标 x=8, y=17 compat/oc/OCInterfaceContainer.java:22-23、:31

OCInterfaceContainer 里的字段名 slotsLeft / slotsTop 容易被误读为槽位数量,实际是槽位的像素 x / y 坐标——addSlots(te, x, y, numRows, cls) 的槽数取自 inventory.getSizeInventory(),即 1(guis/containers/BaseContainer.java:62-64),与 numUpgradeSlots = 1 一致。这不是缺陷。

Lua 方法

11 个 @Callback 方法(compat/oc/OCInterfaceTE.java:80-186)与 CC 侧一一对应:

方法 参数 返回
stargateState 0 状态、已解锁导标数、方向
energyAvailable 0 可用能量
energyToDial 1(地址) 该地址的拨号成本
localAddress 0 本门地址
remoteAddress 0 对端地址
dial 1(地址) true 或 {null, 错误信息}
disconnect 0 true
irisState 0 虹膜状态字符串
openIris 0 true
closeIris 0 true
sendMessage 变长 true

异常处理统一为 failure(e),返回 { null, e.getMessage() }(compat/oc/OCInterfaceTE.java:76-78)——错误信息确实被传回 Lua,没有被吞掉。

合成配方

ini / cmc / ibi:i=铁锭,n=ingotNaquadahAlloy,c=OC 线缆,m=微芯片 1,b=印刷电路板(compat/oc/OCIntegration.java:49-64)。

相关条目