Dimensions & dimension types

The two files behind every world: a dimension/ instance that pairs a generator with a dimension type, and the dimension_type/ file that defines that dimension's physics and behavior.

The dimension instance

A dimension instance ties a dimension type (physics/behavior) to a generator (how terrain and biomes are produced). Creating the file registers a new dimension reachable via /execute in <ns>:<id> as a teleport target. Vanilla overworld/nether/end can be overridden by shadowing their path.

data/<ns>/dimension/<id>.json β€” shape

{
  "type": "<dimension_type id or inline object>",
  "generator": { "type": "<noise|flat|debug>", ... }
}
FieldTypeNotes
typestring (or object)A dimension_type reference: minecraft:overworld, minecraft:the_nether, minecraft:the_end, minecraft:overworld_caves, or your custom <ns>:<id>. As of 1.19 (22w11a) dimension types must be referenced by ID, not inlined.
generatorobjectOne of the three generator types below.
⚠ Version differences
  • The noise generator's seed field was removed in 1.19 (22w11a); the world seed is now universal across all dimensions β€” do not include it.
  • Before 1.19, dimension types could be inlined into the dimension file; they are now separate registry files referenced by ID.
  • Flat generation moved to Y=−64 in 1.18 (was Y=4); layer counts changed accordingly.

Generators: noise, flat, debug

Generator: noise

The standard terrain generator.

FieldTypeNotes
type"minecraft:noise"
settingsstring | objectA noise_settings reference (e.g. minecraft:overworld) or an inline noise-settings object.
biome_sourceobjectChooses biome placement (see below).
seedremovedRemoved in 1.19 (22w11a). The world seed is always used. Do not include it.

Generator: flat (superflat)

FieldTypeDefaultNotes
type"minecraft:flat"
settings.layers[]array of {block, height}requiredRead bottom-to-top starting at the world floor. height is 0–4064; block defaults to minecraft:air.
settings.biomestringminecraft:plainsSingle biome for the whole world.
settings.lakesbooleanfalseIf true, lava lakes (lake_lava_*) generate often, even in biomes that normally lack them.
settings.featuresbooleanfalseIf true, biome placed features generate β€” except the UNDERGROUND_STRUCTURES and SURFACE_STRUCTURES steps, which never generate in flat.
settings.structure_overridesID | tag | listall structure setsWhich structure sets may generate: a structure-set ID, a #tag, or a list of IDs.

Generator: debug

{ "type": "minecraft:debug" } β€” the flat grid of every blockstate; no other fields.

Biome sources

The biome_source object (inside a noise generator) decides which biome goes where.

typeFieldsMeaning
minecraft:multi_noisepreset or biomes[]Climate-driven placement in 6-D noise space. preset = minecraft:overworld or minecraft:nether; or supply an explicit biomes array of parameter points.
minecraft:fixedbiomeOne biome everywhere (single-biome dimension).
minecraft:checkerboardbiomes[], scale (int 0–62, default 2)Biomes tiled in a checkerboard; scale sets tile size (2^scale blocks).
minecraft:the_endThe End's special radial biome layout.

multi_noise parameter points

Each entry in biomes[] is { "biome": <id>, "parameters": {...} }. The six climate parameters temperature, humidity, continentalness, erosion, weirdness each accept either a single float OR a two-element [min, max] range. depth and offset must be single constants (offset is 0–1.0 and shrinks the biome as it moves away from 0). All values are on a −1.0 … 1.0 scale. The generator picks the biome whose point is nearest in 6-D space.

One parameter point

{
  "biome": "minecraft:plains",
  "parameters": {
    "temperature":     [-0.45, -0.15],
    "humidity":        [-1, -0.35],
    "continentalness": [-0.11, 0.3],
    "erosion":         [-0.7799, -0.375],
    "weirdness":       [-1, -0.9333],
    "depth": 0,
    "offset": 0
  }
}
Climate parameterControls
temperature & humidity (vegetation)The biome "flavor".
continentalness (continents)Ocean ↔ inland.
erosionMountainous ↔ flat.
weirdness (ridges)Variant selection & shattered terrain.
depthSurface ↔ cave (only nonzero for cave biomes).

Complete dimension examples

data/example/dimension/my_dim.json β€” a custom noise dimension

{
  "type": "example:my_dim_type",
  "generator": {
    "type": "minecraft:noise",
    "settings": "minecraft:overworld",
    "biome_source": {
      "type": "minecraft:multi_noise",
      "preset": "minecraft:overworld"
    }
  }
}

data/example/dimension/flatland.json β€” a single-biome flat dimension

{
  "type": "minecraft:overworld",
  "generator": {
    "type": "minecraft:flat",
    "settings": {
      "biome": "minecraft:plains",
      "lakes": false,
      "features": false,
      "structure_overrides": ["minecraft:villages"],
      "layers": [
        { "block": "minecraft:bedrock",     "height": 1 },
        { "block": "minecraft:dirt",         "height": 2 },
        { "block": "minecraft:grass_block",  "height": 1 }
      ]
    }
  }
}

Dimension types

A dimension type defines the physics and behavior of any dimension that references it: light, height bounds, coordinate scale, spawning rules, portals/beds, ambient rendering. Vanilla ships overworld, overworld_caves, the_nether, and the_end. It lives at data/<ns>/dimension_type/<id>.json.

Dimension type fields

FieldTypeExample / defaultDescription
ultrawarmboolfalse (OW) / true (Nether)Water evaporates; wet sponge dries; lava flows faster/farther.
naturalbooltrue (OW)If false: beds/respawn anchors don't work normally, zombified piglins spawn from portals, compasses spin.
coordinate_scaledouble1.0 (OW) / 8.0 (Nether)Horizontal scale factor when traveling between this dim and the overworld (0.00001–30000000).
has_skylightbooltrue / falseWhether sky light exists (affects weather & lighting).
has_ceilingboolfalse / true (Nether)Bedrock ceiling; affects weather, respawn, mob spawn.
ambient_lightfloat0.0 (OW) / 0.1 (Nether)Baseline light floor (0 = fully dark shadows, 1 = no ambient darkening).
fixed_timelong (optional)18000 (Nether)If present, locks the time of day (ticks). Omit for a normal day/night cycle.
monster_spawn_light_levelint or objectOW = {uniform 0..7}, Nether = 7Max light level (or a distribution) at which monsters may spawn.
monster_spawn_block_light_limitint (0–15)0 (OW) / 15 (Nether)Block-light ceiling for monster spawning.
piglin_safeboolfalse / true (Nether)If false, piglins zombify over time.
bed_worksbooltrue / false (Nether)Beds set spawn/sleep vs. explode.
respawn_anchor_worksboolfalse (OW) / true (Nether)Respawn anchors set spawn vs. explode.
has_raidsbooltrue / false (Nether)Whether Bad Omen → raids.
logical_heightint384 (OW) / 128 (Nether)Max Y for chorus-fruit teleport & nether-portal placement (≤ height).
min_yint-64 (OW) / 0 (Nether)World floor; multiple of 16 (range −2032…2031-ish).
heightint384 (OW) / 256 (Nether)Total build height; multiple of 16, 16–4064; min_y + height ≤ 2032.
infiniburnblock tag#minecraft:infiniburn_overworldBlocks on which fire burns forever.
effectsstringminecraft:overworld / minecraft:the_nether / minecraft:the_endSelects the client render style (sky, fog, clouds).
has_ender_dragon_fightbool (optional)true for the EndEnables obsidian pillars + end fountain. Present on the End type.
cloud_heightNot a standard 1.21 top-level field. Cloud/sky styling is driven by effects, not a settable cloud_height key. See the note below.
πŸ“Œ Note

monster_spawn_light_level has two valid shapes: an int (Nether = 7) or a distribution object (overworld uniform 0..7). And cloud_height is not a settable top-level field in 1.21 β€” cloud and sky rendering are chosen by effects, which only selects one of the three vanilla renderers.

Vanilla dimension type examples

Grounded 1.21 values, extracted from github.com/misode/mcmeta @ tag 1.21-data-json, data/minecraft/dimension_type/.

data/minecraft/dimension_type/overworld.json

{
  "ambient_light": 0.0,
  "bed_works": true,
  "coordinate_scale": 1.0,
  "effects": "minecraft:overworld",
  "has_ceiling": false,
  "has_raids": true,
  "has_skylight": true,
  "height": 384,
  "infiniburn": "#minecraft:infiniburn_overworld",
  "logical_height": 384,
  "min_y": -64,
  "monster_spawn_block_light_limit": 0,
  "monster_spawn_light_level": {
    "type": "minecraft:uniform",
    "max_inclusive": 7,
    "min_inclusive": 0
  },
  "natural": true,
  "piglin_safe": false,
  "respawn_anchor_works": false,
  "ultrawarm": false
}

data/minecraft/dimension_type/the_nether.json

{
  "ambient_light": 0.1,
  "bed_works": false,
  "coordinate_scale": 8.0,
  "effects": "minecraft:the_nether",
  "fixed_time": 18000,
  "has_ceiling": true,
  "has_raids": false,
  "has_skylight": false,
  "height": 256,
  "infiniburn": "#minecraft:infiniburn_nether",
  "logical_height": 128,
  "min_y": 0,
  "monster_spawn_block_light_limit": 15,
  "monster_spawn_light_level": 7,
  "natural": false,
  "piglin_safe": true,
  "respawn_anchor_works": true,
  "ultrawarm": true
}
⚠ Version differences
  • 26.1.2 (JAR-verified, build 0.19.2): the change is additive, not a replacement β€” the flat flags above (has_skylight, has_ceiling, ambient_light, coordinate_scale, height, min_y, logical_height, infiniburn, monster_spawn_light_level/_block_light_limit, has_ender_dragon_fight) remain valid, so a 1.21-style dimension_type still loads in 26.1.2. Alongside them, 26.1.2 adds an attributes object holding namespaced dimension-level properties: minecraft:visual/{sky_color, fog_color, cloud_color, cloud_height, ambient_light_color} (e.g. cloud_height = 192.33 for the overworld), minecraft:audio/{ambient_sounds, background_music}, and minecraft:gameplay/{bed_rule, respawn_anchor_works, nether_portal_spawns_piglin}. New top-level fields default_clock and timelines also appear. One flat field did drop: natural is no longer a top-level flag (relocated, likely under attributes/gameplay). None of the attributes/timelines additions belong in a 1.21 file, but the flat 1.21 flags coexist rather than being removed. (Exact snapshot that introduced attributes is earlier than 0.19.2 and not pinned here.)
  • Pre-1.19: dimension types could be inlined into the dimension file; they are now separate registry files.

Tricks & workarounds

πŸ’‘ Best practice
  • Reference vanilla noise_settings/dimension_type by ID whenever possible; only fork them when you truly need changes. Fewer inline blobs = fewer version-break surfaces.
  • Keep dimension_type.min_y/height and the referenced noise_settings.noise.min_y/height identical; a mismatch produces missing or duplicated terrain. Also keep logical_height ≤ height.
  • Copy a vanilla type and change one axis at a time; the flag interactions (natural/bed/anchor/piglin) are subtle. Namespace your custom IDs.
🎩 Trick
  • Void dimension: a flat generator with a single air layer + a fixed biome source (e.g. the_void); or, on the noise side, a noise_settings whose final_density is constant 0.
  • Single-biome dimension: multi_noise with one parameter point, or simply fixed.
  • Nether-style compressed dimension: coordinate_scale: 8.0 so it maps 8:1 onto the overworld.
  • Bright void: ambient_light: 1.0 + has_skylight: false for an evenly lit dimension.
🚧 Workaround

Custom sky in a datapack: in 1.21 you cannot freely author sky effects in the dimension type β€” effects only picks one of the three vanilla renderers (overworld/the_nether/the_end). Fully custom skies require the Fabric FabricDimensions modding API or a resource-pack/shader approach; datapack-only custom skies did not arrive until the 26.x attributes visual/* keys. Also: a new dimension does not auto-generate a portal β€” reach it with /execute in <ns>:<id> run tp ... or a custom teleport datapack.

Sources