Skip to main content

Recipe Listeners

Recipe listeners decide which event can trigger a recipe.

Most recipes use the default listener, interact. This means the player right-clicks the structure and Structory checks the recipe.

Some recipes need a different trigger. For example, a recipe that requires killedentity must be triggered by the entity-death listener, because that ingredient only has useful information when an entity death event is happening.

Two places must match

Listeners are configured in two places:

  1. The structure's crafting.listeners section.
  2. The recipe's listeners list.

Both must use the same listener key.

If the structure listens for entity-death but the recipe is registered only for interact, that recipe will not craft from entity deaths.

If the recipe uses entity-death but the structure did not enable the entity-death listener, nothing will trigger it.

Default behavior

If a structure does not define crafting.listeners, Structory enables interact for that structure.

options:
crafting:
recipe: ["default"]
recipe-slots:
offsets:
- "0 1 1"

If a recipe does not define listeners, Structory registers it under interact.

simple_recipe:
name: simple_recipe
ingredients:
item:
type: item
material: APPLE
result:
reward:
type: item
offset: "0 0 0"
item:
material: GOLDEN_APPLE

This is enough for normal right-click crafting.

Important rule when adding crafting.listeners

When you add the listeners section to a structure, include every listener you want enabled.

This enables only entity-death crafting:

options:
crafting:
listeners:
entity-death:
range: 8

Normal right-click crafting is not enabled in that example.

To support both right-click crafting and entity-death crafting, write this:

options:
crafting:
listeners:
interact: {}
entity-death:
range: 8

Available listeners

ListenerWhat triggers itTypical use
interactPlayer right-clicks the structure main block.Standard crafting station.
entity-deathAn entity dies near the structure.Sacrifice altars, mob-kill rituals, kill-based recipes.

interact

The interact listener is the normal crafting mode.

Structure:

options:
crafting:
recipe: ["default"]
listeners:
interact: {}
recipe-slots:
offsets:
- "0 1 1"
- "0 1 -1"

Recipe:

apple_recipe:
name: apple_recipe
listeners:
- interact
discovers: "default"
ingredients:
apple:
type: item
material: APPLE
result:
reward:
type: item
offset: "0 0 0"
item:
material: GOLDEN_APPLE

The listeners list can be omitted from the recipe because interact is already the default.

entity-death

The entity-death listener triggers when an entity dies near a loaded structure instance.

Structure:

options:
crafting:
recipe: ["mob_sacrifice"]
listeners:
interact: {}
entity-death:
range: 8
recipe-slots:
offsets:
- "0 1 1"
- "0 1 -1"

Fields:

FieldDescription
rangeRadius around the structure center. If an entity dies inside this radius, Structory checks recipes registered for entity-death.

Recipe:

mob_sacrifice:
name: mob_sacrifice
listeners:
- entity-death
discovers: "mob_sacrifice"
ingredients:
kill:
type: killedentity
entities:
- ZOMBIE
result:
reward:
type: item
offset: "0 0 0"
item:
material: DIAMOND

This recipe is checked only when an entity dies near the structure.

How the entity-death context works

When entity-death triggers, Structory checks recipes with information from the death event:

  • the dead entity is available to killedentity;
  • the killer is used as the crafting player when the killer is a player;
  • the structure must be loaded;
  • the entity must die within the configured range.

If the entity has no player killer, recipes that require player context may not work as expected.

entity versus killedentity

IngredientMeaningListener requirement
entityChecks for living entities near the structure.Can be used with interact or entity-death.
killedentityChecks the entity that has just died.Requires entity-death.

Use entity when the player should craft while a mob is nearby.

Use killedentity when the player must kill a specific mob near the structure.

Using one recipe with multiple listeners

A recipe can be registered for more than one listener.

special_recipe:
name: special_recipe
listeners:
- interact
- entity-death

Use this only when the ingredients make sense for both contexts.

For example:

  • item, saveditem, experience, vault, and entity can make sense with interact;
  • killedentity only makes sense with entity-death.

Complete kill recipe example

Structure:

soul_altar:
name: "Soul Altar"
check-block: CRYING_OBSIDIAN
options:
crafting:
recipe: ["soul_altar"]
listeners:
interact: {}
entity-death:
range: 8
recipe-slots:
offsets:
- "0 1 1"
- "0 1 -1"

Recipe:

soul_essence:
name: soul_essence
discovers: "soul_altar"
listeners:
- entity-death
ingredients:
kill:
type: killedentity
entities:
- ZOMBIE
catalyst:
type: item
material: AMETHYST_SHARD
result:
essence:
type: item
offset: "0 1 0"
item:
material: ECHO_SHARD
name: "Soul Essence"

The player places the catalyst in a recipe slot, then kills a zombie near the structure.

Troubleshooting

ProblemMost likely cause
Recipe works on right-click but not on mob kill.Recipe is missing listeners: [entity-death] or structure is missing crafting.listeners.entity-death.
Mob kill does nothing.The entity died outside range, the structure instance was not loaded, or the killed entity type does not match.
Normal crafting stopped working after adding entity-death.Add interact: {} inside crafting.listeners.
killedentity never matches.The killer must be a player and the recipe must run from entity-death.
A nearby mob recipe works, but kill recipe does not.You probably used entity instead of killedentity, or the recipe is not registered for entity-death.