Ingredients and components
Counted inputs, custom ingredients and stack components.
NTM recipes use vanilla ingredients, a counted-ingredient wrapper, custom ingredient types, loader-provided component matchers, and NTM component predicates.
Counted NTM ingredients
The shared machine input wrapper is:
{
"ingredient": "#c:ingots/steel",
"count": 2
}count defaults to 1 and must be positive. ingredient is a vanilla ingredient. Optional components and predicates fields narrow the stack through vanilla component matchers. Component values use the registered component's value codec; predicates use the registered predicate's value codec. Other fields fail parsing.
{
"ingredient": "hbm:waste_uranium",
"components": {"hbm:decay_heat": false}
}until NTM 1.0.1Applies to NTM 1.0.0.Shown because All revisions is selected.
An ingredient naming items, rather than a tag or custom ingredient, refuses damaged stacks. Other component changes match unless components or predicates constrain them.
since NTM 1.0.1Applies to NTM 1.0.1, 1.0.2, 1.0.3, 1.0.4.Shown because All revisions is selected.
A stack with changed components matches only when its changes are claimed.
Custom ingredients
Use the custom-ingredient form shown for your selected loader. The payload fields below are otherwise the same. Use the shape from the installed jar when nesting one ingredient inside another.
| Type | Payload | Meaning |
|---|---|---|
hbm: | fluid: registered fluid ID; amount: integer in mB, [1, \texttt{i32::MAX}]; optional drain: boolean, default falsesince NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected. | An NTM fluid container other than a fluid pack or refillable equipment, holding exactly that quantity; or another item whose fluid handler can extract exactly that quantity. An NTM container may differ from its defaults only in hbm:; another item must be unmodifiedsince NTM 1.0.1Applies to NTM 1.0.1, 1.0.2, 1.0.3, 1.0.4.Shown because All revisions is selected.. With drain:, see draining containerssince NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected. |
hbm: | base: ingredient; optional components, predicates | Narrows base by exact component values and registered component predicates |
hbm: | item: item ID; within: ingredient | Matches item where within also matches |
since NTM 1.0.1Applies to NTM 1.0.1, 1.0.2, 1.0.3, 1.0.4.Shown because All revisions is selected.
| Type | Payload | Meaning |
|---|---|---|
hbm: | ingredients: ingredient list, length [1, \texttt{i32::MAX}] | Matches when an alternative matches; changed components need a claim from a matching alternative |
hbm: | base: ingredient; optional remainder: boolean, default false | Matches base with only its own claims; remainder: also accepts changes retained by the stack's actual crafting remainder |
NTM wraps the ingredients of its bundled smelting, blasting and hbm:tag_result recipes in hbm:recipe_input.
Fabric · since NTM 1.0.1Applies to NTM 1.0.1, 1.0.2, 1.0.3, 1.0.4 · Fabric.Shown because All revisions is selected.
Ingredient of the generated hbm:basalt_smooth_from_basalt smelting recipe:
{
"fabric:type": "hbm:recipe_input",
"base": "hbm:basalt"
}NeoForge · since NTM 1.0.1Applies to NTM 1.0.1, 1.0.2, 1.0.3, 1.0.4 · NeoForge.Shown because All revisions is selected.
Ingredient of the generated hbm:basalt_smooth_from_basalt smelting recipe:
{
"neoforge:ingredient_type": "hbm:recipe_input",
"base": "hbm:basalt"
}FabricApplies to NTM 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4 · Fabric.Shown because Both loaders is selected.
Fluid-container ingredient from the generated hbm:jetpack_tank recipe:
{
"fabric:type": "hbm:fluid_content",
"drain": true,
"fluid": "hbm:kerosene",
"amount": 1000
}NeoForgeApplies to NTM 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4 · NeoForge.Shown because Both loaders is selected.
Fluid-container ingredient from the generated hbm:jetpack_tank recipe:
{
"neoforge:ingredient_type": "hbm:fluid_content",
"drain": true,
"fluid": "hbm:kerosene",
"amount": 1000
}As an NTM counted input, put this object under ingredient; count specifies the number of containers.
since NTM 1.0.1Applies to NTM 1.0.1, 1.0.2, 1.0.3, 1.0.4.Shown because All revisions is selected.
An unmodified hbm:bdcl also matches a fluid-container ingredient for exactly 1000 mB of hbm:lubricant.
since NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected.
Draining containers
With drain: true, the ingredient matches a container holding at least amount of the fluid whose other component changes survive draining. Crafting with hbm:crafting_shaped or hbm:crafting_shapeless takes amount from the container and leaves it in the grid: an NTM container keeps its remaining content or becomes its empty form, and another item drains through its fluid handler. An unmodified hbm:bdcl still matches 1000 mB of hbm:lubricant and is consumed.
Crafting that discards remainders, such as the Combinator Funnel, refuses a draining ingredient. An input_state rule with preserve on a draining ingredient fails recipe loading.
Component-matching ingredients
until NTM 1.0.4Applies to NTM 1.0.0, 1.0.1, 1.0.2, 1.0.3.Shown because All revisions is selected.
The generated hbm:ajr_boots crafting recipe requires an undamaged hbm:titanium_boots item. Its key.B ingredient is:
(Fabric)
{
"fabric:type": "fabric:components",
"base": "hbm:titanium_boots",
"components": {"minecraft:damage": 0}
}(NeoForge)
{
"neoforge:ingredient_type": "neoforge:components",
"items": "hbm:titanium_boots",
"components": {"minecraft:damage": 0}
}since NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected.
The generated hbm:ajr_plate crafting recipe requires an empty hbm:gas_tank. Its key.T ingredient removes the fluid-content component:
(Fabric)
{
"fabric:type": "fabric:components",
"base": "hbm:gas_tank",
"components": {"!hbm:fluid_content": {}}
}(NeoForge)
{
"neoforge:ingredient_type": "neoforge:components",
"items": "hbm:gas_tank",
"components": {"!hbm:fluid_content": {}}
}NTM counted machine inputs put components beside ingredient in the wrapper shown above.
The hbm:fluid_content component predicate
The predicate checks fluid type only, ignoring quantity. Its value is a fluid-ID string:
{
"ingredient": "hbm:canister",
"predicates": {"hbm:fluid_content": "minecraft:water"}
}An absent fluid-content component is treated as minecraft:empty. This predicate and the custom fluid-container ingredient above have different purposes: use the ingredient to demand a quantity through container handling, or the predicate to match the component's type without demanding a quantity.
since NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected.
The hbm:consume_component predicate
The value is a registered component ID. The predicate matches every stack and claims that whole component, whether changed or removed, so the recipe consumes a stack carrying it. The generated hbm:ajr_helmet recipe accepts a repaired gas mask:
{
"base": "hbm:gas_mask_m65",
"components": {"minecraft:damage": 0},
"predicates": {"hbm:consume_component": "minecraft:repair_cost"}
}This object is the payload of an hbm:matchers ingredient. Machine recipes consuming a charged battery use the same predicate on a counted input:
{
"ingredient": "hbm:battery_pack_battery_lithium",
"predicates": {"hbm:consume_component": "hbm:battery_charge"}
}The hbm:unmodified_gun predicate
The value is {}. The predicate matches a stack without gun state or whose gun state holds only the values an unused gun receives in an inventory: no installed mods, zero wear, an empty magazine, firing mode 0, and an idle or drawing state. It claims the gun-state component. Generated gun-upgrade recipes such as hbm:gun_autoshotgun_shredder require it:
(Fabric)
{
"fabric:type": "hbm:matchers",
"base": "hbm:gun_autoshotgun",
"predicates": {"hbm:unmodified_gun": {}}
}(NeoForge)
{
"neoforge:ingredient_type": "hbm:matchers",
"base": "hbm:gun_autoshotgun",
"predicates": {"hbm:unmodified_gun": {}}
}since NTM 1.0.1Applies to NTM 1.0.1, 1.0.2, 1.0.3, 1.0.4.Shown because All revisions is selected.
Changed component state
A stack has changed state when its components differ from its item's defaults. NTM recipe inputs accept such a stack only when its requirements claim every changed component:
| Requirement | Claims |
|---|---|
components entry | That component |
predicates entry keyed by a component ID that is not also a predicate type, value {} | That component |
minecraft: predicate | minecraft: |
minecraft: predicate | minecraft: when the stack's tag equals the stated tag; typed SNBT such as "{required: keeps numeric tag types |
hbm: predicate | hbm: |
hbm: predicatesince NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected. | The named component |
hbm: predicatesince NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected. | The gun-state component |
| Other predicates | Nothing |
fabric: or neoforge: ingredient | Components whose value equals the stated value |
hbm: ingredient | hbm: of an NTM container; with drain:, every changesince NTM 1.0.4Applies to NTM 1.0.4.Shown because All revisions is selected. |
hbm: | The claims of a matching alternative |
hbm:, hbm:, hbm: | The claims of their matchers or enclosed ingredient |
| Item ID, item tag or other ingredient | Nothing |
A minecraft:container predicate requiring some items claims nothing, so other stored items still refuse the stack. Damage predicates do not claim changes to maximum durability.
NTM counted inputs, NTM crafting recipe types, hbm:recipe_input and hbm:fluid_content apply the rule wherever they are used. The Bricked Furnace, Iron Furnace, Steel Furnace, Electric Furnace, Microwave, Mining Laser and Tungsten Crate apply it to vanilla smelting recipes; the Automatic Crafting Table and Combinator Funnel apply it to crafting recipes.
Crafting also accepts a changed stack whose actual crafting remainder retains the change: through input_state in hbm:crafting_shaped and hbm:crafting_shapeless, and without declaration in other crafting types. The Combinator Funnel discards remainders and does not apply this.
Stack components in outputs
An output template carries components beside id and optional count:
{
"id": "hbm:custom_machine",
"components": {"hbm:custom_machine_type": "example:paper_press"}
}The controller component names the custom-machine definition ID. In a fluid-content component value {type, amount, pressure?}, type is the registered fluid ID, amount is mB, and optional pressure is PU. Exact matching includes all authored fields. The type-only predicate uses a fluid-ID string.
| Context using the same name | Shape |
|---|---|
| Fluid-content ingredient | {loader discriminator, fluid, amount} |
predicates["hbm: | Fluid-ID string |
components["hbm: | {type, amount, pressure?} |
Items use their registered prototype defaults when no patch is supplied. New item identities have separate item IDs; stack state uses registered typed components. Copy stateful component values from a relevant installed example.
since NTM 1.0.2Applies to NTM 1.0.2, 1.0.3, 1.0.4.Shown because All revisions is selected.
Bedrock ore samples
hbm:bedrock_ore_sample stores one numeric amount per kind in the sample's set. The NTM set remains implicit and requires the six fields light, heavy, rare, actinide, nonmetal and crystal. An addon sample also supplies set, a registered set ID, and the amount fields for that set's kinds. The six-field NTM form remains valid.
© 2026 movblock. Original site text is licensed under CC BY-SA 4.0 unless otherwise noted. Built with Fumadocs.