Common fields
Fifteen tables use one shared row schema, called the generic schema here (in the code, GenericRecipe and its
codec GenericRecipeCodec; it is the same schema ntm-next uses, so one file works for both ports). The other tables
have a record of their own, but they build it from the same pieces: the same ingredient forms, item outputs, fluid
stacks and material stacks. This page describes both.
Tables on the generic schema: assembly_machine, precision_assembler, chemical_plant, mixer, blast_furnace,
difurnace, purex, exposure_chamber, fluid_breeder, outgasser, fusion, plasma_forge, rock_mill,
supercomputer, space_assembler. Three of them add fields of their own (fusion, plasma_forge, outgasser),
listed on their pages.
Generic schema
Section titled “Generic schema”{ "type": "hbm:purex", "name": "purex.platemox", "input_items": [{ "type": "hbm:cold", "item": "hbm:waste_plate_mox" }], "input_fluids": [ { "type": "hbm:kerosene", "amount": 500 }, { "type": "hbm:nitric_acid", "amount": 250 } ], "output_items": [ "hbm:powder_sr90_tiny", { "id": "hbm:nugget_pu_mix", "count": 3 }, "hbm:powder_cs137_tiny", { "id": "hbm:nuclear_waste_tiny", "count": 4 } ], "duration": 100, "power": 1500, "icon": { "id": "hbm:waste_plate_mox" }, "name_wrapper": "purex.recycle", "auto_switch_group": "autoswitch.plate", "order": 15}| Field | Type | Required | Default | Meaning |
|---|---|---|---|---|
name |
string | yes | Internal name. Machines save it, the selector shows it. Unique per table (see below). | |
input_items |
list of ingredients | no | none | Item inputs. |
input_fluids |
list of fluid stacks | no | none | Fluid inputs. |
output_items |
list of outputs | no | none | Item outputs, or one weighted choice. |
output_fluids |
list of fluid stacks | no | none | Fluid outputs. |
duration |
int | no | 0 |
Ticks per operation at normal speed. |
power |
long | no | 0 |
Energy (HE) drawn per tick while running. Some machines ignore it; their pages say so. |
icon |
item stack object | no | first output | Icon in the selector and recipe viewers. Must be the object form {"id": ...}. |
custom_localization |
boolean | no | false |
Show the translation of name as the recipe’s title (1.7 setNamed) instead of the icon’s item name. |
name_wrapper |
string | no | none | A translation key that wraps the title, with the title as its argument (purex.recycle gives “Reprocessing of …”). |
blueprint_pools |
list of strings | no | none | Blueprint pools the recipe belongs to. A pooled recipe runs only with a blueprint of one of its pools in the machine. |
auto_switch_group |
string | no | none | Auto-switch group (see below). |
order |
int | no | after all HBM rows | Position in the table; see order. |
input_items_expensive |
list of ingredients | no | none | Replaces input_items while expensive mode is on (1.7 inputItemsEx). |
input_fluids_expensive |
list of fluid stacks | no | none | Replaces input_fluids while expensive mode is on. |
blueprint_pools_528 |
list of strings | no | none | Replaces blueprint_pools while 528 mode is on (1.7 setPools528). |
requires |
list of strings | no | none | Config conditions the row needs to exist; see requires. |
Notes:
- Icon. Without
icon, the recipe shows its first item output; with no item output, a fluid droplet of its first output fluid, else of its first input fluid. - Names. Within one table, two active rows must not share a
name. If they do, the row that comes first inorderis kept and the other is dropped with a log warning. HBM names its rows<prefix>.<thing>(chem.oxygen,ass.acidizer,precass.atomic_clock); the prefix is only a convention. - Blueprint pools. A pool is a string such as
528.artyoralt.plates. The blueprint itemhbm:blueprintscarries one pool in itsblueprint_poolitem data. A recipe with pools is cleared from a machine whose blueprint slot does not hold a blueprint of one of them. HBM’s pool names start withalt.,discover.,secret.or528.. - Auto-switch groups. While a recipe of a group is selected, a machine that finds the first input of another
recipe of the same group in its input slots switches to that recipe. The group string is also a translation key,
shown in the recipe’s tooltip. HBM uses it, for example, for the cyclotron particles in the assembly machine
(
autoswitch.cyclotron) and PUREX fuel families (autoswitch.plate,autoswitch.watz). - Expensive and 528 variants are part of the same row. The row keeps its
name; only the inputs or pools in force change with the config.
Item outputs of generic rows
Section titled “Item outputs of generic rows”output_items entries take these forms:
"output_items": [ "hbm:ingot_desh", { "id": "hbm:part_copper", "count": 8 }, { "id": "hbm:circuit_chip", "count": 8, "chance": 0.75 }, { "id": "hbm:canister_full", "item_data": { "fluid": "hbm:oil", "fluid_amount": 1000 } }, { "tag": "c:nuggets/naquadria", "count": 12 }]| Form | Meaning |
|---|---|
"id" |
One item. |
{"id", "count", "chance", "item_data"} |
count defaults to 1. chance (0 to 1) rolls once per item of the stack, so count: 4, chance: 0.25 averages one item; leave it out for a guaranteed output. item_data is item data. |
{"tag", "count", "chance"} |
The first item of an item tag, looked up when the table loads (1.7’s OreDictionary.getOres(name).get(0)). If the tag is empty the output is empty, so such a row should also require the tag. Note the tag is written without # here. |
A weighted choice gives exactly one of several items. It must be the only entry of output_items, written as a
list inside the list:
"output_items": [ [ { "data": "hbm:circuit_atomic_clock", "weight": 50 }, { "data": { "id": "hbm:broken_item", "item_data": { "broken_item": "hbm:circuit_atomic_clock" } }, "weight": 50 } ]]data is an item stack and weight a number; one entry is picked per operation, by weight.
Requires
Section titled “Requires”requires lists conditions. A row is in its table only while every entry holds. Prefix an entry with ! to
negate it. An entry is either a config flag or # plus an item tag:
| Entry | Holds when |
|---|---|
enable_528 |
528 / enable528Mode is on. |
expensive_mode |
01_general / 1.99_enableExpensiveMode is on. |
enable_528_pressurized |
528 / X528_enable528PressurizedRecipes is on (always off unless 528 mode is on). |
lbsm |
LESS BULLSHIT MODE / enableLessBullshitMode is on (always off in 528 mode). |
lbsm_simple_chemistry |
LBSM and LBSM_recipeSimpleChemistry are on. |
lbsm_simple_centrifuge |
LBSM and LBSM_recipeSimpleCentrifuge are on. |
lbsm_simple_crafting |
LBSM and LBSM_recipeSimpleCrafting are on. |
lbsm_simple_alloy |
LBSM and LBSM_recipeSimpleAlloy are on. |
lbsm_unlock_anvil |
LBSM and LBSM_recipeUnlockAnvil are on. |
lbsm_simple_armor |
LBSM and LBSM_recipeSimpleArmor are on. |
lbsm_simple_tool |
LBSM and LBSM_recipeSimpleTool are on. |
lbsm_simple_medicine |
LBSM and LBSM_recipeSimpleMedicine are on. |
#<tag> |
The item tag has at least one item, e.g. #c:nuggets/naquadria (1.7’s “only if another mod adds this ore dictionary entry” rows). |
The config names are the category and key in config/hbm.cfg. An unknown flag name never holds: the row is left out
with a warning in the log.
"requires": ["enable_528", "!expensive_mode"]Which tables read requires, and when they test it again:
- Generic-schema tables: whenever a flag value changes, at the next use. No reload needed.
centrifuge,soldering: the same, no reload needed.annihilator,anvil_construction: when the table loads (/reload).crystallizerhas a differentrequires: one tag id, without#, as a single string. See its page.- The other tables have no
requires.
The same flags (not the #tag form) also work in the golem:requires key, which every recipe file of any type can
carry; see removing recipes.
Ingredients
Section titled “Ingredients”Item inputs of most tables accept one ingredient object. It has several forms, told apart by their keys.
Item or tag
Section titled “Item or tag”{ "ingredient": "minecraft:clay_ball", "count": 7 }{ "ingredient": "#c:ingots/steel", "count": 64 }| Field | Type | Required | Default | Meaning |
|---|---|---|---|---|
ingredient |
item id, or # and an item tag |
yes | What matches. | |
count |
int | no | 1 |
How many the recipe takes (some machines ignore it; see their pages). |
exact |
boolean | no | false |
Match only an item with exactly the given data (see below). |
item_data |
item data | no | none | The data an exact ingredient must have. Implies exact. |
A plain item ingredient matches the item with any data: "hbm:canister_full" matches a canister of any fluid. To
match one data value, use exact:
{ "ingredient": "hbm:broken_item", "exact": true, "item_data": { "broken_item": "hbm:circuit_atomic_clock" } }"exact": true without item_data matches only the item with no data, for example an unloaded artillery shell
(assembly_machine/shellchlorine.json). A tag cannot be exact.
Autogen material shape
Section titled “Autogen material shape”{ "material": "steel", "shape": "weldedplate", "count": 2 }| Field | Type | Required | Default | Meaning |
|---|---|---|---|---|
material |
material name | yes | An HBM material, by its name (steel, titanium, aluminium, …). |
|
shape |
shape name | yes | One of the shapes below. | |
count |
int | no | 1 |
This matches HBM’s generated per-material items that share one item model and differ only in material: wires, dense
wires, bolts, cast and welded plates, shells, pipes, gun parts and the like. Shape names: nugget, tiny,
fragment, dusttiny, wire, bolt, billet, ingot, gem, crystal, dust, densewire, plate,
castplate, weldedplate, shell, pipe, heavy_component, lightbarrel, heavybarrel, lightreceiver,
heavyreceiver, mechanism, stock, grip, block, ore. It only matches when HBM generates an item for that
material and shape. For ingots, plates, dusts and the like, prefer the c: tag (#c:plates/steel), which also
accepts other mods’ items.
Typed ingredients
Section titled “Typed ingredients”These carry a type key:
type |
Fields | Matches |
|---|---|---|
hbm:fluid_container |
fluid (fluid id), amount (int, mB), count (default 1) |
Any full fluid container that holds amount mB of fluid (1.7’s fluid dictionary entries). |
hbm:fluid_item |
item, fluid, count (default 1) |
That container item holding fluid, at any fill. |
hbm:cold |
item, count (default 1) |
That item when it is not hot: spent fuel that has cooled in a waste drum. |
hbm:any_of |
of (list of ingredients), count (default 1) |
Any one of the listed ingredients, each matched with its own count. |
{ "type": "hbm:fluid_container", "fluid": "hbm:diesel", "amount": 1000 }{ "type": "hbm:fluid_item", "item": "hbm:canister_full", "fluid": "hbm:gasoline" }{ "type": "hbm:cold", "item": "hbm:waste_plate_mox" }{ "type": "hbm:any_of", "of": [{ "ingredient": "#c:ingots/coal" }, { "ingredient": "#c:dusts/coal" }] }Stirling engine
Section titled “Stirling engine”The anvil_smithing, anvil_construction, press, ammo_press, arc_welder, soldering, combination,
particle_accelerator and sawmill tables also accept:
{ "type": "hbm:stirling", "item": "hbm:machine_stirling", "has_cog": false }It matches a Stirling engine with (true) or without (false) its gear. Both fields are required.
Plain item-or-tag strings
Section titled “Plain item-or-tag strings”Some keyed tables take a plain string instead of an ingredient object: an item id or # and a tag, no count
("input": "#c:ingots/iron"). These are shredder, liquefaction, material_distribution, lemegeton, magic
and the pedestal grid. A few fields take a plain item id only, with no tag: breeder and electrolyser_metal
inputs and the cyclotron particle. Each page says which form a field takes.
Item stacks
Section titled “Item stacks”Where a table outputs a single item stack (most record tables), the form is:
| Form | Meaning |
|---|---|
"id" |
One item. |
{"id", "count", "item_data"} |
count defaults to 1; item_data is optional item data. |
Some record tables take an item output without data: "id" or {"id", "count"} only. Each page says which form a
field takes.
Item data
Section titled “Item data”Item data states the few HBM data values a recipe may need, in one form on every Minecraft version (never raw NBT or data components):
| Field | Type | Meaning |
|---|---|---|
fluid |
fluid id | The fluid of a container, fluid icon or fluid-holding item. |
fluid_amount |
int | The fill in mB. |
fluid_pressure |
int | The fluid’s pressure. |
broken_item |
item id string | What a hbm:broken_item is broken from. |
blueprint_pool |
string | The pool of a hbm:blueprints item. |
{ "id": "hbm:fluid_pack_full", "item_data": { "fluid": "hbm:oxygen", "fluid_amount": 32000 } }{ "id": "hbm:blueprints", "item_data": { "blueprint_pool": "528.arty" } }Fluid stacks
Section titled “Fluid stacks”{ "type": "hbm:lightoil_crack", "amount": 500, "pressure": 1 }| Field | Type | Required | Default | Meaning |
|---|---|---|---|---|
type |
fluid id | yes | Any registered fluid: HBM’s (hbm:oxygen), vanilla’s (minecraft:water, minecraft:lava) or another mod’s. |
|
amount |
int | yes | mB. | |
pressure |
int | no | 0 |
Pressure level. A machine’s input tank must hold the fluid at exactly this pressure; fluid is pressurised in the compressor. |
Fluids are named by their vanilla registry id. HBM’s own fluids are hbm:<name> in lower case.
Material stacks
Section titled “Material stacks”Molten metal in the crucible, foundry and arc furnace is counted in quanta: 72 to the ingot, 8 to the nugget.
{ "material": "steel", "amount": 72 }| Field | Type | Required | Meaning |
|---|---|---|---|
material |
material name | yes | An HBM material by name. |
amount |
int, above 0 | yes | Quanta. |