Skip to content

配方系统

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

配方系统用于处理多种物品转换逻辑,包括工作台、熔炉、营火和酿造台的合成流程。

TIP

铁砧交互通过物品定义实现,而非配方文件。织布机交互当前暂不可用。

使用配方功能无需开启任何实验性选项。

注册方式

所有配方文件需存放在行为包根目录的recipes文件夹中,支持任意子目录结构和命名方式。

以下示例展示了本文档采用的目录结构:

📁BP
📁recipes
📁crafting
📁weapons
📝cold_steel_sword.json
📁decorations
📁knobs
📝brass.json
📝covered_arch.json
📁magic
📝magic_ash.json
📁brewing
📁negative
📝paralysis.json
📝illumination_potion.json

例如,可通过以下有序配方制作"寒钢剑":

json
{
	"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"属性指定。

json
"format_version": "1.17.41"

实际使用中格式版本可设为任意值或省略。

WARNING

强烈建议仍保留格式版本,并选择与当前Minecraft版本匹配的值以保证未来兼容性。推荐使用最新正式版或上一个主版本号。

描述信息

"description"对象是所有配方类型的必填项,用于声明配方唯一标识符。

json
"description": {
	"identifier": "wiki:cold_steel_sword"
}

其中必填的"identifier"属性用于在世界中所有行为包范围内唯一标识配方。单个包内不允许存在重复的完整配方ID。

WARNING

强烈建议使用命名空间。命名空间是附加组件领域的通用规范,有助于将配方逻辑归属到特定行为包,减少多包混用时发生冲突的可能性。

标签系统

通过必填的"tags"数组属性将配方与合成界面关联,该属性需置于任何配方类型中。这些标签会使配方在具有minecraft:crafting_table组件的不同方块间共享。若配方不包含crafting_table标签或任何原版标签,但包含自定义方块的标签,则该配方仅适用于该自定义方块而非工作台/切石机等。必须提供至少一个标签。

json
"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数组:

json
		"unlock": [
			{
				"item": "wiki:cold_steel" //解锁配方所需物品
			},
			{
				"item": "minecraft:wool", //解锁配方所需物品
				"data":  3
			},
			{
				"context": "PlayerInWater" //解锁配方所需事件
			}
          ]

数组中每个对象的"item"字段表示玩家背包中需要存在的物品(支持数据值)。"context"字段表示触发解锁的事件,目前仅知"PlayerInWater"会在玩家入水时解锁配方。

物品描述符

配方系统中涉及多种物品引用方式,支持两种格式:字符串引用和物品对象。两种格式均可处理数据值,但只有物品对象能指定数量(用于配方输出)。对于配方输入,若未指定数据值,则该标识符下任意数据值的物品都可用作输入。输出物品的数据值默认为0(若未显式指定)。不支持通过物品标签选择配方输入。

字符串引用

基本格式为物品的命名空间加标识符组合:

json
"minecraft:planks"

字符串引用还支持通过后缀指定数据值:

json
"minecraft:planks:2"

物品对象

物品对象提供了更明确的物品引用结构。

json
{
	"item": "minecraft:planks",
	"data": 2,
	"count": 3
}

必填的"item"属性功能同字符串引用。虽然提供了独立的数据字段,但"item"属性仍支持数据值后缀格式。不同于后缀形式,"data"可接受Molang表达式(该表达式仅在世界加载时计算一次,而非每次合成时计算)。无法通过变量在配方属性间传递数据。目前已知"data"属性中唯一可用的查询是q.get_actor_info_id,用于通过实体标识符获取其刷怪蛋ID:

json
{
	"item": "minecraft:spawn_egg",
	"data": "q.get_actor_info_id('minecraft:chicken')"
}

可选的整数"count"属性用于堆叠物品,默认为1。当前仅在合成熔炼配方输出及无序配方原料中有效,其他场景下会被忽略。

注意

若对不可堆叠物品设置数量大于1,将抛出错误。无法强制单次返回多个合成输出(如无序配方或酿造混合产物)。

WARNING

尽管与交易表物品描述符相似,配方物品描述符不能使用函数。

特殊标识符

配方系统额外支持描述基础药水的特殊标识符。

json
"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

合成系统

合成操作通过合成网格即时转换物品。支持两种配方类型:无序配方(原料可任意排列)和有序配方(需严格排列原料)。 合成配方同时支持工作台和切石机:

json
"tags": ["crafting_table", "stonecutter"]

"crafting_table"同时适用于原版工作台和玩家物品栏中的2×2合成网格,当前无法单独启用其中一种。合成配方还支持自定义标签,可将配方关联到自定义方块提供的合成网格

无序配方

无序配方将原料集合与单个输出简单绑定。

json
{
	"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"数组列出了合成所需的原料物品。

json
"ingredients": [
	"wiki:brass",
	{
		"item": "wiki:screw",
		"data": 2
	}
]

每项均为物品描述符。若原料设置了数量,该数量必须通过多个合成网格槽位实现(单个槽位堆叠物品无法用于合成)。当所需物品存在但原料数量超过当前合成界面容量时,配方书会自动将该配方标记为不可用。

无序配方输出

通过必填的"result"属性声明输出,可以是物品描述符或单物品描述符的数组。

json
"result": {
	"item": "wiki:door_knob",
	"data": 3
}

有序配方

有序配方要求原料必须按特定图案排列。

json
{
	"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"数组属性用于建立配方图案。

json
"pattern": [
	"SSS",
	"I I",
	"I I"
]

数组每项代表合成网格的一行,字符串每个字符代表该行的槽位。默认空格表示该槽位需留空。

字符作为物品的视觉简写,每个独特字符需与键定义匹配以指定对应槽位的物品。

TIP

若图案全由空格组成,任何能容纳该图案尺寸的空合成界面都会持续匹配该配方。玩家可无限获取输出物品,包括通过Shift键一次性填满背包。

行标准化

图案网格最大为3×3,可更小。若字符串长度不一致,Minecraft会自动补全较短字符串(用空格填充空缺槽位)。以下两组定义等效:

json
"pattern": [
	"MA",
	"IFI",
	"M"
]
json
"pattern": [
	"MA ",
	"IFI",
	"M  "
]

注意

当前所有合成网格(包括自定义方块配置的)最大不超过3×3。若图案超出当前合成界面容量,配方书会自动将其标记为不可用。

网格自由度

空格不会自动填充3×3网格的剩余槽位。若提供的图案小于当前合成网格,只要保持结构和内容,图案可在网格任意位置使用。例如以下图案在工作台上的表现:

json
"pattern": [
	"O"
	"OO"
]

"L"形图案不限左上角位置,在3×3网格中可能配置如下:

要限制位置需显式使用空格强制某些槽位留空。以下图案仅能在网格左上角使用:

json
"pattern": [
	"O  "
	"OO "
	"   "
]
对称性

所有有序配方默认具有水平对称性:

json
"pattern": [
	"Z  "
	" Z "
	"  Z"
]

该配方也可被玩家视为以下形式使用:

json
"pattern": [
	"  Z"
	" Z "
	"Z  "
]

键定义

通过必填的"key"对象属性将图案字符映射到物品描述符

json
"key": {
	"S": "wiki:cloth",
	"I": "wiki:support"
}

图案中每个字符都需在此定义。键名区分大小写。若物品支持多数据值且未指定数据值,该标识符下任意数据值的物品都可用于该键。物品描述符中的"count"属性会被忽略并视为1;合成网格槽位中的堆叠物品每次仅消耗一个。

注意

可使用U+0020U+07FF间的任意Unicode字符作为键名。若键名超过一个字符,仅首字符有效。由于空格默认表示网格空槽且无法重新定义,不建议将其作为键。

WARNING

若图案字符未在键映射中定义,将被视为空格(空槽位)。

配方解锁

Minecraft 1.20.30新增配方解锁功能。要使用此功能,需确保manifest.json中的min_engine_version至少为1.20.11(推荐1.20.30),并在配方中添加unlock数组:

json
		"unlock": [
			{
				"item": "wiki:cold_steel" //解锁配方所需物品
			},
			{
				"item": "minecraft:wool", //解锁配方所需物品
				"data":  3
			},
			{
				"context": "PlayerInWater" //解锁配方所需事件
			}
		]

数组中每个对象的"item"字段表示玩家背包中需要存在的物品。"context"字段表示触发解锁的事件,目前仅知"PlayerInWater"会在玩家入水时解锁配方。

有序配方输出

有序配方输出行为与无序配方相似。不同于无序配方的是,有序配方的输出数组可包含多个物品描述符

json
"result": [
	{
		"item": "wiki:covered_arch",
		"count": 3
	},
	"wiki:crafting_scrap"
]

数组首项将作为合成方块的可见输出,其余项会在玩家取走可见输出后自动放入背包。目前似乎没有对单次合成返回物品数量的限制。

注意

无法放入背包的物品会按从左到右、从上到下的顺序放回合成输入槽。若仍无法容纳,则会像玩家执行"丢弃物品"操作一样抛出。

配方书

配方书自动索引并显示可用配方,智能考虑无序配方的原料数量或有序配方的图案限制。当多个配方指向相同输出时,配方书使用独特优先级系统。

比较两个无序配方时,按以下顺序确定优先级:

  1. 第一个列出原料的较低数量
  2. 更小的优先级值
  3. 字典序较小的标识符字符串

对于有序配方,字典序较小的标识符始终优先。

比较有序与无序配方时,使用无序配方规则,但有序配方的原料数量计算方式不同(具体机制未知)。

分组系统

本节为信息性说明。原版定义中的合成配方包含可选的"group"字符串属性。

json
"group": "slingshots"

目前未知该属性的具体作用(推测与配方书相关)。使用自定义分组或复用原版分组均未观察到实际效果。

优先级

合成配方支持额外的"priority"属性处理输入冲突,主要在优先级排序时作为决胜条件。

json
"priority": 2

数值较小的配方优先级更高(如优先级0优于1)。支持负值,未提供时默认为0

加热系统

熔炉配方通过热源随时间转换物品。虽然名称局限,实际适用于所有热源界面(包括营火)。

json
{
	"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
		}
	}
}

支持所有原版加热方块的标签:

json
"tags": ["furnace", "blast_furnace", "smoker", "campfire", "soul_campfire"]

加热转换

熔炉配方将单个输入物品描述符绑定到单个输出物品描述符。

json
"input": "wiki:bone_fragments"
"output": {
	"item": "wiki:magic_ash",
	"count": 4
}

输入中的数量值会被忽略。无法修改经验返还和燃料设定,加热时间由使用的方块决定且不可更改。

酿造系统

酿造配方通过催化剂物品转换另一物品。支持两种类型:酿造混合(不传递输入输出数据)和酿造容器(传递数据)。

仅一种界面支持酿造配方:

json
"tags": ["brewing_stand"]

酿造转换

酿造转换类似加热转换,需要输入和输出各一个物品描述符。此外还需"reagent"属性作为催化剂(也仅接受单个物品描述符)。

json
"input": "wiki:flask",
"reagent": "wiki:jade",
"output": "wiki:insanity_resistance"

这些属性中的数量值会被忽略,物品每次转换一个。

WARNING

若酿造配方的输入物品可堆叠,将消耗整个堆叠。目前无法避免此行为。

酿造完成后催化剂被消耗,输出物品直接替换输入物品。

WARNING

当前无论是否指定数据值,产出物品的堆叠都存在bug,无法与相同标识符和数据值的物品堆叠。

酿造混合

酿造混合是简单的酿造配方,理论上设计用于隔离输入输出的数据值。

json
{
	"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

不幸的是,酿造混合配方的数据值设定存在缺陷。

通常,若对输入指定数据值,酿造配方将完全失效。例外情况是输入为以下之一:

若通过"data"属性为催化剂指定数据值,当酿造台放入该标识符物品时会触发酿造(无论数据值是否匹配)。但只有数据值正确时才会成功转换,否则看似成功实则不转换输入(但仍会消耗催化剂和部分烈焰粉燃料)。

酿造容器

酿造容器设计用于将输入数据值传递到输出。

json
{
	"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"
	}
}

酿造混合更严格,仅允许以下输入类型:

由于数据值从输入传递到输出,"input""output"中指定的数据值会被忽略。

覆盖机制

与所有附加组件领域相同,行为包加载顺序影响游戏中选择的文件。列表中靠前的行为包会覆盖靠后的(包括原版基础包)。

要覆盖低优先级包的配方,需完全匹配配方类型和标识符。覆盖文件可任意命名存放——仅内容重要。配方不支持部分覆盖,必须完全重新定义。

WARNING

仅当配方类型完全匹配时覆盖才生效。多数情况下不匹配会导致新建配方而非覆盖。

若尝试在两种合成配方类型间转换覆盖,将抛出错误。解决方案:先复制原版定义到包中,将其"tags"设为[""](禁用配方),再新建另一种类型的配方文件(使用不同标识符避免冲突)。

优先级排序

考虑覆盖机制后,若多个配方匹配输入,按以下顺序决胜:

  1. 行为包列表中更高优先级的包
  2. 合成配方中更小的优先级值
  3. 合成配方中有序配方优于无序配方
  4. 字典序较小的标识符字符串