Minecraft uses Aquifers to determine where to place liquids and air. Without aquifers all empty space below the sea-level would be filled with water. Aquifers thus allow caves to be dry.
The global fluid picker is used when aquifers are disabled and in some cases with aquifers enabled.
The global fluid picker is quite simple:
- air above the sea-level
- the default liquid between the sea-level and
y=-54
- lava below
y=-54
If the sea-level is below y=-54
:
- air above the sea-level
- lava below the sea-level
The preliminary surface height the easiest way for the game to calculate the height of the terrain. It is calculated based on the inital_density_without_jaggedness
density function.
Checking from top to bottom, the first height where inital_density_without_jaggedness > 0.390625
is the preliminary surface height.
In vanilla, this height is usually about 8 blocks below the real surface, thus most calculations add 8 to the preliminary surface height.
Thus, for brevity, the following will use surface to refer to "8 blocks above the preliminary surface height".
For each position in the world, there is one of 4 aquifer floodedness states:
- Disabled: In this case the global fluid picker is used. (meaning flooded caves and oceans, no water above sea-level)
- Flooded: In this case, the fluid is placed up to the sea-level and air above. (similar to disabled, but with fluid selection)
- Empty: In this case always air is placed.
- Randomized: In this case, the fluid level is determined randomly. See below. (This case is what most people would usually associate with aquifers)
The following will describe how the floodedness is determined:
- Disabled, if the global fluid picker picks lava.
- Disabled, if the position is at least 12 blocks above the surface.
- Disabled, if the position is at most 12 blocks below the surface (or above) and there is a position nearby* where the surface is below sea-level.
- Empty if
erosion < -0.22499999403953552
anddepth > 0.8999999761581421
(i.e. deep dark region, but hardcoded) - Otherwise, the floodedness is determined based on the value of the
fluid_level_floodedness
density function:- Flooded if
fluid_level_floodedness > min_disabled
(usally 0.8) - Empty if
fluid_level_floodedness <= max_empty
(usually 0.4) - Randomized otherwise.
- Flooded if
* for nearby positions the check happens offset in chunks: {0, 0}, {-2, -1}, {-1, -1}, {0, -1}, {1, -1}, {-3, 0}, {-2, 0}, {-1, 0}, {1, 0}, {-2, 1}, {-1, 1}, {0, 1}, {1, 1}
(yes, this is not symmetric, don't ask me why)
min_disabled
and max_empty
can differ from the usual values if the surface is below the sea-level:
min_disabled
varies linearly from-0.3
at the surface to0.8
64 blocks below the surface.max_empty
varies linearly from-0.8
at the surface to0.4
64 blocks below the surface.
If the floodedness is determined to be Randomized, then the fluid level is determined using the fluid_level_spread
density function.
For this, the world is split into 16x40x16 block cells. Each cell gets a uniform fluid level.
The fluid level is calculated as center_height + fluid_level_spread * 10
where center_height
is the height 20 blocks above the floor of the cell.
The fluid level is then rounded down to the next multiple of 3.
Caution: the fluid_level_spread
density function is sampled at 1/16, 1/40, 1/16 scale.
If the fluid level at the current position is above -10
, the default fluid is always used.
Otherwise, the fluid selection is based on the lava
density function. For this, the world is split into 64x40x64 cells (i.e. 4x1x4 fluid level cells) with each cell given a single fluid.
The fluid is the default fluid if abs(lava) <= 0.3
and lava otherwise.
Caution: the lava
density function is sampled at 1/64, 1/40, 1/64 scale.
TODO [Somehow based on the barrier
density function]