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/sync 11 个
  • GUI 工厂 - GuiFactories 把界面挂到方块/物品/实体上的 6 个入口

控件

布局

  • 布局容器 - Flow / Row / Column / Grid 与 7 个静态构造工具
  • 尺寸计算 - sizer/ 12 个类与 Unit 的 4 状态 / 2 单位制

界面

主题

网络

  • 网络封包 - 7 个封包、12 个 id 槽与 PacketBuffer 的 ASM 改写
  • 同步处理器 - value/sync/ 36 个类与 SyncHandlers 9 个工厂

设定

  • 配置项 - 12 个配置字段、11 个存活、1 个死配置

兼容

绘制