EpicQuest Dungeoning is a NeoForge 1.21.1 dungeon runner. You author jigsaw pieces, attune a key, open a portal, and the mod generates a fresh layout in a void dimension for that run.
Every keystone that accepts a key gets its own instance, placed 10,000 blocks apart so two parties can run the same dungeon at once. Completing a dungeon extracts that party and wipes that instance.
Play
- Craft an unbound Dungeon Key, then attune it on an anvil with the dungeon’s attunement item.
- Insert the key into a Dungeon Keystone. That portal generates a unique layout and opens.
- Walk through to the Dungeon Player Spawn in that instance.
- Return leaves you at the portal you came from. Other players keep playing.
- Complete (kill, collect, end pad, or
/dungeon complete) starts a 10-second extract for everyone in that instance, closes that portal, and wipes the layout. - If you log off and the instance is wiped before you return, you respawn at your entry portal instead of the empty void.
Author
- Build pieces with vanilla Structure Blocks. Non-
minecraftnames (e.g.mypack:hall_1) save intoconfig/epicquest_dungeoning/dungeons/<id>/structures/. - Write template pools under
worldgen/template_pool/and register the dungeon indungeons.json(jigsawstart pool, size, dead-ends, optional unique rooms). - Put a Dungeon Player Spawn in the start piece. Add a Dungeon End Pad only if completion is
reach_end. - Optional: place Dungeon Event Markers and ship datapack
dungeon_event/event_pollJSON for proximity command polls. - Use
/dungeon jigsaw place <namespace> <piece>to drop a piece with SAVE/CORNER structure blocks, then reload and test through a real portal.
Pack layout
config/epicquest_dungeoning/
dungeons.json
images/ optional key / GUI preview PNGs
dungeons/<dungeon_id>/
structures/<namespace>/.../*.nbt
worldgen/template_pool/<namespace>/*.json
Dungeon events
In Creative, right-click a marker: event id + the block that replaces it on generate (often air). Datapack files:
data/<namespace>/dungeon_event/<path>.json data/<namespace>/event_poll/<path>.json
Proximity fires one weighted command set as the player; ~ is the marker. Each placed marker fires once until wipe or /dungeon event reset. Shared ids can chain with chain_proximity.
Example dungeon entry
{
"id": "quartz_corridors",
"name": "Quartz Corridors",
"description": "A labyrinth of smooth quartz halls.",
"attunement_item": "minecraft:quartz",
"jigsaw": {
"start_pool": "quartz_corridors:anchor",
"start_jigsaw_name": "quartz_corridors:anchor",
"size": 12,
"max_distance_from_center": 160,
"fallback_pool": "quartz_corridors:dead_ends",
"unique_templates": ["quartz_corridors:boss"],
"unique_depth_min_ratio": 0.75,
"unique_depth_max_ratio": 1.0
},
"completion": { "type": "reach_end", "stand_seconds": 3 }
}
Completion
kill_entity— configured entity is killed by someone in that instancecollect_items— required items detected (not consumed)reach_end— stand on a Dungeon End Pad
Omit completion to use return, API, or /dungeon complete only.
Operator commands
/dungeon generate·wipe·reload·list·select/dungeon jigsaw place·piece·pieces·simulate·placeportal·givekey/dungeon complete·return·event reset/event resetall
Also included
- Attunable keys with rich tooltips and optional JEI
- Structure protection, teleport charge, reload / Reset All UI
- Public completion API and NeoForge events
- Layout retries when unique rooms (boss, etc.) cannot be placed
Requirements: Java 21 · NeoForge 1.21.1
For feedbacks and bug reports: Semeth Wiki

