26.4 Snapshot 2 pack formats: 122.1, a new predicate and a shader rename

Key takeaways

Every snapshot that touches packs makes somebody’s weekend longer. This one is additive rather than destructive, which is the good kind, but there are three specific changes worth knowing before you open your pack.

Terrain and sky in a Minecraft test world

122.1, not 123

The data pack version going to 122.1 rather than 123 is itself information. A point release signals that existing packs should keep loading – nothing was renamed out from under you, nothing was removed. Compare that to the whole-number bumps earlier in the cycle, each of which broke something.

Practically: if your pack declared 122.0, it will still load. You only need to bump if you want the new features.

The new environment attribute

minecraft:visual/has_sky_occluder is a boolean that determines whether the sky occluder is enabled for an environment. The occluder hides the sun, moon and stars behind the bottom half of the skybox, fading in fog colour at a smooth border.

Defaults are true in the Overworld and false in the Nether and the End, and the value is not interpolated – it flips rather than blending. For custom dimensions this is a one-line decision: does your dimension have a horizon that celestial objects should sit behind?

The answer is usually yes for anything sky-like and no for anything enclosed. If you are building a dimension with a ceiling, leave it off; the occluder assumes an open horizon and will look wrong without one. Dimension authors working from the dimension worldgen side should treat this as part of the environment definition rather than an afterthought.

below_heightmap

The new predicate checks whether the height of a position is below a given heightmap value. The format takes a single field, heightmap, naming the heightmap type to compare the origin against.

This is more useful than it looks. Heightmaps are how the game answers “what is the top block here” for various definitions of top – the highest solid block, the highest motion-blocking block, the highest block ignoring leaves. A predicate that compares against them lets a pack ask “is this underground” without hardcoding a Y value.

The obvious application is loot and spawning conditions that should behave differently below the surface regardless of where the surface actually is. On a world with dramatic terrain, Y=60 is a cave in one chunk and open sky in the next, which is exactly the problem heightmaps solve. Anyone who has fought with this while writing spawn conditions will recognise why a fixed Y check is unsatisfying.

Lighting and shadow detail in Minecraft

Resource pack 99.0 and the shader reshuffle

Three changes, all in the rendering path.

screenquad.vsh is renamed to screentriangle.vsh. The changelog is blunt about why: it has actually been representing a single triangle for a while. This is a housekeeping rename with no behavioural effect, but it will break any pack that overrides the file by name.

Cloud rendering was split. OIT support came out of clouds.fsh, which now handles two cases – drawing clouds directly when Improved Transparency is off, and drawing them to an offscreen target when it is on. A new blit_clouds.fsh then composites that offscreen target into the OIT targets.

And two new shaders, sky_occluder.vsh and sky_occluder.fsh, implement the occlusion described above.

What to do about it

If you maintain a resource pack that overrides core shaders, you have one rename to handle and a cloud pass that moved. That is a real but bounded amount of work.

If you maintain a data pack, nothing breaks and two new tools appeared. Worth adopting below_heightmap if you have any surface-versus-underground logic currently expressed as a Y comparison.

If you maintain a pack that only replaces textures and sounds, none of this affects you, and the version bump is a formality. The 26.3 pack format changes were considerably more disruptive than this.

Timing

This is snapshot 2 of the 26.4 cycle. Pack format numbers can and do change again before release, so treat 122.1 and 99.0 as provisional. The right move is to have a branch that works against them, not to ship on them.

Testing against a snapshot format

The workflow that avoids pain: keep your release branch declaring the stable format, and make a separate branch declaring 122.1. Do not bump the main branch to chase a snapshot number that may change again before 26.4 ships.

For the resource pack side, the screentriangle.vsh rename is the only thing that will hard-fail, and only if you override that file. Search your pack for screenquad before you do anything else – if there are no hits, the rename does not affect you at all.

The cloud shader split is more subtle, because a pack overriding clouds.fsh will still load but will no longer do what it did. That one needs testing rather than searching.

Images: Rethinking Voxels project gallery.