背包染色(自由重组)

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

基本信息

这是一条形状无关(shapeless 风格)的 IRecipe:只要合成栏里 恰好一个背包 + 恰好一个染色剂,且没有第三种物品,就产出重新染色的背包。

属性 值
配方尺寸 遍历整个 getSizeInventory(),不限格数
注册条件 无条件(不受任何 DISABLE_* 开关控制)
作用对象 仅 ItemBackpack(普通背包),不含工作台背包

合法染色剂(RecipeRecolorBackpack 构造器)

allowedDyes.add(Items.dye);
allowedDyes.add(Items.leather);
allowedDyes.add(ItemsBackpack.tannedLeather);

共 3 种合法染色剂,且各自受 tier 限制:

染色剂 允许的源 tier 逻辑
minecraft:dye(任意染料) 全部 tier 无限制
minecraft:leather 仅 tier 0 tier != 0 && dye == leather → 失败
Backpack:tannedLeather 仅 tier 1 / 2 tier != 1 && tier != 2 && dye == tannedLeather → 失败

皮革与鞣制皮革的 tier 限制让染色成为降级标记: 用皮革染只能作用于普通包,用鞣制皮革染只能作用于中级/大级包。

⚠️ 末位背包不可染色

if (BackpackUtil.isEnderBackpack(slotStack) || backpack != null) {
    return false;
}

isEnderBackpack 命中(metadata 31999)立即失败, 所以 末位背包 没有任何改色途径,与 静态染色配方 的结论一致。

颜色重算(RecipeRecolorBackpack.matches 尾部)

匹配成功后,配方重算目标 metadata 而非简单加减:

int tier = backpack.getItemDamage() / 100;
int damage = (dye.getItem() instanceof ItemDye ? dye.getItemDamage() + 1 : 0) + tier * 100;
result = backpack.copy();
result.setItemDamage(damage);

注意其中的 + 1:原版染料的 metadata 是 0…15(0 = 黑), 而本模组的颜色索引 0 表示「无色」、1 才表示黑色。 +1 正是这一 0-based → 1-based 的偏移,使染料与 BACKPACK_COLORS (索引 1…16 对应黑…白)严格对齐。

染色剂不是 ItemDye 时(皮革、鞣制皮革)整项取 0, 即直接褪色为该 tier 的无色变体。这意味着:

  • 用 minecraft:dye 染色:颜色索引 = 染料 metadata + 1,tier 保持不变。
  • 用 minecraft:leather(metadata 0)染色 → tier * 100,即褪色回无色变体。
  • 用 鞣制皮革 染色同理褪色,但只对 tier 1/2 合法 —— 即「把大包降回无色大包」。

与静态染色配方的区别

静态配方(backpack-dye-recipes) 本配方
形状 必须 LLL/LDL/LLL 或 MD 任意,2 个物品即可
材料 固定皮革类 + 染料 任意合法染色剂
可覆盖已染色包 否(需先产出基础包) 是(背包 + 染料即改色)
受 DISABLE_* 开关 是 否
末位背包 不涉及 显式拒绝

静态配方负责「从原料造出新包」,本配方负责「就地改色」。

相关条目