Stage 5's behaviour (docs runicnpc/PLAN.md, D253-D272):
- profiles gain faction, relations (exceptions), alertRadius, turrets,
hurtByPlayers, hurtsPlayers and kitUse, and the guard role; the faction
table rides in profiles.json, one row per pair, both ways (D254, D268);
- our own sensing and fight beside Rust's design: only the factions a
profile hunts, within its leash of its anchor (D263), the target made
Horror for the length of our own shot, and Rust's attack routine;
- shooting back at whoever hurt it (D268), the alert radius (D256), clan,
team or player allies that are never targeted and are defended with
what they own (D257), escort as an order that walks home when its
charge is gone (D269), and a placement's tether through ZoneManager
(D272);
- turrets: ignore through CanBeTargeted, and always through a Harmony
patch on the safe-zone sentries for our always NPCs only (D267);
- the kit's extras, each opted into and used up: heal, melee,
flamethrower, grenades and rockets (D260, D265);
- TruePVE/NextGenPVE answered both ways unless a profile turns a direction
off, and the opt-out enforced by RunicNPC itself (D261, D271);
- API 4: RunicNpc_Factions, _SetFactions, _Escort, _Ally, _Tether and the
OnRunicNpcEscortEnded hook; rnpc follow, rnpc.faction and tether=.
Compiled and loaded on both rigs (Oxide and Carbon); the sentry patch
applies on both.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
RunicNPC now spawns its own NPC: Rust's scientist with its ScientistNPC and
ScientistBrain swapped for ours, copying a fixed field list generated from
Rust's unmodified assembly (D232, tools/fieldlist). Profiles live in
data/RunicNPC/profiles.json in the approved shape (D238); placements persist
with each/group respawn (D236) and wait for a missing profile or route
(D237); roamers wander, follow Rust's monument paths, or walk a route (D233,
D234), with our own chase where Rust's needs an AI zone; sentries hold their
spot; NPCs walk home and sleep past 160 m of any player (D235). Spawns wait
for the navmesh and are spread over frames; caps are off by default and the
cost warning is shown instead (D227). The whole PLAN.md section 4 API and its
hooks are in, documented in docs/runicnpc/API.md.
tools/RunicNpcTest.cs is the stage 2 harness; every group passed on both
rigs, and after a plugin reload and a server restart. checkPlugin no longer
counts an override (RunicNpcPlayer.OnDied) as a hook.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
The repository RunicNPC is built in (docs/runicnpc/PLAN.md §9, stage 0):
- plugin/RunicNPC.cs: `// Requires: Kits` (D217), `[Info]` with the 0.0.0
placeholder the release stamps, `RunicNpc_ApiVersion()` (API 1), and
`rnpc.status`, which reports the version and which hooks have fired. It
spawns nothing.
- plugin.toml: the API version, the framework floors it was loaded on
(Oxide 2.0.7726, Carbon 2.0.259) and requires_plugins = ["Kits"].
- scripts/checkPlugin.js, adapted from Rust-Plugins': every hook listed and
void unless written down; chat-command signatures; every RunicNpc_ call
reachable by Call (the HumanNPC trap, PLAN.md §1.2); ApiVersion,
`// Requires:` and [Info] agreeing with plugin.toml. 23 self-tests, including
the real plugin and a CRLF checkout.
- PR Checks on PRs into main and edge; the release workflow on main, with
Rust-Plugins' release engine unchanged and an adapter that ships
runicnpc-<ver>.tar.gz (runicnpc/RunicNPC.cs + manifest.json) and SHA256SUMS.
No bundle dispatch until stage 4.
- tools/: the rig panel scripts, with the panel and server ids moved into a
git-ignored tools/rigs.json. `con.js` became `console.js`: CON is a reserved
device name on Windows, and git there cannot open the file.
- README, CONTRIBUTING (edge-based flow, AI disclosure, borrow-not-copy),
SECURITY, the code of conduct, issue and PR templates.
`feat:` so the cutover to main cuts the first release, 0.1.0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY