ComputerCraft Integration
基本信息
| 属性 | 值 |
|---|---|
| 子系统类 | gcewing.sg.compat.cc.CCIntegration(compat/cc/CCIntegration.java:18),实现 IIntegration |
| 加载条件 | integrateWithMod("ComputerCraft", ...)(SGCraft.java:122) |
| FML 声明 | @Mod(dependencies) 字符串中没有 ComputerCraft,属纯软依赖 |
| 注册方块 | gcewing_sg:ccInterface(compat/cc/CCIntegration.java:25) |
| TileEntity | CCInterfaceTE(compat/cc/CCInterfaceBlock.java:15) |
| GUI | 无。SGGui 枚举没有 CC 条目(guis/SGGui.java:9-15) |
功能
CC 接口与 OC 接口 的 Lua 方法集合几乎相同,但接入方式不同:CC 走 IPeripheralProvider 回调而不是 OC 的 @Callback 注解。
CCIntegration.registerOther 做两件事(compat/cc/CCIntegration.java:45-48):向 ComputerCraftAPI 注册 CCPeripheralProvider(对任何 CCInterfaceTE 返回 CCSGPeripheral,compat/cc/CCPeripheralProvider.java:17-22),以及 CCMethodQueue.init() 创建方法调用队列的单例。
线程模型
CC 的 Lua 在它自己的线程上执行,而星门数据只能在主线程访问。CCMethodQueue 就是这个桥:Lua 侧 invoke 把调用塞进 ConcurrentLinkedQueue 然后 item.lock.acquire() 阻塞等待(compat/cc/CCMethodQueue.java:32-39);CCIntegration.onServerTick 每游戏 tick 调 CCMethodQueue.onServerTick() 处理队列并 lock.release()(compat/cc/CCIntegration.java:50-53、compat/cc/CCMethodQueue.java:42-56)。
事件推送
CCInterfaceTE.postEvent 会给所有挂接的电脑 queueEvent(compat/cc/CCInterfaceTE.java:22-24),因此 SGBaseTE 侧的 postEvent("sgDialOut", address)(tileentities/SGBaseTE.java:644)可以驱动 CC 端的事件监听器。
与 OC 的一处实质差异
SGInterfaceTE.rebroadcastNetworkPacket 是空方法体(tileentities/SGInterfaceTE.java:33),而 OC 侧 OCInterfaceTE 覆写了它并真正转发 OC 网络包(compat/oc/OCInterfaceTE.java:64-72)。也就是说跨星门的网络包转发只有 OC 一侧实现,CC 一侧没有。CC 接口没有网卡槽,没有 GUI,也没有对应的转发逻辑。这是代码里的既定事实,不是本条目页的推断。
数值
| 项目 | 值 | 来源 |
|---|---|---|
| CC Lua 方法数 | 11 | grep 'new SGMethod("' compat/cc/CCSGPeripheral.java 命中 12 行,其中 1 行被注释 |
| 被注释掉的方法 | direction |
compat/cc/CCSGPeripheral.java:76 |
| 方法队列单例 | CCMethodQueue.instance |
compat/cc/CCMethodQueue.java:18、:22-24 |
| 每 tick 处理上限 | 队列当前长度 | compat/cc/CCMethodQueue.java:43-44 |
被注释的 direction 方法(// new SGMethod("direction") {,compat/cc/CCSGPeripheral.java:76)不算注册。SGMethod 的构造器 new SGMethod(name) 默认 nargs = 0(compat/cc/CCMethod.java:20-22),invoke 会严格校验参数个数并在不匹配时抛 LuaException(compat/cc/CCMethod.java:29-33)。
CCMethodQueue.tick 对非 LuaException 的异常执行 new LuaException(e.getMessage())(compat/cc/CCMethodQueue.java:51-52)——异常没有被静默吞掉(仍会抛回 Lua),但原始 Throwable 的类型与堆栈被丢弃,只保留 message。
合成配方
SnS / SrS / SSS:S=石头,n=ingotNaquadahAlloy,r=红石(compat/cc/CCIntegration.java:30-41)。
相关条目
- OpenComputers 集成 - 功能重叠但走 OC 网络 API
- 接口与能量单元合成
- SGBaseTE - 方法的实际实现方
- 星门能量单元(IC2 / RF)