Skip to main content

Creating/Removing recipes in mechanisms

Below is a comprehensive guide for players on how to create custom JSON recipes for the industrialupgrade:universal_recipe system. This document focuses exclusively on the recipe format and usage—no internal algorithm details are included.


1. Basic JSON Structure​

Every Universal Recipe JSON file must follow this format(adding):

{
"type": "industrialupgrade:universal_recipe",
"recipe_type": "<machine_name>",
"isFluidRecipe": <true|false>, // optional; defaults to false
"inputs": [
// array of input components: item, fluid, or tag
],
"outputs": [
// array of output components: item or fluid
],
"params": {
// optional additional parameters (numbers, booleans, strings)
}
}
  • type must always be "industrialupgrade:universal_recipe".
  • recipe_type defines the machine or processing type to which this recipe belongs (e.g., "macerator", "fluid_integrator", "crusher", "alloy_smelter"). The mod registers recipes under this name.
  • isFluidRecipe (boolean) indicates whether the recipe should also be registered as a fluid-centric recipe. If omitted, it defaults to false.
  • inputs is an array of input definitions (items, fluids, or tags).
  • outputs is an array of output definitions (items or fluids).
  • params is an optional object for any additional metadata (e.g., heat value, processing time, flags).

Every Universal Recipe JSON file must follow this format(removing):

{
"type": "industrialupgrade:universal_recipe_delete",
"recipe_type": "<machine_name>",
"isFluidRecipe": <true|false>, // optional; defaults to false
"isRemoveAll": <true|false>, // optional; defaults to false
"output": [
// array of output components: item or fluid
]
}
  • type must always be "industrialupgrade:universal_recipe_delete".
  • recipe_type defines the machine or processing type to which this recipe belongs (e.g., "macerator", "fluid_integrator", "crusher", "alloy_smelter"). The mod registers recipes under this name.
  • isFluidRecipe (boolean) indicates whether the recipe should also be registered as a fluid-centric recipe. If omitted, it defaults to false.
  • isRemoveAll (boolean) indicates whether it is necessary to delete all recipes with such an output`.
  • output is an array of output definitions (items or fluids).

2. Field Descriptions​

2.1. recipe_type​

  • Type: string
  • Purpose: Specifies the machine or processing category. This string must match exactly the identifier registered in the mod’s code (e.g., "macerator" or "fluid_integrator").

Example:

"recipe_type": "fluid_integrator"

Registers the recipe under the fluid_integrator machine.


2.2. isFluidRecipe​

  • Type: boolean (true or false)

  • Purpose: If true, the mod will attempt to register the recipe in both the standard machine registry and the fluid‐only registry. Useful when a recipe involves fluids as primary inputs or outputs.

  • When to use true:

    • If you want the recipe to function as pure‐fluid processing (only fluid inputs or outputs).

    • If you want both a standard item‐based version and a fluid‐based version available. In mixed recipes (items + fluids), setting isFluidRecipe: true ensures the mod creates two registrations:

      1. A standard version using item slots (plus one fluid slot if present).
      2. A fluid‐driven version (all fluids plus one item slot if present).
  • When to omit or set false:

    • Pure item‐to‐item recipes.
    • Mixed recipes where you only want the item‐driven variant.
    • Fluid‐only recipes that should NOT register as pure‐fluid.

Note: Fluid‐only recipes require isFluidRecipe: true. Otherwise, they will not appear in the fluid registry.


2.3. inputs​

An array of objects, each describing exactly one required input. Each object must include:

KeyDescription
typeOne of: "item", "fluid", or "tag".
idFor item: a ResourceLocation of a Minecraft or mod item (e.g., "minecraft:iron_ingot").
For fluid: a ResourceLocation of a fluid (e.g., "minecraft:water").
For tag: a Forge tag name (e.g., "forge:ingots/iron").
amountA positive integer. Defaults to 1 if omitted. For fluids, this is in millibuckets (mB).
  • type: "item" creates an ItemStack with the specified count.
  • type: "fluid" creates a FluidStack (number in mB).
  • type: "tag" creates an ore‐dictionary‐style entry that matches any item in that tag.

Example:

"inputs": [
{ "type": "item", "id": "minecraft:iron_ingot", "amount": 1 },
{ "type": "fluid", "id": "minecraft:water", "amount": 1000 }
]
  • Requires 1× iron ingot and 1000 mB (1 bucket) of water.

2.4. outputs​

An array of objects describing each output. Each object must include:

KeyDescription
typeOne of: "item" or "fluid".
idResourceLocation of the output item or fluid.
amountA positive integer. Defaults to 1. For fluids, this is in mB.
  • tag is not allowed in outputs, only item or fluid.

Example:

"outputs": [
{ "type": "fluid", "id": "minecraft:lava", "amount": 250 },
{ "type": "item", "id": "minecraft:gold_nugget", "amount": 3 }
]
  • Produces 250 mB lava and 3× gold nuggets.

2.5. params (optional)​

An object of arbitrary key‐value pairs. Values can be:

  • Boolean: true or false.
  • Number: integer or decimal.
  • String: plain text.

These parameters become metadata for the machine’s processing logic. Typical uses:

  • Processing heat temperature (heat) as a number.
  • Flags such as unstable: true to mark a dangerous recipe.
  • Custom strings like tier: "high".

Example:

"params": {
"heat": 3000,
"unstable": true,
"note": "high_tier_recipe"
}
  • heat: 3000 → processed as a number.
  • unstable: true → boolean flag.
  • note: "high_tier_recipe" → custom string, available if your machine logic reads it.

You can create recipes for any machine or processing type as long as that name matches a registered identifier in the mod’s code. Common examples include:

Mechanism NameRecipe nameisFluidRecipe?isItemRecipe?Input Item SlotsFluid Item Slotsparams
Alloy Smelteralloysmelter❌️✅2❌️temperature (0-5000)
Enrichmentenrichment❌️✅2❌️rad_amount (integer 0-infinity)
Dyeing Machinepainter❌️✅2❌️❌️
Solarite Plate Manufacturersunnuriumpanel❌️✅2❌️❌️
Nuclear Fusion Reactorsynthesis❌️✅2❌️rad_amount (integer 0-infinity) and percent (integer 0-100)
Modification Stationupgradeblock❌️✅2❌️❌️
Module Removal Stationantiupgradeblock❌️✅1❌️❌️
Improved Alloy Smelteradvalloysmelter❌️✅3❌️temperature (0-5000)
Stone Generatorgenstone❌️✅2❌️❌️
Circuit Manufacturermicrochip❌️✅5❌️temperature (0-5000)
Solarite Transformersunnurium❌️✅4❌️❌️
Wither Manufacturerwither❌️✅7❌️❌️
Advanced Molecular Transformerdoublemolecular❌️✅2❌️energy (double 0-infinity)
Molecular Transformermolecular❌️✅1❌️energy (double 0-infinity)
Chemical Plantplastic❌️✅21❌️
Plastic Plate Machineplasticplate❌️✅11❌️
Solid Matter Transformerconverter❌️✅1❌️quantitysolid (array of double, 8 elements, each 0.00-infinity) — quantitysolid_0: matter quantitysolid_1: sunmatter quantitysolid_2: aquamatterquantitysolid_3: nethermatter quantitysolid_4: nightmatter quantitysolid_5: earthmatter quantitysolid_6: endmatter quantitysolid_7: aermatter
Maceratormacerator❌️✅1❌️❌️
Compressorcompressor❌️✅1❌️❌️
Extractorextractor❌️✅1❌️❌️
Recycler (black list)recycler❌️✅1❌️❌️
Electric Furnace (without Furnace from Minecraft)furnace❌️✅1❌️❌️
Extruderextruding❌️✅1❌️❌️
Cutting Machinecutting❌️✅1❌️❌️
Rolling machinerolling❌️✅1❌️❌️
Autonomous Farmfarmer❌️✅1❌️❌️
Scrap Assemblerscrap❌️✅1❌️❌️
Combined Maceratorcomb_macerator❌️✅1❌️❌️
Mineral Separatorhandlerho❌️✅1❌️temperature (0-5000), input0..inputN (int 0-100)
Rotor Assemblerrotor_assembler❌️✅5❌️❌️
Rod Manufacturerrod_assembler❌️✅6❌️❌️
Ender Transformerendcollector❌️✅1❌️need (double 0-infinity)
Air Transformeraercollector❌️✅1❌️need (double 0-infinity)
Earth Transformerearthcollector❌️✅1❌️need (double 0-infinity)
Nether Transformernethercollector❌️✅1❌️need (double 0-infinity)
Water Transformeraquacollector❌️✅1❌️need (double 0-infinity)
Crystallizerdefaultcollector❌️✅1❌️need (double 0-infinity)
Ore Washing Machineorewashing❌️✅1❌️❌️
Heat centrifugecentrifuge❌️✅1❌️minHeat ( 0-5000)
Mechanical Stampgearing❌️✅1❌️❌️
Water Rotor Assemblerwater_rotor_assembler❌️✅5❌️❌️
Welding Machinewelding❌️✅2❌️temperature (0-5000)
Replicatorreplicator❌️✅10matter (double 0-infinity, 0.5 -> 500 mb, 0.05 -> 50 mb)
Battery Factorybattery_factory❌️✅9❌️❌️
Socket Factorysocket_factory❌️✅6❌️❌️
Active Matter Factoryactive_matter_factory❌️✅1❌️❌️
Laser Polisherlaser❌️✅1❌️❌️
Graphite Crystallizergraphite_recipe❌️✅2❌️❌️
Crystal Growersilicon_recipe❌️✅2❌️❌️
Moonlight Infusersolar_glass_recipe❌️✅1❌️❌️
Stamping Machinestamp_vent❌️✅4❌️❌️
Stamping Machinestamp_plate❌️✅4❌️❌️
Stamping Machinestamp_exchanger❌️✅4❌️❌️
Stamping Machinestamp_coolant❌️✅4❌️❌️
Stamping Machinestamp_capacitor❌️✅4❌️❌️
Reactor Rod Manufacturerreactor_simple_rod❌️✅5❌️❌️
Reactor Rod Manufacturerreactor_dual_rod❌️✅3❌️❌️
Reactor Rod Manufacturerreactor_quad_rod❌️✅7❌️❌️
Radioactive Waste Reprocessorwaste_recycler❌️✅1❌️❌️
Enchanting Machineenchanter_books❌️✅2❌️exp (integer 0-infinity)
Anvilanvil❌️✅1❌️❌️
Upgrade Kit Manufacturerupgrade_machine❌️✅9❌️❌️
Item Divideritem_divider✅✅11❌️
Item-to-Fluid Divideritem_divider_fluid✅✅11❌️
Fluid Adapterfluid_adapter✅✅21❌️
Fluid Integratorfluid_integrator✅✅11❌️
Solid-State Electrolyzersolid_electrolyzer✅✅11❌️
Primitive Latex Extractorsqueezer✅✅11❌️
Advanced Alloy Smelterimpalloysmelter❌️✅4❌️temperature (0-8000)
Perfect Alloy Smelterperalloysmelter❌️✅5❌️temperature (0-10000)
Solid-Fluid Mixersolid_fluid_mixer✅✅11❌️
Primal Fluid Integratorprimal_fluid_integrator✅✅11❌️
Neutronium transformerneutron_separator❌️✅1❌️❌️
Electric Wilson Chamberpositrons❌️✅2❌️❌️
Primal Laser Polisherprimal_laser_polisher❌️✅1❌️❌️
Cyclotron Controllercyclotron❌️✅1❌️chance (integer 0-100), cryogen (consuming cryogen per tick, integer 1-100, default 1), positrons (consuming positrons per tick, integer 1-100, default 1)
Smeltery Furnacesmeltery✅✅11❌️
Solid Mixersolid_mixer❌️✅2❌️❌️
Triple Solid Mixertriple_solid_mixer❌️✅3❌️❌️
Single Fluid Adaptersingle_fluid_adapter✅✅11❌️
Electric Programming Tableprogramming❌️✅1❌️❌️
Electric Electronic Assemblerelectronics❌️✅5❌️❌️
Steam Sharpenersharpener❌️✅1❌️❌️
Radioactive Ore Handlerradioactive_handler❌️✅1❌️random (additional output (not required), integer 0-100)
Industrial Radioactive Element Purifierore_purifier❌️✅1❌️se (consuming solarium per tick, double 0-100)
Quantum Transformerquantummolecular❌️✅2❌️energy (integer 0-infinity)
Electric Cable Insulatorwire_insulator❌️✅2❌️❌️
Crystal Charger/Steam Crystal Chargercharger❌️✅1❌️❌️
Reinforced Anvilstrong_anvil❌️✅1❌️❌️
Refractory Furnacerefractory_furnace✅✅11❌️
Electric Refractory Furnaceelec_refractory_furnace❌️✅1❌️❌️
Electric Brewing Machinebrewing❌️✅2❌️❌️
Sawmillsawmill❌️✅1❌️❌️
Expanded Stone Generatorgenadditionstone❌️✅2❌️❌️
Incubatorincubator✅✅11❌️
Insulatorinsulator✅✅12❌️
RNA Collectorrna_collector✅✅11❌️
Genetic Stabilizergenetic_stabilizer✅✅11❌️
Bee Product Centrifugegenetic_centrifuge❌️✅1❌️❌️
Inoculatorinoculator❌️✅2❌️❌️
Genetic Transposergenetic_transposer❌️✅4❌️❌️
Genetic Polymerizergenetic_polymerizer❌️✅5❌️❌️
Rover Upgrade Stationroverupgradeblock❌️✅2❌️❌️
Rover Assemblerroverassembler❌️✅40❌️❌️
Probe Assemblerprobeassembler❌️✅36❌️❌️
Satellite Assemblersatelliteassembler❌️✅36❌️❌️
Rocket Assemblerrocketassembler❌️✅37❌️❌️
Obsidian Generatorobsidian✅❌️❌️2❌️
Gas Mixergas_combiner✅❌️❌️2❌️
Electrolyzerelectrolyzer✅❌️❌️1❌️
Fluid Coolerrefrigerator✅❌️❌️1❌️
Fluid Separatorfluid_separator✅❌️❌️1❌️
Polymerizerpolymerizer✅❌️❌️1❌️
Oil Purifieroil_purifier✅❌️❌️1❌️
Electric Latex Dryerdryer✅❌️❌️1❌️
Oil Refineryoil_refiner✅❌️❌️1❌️
Improved Oil Refineryadv_oil_refiner✅❌️❌️1❌️
Advanced Oil Refineryimp_oil_refiner✅❌️❌️1❌️
Fluid Mixerfluid_mixer✅❌️❌️2❌️
Fluid Heaterheat✅❌️❌️1temperature (0-1000)
Gas Chambergas_chamber✅❌️❌️2❌️
Smeltery Casingingot_casting✅❌️❌️1❌️
Smeltery Casinggear_casting✅❌️❌️1❌️
Solid-Fluid Integratorsolid_fluid_integrator✅❌️❌️2❌️
Mini Smelterymini_smeltery✅❌️❌️1❌️
Mutatronmutatron✅❌️❌️2❌️
Genetic Reverserreverse_transcriptor✅❌️❌️1❌️
Genetic Replicatorgenetic_replicator✅❌️❌️2❌️

If you add a new machine in your mod and register it under name "my_custom_machine", then set "recipe_type": "my_custom_machine" in your JSON to register there.


4. Example Recipes​

4.1. Fluid Integrator (Item + Fluid → Fluid + Item)​

{
"type": "industrialupgrade:universal_recipe",
"recipe_type": "fluid_integrator",
"isFluidRecipe": true,
"inputs": [
{ "type": "item", "id": "minecraft:iron_ingot", "amount": 1 },
{ "type": "fluid", "id": "minecraft:water", "amount": 5000 }
],
"outputs": [
{ "type": "fluid", "id": "minecraft:lava", "amount": 1000 },
{ "type": "item", "id": "minecraft:gold_ingot", "amount": 1 }
],
"params": { }
}
  • Inputs: 1× iron ingot + 5000 mB water.
  • Outputs: 1000 mB lava + 1× gold ingot.
  • Note: isFluidRecipe: true ensures both a standard and fluid‐driven registration.

4.2. Macerator (Tag → Item) with Parameters​

{
"type": "industrialupgrade:universal_recipe",
"recipe_type": "macerator",
"inputs": [
{ "type": "tag", "id": "forge:ingots/iron", "amount": 1 }
],
"outputs": [
{ "type": "item", "id": "minecraft:gold_ingot", "amount": 1 }
],
"params": {

}
}
  • Inputs: 1× any iron ingot (from tag forge:ingots/iron).

  • Outputs: 1× gold ingot.

  • Parameters:

    • heat = 3000 (machine can read required temperature).
    • unstable = true (flag for potential failure/explosion).
  • isFluidRecipe omitted → defaults to false (standard item‐based recipe).

4.3. Fluid Purifier (Fluid → Fluid Only)​

{
"type": "industrialupgrade:universal_recipe",
"recipe_type": "fluid_purifier",
"isFluidRecipe": true,
"inputs": [
{ "type": "fluid", "id": "industrialupgrade:contaminated_oil", "amount": 3000 }
],
"outputs": [
{ "type": "fluid", "id": "industrialupgrade:clean_oil", "amount": 2500 },
{ "type": "fluid", "id": "industrialupgrade:oil_waste", "amount": 500 }
],
"params": {

}
}
  • Inputs: 3000 mB of contaminated_oil.
  • Outputs: 2500 mB of clean_oil + 500 mB of oil_waste.
  • Note: Pure fluid recipe must include isFluidRecipe: true.

5. Tips & Best Practices​

  1. Units for Fluids: Always specify fluid amount in millibuckets (mB). 1 bucket = 1000 mB.

  2. Forge Tags: When using type: "tag", confirm the tag exists (e.g., forge:ingots/iron). Tags allow recipes to accept any item matching that category.

  3. Parameters (params): Use numeric values for temperatures, speeds, or durations. Boolean flags (true/false) can control special behaviors. Strings are for custom markers—ensure your machine code reads them if needed.

  4. Mixed Recipes (Items + Fluids): Set isFluidRecipe: true to generate both item‐driven and fluid‐driven variants. Without this flag, a fluid‐only recipe will fail to register correctly.

  5. File Path & Naming Convention: Place each recipe under:

    data/industrialupgrade/recipes/<machine_name>/<recipe_name>.json

    For example:

    data/industrialupgrade/recipes/macerator/iron_to_gold.json
  6. Default Amount: If an amount field is omitted, it defaults to 1. However, it’s best practice to always specify amounts explicitly—especially for fluids.

  7. No tag in Outputs: type: "tag" is valid only in inputs, not in outputs.

  8. Case Sensitivity: ResourceLocations and tag names are case‐sensitive. Use all lowercase and the correct namespace (e.g., minecraft:, forge:, or your mod’s namespace).

  9. Debugging Missing Recipes: If a recipe does not appear in‐game, check:

    • The JSON path matches data/industrialupgrade/recipes/<machine_name>/....
    • No typos in keys (type, recipe_type, inputs, outputs).
    • The mod’s .log file for any JSON parsing errors or IllegalArgumentException: Unknown input type.

6. Recipe Template (English)​

{
"type": "industrialupgrade:universal_recipe",
"recipe_type": "<your_machine_name>",
"isFluidRecipe": <true|false>, // remove if no fluids involved
"inputs": [
{
"type": "<item|fluid|tag>",
"id": "<mod_or_minecraft:resource_or_tag>",
"amount": <integer>
}
// ...add as many inputs as needed
],
"outputs": [
{
"type": "<item|fluid>",
"id": "<mod_or_minecraft:resource>",
"amount": <integer>
}
// ...add as many outputs as needed
],
"params": {
// optional key:value pairs for your machine logic
"customSpeed": 150,
"requireHeat": true,
"description": "tier2_recipe"
}
}

Guidance:

  • Replace <your_machine_name> with the exact identifier used in the mod’s code.
  • Omit isFluidRecipe if you only need a standard item‐to‐item recipe.
  • Include at least one type: "fluid" input if you set isFluidRecipe: true for fluid processing.
  • Always validate id strings (e.g., minecraft:iron_ingot or modid:custom_fluid).

7. Conclusion​

With this guide, you now have a clear, step‐by‐step reference for creating:

  • Pure item recipes.
  • Pure fluid recipes.
  • Mixed item + fluid recipes.

Use tags for flexibility, specify fluid amounts in mB, and leverage params for custom machine behavior. Place your JSON files under the correct (to 1.20.1) data/recipes/<machine>/ path, (from 1.21.1) data/recipe/<machine>/ path, and your new recipes will work seamlessly in IndustrialUpgrade. Happy crafting!