Troubleshooting
Startup crash: mm:mm:<id> or ResourceLocationException
If startup fails with an error like:
ResourceLocationException: Non [a-z0-9/._-] character in path of location: mm:mm:big_sieve_basic
check your KubeJS startup registrations. These events expect a bare MM id/path in event.create(...):
MMEvents.registerControllers(event => event.create('coke_oven'))
MMEvents.registerExtraBlocks(event => event.create('basic_circuit'))
MMEvents.registerPorts(event => event.create('item_port'))
Do not pass mm:coke_oven, mm:basic_circuit, or mm:item_port to those startup registration events. The mod registers generated blocks/items under the mm namespace internally. Structures and process recipes are different: use full resource ids there, such as expert:coke_oven or expert:coke_oven/charcoal.
The controller block exists but the structure will not form
Check these first:
- The structure file is under
data/<namespace>/mm/structures/. controllerIdscontains the controller id, not the block registry name unless those happen to match.- Every character used in
layouthas a corresponding entry inkey. - Air is represented by a space character in layout strings, not by a key entry.
- Port pieces use the correct input/output side.
input: truerequires an input port;input: falserequires an output port. - If using
portType, confirm the port configtierRanksatisfiesminTierandmaxTier. - If using blockstate
properties, confirm the placed block has exactly those property values.
Recipes show in JEI but do not run
Check:
structureIdexactly matches the structure id.- The structure is currently formed.
- Inputs are available in input ports.
- Outputs have room in output ports.
- Conditions pass, for example dimension/weather.
- Energy/fluid/chemical units are large enough for the recipe.
- If
per_tick = true, the port must satisfy the amount every tick, not just once.
Item NBT recipe does not match
Use nbt as a JSON object or nbt_snbt as a string. Start with weak/default matching, then switch to nbt_match: "strong" only when you need an exact match.
Auto-output does nothing
Only compatible ports support autoPush. Set it on the port config:
"config": {
"rows": 3,
"columns": 3,
"autoPush": true
}
If omitted, the value comes from portsAutoExtractByDefault in mm-common.toml.
Too much server cost
Use these config levers:
structureValidationRate = 10
maxParallelRecipes = 5
Increasing structureValidationRate makes controllers re-check less often. asyncValidation is present in the config file, but verify its behavior against the exact build you are shipping. Reducing parallelism and large recipe throughput can also help.
After editing structures, old controllers behave weirdly
Try:
/mm reform
This refreshes/reforms controller state for controllers in loaded chunks around players.