ComputerCraft 多外设系统

基本信息

属性 值
实现包 pl.asie.computronics.cc.multiperipheral(5 个类)
注册点 ComputerCraftAPI.registerPeripheralProvider(multiPeripheralProvider)(IntegrationComputerCraft.java:174)
注册条件 加载 ComputerCraft(Computronics.java:308-311 建对象,IntegrationComputerCraft.java:72 init())
启用日志 三项全开时打印 “Multiperipheral system for ComputerCraft engaged. Hooray!”(Config.java:370-372)

这是 Computronics 面向 CC 外设冲突的核心机制:当多个 mod 都想给同一方块注册外设时,CC 原生只认第一个,其余全部失效。Computronics 把自己注册成唯一的总外设提供方,在内部收集所有提供方的结果并合并。

功能

MultiPeripheralProvider.getPeripheral(MultiPeripheralProvider.java:12-33)的流程:

  1. 遍历注册表中的全部 IMultiPeripheralProvider,收集非空外设;
  2. 若 Config.CC_ALL_MULTI_PERIPHERALS 为真,额外调 getAllPeripherals(...) 扫描其它 mod 已注册的外设(MultiPeripheralProvider.java:20-22);
  3. 若加载 OpenPeripheral 且 Config.CC_OPEN_MULTI_PERIPHERAL 为真,把 OpenPeripheral 的外设也包成 OpenMultiPeripheral 加进来(MultiPeripheralProvider.java:23-28);
  4. 只找到一个就原样返回;找到多个则包成 MultiPeripheral 返回;一个都没有返回 null(MultiPeripheralProvider.java:29-32)。

OpenPeripheral 的取用带完整的异常处理:catch (Exception) 只记 debug、catch (Throwable) 记 error(MultiPeripheralProvider.java:48-52),不会静默吞掉。

CC_ALWAYS_FIRST 为真时,服务端启动事件(FMLServerAboutToStartEvent)调 multiPeripheralProvider.sort(),让 Computronics 的系统几乎总是被 CC 优先识别(IntegrationComputerCraft.java:198-202、Computronics.java:436-440)。

本 mod 自己的 38 个 CC 驱动通过 registerMultiPeripheralProvider 注册进同一个表(IntegrationComputerCraft.java:73-170),其中最后一个 CCPeripheralProvider(IntegrationComputerCraft.java:170)负责 Computronics 自身方块的外设——它同时要求 TileEntity 实现 IComputronicsPeripheral 与 IMultiPeripheral,并在实现 ISidedPeripheral 时校验 canConnectPeripheralOnSide(side)(CCPeripheralProvider.java:12-25)。

第三方接入方式

两种方式,时机不同:

方式 时机 说明
直接调 Computronics.registerMultiPeripheralProvider(provider) 必须在本 mod 的 preInit 与 init 之间 静态方法,@Optional.Method(modid = ComputerCraft)(Computronics.java:383-392)
发 IMC 消息 addmultiperipherals 任意时间,但 peripheralRegistry 必须已创建 见下

IMC 方式(Computronics.java:471-508)接收形如 com.example.MyClass.register 的字符串,反射调用其签名为 (IMultiPeripheralRegistry) 的静态方法。异常处理是完整的:ClassNotFoundException / NoSuchMethodException / 其它 Exception 分别 warn 并带堆栈(Computronics.java:488-497),无静默失败。

数值

数值名 值 范围 来源
computercraft.multiperipheral.allMultiPeripherals true 布尔 Config.java:356-360
computercraft.multiperipheral.alwaysFirstPeripheral true 布尔 Config.java:361-365
computercraft.multiperipheral.openMultiPeripheral true 布尔 Config.java:350-354

openMultiPeripheral 只在 OpenPeripheral 加载时才从配置读入(Config.java:349);另两项只要 CC 加载即读入(Config.java:356-365)。三者全开时提示 “Set this to true to fix multiple mods adding peripherals to the same block not working”(Config.java:359-360)。

交互

触发 行为
CC 电脑/爬虫查询方块外设 返回合并后的 MultiPeripheral,方法名自动去重
只有一个外设可用 直接返回该外设,不做包装
没有任何外设 返回 null,CC 视为该方块无外设

38 个 CC 驱动

IntegrationComputerCraft.init() 中 38 处 registerMultiPeripheralProvider(new …) 全部为有效代码,无一被注释掉(grep -c '^ *registerMultiPeripheralProvider(new ' = 38;grep '^\s*//\s*registerMultiPeripheralProvider' 无命中)。逐项归属见 第三方外设集成 与 Railcraft 集成、EnderIO 集成。

相关条目