工位系统
Cooking 工位承载配方交互、进度状态、材料缓存、燃料、流体、阶段数据和结果产出。一个工位可以对应方块、GUI 或交互实体;排查时先确认方块来源,再看工位状态和配方匹配。
工位类型
| 工位 | 主要状态 | 适合玩法 |
|---|---|---|
| 砧板 | 当前输入、切割次数 | 切菜、分割、预处理。 |
| 研磨机 | 当前输入、剩余时间 | 磨粉、研磨药材、压碎矿物。 |
| 蒸锅 | 当前输入、燃料、水分、蒸汽进度 | 蒸鱼、蒸饭、熟制半成品。 |
| 炒锅 | 材料列表、火候、翻炒次数、错误次数 | 需要操作节奏和判定的料理。 |
| 烤炉 | 输入、燃烧时间、火力、烘烤阶段 | 需要控温和阶段判定的烘焙。 |
| 榨汁机 | 输入、压榨次数、流体 ID、流体容量 | 果汁、饮品、按容器分装。 |
| 发酵桶 | 多输入、发酵进度、封存状态、阶段 | 酒、醋、发酵半成品。 |
配置顺序
- 先在
config.yml里确认工位方块来源和交互方式。 - 再到
recipes/<station>/写对应工位配方。 - 如果工位有 GUI,再调整
gui/*.yml。 - 使用
/ec inspect hand检查材料、工具、容器和方块来源。 - 使用
/ec debug排查工位监听、展示实体和持久化状态。
通用配置字段
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 工位唯一 ID。 |
display_name | string | 菜单和提示中显示的名称。 |
block_item_sources | list | 绑定的方块来源,推荐使用 minecraft-oak_log 这类短横线格式。 |
interactions | object | 每个操作对应的点击方式。 |
permission | string | 使用工位所需权限,部分权限由命令或监听器统一检查。 |
gui | string/object | 打开的 GUI ID 或内联 GUI 配置。 |
drop_result | boolean | 结果是否直接掉落到世界。 |
only_recipe_items | boolean | 是否只允许可匹配配方的物品进入输入。 |
砧板示例
yaml
stations:
chopping_board:
block_item_sources:
- minecraft-oak_log
only_recipe_items: true
interactions:
place_input: shift_left_click
process: shift_left_click
return_input: right_click
drop_result: true
interaction_delay_ms: 1000
tool_item_sources:
- minecraft-iron_axe炒锅示例
yaml
stations:
wok:
block_item_sources:
- minecraft-iron_block
interactions:
add_ingredient: shift_left_click
stir: shift_left_click
serve: shift_left_click
return_ingredient: shift_left_click
inspect: shift_right_click
drop_result: true
need_bowl: true
stir_delay_ms: 5000
timeout_ms: 30000
spatula_item_sources:
- minecraft-iron_shovel
heat_levels:
- item_sources:
- minecraft-campfire
level: 1
- item_sources:
- minecraft-magma_block
level: 2
- item_sources:
- minecraft-lava
level: 3炒锅热度参数
| 字段 | 说明 |
|---|---|
need_bowl | 是否要求手持碗才能出锅。 |
stir_delay_ms | 两次翻炒之间的最小间隔。 |
timeout_ms | 锅状态超时后按过火处理。 |
heat_levels[].item_sources | 命中的下方方块来源。 |
heat_levels[].level | 对应火候等级。 |
研磨机示例
yaml
stations:
grinder:
block_item_sources:
- minecraft-grindstone
interactions:
start: shift_left_click
drop_result: true
check_delay_ticks: 20
actions:
start:
- 'playsound sound=block.grindstone.use volume=0.7 pitch=1.0'
running:
- 'particle type=SMOKE count=2 offset_x=0.15 offset_y=0.15 offset_z=0.15'
complete:
- 'playsound sound=entity.experience_orb.pickup volume=0.8 pitch=1.2'| 字段 | 说明 |
|---|---|
check_delay_ticks | 后台检查周期(tick)。研磨机放入材料后自动开始,按此间隔检查进度。 |
interactions.start | 手动启动研磨的交互方式。 |
研磨机是最简单的工位——放入材料后自动开始研磨,达到配方时间后产出结果。不需要燃料、水分或手动翻炒。
蒸锅示例
yaml
stations:
steamer:
block_item_sources:
- minecraft-barrel
interactions:
open: shift_right_click
fuel: right_click
moisture: right_click
drop_result: true
heat_item_sources:
- minecraft-furnace
- minecraft-smoker
- minecraft-blast_furnace
ignite_heat_source: true
fuels:
- item_sources:
- minecraft-stick
duration_seconds: 5
- item_sources:
- minecraft-coal
duration_seconds: 80
moisture_rules:
- input_item_sources:
- minecraft-water_bucket
item_sources:
- minecraft-bucket
moisture: 120
- input_item_sources:
- minecraft-potion
item_sources:
- minecraft-glass_bottle
moisture: 40
reset_progress_when_steam_empty: true
steam_production_efficiency: 10
steam_conversion_efficiency: 1
steam_consumption_efficiency: 1| 字段 | 说明 |
|---|---|
heat_item_sources | 蒸锅下方热源方块来源。支持对象写法指定 lit_item_sources 作为点亮替换。 |
ignite_heat_source | 加燃料后是否点亮下方热源外观。 |
fuels[].item_sources | 燃料物品来源。 |
fuels[].duration_seconds | 投入燃料后增加的燃烧时间。 |
moisture_rules[].input_item_sources | 加水操作的输入物品来源。 |
moisture_rules[].item_sources | 加水后返还的容器物品来源。 |
moisture_rules[].moisture | 加水后增加的水分值。 |
reset_progress_when_steam_empty | 蒸汽耗尽时是否重置全部进度。 |
steam_production_efficiency | 每个周期最多将多少 moisture 转成 steam。 |
steam_conversion_efficiency | 每次 steam 消耗换算成多少进度。 |
steam_consumption_efficiency | 每个周期的基础 steam 消耗量。 |
蒸锅的运行逻辑:燃料提供燃烧时间 → 燃烧时将 moisture 转化为 steam → steam 推进蒸制进度。三个 efficiency 参数控制转化速率。水分和燃料都需要玩家手动补充。
烤炉示例
yaml
stations:
oven:
block_item_sources:
- minecraft-smoker
interactions:
open: shift_right_click
fuel: shift_left_click
inspect: shift_left_click
drop_result: true
heat:
min: 20
max: 80
decay_per_second: 5
fuels:
- item_sources:
- minecraft-stick
duration_seconds: 5
heat: 10
- item_sources:
- minecraft-coal
duration_seconds: 80
heat: 35| 字段 | 说明 |
|---|---|
heat.min / heat.max | 火力处于该区间时才推进烤制计时。 |
heat.decay_per_second | 每秒自然衰减的火力。 |
fuels[].duration_seconds | 投入燃料后增加的燃烧时间。 |
fuels[].heat | 投入燃料后增加的火力。 |
烤炉的运行状态会记录当前火力、剩余燃烧时间、累计烘烤时间和烘烤阶段。火力过低或过高都会暂停正常烘烤,配方可根据完美火力占比和过烤时间决定最终产物。
榨汁机示例
yaml
stations:
juicer:
block_item_sources:
- minecraft-cauldron
interactions:
open: shift_right_click
process: shift_left_click
inspect: left_click
serve: shift_left_click
drop_result: true
only_recipe_items: true
require_container: true
max_fluid_ml: 1000
default_serving_ml: 250
container_item_sources:
- minecraft-glass_bottle
drop_completed_result_on_break: false| 字段 | 说明 |
|---|---|
require_container | 是否要求容器才能盛取结果。 |
max_fluid_ml | 榨汁机内部默认最大流体容量。 |
default_serving_ml | 默认每次容器盛取需要的流体量。 |
container_item_sources | 可作为容器的物品来源。 |
drop_completed_result_on_break | 工位被破坏时是否掉落已完成结果。 |
榨汁机会把压榨产物保存为“流体 ID + 容量”。同一台榨汁机同一时间只应保存一种流体,避免不同饮品混入。容量达到容器所需 serving_ml 后才可盛取。
发酵桶示例
yaml
stations:
fermentation_barrel:
block_item_sources:
- minecraft-barrel
interactions:
open: shift_right_click
start: shift_left_click
inspect: left_click
serve: shift_left_click
drop_result: true
pause_when_open: true
require_sealed: true
only_recipe_items: true| 字段 | 说明 |
|---|---|
pause_when_open | GUI 打开时是否暂停发酵进度。 |
require_sealed | 是否要求封存后才推进发酵。 |
only_recipe_items | 是否只允许配方材料进入输入。 |
发酵桶适合多输入长周期配方。配方可以定义提前收取比例、正常完成结果和过度发酵结果。
展示实体
Cooking 支持把工位输入、半成品或结果以展示实体形式呈现在世界中。展示实体由 display_entities 和 display_adjustments 控制。
yaml
display_entities:
backend: auto
view_distance_blocks: 32
refresh_interval_ticks: 20| 字段 | 说明 |
|---|---|
backend | 展示后端,通常可使用 auto、packet_events 或 bukkit。 |
view_distance_blocks | 玩家可见距离。 |
refresh_interval_ticks | 展示刷新间隔。 |
display_adjustments 可按工位或物品调整偏移、旋转和缩放。配置自定义方块工位时,建议先使用默认值确认展示正常,再微调高度和旋转。
炒锅动画与烫伤
炒锅可配置翻炒动画和过热惩罚,用于强化操作节奏:
yaml
stir_animation:
duration_ticks: 12
height: 0.35
rotation_axis: y
rotation_degrees: 180
scald_damage:
enabled: true
value: 2| 字段 | 说明 |
|---|---|
stir_animation.duration_ticks | 翻炒动画持续时间。 |
stir_animation.height | 动画抛起高度。 |
stir_animation.rotation_axis | 旋转轴。 |
stir_animation.rotation_degrees | 旋转角度。 |
scald_damage.enabled | 是否启用烫伤。 |
scald_damage.value | 烫伤伤害值。 |
如果炒锅用于轻休闲玩法,可以关闭烫伤或降低伤害;如果用于节奏挑战,可以提高错误惩罚并配合失败产物。
状态生命周期
- 玩家右键或按配置点击工位。
- 模块检查权限、冷却、工位是否被占用以及手持物是否满足交互要求。
- 打开 GUI 或进入交互状态。
- 玩家放入材料、投入燃料、注入水分、压榨或封存。
- 工位记录进度,例如切割次数、研磨剩余时间、蒸汽、火候、流体容量或发酵阶段。
- 达成条件后消耗输入并生成结果;部分工位可先进入“完成待领取”状态。
- 执行动作并清理临时状态,必要时保留剩余流体、剩余燃料或剩余进度。
多人和重启处理
- 同一工位应避免被多个玩家同时修改同一份材料缓存。
- 如果允许协作,需要明确谁获得产物、谁承担材料消耗。
- 服务器关闭或重载时,应保存关键状态或安全退还材料。
- 推荐给每个工位位置写入 PDC 或持久化记录,避免方块被破坏后仍残留状态。
- 对榨汁机、烤炉和发酵桶,额外确认流体容量、烘烤阶段和发酵进度能正确序列化。
工位权限
各工位的操作权限节点:
| 权限 | 说明 |
|---|---|
emakicooking.station.oven.use | 使用烤炉。 |
emakicooking.station.oven.fuel | 向烤炉投入燃料。 |
emakicooking.station.juicer.use | 使用榨汁机。 |
emakicooking.station.juicer.press | 执行压榨操作。 |
emakicooking.station.juicer.collect | 盛取榨汁结果。 |
emakicooking.station.fermentation_barrel.use | 使用发酵桶。 |
emakicooking.station.fermentation_barrel.start | 开始发酵。 |
emakicooking.station.fermentation_barrel.collect | 收取发酵结果。 |
砧板、研磨机、炒锅和蒸锅的权限由通用
permission字段控制。
GUI 覆盖范围
| 工位 | 是否有 GUI |
|---|---|
| 蒸锅 | 有 |
| 烤炉 | 有 |
| 榨汁机 | 有 |
| 发酵桶 | 有 |
| 砧板 | 无(直接交互) |
| 研磨机 | 无(直接交互) |
| 炒锅 | 无(直接交互) |