World Registry Configuration
Map a world name to the world type and generation preset it should be created with, so a world reached by name generates correctly instead of falling back to the save default.
A save can hold more than one world. When something sends a player to a world by name — an inter-world travel destination, a portal, a Lua call — and that world does not exist yet, the engine has to create it, and it needs to know what kind of world it is. The world registry is where you say so.
Without a registry entry, a world reached by name is generated with the save’s default preset — so travelling to your intended cave dimension would produce another copy of the overworld. Registering the name fixes the world’s type and preset once, for every save.
You only need this file if your mod adds a world beyond the save’s default one. A mod that only adds blocks, mobs or recipes does not need it.
File Location
Register the file in your mod’s manifest (mods/<YourMod>/<YourMod>.yaml):
world-registry:
The key alone is enough — it defaults to world-registry.yaml in your mod folder. Give it a value only to use a different filename.
Then create the file it points to, relative to your mod’s folder:
mods/<YourMod>/world-registry.yaml
Document Shape
This file is the one config that is keyed by name rather than being a list of entries with a name: field. The top-level worlds: block is a mapping from world name to that world’s definition:
worlds:
<WorldName>:
world-type: <name>
world-type-mod: <ModName>
preset-mod: <ModName>
preset-name: <name>
preset-type: <builder>
The key (<WorldName>) is the world’s name as travel destinations refer to it. It is not namespaced with your mod name — world names are global, so two mods registering the same name collide, and the mod loaded later wins (with its registration logged).
Why this file differs from the catalogs. Every other config wraps a plural list (
items:,mobs:) whose entries carry aname:field. Here the world name is the map key instead. Keep that in mind when copying from another config — there is noname:field inside the definition.
Fields
The five generation fields are required; there are no defaults. An entry missing any of them is skipped with an error naming the world and your mod, and that world falls back to the save default.
| Field | Description |
|---|---|
world-type | Which world-types/<name>.yaml file supplies the world’s global rules — gravity, day length, light levels, fall damage. See World Type Configuration. |
world-type-mod | Which mod owns that world-type file. |
preset-name | Which generation preset to build the terrain with — the filename (without .yaml) under the preset type’s folder. See World Builder Configuration. |
preset-mod | Which mod owns that preset file. |
preset-type | Which builder generates the world. Also selects the folder the preset is read from — see the table below. |
One field is optional:
| Field | Description |
|---|---|
arrival-milestone | The Almanac milestone granted to a player the first time they set foot in this world — a one-shot event milestone (see that page’s metric: event). Omit it for a world whose arrival is not a milestone. A bare id (reached_desolation) is namespaced to your mod; write OtherMod:id to reference another mod’s milestone. An id that names no event milestone is a no-op, logged as a warning. |
Why
world-type-mod/preset-modinstead ofMod:name. Everywhere else in the schema you write a cross-mod reference asOtherMod:thing. This file predates that convention and splits the owning mod into its own key instead. Write your own mod’s name in both fields when the world type and preset are yours — unlike a bare name elsewhere, these do not default to the declaring mod.
preset-type
A closed set of four builders. The value also determines which folder preset-name is looked up in:
preset-type | Builder | Preset read from |
|---|---|---|
Default | Standard surface world — biomes, caves, pools, sky islands | world-builders/default/<preset-name>.yaml |
Cave | Surface-less cave world | world-builders/cave/<preset-name>.yaml |
SkyIsland | Floating-island world | world-builders/sky-island/<preset-name>.yaml |
FlatWorld | Flat banded world | world-builders/flat-world/<preset-name>.yaml |
Matched case- and separator-insensitively, so SkyIsland, skyisland, sky-island and sky_island are the same value. An unrecognized value fails the world’s creation with an error listing the four valid ones.
Example
The shipped registry, which adds a surface-less cave world reachable by the name CaveTest:
worlds:
CaveTest:
world-type: Genesis
world-type-mod: Creation
preset-mod: Creation
preset-name: genesis
preset-type: Cave
Read as: when something sends a player to a world called CaveTest, build it with Creation’s Genesis world type, generated by the Cave builder using Creation’s world-builders/cave/genesis.yaml preset.
Registering several worlds is just more keys under worlds::
worlds:
CaveTest:
world-type: Genesis
world-type-mod: Creation
preset-mod: Creation
preset-name: genesis
preset-type: Cave
SkyRealm:
world-type: Genesis
world-type-mod: Creation
preset-mod: Creation
preset-name: genesis
preset-type: SkyIsland
A world whose arrival is an Almanac milestone adds the optional arrival-milestone field — the player earns it the first time they reach the world:
worlds:
Desolation:
world-type: Desolation
world-type-mod: Creation
preset-mod: Creation
preset-name: desolation
preset-type: Default
arrival-milestone: reached_desolation # granted on first arrival; must be a metric: event milestone
Troubleshooting
A world generates as a copy of the overworld. Its name isn’t registered, so it fell back to the save default. Check that the name in worlds: matches the destination name exactly — it is case-sensitive and not namespaced.
A world fails to generate at all. Check the startup log for the entry: an unknown preset-type, or a preset-name/preset-mod pointing at a preset file that doesn’t exist, both fail loudly and name the world.
An entry is silently absent. A misspelled key inside a definition (world_type for world-type) is rejected with a warning naming the entry, and that world is skipped. Read the startup log before anything else.
Last updated