背包升级配方
[!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; } // 空格直接失败
}
三个要点:
- 9 格全满,任一格为空立即
return false,不支持「少放几个皮革」。 - 中心是第 5 格(
i == 4),按 0-based 索引即 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 身份。
相关条目
- 背包 - 目标物品及其 metadata 编码
- 鞣制皮革 - 唯一的升级材料
- 工作台背包 - 升级后变 0 格的受影响物品
- Backpack 配置 -
bigByUpgradeOnly/disableBigBackpacks