Port libraries, crystal portals and instability decay to 26.3 beta
Build / build (push) Waiting to run

This commit is contained in:
dnorberg committed 2026-11-10 04:14:59 -05:00
1 parent 35980338e1
commit d2904eaa8d
47 files changed
+3438 -71

No files matched your search

+254 -3
View File
@@ -8,9 +8,10 @@ author Standard, Amplified, Island, Flat, Void, or Cave terrain with supported
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.
Instability, crystal portals, remaining discovery/stations, writing recovery and optional
integration parity remain unfinished. The latest published beta is
[1.0.1.115-beta.1](RELEASE_NOTES_1.0.1.115-beta.1.md).
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).
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.
@@ -1891,3 +1892,253 @@ offered to perform the remaining validation, so no further automated restart run
was started. Server stopped and world removed. Shared issue #114 remains open:
1.21.1 implementation and manual client validation are pending. Nothing committed
or published.
### Configurable handheld Link Panel ink cost
The local `1.0.1.116-beta.1` slice ports root WritingInkService and its
`writing.link_panel_ink_cost` option in `config/rivencraft-local.toml`.
The allowed range is 1–16, default 2. Preparing a baseline Link Panel by hand
consumes one Paper and that many ink units; insufficient ink changes neither
input. A drained vial returns a vanilla Glass Bottle. Stacked inputs and
inventory-full give/drop behavior retain the root transaction rules. The
Ink Mixer still consumes exactly one ink unit and one Paper per panel, separately
from this setting. Writing Desk symbol-copy cost uses the shared service getter.
Handheld client prediction checks only eligible item types and a valid nonempty
vial; the server uses its own configured cost to accept/refuse and consume inputs.
This avoids relying on unsynchronized LOCAL config for client affordability.
No new recipe, packet, Page variant or progression award is introduced.
The build passed. Following the player's offer to do testing, no test server
or new fixtures were started for this small resource-policy port. In game, check
two ink per panel by default; then set `link_panel_ink_cost = 4` under `[writing]`
and restart to check four ink per panel, insufficient-ink refusal, last-use bottle,
both hands and stacked/full-inventory cases. Confirm the Mixer still costs one
ink. On a dedicated server, change the server's value; the client need not match.
Nothing committed, pushed or published.
### Age library discovery
The local `1.0.1.117-beta.1` slice ports the 1.21.1 library discovery system:
the existing 11×11×11 schematic, five stocked lecterns, chest loot, deterministic
32-chunk-region spread and the terrain/obstruction checks. Libraries generate
at the end of decoration in newly generated, non-Cave Age chunks. The footprint
stays inside its candidate chunk. Trees/foliage can be cleared, while fluids,
block entities, solid obstructions, excessive slopes and absent sturdy footing
reject placement. Vanilla Overworld generation is unchanged. Old chunks are
not revisited; existing Ages gain libraries only in eligible new chunks.
`[libraries] loot_mode` in `config/rivencraft-local.toml` defaults to `LEGACY`:
writing supplies and possible Sealed Notebooks in chests, with random symbol
Pages on five lecterns. `AGE_ONLY` limits new library chest/lectern Pages to
known symbols written into that Age, using distinct IDs. Page-free Ages then
have no symbol loot and the stands display ordinary Books, matching root.
The original written list is saved independently and copied into the generator
before generation, then restored on reload. It does not change the book's writing,
seed, folder or other trait completion. Older Ages without this saved list have
an empty Age-only pool. The broader random-page eligibility policy remains a
separate unported system. The Legacy pool may include currently unsupported red
pages, like the existing Sealed Notebook pool.
Operator tools under `/rivencraft_port library`:
- `test_place`: place a raised library in clear space ahead, without overwriting
existing blocks/entities. A console source may supply position via `execute`.
- `nearest_loaded`: teleport into the nearest marked library aisle in loaded
chunks within 16 chunks. It checks footing/fluids/collision and does not scan
or generate remote chunks.
- `test_spacing 1` through `32`: session-only increased candidate density in an
Age, for new chunks only. `32` restores normal spacing; restart clears overrides.
- `candidate`: report the closest deterministic candidate without loading it;
eligibility is still required and a library is not guaranteed.
- `probe`: identify a marked library or explain current-chunk placement rejection.
- `inspect_loot`: materialize the current chunk's library chest as opening it would,
then print contents and the number of stands in that chunk.
Build passed and the schematic/loot resources were verified in the JAR. A local
dedicated server started with the data; at the player's request it was stopped
before generation/loot tests. Its world was deleted. The player will check actual
natural placement, five lectern pages and orientation/retrieval, chest loot/Sealed
Notebook opening, both loot modes, locator/test tools and persistence after restart.
No new GameTest fixtures were added. No commit, push or publication was made.
## Beta .118 — crystal portals and Book Receptacles
The player confirmed natural library generation in .117; the earlier missing-library
report was withdrawn. .118 adapts the complete fallback crystal network from 1.21.1:
- Book Receptacles mount on any of the six faces of Crystal Blocks, with the final
1.21.1 model/book orientations. Eight Crystal Blocks surrounding an empty crafting
square craft one receptacle; its recipe unlocks on obtaining a Crystal Block.
- Insert a bound Linking or Descriptive Book into a valid connected crystal frame.
The Legacy tension/flood algorithm accepts supported irregular openings, using
the same 16-block radius, 2,048-crystal and 1,024-surface limits. Placement respects
NeoForge protection events and rolls back rejected activation.
- Empty-hand interaction removes the book and closes the portal. Breaking its
support or holder closes it and drops the book as the recoverable open-book entity.
- Player travel delegates to the existing book transport, catalog acknowledgement,
safe landing, Link Panel effects and configured Return Link handling. Descriptive
Books share the exact same landing resolver with portals. Linking Books retain
their exact coordinates, facing and same-dimension Intra-Linking requirement.
- Non-player transport uses the same target rules, collision checks and momentum
rotation. Disarm refuses loose items and leaves container contents/eligible mob
equipment behind. The shared Disarm helper also replaces the player-only loop.
- Queued collision travel waits until the entering movement packet is complete.
A 40-tick session-only cooldown prevents repeated traversal. Portal owner pointers,
the one stored book, and destination sky tint persist and synchronize to clients.
Startup waits for required frame chunks before repair. Loaded networks receive a
staggered bounded maintenance pass every 200 ticks, without generating chunks.
- The animated fallback only renders its two facing surfaces. Its tint follows the
destination sky, including authored colors and the 1.21.1 Nether/End palette.
Optional live destination views remain part of the integration port; installing
another portal mod alone does not hide this fallback.
- Successful activation awards the restored Open Portal advancement.
Validation: build and dedicated-server startup passed. A small command-seeded
crystal ring verified persisted book/owner data, entity collision travel to exact
saved coordinates before and after a full server restart, and removal/drop cleanup
when the support was broken. This was not a substitute for player-driven activation:
the player should test book insertion/removal, the six model orientations, both book
types and their Link Panel effects, survival/creative item handling, frame edits,
reopening after restart, and travel with destination chunks initially unloaded.
The temporary server was stopped and its world deleted. No new permanent GameTests,
commit, push or publication.
## Beta .119 — saved instability and status-effect providers
The player passed .118 crystal portal testing. This slice begins the major instability
port using the 1.21.1 scoring rules, complete Legacy card catalog, deterministic deck
selection, bounded scheduler and potion-provider implementation.
New Ages save creation-time contributions and selected provider IDs/levels in separate
Overworld SavedData (`rivencraft/instability`), alongside an independent enabled flag.
Creation saves this with the Age identity before catalog publication. Reload and
configuration changes do not reroll the frozen plan. Older Ages remain neutral rather
than being rescored. No score or provider detail is added to player books or Binder UI.
The first scoring set includes Bright Lighting (+500, also when seed-completed),
Accelerated (+1,000 each), Corrupted Medium (+1,000), Small (+2,000) and Large (+0),
Cave-ineffective weather/celestial modifiers (+100 each), structure occurrences after
the first three (+100 each), authored structures forced into non-native biomes (+100
per occurrence), and growing costs for the third and later suns (+1,000, +2,000, ...).
The same structure policy includes the new 26.3 Abandoned Camps page. Corrupted Pages
are now implemented in authoring/creative availability; they retain animated redacted
text and supply instability rather than a terrain decoration.
All five Legacy decks and card costs/copy counts are retained. Scoring rounds down to
500 before selecting/shuffling from the Age seed. Unported hazard cards remain selected
and are reported as unavailable; no replacement reroll biases the deck toward potions.
Writing-recovery penalties, live valuable-material profiling, decay, lightning,
explosions, meteors, burning and erosion remain later slices. This is not yet full
instability parity, and the existing authoring validation rules still apply.
Implemented providers: local/global Blindness, Mining Fatigue, Hunger, Nausea, Poison,
Slowness, Weakness and Wither, plus global hostile Regeneration and Resistance. Local
variants require visible sky; global variants work under cover. Harmful general effects
can affect Survival/Adventure players and non-player living entities; Creative and
Spectator are exempt. Hostile buffs target monsters. Duration follows the 1.21.1 values:
60 ticks Blindness/Nausea, 80 Fatigue/Hunger/Poison/Slowness/Weakness, 30 Wither, and 200
hostile buffs. Provider level raises amplifier, not duration; default effective cap is 3.
The scheduler runs only in occupied runtime Ages, selecting already-loaded nearby
chunks. Defaults match 1.21.1: 20-tick interval, four Ages, two providers and one action
per run, at most 16 chunks. Status leases cap at 32 per Age, eight candidates per attempt,
and 200 ticks per effect. A failed handler is quarantined temporarily. Owned effects
are revoked on departure/logout/disable/shutdown without deleting replacements or
stronger/extended effects from another source. Config entries are under `[instability]`
and `[instability_status_effects]` in the server's `rivencraft-local.toml`; provider
exclusions accept `poison` or `rivencraft:poison`.
Operator commands, used inside a runtime Age:
- `/rivencraft_port instability status`: frozen score/contributions, saved or test
provider levels, enabled/availability information.
- `/rivencraft_port instability enabled false` (or `true`): persistently pause/resume
this Age; pausing immediately clears owned effects without changing its saved plan.
- `/rivencraft_port instability test_score 5000`: session-only deterministic provider
selection at a test score, leaving creation-time contributions unchanged.
- `/rivencraft_port instability clear_test_score`: restore saved selection. Restart
also clears the test override.
- `/rivencraft_port instability pulse poison_global`: attempt one implemented level-1
effect on an eligible living entity in the current already-loaded chunk. The command
respects config, enabled state, target policy and effect ownership; it reports when
no effect was applied. Existing effects are not replaced. Other catalog providers
are suggested too, with unavailable handlers explicitly reported.
Validation: build and fresh dedicated-server startup passed. A small temporary Age
confirmed neutral scoring, deterministic test deck selection, exact Poison duration,
owned-effect cleanup on disable, retention of a stronger command-supplied Weakness,
local shelter versus global effects, saved enabled state after restart and session
score reset. The server was stopped and its world deleted. No permanent test fixtures
were added. Player authoring/scoring, automatic occupied-Age scheduling, Survival versus
Creative behavior, departure cleanup, hostile buffs and multiplayer fairness remain
manual checks. No commit, push or publication.
## Beta .120 — colored decay
The player passed .119. This slice ports the four active 1.21.1 colored decay cards,
the block and all four existing 16x16 textures, per-Age frontier persistence, surface
seeding and six-neighbor conversion. Decay is selected by the existing saved Legacy
decks; older saved provider selections are not rerolled.
Blue, Red and Purple use the same hardness-dependent conversion odds as 1.21.1.
White converts eligible solid blocks without a hardness roll. Air conversion remains
rarer (Blue/Red 1-in-20, Purple 1-in-8, White 1-in-50). Other decay colors can be
converted; White wins that conversion immediately and others use a 1-in-5 roll.
White also deals one point of magic damage on stepping contact, using the modern
server damage API. All decay variants are solid, hardness 5/resistance 10, have no
item form or drops, and do not spread through autonomous/random block ticks.
A provider call samples at most four six-neighbor targets by default and changes at
most one block, sharing the existing scheduler's Age/provider/action budgets. It only
examines supplied already-loaded player-nearby chunks. Per-Age SavedData retains a
monotonic attempt sequence and at most 1,024 frontier coordinates per color; no chunk
or entity references are persisted. Destroyed/recolored stale sources are discarded.
Protection matches 1.21.1: fluids, unbreakable/critical blocks, block entities,
portals and Rivencraft infrastructure resist conversion. Data packs can add entries
to `rivencraft:decay_protected`. A positioned fake player supplies modern NeoForge
BreakBlockEvent and placement events, with rollback for cancelled placement.
The first resolved Descriptive Book landing is saved as a protected spawn without
changing scoring or provider selection. It protects +/-4 blocks horizontally and
Y-2 through Y+4. Portals and hand-held books share that resolver. For an Age entered
before .120, re-enter it once to record this point; OP status reports whether it is
recorded. Cloud Platforms and Rivencraft infrastructure remain protected independently.
`[instability] world_mutation` and `[instability_decay] enabled` default to true,
matching 1.21.1. `max_attempts_per_call` defaults to 4 (range 1–6). Per-Age enable,
global enable and provider exclusions also gate seeding/spread. Disabling does not
remove existing decay. As in 1.21.1, existing White block contact damage follows the
decay/world-mutation toggles rather than the Age provider scheduler toggle.
Operator testing, inside an Age and preferably away from its protected arrival:
- `/rivencraft_port instability decay blue 32` makes up to 32 bounded provider
attempts in your current loaded chunk. Use `purple`, `red` or `white` too. It prints
the number of actual changes and up to four nearby tracked coordinates, without
changing score/selection. A failed roll or protected location can yield no change.
- The existing `/rivencraft_port instability pulse decayblue` (and other colors)
attempts one call. Its output now describes successful actions for either blocks
or living entities.
- `/rivencraft_port instability test_score 50000` allows natural deck selection for
observation; inspect `status` for the selected colors, then use `clear_test_score`
to restore the saved plan. Merely placing decay does not register an active card.
Validation: build and fresh dedicated-server startup passed. Bounded pulses seeded
and spread all four colors. On restart, the saved attempt sequence advanced from
32 to 40 and the original frontiers persisted, with further Red growth. Bedrock and
water seeding produced no conversions/frontier entries; disabling the Age blocked
further changes. All packaged textures are 16x16. The temporary server was stopped
and world deleted. Manual checks remain for visual variants, White stepping damage,
protected arrival, normal occupied-Age spreading, claim-mod cancellation and controls.
No permanent test fixtures, commit, push or publication.
## .116–.120 release validation
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.