docs(runicnpc): stage 9b built; INSTALL and COMMANDS; RunicNPC required (D315, D316)

- runicnpc/PLAN.md: 9b built and measured; D315 (the performance check records
  today's cost, the warning says it, idle overhead is runicnpc-rust#13) and D316
  (the picker keeps Rust's own; a step on a server without RunicNPC is refused
  on save).
- runicnpc/INSTALL.md (new): requirements, the installer and egg, by hand
  without Runic Gateway, Kits and ZoneManager reported not installed, its files,
  the cost warning with stage 9's numbers, caps, and after a Rust update.
- runicnpc/COMMANDS.md (new): every /rnpc verb and console command with its
  permission, options and defaults, and how to read rnpc.status.
- rust-link/INSTALL.md: RunicNPC is required; the installer refuses a bundle
  without it and doctor fails. (The plan named modules/rust/OPERATING.md, which
  is a verbatim uMod mirror; this is the operator guide that lists Kits.)
- rust-link/PROTOCOL.md: §19.16, every NPC placement needs RunicNPC; no message
  changes shape.

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-06 21:35:04 -05:00
parent 6cd24bd302
commit eec8e6e698
5 changed files with 306 additions and 11 deletions

View File

@@ -2401,8 +2401,9 @@ in-game rows (flags on a player, the messages) wait for the later in-game walk.
RunicNPC is Runic Gateway's own NPC plugin ([`../runicnpc/PLAN.md`](../runicnpc/PLAN.md), [`API.md`](../runicnpc/API.md)).
**The bridge is its only link to the site**: it calls RunicNPC's API for the site's commands and turns
RunicNPC's hooks into frames, and RunicNPC never talks to the sidecar, so "the sidecar is a dumb forwarder"
stays true. RunicNPC is optional until its stage 9. Without it every `npc.*` command answers `npc.error`
**`runicnpc-missing`**, and an event places Rust's own scientists only (D243).
stays true. Without it every `npc.*` command answers `npc.error` **`runicnpc-missing`**. Until its stage 9 an
event then placed Rust's own scientists only (D243); since stage 9 RunicNPC is required, and an event places no
NPCs at all without it (§19.16).
The bridge needs **RunicNPC API 3** (D249), `RunicNpcApiNeeded` in the code and **`runicnpc_api = 3` in
`overlay.toml`**, which the release copies into its manifest and `checkPlugin.js` holds equal to the code.
@@ -2614,3 +2615,19 @@ Stage 7's wire change **joins protocol 13** while it is unreleased (D299); no me
`false` spawns the NPCs with RunicNPC's override `{"loot":{"dropTable":false}}`: they keep what their profile
starts the corpse with, and roll no loot table. Absent or `true`, as before. The site sends it only when an event's
Place NPCs step switches it off.
### 19.16 RunicNPC stage 9: RunicNPC is required (runicnpc PLAN.md stage 9)
**No message changes shape**, and `PROTOCOL_VERSION` stays 13. What changes is which `world.place` the bridge
refuses (D310): **every placement of NPCs needs RunicNPC loaded and answering `RunicNpcApiNeeded` (6)**, a
`profile` placement and one of Rust's own NPC prefabs (`npc.scientist`, `npc.bandit.guard`, …) alike. Crates are
unaffected. The refusal is checked before anything is spawned, with the two reasons that already exist:
| `reason` | Means | Retried? |
|---|---|---|
| `runicnpc-missing` | RunicNPC is not loaded, so this server places no NPCs | no |
| `runicnpc-old` | RunicNPC answers an API older than the bridge needs | no |
The site checks the same thing first, from the hello's `integrations.runicNpc`, and refuses the step before it
is sent; the bridge's check is for a site that missed the hello. `rg.npc` says the same when RunicNPC is not
loaded.