Port live instability, writing recovery and Link Modifier controls to 26.3
Build / build (push) Waiting to run

This commit is contained in:
dnorberg committed 2026-11-10 17:40:52 -05:00
1 parent d2904eaa8d
commit 32c52e635f
41 files changed
+2611 -77

No files matched your search

+392 -3
View File
@@ -9,9 +9,11 @@ biome-distribution pages, selected material/vegetation/structure features, and
independent Age weather and lighting, multiple authored or seeded celestial
bodies and eclipses, biome/material completion, and random features/structures.
Crystal portals and libraries are ported. Instability scoring/provider selection,
status effects and colored decay are partially ported; remaining hazards, live material profiling,
remaining discovery/stations, writing recovery and optional integrations remain unfinished. The latest published beta is
[1.0.1.120-beta.1](RELEASE_NOTES_1.0.1.120-beta.1.md).
status effects, colored decay, lightning, explosions, meteors, burning and erosion,
ordered writing recovery, live material profiling and all six Link Modifier controls are now ported.
Link Modifier seed editing/retirement, remaining discovery/configuration and optional
integrations remain unfinished. The latest published beta is
[1.0.1.129-beta.1](RELEASE_NOTES_1.0.1.129-beta.1.md).
Use a test world and keep a backup; do not
substitute this JAR for the 1.21.1 mod or import 1.21.1 saves.
@@ -2142,3 +2144,390 @@ No permanent test fixtures, commit, push or publication.
The player passed every slice, including .120 colored decay, and authorized commit,
push and publication as 1.0.1.120-beta.1. Both Minecraft targets build successfully.
See the consolidated release notes for the published scope and remaining parity gaps.
## Beta .121 — lightning and explosions
The player passed .120. This slice ports the 1.21.1 lightning/explosion providers,
their separate scheduling lane, persisted per-Age attempt sequence/cooldowns,
loaded-chunk candidate selection and existing damage/protection settings.
Each selected hazard receives a roll on each admitted Age scheduler pass, independent
of rotating potion/decay providers. Legacy per-chunk/per-tick odds are aggregated as
`1 - (1 - 1/denominator)^(loadedChunks * interval * effectiveCopies)`. Denominators
remain 100,000 for clear-weather lightning, 5,000 during rain plus thunder, and 1,000
for explosions. Candidate chunks are already-loaded rings around Age players, capped
at 81 by default; no chunks are generated for hazards. Lightning uses the motion-blocking
surface; natural explosions choose a random Y across the dimension's modern height.
Defaults match 1.21.1: hazards/block damage/player damage/fire enabled, 20-tick minimum
gap per hazard type, strength-3 blasts, at most 16 distinct destructible blocks and
eight damaged entities, and at most 12 damage per entity (lightning itself caps at 5).
Creative/Spectator are excluded. Spawn columns within eight blocks horizontally are
excluded as targets; protected infrastructure, block entities, TNT, portals and
unbreakable blocks resist blasts. Break and placement cancellation checks remain.
World mutation and mobGriefing gate block damage; entity damage and visual/audio
feedback can remain active when block mutation is disabled.
The modern API no longer returns an explosion/block list. The damage calculator
retains its bounded approved positions for post-blast ignition, only where the block
is now air and fire placement is allowed. Cancelled explosion startup does not count
as dispatch or generate follow-up fire. NeoForge's renamed BreakBlockEvent and 26.3's
`canSpreadFireAround` replace the old break event and doFireTick query respectively.
Vanilla explosion networking and lightning entities provide existing visuals/sounds.
The `instability_hazards` config section retains the 1.21.1 setting names/defaults.
Operator checks inside an Age:
- `/rivencraft_port instability hazard lightning`
- `/rivencraft_port instability hazard explosions`
These skip random probability only, retaining loaded-chunk, cooldown, Age/config/provider
and protected-spawn checks. They target a nearby loaded chunk center, using its surface
for lightning and the command's Y for explosions, rather than the player's exact feet.
Move away from the arrival area and allow at least one second between repeats of the
same hazard. The command reports no dispatch when blocked/cancelled. It also works with
an explicitly positioned console source. Generic `pulse lightning`/`pulse explosions`
retain their natural probability roll; `test_score`/`status` exercise normal selection.
The saved score/plan and catalog protocol are unchanged.
Build and dedicated-server startup passed. The user offered to validate damage and
block destruction manually, so the server was stopped before effect/terrain fixtures
were run and its temporary world was removed. Manual checks include lightning/thunder,
explosion visuals/sound, damage caps and Creative immunity, block/protected-block limits,
spawn exclusion, world-mutation/mobGriefing/fire settings, cooldown/restart persistence,
and natural rates in occupied Ages. No permanent tests, commit, push or publication.
## Beta .122 — meteor flight and impacts
The player passed .121 lightning/explosion testing. Meteors now reuse the 1.21.1
particle descent, roar sound, selected Legacy provider card, independent scheduling
lane and bounded blast helper. They are not a new falling-block/entity model: a
flame/smoke trail descends for 30 ticks (1.5 seconds) from up to 48 blocks above a
captured surface target, followed by the impact. The existing meteor roar is bundled.
Natural scheduling aggregates the Legacy 1-in-50,000 per-chunk/per-tick odds across
loaded chunks, scheduler interval and effective card copies, as in 1.21.1. Targets
are randomized among already-loaded nearby candidate chunks; X/Z vary within the
safe central area of each chunk. Up to 16 candidate chunks are considered per
schedule attempt. Target selection rejects protected spawn columns and surfaces
without headroom. No terrain is loaded or generated by the provider.
The shared hazard SavedData preserves the meteor cooldown (200 game ticks) and random
attempt sequence. At most one meteor can descend per Age and 16 Ages can have active
flights. A pending descent is session-only: server stop, Age unload, no players,
unloaded target chunk, or disabled Age/global/provider/meteor policy cancels it.
Interrupted flights never replay after restart; the saved cooldown remains. The
flight is removed before impact dispatch so a failed impact cannot repeat.
The independent `[instability_meteor]` settings match 1.21.1: enabled/block damage/
player damage/fire default true, maximum 24 impact blocks, eight damaged entities,
and 12 damage per entity, strength 3. Impact reuses protected block/BE/infrastructure,
claim events, Creative/Spectator immunity, world-mutation/mobGriefing and modern fire
permission checks. Disabling block mutation still permits descent, sound and eligible
entity damage. Generic instability status reports meteor availability separately
from potion policy; saved scores/decks and catalog protocol are unchanged.
Test inside an Age, away from its arrival area:
`/rivencraft_port instability meteor`
This skips the natural probability roll, retaining cooldown, loaded target, active
flight and all policy checks. It uses randomized nearby impact locations, unlike
the deliberately fixed chunk-center lightning/explosion test commands. Wait at
least ten seconds before repeating. `/rivencraft_port instability pulse meteors`
keeps the natural chance roll; test-score/status tools exercise saved deck selection.
The build passed and JAR sound/class packaging was verified. Following the player's
manual validation preference, particle/audio presentation, impacts/damage/protection,
repeat cooldown, disabling/leaving during flight and restart cancellation are handed
over for in-game testing. No server or new world was launched for this slice. No new
permanent tests, commit, push or publication.
## Beta .123 — burning and erosion
The player passed .122 meteor testing. This slice adapts the remaining burning and
erosion portions of 1.21.1 AgeEnvironmentalProviders, using the existing hazard
candidate selection, saved attempt sequence, protection helpers and independent
provider scheduling. No new textures, entities, sounds or optional mods are required.
Burning remains an active Legacy deck card. Sky-exposed eligible living entities
outside protected spawn can ignite; Survival/Adventure players are included by
default and Creative/Spectator are excluded. Natural processing inspects at most
eight loaded chunks/eight eligible candidates per chunk, ignites at most one per
inspected chunk and four entities per pass by default. The old 1-in-10 per-tick gate
is aggregated over the scheduler interval. Fire lasts four seconds per effective
provider level, capped at twelve. Vanilla water/rain extinguishing and fire immunity
remain in force. Disabling the provider stops new ignitions; existing fire follows
vanilla behavior rather than the potion lease cleanup mechanism.
Erosion remains outside Legacy's saved card deck. As requested for testing in 1.21.1,
its config defaults enabled and natural attempts run in admitted occupied Ages at a
current score of at least 10,000. Current score uses the frozen creation total or an
explicit session test-score override; live material profiling remains pending.
At most eight random positions are sampled in already-loaded candidate chunks per
pass, with at most one conversion. An eligible block next to a source fluid above or
on a horizontal side is replaced with that fluid's source block; fluid below does
not grow upward. Normal fluid ticks can subsequently spread it.
Erosion requires world_mutation and mobGriefing, and reuses decay's protection against
spawn/infrastructure, block entities, fluids, critical/unbreakable blocks and protected
tags. Modern break/place claim events and rollback remain. Its `instability_erosion`
enabled toggle does not add a new saved card or alter the Age score. Burning uses
`instability_scorching`: enabled/affect_players default true and max_targets_per_pass
is 4 (range 0–16), matching 1.21.1.
Operator manual checks inside an Age:
- On dry ground under open sky, outside arrival protection and in Survival, run
`/rivencraft_port instability environment burning`. It targets the player directly
for four seconds, skips the chance roll, and explicitly reports water/rain that
would immediately extinguish the fire.
- Place ordinary Stone beside or below source water/lava, outside protected arrival.
Use `/rivencraft_port instability test_score 10000`, look at the Stone within six
blocks, and run `/rivencraft_port instability environment erosion`. The aimed
block should become that adjacent source fluid. Existing policies still apply.
End with `/rivencraft_port instability clear_test_score` to restore the saved plan.
- Automatic burning needs a selected burning card; natural erosion uses the enabled
test policy/threshold. `status` exposes both config/threshold information when
inspecting the respective provider, without adding scores to ordinary books.
Build passed. The player is performing visual/effect testing, so no server/world or
new permanent fixtures were created. Manual validation covers burning/fire damage,
Creative/shelter/spawn exclusion, wet extinguishing feedback, source-fluid conversion,
protected blocks, mobGriefing/world-mutation/config switches and natural scheduling.
No commit, push or publication. Crumble, full writing recovery and live abundance
profiling remain major instability work.
## Beta .124 — live material-abundance instability
The player passed .123. This slice ports 1.21.1's Legacy-style generated-block
profiling and live effective provider selection. Crumble remains a catalog entry
without a registered handler in 1.21.1; no new Crumble behavior is invented here.
Overworld and runtime-Age chunk loads enqueue bounded sampling work, rather than
accessing SavedData during chunk-storage callbacks. Four snapshots are processed
per server tick, with a queue cap of 2,048. Paletted section counts record watched
block IDs efficiently. Each chunk is sampled once, up to 1,024 per dimension, and
samples/totals persist in per-dimension `rivencraft/block_profile` SavedData. Subsequent
player edits or chunk reloads do not replace or double-count a stored snapshot.
Live points remain zero until at least **401 Age samples and 500 Overworld baseline
samples** exist, matching 1.21.1. For each watched material, positive excess blocks
per Age chunk above 1.05 times the Overworld average are multiplied by that material's
weight. The total rounds to an integer and caps at 100,000. The watched list retains
Legacy ores/quartz/glowstone/crystal and the existing modern/storage extensions,
including Diamond Blocks, Ancient Debris and Netherite Blocks.
Recognized ores, mineral storage blocks and source-fluid block types from installed
mods participate automatically via current NeoForge common tags, names and the same
full-block/fluid material eligibility used for Pages. No content mod/API is required.
Unknown ore/storage forms use the 1.21.1 fallback weights; known minerals retain its
named weights. `[instability_modded_materials] block_weight_overrides` accepts exact
`modid:block_id=points` entries, including zero to exclude a modded block. This is
installation-based optional support, not a required mod or per-mod opt-in switch.
While a profiling-enabled Age is occupied, missing spawn-area samples are requested
gradually: at most one chunk request per second, one in flight across the server,
round-robin between active Ages and the Overworld baseline. Existing samples are
skipped. The modern getChunkFuture API still blocks when invoked on the server
thread, so requests use its off-thread scheduling path and completion returns to
the server thread. Closed levels and stopped-server callbacks are discarded. No
permanent force-load tickets or generation while no Age is occupied are introduced.
Natural exploration also fills the sample pool and can reach readiness sooner.
Writing contributions and the original saved provider plan remain frozen. The live
score is added only at runtime, and the effective deck is reselected deterministically
from the same saved seed as the total changes. Providers can therefore appear or
change as abundance is measured. Unchanged totals/seeds reuse a cached plan rather
than reshuffling on each query. Older Ages predating instability records remain
neutral; saved neutral arrivals/enable flags do not opt them into new scoring.
`[instability] difficulty` matches 1.21.1: 0=quarter, 1=half, 2=normal (default),
3=1.75x. It scales writing plus live points without rewriting saved contributions.
A session `test_score` remains an explicit final-score override and is cleared on
restart; clearing it now restores the live effective plan. Erosion threshold checks
use this same effective score.
Use `/rivencraft_port instability status` inside an Age to inspect frozen/live/effective
scores, difficulty, profile eligibility and both sample counts. Normal book/Binder
screens receive no score/profiler data. Zero live points before both thresholds are
ready are expected. To validate, create/explore an Age with Diamond Block Rocks or
another abundant watched material, watch progress, then confirm live points and
providers change while the frozen writing contribution remains unchanged. Reopen the
world to check sample persistence; repeated reloads should not duplicate counts.
Build and temporary dedicated-server checks passed. Real loaded snapshots saved 25
samples per test dimension and captured one deliberately placed fixture Diamond Block.
A restart with synthetic profile records exercised scoring/decoding without generating
hundreds of chunks: resumed real chunk samples produced 423 Age and 522 baseline
samples, with the expected 2,987 live points, frozen score zero and effective providers.
Clearing a session override restored the same live result. This verifies save/scoring
plumbing, not natural bulk generation. The player will check background progress,
actual generated material distribution, modded recognition and difficulty/config
changes. Test server stopped/world deleted; no permanent tests, commit or publication.
## .125 ordered controller recovery
The player passed .124. New authored Ages now recover repeated singular terrain,
biome-distribution, weather, lighting and sky choices: the last choice wins, with
500 instability per duplicate or conflict. Supported category-order mistakes add
100 points instead of blocking binding. Native distribution discards authored
biome choices with a 500-point conflict; Single retains the first authored biome
with a 500-point conflict when extras exist. These diagnostics use the 1.21.1
writing rules. Season pages remain unsupported until their integration is ported.
The original pages remain in the book and library source list. Generation receives
recovered choices without rearranging material/feature or per-celestial modifier
chains. Existing Ages are not rescored. OP instability status shows the writing
contributions; normal book/Binder screens do not expose the score or new warnings.
Unknown/unported pages and other unsupported combinations still prevent binding.
Celestial, number and dangling-modifier recovery is a later slice: their existing
validation still applies to the original page sequence, before controller recovery.
Version 1.0.1.125-beta.1 builds. Thirteen temporary focused checks passed for
last-choice selection, duplicate/conflict/order costs, Native/Single recovery,
unimplemented pages, raw numeric guards, celestial-chain preservation, intentional
feature repeats and Ambient Color ordering. No server/world was launched. In-game
validation: bind books with conflicting terrain/weather choices and confirm the
last choice takes effect; test Native with biome pages and Single with two biomes;
check that all original pages remain and OP status reports the writing costs.
No commit, push or publication.
## .126 ordered celestial and number recovery
The player passed .125. Ported the 1.21.1 grammar treatment of pending celestial
modifiers and numeric adjacency. Repeated Length/Phase/Angle/Size/Direction pages
before a celestial use the final value of that kind without a duplicate penalty.
Only the final unconsumed modifier of each kind adds 100 dangling-modifier points.
A number without an immediately following supported Color/Length/Phase/Angle/Size
page adds 100 points (misplaced, or dangling at the end). Consecutive numbers leave
only the last available for the next target. Colors still mix in written order.
These defects no longer block binding. Numbers and celestial compilation retain
the original page sequence and seeded color indices; controller recovery never
moves a number next to a new target. A trailing modifier cannot rewrite an earlier
body, including the optimized single-body compilation path. Missing celestial
branches retain their existing seeded completion; dangling controls do not apply
to those generated bodies. All original book/library pages remain. Unsupported
pages and the ten-sun/ten-moon limit still block binding; existing Ages are unchanged.
Version 1.0.1.126-beta.1 builds. Seventeen temporary focused checks passed, covering
last-value selection, dangling costs/indices, numeric adjacency, per-body isolation,
seeded color stability, valid numbered writing, body limits, unsupported pages and
cycle codec round-trip. No server/world or permanent test fixture was created.
Manual validation: bind a book with Half Length, Double Length, Sun and verify the
last length; bind Sun followed by Large Size and confirm it does not resize that
sun. Test a trailing Number page and inspect the added writing contribution with
`/rivencraft_port instability status`. Original pages should remain visible.
No commit, push or publication.
## .127 Link Modifier station: title and core link properties
The player passed .126. Started the missing 1.21.1 Link Modifier station port,
reusing its block model, textures, horizontal facing variants and Legacy 176x166
single-book GUI. The item is available in the main creative tab or via
`/give @s rivencraft:link_modifier`; it has no crafting recipe. As in 1.21.1,
creative acquisition does not impose a new permission restriction on ordinary
book edits once the station has been placed.
One persistent slot accepts Linking and Descriptive Books, including unbound
books, with normal and shift-click transfers. The server menu handles renaming
and Disarm, Maintain Momentum and Intra Linking toggles. Descriptive Books cannot
toggle Intra Linking, which only governs same-dimension Linking Book travel.
Existing target, author, symbols and Age identity are retained. Renaming changes
the item's custom title, not the Age's saved folder/registry identity. Removing
the title restores the item's normal name. Text editing consumes inventory/hotbar
shortcuts while focused; Escape closes the screen. Programmatic text refreshes do
not send rename packets. Menu identity, owner, distance and live station checks
protect edits; unknown button IDs and non-book inputs are rejected.
The book is saved with modern ValueInput/ValueOutput container serialization.
Station removal uses block-entity preRemoveSideEffects to release the stored book
once, including non-player removal. No tick handler or renderer is needed.
This is a station slice, not full Link Modifier parity. Seed editing, Age retirement,
Relative Link, Intra-Linking Only and platform overrides remain unported and are
not presented as working controls. Existing core flag behavior is reused unchanged.
Manual validation: place the station in multiple orientations, insert/shift-click
both book types, rename using text containing E, toggle each available property,
remove the book and use it to check travel effects. Confirm Descriptive Book Intra
Linking is unavailable, restart with a book left in the station, and break a loaded
station to recover one book. Build and dedicated persistence results are recorded
below. No commit, push or publication.
Version 1.0.1.127-beta.1 builds. Packaged model, GUI, texture, item definition,
loot table and localization checks passed; no station recipe is included. A
fresh dedicated server placed the station and serialized a named Linking Book
with all three core flags. Restart retained the same book/name/flags and station
removal completed normally. The first harness run expected the wrong wording
for vanilla force-load cleanup; the corrected harness completed successfully.
Both temporary worlds were deleted and servers stopped. No permanent tests were
added. UI interaction, transfer counts and modifier travel effects await the
player's in-game check.
## .128 six Link Modifier controls
The player reported that .127 exposed only three of 1.21.1's six controls. Added
the remaining Intra-Linking Only, Relative Link and Generate Platform controls in
the existing two-column, three-row Legacy layout, with matching bit values and
server-owned menu actions. Enabling Intra-Linking Only enables Intra Linking too;
disabling Intra Linking clears Intra-Linking Only. Both intra controls are disabled
for Descriptive Books. Unknown actions and out-of-range menu edits remain rejected.
Linking Book Intra-Linking Only blocks cross-dimension travel. Relative Link uses
the traveller's block offset from the source world's spawn, applied to destination
spawn, preserving destination yaw/pitch. Normal links retain their precise bound
coordinates. Player and non-player portal travel share the new flags and relative
coordinate helper. Descriptive relative arrivals still require proper footing.
Generate Platform is off by default for Linking Books. When enabled, a successful
link fills one missing floor block with cloud platform only if the block two above
the arrival is air, matching the 1.21.1 helper. Existing floors are retained.
Descriptive Books instead default to enabled and use Disable Platform internally;
turning it off prevents fallback platform creation and refuses travel if no footed
landing is available. Receptacle tint preparation respects that setting too.
New flags serialize in the shared component and appear in book/panel tooltips.
Existing three-flag books remain valid. Seed editing and Age retirement remain
separate, unfinished station work.
Version 1.0.1.128-beta.1 builds. A temporary dedicated-server fixture passed 19
checks: menu actions/dependencies, descriptive intra rejection, numeric flag codec,
relative offsets, platform-off/default behavior, platform placement/preservation,
invalid input and remote edit protection. It did not perform real client travel.
The test server stopped and its world/fixture sources were removed. The production
JAR is rebuilt without that fixture. Manual checks: all six buttons and tooltips,
same/cross-dimension Intra-Linking Only, Relative Link offsets, and platform on/off
for both book types (including a new Void Age without footing). No commit, push
or publication.
## .129 Link Modifier mouse input repair
The player reported that none of the six controls responded. Confirmed the
26.3 input constants in the local Minecraft artifact: left/middle/right are
1/2/3, while the custom Link Modifier handler checked the old left-button value
0. Its server actions therefore passed the prior direct-menu fixture while
real mouse clicks never sent an action.
Replaced the manually drawn/clicked areas with six registered Minecraft Button
widgets at the same Legacy positions. Their callbacks send the existing validated
menu action IDs, and their custom rendering retains the square controls. Native
input provides correct mouse mapping, focus, click sound and keyboard activation.
All six tooltips expose their On/Off state; unavailable Descriptive Book intra
controls remain disabled. Tooltip objects update only when state changes so their
hover delay is not reset every tick. Book mutations/travel code is unchanged.
Version 1.0.1.129-beta.1 builds. The native widget's left-button mapping and callback
dispatch were verified in the local Minecraft bytecode. No client click test or
new server run was performed; the previous 19 checks covered server actions, not
client input. Please click each option with an inserted Linking Book and verify
its selected shading and tooltip/book properties change, then repeat supported
options with a Descriptive Book. No commit, push or publication.