Skip to content

Recipes

EmakiCooking recipes are stored by station under plugins/EmakiCooking/recipes/<station>/. Each station has its own gameplay flow, so each recipe type has different fields: chopping boards use input amount and cut counts, woks use stirring and heat, ovens use baking stages, juicers use fluid volume, and fermentation barrels use time stages.

Recipe folders

FolderStationTypical use
recipes/chopping_board/Chopping BoardSingle input, accepts the whole main-hand stack, then uses input amount and repeated cuts for sliced output.
recipes/wok/WokMultiple ingredients, heat, stirring, and failure branches.
recipes/grinder/GrinderInput item plus processing time.
recipes/steamer/SteamerInput item plus steaming time or chained steps.
recipes/oven/OvenSingle input resolved by baking time, perfect heat ratio, and overbake stage.
recipes/juicer/JuicerSingle input pressed into fluid, then bottled by serving capacity.
recipes/fermentation_barrel/Fermentation BarrelMultiple inputs resolved by fermentation time, early collection, and over-fermentation.

Current default resources use CoreLib Item Source lists and result branches:

yaml
result:
  success:
    outputs:
      - item_sources:
          - "minecraft-baked_potato"
        amount: 1
    actions:
      - 'sendmessage text="<gold>Cooking complete.</gold>"'

Rules:

  • Inputs and outputs should use item_sources lists, such as minecraft-carrot or minecraft-glass_bottle.
  • result.<branch>.outputs is always a list, even for one output item.
  • result.<branch>.actions is placed beside outputs under the same result branch.
  • Do not use old examples such as output, result.output, result.outputs, result.actions, perfect_output, overbaked_output, fermentation.early_collect.output, or fermentation.over_output.

Common fields

FieldRequiredDescription
idYesUnique recipe id. Prefer matching the file name.
display_nameYesDisplay name. Supports MiniMessage.
permissionNoPermission required to use this recipe. Empty means no gate.
conditionNoCompletion/collection condition block. Can include on_pass.actions, on_fail.actions, and on_fail.block_output.
result.<branch>.outputsYesOutput list for this branch.
result.<branch>.actionsNoActions executed when this branch outputs.

Result branches

StationCommon branches
Chopping Boardsuccess
Grindersuccess
Steamersuccess; chained recipes may continue through steps.
Woksuccess, undercooked, overcooked, invalid
Ovensuccess, perfect, overbaked
Juicersuccess
Fermentation Barrelsuccess, early, over

When condition.on_fail.block_output is true, a failed condition blocks output. When it is false, output can still happen but fail actions run. For fermentation barrels, automatic completion and block-break drops may happen while the player is offline; source behavior is authoritative in those cases.

Chopping board example

yaml
id: "cut_carrot"
display_name: "Cut Carrot"

input:
  item_sources:
    - "minecraft-carrot"
  amount: 2

cuts_required: 1
tool_damage: 1

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-golden_carrot"
        amount: 1
    actions:
      - 'sendmessage text="<green>Chopping complete.</green>"'
FieldDescription
input.item_sourcesMatching input sources.
input.amountInput amount required and consumed for each completed cut cycle. Defaults to 1.
cuts_requiredClick count required to complete one cut cycle.
tool_damageDurability damage applied to the tool per cut.
damage_override.chanceOverrides config.yml > stations.chopping_board.cut_damage.chance for this recipe.
damage_override.valueOverrides config.yml > stations.chopping_board.cut_damage.value for this recipe.

damage_override is optional; when omitted, the global cut_damage settings from config.yml are used.

When a player places input on a chopping board, the board takes the whole main-hand stack and stores the accumulated amount in station state; the display entity still shows only one item. Cutting cannot start until the stored amount reaches input.amount. With cuts_required: 1, players can continuously process an already placed batch without re-placing one ingredient at a time.

Wok example

yaml
id: "example_recipe"
display_name: "Simple Stew"

ingredients:
  - item_sources:
      - "minecraft-carrot"
    amount: 1
    stir_rule: "1-3"
  - item_sources:
      - "minecraft-cooked_chicken"
    amount: 1
    stir_rule: "2-3"

heat_level: 1

stir_total:
  min: 2
  max: 5

fault_tolerance: 0
permission: "emakicooking.recipe.simple_stew"

condition:
  type: all_of
  entries:
    - "%player_level% >= 5"
  on_pass:
    actions:
      - 'sendmessage text="<green>Cooking skill check passed.</green>"'
  on_fail:
    actions:
      - 'sendmessage text="<red>Cooking skill level is too low.</red>"'
    block_output: true

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-rabbit_stew"
        amount: 1
    actions:
      - 'sendmessage text="<green>Served successfully.</green>"'
  undercooked:
    outputs:
      - item_sources:
          - "minecraft-mushroom_stew"
        amount: 1
    actions: []
  overcooked:
    outputs:
      - item_sources:
          - "minecraft-dried_kelp"
        amount: 1
    actions: []
  invalid:
    outputs:
      - item_sources:
          - "minecraft-stone"
        amount: 1
    actions: []
FieldDescription
ingredients[].item_sourcesMatching ingredient sources.
ingredients[].amountRequired amount.
ingredients[].stir_ruleSuggested add/stir interval, such as 1-3.
heat_levelRequired heat level.
stir_total.min/maxValid total stir count range.
fault_toleranceAllowed mistake count.

Grinder example

yaml
id: "bone_meal"
display_name: "Ground Bone Meal"

input:
  item_sources:
    - "minecraft-bone"

grind_time_seconds: 6

permission: "emakicooking.recipe.bone_meal"

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-bone_meal"
        amount: 3
    actions:
      - 'sendmessage text="<gray>Grinding finished.</gray>"'
FieldDescription
input.item_sourcesMatching input sources.
grind_time_secondsSeconds required to grind. The grinder advances on the config.yml > stations.grinder.check_delay_ticks cycle.

Steamer example

yaml
id: "steamed_cod"
display_name: "Steamed Cod"

input:
  item_sources:
    - "minecraft-cod"

required_steam: 40

permission: "emakicooking.recipe.steamed_cod"

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-cooked_cod"
        amount: 1
    actions:
      - 'sendmessage text="<aqua>Steaming finished.</aqua>"'
FieldDescription
input.item_sourcesMatching input sources.
required_steamTotal steam that must be consumed to finish the recipe.
requires_previous_stepOptional. Another steamer recipe ID marking this recipe as its follow-up step, used for chained steaming.

Chained example: recipes/steamer/chain_example_recipe.yml uses requires_previous_step: "example_recipe" to feed the previous output into the next step.

Oven example

yaml
id: "baked_potato"
display_name: "Baked Potato"

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>Baking complete.</gold>"'
  perfect:
    outputs:
      - item_sources:
          - "minecraft-golden_carrot"
        amount: 1
  overbaked:
    outputs:
      - item_sources:
          - "minecraft-charcoal"
        amount: 1

The oven chooses output by baking time, perfect heat ratio, and continued heating after completion. For valuable food, show heat and progress clearly in the GUI so players understand why an item became overbaked.

Juicer example

yaml
id: "apple_juice"
display_name: "Apple Juice"

input:
  item_sources:
    - "minecraft-apple"

presses_required: 5

fluid:
  id: "apple_juice"
  display_name: "Apple Juice"
  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>Juicing complete.</aqua>"'

Each completed press adds fluid.amount_ml to the station. Bottling consumes container.serving_ml. For example, the default apple juice adds 180ml per press while a bottle needs 250ml, so one press is not enough to serve once.

Fermentation barrel example

yaml
id: "example_recipe"
display_name: "Apple Cider"

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"

condition:
  type: all_of
  entries:
    - "%player_level% >= 3"
  on_pass:
    actions:
      - 'sendmessage text="<green>Fermentation matured.</green>"'
  on_fail:
    actions:
      - 'sendmessage text="<yellow>Extra fermentation condition failed.</yellow>"'
    block_output: false

result:
  success:
    outputs:
      - item_sources:
          - "minecraft-honey_bottle"
        amount: 1
    actions:
      - 'sendmessage text="<gold>Fermentation complete.</gold>"'
  early:
    outputs:
      - item_sources:
          - "minecraft-potion"
        amount: 1
    actions:
      - 'sendmessage text="<yellow>You collected a half-fermented apple drink.</yellow>"'
  over:
    outputs:
      - item_sources:
          - "minecraft-honey_bottle"
        amount: 1
    actions:
      - 'sendmessage text="<gold>The cider continued fermenting into a sweet vinegar.</gold>"'
FieldDescription
inputsMultiple required input items.
fermentation_time_secondsTime required for normal completion.
fermentation.early_collect.min_progress_ratioMinimum progress ratio for early collection.
fermentation.over_time_secondsTime after normal completion before over-fermentation.
result.early.outputsOutputs for early collection.
result.over.outputsOutputs for the over-fermented branch.
result.success.outputsNormal completion outputs.

Debugging and validation

  • Use /ecooking reload after editing recipes.
  • Use /ecooking inspect hand to verify whether the held item can be resolved by Item Source.
  • Test each recipe with missing permission, missing ingredients, full inventory, correct branch, failure branch, and station state after server restart.
  • For woks, test success, undercooked, overcooked, and invalid.
  • For ovens, test normal completion, perfect completion, and overbaking.
  • For juicers, test insufficient fluid, wrong container, and mixed-fluid attempts.
  • For fermentation barrels, test early collection, normal completion, and over-fermentation.