第三方集成与条件加载
基本信息
| 属性 | 值 |
|---|---|
| 检测入口 | 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)会遍历所有资源域。
相关条目
- Mixin 与底层补丁 - 条件 Mixin(Thaumcraft / NEI)与 Salis Arcana 冲突回避
- GUI 工厂 -
playerInventory()的 Baubles 分支 - 部件主题 - 主题索引的 JSON 格式