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)

相关条目