配方系统
用来实现3×3 工作台式合成。和原版工作台一样,按材料的材质类型匹配。
pattern 是材质名,不是匹配表达式
pattern 里写的必须是 Bukkit Material 枚举名(如 DIAMOND、STICK),不能写 type.is(...) 等匹配器。匹配发生在 match_recipe() 调用时,按材质比对。
格式
- 每个配方定义一个 3×3 网格(共 9 个槽位)。
- 每行 3 个材质名,用空格分隔。
- 空位用
_或AIR。
yaml
recipes:
钻石剑:
pattern:
- "_ DIAMOND _" # 第 1 行
- "_ DIAMOND _" # 第 2 行
- "_ STICK _" # 第 3 行
result:
material: DIAMOND_SWORD
name: "&b锻造钻石剑"
lore:
- "&7锻造者: {player.name}"
- "&7攻击力: +15"
amount: 1
钻石胸甲:
pattern:
- "DIAMOND _ DIAMOND"
- "DIAMOND DIAMOND DIAMOND"
- "DIAMOND DIAMOND DIAMOND"
result:
material: DIAMOND_CHESTPLATE
name: "&b锻造钻石胸甲"result 块字段
| 字段 | 说明 |
|---|---|
material | 输出物品的材质(必填) |
name | 物品名(支持颜色码和 {变量} 插值) |
lore | 描述行数组 |
amount | 数量,默认 1 |
name 和 lore 中的 {变量} 在生成结果物品时解析,可以使用配方脚本里已定义的变量(如 {player.name})。
匹配配方:match_recipe
在 variables 中调用:
yaml
variables: |
匹配配方 = match_recipe(@recipes, @mat1, @mat2, @mat3,
@mat4, @mat5, @mat6,
@mat7, @mat8, @mat9)
配方名称 = 匹配配方 != null ? 匹配配方.id : "无"参数顺序:
- 第一个
@recipes是配方字典的引用(固定写@recipes)。 - 后面 9 个按从左到右、从上到下的顺序传入 3×3 槽位。
返回对象
匹配成功返回一个配方对象,有如下方法:
| 方法 | 说明 |
|---|---|
.id | 匹配到的配方键(如 "钻石剑") |
.result() | 生成结果 ItemStack |
yaml
conditions: |
require 匹配配方 != null : "&c未匹配到任何配方"
execute: |
result = 匹配配方.result()
slot.set("output", result)
effect.title("&e锻造成功", "&7获得 {匹配配方.id}")匹配失败返回 null,一定要用 require 或 if ... != null 保护。
典型流程
yaml
# 1. 9 个 input 槽位收材料(layout 用数字 1-9)
# 2. variables 中调 match_recipe
# 3. conditions 中 require 不为 null
# 4. execute 中清空材料、放输出完整例子见 实战案例 - 装备锻造系统。
限制
- 固定 3×3,不支持 2×2 或更大规模。
- 不做形状无关匹配:
pattern的位置必须和玩家放置的位置完全对齐。想要形状无关的合成,可以把 9 个材料放进一个multiple=true的 input 组,用sum_extract/count_filled自行判断。 - 只比对材质,不比对 NBT / Lore / MM ID。自定义物品合成应走
input.match+ 脚本判断,或升级到multiple=true自收集。