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)的流程:
- 遍历注册表中的全部
IMultiPeripheralProvider,收集非空外设; - 若
Config.CC_ALL_MULTI_PERIPHERALS为真,额外调getAllPeripherals(...)扫描其它 mod 已注册的外设(MultiPeripheralProvider.java:20-22); - 若加载 OpenPeripheral 且
Config.CC_OPEN_MULTI_PERIPHERAL为真,把 OpenPeripheral 的外设也包成OpenMultiPeripheral加进来(MultiPeripheralProvider.java:23-28); - 只找到一个就原样返回;找到多个则包成
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 集成。
相关条目
- 多外设 API - 第三方接入的接口定义
- ComputerCraft 爬虫升级 - 5 个 CC 升级
- 设置:ComputerCraft - 三项开关