The boss box on any role but passive (D273): a health bar for players within its distance and everyone who hurt it, redrawn in place at most four times a second (D274); phases at health fractions that change its own copy of the profile (damage, aim, speed, ranges), swap its kit, summon adds one per frame and say a line (D275); spawn and death lines to everyone, phase lines to players near it (D277, D286); adds fight on after it dies (D287). Hooks OnRunicNpcBossSpawned, _BossPhase and _BossDied. The passive role (D278, D279, D288): never fights (GetBestTarget and AttackTick refuse, since Rust's design picks targets from every sensed player), cannot be hurt unless its profile says so, moves as its profile says including the new `stand`, and answers E through OnPlayerInput with a chat line or a window. Hook OnRunicNpcUsed. The four example profiles and their kits, written into Kits' data file on the first load only (D280, D284, D289), each kit needing a permission nobody holds. Kits' return re-checks the profiles. The swap's field list regenerated for Rust 2634.289.1: two new fields, eleven now [NonSerialized]. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
56 lines
3.2 KiB
TOML
56 lines
3.2 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.
|
|
# 2 was stage 2's whole API, PLAN.md §4.
|
|
# 3 was stage 4 (D249): RunicNpc_AddPlacement, _RenamePlacement, _RespawnPlacement and the
|
|
# OnRunicNpcPlacementChanged hook.
|
|
# 4 was stage 5: RunicNpc_Factions, _SetFactions, _Escort, _Ally, _Tether, the profile's stage 5
|
|
# fields, a placement's tether, and the OnRunicNpcEscortEnded hook.
|
|
# Current: 5 — stage 6: the profile's `boss` and `use` blocks and the passive role, the hooks
|
|
# OnRunicNpcBossSpawned, _BossPhase, _BossDied and OnRunicNpcUsed, and `role` and `boss` in
|
|
# RunicNpc_List, documented in docs/runicnpc/API.md.
|
|
api = 5
|
|
|
|
# ── 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). A placement
|
|
# or an event step that asks for one on a server without it is refused (D272).
|
|
requires_plugins = ["Kits"]
|