CYE: Recipe Control

Quick rating

Community listing page, reviews may not be monitored by the author.

CYE: Recipe Control

No reviews yet

Change, add and disable any recipe or item with one JSON config — applied after datapacks, KubeJS and generated recipes, so your changes always win.

Mod Loaders
Minecraft
26.3 26.2

About

Description

CYE: Recipe Control

Change, add and disable any recipe — and have the last word over datapacks, KubeJS and mods that generate their own recipes.

⚠️ Early development (beta). The mod is still being developed and has so far been tested only on dedicated servers — singleplayer and most game versions have not been tested in game yet. It is not recommended for important worlds or public modpacks yet. Back up your world before using it, and please report any problems.

❗ Fabric / Quilt: Fabric API is required. Without it the mod does not load. (On Quilt, QFAPI works too.) Forge and NeoForge need nothing else.

One small jar for Fabric, Quilt, Forge and NeoForge. No scripting, no datapack per world: you describe the changes in one JSON file and the mod applies them directly to the game's recipe manager every time data is loaded.

Made for CYELauncher (its visual recipe editor writes the config for you), but works on its own on any client or server — the config is plain JSON.


Why

Datapacks are loaded together with everything else, so a mod or a KubeJS script can override them. Some mods (for example GregTech CEu) don't ship recipe files at all — they generate tens of thousands of recipes while the game loads, so there is nothing for a datapack to override.

CYE: Recipe Control runs after the recipe manager has been filled — after vanilla, datapacks, KubeJS scripts and generated recipes — and edits the final result. The changed recipes are then sent to players as usual, so recipe viewers that read the server's recipes (JEI / EMI / REI, the recipe book) should show them too — this part has not been tested in game yet.

Features

  • Replace any recipe by its id — vanilla, modded or generated at runtime.
  • Add new recipes.
  • Disable recipes.
  • Disable items: removes every recipe that produces the item. Optionally also removes recipes where the item is the only way to satisfy an ingredient. Tags are expanded, so disabling minecraft:stick also removes recipes that use #c:rods/wooden (if sticks are the only thing in it), but disabling one kind of planks does not break every #minecraft:planks recipe.
  • A bad recipe doesn't stop loading: a recipe that fails to parse is skipped and reported.
  • Report after every load and /reload — config/cye-recipe-control.report.txt says what was changed, added, removed and what failed and why, plus a self-check that the changes really are in the recipe manager.
  • Full recipe list — config/cye-recipe-control/recipes.txt (id<TAB>type of every recipe in the game, including generated ones). Handy for finding the id of a recipe you want to replace.

Supported versions

Tested on dedicated servers (✅) — replacing, adding, disabling recipes, disabling items, /reload:

Loader Minecraft Status
Forge 1.20.1 ✅ (also with GregTech CEu 7.5 and KubeJS 6)
NeoForge 1.21.1 ✅
NeoForge 26.1 ✅
Fabric / Quilt 1.21.1 ✅
Fabric / Quilt 1.21.4 ✅
Fabric / Quilt 1.21.2 ✅
Fabric / Quilt all other releases 1.20.1 – 1.21.11 should work (name tables included), not tested in game
NeoForge 1.20.5 – 1.21.x should work, not tested in game
  • Fabric / Quilt — Fabric API is required (on Quilt — Fabric API or QFAPI).
  • Java 17+.
  • Older versions (1.19 and below) are not supported.

Installation

  • Server: put the jar in mods/ (on Fabric / Quilt — together with Fabric API) and the config in config/cye-recipe-control.json. Players don't need the mod.
  • Singleplayer: put it in the client's mods/ (the integrated server does the work).
  • CYELauncher: nothing to do — the launcher downloads the latest compatible file from this project, keeps it updated and writes the config when you launch an instance that has recipe changes.
  • Modpacks: you may include the mod in your modpack — while it is in beta, test it with your pack first.

Config — config/cye-recipe-control.json

{
  "recipes": {
    "minecraft:iron_pickaxe": {
      "status": "edited",
      "recipe": {
        "type": "minecraft:crafting_shaped",
        "pattern": ["ADA", " B ", " B "],
        "key": {
          "A": { "item": "minecraft:iron_ingot" },
          "D": { "item": "minecraft:diamond" },
          "B": { "item": "minecraft:stick" }
        },
        "result": { "id": "minecraft:iron_pickaxe", "count": 1 }
      }
    },
    "mypack:sand_to_glass": {
      "status": "new",
      "recipe": {
        "type": "minecraft:smelting",
        "ingredient": { "item": "minecraft:sand" },
        "experience": 0.1,
        "cookingtime": 100,
        "result": { "id": "minecraft:glass", "count": 4 }
      }
    },
    "minecraft:golden_apple": { "status": "disabled" }
  },
  "disabled_items": {
    "minecraft:tnt": { "ingredients": true },
    "minecraft:diamond_sword": { "ingredients": false }
  }
}
  • recipes — key is the recipe id.
    • status: edited / new — recipe is the recipe JSON, exactly as in a datapack for your Minecraft version (the format changed in 1.20.5 and 1.21.2), including mod recipe types such as gtceu:macerator.
    • status: disabled — the recipe is removed.
  • disabled_items — item id → { "ingredients": true | false }. false removes the recipes that produce the item; true also removes recipes that can no longer be crafted without it. Recipes listed in recipes are never touched by disabled_items.

Changes are applied at world/server start and on every /reload.

Report — config/cye-recipe-control.report.txt

# CYE: Recipe Control — 2026-10-21T18:24:11
changed 2, added 1, removed 329, errors 0, verified 4/4 (recipes before 39613, after 39285; reload)
N mypack:sand_to_glass
E minecraft:iron_pickaxe
- minecraft:golden_apple
x minecraft:stick — recipes removed: 327 (result and ingredient)
! mypack:broken — JsonParseException: Pattern references symbol 'X' but it's not defined in the key

(The report text is in Ukrainian in this version.)

Limitations

  • Items are not removed from the game registry (that would break worlds) — a disabled item simply can't be crafted. It can still appear in loot, creative tabs, JEI's item list, etc.
  • Mods that keep their own copy of recipes outside the vanilla recipe manager may still use the original recipe in their machines. Crafting-table / furnace / smithing / stonecutter recipes are always affected.
  • On 1.20.1, machine recipes of mods like GregTech CEu can be disabled by id, but "disable item" can't detect their outputs (there is no recipe codec in 1.20.1).
  • Recipe JSON must match the format of your Minecraft version — the mod does not convert between versions.

How it works (for the curious)

The mod has no compile-time dependency on Minecraft. It finds the game's classes by their official (Mojang) names via reflection; for environments with different runtime names (Fabric intermediary before 1.21.11, Forge 1.20.1 SRG) the jar contains small lookup tables generated from the official mappings. Hooks:

  • Forge / NeoForge — a reload listener registered with the lowest priority, which runs after the recipe manager.
  • Fabric / Quilt — Fabric API server lifecycle events (SERVER_STARTING, END_DATA_PACK_RELOAD), then the recipes are re-sent to players.

Credits

  • Name lookup tables are generated from Mojang's official mappings, Fabric Intermediary and Forge MCPConfig; only the few dozen names the mod uses are included.

License

MIT.