Skip to content

Stations

Cooking stations store interaction state, input items, progress, fuel/fluid/stage data, and output handling. A station usually maps to a world block, a GUI, or a custom interaction entity.

Station types

StationMain stateBest for
Chopping BoardInput item and cut countSlicing and preprocessing.
GrinderInput item and remaining timeGrinding powders or herbs.
SteamerInput item, fuel, moisture, and steam progressSteamed food and cooked intermediates.
WokIngredients, heat, stir count, mistakesTiming-based cooking gameplay.
OvenInput, burn time, heat, and baking stageBaking with heat control and stage resolution.
JuicerInput, press count, fluid id, and fluid amountJuice and drinks bottled by serving capacity.
Fermentation BarrelMultiple inputs, progress, sealed state, and stageWine, vinegar, and fermented intermediates.

Common config fields

FieldDescription
idUnique station id.
display_nameName shown in menus and messages.
block_item_sourcesBlock sources bound to the station. Prefer dash-style ids such as minecraft-oak_log.
interactionsClick mapping for each station operation.
permissionPermission required to use the station. Some checks are centralized in commands/listeners.
guiGUI id or inline GUI config.
drop_resultWhether results are dropped directly in the world.
only_recipe_itemsWhether only items that can match a recipe may enter the input.

Chopping board example

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

Wok example

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
FieldDescription
need_bowlWhether a bowl is required to serve.
stir_delay_msMinimum delay between two stirs.
timeout_msTreat the wok as overcooked after this timeout.
heat_levels[].item_sourcesBlock sources below the wok.
heat_levels[].levelHeat level produced by those blocks.

Grinder example

yaml
stations:
  grinder:
    block_item_sources:
      - minecraft-grindstone
    interactions:
      start: shift_left_click
    drop_result: true
    check_delay_ticks: 20
FieldDescription
check_delay_ticksBackground check interval (ticks). The grinder starts automatically after input and checks progress at this interval.
interactions.startInteraction type to manually start grinding.

The grinder is the simplest station — place an input item, it starts grinding automatically, and produces a result when the recipe time is reached. No fuel, moisture, or manual stirring required.

Steamer example

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
FieldDescription
heat_item_sourcesBlock sources below the steamer that act as heat sources. Supports object format with lit_item_sources for lit-state replacement.
ignite_heat_sourceWhether adding fuel lights the heat source block appearance.
fuels[].item_sourcesFuel item sources.
fuels[].duration_secondsBurn time added by the fuel.
moisture_rules[].input_item_sourcesInput item sources for adding moisture.
moisture_rules[].item_sourcesContainer item returned after adding moisture.
moisture_rules[].moistureMoisture value added.
reset_progress_when_steam_emptyWhether to reset all progress when steam runs out.
steam_production_efficiencyMax moisture converted to steam per cycle.
steam_conversion_efficiencyProgress gained per steam consumed.
steam_consumption_efficiencyBase steam consumed per cycle.

Steamer logic: fuel provides burn time → burning converts moisture into steam → steam advances steaming progress. The three efficiency parameters control conversion rates. Both moisture and fuel must be manually replenished by the player.

Oven example

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
FieldDescription
heat.min / heat.maxBaking only advances while heat stays in this range.
heat.decay_per_secondNatural heat decay per second.
fuels[].duration_secondsBurn time added by the fuel.
fuels[].heatHeat added by the fuel.

The oven runtime records current heat, remaining burn time, accumulated baking time, and baking stage. Heat that is too low or too high pauses normal baking. Recipes can use perfect heat ratio and overbake time to resolve the final result.

Juicer example

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
FieldDescription
require_containerWhether a container is required to serve.
max_fluid_mlDefault internal fluid capacity in milliliters.
default_serving_mlDefault fluid amount consumed per serving.
container_item_sourcesItems accepted as containers.
drop_completed_result_on_breakWhether completed results are dropped when the station block is broken.

The juicer stores output as a fluid id plus an amount. One juicer should only contain one fluid at a time to prevent mixing different drinks. The fluid amount must reach serving_ml before a serving can be bottled.

Fermentation barrel example

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
FieldDescription
pause_when_openWhether fermentation pauses while the GUI is open.
require_sealedWhether the barrel must be sealed before progress advances.
only_recipe_itemsWhether only recipe ingredients can be inserted.

Fermentation barrels are suited for long-duration, multi-input recipes. Recipes can define early collection, normal completion, and over-fermented results.

Lifecycle

  1. The player interacts with the station using a configured click.
  2. The module checks permission, cooldown, occupancy, and held-item requirements.
  3. A GUI or interaction state is opened.
  4. The player inserts items, adds fuel/moisture, presses, or seals the station.
  5. The station tracks progress such as cuts, grinding time, steam, heat, fluid amount, or fermentation stage.
  6. Inputs are consumed and results are generated, or the station enters a completed-but-unclaimed state.
  7. Actions run and temporary state is cleared. Remaining fluid, fuel, or progress may be kept.

Safety notes

  • Avoid multiple players mutating the same item cache at the same time.
  • If cooperation is allowed, define who receives results and who pays the inputs.
  • On shutdown or reload, save important state or safely return materials.
  • Store station location data persistently so broken blocks do not leave stale state behind.
  • For juicers, ovens, and fermentation barrels, verify fluid amount, baking stage, and fermentation progress serialization.

Testing checklist

  • Players without permission cannot open or use the station.
  • Breaking a station returns, drops, or processes materials according to configuration.
  • Closing a GUI leaves the state as expected.
  • Full inventory, reload, death, and disconnect do not duplicate or delete items.
  • Multiple players clicking the same station do not create race conditions.
  • Oven results are correct for low heat, valid heat, high heat, and overbaking.
  • Juicer behavior is correct for insufficient fluid, enough fluid, wrong containers, and mixed-fluid attempts.
  • Fermentation behavior is correct for early collection, normal completion, over-fermentation, and GUI pause.