背包
[!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):
- 栈无 NBT 时先
onCreated补写 UUID(new BackpackSave(itemStack, true))。 - 客户端:潜行且非末位背包 → 打开重命名 GUI;随后直接返回,不开容器。
- 服务端:非潜行且
OPEN_ONLY_PERSONAL_BACKPACK == false时打开背包 GUI。 该配置为true时只能通过穿戴槽 / 快捷键打开。
依赖与联动
- 附魔联动:
isBookEnchantable委托给EnchUtils.isSoulBook,使背包可被 EnderIO 灵魂绑定附魔。 - 死亡掉落:
allowSoulbound配置(默认 true)控制带灵魂绑定的背包是否留在背包槽。 - NEI:
OverlayHandlerBackpack仅为工作台背包注册叠加显示,不覆盖本物品。
相关条目
- 工作台背包 - 同属
ItemBackpackBase的第二个物品 - 背包染色配方 - 51 个普通变体的合成路径
- 背包升级配方 - 环绕式 tier+1 与染色升级
- Backpack 配置 - 槽位数、禁用开关等全部服务端配置