第三方模组集成

基本信息

属性 值
管理器 ModIntegrationManager(system/integration/ModIntegrationManager.java)
处理器接口 IIntegrationHandler:getModId() + integrate()(system/integration/IIntegrationHandler.java:3-8)
活注册的处理器 4 个(ModIntegrationManager.java:21-39)
文件数 system/integration/ 下 6 个文件(接口 1 + 管理器 1 + handler 4)
黑名单来源 IMC HEE:System:DisableIntegration(IMC API)

功能

ModIntegrationManager 在 preInit 跑第一组、在 postInit 跑第二组,判定条件是 Loader.isModLoaded(modId) && !blacklistedMods.contains(modId)(:32、:51)。blacklistedMods 是 public static final Set<String>(:19)。

数值

4 个活注册处理器

处理器类 modid 注册阶段 位置
BaublesExpandedIntegration Baubles|Expanded preInit ModIntegrationManager.java:22
NotEnoughItemsIntegration NotEnoughItems postInit ModIntegrationManager.java:23
ThaumcraftIntegration Thaumcraft postInit ModIntegrationManager.java:24
MineFactoryReloadedIntegration MineFactoryReloaded postInit ModIntegrationManager.java:25

⚠️ 两个 modid 不是它们的 Maven 坐标名,也不是仓库名:

  • Maven 坐标 Baubles-Expanded → modid Baubles|Expanded(handlers/BaublesExpandedIntegration.java:12)
  • MineFactoryReloaded 在 dependencies.gradle 中根本没有声明(dependencies.gradle:3-10 只有 GTNHLib / NotEnoughItems / Baubles-Expanded / Thaumcraft / Mobs-Info)。它是纯运行时集成,靠 Class.forName("powercrystals.minefactoryreloaded.MFRRegistry") 反射接入。

各处理器的实际行为

处理器 行为 位置
BaublesExpandedIntegration BaubleExpandedSlots.tryRegisterType("charm_pouch") + tryAssignSlotOfType("charm_pouch"),注册并自动分配护符袋槽位常量 BAUBLESLOT = "charm_pouch" handlers/BaublesExpandedIntegration.java:8、:17-18
NotEnoughItemsIntegration ① API.hideItem(new ItemStack(BlockList.special_effects, 1, WILDCARD)) 隐藏开发方块;② GuiContainerManager.inputHandlers.addFirst(...) 注册一个 IContainerInputHandler,使在 NEI 物品列表中按知识书快捷键直接打开对应图鉴页 handlers/NotEnoughItemsIntegration.java:31、:33-85
ThaumcraftIntegration 510 行,调用 thaumcraft.api.ThaumcraftApi.registerObjectTag(方块 + 物品的 aspect 标签)与 registerEntityTag(实体 aspect 标签),共约 100 条注册 handlers/ThaumcraftIntegration.java:30-497
MineFactoryReloadedIntegration 反射取 powercrystals.minefactoryreloaded.MFRRegistry.registerSafariNetBlacklist(Class),把 EntityMobBabyEnderman 加进动物采集网黑名单 handlers/MineFactoryReloadedIntegration.java:18-24

NotEnoughItemsIntegration 的钩子细节

匿名 IContainerInputHandler 只实现了一个有效方法:

@Override
public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) {
    return CompendiumEventsClient.getInstance().isKeybindingValid()
            && keyCode == CompendiumEventsClient.getCompendiumKeyCode()
                    ? handleItemStack(GuiContainerManager.getStackMouseOver(gui))
                    : false;
}

(handlers/NotEnoughItemsIntegration.java:48-54)其余 7 个接口方法 mouseClicked / onMouseUp / onMouseScrolled / onMouseDragged / onMouseClicked / onKeyTyped / keyTyped / mouseScrolled 全部是空的 {} 或直接 return false(:57-84)—— 这是 NEI IContainerInputHandler 的强制实现要求,不是未完成代码。integrate() 开头有 if (FMLCommonHandler.instance().getSide() != Side.CLIENT) return;(:29),所以服务端只读逻辑。

ThaumcraftIntegration 的 aspect 覆盖范围

类别 覆盖内容 代表性注册
黑曜石系列 obsidian_falling / obsidian_stairs / obsidian_special 3 组 meta / obsidian_special_glow 3 组 meta DARKNESS 1, FIRE 2, EARTH 2(:34-65)
祭坛 essence_altar 3 种精华 meta + item(essence) SPECTRAL meta(空 AspectList) ELDRITCH 4, ENERGY 10, EXCHANGE 2, MIND 5, EARTH 6(:71-81)
矿石 end_powder_ore / stardust_ore 全 16 meta / igneous_rock_ore / instability_orb_ore :89-104
生态岛地表 end_terrain 的 metaInfested / metaBurned / metaEnchanted 三种 DARKNESS 1, POISON 1, EARTH 1 等(:111-122)
装饰方块 crossed_decoration 8 个命名 meta / spooky_log 2 组 / spooky_leaves / death_flower 2 组 :124-172
刷怪笼 custom_spawner meta 0 与 meta 1 BEAST 4, DEATH 1, MAGIC 4, TRAVEL 4(:174-180)
物品 约 30 条,含 rune 6 个 meta 分别对应 6 种 RuneType 的 aspect 组合 EARTH 1, MIND 1, MAGIC 2, VOID 2(rune meta 5,:405-408)
实体 14 条 registerEntityTag,含 HomelandEnderman 按 homelandRole NBT 分 7 种不同 aspect 组合 :417-496

⚠️ registerEntityTag 用的字符串是 "HardcoreEnderExpansion.EnderEye" 这类 modid + . + 实体注册名 的形式(:418、:422、:425、:430、:434、:437、:440、:443、:447、:450、:454、:457、:462、:467、:472、:477、:481、:486、:490、:495)—— 这与方块/物品用 ItemStack 的方式不同,依赖 Thaumcraft 的实体名解析。仓库无测试、无注释说明这一差异来源,故仅记录。

依赖分层

层级 模组 modid 声明位置
硬依赖(唯一) GTNHLib gtnhlib @Mod(dependencies = "required-after:gtnhlib@[0.5.22,)")(HardcoreEnderExpansion.java:66)+ dependencies.gradle:4 implementation
编译期依赖 NotEnoughItems NotEnoughItems dependencies.gradle:5 implementation(不在 @Mod 依赖串中 → 非 FML 硬依赖)
软依赖 Baubles-Expanded Baubles|Expanded dependencies.gradle:7 compileOnly + 处理器
软依赖 Thaumcraft Thaumcraft dependencies.gradle:8 compileOnly + 处理器
软依赖 Mobs-Info mobsinfo dependencies.gradle:9 compileOnly + @Optional.Interface(4 处)
软依赖 Baubles Baubles @Optional.Interface(8 处,见 item/ItemCharmPouch.java:37)
纯运行时 MineFactoryReloaded MineFactoryReloaded 无 gradle 声明,仅反射
引用但非依赖 Minecraft(minecraft) — mechanics/misc/StardustDecomposition.java:93、:111、:128 中 itemId[0].equals("minecraft")

Mobs-Info 的 modid 是 mobsinfo(entity/boss/EntityMiniBossFireFiend.java:45、mechanics/MiscEvents.java:35),而 Maven 坐标是 Mobs-Info —— 又一处坐标名 ≠ modid。

交互

触发 行为
模组加载 preInit 跑 BaublesExpandedIntegration
模组加载 postInit 跑 NEI / Thaumcraft / MFR 三个处理器
IMC HEE:System:DisableIntegration 把 modid 加入 blacklistedMods,之后该 mod 的处理器被跳过(ImcSystemHandlers.java:16)
Mobs-Info 存在 启用 IMobInfoProvider / IMobExtraInfoProvider,为 Boss 提供 MobDrop(MiscEvents.java:35、:94)
MFR 集成失败 catch (Throwable t) 后 Log.throwable(t, "Unable to integrate with MineFactoryReloaded!")(MineFactoryReloadedIntegration.java:22-24)—— 记录了异常本体,属于正确的错误处理,不是空 catch

相关条目

  • IMC API - HEE:System:DisableIntegration 与 14 个消息 key
  • 配置 - IMC 配置项
  • 材料 - bucket_ender_goo 的跨域贴图
  • Boss - Mobs-Info 掉落信息