个人槽界面

[!INFO] 实现类:de.eydamos.backpack.gui.GuiPersonalSlot / de.eydamos.backpack.factory.FactoryPersonalSlot 容器:de.eydamos.backpack.inventory.container.ContainerPersonalSlot

基本信息

「额外穿戴槽」界面 —— 玩家把一个背包放进专属的额外槽位, 死亡不掉落、且可被快捷键直接打开。

属性 值
打开方式 潜行 + 个人背包快捷键,或潜行右键背包
常量 Constants.Guis.OPEN_PERSONAL_SLOT = 1
服务端容器 InventoryBackpackSlot(读 PlayerSave)
客户端容器 InventoryBasic(..., false, 1) 桩,仅 1 格

server/client 分流

FactoryPersonalSlot.getContainer 显式分侧:

if (BackpackUtil.isServerSide()) {
    inventorySlot = new InventoryBackpackSlot(player);              // 真实存档
} else {
    inventorySlot = new InventoryBasic(Localizations.INVENTORY_PERSONAL, false, 1);  // 1 格桩
}
InventoryPickup inventoryPickup = new InventoryPickup();
ContainerAdvanced container = new ContainerPersonalSlot(inventorySlot, inventoryPickup);

客户端的 InventoryBasic 只建 1 格,仅用于让 GuiSlot 算出正确的 槽位坐标 —— 真实数据永远只在服务端。

InventoryPickup 是界面上那块「放入的物品」区域, 与 个人背包 的主容器分离。

槽位专用类型

inventory/slot 包提供 4 种槽位限制:

槽位类 作用
SlotBackpack 通用背包槽
SlotBackpackOnly 只接受背包物品(本界面用)
SlotCraftingAdvanced 工作台合成结果槽
SlotPhantom 幽灵槽(只显示不扣除)

个人槽界面用 SlotBackpackOnly 保证只有背包类物品能放入, 普通物品会被拒绝。

死亡掉落处理

EventHandlerBackpack 处理玩家死亡事件时的个人背包取舍:

  • 若背包留在穿戴槽中(受配置控制),则不加入掉落列表, PlayerSave 继续持有它;
  • 否则手动 event.drops.add(new EntityItem(...)) 把背包作为掉落物实体 丢到玩家位置,并 playerSave.setPersonalBackpack(null) 清空存档引用。
event.drops.add(new EntityItem(entityPlayer.worldObj,
        entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ, backpack));
playerSave.setPersonalBackpack(null);

allowSoulbound 配置(见 Backpack 配置) 控制带灵魂绑定附魔的背包是否也留在槽中不掉落。

BackpackUtil.pickupItem

BackpackUtil.pickupItem 会在玩家捡起背包时尝试放回个人槽:

PlayerSave playerSave = new PlayerSave(entityPlayer);
ItemStack backpack = playerSave.getPersonalBackpack();
if (backpack == null) { ... }

即拾取到的背包若与玩家个人存档兼容,会被优先收进额外槽而非占用背包栏。

独立存档类

本界面读写的是 saves/PlayerSave(按玩家 UUID 命名), 与 背包 使用的 saves/BackpackSave(按背包 UUID 命名) 是两套独立存档。saves/AbstractSave 是二者的公共基类。

相关条目