自定义配方:有序、无序,以及用标签代替逐一列出每种木材
一个无法合成的有序配方,通常是 key 写错了。以下是 JSON 写法、游戏会自动从 pattern 中裁掉的内容、能把十三个配方合并成一个的标签技巧,以及测试方法,配方图案里空白行和列会被自动裁掉,但每行字符长度必须一致,否则配方无效。
配方是数据包文件里最容易写的之一,也是最容易出细微错误的之一,因为坏掉的配方会静默失败——合成格子里什么都不会发生。
有序配方
{
"type": "minecraft:crafting_shaped",
"pattern": [ "SSS", "S S", "SSS" ],
"key": { "S": "minecraft:stone" },
"result": { "id": "minecraft:furnace", "count": 1 }
}
导致大多数失败的三条规则:
pattern中的每个字符都必须存在于key中,空格除外,空格表示留空。- pattern 是相对的,不是绝对的。 游戏会裁掉边缘的空行和空列,所以一个 2×2 的配方用空格补成 3×3,在合成格里任何位置都能合成——不过写成两行两列更清晰。
- 每行长度必须相同。
["SS", "S"]是无效的。
无序配方
{
"type": "minecraft:crafting_shapeless",
"ingredients": ["minecraft:stone", "minecraft:coal"],
"result": { "id": "minecraft:torch", "count": 4 }
}
顺序无关紧要。重复物品必须各列一次——两个煤炭就要写两条。
标签把一整个家族合并成一个配方
不用为十三种木板各写一个配方:
"key": { "P": "#minecraft:planks" }
# 表示物品标签。#minecraft:planks、#minecraft:logs、#minecraft:wool、#minecraft:stone_crafting_materials 等几十个标签已经存在。定义自己的标签只需一个文件:
data/<namespace>/tags/item/my_metals.json
{ "values": ["minecraft:iron_ingot", "minecraft:gold_ingot"] }
注意 tags/item/——单数是 item,复数是 tags。这个不一致是真实存在的。
带组件的产物
"result": {
"id": "minecraft:diamond_sword",
"count": 1,
"components": { "minecraft:custom_name": "Excalibur", "minecraft:enchantments": { "sharpness": 5 } }
}
这就是不用模组也能让自定义物品可合成的方法。
其他配方类型
crafting_shaped 和 crafting_shapeless 只是众多类型中的两个。还可用的有:smelting、blasting、smoking、campfire_cooking、stonecutting、smithing_transform 和 smithing_trim。烹饪类需要 cookingtime 和 experience;切石需要一个原料和一个数量。
测试
/reload 然后试试合成格子。如果什么都没发生:
- 在
/reload之后检查游戏日志(latest.log)——格式错误的 JSON 会报在那里,而不是聊天栏。 /recipe give @s <namespace>:<recipe>——如果配方 id 写错了,这条命令会报错,说明文件根本没被读取。- 配方解锁和配方存在是两回事。即使一个配方从未出现在配方书中,它也能在合成格里正常工作。
用 数据包 JSON 构建器 来构建配方、谓词和套件 JSON,并检查其中的 key 和标签。