外部模组集成

基本信息

OpenBlocks 的集成走 OpenModsLib 的 IntegrationModule 机制:Integration.addModule(new ModuleAdapters()) / addModule(new ModuleTurtles())(OpenBlocks.java:704-705),每个模块在自己的构造器里声明加载条件,条件不满足则整模块跳过。

integration/ 包共 11 个类(+1 个 package-info.java):

类 作用
ModuleAdapters 4 个 OpenPeripheral 外设适配器
ModuleTurtles 1 个 ComputerCraft 海龟升级
AdapterCannon 物品炮外设
AdapterDonationStation 捐赠站外设
AdapterProjector 投影仪外设
AdapterVillageHighlighter 村庄高亮灯外设
MagnetTurtleUpgrade 磁铁海龟升级
MagnetControlAdapter 磁铁升级的外设侧
ITickingTurtle / TurtleUtils / TurtleIds 海龟升级的辅助接口与工具

硬依赖(1 个)

模组 声明方式 位置
OpenModsLib(modid OpenMods) api('com.github.GTNewHorizons:OpenModsLib:0.10.14:dev') dependencies.gradle:4
dependencies = "required-after:OpenMods@[0.10.1,)" OpenBlocks.java:230

依赖声明里的 modid 是 OpenMods,不是 OpenModsLib——OpenModsLib 仓库自己的 gradle.properties 里 modId = OpenMods。coremod 同理是 openmods.core.OpenModsCorePlugin(该仓库的 coreModClass)。

FML 亦隐式要求 Forge:gradle.properties 中 forgeVersion = 10.13.4.1614(未在 @Mod(dependencies) 中重复声明)。

功能性软依赖

这些是真正有代码路径的集成(compileOnly,运行时缺失即跳过):

模组 条件 集成内容 位置
OpenPeripheralCore modLoaded(Mods.OPENPERIPHERALCORE) 4 个外设适配器 ModuleAdapters.java:15-17(条件)、:32-35(注册)
ComputerCraft all(modLoaded(OPENPERIPHERALCORE), modLoaded(COMPUTERCRAFT), classExists("dan200.computercraft.api.turtle.ITurtleUpgrade")) 海龟升级 ModuleTurtles.java:19-23
Backhand Loader.isModLoaded("backhand") 滑翔翼副手切换 EntityHangGlider.java:55、:79
Et Futurum Requiem Loader.isModLoaded("etfuturum") 滑翔翼接管鞘翅 EntityHangGlider.java:167、:172
MFR(Mystical Agriculture 系) 启动时无条件发 IMC 行李箱加入刷怪笼黑名单 OpenBlocks.java:720-723
NotEnoughItems devOnlyNonPublishable IConfigureNEI 实现 NEIOpenBlocksConfig.java
Mobs Info compileOnly 见下(引用待核) dependencies.gradle:8
waila devOnlyNonPublishable 见下(引用待核) dependencies.gradle:20

dependencies.gradle:8(Mobs-Info)与 :20(waila)在 OpenBlocks 源码中没有直接 import(对全部 .java grep 无命中)——它们可能只用于运行期兼容或已被弃用。这一点无法从 openblocks 仓库单独核实,因其语义由各自的 API 决定。

NEI 集成的注册方式

NEIOpenBlocksConfig implements IConfigureNEI(NEIOpenBlocksConfig.java:15),但仓库内没有任何 new NEIOpenBlocksConfig()(对全仓库 grep 只有这一处 class 声明本身)。它依赖 NEI 自己对 mod jar 做 ASM 扫描来发现 IConfigureNEI 实现。因此:

  • 装了 NEI → 生效(通过 NEI 的类路径扫描)
  • 没装 NEI → 类不被加载,NEI 也是 devOnlyNonPublishable,本就不随 mod 分发

它会隐藏 OpenBlocks:canvasglass(NEIOpenBlocksConfig.java:24-25),因为玻璃画布无法合成。

墓碑 / 自动装备类软依赖

common/ModPresence.java 是一个纯 Loader.isModLoaded 开关集合(7 个):

字段 检测的 modid 用处
ADVENTURE_BACKPACK adventurebackpack 墓碑收纳
BAUBLES Baubles 墓碑收纳
COSMETIC_ARMOR cosmeticarmorreworked 墓碑收纳
ET_FUTURUM etfuturum 滑翔翼鞘翅接管
GALACTICCraft → GALACTICRAFT GalacticCraftCore 墓碑收纳
MC_BACKPACK Backpack 墓碑收纳
TCONSTRUCT TConstruct 墓碑收纳 + 快照

使用点全部在 GraveAutoEquip.java(:76、:93、:111、:127、:193、:270、:295、:317、:333、:356)与 GraveInventorySnapshot.java(:61、:94、:116、:136、:156、:180)。

这 6 个在 dependencies.gradle 中均为 devOnlyNonPublishable(即不随 jar 分发的开发期依赖):AdventureBackpack2 :11、Baubles-Expanded :12、CosmeticArmorReworked :13、GalacticCraft :14、Minecraft-Backpack-Mod :18、TinkersConstruct :19。

捐赠链接(IMC)

OpenBlocks 用 IMC 接收其它 mod 的捐赠链接:processMessage(FMLInterModComms.IMCEvent) 监听 donateUrl 消息并存入 DonationUrlManager(OpenBlocks.java:787-794、:790-792)。捐赠站方块 OpenBlocks:donationStation 读取这些链接。

注意:Mods.* 常量在 OpenBlocks 源码中出现 35 次,但绝大多数是捐赠 URL 常量,不是功能依赖。真正影响行为的只有上表列出的那些。

数值

数值名 来源 值
集成模块数 Integration.addModule 2(OpenBlocks.java:704-705)
OpenPeripheral 适配器数 adapterRegistry.register 4(ModuleAdapters.java:32-35)
海龟升级数 registerTurtleUpgrade 1(ModuleTurtles.java:39)
海龟升级 ID TurtleIds.MAGNET_TURTLE_ID 9260(TurtleIds.java:6)
ModPresence 开关数 字段计数 7

TurtleIds.java:5 的注释为 // TODO Allocate proper ones on Wiki. This one should be free.——升级 ID 9260 是作者随手取的,尚未在 wiki 上正式分配。这是仓库内明确记录该数字为「临时」的证据。

交互

触发 行为
OpenPeripheral 加载 4 个适配器注册,暴露方块的 Lua 接口
CC + OP 同时加载 磁铁海龟升级注册;客户端还把它挂到 Forge 事件总线(ModuleTurtles.java:40)
玩家死亡 按 ModPresence 决定是否连带收纳对应模组的装备
捐赠站右键 打开 DonationUrlManager 中任一捐赠链接
滑翔翼 + Et Futurum 鞘翅被滑翔翼接管
Backhand 加载 滑翔翼支持副手

相关条目