Worldgen Router lets modpack authors control what other mods may generate, spawn, or drop in each dimension — entirely from config files. No content mods required, no code, no per-mod compatibility patches.
/locate immediately, instead of scanning chunks for something that
can never generateThe starter config ships default = "allow". Drop the jar in and your pack plays exactly as it did.
Nothing is refused until you write a rule saying so.
Curating is one value away:
[world_sets.curated]
overworld = "minecraft:overworld"
nether = "minecraft:the_nether"
end = "minecraft:the_end"
default = "deny"
allow_namespaces = ["minecraft", "yourmod"]
That set now generates only content owned by the namespaces it allows. Dimensions no world set claims behave exactly like vanilla.
Blocking two mods in an otherwise open pack is one line:
deny_namespaces = ["somemod", "othermod"]
Minecraft 1.21.1 and NeoForge 21.1.x only. The range is pinned deliberately: this mod hooks 1.21.1 worldgen internals directly and is not verified anywhere else.
Boots on Minecraft + NeoForge alone — no required dependencies. Allow-lists live in config, so adding or removing a mod from your pack never means rebuilding a jar.
Rules are per category — structure, feature, carver, entity, biome, item — and per
enforcement point. So "curate what generates here, but leave players' inventories alone" is a few
lines, not a wish:
[world_sets.curated.rules.item]
apply_to = ["loot", "trade"]
The same axis is why you can curate the spawn cycle without taking the tools away:
[world_sets.curated.rules.entity]
apply_to = ["natural_spawn"] # mobs stop spawning; /summon and spawn eggs still work
deny_ids > allow_ids > deny_namespaces > allow_namespaces > default
Never guess which rule won:
/worldgenrouter explain structure somemod:some_structure
result DENIED
matched rules.structure.deny_namespaces
priority 3 of 5 - checked after deny_ids, allow_ids did not match
/worldgenrouter status prints the effective rules per category. /worldgenrouter reload re-reads
them live — a bad edit keeps the previous rules rather than breaking your server.
overworld, nether or end template, or supply
your own generator JSON, with an optional fixed seed.extends.This mod fails loudly rather than silently doing nothing — an unknown key, a tag in a rule list, or a
removed key stops the boot and names the file, the world set and the key. Silently ignoring a
misspelled allow_namespace could leave a world set enforcing nothing, and you might not discover it
until terrain had already generated.
#namespace:id) in rule lists are refused for now, instead of silently matching nothing./locate on a tag is not the same as /locate on an ID. A denied ID disappears from the search
at once; a tag usually holds allowed members too, and vanilla keeps looking for those. That search
can run a long time and looks like a freeze. Locate a plain ID before concluding a denial failed.The full setup walkthrough — every config file, category overrides, enforcement points, snapshots, declaring dimensions, both datapack formats, themes, the validation report, and the compatibility matrix — is in the pack-author guide.
Bug reports and pack-author questions: GitHub issues.