Skip to content

配方系统

Cooking 配方按工位分类存放。不同工位的字段不同,因为它们对应的玩法流程不同。建议把每个工位的配方放在独立目录中,便于按玩法、权限和产物维护。

配方目录

目录工位典型玩法
recipes/chopping_board/砧板单输入,按切割次数产出切片或半成品。
recipes/wok/炒锅多输入,按火候、翻炒次数和容错决定结果。
recipes/grinder/研磨机单输入或少量输入,等待研磨时间后产出粉末。
recipes/steamer/蒸锅单输入或组合输入,按蒸汽/进度产出熟制品。
recipes/oven/烤炉单输入,按烘烤时间、完美火力占比和过烤阶段决定结果。
recipes/juicer/榨汁机单输入,多次压榨生成指定流体,再按容器容量盛取。
recipes/fermentation_barrel/发酵桶多输入,按发酵时间、提前收取和过度发酵阶段决定结果。

通用字段

字段类型必填说明
idstring配方唯一 ID,建议与文件名一致。
display_nameMiniMessage string在菜单、提示和日志中显示的名称。
permissionstring使用该配方所需权限;为空表示不限制。
input / inputs / ingredientsobject/list输入材料,使用 CoreLib Item Source。
result.<branch>.outputslist当前推荐的产物列表结构。即使只有一个产物也写成列表。
result.<branch>.actionslist当前推荐的动作列表结构,与 outputs 同级,位于结果分支对象下。
completion_conditions / 条件节点list/object配方完成前额外检查的条件;不满足时不进入对应成功产出。

结果分支结构

当前 Cooking 配方结果统一使用 result.<branch>.outputs/actions

yaml
result:
  success:
    outputs:
      - item_sources:
          - "minecraft-baked_potato"
        amount: 1
    actions:
      - "sendmessage text=\"<gold>料理完成。</gold>\""

约定:

  • outputs 永远是列表;只有一个产物时也写列表。
  • actionsoutputs 同级,写在对应结果分支对象下。
  • 炒锅可使用 successundercookedovercookedinvalid 等分支。
  • 烤炉可使用 successperfectoverbaked 等分支。
  • 发酵桶可使用 successearlyover 等分支;fermentation.early_collect.min_progress_ratiofermentation.over_time_seconds 只控制阶段,产物仍写到 result.early / result.over
  • 旧结构如 result.outputresult.outputsresult.actionsperfect_outputoverbaked_outputfermentation.early_collect.outputfermentation.over_output 不再作为当前推荐写法。

物品来源

输入和输出都使用 CoreLib Item Source。推荐使用稳定短 ID 或明确 source 配置,例如:

yaml
input:
  item_sources:
    - minecraft-wheat

也可以使用项目约定的短写:

yaml
input: mc-wheat
output: emaki_item-noodle

不推荐旧式 minecraft:wheat 冒号格式,因为它容易与其他插件的命名空间解析规则冲突。

砧板配方示例

yaml
id: sliced_potato
display_name: '<yellow>切片土豆'
permission: emakicooking.recipe.sliced_potato
input:
  source: vanilla
  id: POTATO
  amount: 1
cuts_required: 4
output:
  source: vanilla
  id: BAKED_POTATO
  amount: 1
actions:
  complete:
    - 'sendmessage <green>土豆已经切好。'

砧板字段

字段示例说明
inputPOTATO放入砧板的物品。
cuts_required4需要完成的切割次数。建议 2-8,过高会导致重复操作疲劳。
outputBAKED_POTATO完成切割后的产物。

研磨机配方示例

yaml
id: wheat_flour
display_name: '<white>小麦粉'
input:
  source: vanilla
  id: WHEAT
  amount: 3
grind_time_seconds: 8
output:
  source: emaki_item
  id: wheat_flour
  amount: 1
actions:
  start:
    - 'playsound BLOCK_GRINDSTONE_USE 0.8 1.2'
  complete:
    - 'sendmessage <gray>研磨完成。'
字段说明
grind_time_seconds研磨耗时,建议与服务器 TPS 和玩家等待体验一起测试。
actions.start开始研磨时执行。
actions.complete完成时执行。

蒸锅配方示例

yaml
id: steamed_fish
display_name: '<aqua>清蒸鱼'
input:
  source: vanilla
  id: COD
  amount: 1
required_steam: 100
output:
  source: vanilla
  id: COOKED_COD
  amount: 1

required_steam 表示需要累计的蒸汽或进度值。数值越高,等待越久;建议对高价值料理设置更高要求,并在 GUI 中显示进度。

炒锅配方示例

yaml
id: fried_rice
display_name: '<gold>蛋炒饭'
permission: emakicooking.recipe.fried_rice
ingredients:
  - source: vanilla
    id: WHEAT
    amount: 2
  - source: vanilla
    id: EGG
    amount: 1
heat_level:
  min: 2
  max: 4
stir_total: 6
fault_tolerance: 1
result:
  success:
    outputs:
      - source: emaki_item
        id: fried_rice
        amount: 1
    actions:
      - 'sendtitle <green>料理成功 <gray>火候刚刚好'
  undercooked:
    outputs:
      - source: vanilla
        id: WHEAT
        amount: 1
  overcooked:
    outputs:
      - source: vanilla
        id: CHARCOAL
        amount: 1
    actions:
      - 'sendmessage <red>火候太大,食材糊掉了。'
  invalid:
    outputs:
      - source: vanilla
        id: BOWL
        amount: 1

炒锅字段

字段类型说明
ingredientslist需要投入的材料列表。
heat_level.minnumber可接受最低火候。
heat_level.maxnumber可接受最高火候。
stir_totalnumber需要翻炒次数。
fault_tolerancenumber允许偏离正确操作的次数。
result.success.outputslist成功产物列表。
result.undercooked.outputslist火候不足或进度不足产物列表。
result.overcooked.outputslist过熟产物列表。
result.invalid.outputslist材料错误或状态非法产物列表。

烤炉配方示例

yaml
id: "baked_potato"
display_name: "烤马铃薯"
input:
  item_sources:
    - "minecraft-potato"

bake_time_seconds: 20

baking:
  perfect_heat:
    min: 45
    max: 60
  perfect_required_ratio: 0.7
  overbake_seconds: 10

permission: "emakicooking.recipe.baked_potato"

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-baked_potato"
        amount: 1
    actions:
      - "sendmessage text=\"<gold>烤制完成。</gold>\""
  perfect:
    outputs:
      - item_sources:
          - "minecraft-golden_carrot"
        amount: 1
  overbaked:
    outputs:
      - item_sources:
          - "minecraft-charcoal"
        amount: 1

烤炉字段

字段类型说明
inputobject放入烤炉的材料。
bake_time_secondsnumber完成基础烘烤所需时间。
baking.perfect_heat.minnumber判定为完美火力的最低值。
baking.perfect_heat.maxnumber判定为完美火力的最高值。
baking.perfect_required_rationumber完美火力时间占总烘烤时间的最低比例。
baking.overbake_secondsnumber完成后继续加热多少秒进入过烤阶段。
result.success.outputslist正常完成产物列表;perfectoverbaked 等分支同样使用 outputs/actions

烤炉运行时会记录烘烤阶段。基础时间达到后进入可领取状态;如果继续处于高温或持续加热,可进入过烤阶段。建议为高价值食物配置更窄的完美火力区间,并在 GUI 中提示当前火力。

榨汁机配方示例

yaml
id: "apple_juice"
display_name: "苹果汁"
input:
  item_sources:
    - "minecraft-apple"

presses_required: 5

fluid:
  id: "apple_juice"
  display_name: "苹果汁"
  amount_ml: 180

container:
  item_sources:
    - "minecraft-glass_bottle"
  serving_ml: 250

permission: "emakicooking.recipe.apple_juice"

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-honey_bottle"
        amount: 1
    actions:
      - "sendmessage text=\"<aqua>榨汁完成。</aqua>\""

榨汁机字段

字段类型说明
inputobject可被压榨的材料。
presses_requirednumber完成一次压榨所需操作次数。
fluid.idstring产出流体 ID,用于防止不同流体混合。
fluid.display_namestringGUI、提示中显示的流体名称。
fluid.amount_mlnumber每次压榨完成后加入工位的流体量。
container.item_sourceslist可盛取该流体的容器来源。
container.serving_mlnumber每次盛取消耗的流体量;未配置时使用工位 default_serving_ml
result.success.outputslist盛取后给玩家的容器产物列表。

例如默认苹果汁每次压榨产出 180ml,玻璃瓶每次盛取需要 250ml。因此一次压榨后还不能盛取,需要继续压榨累计容量。榨汁机内部同一时间只保留一种 fluid.id,避免苹果汁、葡萄汁等不同流体混入同一容器。

发酵桶配方示例

yaml
id: "apple_cider"
display_name: "苹果酒"
inputs:
  - item_sources:
      - "minecraft-apple"
    amount: 3
  - item_sources:
      - "minecraft-sugar"
    amount: 1

fermentation_time_seconds: 300

fermentation:
  early_collect:
    min_progress_ratio: 0.5
  over_time_seconds: 600

permission: "emakicooking.recipe.apple_cider"

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-honey_bottle"
        amount: 1
    actions:
      - "sendmessage text=\"<gold>发酵完成。</gold>\""
  early:
    outputs:
      - item_sources:
          - "minecraft-potion"
        amount: 1
    actions:
      - "sendmessage text=\"<yellow>提前收取了半发酵苹果饮。</yellow>\""
  over:
    outputs:
      - item_sources:
          - "minecraft-honey_bottle"
        amount: 1
    actions:
      - "sendmessage text=\"<gold>苹果酒已经继续转化为酸甜果醋。</gold>\""

发酵桶字段

字段类型说明
inputslist需要投入的多种材料。
fermentation_time_secondsnumber正常完成发酵所需时间。
fermentation.early_collect.min_progress_rationumber允许提前收取的最低进度比例。
fermentation.over_time_secondsnumber正常完成后继续放置多久进入过度发酵。
result.early.outputslist提前收取产物列表。
result.over.outputslist过度发酵产物列表。
result.success.outputslist正常完成产物列表。

发酵桶适合做“时间换收益”的玩法:提前收取可以给较弱产物,正常完成给目标产物,过度发酵可以转化为副产物或失败产物。

权限和展示

配方可配置 permission。如果使用菜单或配方书,建议把权限检查结果展示给玩家,例如显示"未解锁"或"等级不足"。