Worldgen technique, measured

Everything else here documents what the game accepts. This page documents what authors actually do: measured across 90 published packs spanning 21 distinct pack_format values, from the 1.17 era through 26.2.

The corpus

90 pack archives were read in place, never extracted. 46 carry a data/ tree; the rest are resource packs shipped alongside them. Between them they use 99 distinct feature types across 9,936 uses, 15 placement modifiers across 5,820 uses, and 4 structure processors across 628 uses.

Only type strings, counts and orderings were recorded. No block palette, name, description or coordinate from any pack appears here or in the survey data — those belong to their authors. What is published is a fact about the ecosystem, not anyone's authored work.

The pack_format span is what makes the corpus useful: 13, 15, 18, 22, 26, 34, 38, 46, 48, 55, 61, 64, 69, 71, 81, 84, 88, 89, 94, 101, 107. That crosses the format 48 folder rename in both directions, so a technique visible at both ends is not an artefact of one era.

Placement order is the technique

A placed_feature's placement list is not a set of options. It is a pipeline: each modifier receives the positions the previous one emitted, and may multiply them, move them or discard them. The same modifiers in a different order describe a different pack.

⚠ The two commonest stacks differ only in order

count -> height_range -> in_square -> biome appears 157 times and count -> in_square -> height_range -> biome 126 times. Both are widespread, and they are not interchangeable: whether the vertical range is chosen before or after the horizontal scatter changes which positions survive the later filters. If you copy a stack from another pack, copy its order too.

One ordering rule is near-universal in the corpus: biome appears 1,167 times and is almost always last. It rejects positions whose biome does not list the feature, so running it after the cheap multiplying modifiers wastes the least work — and running it first would filter a single position before the pack had scattered it.

Placement modifierUsesWhat it does to the position stream
count929multiplies — N copies per chunk
in_square892moves — scatters horizontally within the chunk
height_range559moves — picks a Y from a provider
heightmap474moves — snaps Y to a surface
biome1,167filters — drops positions whose biome does not list it
block_predicate_filter493filters — tests the block at the position
rarity_filter450filters — keeps 1 in N at random
random_offset349moves — jitters the position
count_on_every_layer231multiplies — once per exposed layer

The stacks authors actually write

177 distinct orderings appear across the corpus, but the head of the distribution is short: a handful of shapes cover most placed features. These are worth learning as idioms.

Placement stackTimes used
count -> height_range -> in_square -> biome157
count -> in_square -> height_range -> biome126
block_predicate_filter106
count -> in_square -> heightmap -> biome55
rarity_filter -> in_square -> height_range -> biome52
rarity_filter -> in_square -> heightmap -> biome48
count_on_every_layer -> block_predicate_filter -> biome42
count_on_every_layer -> rarity_filter -> biome41
count -> rarity_filter -> in_square -> heightmap -> biome41
random_offset40
count_on_every_layer -> biome30
count27
count -> rarity_filter -> in_square -> height_range -> biome21
rarity_filter -> height_range -> in_square -> biome20

Feature nesting

Features compose by embedding: a selector holds features, which may themselves be selectors. 25 of the 46 data packs nest at all, and the deepest reaches 8 levels of embedding. That is the mechanism behind a single placed feature producing a whole varied thicket rather than one object.

Feature typeUses
simple_state_provider1,951
uniform938
matching_blocks750
weighted_state_provider592
matching_block_tag579
all_of360
block_predicate_filter342
simple_block304
tree253
two_layers_feature_size232
vegetation_patch212
rule_based_state_provider208
matching_block_tag203
ore188

Processor chains

Structure processors are applied in order to a template's blocks. The corpus uses only 4 distinct processor types, and one of them dominates: rule accounts for 571 of 628 uses.

Processor chainTimes used
rule155
rule -> rule115
rule -> rule -> rule28
rule -> gravity16
gravity11
rule -> rule -> rule -> rule9
rule -> rule -> rule -> rule -> rule6
rule -> capped4

The long rule chains are the interesting part. Rather than one processor holding many rules, authors run several rule processors in sequence, because each one sees the output of the last — a block rewritten by the first can be matched again by the second. That is sequencing used deliberately, and it is the same insight as the placement pipeline.

Template pools

Pool element typeUses
single_pool_element6,340
list_pool_element4,634
empty_pool_element267
feature_pool_element113
legacy_single_pool_element35

list_pool_element is used 4,634 times against 6,340 for single_pool_element. A list element applies several templates at one jigsaw slot, in order, so authors are layering pieces on a single anchor rather than authoring every combination as its own template.

What survives publication

⚠ Silent failure in published packs

18 worldgen files across 3 published pack archives have the wrong top-level JSON shape — a list where the game expects an object. The game rejects such a file quietly and carries on, so nothing visibly breaks at load time and the defect ships. The affected archives are successive released versions of the same pack, so it was carried forward across releases without being noticed.

This is the general shape of the danger in data packs: an error that fails loudly gets fixed before release, and an error that fails silently does not. Validate rather than trusting that a pack which loads is a pack that works.

Sources