Recipe and data formats
Every Enthalpy recipe type and data map, with the fields each takes, their defaults and a real example.
Enthalpy's recipes and fuel values are ordinary datapack files, so a pack can add, replace or remove any
of them. Every example below is a real file from the mod. Recipes go in
data/<namespace>/recipe/; to replace one of Enthalpy's, use the same path under
data/enthalpy/recipe/ in your datapack. Settings that live in the server config are on
Config tuning instead.
Shared building blocks#
Most fields below use one of these shapes.
| Shape | Written as | Notes |
|---|---|---|
| Ingredient | {"item": "minecraft:cod"} or {"tag": "c:ores/coal"} | Standard ingredient. It must not be empty. A list of ingredients is allowed anywhere an ingredient is. |
| Sized ingredient | {"ingredient": {"tag": "c:sands"}, "count": 1} | An ingredient and how many are used. The ingredient may be a list, to accept alternatives. |
| Output | {"id": "minecraft:coal", "count": 3} or {"tag": "c:dusts/tin", "count": 2} | count defaults to 1. A tag output gives the item your preferred mods choose, and a recipe whose output tag is empty is skipped. |
| Fluid stack | {"id": "enthalpy:ethanol", "amount": 80} | Amounts are in mB. |
| Sized fluid ingredient | {"tag": "c:plantoil", "amount": 100} or {"fluid": "enthalpy:molten_salt", "amount": 1000} | A fluid or fluid tag and the amount used. |
energy is the total FE the recipe costs, a whole number above zero. Leave it out for the
machine's default, which is in each section below. secondary_chance and
byproduct_chance run from 0 to 1 and default to
100%, so a secondary or byproduct you list always
arrives unless you lower the chance. Time per recipe is energy divided by the machine's FE per
tick, which Config tuning explains.
Recipe types#
Triturator: enthalpy:triturator#
One input ground into a result and an optional secondary. Default energy: 4,000 FE.
| Field | Required | Default | Meaning |
|---|---|---|---|
input | Yes | Ingredient. | |
result | Yes | Output. | |
secondary | No | none | Output, delivered to the byproduct slot. |
secondary_chance | No | 100% | Chance of the secondary, 0 to 1. |
energy | No | 4,000 FE | Total FE. |
{
"type": "enthalpy:triturator",
"input": {
"tag": "c:ores/coal"
},
"result": {
"id": "minecraft:coal",
"count": 3
},
"secondary": {
"id": "minecraft:gravel",
"count": 1
},
"secondary_chance": 0.2
}The machine's recipes are on the Triturator page.
Kerf Mill: enthalpy:kerf_mill#
The same fields as the Triturator. Default energy: 2,000 FE. The mill also builds a recipe, with no file, from every crafting recipe that turns one log into planks: half as many planks again, plus a sawdust.
{
"type": "enthalpy:kerf_mill",
"input": {
"tag": "minecraft:planks"
},
"result": {
"id": "minecraft:stick",
"count": 3
},
"secondary": {
"tag": "c:dusts/wood",
"count": 1
},
"secondary_chance": 0.25,
"energy": 1000
}Eddy Smelter: enthalpy:eddy_smelter#
Two sized ingredients alloyed into a result. Default energy: 4,000 FE.
| Field | Required | Default | Meaning |
|---|---|---|---|
first | Yes | Sized ingredient. | |
second | Yes | Sized ingredient. | |
result | Yes | Output. | |
secondary | No | none | Output. |
secondary_chance | No | 100% | Chance of the secondary. |
energy | No | 4,000 FE | Total FE. |
{
"neoforge:conditions": [
{
"type": "neoforge:not",
"value": {
"type": "neoforge:tag_empty",
"tag": "c:ingots/bronze"
}
},
{
"type": "neoforge:not",
"value": {
"type": "neoforge:tag_empty",
"tag": "c:ingots/tin"
}
}
],
"type": "enthalpy:eddy_smelter",
"first": {
"ingredient": [
{
"tag": "c:ingots/copper"
},
{
"tag": "c:dusts/copper"
}
],
"count": 3
},
"second": {
"ingredient": [
{
"tag": "c:ingots/tin"
},
{
"tag": "c:dusts/tin"
}
],
"count": 1
},
"result": {
"tag": "c:ingots/bronze",
"count": 4
},
"energy": 6000
}This one also shows load conditions; see below.
Vortex Separator: enthalpy:vortex_separator#
One input split into items and a fluid. The result, secondary and fluid are each optional, so one recipe can make only an item, only a fluid, or both. Default energy: 3,000 FE.
| Field | Required | Default | Meaning |
|---|---|---|---|
input | Yes | Ingredient. | |
result | No | none | Output. |
secondary | No | none | Output. |
secondary_chance | No | 100% | Chance of the secondary. |
fluid | No | none | Fluid stack, sent to the output tank. |
lava | No | 0 mB | mB of lava drawn from the lava tank as each item finishes. Zero or more. |
energy | No | 3,000 FE | Total FE. |
An item and a fluid (this is the salt-block recipe, which also uses lava):
{
"type": "enthalpy:vortex_separator",
"input": {
"tag": "c:storage_blocks/salt"
},
"fluid": {
"id": "enthalpy:molten_salt",
"amount": 1000
},
"lava": 100,
"energy": 6000
}An item and a secondary, with no fluid:
{
"type": "enthalpy:vortex_separator",
"input": {
"item": "minecraft:magma_cream"
},
"result": {
"id": "minecraft:slime_ball",
"count": 1
},
"secondary": {
"id": "minecraft:blaze_powder",
"count": 1
},
"secondary_chance": 1.0
}The input can also be a combined ingredient. The recipe for any raw fish that is not oily subtracts
enthalpy:oily_fish from c:foods/raw_fish with neoforge:difference; open
data/enthalpy/recipe/vortex_separator/fish/lean.json in the jar to see it.
Distiller: enthalpy:distiller#
One input distilled into a fluid. Default energy: 3,200 FE.
| Field | Required | Default | Meaning |
|---|---|---|---|
input | Yes | Ingredient. | |
result | Yes | Fluid stack. | |
energy | No | 3,200 FE | Total FE. |
{
"type": "enthalpy:distiller",
"input": {
"item": "minecraft:apple"
},
"result": {
"id": "enthalpy:ethanol",
"amount": 80
},
"energy": 3200
}Reaction Vat: enthalpy:reaction_vat#
Two fluids, and an optional catalyst item, combined into a fluid and an optional item. Default energy: 4,000 FE.
| Field | Required | Default | Meaning |
|---|---|---|---|
first | Yes | Sized fluid ingredient, for the first tank. | |
second | Yes | Sized fluid ingredient, for the second tank. | |
catalyst | No | none | Ingredient in the catalyst slot. One is used up each time the recipe runs. With none listed, the recipe needs no catalyst. |
result | Yes | Fluid stack. | |
byproduct | No | none | Output. |
byproduct_chance | No | 100% | Chance of the byproduct. |
energy | No | 4,000 FE | Total FE. |
{
"type": "enthalpy:reaction_vat",
"first": {
"tag": "c:plantoil",
"amount": 100
},
"second": {
"tag": "c:ethanol",
"amount": 50
},
"catalyst": {
"item": "enthalpy:fish_meal"
},
"result": {
"id": "enthalpy:biodiesel",
"amount": 150
},
"byproduct": {
"id": "enthalpy:glycerin"
},
"byproduct_chance": 0.25,
"energy": 4000
}Brine Accretor: enthalpy:brine_accretor#
A stack of items grown into a crystal in molten salt. Default energy: 40,000 FE. The machine takes no tier kits, so its speed is set by its own config rate.
| Field | Required | Default | Meaning |
|---|---|---|---|
input | Yes | Sized ingredient. | |
salt | Yes | Sized fluid ingredient: the salt, and how much of it the crystal drinks. | |
result | Yes | Output. | |
energy | No | 40,000 FE | Total FE. |
{
"type": "enthalpy:brine_accretor",
"input": {
"ingredient": {
"item": "minecraft:magma_block"
},
"count": 1
},
"salt": {
"tag": "c:molten_salt",
"amount": 1000
},
"result": {
"id": "enthalpy:pyric_crystal",
"count": 1
},
"energy": 40000
}Fish mutation: enthalpy:fish_mutation#
What a Spawning Basin makes from a pair of fish and a catalyst. This type has no energy: the Basin's config sets its speed and cost.
| Field | Required | Default | Meaning |
|---|---|---|---|
parent | Yes | Ingredient for one fish of the pair. | |
partner | Yes | Ingredient for the other. The pair may be in either order. | |
catalyst | Yes | Ingredient in the catalyst slot. One is used up when the mutation comes up. | |
result | Yes | The new fish, as an item stack: {"id": "...", "count": 1}. | |
chance | Yes | Chance each breeding mutates, 0 to 1. | |
tier | No | base | The lowest Spawning Basin tier the mutation rolls in: base, tempered, fortified, luminous or harmonic. |
{
"neoforge:conditions": [
{
"type": "neoforge:not",
"value": {
"type": "neoforge:tag_empty",
"tag": "c:nuggets/iron"
}
}
],
"type": "enthalpy:fish_mutation",
"parent": {
"item": "minecraft:cod"
},
"partner": {
"item": "minecraft:cod"
},
"catalyst": {
"tag": "c:nuggets/iron"
},
"result": {
"id": "enthalpy:ferric_cod",
"count": 1
},
"chance": 0.05
}The tier field goes after chance, for example "tier": "fortified". None
of Enthalpy's own mutations set it, so every one of them works in a base Basin. The
custom fish page shows a tiered mutation in full.
Fish soaking: enthalpy:fish_soaking#
A thrown item left in a source block of a fluid absorbs it and becomes something else. This type has no energy.
| Field | Required | Default | Meaning |
|---|---|---|---|
input | Yes | Ingredient. | |
fluid | Yes | A fluid tag, written without a #: "c:creosote". | |
result | Yes | Item stack: {"id": "...", "count": 1}. | |
ticks | No | 5 s | How long it must sit in the fluid, in ticks. |
{
"neoforge:conditions": [
{
"type": "neoforge:mod_loaded",
"modid": "immersiveengineering"
}
],
"type": "enthalpy:fish_soaking",
"input": {
"item": "minecraft:cod"
},
"fluid": "c:creosote",
"result": {
"id": "enthalpy:creosote_cod",
"count": 1
},
"ticks": 100
}Data maps#
A data map attaches a value to an item or a fluid. The file is
data/enthalpy/data_maps/item/<name>.json for items and
data/enthalpy/data_maps/fluid/<name>.json for fluids. It has one object, values,
keyed by ID, or by a tag with a leading #. Entries from different datapacks merge, so your file
adds to Enthalpy's rather than replacing it. To replace an entry, write it with
{"replace": true, "value": {...}}; to remove one, list its key under remove.
All of this is NeoForge's standard data map behaviour.
Caloric fuels: enthalpy:caloric_fuels#
Items with a fixed energy value for the Caloric Engine. Any other item that burns in a furnace is worth its burn time in ticks, times the config's FE per burn tick, times its efficiency; the standard furnace-fuel data map sets the burn time, and Enthalpy uses it for Sawdust.
| Field | Required | Meaning |
|---|---|---|
energy | Yes | Total FE the item gives, a whole number above zero. |
{
"values": {
"minecraft:coal_block": {
"energy": 540000
},
"minecraft:blaze_rod": {
"energy": 80000
},
"minecraft:dried_kelp_block": {
"energy": 100000
},
"minecraft:lava_bucket": {
"energy": 200000
}
}
}Igneous, ignition and kettle fuels#
Three maps for the three fluid engines: enthalpy:igneous_fuels,
enthalpy:ignition_fuels and enthalpy:kettle_fuels. All three have one field, and
all three are keyed by fluid or fluid tag.
| Field | Required | Meaning |
|---|---|---|
energy_per_bucket | Yes | Total FE one bucket (1,000 mB) gives, a whole number above zero. |
The Igneous Engine's map, in full:
{
"values": {
"#minecraft:lava": {
"energy_per_bucket": 200000
}
}
}The Ignition Engine's map is keyed by tags such as c:crude_oil, c:ethanol and
c:biodiesel, so another mod's fuel works as soon as it carries the right tag. The Kettle
Engine's map holds c:steam. The values are on the
fuels reference.
Fish yields: enthalpy:fish_yields#
Makes a fish a resource fish: an Ecotone breeding it gives a resource instead of a young fish, some of the time.
| Field | Required | Default | Meaning |
|---|---|---|---|
item | Yes | Output: the resource, as an item or a tag. | |
chance | Yes | Chance a breeding that does not copy the fish gives the resource, 0 to 1. | |
fish_chance | No | 0 | Chance a breeding makes another of the fish instead, 0 to 1. At 0 the fish never copies itself. |
A fish with no entry breeds copies of itself every time. A Spawning Basin also uses fish_chance
for a resource fish, and breeds a copy only that often. An excerpt:
{
"values": {
"enthalpy:ferric_cod": {
"item": {
"id": "minecraft:iron_nugget",
"count": 1
},
"chance": 0.66,
"fish_chance": 0.0991
},
"enthalpy:pewter_perch": {
"item": {
"tag": "c:nuggets/tin",
"count": 1
},
"chance": 0.75,
"fish_chance": 0.1111
}
}
}Fish ammo: enthalpy:fish_ammo#
What a fish does when fired from the Haddock Howitzer. Everything is optional; a fish with no entry fires plain.
| Field | Required | Default | Meaning |
|---|---|---|---|
damage | No | 0 | Added to the shot's damage. Can be negative. |
fire_seconds | No | 0 | Seconds the target is set alight, 0 to 60. |
effects | No | none | A list of standard mob effect objects (id, duration in ticks, and optionally amplifier). |
{
"values": {
"#c:foods/cooked_fish": {
"damage": -3
},
"minecraft:pufferfish": {
"effects": [
{
"id": "minecraft:poison",
"duration": 120
}
]
},
"enthalpy:volt_puffer": {
"effects": [
{
"id": "minecraft:poison",
"duration": 120
}
]
},
"enthalpy:candlefish": {
"fire_seconds": 4
}
}
}Load conditions#
Enthalpy ships recipes for metals and materials from other mods, so most of those files carry
neoforge:conditions and only load when the mod or tag exists. Put a neoforge:conditions
list at the top of a recipe file to do the same. Enthalpy uses two conditions:
neoforge:mod_loadedwith amodid: used for content that belongs to one mod, such as a crystal that needs Allthemodium, or a soaking recipe that needs Immersive Engineering.neoforge:notwrappingneoforge:tag_emptywith atag: the recipe loads only when the tag has something in it. A recipe lists one for each tag it reads or writes, as the bronze recipe above does for its ingot and for tin.
The conditions are separate from the empty-tag check at use time. A recipe whose output tag turns out to be empty is skipped even without a condition; the conditions stop a recipe loading at all, so it never shows in JEI. A mod condition example, from the Allthemodium crystal recipe:
{
"neoforge:conditions": [
{
"type": "neoforge:mod_loaded",
"modid": "allthemodium"
}
],
"type": "enthalpy:brine_accretor",
"input": {
"ingredient": {
"tag": "c:storage_blocks/allthemodium"
},
"count": 1
},
"salt": {
"tag": "c:molten_salt",
"amount": 64000
},
"result": {
"id": "enthalpy:allthemodium_crystal",
"count": 1
},
"energy": 400000
}Conditions go on data map entries only in NeoForge's wrapped form,
{"value": {...}, "neoforge:conditions": [...]}. Enthalpy's own data maps do not use them.