配方系统
本页面镜像自 BedrockWiki
根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。
配方系统用于处理多种物品转换逻辑,包括工作台、熔炉、营火和酿造台的合成流程。
TIP
铁砧交互通过物品定义实现,而非配方文件。织布机交互当前暂不可用。
使用配方功能无需开启任何实验性选项。
注册方式
所有配方文件需存放在行为包根目录的recipes
文件夹中,支持任意子目录结构和命名方式。
以下示例展示了本文档采用的目录结构:
例如,可通过以下有序配方制作"寒钢剑":
{
"format_version": "1.17.41",
"minecraft:recipe_shaped": {
"description": {
"identifier": "wiki:cold_steel_sword"
},
"tags": ["crafting_table", "altar"],
"pattern": [
"X",
"X",
"I"
],
"key": {
"X": "wiki:cold_steel",
"I": "minecraft:stick"
},
"unlock": [
{
"item": "wiki:cold_steel"
},
{
"item": "minecraft:wool",
"data": 3
},
{
"context": "PlayerInWater"
}
],
"result": "wiki:cold_steel_sword"
}
}
通用属性与结构
格式版本
格式版本用于标识配方文件的架构版本,通过顶层"format_version"
属性指定。
"format_version": "1.17.41"
实际使用中格式版本可设为任意值或省略。
WARNING
强烈建议仍保留格式版本,并选择与当前Minecraft版本匹配的值以保证未来兼容性。推荐使用最新正式版或上一个主版本号。
描述信息
"description"
对象是所有配方类型的必填项,用于声明配方唯一标识符。
"description": {
"identifier": "wiki:cold_steel_sword"
}
其中必填的"identifier"
属性用于在世界中所有行为包范围内唯一标识配方。单个包内不允许存在重复的完整配方ID。
WARNING
强烈建议使用命名空间。命名空间是附加组件领域的通用规范,有助于将配方逻辑归属到特定行为包,减少多包混用时发生冲突的可能性。
标签系统
通过必填的"tags"
数组属性将配方与合成界面关联,该属性需置于任何配方类型中。这些标签会使配方在具有minecraft:crafting_table
组件的不同方块间共享。若配方不包含crafting_table
标签或任何原版标签,但包含自定义方块的标签,则该配方仅适用于该自定义方块而非工作台/切石机等。必须提供至少一个标签。
"tags": ["crafting_table", "altar"]
原版界面为各类配方类型开放了对应标签:
合成类:
crafting_table
stonecutter
smithing_table
WARNING
注意:若要制作锻造台配方,第二个槽位必须使用<命名空间>:netherite_ingot
,使用其他标识符将无效。此特性在1.18.30后已失效。
熔炼类:
furnace
blast_furnace
smoker
campfire
soul_campfire
酿造类:
brewing_stand
教育版:
material_reducer
TIP
此外,自定义工作台可声明自定义标签供合成配方使用。目前不支持自定义熔炉和酿造台。
TIP
要禁用配方(常用于覆盖已有配方),可将标签数组设为[""]
。
配方解锁
Minecraft 1.20.30新增了配方解锁功能。要使用此功能,需确保manifest.json
中的min_engine_version
至少为1.20.11(推荐1.20.30),并在配方中添加unlock
数组:
"unlock": [
{
"item": "wiki:cold_steel" //解锁配方所需物品
},
{
"item": "minecraft:wool", //解锁配方所需物品
"data": 3
},
{
"context": "PlayerInWater" //解锁配方所需事件
}
]
数组中每个对象的"item"
字段表示玩家背包中需要存在的物品(支持数据值)。"context"
字段表示触发解锁的事件,目前仅知"PlayerInWater"
会在玩家入水时解锁配方。
物品描述符
配方系统中涉及多种物品引用方式,支持两种格式:字符串引用和物品对象。两种格式均可处理数据值,但只有物品对象能指定数量(用于配方输出)。对于配方输入,若未指定数据值,则该标识符下任意数据值的物品都可用作输入。输出物品的数据值默认为0
(若未显式指定)。不支持通过物品标签选择配方输入。
字符串引用
基本格式为物品的命名空间加标识符组合:
"minecraft:planks"
字符串引用还支持通过后缀指定数据值:
"minecraft:planks:2"
物品对象
物品对象提供了更明确的物品引用结构。
{
"item": "minecraft:planks",
"data": 2,
"count": 3
}
必填的"item"
属性功能同字符串引用。虽然提供了独立的数据字段,但"item"
属性仍支持数据值后缀格式。不同于后缀形式,"data"
可接受Molang表达式(该表达式仅在世界加载时计算一次,而非每次合成时计算)。无法通过变量在配方属性间传递数据。目前已知"data"
属性中唯一可用的查询是q.get_actor_info_id
,用于通过实体标识符获取其刷怪蛋ID:
{
"item": "minecraft:spawn_egg",
"data": "q.get_actor_info_id('minecraft:chicken')"
}
可选的整数"count"
属性用于堆叠物品,默认为1
。当前仅在合成与熔炼配方输出及无序配方原料中有效,其他场景下会被忽略。
注意
若对不可堆叠物品设置数量大于1
,将抛出错误。无法强制单次返回多个合成输出(如无序配方或酿造混合产物)。
WARNING
尽管与交易表物品描述符相似,配方物品描述符不能使用函数。
特殊标识符
配方系统额外支持描述基础药水的特殊标识符。
"minecraft:potion_type:strength"
这些标识符仅支持字符串格式,不支持对象格式,且无喷溅/滞留药水变种。所有此类标识符遵循格式:minecraft:potion_type:药水效果
,其中药水效果
可为以下之一:
water
(水)awkward
(粗制的)mundane
(平凡的)thick
(浓稠的)healing
(治疗)regeneration
(再生)swiftness
(迅捷)strength
(力量)harming
(伤害)poison
(剧毒)slowness
(缓慢)weakness
(虚弱)water_breathing
(水下呼吸)fire_resistance
(抗火)nightvision
(夜视)invisibility
(隐身)leaping
(跳跃)slow_falling
(缓降)turtle_master
(神龟)wither
(衰变)
支持添加long_
和strong_
前缀表示强化药水,如minecraft:potion_type:strong_poison
。
合成系统
合成操作通过合成网格即时转换物品。支持两种配方类型:无序配方(原料可任意排列)和有序配方(需严格排列原料)。 合成配方同时支持工作台和切石机:
"tags": ["crafting_table", "stonecutter"]
"crafting_table"
同时适用于原版工作台和玩家物品栏中的2×2合成网格,当前无法单独启用其中一种。合成配方还支持自定义标签,可将配方关联到自定义方块提供的合成网格。
无序配方
无序配方将原料集合与单个输出简单绑定。
{
"format_version": "1.17.41",
"minecraft:recipe_shapeless": {
"description": {
"identifier": "wiki:brass_door_knob"
},
"group": "handles",
"tags": ["construction_bench"],
"ingredients": [
"wiki:brass",
{
"item": "wiki:screw",
"data": 2
}
],
"unlock": [
{
"item": "wiki:cold_steel"
},
{
"item": "minecraft:wool",
"data": 3
},
{
"context": "PlayerInWater"
}
],
"result": {
"item": "wiki:door_knob",
"data": 3
}
}
}
原料配置
必填的"ingredients"
数组列出了合成所需的原料物品。
"ingredients": [
"wiki:brass",
{
"item": "wiki:screw",
"data": 2
}
]
每项均为物品描述符。若原料设置了数量,该数量必须通过多个合成网格槽位实现(单个槽位堆叠物品无法用于合成)。当所需物品存在但原料数量超过当前合成界面容量时,配方书会自动将该配方标记为不可用。
无序配方输出
通过必填的"result"
属性声明输出,可以是物品描述符或单物品描述符的数组。
"result": {
"item": "wiki:door_knob",
"data": 3
}
有序配方
有序配方要求原料必须按特定图案排列。
{
"format_version": "1.17.41",
"minecraft:recipe_shaped": {
"description": {
"identifier": "wiki:covered_arch"
},
"tags": ["crafting_table"],
"pattern": [
"SSS",
"I I",
"I I"
],
"key": {
"S": "wiki:cloth",
"I": "wiki:support"
},
"unlock": [
{
"item": "wiki:cold_steel"
},
{
"item": "minecraft:wool",
"data": 3
},
{
"context": "PlayerInWater"
}
],
"result": [
{
"item": "wiki:covered_arch",
"count": 3
},
"wiki:crafting_scrap"
]
}
}
图案定义
必填的"pattern"
数组属性用于建立配方图案。
"pattern": [
"SSS",
"I I",
"I I"
]
数组每项代表合成网格的一行,字符串每个字符代表该行的槽位。默认空格表示该槽位需留空。
字符作为物品的视觉简写,每个独特字符需与键定义匹配以指定对应槽位的物品。
TIP
若图案全由空格组成,任何能容纳该图案尺寸的空合成界面都会持续匹配该配方。玩家可无限获取输出物品,包括通过Shift键一次性填满背包。
行标准化
图案网格最大为3×3,可更小。若字符串长度不一致,Minecraft会自动补全较短字符串(用空格填充空缺槽位)。以下两组定义等效:
"pattern": [
"MA",
"IFI",
"M"
]
"pattern": [
"MA ",
"IFI",
"M "
]
注意
当前所有合成网格(包括自定义方块配置的)最大不超过3×3。若图案超出当前合成界面容量,配方书会自动将其标记为不可用。
网格自由度
空格不会自动填充3×3网格的剩余槽位。若提供的图案小于当前合成网格,只要保持结构和内容,图案可在网格任意位置使用。例如以下图案在工作台上的表现:
"pattern": [
"O"
"OO"
]
"L"形图案不限左上角位置,在3×3网格中可能配置如下:
要限制位置需显式使用空格强制某些槽位留空。以下图案仅能在网格左上角使用:
"pattern": [
"O "
"OO "
" "
]
对称性
所有有序配方默认具有水平对称性:
"pattern": [
"Z "
" Z "
" Z"
]
该配方也可被玩家视为以下形式使用:
"pattern": [
" Z"
" Z "
"Z "
]
键定义
通过必填的"key"
对象属性将图案字符映射到物品描述符。
"key": {
"S": "wiki:cloth",
"I": "wiki:support"
}
图案中每个字符都需在此定义。键名区分大小写。若物品支持多数据值且未指定数据值,该标识符下任意数据值的物品都可用于该键。物品描述符中的"count"
属性会被忽略并视为1
;合成网格槽位中的堆叠物品每次仅消耗一个。
注意
可使用U+0020
到U+07FF
间的任意Unicode字符作为键名。若键名超过一个字符,仅首字符有效。由于空格默认表示网格空槽且无法重新定义,不建议将其作为键。
WARNING
若图案字符未在键映射中定义,将被视为空格(空槽位)。
配方解锁
Minecraft 1.20.30新增配方解锁功能。要使用此功能,需确保manifest.json
中的min_engine_version
至少为1.20.11(推荐1.20.30),并在配方中添加unlock
数组:
"unlock": [
{
"item": "wiki:cold_steel" //解锁配方所需物品
},
{
"item": "minecraft:wool", //解锁配方所需物品
"data": 3
},
{
"context": "PlayerInWater" //解锁配方所需事件
}
]
数组中每个对象的"item"
字段表示玩家背包中需要存在的物品。"context"
字段表示触发解锁的事件,目前仅知"PlayerInWater"
会在玩家入水时解锁配方。
有序配方输出
有序配方输出行为与无序配方相似。不同于无序配方的是,有序配方的输出数组可包含多个物品描述符。
"result": [
{
"item": "wiki:covered_arch",
"count": 3
},
"wiki:crafting_scrap"
]
数组首项将作为合成方块的可见输出,其余项会在玩家取走可见输出后自动放入背包。目前似乎没有对单次合成返回物品数量的限制。
注意
无法放入背包的物品会按从左到右、从上到下的顺序放回合成输入槽。若仍无法容纳,则会像玩家执行"丢弃物品"操作一样抛出。
配方书
配方书自动索引并显示可用配方,智能考虑无序配方的原料数量或有序配方的图案限制。当多个配方指向相同输出时,配方书使用独特优先级系统。
比较两个无序配方时,按以下顺序确定优先级:
- 第一个列出原料的较低数量
- 更小的优先级值
- 字典序较小的标识符字符串
对于有序配方,字典序较小的标识符始终优先。
比较有序与无序配方时,使用无序配方规则,但有序配方的原料数量计算方式不同(具体机制未知)。
分组系统
本节为信息性说明。原版定义中的合成配方包含可选的"group"
字符串属性。
"group": "slingshots"
目前未知该属性的具体作用(推测与配方书相关)。使用自定义分组或复用原版分组均未观察到实际效果。
优先级
合成配方支持额外的"priority"
属性处理输入冲突,主要在优先级排序时作为决胜条件。
"priority": 2
数值较小的配方优先级更高(如优先级0
优于1
)。支持负值,未提供时默认为0
。
加热系统
熔炉配方通过热源随时间转换物品。虽然名称局限,实际适用于所有热源界面(包括营火)。
{
"format_version": "1.17.41",
"minecraft:recipe_furnace": {
"description": {
"identifier": "wiki:magic_ash"
},
"tags": ["soul_campfire"],
"input": "wiki:bone_fragments",
"output": {
"item": "wiki:magic_ash",
"count": 4
}
}
}
支持所有原版加热方块的标签:
"tags": ["furnace", "blast_furnace", "smoker", "campfire", "soul_campfire"]
加热转换
熔炉配方将单个输入物品描述符绑定到单个输出物品描述符。
"input": "wiki:bone_fragments"
"output": {
"item": "wiki:magic_ash",
"count": 4
}
输入中的数量值会被忽略。无法修改经验返还和燃料设定,加热时间由使用的方块决定且不可更改。
酿造系统
酿造配方通过催化剂物品转换另一物品。支持两种类型:酿造混合(不传递输入输出数据)和酿造容器(传递数据)。
仅一种界面支持酿造配方:
"tags": ["brewing_stand"]
酿造转换
酿造转换类似加热转换,需要输入和输出各一个物品描述符。此外还需"reagent"
属性作为催化剂(也仅接受单个物品描述符)。
"input": "wiki:flask",
"reagent": "wiki:jade",
"output": "wiki:insanity_resistance"
这些属性中的数量值会被忽略,物品每次转换一个。
WARNING
若酿造配方的输入物品可堆叠,将消耗整个堆叠。目前无法避免此行为。
酿造完成后催化剂被消耗,输出物品直接替换输入物品。
WARNING
当前无论是否指定数据值,产出物品的堆叠都存在bug,无法与相同标识符和数据值的物品堆叠。
酿造混合
酿造混合是简单的酿造配方,理论上设计用于隔离输入输出的数据值。
{
"format_version": "1.17.41",
"minecraft:recipe_brewing_mix": {
"description": {
"identifier": "wiki:paralysis_brew"
},
"tags": ["brewing_stand"],
"input": "wiki:amberglass_flask",
"reagent": "wiki:viporfly_poison",
"output": "wiki:paralysis_brew"
}
}
WARNING
不幸的是,酿造混合配方的数据值设定存在缺陷。
通常,若对输入指定数据值,酿造配方将完全失效。例外情况是输入为以下之一:
minecraft:potion
minecraft:splash_potion
minecraft:lingering_potion
- 药水特殊标识符
若通过"data"
属性为催化剂指定数据值,当酿造台放入该标识符物品时会触发酿造(无论数据值是否匹配)。但只有数据值正确时才会成功转换,否则看似成功实则不转换输入(但仍会消耗催化剂和部分烈焰粉燃料)。
酿造容器
酿造容器设计用于将输入数据值传递到输出。
{
"format_version": "1.17.41",
"minecraft:recipe_brewing_container": {
"description": {
"identifier": "wiki:illumination_potion"
},
"tags": ["brewing_stand"],
"input": "minecraft:potion",
"reagent": "wiki:radiant_berries",
"output": "wiki:illumination_potion"
}
}
比酿造混合更严格,仅允许以下输入类型:
minecraft:potion
minecraft:splash_potion
minecraft:lingering_potion
- 药水特殊标识符
由于数据值从输入传递到输出,"input"
和"output"
中指定的数据值会被忽略。
覆盖机制
与所有附加组件领域相同,行为包加载顺序影响游戏中选择的文件。列表中靠前的行为包会覆盖靠后的(包括原版基础包)。
要覆盖低优先级包的配方,需完全匹配配方类型和标识符。覆盖文件可任意命名存放——仅内容重要。配方不支持部分覆盖,必须完全重新定义。
WARNING
仅当配方类型完全匹配时覆盖才生效。多数情况下不匹配会导致新建配方而非覆盖。
若尝试在两种合成配方类型间转换覆盖,将抛出错误。解决方案:先复制原版定义到包中,将其"tags"
设为[""]
(禁用配方),再新建另一种类型的配方文件(使用不同标识符避免冲突)。
优先级排序
考虑覆盖机制后,若多个配方匹配输入,按以下顺序决胜: