高级容器界面
[!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 类中也不存在该常量。
任何「背包可作为容器增强器」的说法都与现行源码不符。