3.6 KiB
Instability controls and diagnostics (Milestone 6, issue #72)
The world-specific NeoForge server config (serverconfig/rivencraft-server.toml) is the global policy. instability.enabled stops all scheduled effects without changing a saved Age. instability_providers.<id> switches each Legacy card independently; these switches do not reroll frozen provider levels. The existing instability_status_effects, instability_decay, instability_hazards, instability_meteor, instability_scorching, and instability_erosion groups provide category policy and action limits. instability.world_mutation, hazard/meteor block_damage, player_damage, and fire settings control destructive behavior. mobGriefing and doFireTick still apply. Defaults retain the Legacy-active hazards; the scheduler, spawn protection, loaded-chunk checks, and per-effect caps remain Rivencraft safety adaptations. The dormant-in-Legacy erosion effect remains enabled for project testing but can be switched off.
Configuration values are read during server operation, but editing the TOML on disk does not guarantee NeoForge will reload it. Restart the server or world after changing the file; /reload reloads data packs, not this server config. Per-Age commands below take effect on the next scheduler pass without a restart. A stopped provider does not refund or change the Age's score or saved plan. Existing owned status-effect leases are revoked on their next 20-tick check after global, category, provider, or Age disablement. In-flight meteors are cancelled when their Age or meteor provider is disabled. Existing block changes are not rolled back.
Operators can inspect /rivencraft age instability [dimension]. The argument accepts an Age name (quote names containing spaces), a short path such as fort, or a full ID such as rivencraft:age/fort. Duplicate names require the full ID shown by /rivencraft age list. The command reports the frozen score and each saved contribution, the frozen provider IDs/levels and their current runtime eligibility, config limits, and whether this Age is enabled. "Eligible" does not promise an effect on the next tick: chance, cooldowns, loaded chunks, player presence, and protection still apply. An unavailable handler is reported as such instead of being mistaken for an active provider. Pre-scoring Ages remain neutral, and missing provider plans from older scored saves are migrated once as described in runtime policy. /rivencraft age instability disable <dimension> and enable <dimension> are operator-only and persist for that Age alone. Unknown dimensions are rejected. Neither command mutates a book, score, or provider plan.
Newly bound Descriptive Books carry only a server-written numerical potential-instability summary for their tooltip and cover. The details and live enablement stay server-side in the operator command. Older written books receive the summary when opened through the server-approved book screen; until then, an absent tooltip score means "not yet synchronized," not zero. The score does not indicate whether effects are currently enabled.
Manual check: create two scored Ages, disable one with the command, and inspect both. Only the selected Age should show "Age disabled"; its saved breakdown and plan should remain identical. Re-enable it, then switch an individual provider in the world config and restart. Its plan should remain identical while diagnostics show "provider config off." An old neutral Age should report score zero and no selected providers. A non-operator should be unable to invoke the mutation commands. Test tooltips both on a newly bound book and an older book after opening it once.