背包染色(自由重组)
[!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_* 开关 |
是 | 否 |
| 末位背包 | 不涉及 | 显式拒绝 |
静态配方负责「从原料造出新包」,本配方负责「就地改色」。
相关条目
- 背包 - 被染色的目标物品
- 背包染色配方 - 48 个固定形状配方
- Backpack 配置 - 本配方不受任何开关影响