Create Recipe Hooks
Create Recipe Hooks is a server-side library for Minecraft 1.20.1 (Forge and Fabric) that fires events whenever a Create machine finishes processing a recipe, and whenever a Create machine processes a world block: Drill mining, Harvester reaping, Saw felling trees. It provides a unified API so that integration mods - such as quest books, automation scripts, and analytics tools - can react to Create production without writing their own mixins.
What it does
The mod hooks into Create's machines at the bytecode level and fires three events:
- recipeFinished - a Create machine completed a recipe (Basin, Fan, Press, Millstone, Crushing Wheels, Saw, Crafter, Deployer, Spout, Item Drain, Sand Paper, Sequenced Assembly, CEI Printer)
- blockProcessed - a machine processed a world block: one event per block broken by a Mechanical Drill, per plant cut by a Mechanical Harvester, per lone block cut by a horizontal Mechanical Saw
- treeCut - a Mechanical Saw felled a whole tree, with the exact log and leaf counts
Every event carries:
- Source - which machine did the work
- Player attribution - the UUID of the player who placed the machine (for Crushing Wheels: who threw the item, with a fallback to whoever placed the wheels for belt and hopper input). Persisted across server restarts and carried along inside moving contraptions
- Recipe ID, item inputs and outputs, fluid outputs - for recipe events
- Block id, block state, contraption flag, log count - for block events
- Block position - where it happened in the world
Supported machines
| Machine | Source constant | Event |
|---|---|---|
| Basin (Mixing / Compacting) | BASIN | recipeFinished |
| Crushing Wheels | CRUSHING_WHEEL | recipeFinished |
| Mechanical Saw (recipes) | MECHANICAL_SAW | recipeFinished |
| Spout (recipe and bucket filling) | SPOUT_FILLING | recipeFinished |
| Millstone | MILLSTONE | recipeFinished |
| Mechanical Press (belt and world) | MECHANICAL_PRESS | recipeFinished |
| Mechanical Crafter | MECHANICAL_CRAFTER | recipeFinished |
| Deployer | DEPLOYER_BELT | recipeFinished |
| Encased Fan (belt and world) | FAN_BLASTING / FAN_HAUNTING / FAN_SPLASHING / FAN_SMOKING | recipeFinished |
| Item Drain (recipes, buckets, potions) | ITEM_DRAIN_EMPTYING | recipeFinished |
| Sand Paper | SAND_PAPER | recipeFinished |
| Sequenced Assembly (final step) | SEQUENCED_ASSEMBLY | recipeFinished |
| CEI Printer (optional, Forge only) | CEI_PRINTER | recipeFinished |
| Mechanical Drill (stationary and contraption) | MECHANICAL_DRILL | blockProcessed |
| Mechanical Harvester (contraption) | MECHANICAL_HARVESTER | blockProcessed |
| Mechanical Saw, horizontal (stationary and contraption) | MECHANICAL_SAW | treeCut / blockProcessed |
KubeJS scripting, no addons needed
CRH registers its own KubeJS event group. The same scripts run unchanged on Forge and Fabric, with an optional source filter and built-in owner resolution:
CRHEvents.recipeFinished('MILLSTONE', event => {
const player = event.getOwner();
if (!player) return;
player.server.runCommandSilent('give ' + player.name.string + ' minecraft:emerald 1');
});
CRHEvents.treeCut('MECHANICAL_SAW', event => {
// event.getLogCount(), event.getBlockId(), event.getOwner()
});
Ready-to-use script examples (FTB Quests integration, output filtering, per-player counters, drill mining quests, log counting) are available in the README.
Why you might want this
If you are building a quest integration (FTB Quests etc.), you can trigger quest progress the moment a Create machine finishes, attributed to the right player - not just when items land in an inventory. Quests like "smelt 64 iron with a Fan", "mine 500 stone with a Drill" or "fell 50 trees with a Saw" become one short script each.
If you are writing analytics or logging tools for a server, you get a single reliable event stream for all Create production.
This mod does nothing visible on its own. It is a library - you will not see any in-game UI, items, or blocks. Install it when another mod or script requires it. It is server-side: clients without the mod can join a server that has it. For singleplayer, install it in your instance.
Requirements
- Minecraft 1.20.1
- Forge file: Forge 47 or newer, Create 6.0.8 or newer. Also runs on NeoForge 1.20.1, verified on clients and dedicated servers
- Fabric file: Fabric Loader 0.15+, Fabric API, Create Fabric 6.0.8.1 or newer. Works on Quilt
- KubeJS - optional, only for JS scripting (no EventJS or other addons required)
- Create Enchantment Industry - optional soft dependency on Forge; CEI Printer events are only fired when CEI is installed
For developers
Register listeners during mod initialization, identical on both loaders:
CreateRecipeHooks.register(ctx -> {
if (ctx.getSource() == RecipeSource.BASIN) {
// ctx.getRecipeId(), ctx.getItemOutputs(), ctx.getBlockPos(), ...
}
});
CreateRecipeHooks.registerBlockProcessed(ctx -> {
// ctx.getBlockId(), ctx.isContraption(), ctx.getMetadata()
});
CreateRecipeHooks.registerTreeCut(ctx -> {
// ctx.getLogCount(), ctx.getLeafCount()
});
On Forge the events are also posted on the event bus (CreateRecipeFinishedEvent, CreateBlockProcessedEvent, CreateTreeCutEvent); on Fabric they are standard callbacks (CreateRecipeFinishedCallback, CreateBlockProcessedCallback, CreateTreeCutCallback).
A debug mode is available for testing on Forge. Launch with the JVM argument -Dcrh.debug=true to write every recipe completion to logs/crh-events.log.
Full API documentation is available in the per-loader READMEs on the GitHub repository.
License
LGPL-3.0-or-later - free to use in public and private modpacks and as a dependency in other mods. Forks and derivative mods must remain open source under the same license with attribution.