Skip to content

配方系统

用来实现3×3 工作台式合成。和原版工作台一样,按材料的材质类型匹配。

pattern 是材质名,不是匹配表达式

pattern 里写的必须是 Bukkit Material 枚举名(如 DIAMONDSTICK),不能写 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

namelore 中的 {变量}生成结果物品时解析,可以使用配方脚本里已定义的变量(如 {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,一定要用 requireif ... != 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 自收集。

TQ Minecraft Server Plugin Docs