模组集成
基本信息
| 属性 | 值 |
|---|---|
| 集成包 | 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)通常是可选依赖的正常保护写法;此处因为完全无日志,失败不可诊断
相关条目
- 配置文件 - 本页列出的 6 个集成相关开关
- 饰品 - Baubles 硬依赖的具体内容
- Corporea 物流 - Storage Drawers 对接
- 护甲套装 - Thaumcraft 揭示头盔
- Lexica Botania -
CLexiconEntry集成条目的机制