From c48efe18c0760a684bd5361c5dfb7735b6427999 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Wed, 30 Sep 2026 03:39:47 -0500 Subject: [PATCH 1/2] docs(runicnpc): stage 4 decisions D249-D251 D249: RunicNPC gets API 3 in stage 4 (a fifth PR): a call that creates and names a placement from a map point it grounds and checks, rename and respawn calls, and a hook raised when a placement changes. D250: per-profile kills on the player's public stats, as a title category, and as a leaderboard ranked by a picked profile. D251: where an adopted server profile and a site profile share a name on that server, the site's wins; the server's own is kept as "replaced". Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY --- runicnpc/PLAN.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/runicnpc/PLAN.md b/runicnpc/PLAN.md index c11b8b9..0dbaa62 100644 --- a/runicnpc/PLAN.md +++ b/runicnpc/PLAN.md @@ -5,7 +5,8 @@ decided with it. **Stage 1 measured 2026-09-30** (§9): six answers on both rigs; D231 was decided with it. **Stage 2's design answered 2026-09-30:** D232–D238 (§0), which reshape stage 2 (§9). **Stage 2 built and tested 2026-09-30** on both rigs (§9); its API is [API.md](API.md). **Stage 3's design answered 2026-09-30:** D239–D242 -(§0). **Stage 3 built and tested 2026-09-30** on both rigs (§9); its in-game walk waits for a player. +(§0). **Stage 3 built and tested 2026-09-30** on both rigs (§9); its in-game walk waits for a player. **Stage 4's +design answered 2026-09-30:** D243–D251 (§0). RunicNPC is Runic Gateway's own NPC plugin for Rust servers, in its own repository, [`RunicGateway/runicnpc-rust`](https://gitea.whitlocktech.com/RunicGateway/runicnpc-rust). It runs on Oxide and @@ -63,6 +64,9 @@ architectural or design decision is implemented. | **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. | +| **D249** | **RunicNPC gets API 3 in stage 4, a fifth PR, in `runicnpc-rust`**: a call that creates a placement and names it as `/rnpc place` does (D241, D246), puts a map point on the ground and checks it against the navmesh (D245), and a hook raised whenever a placement changes, so an edit made in game reaches the site at once. The bridge only calls it (stage 4). | The bridge copying the naming rule and checking the placements every minute. | +| **D250** | **Per-profile kills are shown on the player's public stats ("Warden kills: 3"), in a "kills of a profile" title category, and as a leaderboard the visitor picks a profile for** (stage 4, D225, D247). | The player page and titles only; titles only. | +| **D251** | **Where an adopted server profile and a site profile share a name on that server, the site's wins** (stage 4, refines D244). The server's own is still imported, marked "replaced" and kept for an admin to restore, and that server's placements take the site profile's values. | The adopted one winning on its server, with the site's profile skipping it. | **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 @@ -684,8 +688,12 @@ Across four repositories, one PR in each plus docs, walked once end to end (D248 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). +otherwise (D247). Three more answers followed the same day: RunicNPC itself gets API 3, a fifth PR (D249); per-profile +kills are on the player's public stats, in titles and on a leaderboard (D250); and where an adopted profile and a site +profile share a name, the site's wins (D251). +- **RunicNPC (API 3, D249):** a call that creates a placement and names it as in game, from a map point it puts on + the ground and checks against the navmesh; rename and respawn as calls; a hook raised whenever a placement changes. - **Rust-Plugins (the bridge):** - hello reports RunicNPC's presence and API version; - `world.place` for an NPC takes a profile, and the placing is RunicNPC's; @@ -705,7 +713,10 @@ otherwise (D247). 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 below 50%"; - - per-profile stats and titles, counted as each profile says (D247). + - per-profile stats and titles, counted as each profile says (D247): on the player's public stats, as a title + category, and as a leaderboard ranked by the profile a visitor picks (D250); + - an adopted profile whose name a site profile already has on that server is kept as "replaced", restorable + (D251). - **Installer and egg:** - RunicNPC becomes a third artefact in the Rust bundle, pinned and checksummed like the plugin and the sidecar (D224); -- 2.49.1 From a3d815dea1f481cbf4b28c1b43be30f7cde4daad Mon Sep 17 00:00:00 2001 From: wtclaude Date: Wed, 30 Sep 2026 04:12:00 -0500 Subject: [PATCH 2/2] docs(runicnpc): D252, a player's per-profile kills in their leaderboard row The module has no public player page, so D250's "player's public stats" are shown by opening the player's row in a server's leaderboard, and to the player on their own Player -> Rust page. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY --- runicnpc/PLAN.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/runicnpc/PLAN.md b/runicnpc/PLAN.md index 0dbaa62..6a5474d 100644 --- a/runicnpc/PLAN.md +++ b/runicnpc/PLAN.md @@ -6,7 +6,7 @@ decided with it. **Stage 1 measured 2026-09-30** (§9): six answers on both rigs **Stage 2's design answered 2026-09-30:** D232–D238 (§0), which reshape stage 2 (§9). **Stage 2 built and tested 2026-09-30** on both rigs (§9); its API is [API.md](API.md). **Stage 3's design answered 2026-09-30:** D239–D242 (§0). **Stage 3 built and tested 2026-09-30** on both rigs (§9); its in-game walk waits for a player. **Stage 4's -design answered 2026-09-30:** D243–D251 (§0). +design answered 2026-09-30:** D243–D252 (§0). RunicNPC is Runic Gateway's own NPC plugin for Rust servers, in its own repository, [`RunicGateway/runicnpc-rust`](https://gitea.whitlocktech.com/RunicGateway/runicnpc-rust). It runs on Oxide and @@ -67,6 +67,7 @@ architectural or design decision is implemented. | **D249** | **RunicNPC gets API 3 in stage 4, a fifth PR, in `runicnpc-rust`**: a call that creates a placement and names it as `/rnpc place` does (D241, D246), puts a map point on the ground and checks it against the navmesh (D245), and a hook raised whenever a placement changes, so an edit made in game reaches the site at once. The bridge only calls it (stage 4). | The bridge copying the naming rule and checking the placements every minute. | | **D250** | **Per-profile kills are shown on the player's public stats ("Warden kills: 3"), in a "kills of a profile" title category, and as a leaderboard the visitor picks a profile for** (stage 4, D225, D247). | The player page and titles only; titles only. | | **D251** | **Where an adopted server profile and a site profile share a name on that server, the site's wins** (stage 4, refines D244). The server's own is still imported, marked "replaced" and kept for an admin to restore, and that server's placements take the site profile's values. | The adopted one winning on its server, with the site's profile skipping it. | +| **D252** | **A player's per-profile kills are shown by opening their row in a server's leaderboard** ("Warden 3 · Bandit 12", for the wipe the page shows), and to the player on their own Player → Rust page. The module has no public player page, and stage 4 adds none (stage 4, the "player's public stats" of D250). | A new public player page; the profile leaderboard only. | **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 @@ -689,7 +690,7 @@ Across four repositories, one PR in each plus docs, walked once end to end (D248 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). Three more answers followed the same day: RunicNPC itself gets API 3, a fifth PR (D249); per-profile -kills are on the player's public stats, in titles and on a leaderboard (D250); and where an adopted profile and a site +kills are on the player's public stats, in titles and on a leaderboard (D250), a player's own shown by opening their leaderboard row (D252); and where an adopted profile and a site profile share a name, the site's wins (D251). - **RunicNPC (API 3, D249):** a call that creates a placement and names it as in game, from a map point it puts on @@ -714,7 +715,8 @@ profile share a name, the site's wins (D251). - triggers `rust.npc.died` and `rust.npc.health`, so a phase can wait for "8 guards died" (waves) or "the boss below 50%"; - per-profile stats and titles, counted as each profile says (D247): on the player's public stats, as a title - category, and as a leaderboard ranked by the profile a visitor picks (D250); + category, and as a leaderboard ranked by the profile a visitor picks (D250); one player's by opening their + leaderboard row, and a player's own on Player → Rust (D252); - an adopted profile whose name a site profile already has on that server is kept as "replaced", restorable (D251). - **Installer and egg:** -- 2.49.1