Ingredients and components
Counted inputs, custom ingredients and stack components.
NTM recipes use vanilla ingredients, a counted-ingredient wrapper, three NTM custom ingredient types, loader-provided component matchers, and a fluid-content component predicate.
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.
{
"ingredient": "hbm:waste_uranium",
"components": {"hbm:decay_heat": false}
}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 | Required payload | Meaning |
|---|---|---|
hbm:fluid_content | fluid registered fluid ID; positive amount integer in mB | An item exposing at least that quantity of the specified fluid through its fluid-container handling |
hbm:matchers | base vanilla ingredient; component matcher fields | Narrows the base ingredient by exact components and/or registered component predicates |
hbm:narrowed | item item ID; within vanilla ingredient | Names a specific item while retaining the enclosing ingredient restriction |
(Fabric)
Fluid-container ingredient from the generated hbm:jetpack_tank recipe:
{
"fabric:type": "hbm:fluid_content",
"fluid": "hbm:kerosene",
"amount": 1000
}(NeoForge)
Fluid-container ingredient from the generated hbm:jetpack_tank recipe:
{
"neoforge:ingredient_type": "hbm:fluid_content",
"fluid": "hbm:kerosene",
"amount": 1000
}As an NTM counted input, put this object under ingredient; count specifies the number of containers.
Component-matching ingredients
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}
}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.
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_content"] | Fluid-ID string |
components["hbm:fluid_content"] | {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.
© 2026 movblock. Original site text is licensed under CC BY-SA 4.0 unless otherwise noted.