配方系统
Cooking 配方按工位分类存放。不同工位的字段不同,因为它们对应的玩法流程不同。建议把每个工位的配方放在独立目录中,便于按玩法、权限和产物维护。
配方目录
| 目录 | 工位 | 典型玩法 |
|---|---|---|
recipes/chopping_board/ | 砧板 | 单输入,按切割次数产出切片或半成品。 |
recipes/wok/ | 炒锅 | 多输入,按火候、翻炒次数和容错决定结果。 |
recipes/grinder/ | 研磨机 | 单输入或少量输入,等待研磨时间后产出粉末。 |
recipes/steamer/ | 蒸锅 | 单输入或组合输入,按蒸汽/进度产出熟制品。 |
recipes/oven/ | 烤炉 | 单输入,按烘烤时间、完美火力占比和过烤阶段决定结果。 |
recipes/juicer/ | 榨汁机 | 单输入,多次压榨生成指定流体,再按容器容量盛取。 |
recipes/fermentation_barrel/ | 发酵桶 | 多输入,按发酵时间、提前收取和过度发酵阶段决定结果。 |
通用字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | string | 是 | 配方唯一 ID,建议与文件名一致。 |
display_name | MiniMessage string | 是 | 在菜单、提示和日志中显示的名称。 |
permission | string | 否 | 使用该配方所需权限;为空表示不限制。 |
input / inputs / ingredients | object/list | 是 | 输入材料,使用 CoreLib Item Source。 |
result.<branch>.outputs | list | 是 | 当前推荐的产物列表结构。即使只有一个产物也写成列表。 |
result.<branch>.actions | list | 否 | 当前推荐的动作列表结构,与 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永远是列表;只有一个产物时也写列表。actions与outputs同级,写在对应结果分支对象下。- 炒锅可使用
success、undercooked、overcooked、invalid等分支。 - 烤炉可使用
success、perfect、overbaked等分支。 - 发酵桶可使用
success、early、over等分支;fermentation.early_collect.min_progress_ratio和fermentation.over_time_seconds只控制阶段,产物仍写到result.early/result.over。 - 旧结构如
result.output、result.outputs、result.actions、perfect_output、overbaked_output、fermentation.early_collect.output、fermentation.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>土豆已经切好。'砧板字段
| 字段 | 示例 | 说明 |
|---|---|---|
input | POTATO | 放入砧板的物品。 |
cuts_required | 4 | 需要完成的切割次数。建议 2-8,过高会导致重复操作疲劳。 |
output | BAKED_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: 1required_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炒锅字段
| 字段 | 类型 | 说明 |
|---|---|---|
ingredients | list | 需要投入的材料列表。 |
heat_level.min | number | 可接受最低火候。 |
heat_level.max | number | 可接受最高火候。 |
stir_total | number | 需要翻炒次数。 |
fault_tolerance | number | 允许偏离正确操作的次数。 |
result.success.outputs | list | 成功产物列表。 |
result.undercooked.outputs | list | 火候不足或进度不足产物列表。 |
result.overcooked.outputs | list | 过熟产物列表。 |
result.invalid.outputs | list | 材料错误或状态非法产物列表。 |
烤炉配方示例
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烤炉字段
| 字段 | 类型 | 说明 |
|---|---|---|
input | object | 放入烤炉的材料。 |
bake_time_seconds | number | 完成基础烘烤所需时间。 |
baking.perfect_heat.min | number | 判定为完美火力的最低值。 |
baking.perfect_heat.max | number | 判定为完美火力的最高值。 |
baking.perfect_required_ratio | number | 完美火力时间占总烘烤时间的最低比例。 |
baking.overbake_seconds | number | 完成后继续加热多少秒进入过烤阶段。 |
result.success.outputs | list | 正常完成产物列表;perfect、overbaked 等分支同样使用 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>\""榨汁机字段
| 字段 | 类型 | 说明 |
|---|---|---|
input | object | 可被压榨的材料。 |
presses_required | number | 完成一次压榨所需操作次数。 |
fluid.id | string | 产出流体 ID,用于防止不同流体混合。 |
fluid.display_name | string | GUI、提示中显示的流体名称。 |
fluid.amount_ml | number | 每次压榨完成后加入工位的流体量。 |
container.item_sources | list | 可盛取该流体的容器来源。 |
container.serving_ml | number | 每次盛取消耗的流体量;未配置时使用工位 default_serving_ml。 |
result.success.outputs | list | 盛取后给玩家的容器产物列表。 |
例如默认苹果汁每次压榨产出 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>\""发酵桶字段
| 字段 | 类型 | 说明 |
|---|---|---|
inputs | list | 需要投入的多种材料。 |
fermentation_time_seconds | number | 正常完成发酵所需时间。 |
fermentation.early_collect.min_progress_ratio | number | 允许提前收取的最低进度比例。 |
fermentation.over_time_seconds | number | 正常完成后继续放置多久进入过度发酵。 |
result.early.outputs | list | 提前收取产物列表。 |
result.over.outputs | list | 过度发酵产物列表。 |
result.success.outputs | list | 正常完成产物列表。 |
发酵桶适合做“时间换收益”的玩法:提前收取可以给较弱产物,正常完成给目标产物,过度发酵可以转化为副产物或失败产物。
权限和展示
配方可配置 permission。如果使用菜单或配方书,建议把权限检查结果展示给玩家,例如显示"未解锁"或"等级不足"。