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)。

相关条目