Compatibility Mods

基本信息

属性 值
检测器 openmodularturrets.compatability.ModCompatibility
检测方式 cpw.mods.fml.common.Loader.isModLoaded(String)
检测时机 preInit 中 ModCompatibility.checkForMods(),先于 Items.init() / Blocks.init()(ModularTurrets.java:55-57)
模组数量 8 个被探测(ModCompatibility.java:33-63)
另有 @Optional 钩子 Waila、NotEnoughItems、GregTech 的 IEnergyConnected(均不经 Loader.isModLoaded)

FML 依赖声明

ModInfo.DEPENDENCIES(ModInfo.java:8)声明了 7 个软依赖,全部为 after::

after:ThermalFoundation;after:ThermalExpansion;after:OpenComputers;after:ComputerCraft;after:Mekanism;after:EnderIO;after:Thaumcraft

after: 表示「我在它之后加载」,不要求它存在。因此本模组在纯净 Forge 环境下也能加载(此时只剩 CoFH 一个硬依赖)。

mcmod.info 中另有一组 requiredMods / dependencies 写的是 "MinecraftForge,ThermalExpansion"(逗号分隔),与 @Mod(dependencies=...) 的分号分隔列表是两套独立的声明系统,前者只被 mod 元信息界面读取。

探测到的模组与效果

ModCompatibility.checkForMods()(ModCompatibility.java:30-66):

被探测的 modid 静态标志 命中时的实际效果
ThermalExpansion ThermalExpansionLoaded 参与 配方系统 的处理器选择
EnderIO EnderIOLoaded 同上
Mekanism MekanismLoaded 同上
Thaumcraft ThaumcraftLoaded 注册 Addon - Potentia Converter;触发 ThaumcraftRecipeHandler;TurretBase 的 IEssentiaTransport / IAspectContainer 实现生效
OpenComputers OpenComputersLoaded 注册 Addon - Serial Port;TurretBase 的 SimpleComponent 生效(组件名 tierOneTurretBase … tierFiveTurretBase)
ComputerCraft ComputercraftLoaded 同上;另有 CCPeripheralProvider 注册外设
IC2 IC2Loaded TurretBase 的手写 EU 桥接(injectEnergyUnits / inputEnergyFrom)生效;postInit 中的 fixIC2Loading() 会在 IC2 API 类缺失时把它强制改回 false
gregtech(经 @Optional.Interface) 无静态标志 TurretBase 实现 gregtech.api.interfaces.tileentity.IEnergyConnected(TurretBase.java:29,52,56)。源码注释:“don’t change to gregtech_nh as the api also exists in gt6”
gregtech_nh GT5uNHLoaded 无任何效果 —— 该标志只被赋值,从不被读取(见 Config 的「无读取者的死配置」)

ModCompatibility.java:63 另有一处 Loader.isModLoaded("gregtech") 只打一条日志(源码注释:“I feel like it should still say this with GT6”),不设置任何标志。

非 Loader 途径的集成

Waila

ModCompatibility.performModCompat()(ModCompatibility.java:77-84)无条件向 Waila 发送注册消息:

FMLInterModComms.sendMessage("Waila", "register",
    "openmodularturrets.compatability.WailaTileHandler.callbackRegister");

WailaTileHandler 整个类标注 @Optional.Interface(iface = "mcp.mobius.waila.api.IWailaDataProvider", modid = "Waila")(WailaTileHandler.java:24-25),其所有方法标注 @Optional.Method(modid = "Waila")。Waila 未安装时 FML 在剥离阶段移除整个类,不会产生 NoClassDefFoundError。Waila 本身是 devOnlyNonPublishable 依赖(dependencies.gradle),仅供编译。

NotEnoughItems

TurretBaseAbstractGui 整个类标注 @Optional.Interface(iface = "codechicken.nei.api.INEIGuiHandler", modid = "NotEnoughItems")(TurretBaseAbstractGui.java:31),导入 codechicken.nei.VisiblityData、codechicken.nei.api.INEIGuiHandler、codechicken.nei.api.TaggedInventoryArea(:13-15)。NEI 未安装时 FML 剥离整个类,不产生 NoClassDefFoundError。5 个覆写方法均标注 @Optional.Method(modid = "NotEnoughItems")(:148,154,160,166,172):

方法 返回 实际作用
modifyVisiblity 原样返回传入的 VisiblityData 不改可见性
getItemSpawnSlots null 不提供 NEI 生成槽
getInventoryAreas null 不标记库存区
handleDragNDrop false 拒绝 NEI 的拖放
hideItemPanelSlot 按权限隐藏右侧配置区 见下

唯一有实际行为的是 hideItemPanelSlot(TurretBaseAbstractGui.java:172-199):它按权限决定 NEI 物品面板是否遮挡炮塔 GUI 右侧的配置矩形 ——

身份 隐藏的矩形(相对 GUI 左上角)
底座主人 (+180, +0, 80×95)
受信任玩家(admin) (+180, +0, 80×45)
受信任玩家(canChangeTargeting 或 admin) (+180, +50, 80×20)

ComputerCraft 外设

registerCCCompat()(ModCompatibility.java:96-99)在 ComputercraftLoaded 时调用 ComputerCraftAPI.registerPeripheralProvider(CCPeripheralProvider.getInstance()),使 TurretBase 的 IPeripheral 实现可被 CC 访问。

VersionChecker

addVersionCheckerInfo()(ModCompatibility.java:68-75)通过 FMLInterModComms.sendRuntimeMessage("openmodularturrets", "VersionChecker", "addCurseCheck", ...) 注册版本检查,携带 CurseForge 项目名 224663-openmodularturrets 与文件名模板 OpenModularTurrets-1.7.10-[].jar。

IGW Mod 通知

ConfigHandler.IGWNotification(ModCompatibility/Enable IGW Mod notification,默认 true)控制 IGW(IndustrialCraft 旧版 GUI 库)相关的通知。

IC2 加载顺序修正

ModCompatibility.fixIC2Loading()(ModCompatibility.java:86-94)在 postInit 中用 Class.forName("ic2.api.energy.tile.IEnergySink", false, ...) 探测 IC2 API 是否真正可用,失败则把 IC2Loaded 强制置回 false,避免 EU 集成在类未就绪时崩溃。

开发期依赖(不进入运行时)

dependencies.gradle 中 7 个 devOnlyNonPublishable 仅供编译,不构成运行依赖:

依赖 坐标
Waila com.github.GTNewHorizons:waila:1.19.34:dev
NotEnoughItems com.github.GTNewHorizons:NotEnoughItems:2.8.130-GTNH:dev
OpenComputers com.github.GTNewHorizons:OpenComputers:1.12.61-GTNH:dev
IC2 net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev
GT5-Unofficial com.github.GTNewHorizons:GT5-Unofficial:5.09.54.129:dev
Thaumcraft thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev
ComputerCraft curse.maven:computercraft-67504:2269339(rfg.deobf)

NEI 集成是真实存在的:TurretBaseAbstractGui 实现了 INEIGuiHandler,见上方 NotEnoughItems 一节。NotEnoughItems 在 dependencies.gradle 中为 devOnlyNonPublishable,仅供编译。

相关条目