docs(runicnpc): stage 4 decisions D243–D248 #305
@@ -57,6 +57,12 @@ architectural or design decision is implemented.
|
|||||||
| **D240** | **A route is recorded point by point:** `/rnpc path record <name>` starts it, `/rnpc path point` adds where the admin stands (checked against the navmesh; a bad point is refused with the reason), `/rnpc path undo` drops the last, `/rnpc path save [loop\|back]` writes it, `/rnpc path cancel` discards it. Nothing is drawn on screen (D216). | The same flow with the points drawn on screen; a point dropped every few metres as the admin walks. |
|
| **D240** | **A route is recorded point by point:** `/rnpc path record <name>` starts it, `/rnpc path point` adds where the admin stands (checked against the navmesh; a bad point is refused with the reason), `/rnpc path undo` drops the last, `/rnpc path save [loop\|back]` writes it, `/rnpc path cancel` discards it. Nothing is drawn on screen (D216). | The same flow with the points drawn on screen; a point dropped every few metres as the admin walks. |
|
||||||
| **D241** | **A placement made in game is named after its profile and a number** (`/rnpc place bandit` answers "Placed bandit-3"), and `/rnpc rename <id> <new>` renames it. `/rnpc near` lists the names. | Bare numbers; the admin naming every placement. |
|
| **D241** | **A placement made in game is named after its profile and a number** (`/rnpc place bandit` answers "Placed bandit-3"), and `/rnpc rename <id> <new>` renames it. `/rnpc near` lists the names. | Bare numbers; the admin naming every placement. |
|
||||||
| **D242** | **`/rnpc place` and `/rnpc here` take `key=value` options in any order after the profile:** `count=`, `respawn=`, `mode=each\|group`, `move=wander\|monument\|route:<name>`, `radius=`. Anything left out takes the profile's default. | `/rnpc place bandit 3 300 group route:gate`; `/rnpc place` then `/rnpc set`. |
|
| **D242** | **`/rnpc place` and `/rnpc here` take `key=value` options in any order after the profile:** `count=`, `respawn=`, `mode=each\|group`, `move=wander\|monument\|route:<name>`, `radius=`. Anything left out takes the profile's default. | `/rnpc place bandit 3 300 group route:gate`; `/rnpc place` then `/rnpc set`. |
|
||||||
|
| **D243** | **An event's "Place NPCs" picker shows both, grouped:** the site's profiles first, then Rust's own scientists as today. Existing events keep working. A server without RunicNPC offers only Rust's own until stage 9 makes RunicNPC required (stage 4). | Profiles only, flagging old steps to be re-picked; profiles only, with old steps still running silently. |
|
||||||
|
| **D244** | **A server's own profiles are adopted by the site on its first push.** Before it pushes to a server for the first time, the site reads that server's standalone profiles (`rnpc.profile`) and imports each one as a profile for that server alone, so nothing on the server changes and its placements keep spawning. This refines D221's "replace" for the first push, as the permission manager's adopt does (stage 4). | Replacing them, leaving their placements "profile missing" (D237); listing them for the admin to adopt or discard one by one, holding that server's push until each is decided. |
|
||||||
|
| **D245** | **On the site, an admin lists, edits and creates placements, a new one by clicking the live map.** The server puts the clicked point on the ground at that spot and checks it against the navmesh, refusing with the reason as in game. A roof or a building top cannot be chosen from the map; that stays an in-game placement (stage 4). | List and edit only; creating at a monument; a read-only list. |
|
||||||
|
| **D246** | **The map's placement form has `/rnpc place`'s options** (D242): profile, count, respawn, each or group, movement and radius. The server names the placement, as in game (D241) (stage 4). | The profile only, everything else edited afterwards. |
|
||||||
|
| **D247** | **Kills are counted by profile name, per server, by default. Each site profile can choose otherwise** with a "kills count" setting: *this server* (the default), *every server with a profile of this name*, or *this profile only* (the site profile, on whichever servers it is pushed to). The org lead's words: "by name per server (default) with options for the server admin to choose different ways" (stage 4, refines D225). | One fixed rule; one site-wide setting; one setting per server. |
|
||||||
|
| **D248** | **Stage 4 is one stage, with a PR in each of its four repositories plus docs, walked once end to end** (stage 4). Its wire changes join protocol 13, which is not yet released. | Split into 4a (wire), 4b (site) and 4c (shipping), each walked before the next. |
|
||||||
|
|
||||||
**Borrowing, not copying.** NpcSpawn states no licence at all, so its source grants us nothing and is read only as a
|
**Borrowing, not copying.** NpcSpawn states no licence at all, so its source grants us nothing and is read only as a
|
||||||
description of *what* can be done in Rust. HumanNPC is MIT on uMod, which is GPL-compatible, but §1.2 rules out its
|
description of *what* can be done in Rust. HumanNPC is MIT on uMod, which is GPL-compatible, but §1.2 rules out its
|
||||||
@@ -674,7 +680,11 @@ granted and one standalone profile made from the console (`rnpc.profile create b
|
|||||||
|
|
||||||
### Stage 4 — Runic Gateway integration
|
### Stage 4 — Runic Gateway integration
|
||||||
|
|
||||||
Across four repositories, split into 4a–4c if it grows:
|
Across four repositories, one PR in each plus docs, walked once end to end (D248). The org lead's answers on
|
||||||
|
2026-09-30 are D243–D248: the event picker shows profiles and Rust's own scientists (D243); a server's own profiles
|
||||||
|
are adopted, not replaced, on the first push (D244); placements are listed, edited and created from the live map
|
||||||
|
with `/rnpc place`'s options (D245, D246); and kills are counted by profile name per server unless a profile says
|
||||||
|
otherwise (D247).
|
||||||
|
|
||||||
- **Rust-Plugins (the bridge):**
|
- **Rust-Plugins (the bridge):**
|
||||||
- hello reports RunicNPC's presence and API version;
|
- hello reports RunicNPC's presence and API version;
|
||||||
@@ -682,25 +692,30 @@ Across four repositories, split into 4a–4c if it grows:
|
|||||||
- the killfeed names NPCs by their name (§1.4);
|
- the killfeed names NPCs by their name (§1.4);
|
||||||
- new frames: an NPC died, with profile, name, killer and contributors; a health threshold; placements changed;
|
- new frames: an NPC died, with profile, name, killer and contributors; a health threshold; placements changed;
|
||||||
- `player.tally` counts NPC kills per profile;
|
- `player.tally` counts NPC kills per profile;
|
||||||
- profiles and placements pushed from the site, as the permission sync is.
|
- profiles pushed from the site, as the permission sync is, after the server's own are read for adoption (D244);
|
||||||
|
- placements read, edited, removed and created from the site; a created one is put on the ground at the clicked
|
||||||
|
point and checked against the navmesh (D245).
|
||||||
- **Rust-Link:** routes for profiles and placements, and the frames forwarded.
|
- **Rust-Link:** routes for profiles and placements, and the frames forwarded.
|
||||||
- **Module-Rust:**
|
- **Module-Rust:**
|
||||||
- an **NPC profiles** admin page (per server, shared or fleet-wide) with the kit check;
|
- an **NPC profiles** admin page (per server, shared or fleet-wide) with the kit check, the adoption of a server's
|
||||||
- a **placements** view per server;
|
own profiles (D244), and each profile's "kills count" setting (D247);
|
||||||
- `rust.npc.place` takes a profile, through a new option source `rust.options.npc_profiles`;
|
- a **placements** page per server: the list with each placement's values, state and note, edits, rename, remove,
|
||||||
|
respawn, and a new placement made by clicking the live map, with `/rnpc place`'s options (D245, D246);
|
||||||
|
- `rust.npc.place` takes a profile, through a new option source `rust.options.npc_profiles`, grouped with Rust's
|
||||||
|
own scientists in the picker (D243);
|
||||||
- triggers `rust.npc.died` and `rust.npc.health`, so a phase can wait for "8 guards died" (waves) or "the boss
|
- triggers `rust.npc.died` and `rust.npc.health`, so a phase can wait for "8 guards died" (waves) or "the boss
|
||||||
below 50%";
|
below 50%";
|
||||||
- per-profile stats and titles.
|
- per-profile stats and titles, counted as each profile says (D247).
|
||||||
- **Installer and egg:**
|
- **Installer and egg:**
|
||||||
- RunicNPC becomes a third artefact in the Rust bundle, pinned and checksummed like the plugin and the sidecar
|
- RunicNPC becomes a third artefact in the Rust bundle, pinned and checksummed like the plugin and the sidecar
|
||||||
(D224);
|
(D224);
|
||||||
- `doctor` reports it missing or edited;
|
- `doctor` reports it missing or edited;
|
||||||
- the egg installs it.
|
- the egg installs it.
|
||||||
|
|
||||||
The wire changes join protocol 13 if it is still unreleased, or open 14.
|
The wire changes join protocol 13, which is still unreleased (D248).
|
||||||
|
|
||||||
**Tested by** the usual trio: each repository's suites, both rigs through the site, and a browser walk of both new
|
**Tested by** the usual trio: each repository's suites, both rigs through the site, and a browser walk of both new
|
||||||
pages. An event run places profile NPCs, waves advance on their deaths, and teardown removes them.
|
pages, placing from the map included. An event run places profile NPCs, waves advance on their deaths, and teardown removes them.
|
||||||
|
|
||||||
### Stage 5 — Behaviour
|
### Stage 5 — Behaviour
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user