背包

[!INFO] 注册真源:ItemsBackpack.initItems()(de.eydamos.backpack.item.ItemsBackpack:29)

基本信息

属性 值
注册调用 GameRegistry.registerItem(backpack, "backpack")
实现类 de.eydamos.backpack.item.ItemBackpack(继承 ItemBackpackBase)
最大堆叠 1(ItemBackpackBase 构造器 setMaxStackSize(1))
副类型 setHasSubtypes(true),区分靠 metadata 而非多个 Item 实例
创造标签 自定义标签 Backpacks(见 Backpacks 创造标签)

这是本模组唯一的「主体」物品,其 52 个变体全部由 metadata 编码在一个 Item 实例里。

metadata 编码规则(关键)

变体不是「注册名 + NBT」,而是把 metadata 拆成百位=tier、其余两位=颜色:

字段 取值 来源
tier damage / 100 → 0、1、2 对应 BACKPACK_TIERS = {"", "medium", "big"}
颜色 damage % 100 → 0…16 对应 BACKPACK_COLORS,索引 0 为 ""(不染色)
末位背包 ItemsBackpack.ENDERBACKPACK = 31999 独立常量,不占用 0…50 区间

因此 3 tier × 17 色 = 51 个普通变体(metadata 0…50),再加末位背包共 52 个, 与 ItemBackpack.registerIcons 中 new IIcon[52] 完全吻合。

getIconFromDamage 的实现(ItemBackpack:44)确认了这套编码:

int tier = damage / 100;
int meta = damage % 100;
if (tier > 2) { return icons[51]; }   // 末位背包
return icons[tier * 17 + meta];

BackpackUtil.getTier 对 tier 做钳制(tier < 3 ? tier : 0),所以末位包的 damage / 100 == 319 会被读成 tier 0。

⚠️ 槽位数:配置值与 tooltip 显示不一致(源码缺陷)

物品提示行里的槽位数是硬编码的(ItemBackpackBase.addInformation):

int slots = 36 + tier * 27;   // → 36 / 63 / 90

但实际生效的槽位数来自配置文件(BackpackSave.getBackpackSize):

tier 配置项 配置默认值 tooltip 显示
0 backpackSlotsS 27 36
1 backpackSlotsM 36 63
2 backpackSlotsL 54 90

即在默认配置下 tooltip 显示的槽位数全部是错的(多算了 9/27/36)。 只有当服务器把三个配置项分别设为 36/63/90 时两者才吻合。参见 Backpack 配置。

末位背包(metadata 31999)

ItemBackpackBase.getInventory 对末位包做了短路:

if (BackpackUtil.isEnderBackpack(itemStack)) {
    return entityPlayer.getInventoryEnderChest();
}

即末位背包直接复用玩家末影箱,自身不存任何独立容器。 BackpackSave 中对 meta == 99 返回 27 是历史遗留的死值,不产生任何实际容量。

右键行为

onItemRightClick(ItemBackpackBase:130):

  1. 栈无 NBT 时先 onCreated 补写 UUID(new BackpackSave(itemStack, true))。
  2. 客户端:潜行且非末位背包 → 打开重命名 GUI;随后直接返回,不开容器。
  3. 服务端:非潜行且 OPEN_ONLY_PERSONAL_BACKPACK == false 时打开背包 GUI。 该配置为 true 时只能通过穿戴槽 / 快捷键打开。

依赖与联动

  • 附魔联动:isBookEnchantable 委托给 EnchUtils.isSoulBook,使背包可被 EnderIO 灵魂绑定附魔。
  • 死亡掉落:allowSoulbound 配置(默认 true)控制带灵魂绑定的背包是否留在背包槽。
  • NEI:OverlayHandlerBackpack 仅为工作台背包注册叠加显示,不覆盖本物品。

相关条目