模组集成

基本信息

属性 值
集成包 vazkii.botania.common.integration(16 个 .java,5 个子包)
加载检测入口 Botania.preInit(FMLPreInitializationEvent),Botania.java:57-71
检测到的模组 10 个(9 个 Loader.isModLoaded + 1 个 ModAPIManager.hasAPI + 2 个仅在 Config 中)
运行时依赖声明 LibMisc.DEPENDENCIES,LibMisc.java:22

功能

Botania 对外部模组的集成分三层:硬依赖(required-after)、软依赖(after)、可选集成(运行时 isModLoaded 检测)。

运行时依赖声明

public static final String DEPENDENCIES =
    "required-after:Baubles;after:Thaumcraft;required-after:gtnhlib@[0.5.22,)";

(LibMisc.java:22)

  • required-after:Baubles —— 硬依赖,缺失则 Botania 不加载
  • after:Thaumcraft —— 软依赖,无版本约束,缺失也可加载
  • required-after:gtnhlib@[0.5.22,) —— 硬依赖,GTNHLib ≥ 0.5.22

注意:Gradle 侧的 dependencies.gradle 声明的 Baubles-Expanded 2.2.21-GTNH 是 api(...),而运行时声明只写了不带版本的 required-after:Baubles。GTNH 上以 Gradle 侧的坐标为准。

数值

10 个加载检测点

全部位于 Botania.preInit()(Botania.java:57-71):

检测字段 检测方式 检测目标 行号
gardenOfGlassLoaded Loader.isModLoaded("GardenOfGlass") Garden of Glass :58
thaumcraftLoaded Loader.isModLoaded("Thaumcraft") Thaumcraft :60
bcTriggersLoaded ModAPIManager.INSTANCE.hasAPI("BuildCraftAPI|statements") BuildCraft 触发器 API :61
bloodMagicLoaded Loader.isModLoaded("AWWayofTime") Blood Magic :62
coloredLightsLoaded Loader.isModLoaded("easycoloredlights") Easy Colored Lights :63
etFuturumLoaded Loader.isModLoaded("etfuturum") Et Futurum :64
storageDrawersLoaded Loader.isModLoaded("StorageDrawers") Storage Drawers :65
structureLibLoaded Loader.isModLoaded("structurelib") StructureLib :66
neiLoaded Loader.isModLoaded("NotEnoughItems") Not Enough Items :67

第 10 个检测点在配置类中:ConfigHandler.verifyPotionArray()(ConfigHandler.java:412-414)依次尝试 DragonAPI、然后 hodgepodge,用于分配药水 ID。

检测 token 均使用精确大小写且带 \b 边界,未使用 -i 大小写不敏感匹配 —— Botania 源码中 mods. 前缀的引用极多,不区分大小写的短 token 搜索会产生大量假阳性。

另有一处反射式集成

ModBlocks.registerMultiparts()(ModBlocks.java:516-523)检测 ForgeMultipart:

if(Loader.isModLoaded("ForgeMultipart")) {
    try {
        Class<?> clazz = Class.forName("vazkii.botania.common.integration.multipart.MultipartHandler");
        clazz.newInstance();
    } catch(Throwable e) {}
}

MultipartHandler.java 确实存在(common/integration/multipart/MultipartHandler.java),不是指向空类的字符串注册。但这里有一个已确认的静默失败风险:catch(Throwable e) {} 是空 catch,若 MultipartHandler 的静态初始化或构造抛出任何异常(NoClassDefFoundError、NoSuchMethodError 等),异常被完全吞掉,ForgeMultipart 的多方块注册静默失败,玩家只会发现某些方块不能被 multipart 切割,没有任何错误提示。详见本页「已确认的静默失败点」。

数值

各集成的具体内容

模组 集成形式 相关文件
Baubles 硬依赖,28 件饰品实现 IBauble item/equipment/bauble/(30 个文件)
Thaumcraft 软依赖,揭示头盔 + 墨水瓶 + 注入配方 item/interaction/thaumcraft/(含 ItemManasteelHelmRevealing、ItemTerrasteelHelmRevealing、ItemElementiumHelmRevealing、ItemManaInkwell);crafting/ModManaInfusionRecipes.java
BuildCraft 通过 BuildCraftAPI|statements 提供 3 个触发器 integration/buildcraft/:TriggerManaLevel、TriggerRuneAltarCanCraft、TriggerManaDetector、StatementBase、StatementAPIPlugin
Et Futurum 旗帜图案 integration/etfuturum/ModBanners.java
Storage Drawers Corporea 存储对接 integration/corporea/WrappedStorageDrawers.java、WrappedDeepStorage.java
Garden of Glass 影响百科条目内容与分支 Botania.java:565-567(orechid)、:842-844(cocoon)
Easy Colored Lights 切换光照实现 integration/coloredlights/:LightHelperColored / LightHelperVanilla / ILightHelper;Botania.java:68 选择
Blood Magic 为其调整配置默认值 ConfigHandler.java:248-249(fallenKanade.enabled)
Not Enough Items 快捷查询 Botania.java:67;lang 中有 botania.nei.quickInfo:* 系列键
StructureLib 结构支持 Botania.java:66
Dragon API / Hodgepodge 药水 ID 分配 ConfigHandler.java:412-414

与配置相关的集成开关

配置键 默认 面向的模组
fallenKanade.enabled true Blood Magic
darkQuartz.enabled true Thaumic Tinkerer(烟熏石英方块,ConfigHandler.java:252)
thaumraftStabilizers.enabled true Thaumcraft 注入稳定器(ConfigHandler.java:276,键名原文拼写 thaumraftStabilizers 少一个 c)
18stones.enabled true 1.8 石头作为魔力炼金配方
19enderStuff.enabled true 1.9 末影物品作为配方
ringOfOdin.fireResist true Witchery 变身(ConfigHandler.java:266-267)

百科中的集成条目

CLexiconEntry 记录了 4 个外部模组(LexiconData.java:1463, 1476, 1493 等):

条目 来源模组 分类
MISC_BC_INTEGRATION "BuildCraft" Miscellaneous
MISC_TC_INTEGRATION "Thaumcraft" Miscellaneous
MISC_BANNERS "EtFuturum" Miscellaneous
"wrap"(new CLexiconEntry("wrap", categoryBasics, "Thaumcraft")) "Thaumcraft" Basics(源码注释为 // lel)

已确认的静默失败点

ModBlocks.registerMultiparts() 的空 catch(ModBlocks.java:518-521)是本仓库中唯一的 catch (Throwable e) {} 模式:

try {
    Class<?> clazz = Class.forName("vazkii.botania.common.integration.multipart.MultipartHandler");
    clazz.newInstance();
} catch(Throwable e) {}
  • 风险:ForgeMultipart 环境下若类加载失败,无方块 multipart 能力,无日志
  • 缓解:MultipartHandler.java 确实存在(2503 字节),当前 HEAD 下不会因"类不存在"而失败
  • 对照:TaxCraft/Thaumcraft 等仓库中 catch(Throwable) 通常是可选依赖的正常保护写法;此处因为完全无日志,失败不可诊断

相关条目