Skip to content

Recipes

Cooking recipes are grouped by station. Each station has different fields because the gameplay flow is different. Keep recipes in station-specific folders so permissions, balancing, and result items remain easy to maintain.

Recipe folders

FolderStationTypical use
recipes/chopping_board/Chopping BoardSingle input, repeated cuts, sliced output.
recipes/wok/WokMultiple ingredients, heat, stirring, and failure branches.
recipes/grinder/GrinderInput item plus processing time.
recipes/steamer/SteamerInput item plus steam or progress requirement.
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.

Common fields

FieldTypeRequiredDescription
idstringYesUnique recipe id. Prefer matching the file name.
display_nameMiniMessage stringYesName shown in menus, messages, and logs.
permissionstringNoPermission required to use the recipe.
input / inputs / ingredientsobject/listYesRequired items, using CoreLib Item Source.
result.<branch>.outputslistYesCurrent recommended result-output list. Use a list even for one output item.
result.<branch>.actionslistNoCurrent recommended action list, placed beside outputs under the result branch.
completion_conditions / condition nodeslist/objectNoExtra checks before a recipe can enter the success/result branch.
structured_presentationobjectNoOptional CoreLib structured presentation config.

Result branch structure

Current Cooking recipes use the unified result.<branch>.outputs/actions structure:

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

Rules:

  • outputs is always a list, even when there is only one output item.
  • actions is placed beside outputs under the same result branch.
  • Wok recipes can use branches such as success, undercooked, overcooked, and invalid.
  • Oven recipes can use branches such as success, perfect, and overbaked.
  • Fermentation barrel recipes can use success, early, and over. fermentation.early_collect.min_progress_ratio and fermentation.over_time_seconds only control timing; outputs still belong under result.early and result.over.
  • Old forms such as result.output, result.outputs, result.actions, perfect_output, overbaked_output, fermentation.early_collect.output, and fermentation.over_output are not the current recommended forms.

Item sources

Inputs and outputs use CoreLib Item Source. Prefer stable short ids or explicit source objects:

yaml
input:
  item_sources:
    - minecraft-wheat

Project short forms may also be used:

yaml
input: mc-wheat
output: emaki_item-noodle

The old minecraft:wheat colon format is not recommended because it can conflict with namespace parsing rules from other plugins.

Chopping board example

yaml
id: sliced_potato
display_name: '<yellow>Sliced Potato'
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>The potato has been sliced.'
FieldDescription
inputItem placed on the chopping board.
cuts_requiredRequired cut count. Keep it reasonable to avoid repetitive fatigue.
outputResult after cutting completes.

Grinder example

yaml
id: wheat_flour
display_name: '<white>Wheat Flour'
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>Grinding complete.'
FieldDescription
grind_time_secondsProcessing time. Test it together with TPS and player wait time.
actions.startActions executed when grinding starts.
actions.completeActions executed when grinding completes.

Steamer example

yaml
id: steamed_fish
display_name: '<aqua>Steamed Fish'
input:
  source: vanilla
  id: COD
  amount: 1
required_steam: 100
output:
  source: vanilla
  id: COOKED_COD
  amount: 1

required_steam is the accumulated steam/progress requirement. Higher values take longer and should be shown in the GUI for valuable recipes.

Wok example

yaml
id: fried_rice
display_name: '<gold>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
  undercooked:
    outputs:
      - source: vanilla
        id: WHEAT
        amount: 1
  overcooked:
    outputs:
      - source: vanilla
        id: CHARCOAL
        amount: 1
  invalid:
    outputs:
      - source: vanilla
        id: BOWL
        amount: 1

Wok fields

FieldDescription
ingredientsIngredient list.
heat_level.minMinimum valid heat level.
heat_level.maxMaximum valid heat level.
stir_totalRequired number of stirs.
fault_toleranceAllowed mistakes before the recipe fails.
result.success.outputsOutputs for correct operation.
result.undercooked.outputsOutputs when heat or progress is too low.
result.overcooked.outputsOutputs when heat is too high.
result.invalid.outputsOutputs for invalid ingredients or state.

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

structured_presentation: {}

Oven fields

FieldDescription
inputItem inserted into the oven.
bake_time_secondsBase time required to finish baking.
baking.perfect_heat.minMinimum heat counted as perfect.
baking.perfect_heat.maxMaximum heat counted as perfect.
baking.perfect_required_ratioRequired ratio of perfect-heat time to total baking time.
baking.overbake_secondsTime after completion before the recipe enters overbake stage.
result.success.outputsNormal completion outputs; branches such as perfect and overbaked use the same outputs/actions structure.

The oven records the baking stage. After base time is reached, the item can be collected; if it keeps heating, it can enter the overbaked stage. For valuable food, use a narrower perfect heat range and show current heat in the GUI.

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>\""

structured_presentation: {}

Juicer fields

FieldDescription
inputItem that can be pressed.
presses_requiredNumber of operations required for one press cycle.
fluid.idFluid id used to prevent mixing different fluids.
fluid.display_nameFluid name shown in GUI and messages.
fluid.amount_mlFluid amount added to the station after each completed press.
container.item_sourcesContainers that can bottle this fluid.
container.serving_mlFluid consumed by one serving. Falls back to station default_serving_ml if omitted.
result.success.outputsOutput items given after bottling.

For example, the default apple juice adds 180ml per press, while a glass bottle needs 250ml. One press is not enough to bottle; the player must accumulate more fluid. The station should only contain one fluid.id at a time to avoid mixing different drinks.

Fermentation barrel example

yaml
id: "apple_cider"
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"

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>\""

structured_presentation: {}

Fermentation barrel fields

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.

Fermentation barrels are useful for “time for value” gameplay: early collection gives a weaker result, normal completion gives the target result, and over-fermentation can turn it into a byproduct or failed result.

Permissions and presentation

Recipes may define permission. If a recipe book or menu is used, show locked or level-gated states to the player. structured_presentation can hand result display to CoreLib structured presentation.

yaml
structured_presentation:
  enabled: true
  template: cooking_result
  placeholders:
    difficulty: 'Normal'
    station: 'Wok'

Balancing tips

  • Keep low-level recipes to one or two ingredients.
  • Wok fault_tolerance should not be too strict, otherwise network latency amplifies failures.
  • Oven perfect heat ranges should not be too narrow unless the GUI clearly shows current heat.
  • Match juicer fluid.amount_ml with serving_ml so players do not press many times without being able to serve.
  • Early fermentation output should be clearly weaker than the normal output.
  • High-value recipes can be gated by permissions, station tier, rare ingredients, and long progress.
  • If results interact with attributes, skills, or strengthening, prefer EmakiItem or PDC data over lore-only identification.

Testing checklist

Test correct ingredients, wrong ingredients, missing permission, full inventory, station reload, and fast clicking for every recipe. Also test every wok branch; oven low heat, perfect heat, and overbake; juicer insufficient fluid, enough fluid, wrong container, and mixed-fluid attempts; fermentation early collection, normal completion, and over-fermentation.

Troubleshooting

Recipe does not load

Check file extension, YAML indentation, duplicated id, correct station folder, and console load logs.

Correct material does not match

Check Item Source type, id case, amount, and PDC matching rules. If another plugin modified the item, inspect the item with a debug command first.

Wok always fails

Check whether heat_level, stir_total, and fault_tolerance are too strict, and verify GUI/interaction code writes heat and stir state correctly.

Oven never completes

Check whether station heat is in the configured advancing range, whether fuel remains, and whether bake_time_seconds is too high.

Juicer cannot bottle

Check whether accumulated fluid reaches container.serving_ml, and whether the held container matches container.item_sources or station defaults.

Fermentation result is unexpected

Check the current fermentation stage. Not reaching early ratio, normal completion, and passing over_time_seconds all affect output selection.