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
| Folder | Station | Typical use |
|---|---|---|
recipes/chopping_board/ | Chopping Board | Single input, accepts the whole main-hand stack, then uses input amount and repeated cuts for sliced output. |
recipes/wok/ | Wok | Multiple ingredients, heat, stirring, and failure branches. |
recipes/grinder/ | Grinder | Input item plus processing time. |
recipes/steamer/ | Steamer | Input item plus steaming time or chained steps. |
recipes/oven/ | Oven | Single input resolved by baking time, perfect heat ratio, and overbake stage. |
recipes/juicer/ | Juicer | Single input pressed into fluid, then bottled by serving capacity. |
recipes/fermentation_barrel/ | Fermentation Barrel | Multiple inputs resolved by fermentation time, early collection, and over-fermentation. |
Current recommended structure
Current default resources use CoreLib Item Source lists and result branches:
result:
success:
outputs:
- item_sources:
- "minecraft-baked_potato"
amount: 1
actions:
- 'sendmessage text="<gold>Cooking complete.</gold>"'Rules:
- Inputs and outputs should use
item_sourceslists, such asminecraft-carrotorminecraft-glass_bottle. result.<branch>.outputsis always a list, even for one output item.result.<branch>.actionsis placed besideoutputsunder 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, orfermentation.over_output.
Common fields
| Field | Required | Description |
|---|---|---|
id | Yes | Unique recipe id. Prefer matching the file name. |
display_name | Yes | Display name. Supports MiniMessage. |
permission | No | Permission required to use this recipe. Empty means no gate. |
condition | No | Completion/collection condition block. Can include on_pass.actions, on_fail.actions, and on_fail.block_output. |
result.<branch>.outputs | Yes | Output list for this branch. |
result.<branch>.actions | No | Actions executed when this branch outputs. |
Result branches
| Station | Common branches |
|---|---|
| Chopping Board | success |
| Grinder | success |
| Steamer | success; chained recipes may continue through steps. |
| Wok | success, undercooked, overcooked, invalid |
| Oven | success, perfect, overbaked |
| Juicer | success |
| Fermentation Barrel | success, 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
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>"'| Field | Description |
|---|---|
input.item_sources | Matching input sources. |
input.amount | Input amount required and consumed for each completed cut cycle. Defaults to 1. |
cuts_required | Click count required to complete one cut cycle. |
tool_damage | Durability damage applied to the tool per cut. |
damage_override.chance | Overrides config.yml > stations.chopping_board.cut_damage.chance for this recipe. |
damage_override.value | Overrides 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
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: []| Field | Description |
|---|---|
ingredients[].item_sources | Matching ingredient sources. |
ingredients[].amount | Required amount. |
ingredients[].stir_rule | Suggested add/stir interval, such as 1-3. |
heat_level | Required heat level. |
stir_total.min/max | Valid total stir count range. |
fault_tolerance | Allowed mistake count. |
Grinder example
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>"'| Field | Description |
|---|---|
input.item_sources | Matching input sources. |
grind_time_seconds | Seconds required to grind. The grinder advances on the config.yml > stations.grinder.check_delay_ticks cycle. |
Steamer example
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>"'| Field | Description |
|---|---|
input.item_sources | Matching input sources. |
required_steam | Total steam that must be consumed to finish the recipe. |
requires_previous_step | Optional. 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
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: 1The 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
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
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>"'| Field | Description |
|---|---|
inputs | Multiple required input items. |
fermentation_time_seconds | Time required for normal completion. |
fermentation.early_collect.min_progress_ratio | Minimum progress ratio for early collection. |
fermentation.over_time_seconds | Time after normal completion before over-fermentation. |
result.early.outputs | Outputs for early collection. |
result.over.outputs | Outputs for the over-fermented branch. |
result.success.outputs | Normal completion outputs. |
Debugging and validation
- Use
/ecooking reloadafter editing recipes. - Use
/ecooking inspect handto 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, andinvalid. - 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.