ModularUI2 GUI 工厂(GuiFactories / UIFactory)
基本信息
| 属性 | 值 |
|---|---|
| 入口类 | com.cleanroommc.modularui.factory.GuiFactories |
| 文件 | factory/GuiFactories.java(17 个类在 factory/ 包) |
| 初始化时机 | CommonProxy.preInit() 调用 GuiFactories.init()(CommonProxy.java:53) |
| 事件总线注册 | GuiManager 注册到 FML 与 Forge 两条总线(CommonProxy.java:39-40,两处各 new 一个实例) |
| 接口 | com.cleanroommc.modularui.api.UIFactory |
这是其他 mod 把 ModularUI2 界面挂到自己的内容上的唯一官方入口。
功能
六个工厂入口
GuiFactories 共暴露 8 个 public static 方法(factory/GuiFactories.java:11-41),
其中 6 个是工厂,其余 2 个是内部工具:
| 方法 | 行 | 工厂类 | 用途 |
|---|---|---|---|
tileEntity() |
:11 |
TileEntityGuiFactory |
给 TileEntity 开界面 |
sidedTileEntity() |
:15 |
SidedTileEntityGuiFactory |
按方块朝向选择不同界面 |
entity() |
:19 |
EntityGuiFactory |
给 Entity 开界面 |
item() |
:24 |
ItemGuiFactory |
右键物品开界面 |
playerInventory() |
:28 |
PlayerInventoryGuiFactory |
打开玩家背包界面(含 Baubles 扩展槽,见 ClientProxy.java:186-189) |
createSimple(String name, IGuiHolder<GuiData>) |
:32 |
SimpleGuiFactory |
自由界面,holder 直接给出 |
createSimple(String name, Supplier<IGuiHolder<GuiData>>) |
:36 |
SimpleGuiFactory |
同上,holder 惰性求值 |
init() |
:41 |
— | 内部初始化,由 CommonProxy 调用 |
IGuiHolder<GuiData> 定义在 api/IGuiHolder.java;GuiData 及其子类
(EntityGuiData、ItemStackGuiData、PlayerInventoryGuiData、PosGuiData、SidedPosGuiData)
构成打开界面时传给面板的上下文数据。
抽象基类
factory/AbstractUIFactory.java 提供公共逻辑;ClientGUI.java 负责客户端侧调度。
factory/inventory/ 另有 5 个类定义「物品栏种类」:
Inventory、InventoryType、InventoryTypes、InventoryVisitor、ItemHandler。
InventoryTypes.init() 由 CommonProxy.java:54 调用,InventoryTypes.BAUBLES 供
playerInventory() 遍历扩展饰品栏。
打开界面的实际链路
服务器:FML 中间件事件 → GuiManager(CommonProxy.java:39-40 注册)
→ 命中某个 AbstractUIFactory
→ 封包 OpenGuiPacket(网络包,见「网络封包」)
客户端:ClientScreenHandler(ClientProxy.java:66-69 注册到两条总线)
→ ModularScreen / ModularContainer
OpenGuiPacket、ReopenGuiPacket、CloseGuiPacket、CloseAllGuiPacket 四个封包
在 NetworkHandler.init() 中以 registerBoth 注册(network/NetworkHandler.java:31-34)。
交互
| 触发 | 行为 |
|---|---|
| 玩家右键方块 / 物品 / 实体 | 由对应工厂判定后打开界面 |
| 服务端每 tick | CommonProxy.onTick 监听 TickEvent.PlayerTickEvent,若容器是 ModularContainer 则调 container.onUpdate()(CommonProxy.java:68-73) |
| 玩家登出 | onPlayerLeave 事件清空该玩家的同步状态(CommonProxy.java:75-80) |
| 客户端世界卸载 | ClientProxy.onUnloadWorld 同样清理(ClientProxy.java:196-206) |
相关条目
- 网络封包 -
OpenGuiPacket等 7 个封包的注册细节 - 界面与面板 -
ModularScreen/ModularPanel的结构 - Mixin 与底层补丁 - 打开界面前依赖的
GuiScreen/GuiContainer补丁