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:
2026-10-22 01:36:57 -05:00
parent 27dd1f8d80
commit 20518ca816
9 changed files with 177 additions and 39 deletions

View File

@@ -2989,8 +2989,12 @@ credit block. A protocol-13 plugin still sends them, and the site still adds the
**`EventsMaxWorldCalls`** (config, default and ceiling 10) world events per run, counted over every call the
run made; behind `EventsEnabled`. A count the game partly ran answers `called` below `count`.
- Refusals are `world.error`: `not-ready`, `events-disabled`, `malformed` (no key or run, or a key over 128
characters), `bad-event`, `bad-count`, `not-placeable`, `too-many`, §15's location refusals, and `refused`
(the game had nothing to run).
characters), `bad-event`, `bad-count`, `not-placeable`, `too-many`, §15's location refusals, `refused`
(the game had nothing to run), and **`already-out`**: a `travelling_vendor` call while a Travelling Vendor is
already out. The game runs one at a time, so nothing is called, counted toward `EventsMaxWorldCalls` or kept
(W3, Rust PLAN_LAST_FIXES; before, the call answered `called: 1` and spawned nothing). Module-Rust reads it as
a success that called 0, and the step's note says *"a Travelling Vendor is already out on Main, and the game
runs one at a time; nothing new was called"*.
- `world.monuments` gains `maxWorldCalls`.
**Hello and status gain `console`: `{ "plugins": true | false }` (D363).** Whether this framework runs a plugin's
@@ -3568,8 +3572,11 @@ the old assembly, and the helper patches again. `rgr.status` prints its state.
- **The unload trap (§11.4.2):** a RaidableBases unload raises `Completed` for every live base with no owner
and no raiders. **Such a completion is neither sent nor counted.**
- `raid.purchased` and `raid.locked` come from the paid edition's `OnRaidableBasePurchased` and
`OnRaidableBaseLocked`: a player bought a base, or an admin ran `rbevent setowner` (D390). **Lockouts have no
hook in either edition and are not sent.**
`OnRaidableBaseLocked` (D390). A player buying a base raises `raid.purchased`. An admin's
**`rbevent setowner <player> lockout`** raises `raid.locked`. **The plain `rbevent setowner <player>` raises
`raid.purchased`**, as if the player had bought it, because RaidableBases' `TrySetPayLock` takes
`paylock = !args.Contains("lockout")` (W23, found in the end walk). **Lockouts** (the per-player cooldown
after a raid) **have no hook in either edition and are not sent.**
- `despawnAt` is the plugin's despawn time, in unix milliseconds.
- **None is sent while the world is not live** (§20.5's rule). A completion is still counted.
@@ -3666,7 +3673,12 @@ reloads the profiles as `rb.reloadprofiles` does**, and the reply is `pending` a
(§19.1). The `config.outcome` (`reload: "RaidableBases"`) settles when the helper's reload finishes: every
written profile in the plugin's table is `reloaded`; one that is not is **rolled back** and the old file
reloaded. Thirty seconds without a finished reload rolls back too. RaidableBases rewrites every profile file as
it reloads, so the outcome carries each file's version as it is on disk afterwards.
it reloads, so the outcome carries each file's version as it is on disk afterwards. **A rollback's log is
RaidableBases' own** (W9, Rust PLAN_LAST_FIXES): the bridge marks the server log's position when the job
starts, and reads back only RaidableBases' entries written since (tagged `[RaidableBases]`, which is how it
logs on both frameworks, or its title), without their stacks. When the failed profiles are named, only the
entries that name them are kept. When RaidableBases said nothing, there is no log, and the reason line stands
alone. Before, the outcome carried the tail of the server log, which is mostly other plugins' lines.
**Hooks.** `OnRaidableBaseStarted`, `OnRaidableBaseEnded`, `OnRaidableBaseCompleted`, `OnRaidableBasePurchased`
and `OnRaidableBaseLocked` join `rg.hooks`' list.