第三方模组集成
基本信息
| 属性 | 值 |
|---|---|
| 管理器 | 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→ modidBaubles|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 |