工作台背包

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

基本信息

属性 值
注册调用 GameRegistry.registerItem(workbenchBackpack, "workbenchbackpack")
实现类 de.eydamos.backpack.item.ItemWorkbenchBackpack
副类型数量 2(metadata 17 与 217)
副物品枚举 ItemBackpackBase.getSubItems 中显式列出这两个值

两个变体

metadata 含义 合成材料 合成台格数
17 普通工作台背包 皮革 + 工作台 9
217 硬化(tier 1)工作台背包 鞣制皮革 + 工作台 9

注意 metadata 用的是 17 而非 0:与普通背包共享 meta < 17 表示「染色槽」的 约定,工作台变体故意落在 17 这个「空档」上,使 getBackpackSize 可以先按 meta == 17 分支处理(BackpackSave.java:88)。

217 % 100 == 17、217 / 100 == 2,所以 217 是tier 2 工作台包、18 格合成槽, 不是 tier 1。两个出厂变体的槽位数与 ItemBackpackBase.addInformation 中 craftSlots = tier == 0 ? 9 : 18 的 tooltip 显示一致 —— 工作台包没有普通背包那种 tooltip/配置不一致问题。

⚠️ 源码缺陷:升级出来的 metadata 117 得到 0 格(BackpackSave.java:88-95)

getSize 对工作台分支只判 tier == 2 与 tier == 0,没有 tier == 1 分支:

int tier = damage / 100;          // 1
int meta = damage % 100;          // 17
if (tier >= 3) tier = 0;
if (meta == 99) return 27;
if (meta == 17) {
    if (tier == 2) return 18;
    if (tier == 0) return 9;
    // tier == 1 既不满足 2 也不满足 0 -> 继续往下
}
if (meta < 17) { ... }            // meta == 17,不满足
return 0;                          // -> 落到这里

metadata 117 恰好可以合成出来:工作台背包升级配方 把 17 升一级即 17 + 100 = 117(RecipeEnhanceBackpack 只要求 getItemDamage() / 100 <= 1,117 满足)。于是在默认配置下 (DISABLE_BIG_BACKPACKS == false,升级配方已注册) 把工作台背包升级一次会得到一个 0 格的损坏背包。

链条为 17(9 格) → 117(0 格) → 217(18 格), 即升级路线必须一次升两级才安全。

「智能」标记

工作台背包可被赋予 NBT 标记 Constants.NBT.INTELLIGENT(值 intelligent), 做法是把工作台背包与一本 minecraft:writable_book 放进合成栏 (见 智能工作台背包配方)。 该标记让工作台背包在打开时自动填入玩家上一次在该格位摆放的配方, 并向客户端推送 MessageRecipe 消息。

NEI 支持

ClientProxy.addNeiSupport 只为工作台背包注册叠加处理器:

registerGuiOverlayHandler.invoke(API, GuiWorkbenchBackpack.class,
        new OverlayHandlerBackpack(), "crafting");

即 NEI 集成范围仅限 crafting 配方页,非工作台容器不参与。 若 NEI 未安装,反射抛异常被 catch,仅打一条 INFO 日志并保持 ConfigurationBackpack.NEISupport == false,不影响模组运行。

合成配方

两个变体都由 RecipeHelper.registerRecipes 用 GameRegistry.addRecipe 注册, 并受 DISABLE_WORKBENCH_BACKPACKS 开关控制:

  • 17:"LLL" / "LWL" / "LLL",L = Items.leather,W = Blocks.crafting_table
  • 217:"LLL" / "LWL" / "LLL",L = ItemsBackpack.tannedLeather,W = Blocks.crafting_table

相关条目