Files
runicnpc-rust/plugin.toml
wtclaude f8084955e8
All checks were successful
PR Checks / plugin-checks (pull_request) Successful in -1m38s
feat: stage 2, the NPC and its API (API 2)
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
2026-09-30 01:31:04 -05:00

49 lines
2.7 KiB
TOML

# Release metadata for RunicNPC.
#
# Consumed by the release workflow, which folds these values into the
# manifest.json shipped inside the release tarball. The Runic Gateway installer
# and the Pterodactyl egg read that manifest to decide what they are placing
# (docs/runicnpc/PLAN.md D224), and the bridge will read the same `api` at hello
# (stage 4).
#
# There is deliberately NO version key here. The release version is derived from
# git tags and conventional commits by the release workflow, so there is no bump
# commit to keep in sync and no way for this file to disagree with the tag.
# ── The API version other plugins call ───────────────────────────────────────
#
# The number a caller of `RunicNpc_*` relies on (PLAN.md §4). It MUST equal
# `ApiVersion` in plugin/RunicNPC.cs; `node scripts/checkPlugin.js` holds the two
# equal on every pull request. It moves when a call or a raised hook changes
# shape, not on every release.
#
# The plugin answers this at run time through `RunicNpc_ApiVersion()`, but only
# once a server has booted with it loaded — too late for an installer to refuse
# a RunicNPC too old for the bridge it is pairing with. Declaring it here is what
# lets a bundle check the pair BEFORE an operator installs it.
#
# 1 was stage 0's: `RunicNpc_ApiVersion()` and nothing else.
# Current: 2 — stage 2's whole API, PLAN.md §4, documented in docs/runicnpc/API.md.
api = 2
# ── Framework floors ─────────────────────────────────────────────────────────
#
# The same file runs on Oxide and Carbon; the installer and the egg decide
# whether it lands in `oxide/plugins/` or `carbon/plugins/`. These are the builds
# it is known good on — the two rigs it was loaded on — not a measured minimum.
# (The bridge's Oxide floor is older, 2.0.7585; RunicNPC has never run on that.)
min_oxide_version = "2.0.7726"
min_carbon_version = "2.0.259"
# ── Plugins it cannot load without ───────────────────────────────────────────
#
# Kits is how every RunicNPC NPC is equipped, and it is required (D217). The
# plugin says so itself with `// Requires: Kits`, which stops either framework
# loading it without Kits; this list is the same fact for the installer's
# `doctor`, which reports a missing one rather than installing it. The PR check
# holds this list and the plugin's `// Requires:` lines equal.
#
# ZoneManager is NOT listed: a zone tether is optional (PLAN.md §6), and a
# profile that asks for one on a server without it is refused when it is saved.
requires_plugins = ["Kits"]