Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/hbmmods/hbm-s-nuclear-tech-git/llms.txt

Use this file to discover all available pages before exploring further.

NTM exposes a powerful JSON-based recipe and configuration system that lets server operators and modpack authors override machine recipes, configure nuclear fallout block substitutions, and customise loot pools — all without writing a single line of Java or loading a coremod. The system is built on top of an abstract SerializableRecipe base class, so any machine that extends it can have its recipes loaded, replaced, or cleared entirely from a JSON file. The JSON recipe files live in the config/hbmRecipes/ subfolder of your Minecraft instance and are generated automatically on first launch as editable templates. Custom multiblock machine definitions use a separate file in config/hbmConfig/. Recipes can be reloaded at runtime using /ntmreload, making iteration fast and requiring no server restart for most changes.
If you are running a multiplayer server and want clients to see custom recipes in machine GUIs, enable 0.05_enableServerRecipeSync in HBM_NTM.cfg. See the General Config page for details.

File Locations

NTM uses two separate config directories for JSON data:
<instance>/
└── config/
    ├── hbmRecipes/                      ← Machine processing recipe overrides
    │   ├── hbmCustomMachines.json       ← Processing recipes for custom multiblock machines
    │   ├── hbmPress.json
    │   ├── hbmBlastFurnaceLegacy.json
    │   ├── hbmShredder.json
    │   ├── ... (one file per machine)
    │   └── _hbmPress.json               ← Auto-generated reference templates (do not edit)
    └── hbmConfig/                       ← Machine structure definitions and server runtime config
        ├── hbmCustomMachines.json       ← Custom multiblock machine layout & crafting recipe definitions
        └── hbmServer.json               ← Server runtime variables (edited via /ntmserver)
Files prefixed with _ inside hbmRecipes/ are reference templates written by the mod on first launch (when the non-prefixed file does not exist). They are never read at runtime — they exist solely so you can see the default values. To activate overrides, rename or copy the template, removing the _ prefix.
The hbmCustomMachines.json name is used in both directories for different purposes: config/hbmConfig/hbmCustomMachines.json defines the multiblock structure and crafting recipe for each custom machine, while config/hbmRecipes/hbmCustomMachines.json defines the processing recipes those machines run. Edit both files to fully configure a custom machine.

Machine Recipes — SerializableRecipe System

Machine recipe handling in NTM is centralised through SerializableRecipe, an abstract class that every recipe handler extends. On startup (and on /ntmreload), NTM registers and initialises all handlers in order:
PressRecipes, BlastFurnaceRecipes, ShredderRecipes, SolderingRecipes,
CombinationRecipes, CentrifugeRecipes, CrystallizerRecipes, RefineryRecipes,
VacuumRefineryRecipes, FractionRecipes, CrackingRecipes, ReformingRecipes,
HydrotreatingRecipes, LiquefactionRecipes, SolidificationRecipes,
CokerRecipes, PyroOvenRecipes, BreederRecipes, CyclotronRecipes,
FuelPoolRecipes, MixerRecipes, OutgasserRecipes, FluidBreederRecipes,
CompressorRecipes, ElectrolyserFluidRecipes, ElectrolyserMetalRecipes,
ArcWelderRecipes, RotaryFurnaceRecipes, ExposureChamberRecipes,
ParticleAcceleratorRecipes, AmmoPressRecipes, AnvilRecipes,
PedestalRecipes, AnnihilatorRecipes, CrucibleRecipes,
AssemblyMachineRecipes, ChemicalPlantRecipes, PUREXRecipes,
FusionRecipes, PrecAssRecipes, PlasmaForgeRecipes,
BlastFurnaceRecipesNT, MatDistribution, CustomMachineRecipes, ArcFurnaceRecipes
Each handler reads a dedicated JSON file from config/hbmRecipes/ (the file name is returned by the handler’s getFileName() method). If no override file exists the handler registers hardcoded defaults and writes a _-prefixed template file. The full handler-to-filename mapping is listed at the bottom of this page.

Machine Processing Recipe Structure

Each recipe file in config/hbmRecipes/ contains a top-level recipes array. Each element is a recipe object. Below is the structure used by CustomMachineRecipes (and similarly by all other machine handlers):
{
  "recipes": [
    {
      "recipeKey": "paperPress",
      "recipes": [
        {
          "inputFluids":  [ ["water", 250] ],
          "inputItems":   [ ["item", "hbm:item.powder_sawdust"] ],
          "outputFluids": [],
          "outputItems":  [ ["minecraft:paper", 3, 1.0] ],
          "duration": 60,
          "consumptionPerTick": 10,
          "pollutionType": "SOOT",
          "pollutionAmount": 0.03,
          "radiationAmount": 0,
          "flux": 0,
          "heat": 0
        }
      ]
    }
  ]
}
FieldTypeDescription
recipeKeyStringIdentifies which machine this recipe set belongs to. Must match the recipeKey declared in the machine’s definition in hbmConfig/hbmCustomMachines.json.
inputFluidsArrayList of fluid input stacks. Each entry is [fluidName, amount_mB] or [fluidName, amount_mB, pressure].
inputItemsArrayList of item inputs in AStack format (see below).
outputFluidsArrayList of fluid outputs. Same format as inputFluids.
outputItemsArrayList of item outputs in ItemStack+chance format: [registryName, (count), (meta), (nbtString), chance]. chance is 1.0 for guaranteed output.
durationIntegerProcessing time in ticks.
consumptionPerTickIntegerHE consumed per tick during processing.
pollutionTypeStringType of pollution produced (e.g. "SOOT", "GAS"). Optional.
pollutionAmountFloatAmount of pollution generated per process cycle. Optional.
radiationAmountFloatRadiation generated per cycle (RADs). Optional.
fluxIntegerFlux value for flux-mode machines. Optional.
heatIntegerHeat produced per cycle for heat-mechanic machines. Optional.

Item Stack Formats

NTM uses two different item stack formats in JSON recipes depending on context.

AStack Format (inputs)

Input items use the AStack format, which requires a type identifier as the first element:
["item", "minecraft:iron_ingot"]
Quantity 1, metadata 0.
["item", "hbm:item.ingot_steel", 3, 0]
3× steel ingots, metadata 0. Size and meta are omitted when they are 1 and 0 respectively.

ItemStack+Chance Format (outputs)

Output items use a flat array format — no type identifier prefix:
["minecraft:paper", 3, 1.0]
3× paper with 100% drop chance.
["hbm:item.ingot_steel", 1, 0, 0.5]
1× steel ingot (meta 0) with 50% drop chance. The elements are: [registryName, (count), (meta), (nbtString), chance]. Trailing elements may be omitted when they are defaults (count=1, meta=0, no NBT). The chance value (0.0–1.0) is always the last element.

Custom Machine Definitions — config/hbmConfig/hbmCustomMachines.json

The hbmConfig/hbmCustomMachines.json file defines the physical structure, crafting recipe, and I/O parameters of custom multiblock machines. This is separate from the processing recipes (which go in hbmRecipes/hbmCustomMachines.json). The file is read by CustomMachineConfigJSON at startup and is not affected by /ntmreload — a full restart is required to pick up changes to machine definitions.

Machine Definition Structure

{
  "machines": [
    {
      "recipeKey": "paperPress",
      "unlocalizedName": "paperPress",
      "localizedName": "Paper Press",
      "localization": {
        "de_DE": "Papierpresse"
      },
      "fluidInCount": 1,
      "fluidInCap": 1000,
      "itemInCount": 1,
      "fluidOutCount": 0,
      "fluidOutCap": 0,
      "itemOutCount": 1,
      "generatorMode": false,
      "maxPollutionCap": 100,
      "fluxMode": false,
      "recipeSpeedMult": 1.0,
      "recipeConsumptionMult": 1.0,
      "maxPower": 10000,
      "maxHeat": 0,
      "recipeShape": ["IPI", "PCP", "IPI"],
      "recipeParts": [
        "I", ["dict", "ingotSteel"],
        "P", ["dict", "plateSteel"],
        "C", ["item", "hbm:item.circuit", 1, 0]
      ],
      "components": [
        { "block": "hbm:tile.cm_sheet", "x": -1, "y": 0, "z": 0, "metas": [0] },
        { "block": "hbm:tile.cm_port",  "x":  0, "y": -1, "z": 0, "metas": [0] }
      ]
    }
  ]
}
FieldTypeDescription
recipeKeyStringIdentifies which recipe set this machine processes. Must match the key used in config/hbmRecipes/hbmCustomMachines.json.
unlocalizedNameStringInternal registry name for the machine. Used in NBT and machine lookup.
localizedNameStringDefault display name shown in-game.
localizationObjectOptional locale overrides. Keys are locale codes (en_US, de_DE, etc.), values are translated names.
fluidInCountIntegerNumber of fluid input tanks.
fluidInCapIntegerCapacity of each fluid input tank (mB).
itemInCountIntegerNumber of item input slots.
fluidOutCountIntegerNumber of fluid output tanks.
fluidOutCapIntegerCapacity of each fluid output tank (mB).
itemOutCountIntegerNumber of item output slots.
generatorModeBooleanIf true, input items are consumed when the process begins rather than when it completes.
maxPollutionCapIntegerMaximum pollution this machine can accumulate before it stops processing. Optional; defaults to 0.
fluxModeBooleanEnables flux-based energy consumption mode. Optional; defaults to false.
recipeSpeedMultDoubleMultiplier on recipe duration. 0.5 = twice as fast; 2.0 = twice as slow.
recipeConsumptionMultDoubleMultiplier on energy consumption per recipe.
maxPowerLongInternal energy buffer size (HE).
maxHeatIntegerMaximum heat buffer. Optional; defaults to 0 (no heat mechanic).
recipeShapeString arrayCrafting grid rows for the controller block’s crafting recipe (standard Forge shaped recipe format). Optional.
recipePartsArrayAlternating character key / AStack pairs mapping recipeShape letters to items. Optional.
componentsArrayList of multiblock component block definitions (see below).
Each object in the components array describes one block in the multiblock structure:
FieldTypeDescription
blockStringThe fully-qualified block registry name (e.g. hbm:tile.cm_sheet).
xIntegerX offset from the controller block.
yIntegerY offset from the controller block.
zIntegerZ offset from the controller block.
metasInteger arrayList of accepted block metadata values. The multiblock is valid if the placed block has any of these metas.
Standard custom machine blocks provided by NTM for building multiblock structures:
Registry NameDescription
hbm:tile.cm_blockSolid structural block
hbm:tile.cm_sheetSheet/panel structural block
hbm:tile.cm_portItem/fluid port block

Fallout Config — hbmFallout.json

The hbmFallout.json file in config/hbmRecipes/ controls how nuclear explosions transform blocks in the world. Each entry defines a matching rule and one or more replacement outcomes. The system supports matching by block identity, metadata, material type, opacity, and distance from the explosion centre.

Entry Structure

{
  "entries": [
    {
      "matchesBlock": "minecraft:log",
      "primarySubstitution": [
        ["hbm:waste_log", 0, 1]
      ],
      "maximumDistancePercent": 65.0
    },
    {
      "matchesMaterial": "sand",
      "primarySubstitution": [
        ["hbm:waste_trinitite", 0, 1]
      ],
      "chance": 0.05
    }
  ]
}
FieldTypeDescription
matchesBlockStringRegistry name of the block to match (e.g. minecraft:log). Optional.
matchesMetaIntegerExact metadata value the block must have to match. -1 or absent = any meta.
mustBeOpaqueBooleanIf true, only opaque blocks are matched.
matchesMaterialStringMaterial name to match instead of a specific block. Supported values: grass, ground, wood, rock, iron, anvil, water, lava, leaves, plants, vine, sponge, cloth, fire, sand, circuits, carpet, redstoneLight, tnt, coral, ice, packedIce, snow, craftedSnow, cactus, clay, gourd, dragonEgg, portal, cake, web.
restrictDepthBooleanIf true, the depth counter is decremented when this block is converted (affects layered blast behaviour).
primarySubstitutionArrayList of [blockName, meta, weight] triplets. One is chosen randomly by weight.
secondarySubstitutionsArraySame format as primarySubstitution. Used when the random roll fails the chance check.
chanceDoubleProbability (0.0–1.0) that the primary substitution is used. If the roll fails, secondary substitutions are used instead. Default 1.0.
minimumDistancePercentDoubleMinimum distance from explosion centre (as % of max radius) for this rule to apply. Default 0.0.
maximumDistancePercentDoubleMaximum distance from explosion centre (as % of max radius) for this rule to apply. Default 100.0.
falloffStartFactorDoubleFraction of maximumDistancePercent at which random falloff begins. Default 0.9.

Item Pool Config — hbmItemPools.json

NTM uses named item pools to populate dungeon loot chests and structure containers. The hbmItemPools.json file in config/hbmRecipes/ lets you override any pool to change what items appear and how likely they are.

File Format

{
  "description": "Format: [[itemStack], min, max, weight], ...",
  "pools": {
    "poolName": [
      [ ["item", "hbm:item.ingot_steel"], 1, 5, 10 ],
      [ ["item", "minecraft:gold_ingot"], 1, 3,  5 ],
      [ ["item", "hbm:item.circuit", 1, 2], 1, 1, 2 ]
    ]
  }
}
Each entry in a pool array is:
[ [itemStack], minCount, maxCount, weight ]
PositionTypeDescription
[0]ArrayItem stack in AStack format (see above). The stack’s own count is ignored — use minCount/maxCount instead.
[1]IntegerMinimum number of items to place.
[2]IntegerMaximum number of items to place.
[3]IntegerRelative weight. An item with weight 10 is 10× as likely to be chosen as an item with weight 1.
If hbmItemPools.json exists, it completely replaces all pools defined within it. Pools not present in the file remain unchanged (default values apply). This allows surgical overrides of individual pools without needing to copy the entire default pool list.

Reloading Recipes In-Game

Run /ntmreload as a server operator to reload all JSON recipe files, fluid definitions, item pools, damage resistance tables, and logic block scripts without restarting the server:
/ntmreload
This command re-runs the full SerializableRecipe.initialize() pipeline, which clears all recipe maps, reads every JSON file from config/hbmRecipes/, re-registers defaults for any file that doesn’t exist, and writes fresh template files.
/ntmreload clears and rebuilds all recipe maps. Any players currently using a machine GUI will have their pending recipes invalidated. Advise players to step away from machines before reloading on a live server.
Changes to machine definitions (config/hbmConfig/hbmCustomMachines.json) are not picked up by /ntmreload. A full server restart is required to apply changes to multiblock layouts, I/O counts, or the machine crafting recipe.

Server-Side Recipe Sync

When 0.05_enableServerRecipeSync = true in HBM_NTM.cfg, the server serialises all modified SerializableRecipe handlers into byte streams and sends them to clients as they connect. This ensures clients display the server’s custom recipes in machine GUIs rather than the defaults baked into their local JAR. Recipe sync is disabled by default because it adds connection overhead and is unnecessary in single-player or on servers where all players have identical modpacks.

Handler-to-File Mapping

All SerializableRecipe handlers and the filenames they read from config/hbmRecipes/:
Handler ClassFile in config/hbmRecipes/
CustomMachineRecipeshbmCustomMachines.json
PressRecipes(see template for filename)
BlastFurnaceRecipeshbmBlastFurnaceLegacy.json
ShredderRecipes(see template)
CentrifugeRecipes(see template)
CrystallizerRecipes(see template)
RefineryRecipes(see template)
MixerRecipes(see template)
CompressorRecipes(see template)
ArcWelderRecipes(see template)
AssemblyMachineRecipeshbmAssemblyMachine.json
ChemicalPlantRecipeshbmChemicalPlant.json
FusionRecipeshbmFusion.json
PUREXRecipeshbmPUREX.json
FluidBreederRecipeshbmIrradiationFluids.json
AnnihilatorRecipeshbmAnnihilator.json
(all others)See SerializableRecipe.registerAllHandlers() and the _-prefixed templates generated on first launch.
Each file follows the same { "recipes": [ ... ] } wrapper structure; the contents of each recipe object differ per machine type. Refer to the _-prefixed template files for the exact field names used by each handler.

Build docs developers (and LLMs) love