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,仅供编译。
相关条目
- CoFH Energy - 唯一的硬依赖
- Recipe System - EnderIO / TE / Mekanism 如何影响配方
- Addons - 两个条件注册的附加件
- Config - 集成开关所在分类