高级容器界面

[!INFO] GUI 实现:de.eydamos.backpack.gui.*;框架:de.eydamos.guiadvanced.*(仓库自带,第二个包根) 工厂:de.eydamos.backpack.factory.*

基本信息

本模组不注册任何方块或 TileEntity,所有界面都由 de.eydamos.guiadvanced 这套自带的通用 GUI 框架渲染。 该框架提供 Window / ContainerWindow / AbstractGui / AbstractGuiPart 以及 form.Button、form.IconButton、form.Label、form.Textbox、 subpart.GuiSlot、subpart.Icon、subpart.ProgressBar 等控件。

界面实例化统一走 factory 包的 AbstractFactory<S extends AbstractSave> 子类。

四个工厂与对应界面

工厂类 容器 GUI 类 打开场景
FactoryBackpack ContainerAdvanced GuiAdvanced 通用入口,Backpack.instance.openGui
FactoryBackpackNormal 自建 GuiBackpack 普通背包右键打开
FactoryWorkbenchBackpack ContainerWorkbenchBackpack GuiWorkbenchBackpack 工作台背包
FactoryPersonalSlot ContainerPersonalSlot GuiPersonalSlot 潜行 / 快捷键
FactoryConfigurationGui — GuiConfiguration guiFactory 配置界面

FactoryBackpack.getContainer 用 lambda 延迟创建 GUI:

default -> new GuiAdvanced(getContainer(save, inventories, entityPlayer))

FactoryBackpack 的 server/client 分流

其它工厂都在 getContainer 里按侧分支,例如 FactoryPersonalSlot:

if (BackpackUtil.isServerSide()) {
    inventorySlot = new InventoryBackpackSlot(player);
} else {
    inventorySlot = new InventoryBasic(Localizations.INVENTORY_PERSONAL, false, 1);
}

服务端用真实的 InventoryBackpackSlot(读 PlayerSave), 客户端用只有 1 格的 InventoryBasic 桩对象 —— 客户端不持有真实存档, 渲染布局即可。

工作台背包的机器部件

de.eydamos.guiadvanced.part 下有 6 个「机器视图」部件, 把原版容器界面嵌进通用框架:

部件 对应原版容器
part.Furnace 熔炉
part.BrewingStand 酿造台
part.Inventory 通用容器
part.SizedInventory 定尺寸容器
part.Workbench 工作台 3×3

这些是纯客户端视图部件,不注册任何对应的方块实体。

标签页系统

gui/tab 包提供背包 GUI 内的标签切换:

类 作用
AbstractInventoryTab 标签基类
InventoryTabVanilla 原版容器标签
InventoryTabBackpack 背包标签

由 handler/GuiInventoryTabHandler 在 MinecraftForge.EVENT_BUS 上 (ClientProxy.registerHandlers)驱动,翻页动作最终经 消息协议 的 MessageGuiCommand (Constants.GuiCommands.PREV / NEXT,值 3 / 4)传到服务端。

重命名界面

潜行右键背包(非末位)时打开 GuiBackpackRename (GuiHelper.displayRenameGui() → Minecraft.getMinecraft().displayGuiScreen(...)), 客户端单屏界面,改名结果通过 MessageRenameBackpack(判别号 0)提交给服务端。

⚠️ onItemUse 整段被注释(ItemBackpackBase:80-101)

ItemBackpackBase.onItemUse 的方法体全部是注释,实际只 return false:

/* TileEntity te = ... if(te instanceof TileEntityChest) ... 
   if(te.getClass().getSimpleName().equals("TileEntityDirtChest")) { ... }
   //player.openGui(Backpack.instance, Constants.GUI_ID_COMBINED, worldObj, x, y, z); */
return false;

这段死代码曾打算让背包右键打开旁边的箱子/熔炉/漏斗等容器(还列了 Irons’ Spells 的 9 种宝箱类名),但从未启用。

因此本模组当前不能用背包右键打开箱子,注释里出现的 Constants.GUI_ID_COMBINED 在 Constants 类中也不存在该常量。 任何「背包可作为容器增强器」的说法都与现行源码不符。

相关条目