Port celestial systems and seeded Age completion to 26.3 beta
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-11-04 18:08:12 -05:00
1 parent 38e40ddba3
commit 40770841ee
32 files changed
+2792 -99

No files matched your search

+498
View File
@@ -1303,6 +1303,504 @@ unchanged moon, and travel isolation still require the user's client check.
The server stopped cleanly and its temporary world was deleted. Nothing is
committed, pushed or published without an explicit request.
## Normal Time shared celestial color
`1.0.1.79-beta.1` ports the root `AgeSkyProfile` behavior that consumes a
pending shared color group at Normal Time and applies it to both paired
bodies. `PortAgeColors` now saves an optional `celestial` RGB value, default
-1 (native/untinted), with catalog protocol 7 for synchronization. Existing
sky/ambient fields and old profiles retain their values. Color accumulation
passes through non-color celestial modifiers, clamps at the target, resets
after consumption, and leaves trailing colors assigned to sky as before.
Extraction copies the saved tint into `SkyRenderState`. A narrowly scoped
native sun/moon uniform modification multiplies RGB while retaining alpha;
there are no live world reads during drawing, new textures, pipelines or GPU
buffers. Native weather fading, transparent halos, moon phases, stars and
sunrise glow remain unchanged. Time and effective illumination are not tied
to RGB. State reset/defaults prevent cross-dimension tint leakage. Independent
Sun/Moon pages, multiple bodies and per-body colors remain unported.
The `create_celestial_color` fixture checks three separate target groups,
completed-group clamping, modifier passthrough, consumed-group reset, seeded
unnumbered colors, old codec defaults and catalog round trips. Client checks
must cover a frozen Zenith sun, Nadir moon, mixed colors, transparent halos,
restart and return to an untinted dimension. Server probes validate saved
profiles and attributes, not rendered output. Build passed; disposable-server
fixtures retained separate sky/ambient/body colors through reload, reseed and
restart, including zero/black colors and untouched native defaults. Sampled
time/light remained unchanged. The server stopped cleanly and its temporary
world was deleted. No commit/push/publication is performed without an explicit
request.
## Standalone Sun and Moon controllers
`1.0.1.80-beta.1` extends the existing cycle profile with optional `body_mode`
(paired=0, Sun=1, Moon=2); old profiles default to the paired renderer.
Catalog protocol 8 includes this field. One celestial controller is accepted
per book, with existing Length/Phase/Direction/Angle/Size and shared Color
groups. Multiple controllers and dangling/duplicate modifiers retain the
interim strict rejection rather than losing written pages.
Standalone bodies use a linear angular orbit as in root `AgeSkyProfile.Body`.
Both native body-angle attributes point at that orbit; render-state mode
suppresses the absent counterpart. The selected Moon consumes Size itself;
Normal Time retains its original sun-only sizing. Moon-only sunrise glow is
suppressed before any horizon pose is pushed. Shared RGB/alpha handling and
native buffers/pipelines are reused, with extraction/reset defaults protecting
other dimensions. Missing Sky completion uses Overworld, as before. Explicit
Nether/End/Static still does not draw bodies in this native-renderer slice.
The gameplay skylight attribute follows root `lightAt` and
`LevelSkyBrightnessMixin`: positive cosine altitude, 0.18 for a moon, weather
attenuation, then the 11-level sky-darkening range. It does not infer light
from color or size, and does not bypass Bright/Dark or no-skylight terrain.
Native background/star/moon-phase schedules remain, rather than claiming a
full custom sky port. Seeded default phase/bearing completion, multiple
independent bodies and eclipses remain future work.
The op `create_body` fixture checks all named phases for both bodies, light
weights, numeric size, reverse motion, order rejection, old-profile defaults,
compatible missing Sky and catalog synchronization. Actual body visibility,
moon size, glow transparency and travel isolation require manual client
validation. Build and disposable-server probes passed: Zenith sun/moon
skylight was 15/6, Nadir and horizon were 4; named phase angles were correct.
The paired fixture retained its opposite moon and native lighting. Reload,
reseed and full restart preserved body mode, color, size, bearing and phase.
The test server stopped and its temporary world was deleted. No commit/push/
publication is performed without an explicit request.
## Multiple independent authored celestials
`1.0.1.81-beta.1` adds an optional immutable `PortCelestialBody` list to the
cycle profile and catalog protocol 9. Existing profiles default to an empty
list and use their validated native paired/single path. Books with multiple
controllers compile ordered modifier groups into independent body orbits;
Normal Time expands into opposite-phase sun/moon entries. Colors are consumed
at each controller, with original page indices retained for seeded amounts.
Uncolored bodies reset to native white rather than inheriting the previous
body's tint. Size/phase/length/bearing/direction also reset per group.
The profile constructor and authoring gate enforce the root ten-sun/ten-moon
limit, with Normal Time counting toward both. Duplicate modifiers within a
group and dangling modifiers remain strict errors until grammar recovery is
ported. The first controller continues to govern the shared day timeline and
native background/star/moon-phase schedules. Positive-altitude sunlight sums
to at most 1; only if no sunlight contributes is summed 0.18-weight moonlight
used. Weather and Bright/Dark remain separate. No eclipse attenuation is
included yet.
Extraction resolves body angles into immutable presentation snapshots. The
native body pass is replaced only for a nonempty multi-body list: draw suns
first, then moons with their own color, size and bearing, then native stars
once. Native buffers, pipelines and alpha are reused. Temporary renderer
parameters and pose transforms restore in finally blocks; no world lookup is
performed during drawing. Explicit Nether/End/Static rendering remains a
separate limitation. Eclipse disc occlusion, corona and sky/light attenuation
will be the following slice, not a claim of this implementation.
`create_celestials` checks independent motion/color/size, modifier reset, Normal
Time expansion, ten-pair acceptance/overflow rejection, profile codecs and
catalog round trips. Manual checks cover body placement/alpha, multiple
controllers, restart and ordinary-dimension isolation. Build passed, as did
disposable-server profile/catalog checks, combined-light invariants, reload,
reseed and full restart. Single-body, paired and tinted fixtures retained
their earlier behavior. The test server stopped and its temporary world was
deleted. No commit/push/release is performed without explicit instruction.
## Eclipse effects
`1.0.1.82-beta.1` adapts root `AgeSkyProfile.eclipseFor`, `eclipseAt` and
`lightAt`, plus `RivencraftSkyEffects.drawBody`. The dot-product separation
of normalized orbit directions is compared with the sum of quarter-disc
angular radii; each body takes the strongest opposite-kind contact. This is
root's radial proximity formula, not a new physical disc-area model. Bearing,
phase, size, motion and direction all affect contact. Same-kind and isolated
bodies have no eclipse; only an above-horizon sun contributes global shading.
Sunlight is multiplied by `1 - 0.85 * overlap` before the existing light
aggregation and weather handling. Extraction shades sky RGB by
`1 - 0.65 * strongestVisibleSolarOverlap`. Moon RGB scales by `1 - overlap`;
sun RGB moves toward white by `pow(overlap, 8) * 0.8`. Values are derived from
saved profiles, requiring neither a new saved schema nor packet fields.
Existing multi-body Ages gain the effects on update; single/paired native
paths stay unchanged. Overlap calculations are bounded by the 20-body limit,
and extracted presentation values are reused without live-world drawing reads.
Native transparent glows draw before each body's central ordinary-alpha disc.
A registered pipeline cloned from native Celestial uses conventional alpha
blending; cached center-cropped atlas meshes retain native UV orientation.
An eclipsed moon uses the full-moon core to avoid transparent phase pixels
exposing the sun (root always drew that full-moon center). Weather alpha is
retained. The helper drops meshes on atlas-generation change and closes them
with the renderer. There is no generated art or per-frame mesh allocation.
Explicit Nether/End/Static body rendering remains outside this slice.
`create_eclipse` supplies aligned, partial, clear, below-horizon and moving
fixtures; it checks overlap/color/light constants, same-kind exclusion and
motion out of contact. The multi-body op fixture is renamed
`create_celestials` to avoid merging with the unrelated existing terrain
`create_multi` command. Manual checks must confirm disc opacity, halo,
corona/sky darkening, resource reload and travel isolation. Build passed.
Disposable-server fixtures passed with overlap 1/0.293/0 for aligned/partial/
clear cases and no global shading for below-horizon alignment. Aligned
sunlight was 0.15, clear sunlight 1; sampled skylight was 6/12/15 for aligned/
partial/clear. Moving contact ended as expected. Reload, reseed, catalog
round trips and full restart retained profiles and derived light behavior;
earlier standalone/paired fixtures remained unchanged. The test server stopped
and its temporary world was deleted. No commit/push/publication is performed
without an explicit request.
## Authored moon sprite correction
`1.0.1.83-beta.1` removes the mixed native-phase/full-core adaptation introduced
with the opaque eclipse pass. Standalone and multi-body authored moons now
draw full-moon glow and center consistently, matching root's custom renderer,
which always samples the first (full-moon) atlas cell. Under ordinary alpha,
native dark phase pixels can produce black opaque centers; the old overlay
glow had made those dark pixels effectively invisible. The ordinary native
Normal Time pair retains its calendar phases. No eclipse math, saved profile,
catalog protocol or world data changes are needed.
The user's `celest` Age was read without modification. Its body colors are
all -1 (native white), not corrupted black values. Its first Moon and second
Sun both have period 1, phase 0, origin 0, clockwise direction and native
bearing -1; they remain exactly coincident. That moon's full eclipse and its
occlusion of the sun are expected under the newly added root overlap rules,
independent of the phase-sprite correction. Do not silently alter player-authored
orbits to conceal the intentional alignment. Manual checks cover nonaligned
moons, the known permanent eclipse, Native Normal Time, resource reload and
cross-dimension isolation. No user save was modified, and nothing is committed,
pushed or published without explicit instruction.
## Celestials over explicit non-Overworld skies
`1.0.1.84-beta.1` removes the presentation exclusion that hid authored bodies
over Nether/End/Static. Root `RivencraftSkyEffects` draws its body list after
any chosen background. The native 26.3 paths instead returned after End or
skipped a NONE sky entirely. An extracted overlay-mode flag now schedules an
authored body layer without changing the actual dimension type or gameplay.
Single Sun/Moon and Normal Time profiles expand into temporary presentation
bodies on these backgrounds; saved profiles are not rewritten. Existing
Overworld single/paired/multi-body paths stay unchanged.
End uses a RETURN hook that includes the native early return, after its pass
is closed. Static closes its own background pass before drawing the overlay.
Fog-only Nether presentation schedules an extracted END sky pass, suppresses
its End background/flash drawing, and retains the fog clear color. Overlay
passes load existing targets without clearing, reuse native body resources
and suppress additional stars/horizon glow on non-Overworld backgrounds.
Weather alpha is extracted even when the native NONE/END branch omits it.
All presentation flags reset when the render state is reused.
Eclipse shading modulates End/Static background tint; Nether-style fog color
uses the same root shade factor through an environment attribute layer.
Native untinted fog and authored sky colors are both supported; other
backgrounds retain their existing fog behavior. Body lighting and eclipse
geometry do not depend on style. Missing Sky selection still chooses
Overworld for authored celestials. No schema/protocol changes or new assets
are required. The eclipse fixture accepts an optional explicit Sky; server
checks cover saved choices, fog/light behavior and persistence, while visual
layering, no duplication, resource reload and travel isolation require manual
client checks. Build and disposable-server checks passed for all four sky
styles: aligned eclipse skylight stayed 6, clear stayed 15, and Nether fog
scaled by 0.35 only during overlap. No-celestial and tinted-Nether fixtures
retained their expected colors. Saved profiles, style, light and fog survived
reload/reseed and full restart. The test server stopped and its temporary
world was deleted. No commit/push/publication is performed without explicit
request.
## Bare celestial seeded randomization
`1.0.1.85-beta.1` adds per-controller randomization specifically for bare
Sun/Moon groups, as requested for easier testing. This deliberately uses the
root **random-Age** ranges rather than its authored compile defaults (which
reuse shared seeded phase/bearing and default size/color). A dedicated stream
mixes Age seed with controller ordinal, independent of unrelated page indices,
terrain/weather/lighting RNG and sky selection. Palette/mixing and 0.75–1.75
size come from `AgeSkyProfile.random`; 0.2–2 periods with 1/7 stopped chance
come from `AgeTraits.select`. Bearing and phase use the port's existing degree/
tick granularity. Direction is random per body. Counts and body-kind limits
still follow explicitly written controller pages.
The compiler recognizes whether a controller has any written celestial
modifier. Colors already consumed by Sky/Ambient do not suppress randomization.
Any written celestial modifier retains the previous authored path as a whole,
not just individual field overrides; partially authored groups do not gain
new random missing fields in this slice. Normal Time and absent controllers
are unchanged. Bare controllers materialize immutable full body profiles,
including a one-body list for standalone cases. Multi-body compilation carries
their colors/orbits without replacing them with native defaults. No new
saved schema, protocol or client renderer code is needed.
Only newly created Ages compile these defaults. Older saved profiles load
unchanged; GUI opening, restart and terrain reseeding do not reroll them.
`create_random_celestials` checks reproducibility, ordinal independence,
unrelated-page stability, 128-seed bounds/pool coverage and unchanged authored/
Normal Time behavior. The regular fixtures still exercise explicit groups.
Manual checks cover visible variation, moving/stopped bodies, mixed authored
groups and restart. Build and disposable-server checks passed, including
single bare bodies, multi-body/128-seed coverage, catalog round trips,
unrelated-page stability, explicit/eclipsed fixtures, reload, terrain reseed
and full restart. Saved random parameters remained unchanged while moving
orbits continued with the clock. The server stopped and its temporary world
was deleted. No commit/push/publication occurs without explicit request.
## Missing celestial branch completion
`1.0.1.86-beta.1` adds creation-only `PortDayCycle.resolve`. Written controllers
delegate to the validated compiler unchanged. If none exist, the root
`AgeSkyProfile.random` draw positions select 0–3 suns and 0–3 moons: consume
the sky-style draw and mixed sky-color draws, then the two counts. Body
settings reuse .85's independent per-controller streams. This matches root's
unrestricted count model, not bit-identical per-body values; the .85 per-body
length/direction independence is retained. Missing sky tint completion and
random-page policy parity are not claimed by this slice.
The shared resolver is used by player book creation and the `create_random`
operator command. Other exact diagnostic fixtures continue using `compile`
or native profiles to isolate their subject. A saved NONE body mode (3)
represents a resolved zero-body sky. Its sun/moon/horizon drawing is suppressed
without switching to Dark lighting or changing the native background/star
timeline. Old missing profiles still decode to NATIVE rather than being
retroactively completed. The mode-domain extension uses catalog protocol 10.
No generation runs or rerolls happen during GUI rendering, load or reseed.
`create_completed_sky` tests 256-seed count bounds and coverage of empty,
sun-only, moon-only and mixed results; reproducibility and unrelated-page
stability; explicit-controller precedence; old defaults; and catalog round
trips. Manual checks cover varied new books, empty skies, explicit-controller
counts, all backgrounds, restart and Overworld isolation. No commit/push/
publication is performed without explicit instruction.
The .86 build and disposable dedicated-server checks passed: four background
fixtures, the seed-14 empty sky, random Age creation, explicit controllers,
catalog round trips, unload/reload, terrain reseeding and full restart. Saved
body parameters survived unchanged. The test server was stopped and its world
deleted; client visual confirmation remains a manual check.
## Random Age sky-color completion
`1.0.1.87-beta.1` uses creation-only `PortAgeColors.resolve` for player books
and `age create_random`. Empty symbol lists choose a sky tint from root
`AgeSkyProfile.random`'s palette and draw order, including its rounded channel
averages. Nonempty symbol lists delegate to the existing compiler unchanged.
This intentionally distinguishes wholly random Ages from authored books with
an omitted sky-color branch, as 1.21.1 does. The existing .85 per-body random
color truncation is preserved by a shared palette helper; celestial count and
body random streams do not change.
Colors are stored in the existing profile and catalog fields. Old native
colors are not retroactively randomized; reload, restart and terrain reseed
do not rerun completion. No protocol update is necessary. The completed-sky
diagnostic checks six root seed/color vectors, codec persistence, authored
precedence (including explicit black) and old-profile defaults. Random-page
blocklist parity remains separate pending work.
Build and disposable dedicated-server checks passed: root vectors and authored
precedence, color attributes/catalog round trips for all four background
styles, explicit sky/ambient colors, unload/reload, reseed and full restart.
Saved random colors stayed unchanged after reseeding and restart. The test
server was stopped and its disposable world deleted. Client rendering is
still a manual check. No commit, push or publication was performed.
## Authored biome branch completion
`1.0.1.88-beta.1` ports the explicit-controller missing-pool behavior from
1.21.1 `AgeBiomeSelection.compile`: Single requires one biome; other nonnative
controllers require two distinct biomes. An entirely omitted pool uses the
seeded 2:1 continuation/stop draw up to the eligible pool size. Authored pools
fill only to the minimum, preserve order and duplicate weights, and never add
an unrequested third biome once the minimum is met. Native still disallows
biome pages. The binder's availability validation accepts incomplete pools;
the server resolves actual registry eligibility before creating the Age.
Player creation now passes the actual Age seed to biome compilation. Exact
older diagnostics retain the registry-only compiler; the new completion
fixture exercises the production seeded path. Cave uses recognized Cave and
Nether biomes. Void does not inject The Void alongside authored biomes and
reports a clear distinct-biome error when completion is impossible. Pools
are stored in existing `PortBiomePlan` fields and never rerolled on restart
or terrain reseed. No protocol change is needed. Broader writing recovery,
structure-driven missing-biome selection and random-page policies remain
separate parity work.
The build and disposable dedicated-server checks passed. The completion
fixture checked every distribution over 32 seeds, partial/full/weighted pools
and codec round trips. Created Standard Single, Flat Tiny, Cave Tiny and Void
Single plans; Cave included the new 26.3 Sulfur Caves biome. An impossible
controller-only Void Tiny pool was refused with the distinct-biome message.
Generator pools survived unload/reload, reseed and full server restart.
The server was stopped and the temporary world deleted. Binder interaction
and in-game biome layouts still require manual validation. No commit, push
or publication was performed.
## Unpaired material completion
`1.0.1.89-beta.1` adapts 1.21.1 `AgeFeatureSelection.implied`. A shared pure
normalizer expands an unpaired material into an internal material/feature
pair, keyed by Age seed, material ID and its original book index. Rock, lake
and terrain-feature compilers all use the same completed view. Original book
pages stay unchanged and no random selection happens at render/load time.
Explicit feature targets suppress completion, including incompatible targets
that must still be rejected by the current strict grammar.
Candidate ordering and terrain restrictions follow root's material-feature
list: Rocks/Floating Islands/Tendrils/Spheres/Spikes/Obelisks for solids and
the three lake types for fluids, filtered by supported terrain. Cave only
permits the two terrain-independent solid features; Void also permits floating
islands; Flat excludes Rocks. No fallback fluid feature exists on Flat, Cave
or Void. This does not add page-free random features, nor remove the existing
per-feature caps or introduce instability recovery. Resulting plans use their
existing save codecs, so no catalog/protocol change is needed.
The operator fixture checks 64 seeds on each terrain: independent consecutive
materials, deterministic/idempotent completion, explicit precedence, candidate
coverage, fluid retention and incompatible-fluid rejection. Persistence and
actual generator plans are inspected with `feature_plan` without generating
chunks. Client binder interaction and feature visibility remain manual checks.
The .89 build and disposable server checks passed: seeded fixture assertions,
Standard Glowstone Spikes, Cave Diamond Spheres, Void Stone Tendrils, Flat
Glowstone Obelisks and Standard Water Deep Lakes. Cave Water was refused.
Feature plans and materials survived unload/reload, terrain reseed and full
restart. The server was stopped and its temporary world deleted. No commit,
push or publication was performed.
## Page-free random material features
`1.0.1.90-beta.1` adapts the material and rare-formation portion of 1.21.1
`AgeFeatureSelection.randomChoices`. A new creation-only selector shares the
production authored plan compilers rather than duplicating generator logic.
It rolls 0–2 unique material feature types, uses root's candidate ordering and
Legacy rank chooser, removes chosen types, and selects full-collision solids
or source fluids from the registered sorted pools. Terrain eligibility uses
the current port validator. The separate seeded Skylands and Star Fissure
rolls and the 1-in-10 Crystal Formations roll follow root's rules.
Player Link-Panel-only creation and `age create_random` share this selector.
Authored books still use their own feature compilers, including implied
materials from .89. Plans are frozen in existing save fields, without extra
book pages or a protocol change. Old Ages keep their original plans.
Random structures, random-page policies and instability are not claimed by
this slice. Material values can be valuable/hazardous, matching the root pool;
the instability port must account for that before stable release.
`create_random_features` checks 64 seeds across all terrain types: seeded
determinism, counts 0/1/2, unique feature types, all nine candidate families,
terrain compatibility, rare-feature coverage, and plan codec round trips.
`feature_plan` treats an absent feature generator as a valid empty result.
Client feature visibility remains a manual check.
The .90 build and disposable server checks passed. The seeded matrix covered
all six terrains and all nine material feature families. Created surface,
Cave, Flat and Void fixtures, including lakes, rare Skylands and a Star
Fissure, and verified the production `create_random` plan. Seed 0 Standard
correctly produced no features; seed 1 produced a single lake. Saved plans
survived unload/reload, reseed and full restart. The server was stopped and
its temporary world deleted. Nothing was committed, pushed or published.
## Page-free random structures
`1.0.1.91-beta.1` ports `AgeStructureSelection.randomChoices`: an independent
seed stream rolls 0–2 unique candidates using Legacy ranks. Terrain and
registry availability are checked, then the selected biome pool must intersect
the structure set's normal biome eligibility. This is deliberately stricter
than authored pages, which retain their existing biome overrides. Native
Flat uses Plains, Native Cave uses the backend's Lush Caves fallback, and
other native noise terrain uses the Overworld LevelStem biome source. A
non-Native plan uses its saved biome IDs. Abandoned Camps are added after
the root candidate list at rank 3. Cave Dungeons remain excluded by current
port support, whereas root permits that combination; it needs a separate
placement validation before enabling it.
The combined random feature resolver preserves .90 material/rare choices,
adds Dungeons separately, and merges structure pages into the saved terrain
feature plan. A new optional `structure_control` field defaults false for
old profiles and is true for new random Ages, even for an empty selection.
The generator applies its existing controlled-set filter when that flag is
true. This prevents zero choices from accidentally retaining all vanilla
controlled sets. Other native structure families still use their normal
biome gate. Existing authored/old plans are not rewritten, and no catalog
protocol change is needed.
The operator fixture checks seeded counts/uniqueness, all terrains, fixed
Plains/End/Nether biome pools, native defaults, biome eligibility, the empty
controlled-set gate, explicit Village precedence, merge/codec persistence,
and old-profile defaults. Actual placement remains an in-game check.
The .91 build and disposable server checks passed. Fixtures exercised Plains,
Native Flat, Nether-biome Cave, End-biome surface and empty Void selection,
plus the production random-Age command. Village, Fortress and Dungeon plans,
and an intentionally empty controlled plan, survived unload/reload, reseed
and full restart. Namespaced biome arguments were checked. The server was
stopped and its temporary world deleted. No commit, push or publication was
performed; generated structure placement remains a manual client check.
## Cave Dungeon parity
`1.0.1.92-beta.1` closes the Cave Dungeon terrain exclusion documented in .91.
Root `AgeStructureSelection.error` permits Dungeons on noise terrain, which
includes Cave. The 26.3 feature and placement implementation were already in
place; the port's shared lake/dungeon Cave rejection blocked authoring and,
through the availability check, random selection. Splitting that validation
permits Cave Dungeons without allowing Cave lakes or Flat/Void Dungeons.
The two targets' `worldgen/placed_feature/dungeons.json` files compare exactly:
vanilla monster_room, count 8, in-square and full-height uniform placement
using above-bottom/below-top anchors. No legacy Y=0 assumption is introduced.
Vanilla's solid floor/ceiling and opening-count requirements still determine
successful placement. The 32-page cap and per-occurrence deterministic seed
remain unchanged. New random Cave Ages now consider Dungeons automatically;
old frozen plans are not changed.
The extended `create_dungeons` fixture checks Cave stacking/cap and the
remaining lake/Flat/Void restrictions. The random-structure matrix now requires
Cave Dungeon coverage. `dungeons_probe` accepts an optional 1–4 chunk-side
bound for manual tests; it is not run automatically, avoiding a large sync
chunk-generation scan. Actual dungeon placement is handed to the client check.
The .92 build and disposable server checks passed: Cave and surface authored
fixtures, 32-page stacking/overflow, retained lake and Flat/Void rejection,
and random-structure coverage including a Nether Cave Dungeon selection.
Dungeon counts survived unload/reload and full restart; frozen random plans
survived reseed. Placement JSON matched the 1.21.1 file byte-for-byte. The
server was stopped and its temporary world deleted. No commit, push or
publication was performed. No dungeon chunk scan was run automatically.
## Biome-specific Nether and End materials
`1.0.1.93-beta.1` ports root `AgeDimensionService.withBiomeMaterialRules`.
The backend was using `caves.materialRule()` unchanged, which selects
`minecraft:overworld_caves` and can apply Overworld grass to Nether biomes.
The new noise-settings wrapper sequences the five vanilla End biomes' registered
End rule, then the five vanilla Nether biomes' registered Nether rule, then
the original terrain rule. This fixes Cave Nether coverings and the equivalent
End/Nether mismatch in authored Standard, Amplified and Island noise Ages.
It uses the active rule registry rather than copying vanilla material tables.
All non-material settings are preserved. Dry Cave's AIR default fluid, empty
aquifer config and minimum-relative sea level remain intact. Native Nether
surface rules can still place their own lava patches; this does not restore
flooded Cave aquifers. Flat/Void layer materials and custom feature materials
are not rewritten. Old saved Ages pick up the rule when reloaded, but only
newly generated chunks change; no generated blocks are retroactively edited.
No profile field or network protocol change is required.
The creation fixture verifies unchanged geometry/router/default blocks and
fluids, aquifers and sea level for four noise presets, and round-trips the
composed material rule with registry-aware codecs. `material_probe` limits
generation to one terrain-stage chunk and reports actual block counts.
Build, registry-aware rule codec tests and disposable server terrain checks
passed. All five Nether Cave fixtures generated their native material families
without grass/dirt: Nylium, Soul Sand/Soil, Basalt/Blackstone or Netherrack.
Standard The End and Island End Highlands generated End Stone; Lush Cave's
original Overworld materials remained present. Reload retained the rules, and
fresh chunks after full restart again used Nylium/End Stone. No full feature
or entity chunk scans were run. The server was stopped and temporary world
deleted. Nothing was committed, pushed or published.
## Verification of this first slice
The 1.21.1 `compileJava` and `build` tasks passed offline after the backend