背包升级配方

[!INFO] 注册真源:RecipeHelper.registerRecipes() 末尾 GameRegistry.addRecipe(new RecipeEnhanceBackpack()) 实现类:de.eydamos.backpack.recipes.RecipeEnhanceBackpack

基本信息

RecipeEnhanceBackpack 是一条全 9 格必须填满的 IRecipe(getRecipeSize() 返回 9), 把任意背包的 metadata 整体 +100,即 tier 升一级。

属性 值
注册条件 !ConfigurationBackpack.DISABLE_BIG_BACKPACKS
配方尺寸 9(9 格必须全部非空)
结果 中心格背包 getItemDamage() + 100

匹配逻辑(RecipeEnhanceBackpack.matches)

if (craftingGridInventory.getSizeInventory() < 9) { return false; }
for (int i = 0; i < craftingGridInventory.getSizeInventory(); i++) {
    slotStack = craftingGridInventory.getStackInSlot(i);
    if (slotStack != null) {
        if (i == 4) {                              // 中心 = 背包
            if (!(slotStack.getItem() instanceof ItemBackpackBase)) return false;
            if (slotStack.getItemDamage() / 100 > 1) return false;   // 不得超过 tier 1
            backpack = slotStack;
        } else {                                   // 其余 8 格 = 鞣制皮革
            if (!(slotStack.getItem() instanceof ItemLeather)) return false;
            if (slotStack.getItem() != ItemsBackpack.tannedLeather) return false;
        }
    } else { return false; }                       // 空格直接失败
}

三个要点:

  1. 9 格全满,任一格为空立即 return false,不支持「少放几个皮革」。
  2. 中心是第 5 格(i == 4),按 0-based 索引即 3×3 网格正中心。
  3. tier 上限为 1:getItemDamage() / 100 > 1 即拒绝,即 tier 2 无法再升级。 末位背包 31999 / 100 == 319 > 1,因此不能被升级。

升级链

源 metadata → 目标 metadata 结果槽位
0..16(普通/染色) +100 100..116(中级) backpackSlotsM(默认 36)
17(工作台包) +100 117 0(损坏)
100..116(中级/染色) +100 200..216(大级) backpackSlotsL(默认 54)
217(硬化工作台包) — 拒绝 217/100 == 2 > 1,超出 tier 上限
tier 2(200+) — 拒绝 已是最高级
31999(末位) — 拒绝 31999/100 == 319 > 1,末位包不可升级

⚠️ 工作台背包走这条配方会损坏,详见 工作台背包 的源码缺陷一节: getSize 缺少 tier == 1 分支,117 落到末尾 return 0。

因此普通工作台背包(17)一旦被升级成 117(0 格)就卡死了: 117/100 == 1 未超上限,可以继续升到 217(18 格)恢复,但中间这一级是坏的。

⚠️ 配方结果复用同一 ItemStack 引用

matches 直接把玩家放进合成栏的背包 copy() 后写回:

result = backpack.copy();
result.setItemDamage(result.getItemDamage() + 100);

由于 ItemBackpack 的槽位数据存在 NBT 里(UUID + 容器), 升级前后 UUID 不变,即升级不会清空背包内物品,只是容量档位变化。 玩家已存超过目标容量的物品不会因升级而丢失,InventoryBackpack 按新尺寸重新分配数组。

与 BIG_BY_UPGRADE_ONLY 的关系

配置 bigByUpgradeOnly = true 时:

  • 环绕升级配方仍会注册(其条件只有 !DISABLE_BIG_BACKPACKS);
  • 但 metadata 200 及 200 + i 的直制配方被 !BIG_BY_UPGRADE_ONLY 跳过。

即「只能靠升级得到大背包」,强制所有大背包携带原有 NBT 身份。

相关条目