Compact Complete Machine Example
This example creates a tiny furnace-like multiblock with one controller, one item input/output port, one structure, and one recipe.
1. Controller
config/mm/controllers/tiny_furnace.json
{
"type": "mm:machine",
"id": "tiny_furnace",
"name": "Tiny Furnace"
}
2. Item port
config/mm/ports/tiny_item_port.json
{
"id": "tiny_item_port",
"controllerIds": "mm:tiny_furnace",
"name": "Tiny Item Port",
"type": "mm:item",
"config": {
"rows": 1,
"columns": 3,
"autoPush": false
}
}
This generates input and output variants of the port: mm:tiny_item_port_input and mm:tiny_item_port_output.
3. Structure
datapacks/tiny_furnace/data/tiny/mm/structures/tiny_furnace.json
{
"name": "Tiny Furnace",
"controllerIds": "mm:tiny_furnace",
"layout": [
[
"III",
"ACA",
"OOO"
]
],
"key": {
"A": { "block": "minecraft:bricks" },
"C": { "block": "mm:tiny_furnace" },
"I": { "port": "mm:tiny_item_port", "input": true },
"O": { "port": "mm:tiny_item_port", "input": false }
}
}
4. Process recipe
datapacks/tiny_furnace/data/tiny/mm/processes/smelt_stone.json
{
"structureId": "tiny:tiny_furnace",
"ticks": 100,
"inputs": [
{
"type": "mm:input/consume",
"ingredient": {
"type": "mm:item",
"item": "minecraft:cobblestone",
"count": 1
}
}
],
"outputs": [
{
"type": "mm:output/simple",
"ingredient": {
"type": "mm:item",
"item": "minecraft:stone",
"count": 1
}
}
]
}
5. Test checklist
- Start the pack once so MM creates its config folders.
- Add the controller and port JSON files under
config/mm. - Add the datapack and enable it in the world.
- Reload with
/reloador restart. - Place the multiblock exactly as the layout describes.
- Insert cobblestone into an input item port.
- Confirm stone appears in an output item port after 100 ticks.
Expected generated IDs
After the config is loaded, the expected generated IDs are:
mm:tiny_furnace
mm:tiny_item_port_input
mm:tiny_item_port_output
Do not use mm:tiny_furnace_controller for the controller block. The controller block id is exactly the generated controller id, mm:tiny_furnace.