第三方集成与条件加载

基本信息

属性 值
检测入口 ModularUI.Mods 枚举(ModularUI.java:61-95)
modid 常量 ModularUI.ModIds(ModularUI.java:97-107)
专用包 integration/(nei/ 8 个、recipeviewer/ 4 个)
声明依赖 dependencies.gradle
声明的依赖 modid gtnhmixins、gtnhlib、NotEnoughItems、hodgepodge、gregtech(before:)

功能

Mods 枚举:7 个受探测的 mod

ModularUI.Mods(ModularUI.java:61)每个常量包装一个 modid, isLoaded()(:85-94)带一次性缓存(initialized 标志,:86/:93)。

常量 modid 行 ModIds 常量 读取方数
LWJGL3IFY lwjgl3ify :63 LWJGL3IFY(:99) 4
BAUBLES Baubles :64 BAUBLES(:106) 4
BOGOSORTER bogosorter :65 BOGOSORTER(:100) 0(死代码)
GT5U gregtech :66 GT5U(:101) 2
HODGEPODGE hodgepodge :67 HODGEPODGE(:103) 1
NEI NotEnoughItems :68 NEI(:104) 9
NEA neverenoughanimations :69 NEA(:105) 12

「读取方数」统计的是 Mods.<常量> 的引用次数, 不等于 import 该库的文件数——两者不是一回事: neverenoughanimations 被 Mods.NEA 引用 12 次,但只有 6 个文件 import 它。

GT5U 是唯一带额外判定的常量(ModularUI.java:66):

GT5U(ModIds.GT5U, mod -> !Loader.isModLoaded(ModIds.GT6))

即:即使 gregtech 加载了,若 gregapi_post(GT6,:102)也在加载, 则视为「GT5U 未加载」。这避免在装了 GT6 的整合包里误判。

依赖声明 vs 代码引用

dependencies.gradle 声明的依赖(从文件读出,非从 mod 名推断):

依赖 配置 版本 行 代码中是否 import
GTNHLib api 0.11.49 :32 ✅ 18 个文件
lwjgl3ify compileOnlyApi 3.0.34 :33 ✅ 17 个文件(org.lwjgl)
NotEnoughItems implementation 2.8.143-GTNH :41 ✅ codechicken.nei 14 个文件
Hodgepodge compileOnly 2.7.208 :42 ✅ drawable/GuiDraw.java:31
GT5-Unofficial devOnlyNonPublishable 5.09.54.168 :44-46 ❌ 0 个 import(仅运行时 Loader.isModLoaded 探测)
ModularUI(原版) compileOnlyApi 1.3.4 :48 ❌ 0 个 import(见下)
Baubles-Expanded implementation 2.2.24-GTNH :49 ✅ baubles.api.* 2 个文件(utils/ISimpleBauble.java、test/TestItem.java)
Thaumcraft compileOnly 1.7.10-4.2.3.5 :50 ✅ 2 个文件
neverenoughanimation compileOnlyApi rfg.deobf :51 ✅ 6 个文件
lombok compileOnly + annotationProcessor 1.18.42 :36-39 仅 com/ezylang/evalex 使用

@Mod 注解另声明了 FML 层面的依赖(ModularUI.java:21-25):

required-after:gtnhmixins@[2.0.1,)
required-after:gtnhlib@[0.2.0,)
after:NotEnoughItems@[2.3.27-GTNH,)
after:hodgepodge@[2.0.0,)
before:gregtech

NEI 集成(integration/nei/,8 个文件)

类 作用
ModularUINEIGuiHandler 把 MUI2 界面注册为 NEI 的 GUI 处理器
ModularUIContainerObjectHandler 槽位 → NEI 物品列表的映射
ModularUIContainerInputHandler 槽位 → NEI 原料的映射
ModularUIContainerStackPositioner 悬浮物品定位
ModularUIContainerStackOverlay 悬浮物品绘制
INEIRecipeTransferHandler 配方自动合成转移
NEIUtil / NEIModularUIConfig 工具与配置

配方查看器抽象层(integration/recipeviewer/,4 个文件)

这 4 个类把 NEI / JEI / EMI 的差异抽象为与具体查看器无关的接口 (定义在 api/RecipeViewerSettings.java:11-13 的 javadoc:即使没装配方查看器也能安全调用):

类 作用
RecipeViewerState 界面侧状态
RecipeViewerGhostIngredientSlot<T> 幽灵原料插槽接口
RecipeViewerIngredientProvider 提供配方原料
RecipeViewerRecipeTransferHandler 配方转移

实现者包括 PhantomItemSlot(ItemStack)、FluidSlot(FluidStack)、 ItemDisplayWidget、ItemSlot。

Baubles-Expanded 集成

utils/ISimpleBauble.java 提供了对扩展饰品的最小抽象, 同时 import 了原版与扩展版两套 API:

// utils/ISimpleBauble.java:6-7
import baubles.api.BaubleType;                 // 原版 Baubles
import baubles.api.expanded.IBaubleExpanded;  // Baubles-Expanded

ClientProxy.onKeyboard(ClientProxy.java:185-193)在 ModularUI.Mods.BAUBLES.isLoaded() 为真时,用 InventoryTypes.BAUBLES.visitAll(...) 遍历扩展槽位, 打开 GuiFactories.playerInventory().openFromBaublesClient(index)。

已知问题

❌ Mods.BOGOSORTER 与 BOGO_SORT 是死代码

ModularUI.java 中有 3 处 Bogo Sorter 相关声明, 全仓 0 个读取方:

声明 行 读取方数
public static final String BOGO_SORT = "bogosorter"; :32 0
BOGOSORTER(ModIds.BOGOSORTER), :65 0
public static final String BOGOSORTER = "bogosorter"; :100 0
grep -rn 'BOGOSORTER|BOGO_SORT|bogosorter' src/main/ | grep -v 'ModularUI.java:32\|ModularUI.java:100'
  → 仅 ModularUI.java:65(枚举声明自身)

即 Bogo Sorter 集成已被移除但残留了常量,不算作活跃集成。

❌ ModularUI:1.3.4 依赖声明了但代码里 0 引用

dependencies.gradle:48 声明 compileOnlyApi("com.github.GTNewHorizons:ModularUI:1.3.4:dev"), 但源码中没有任何来自原版 modularui 包的 import:

grep -rhoE '^import (static )?[a-z][a-zA-Z0-9_.]*\.[A-Z][a-zA-Z0-9_]*' --include=*.java src/main/java \
  | grep -vE 'import (static )?(com\.cleanroommc|com\.ezylang|net\.|cpw\.|org\.|java|javax|com\.google|com\.mitchej123|baubles|lwjgl|it\.|io\.|lombok)'
  → 仅 lombok.*(evalex 使用)与 codechicken.nei.*

与原版 ModularUI 的兼容只存在于资源层,不在 Java 层:

兼容面 位置 说明
主题索引 assets/modularui/themes.json 3 个主题名 + 1 个 screens 映射,让原版 ModularUI 也能读到
语言文件 assets/modularui/lang/en_us.lang 15 条 modularui.* 前缀的 key(旧域、小写 _us)

注意这两个文件放在旧资源域 modularui 而非 modularui2。 这对 MUI2 自身不是必需的——AssetHelper.findAssets(String) (utils/AssetHelper.java:31-37)会遍历所有资源域。

相关条目