docs(rust): the last fixes' docs (N1 N2 W20 W22 W23) and stage 4's core docs
Stage 5 of PLAN_LAST_FIXES (docs#366). - OPERATING.md: a RaidableBases section. Change its config with a restart, never a reload (N2); switching to the free edition rewrites a paid pack's profiles (N1). - PLAN_REDESIGNS 14.3.4: no manual retry for Dangerous Treasures (Q39, W20); 11.4: which hook rbevent setowner raises (W23); 9.1 status. - PLAYER_WALK: rows 2.2, 2.8 and 2.9, Before you start item 8 (BetterChat and the four title rules), Carbon's share trimmed to 2.11 (W22, W23). - PROTOCOL: 20.5 world.error already-out (W3), 20.12 the rollback's log is RaidableBases' own (W9) and setowner's two hooks (W23). - Core, from website#219: MODULE_SYSTEM 2.5 and MODULE_API 4.2 (one module at boot, W19), MODULE_API and EVENTS L (a resource's until read at reconcile, W1), EVENTS D/I/K and BACKEND_DESIGN (a draft's dry run carried by fingerprint, W5), EVENTS observability (W2's words). - PLAN_LAST_FIXES: status, Q37-Q40 answers, 7 updated, 8 what was built. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
@@ -5,8 +5,8 @@ configure and permission plugins. This is the surface our own deployment story h
|
||||
of, the way [`installer/INSTALL.md`](../../installer/INSTALL.md) sits on top of ServUO.
|
||||
|
||||
> **Mirrored verbatim from uMod on 2026-09-15** — 6 pages. uMod is upstream and normative.
|
||||
> The last section, [Guarded Crate and NpcSpawn](#guarded-crate-and-npcspawn), is Runic Gateway's own and
|
||||
> is not part of the mirror.
|
||||
> The last two sections, [Guarded Crate and NpcSpawn](#guarded-crate-and-npcspawn) and
|
||||
> [RaidableBases](#raidablebases), are Runic Gateway's own and are not part of the mirror.
|
||||
|
||||
---
|
||||
|
||||
@@ -19,6 +19,7 @@ of, the way [`installer/INSTALL.md`](../../installer/INSTALL.md) sits on top of
|
||||
- [Data Files](#data-files-plugins-data-files) — Where plugin data lives on disk
|
||||
- [Permissions](#permissions-plugins-permissions) — Granting permissions and managing groups in-game
|
||||
- [Guarded Crate and NpcSpawn](#guarded-crate-and-npcspawn) — Runic Gateway's note on an optional plugin that needs a Codefling extension
|
||||
- [RaidableBases](#raidablebases) — Runic Gateway's note on changing RaidableBases' config and switching its edition
|
||||
|
||||
---
|
||||
|
||||
@@ -410,3 +411,29 @@ not check and would drop a crate with no guards. Admin → Rust servers shows Np
|
||||
as it ships), not its config. The site offers whatever names that file holds. A crate placed by an event is
|
||||
**kept when the event ends** (D373): Guarded Crate has no way to end one event, and `gcrate stop all` ends every
|
||||
one on the server.
|
||||
|
||||
---
|
||||
|
||||
<a id="raidablebases"></a>
|
||||
|
||||
## RaidableBases
|
||||
|
||||
<sub>Runic Gateway's own section, not mirrored. Design: [PLAN_REDESIGNS.md](PLAN_REDESIGNS.md) §11.4; wire:
|
||||
[PROTOCOL.md](../../rust-link/PROTOCOL.md) §20.12; found in the end walk
|
||||
([PLAN_LAST_FIXES.md](PLAN_LAST_FIXES.md) N1, N2).</sub>
|
||||
|
||||
**RaidableBases** is one of the optional plugins Runic Gateway reports and drives, in either edition (D348).
|
||||
Two of its own behaviours catch operators out.
|
||||
|
||||
**Change its config with a server restart, never a reload (N2).** *Applying changes* above says to reload a
|
||||
plugin after editing its config. Do not do that with RaidableBases while the server is running. After
|
||||
`oxide.reload RaidableBases`, its list of live raids can hold an empty entry. Every hook that walks that list
|
||||
then fails: damage to a base, its SAM sites, players' commands, and `/buyraid`'s cooldown check, so a purchase
|
||||
does nothing and charges nothing. The end walk saw this after reloads with and without bases up, and only a
|
||||
full server restart cleared it. It is RaidableBases' own bug. Carbon's `c.reload` was not tried in the end walk, so treat it
|
||||
the same way: edit the config, then restart the server.
|
||||
|
||||
**Switching from the paid edition to the free one rewrites the paid profiles (N1).** Putting the free
|
||||
edition's `RaidableBases.cs` in place of the paid one rewrites the profiles a paid base pack installed, and
|
||||
their bases are dropped from them. Going back to the paid edition does not bring them back. Back up
|
||||
RaidableBases' config and data folders before you switch editions, and restore them if you switch back.
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# `module-rust` — the last fixes before the cutover
|
||||
|
||||
**Status:** plan, written 2026-10-21 after the end walk's in-game pass. Nothing in it is built yet. Each fix waits
|
||||
for the org lead's go, and the questions in §5 are answered before the code they shape. It continues
|
||||
**Status:** **stages 1–5 done, 2026-10-22.** Every fix in §3 is built, and §8 names the PR for each. The
|
||||
questions in §5 were answered on 2026-10-21, and the stage 4 decisions on 2026-10-22. Stage 6, the release and
|
||||
the cutover, waits for the org lead's go, and §7's clean-up comes after it. Written 2026-10-21 after the end
|
||||
walk's in-game pass, as a plan. It continues
|
||||
[`PLAN_REDESIGNS.md`](PLAN_REDESIGNS.md) §9.1, which lists W1–W20 and N1 from the passes without a player. This
|
||||
document adds what the in-game pass found and puts everything in one list, in the order it should be built.
|
||||
|
||||
@@ -142,6 +144,18 @@ retry a step that is still pending.
|
||||
site now has title rules for the richest, raids, treasures and guarded crates. Keep both, or remove them with the
|
||||
rest of §7?
|
||||
|
||||
**Answered 2026-10-21, each with the recommended option:**
|
||||
|
||||
- **Q37: (c), and stricter at boot (2026-10-22).** One game module per site. The proposal was a clear message
|
||||
when the second module's slot collides. The org lead chose a full stop instead: the first module directory by
|
||||
name loads, and every other is refused before its code is required, as the installer already refuses one.
|
||||
No MODULE_API change ([`MODULE_SYSTEM.md`](../../website/MODULE_SYSTEM.md) §2.5,
|
||||
[`MODULE_API.md`](../../website/MODULE_API.md) §4.2).
|
||||
- **Q38:** the release and the cutover do not wait for §6's second-player rows. They are walked when a second
|
||||
player is free.
|
||||
- **Q39: (a).** PLAN_REDESIGNS §14.3.4 drops "the manual retry". Docs only.
|
||||
- **Q40: keep both.** BetterChat stays on the Oxide rig, and the four title rules stay on the walk site.
|
||||
|
||||
---
|
||||
|
||||
## 6. Still owed, with a second player
|
||||
@@ -153,14 +167,30 @@ rows of 4.4. They are written in PLAYER_WALK and need no change.
|
||||
|
||||
## 7. Cleaning up after the walk
|
||||
|
||||
Done on the org lead's go, after §5's Q40:
|
||||
Done on the org lead's go, after stage 6. Q40 keeps BetterChat on the Oxide rig and the title rules on the walk
|
||||
site, so neither is in this list:
|
||||
|
||||
- **Oxide rig:** remove A from the owners (`removeowner`, then `server.writecfg`). Remove the walk-only
|
||||
RgKitProbe plugin, which holds god mode and a teleport command, and the RgWalk stand-in plugin. Restore
|
||||
RaidableBases' config from the walk's backup, which takes away the 100-coin Easy and Medium buy costs, and
|
||||
**restart** the server rather than reloading (N2).
|
||||
- **Walk site:** remove A's test grants (`backpacks.use` on Oxide; the `backpacks.use` given on Carbon), and
|
||||
the title rules if Q40 says so.
|
||||
- **Walk site:** remove A's test grants (`backpacks.use` on Oxide; the `backpacks.use` given on Carbon).
|
||||
- **Steam:** rotate the Steam Web API key, which was pasted into the chat that ran the walk, and put the new
|
||||
one in Admin → Auth → Steam.
|
||||
- **W21** stays patched only on the walk site until §4 step 1 lands. Nothing else depends on the walk site's copy.
|
||||
- **The rigs' bridge:** both rigs still run stage 3's branch (Rust-Plugins#43), now merged to `edge`. The release
|
||||
puts the released bridge on them.
|
||||
- **W21** landed in stage 1 (Module-Rust#54), so the walk site's hand patch is no longer needed.
|
||||
|
||||
---
|
||||
|
||||
## 8. What was built
|
||||
|
||||
One PR per repo per stage, each merged into `edge` (the Rust repos and website) or `main` (docs) by the org lead.
|
||||
|
||||
| Stage | PR | Fixes |
|
||||
|---|---|---|
|
||||
| 1, the two bugs (2026-10-21) | Module-Rust#54 | **W21**: the push sends `notices`. **W4**: the credit rule is stamped on each helicopter and Bradley row at ingest and read from the stamp; a row from before the fix is read by the current rule |
|
||||
| 2, Module-Rust's small fixes (2026-10-21) | Module-Rust#55 | W3 (reads the bridge's `already-out` as a success that called 0), W6, W7 and W11 (a "not loaded" refusal is confirmed against the sidecar, at most every 5 s and within 3 s), W8, W10, W13–W16. **W17**: the sync state only, *"in sync · N wait for their player to join"*; the run log is unchanged, because core has no way for a module to add a line to it. **W18**: the number is dropped from the note |
|
||||
| 3, the bridge (2026-10-21) | Rust-Plugins#43 | W3 (`world.error` `already-out`), W9 (RaidableBases' own log lines since the write), W12 (`raid.ended` carries `id`, and `runId` and `key` for a run's base). No protocol bump, because PROTOCOL already listed W12's fields. Walked on both rigs |
|
||||
| 4, core (2026-10-22) | website#219, Module-Rust#56 | **W19**: one module per site at boot (Q37). W1: a zone reports `until`, and a reconcile files a resource gone past it as `expired`. W5: a draft's passing dry run carries over by spec fingerprint. W2: *"Phase p1: steps done, waiting to advance"*. No MODULE_API bump. Walked on the walk site |
|
||||
| 5, docs (2026-10-22) | docs (this stage) | N1 and N2 in OPERATING.md. W20 in PLAN_REDESIGNS §14.3.4 (Q39). W22 and W23 in PLAYER_WALK, PROTOCOL §20.12 and PLAN_REDESIGNS §11.4. The wire changes stages 2–3 made without a doc edit (PROTOCOL §20.5's `already-out`, §20.12's rollback log). Stage 4's core docs: MODULE_SYSTEM §2.5, MODULE_API §4.2 and the resource `until`, EVENTS §D, §I, §K and §L, and BACKEND_DESIGN's three new columns |
|
||||
|
||||
@@ -14,8 +14,8 @@ raised D335–D336 (§11.2.1). Economics was built on 2026-10-12 too (§11.2.4).
|
||||
D342–D346), planned and built the same day. On 2026-10-14 RaidableBases was deferred until the current paid copy arrives (D347), with both editions to be supported (D348, §11.4.2). The same day the org lead added Rust's own world events to the base module (§13, D349) and six more first-class optional plugins (§14, D350–D352), to be tested together in one phase before their integration plan. Their questions were answered the same day (D353–D359, the end walk now waiting for RaidableBases), and Steam sign-in stays on the website's plan, linked as §15 (D360). **The §14.2 test phase ran the same day on both rigs (§14.2.1)**: the org lead ruled D361–D362 during it and answered its Q19–Q25 the same day (D363–D369). On 2026-10-16 the org lead added console commands as event steps and rewards (§16, D382–D384), to be built before RaidableBases; **they were built the same day (§16.10)**, with D385. The same day the paid RaidableBases copy arrived; **its spike ran on both rigs (§11.4.2)**, with D386 and four questions, Q33–Q36, answered the same day (D387–D390). **§11.4 was built the same day (§11.4.6)**, with D391, core's dry-run advice. On 2026-10-19 the org lead answered Steam sign-in's questions (D392–D396, §15), and it is built on the website's `edge` to join the cutover. **Every item left is built, tested and PR'd first; every walk —
|
||||
theirs and the ones still owed by §3 and §5 — happens together at the end (D331, §9).** **The end walk's rows
|
||||
that need no player ran on 2026-10-16 and 2026-10-19, and all of them are done (§9.1)**: W1–W20 and N1 found, W4
|
||||
and W19 the real ones. **The in-game pass ran on 2026-10-21** and found W21–W23 and N2; every fix left is listed,
|
||||
in building order, in [`PLAN_LAST_FIXES.md`](PLAN_LAST_FIXES.md).
|
||||
and W19 the real ones. **The in-game pass ran on 2026-10-21** and found W21–W23 and N2. **All of them were fixed
|
||||
by 2026-10-22** ([`PLAN_LAST_FIXES.md`](PLAN_LAST_FIXES.md)); the protocol 14 release and the cutover come next.
|
||||
|
||||
This is a companion to [`PLAN_FIXES.md`](PLAN_FIXES.md) and [`PLAN.md`](PLAN.md). Where they disagree, this
|
||||
document is later and wins. Its decisions continue PLAN_FIXES' numbering at **D188**.
|
||||
@@ -986,8 +986,8 @@ lead, 2026-10-19).**
|
||||
- **§5.7 and §3.4** passed in RunicNPC's 9d (stand-ins on 2026-10-07, the org lead in game on 2026-10-09), so
|
||||
they are not walked again.
|
||||
|
||||
**Found** (none fixed yet; each waits for the org lead; the whole list, with the in-game pass's W21–W23 and N2, is
|
||||
[`PLAN_LAST_FIXES.md`](PLAN_LAST_FIXES.md)):
|
||||
**Found** (all fixed by 2026-10-22, in [`PLAN_LAST_FIXES.md`](PLAN_LAST_FIXES.md)'s stages 1–5, which also list the
|
||||
in-game pass's W21–W23 and N2 and the PR that fixed each):
|
||||
|
||||
| # | Where | What |
|
||||
|---|---|---|
|
||||
@@ -1189,7 +1189,7 @@ The org lead answered the phase's Q19–Q25 on 2026-10-14:
|
||||
|---|---|---|---|
|
||||
| **D363** | **Carbon's console route (Q19): watch Carbon's updates and keep an issue open in Rust-Plugins so it is not forgotten** ([Rust-Plugins#34](https://gitea.whitlocktech.com/RunicGateway/Rust-Plugins/issues/34)). No workaround is built for now; each new Carbon production build is re-tested. | Running commands through Carbon's `CommandManager` by reflection now. | 14.2.1 |
|
||||
| **D364** | **A missing NpcSpawn is reported and refused (Q20):** the hello reports NpcSpawn beside Guarded Crate, the site refuses a guarded-crate step without it and says why, and the operator docs say what NpcSpawn does on load. | Documenting it only. | 14.2.1 |
|
||||
| **D365** | **Dangerous Treasures' warm-up (Q21):** a step that fails because DT is not ready says so (*"Dangerous Treasures is not ready yet"*), retries once on its own after ten minutes, **and offers staff a manual retry** on the run. | Failing with DT's own text; the bridge pre-warming DT at boot. | 14.2.1 |
|
||||
| **D365** | **Dangerous Treasures' warm-up (Q21):** a step that fails because DT is not ready says so (*"Dangerous Treasures is not ready yet"*), retries once on its own after ten minutes, **and offers staff a manual retry** on the run. *(The manual retry was dropped on 2026-10-21, Q39: core retries only a failed step, and the automatic retry is enough. §14.3.4.)* | Failing with DT's own text; the bridge pre-warming DT at boot. | 14.2.1 |
|
||||
| **D366** | **One Bradley event, two places (Q22):** `bradley.destroyed` carries `where: launch_site | road`, and both count toward *Tankbreaker*. | Two separate events; Launch Site only. | 14.2.1, 13 |
|
||||
| **D367** | **The newer events join §13 (Q23):** the satellite crash, the Deep Sea opening and closing, and the ghost ship's crate (a fourth crate location) are feed events and triggers. **The F-15 flyover is not an event; it can be added to an event as decoration**, a step that calls the flyover (D354). | The F-15 as a feed event or trigger. | 14.2.1, 13 |
|
||||
| **D368** | **TruePVE in the zone step (Q24):** a *"no PvP protection in this zone"* checkbox (`exclude`), plus an optional ruleset name typed by staff, which the bridge validates by `AddOrUpdateMapping`'s own `false`. | Checkbox only; reading TruePVE's config file. | 14.2.1, 3 |
|
||||
@@ -1865,6 +1865,10 @@ still there. It is private and not a `[HookMethod]`, but **`Call` reaches it on
|
||||
despawn) and `OnRaidableBasePurchased` (8 arguments, the same without the load time) come only from
|
||||
`TrySetPayLock`. That runs when a player buys a base, or when an admin runs
|
||||
`rbevent setowner <player> [lockout]`. `OnRaidableBaseUnlocked` (8 arguments) is its undoing.
|
||||
**Which of the two it raises** follows `paylock = !args.Contains("lockout")`: a purchase and the plain
|
||||
`rbevent setowner <player>` raise `OnRaidableBasePurchased`, and only `rbevent setowner <player> lockout`
|
||||
raises `OnRaidableBaseLocked`. *(Corrected 2026-10-22: this read as if the plain command locked. The end
|
||||
walk's in-game pass showed it reads as "bought", [PLAN_LAST_FIXES.md](PLAN_LAST_FIXES.md) W23.)*
|
||||
- **Locking to the first attacker raises no hook**, and neither does a **lockout** (the per-player cooldown
|
||||
after a raid, kept in the plugin's own data). So D202's "the feed carries lockouts" still has nothing to
|
||||
listen to (Q36).
|
||||
@@ -2984,9 +2988,11 @@ both go when the zone lasts out; cargo's ring for the ship's life; one of our zo
|
||||
verify where DT is absent or `console.plugins` is false, naming Rust-Plugins#34 for the second.
|
||||
- **D365.** `dt-not-ready` is reported as *"Dangerous Treasures is not ready yet"*, and the step answers
|
||||
`{ ok: false, retry: true, retryAfterMs: 600000 }`: **core's new per-failure retry delay (D371, §14.3.13)**, so
|
||||
the run tries once more ten minutes later. `dt-no-spot` retries on core's ordinary 60 s. The manual retry is
|
||||
core's own: the step's `on_failure` pauses the run, and staff press **Retry** on the paused step
|
||||
([EVENTS.md](../../website/EVENTS.md) §I), which re-sends the same key.
|
||||
the run tries once more ten minutes later. `dt-no-spot` retries on core's ordinary 60 s. **There is no manual
|
||||
retry** (Q39, 2026-10-21). Core's **Retry** ([EVENTS.md](../../website/EVENTS.md) §I) is for a step that has
|
||||
failed, and a step waiting out `retryAfterMs` is still pending ("a pending step cannot be retried", even with
|
||||
the run paused). It is not needed either: DT's warm-up is fifteen minutes, so the automatic retries succeed by
|
||||
the third attempt (W20, found in the end walk).
|
||||
- **Feed and triggers.** *"A Dangerous Treasures event started at K12"*; *"Alice won the treasure at K12"*;
|
||||
ended is staff-only. `rust.dt.started` and `rust.dt.won` are triggers (§14.3.9).
|
||||
- **A column and a title**, `treasureswon`, default *Treasure Hunter* (D375).
|
||||
@@ -2996,7 +3002,7 @@ both go when the zone lasts out; cargo's ring for the ship's life; one of our zo
|
||||
the column and category.
|
||||
|
||||
**Walk rows.** On Oxide: start each difficulty from a run; start one in the first minutes after a restart and
|
||||
see *"not ready yet"*, the automatic retry and the manual retry; win one and see the line, the column and the title.
|
||||
see *"not ready yet"* and the automatic retry; win one and see the line, the column and the title.
|
||||
On Carbon: the step refused with Rust-Plugins#34 (until D363 clears).
|
||||
|
||||
> **Built on 2026-10-15** (§14.3.18), specified in PROTOCOL.md §20.8. The key's join, how a start that opened
|
||||
|
||||
Reference in New Issue
Block a user