ModularUI2
[!INFO] Git Commit:
40fdbdabab7767999b84fda0dc5e9ff47e7edb0b| Updated: 2026-10-02
ModularUI2 是 GTNH 1.7.10 的纯 GUI 框架库,为模组提供一套「原版风格」的界面构建工具链。
按 mcmod.info 的自述(src/main/resources/mcmod.info:5):
“A GUI library to ease the process of creating vanilla style GUIs. Heavily inspired by GTCE’s ModularUI”。
它的价值不在于自己注册了什么内容,而在于它暴露给其他 mod 的扩展契约 ——
api/ 下 53 个接口(widget 17 + layout 5 + value 11 + value/sync 11 + drawable 7 + event 2)、
36 个同步处理器、13 个部件主题键、5 个布局容器、7 个网络封包。
本 wiki 的全部条目记录的都是这套 API。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| modid | modularui2 |
ModularUI.java:27(public static final String ID = "modularui2"),用于 :18 的 @Mod(modid = ModularUI.ID, …) |
| 显示名 | Modular UI 2 | gradle.properties:6(modName) |
| 包名 | com.cleanroommc.modularui |
gradle.properties:14(modGroup) |
| Minecraft | 1.7.10 | gradle.properties:24(版本闸门形态 ① 命中) |
| Forge | 10.13.4.1614 | gradle.properties:27 |
| 构建系统 | RetroFuturaGradle(com.gtnewhorizons.gtnhconvention) |
build.gradle:4、settings.gradle:5/:20 |
| 核实版本 | 2.3.91-1.7.10 |
tag,与 HEAD 同指 40fdbdab |
| 核实分支 | master(本仓唯一分支) |
git branch -a → master、origin/HEAD、origin/master |
| 源码规模 | 641 个 .java(0 .scala、0 .kt) |
find src/main/java -name '*.java' | wc -l |
| ├ 自有代码 | 509(com/cleanroommc/) |
同上 |
| └ 内嵌第三方 | 132(com/ezylang/evalex/,数学表达式求值器) |
同上 |
| 提交校验 | git cat-file -t 40fdbdab… → commit |
—— |
modid 与分类名一致(均为 modularui2),无需额外说明。
注意 assets/ 下存在两个资源域:modularui2/(主要)与 modularui/(兼容旧版 ModularUI)。
实际注册的内容(存活项)
ModularUI2 是库,默认不注册任何游戏内容。存活项逐条如下:
| 类型 | 数量 | 位置 | 是否默认开启 |
|---|---|---|---|
| 实体 | 1 | CommonProxy.java:50 EntityRegistry.registerModEntity(HoloScreenEntity.class, "modular_screen", 0, …) |
✅ 无条件 |
| 服务端指令 | 1 | CommonProxy.java:60 event.registerServerCommand(new ItemEditorGui.Command()) |
✅ 无条件 |
| 客户端指令 | 1 | ClientProxy.java:179 ClientCommandHandler.instance.registerCommand(new ThemeReloadCommand())(/reloadThemes) |
✅ 无条件 |
| 渲染处理器 | 1 | ClientProxy.java:81 RenderingRegistry.registerEntityRenderingHandler(HoloScreenEntity.class, new ScreenEntityRender()) |
✅ 无条件 |
| 网络封包 | 7 | NetworkHandler.java:26-36 |
✅ 无条件 |
| Mixin | 17 | core/mixinplugin/Mixins.java |
部分按目标 mod 条件加载 |
| ASM 变换器 | 1 | core/ModularUICore.java:37-40 |
✅ 无条件 |
| 方块 | 0 | —— | —— |
| 物品 | 0 | —— | —— |
| TileEntity | 0 | —— | —— |
| 合成配方 | 0 | —— | —— |
| 成就 / 研究 / 维度 | 0 | —— | —— |
⚠️ 唯一的方块/物品/TileEntity 注册是配置门控的
全仓 GameRegistry.registerBlock / registerItem / registerTileEntity
只出现在一处(test/TestEventHandler.java:184-189):
// TestEventHandler.java:185-188
GameRegistry.registerBlock(TestBlock.testBlock, "test_block");
GameRegistry.registerTileEntity(TestTile.class, "test_block");
GameRegistry.registerItem(TestItem.testItem, "test_item");
但它被 CommonProxy.java:45 的 if (ModularUIConfig.enableTestGuis) 包住,
而 enableTestGuis 的默认值是 ModularUI.isDevEnv(ModularUIConfig.java:51),
后者在生产环境为 false(ModularUI.java:43-44 读 fml.deobfuscatedEnvironment)。
→ 在正式整合包里,方块/物品/TileEntity 计数均为 0。
条目分布
| 维度 | 条目 | 内容 |
|---|---|---|
api/ |
3 | 扩展契约:核心接口、值与同步接口、GUI 工厂 |
widget/ |
5 | 控件:基类层级、控件总览、滚动、槽位、文本框与菜单 |
layout/ |
2 | Flow/Row/Column/Grid 与 sizer/ 尺寸数学 |
screen/ |
3 | 界面与面板、视口与绘制上下文、提示气泡 |
theme/ |
2 | 主题系统与 13 个部件主题键 |
network/ |
2 | 7 个封包与 36 个同步处理器 |
setting/ |
1 | 12 个配置字段(11 个存活 + 1 个死配置) |
compat/ |
2 | 17 个 Mixin + ASM 变换器、第三方集成 |
drawable/ |
2 | 28 个可绘制对象、富文本渲染 18 个类 |
| 合计 | 22 |
粒度选择:同族共享基类或配置的控件合并为「一页 + 变体表」——
如按钮族 6 个类合入 控件总览、同步值 20+ 个类合入
同步处理器 的类型交叉表、
13 个部件主题键合入 部件主题。
行为与扩展契约不同的(如 ModularNetwork 与 SyncHandler)则各自成页。
死代码与缺陷(均经 grep 证据核实)
| 对象 | 位置 | 证据 |
|---|---|---|
配置项 defaultScrollSpeed |
ModularUIConfig.java:13 |
全仓 0 个读取方;真实滚动速度来自 ScrollData.scrollSpeed(:60),在 ScrollArea.java:117 消费 |
配置项 replaceVanillaTooltips |
ModularUIConfig.java:58-60 |
3 行全部被注释;对应 lang 键 en_US.lang:64-65 亦被注释 |
Mods.BOGOSORTER 枚举项 |
ModularUI.java:65 |
grep 'Mods\.BOGOSORTER' → 0 命中 |
ModularUI.BOGO_SORT 常量 |
ModularUI.java:32 |
同上 → 0 命中 |
ModularUI.ModIds.BOGOSORTER |
ModularUI.java:100 |
仅被上面那个死枚举项引用 |
core/mixins/KeyBindAccess.java |
全文件 | wc -c = 0 字节;不在 Mixins 枚举中 |
ModularUI:1.3.4 依赖 |
dependencies.gradle:48 |
compileOnlyApi 声明了,但源码 0 个 import 原版 modularui 包 |
| 缩放光标纹理路径错误 | ClientProxy.java:99、:104 |
读 assets/modularui/textures/…,但该目录不存在(assets/modularui/ 只有 lang/ 与 themes.json),文件实际在 assets/modularui2/textures/gui/icons/。异常被 :110-113 的 catch (Throwable) 吞掉 → 缩放光标运行时静默失效 |
孤儿资源 test_block_2 |
assets/modularui2/blockstates/test_block_2.json、models/item/test_block_2.json |
grep 'test_block_2' src/ → 0 个 Java 引用(代码只注册 test_block) |
核实方法
- 版本闸门:形态 ①(
grep -riE 'minecraft[_.]?[Vv]ersion' gradle.properties build.gradle*)命中gradle.properties:24: minecraftVersion = 1.7.10。 形态 ②(ForgeGradle 1.2 的minecraft { }DSL 块)无命中(本项目是 RetroFuturaGradle)。 第二重独立证据:core/ModularUICore.java:17的@IFMLLoadingPlugin.MCVersion("1.7.10")。 - 提交校验:
git cat-file -t 40fdbdabab7767999b84fda0dc5e9ff47e7edb0b→commit; 且git rev-list -n1 2.3.91-1.7.10与git rev-parse HEAD相同。 - 跨版本隔离:本仓
src/main/java下只有mc1710一套,无版本分支目录; 符合 ROADMAP §0.11 对「跨版本被合并进同一分类」事故的规避要求。 - 宿主模组:一律从
dependencies.gradle/build.gradle读出,未从目录名或邻近 mod 名推断。 - 内嵌第三方:
com/ezylang/evalex/是数学表达式求值器(含自己的LICENSE), 不计入 ModularUI2 的 API 表面。
维度列表
API
- 核心接口 -
IWidget/IPositioned/IParentWidget/Interactable等 22 个接口 - 值与同步接口 -
IValue家族 11 个 +api/value/sync11 个 - GUI 工厂 -
GuiFactories把界面挂到方块/物品/实体上的 6 个入口
控件
- Widget 基类与层级 -
Widget832 行、62 个 public 成员与 4 个绘制阶段 - 控件总览 - 按钮族、文本族、滑条、列表分页的变体表
- 滚动控件 -
AbstractScrollWidget与 4 个直接子类 - 槽位控件 - 物品/流体/幻影槽与 4 个玩家子槽主题
- 文本框与菜单族 -
BaseTextFieldWidget与菜单 6 类
布局
界面
- 界面与面板 -
ModularScreen/ModularPanel/ModularContainer三层 - 视口与绘制上下文 -
ModularGuiContext与坐标变换栈 - 提示气泡 -
RichTooltip的 8 种锚定与 23 个构建器方法
主题
网络
设定
- 配置项 - 12 个配置字段、11 个存活、1 个死配置
兼容
- Mixin 与底层补丁 - 17 个 Mixin、1 个 ASM 变换器与 3 个 json 配置
- 第三方集成 - 7 个受探测 mod、NEI 8 类、配方查看器 4 接口