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)。
相关条目
- ComputerCraft 集成 - 功能几乎相同但走 Lua 外设 API
- 星门能量单元(IC2 / RF) - 另一个电气集成
- 接口与能量单元合成
- SGBaseTE - 无线端点的宿主
- 配置项 -
opencomputers.wirelessRebroadcastStrength