All checks were successful
PR Checks / plugin-checks (pull_request) Successful in 10s
Wulf's Economics as an optional integration (D199), as §11.2.2 designs it:
- hello/status `integrations.economics` adds startingBalance and wipesWithMap,
read from Economics.json (cached by mtime) because its API has neither.
- `economics.pay`: coins from an event step, kept once paid (D335). One main-
thread call for the list; each deposit measured as after - before, since
Deposit answers true while rounding and clamping (`at-limit` otherwise).
The key and its reply are kept in data/RunicGateway/payments.json for seven
days, so a retry answers `repeat: true` and pays nobody. The optional
message ({amount} = what landed) is told now if awake, else on wake.
- `economics.balances` (bounded by PermMaxOps) and staff `economics.adjust`
(deposit / withdraw / set; a withdrawal above the balance is refused
`insufficient` with the balance).
- `player.tally` gains `balance`, a value: read at connect (D336) and from
OnEconomicsBalanceUpdated, offline players included.
- `economics.wiped` from OnEconomicsDataWiped(IPlayer), with `newSave`.
Amounts are boxed as double and only Steam ids are sent, per the spike.
Compiled on both rigs (Oxide 2.0.7826, Carbon 2.0.262), then restored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
97 lines
5.7 KiB
TOML
97 lines
5.7 KiB
TOML
# Release metadata for the deployable overlay.
|
|
#
|
|
# Consumed by the release workflow, which folds these values into the
|
|
# manifest.json shipped inside the overlay tarball. The Runic Gateway installer
|
|
# reads that manifest to decide what it is deploying and whether it is compatible
|
|
# with the sidecar it is about to install.
|
|
#
|
|
# 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 loopback wire-protocol version this overlay speaks ───────────────────
|
|
#
|
|
# The plugin half of the compatibility contract. It MUST equal the sidecar's
|
|
# PROTOCOL_VERSION (Rust-Link's sidecar/src/main.rs) for a deployment to work:
|
|
# the sidecar rejects a mismatched WEBSITE with 409, and a mismatched PLUGIN is
|
|
# worse, because the game link has no such check — it would simply mis-parse.
|
|
#
|
|
# That asymmetry is why this file exists. The plugin announces its protocol in
|
|
# `server.hello`, which is only readable after the game server has booted with it
|
|
# loaded — far too late for an installer to refuse a bad pairing. This
|
|
# declaration is what lets the bundle CI check the pair BEFORE an operator
|
|
# installs either half.
|
|
#
|
|
# Keeping it honest is a manual duty: when the protocol changes, bump it here in
|
|
# the same change that alters the emitters, exactly as the sidecar bumps
|
|
# PROTOCOL_VERSION and the module bumps its own constant.
|
|
#
|
|
# Current: 14 — the transport, the read path, identity, the permission mirror,
|
|
# configuration from the site, first-party clans, a raid frame that names who
|
|
# lives there, the event leases, the world verbs events place and give back, and
|
|
# the rewards: a run's participation tally, kit credits and chat (PROTOCOL.md §16),
|
|
# the map: its picture and everything that moves on it (PROTOCOL.md §17), and the
|
|
# optional mods: BetterChat titles and group styles, and popups (PROTOCOL.md §18),
|
|
# and the first player walk's fixes (PROTOCOL.md §19) — opened by a configuration
|
|
# save that answers at once and reports its reload as a `config.outcome` frame,
|
|
# and the step editor (PROTOCOL.md §20): `kits.uses`, and the one-time reward
|
|
# messages a `perm.sync` carries as `notices`; and Economics (PROTOCOL.md §20.3):
|
|
# `economics.pay`, `economics.balances`, `economics.adjust`, the tally's
|
|
# `balance` and the `economics.wiped` event.
|
|
protocol = 14
|
|
|
|
# ── Oxide compatibility ──────────────────────────────────────────────────────
|
|
#
|
|
# The overlay only ADDS files — the bridge, and beside it the ZoneManager helper
|
|
# (`RunicGatewayZones.cs`, docs/modules/rust/PLAN_FIXES.md D181, D182), both into
|
|
# `oxide/plugins/` — and patches nothing on disk, so it is expected to work on any
|
|
# reasonably current Oxide. The helper patches ZoneManager in memory with Harmony,
|
|
# which both frameworks load; without it the bridge still loads and falls back.
|
|
# This is the oldest build it is known good on.
|
|
#
|
|
# There is no `patches_verified_against` key, and there is no `patches/` tier:
|
|
# Rust's server is a binary and Oxide's hook API is the supported way in, so
|
|
# there is nothing to diff against. That is the whole reason the Rust payload is
|
|
# simpler than the ServUO one.
|
|
min_oxide_version = "2.0.7585"
|
|
|
|
# ── Carbon compatibility ─────────────────────────────────────────────────────
|
|
#
|
|
# The same file runs unchanged on Carbon (docs/modules/rust/PLAN.md R19); the
|
|
# installer and the egg decide whether it lands in `oxide/plugins/` or
|
|
# `carbon/plugins/`. This is the build R19 was proven on (PLAN.md §34.4).
|
|
#
|
|
# Neither floor is measured from a DLL by `doctor`: a plugin that compiled and
|
|
# connected on this framework is the fact a floor only approximates, so a
|
|
# connected plugin is the pass, and the floors are printed with any failure.
|
|
min_carbon_version = "2.0.259"
|
|
|
|
# The `oxide/plugins/` files this overlay expects to find already installed. They
|
|
# are not shipped here — they are third-party plugins an operator installs from
|
|
# uMod — and the installer's `doctor` reports a missing one rather than
|
|
# installing it. Listing them is what turns a missing reward or zone into a
|
|
# named prerequisite.
|
|
#
|
|
# The uMod **Clans** plugin is deliberately NOT listed (docs/modules/rust/PLAN.md
|
|
# D47). Teams come from Rust's own clan system, which that plugin never touches,
|
|
# so requiring it would split a server's players across two unrelated clan
|
|
# systems. Phase 17 dropped the adapter it was meant to get (D134).
|
|
#
|
|
# **PopupNotifications is not listed either** (D141). It is optional: a popup
|
|
# asked of a server without it is refused with a reason, and chat is the default.
|
|
# BetterChat is optional in the same way — titles and group styles wait for it.
|
|
requires_plugins = ["Kits", "ZoneManager"]
|
|
|
|
# ── The RunicNPC API the bridge needs ───────────────────────────────────────
|
|
#
|
|
# RunicNPC (docs/runicnpc/PLAN.md stages 4 to 7): the bridge's npc.* commands call
|
|
# RunicNPC's API and need at least this version of it. It MUST equal
|
|
# `RunicNpcApiNeeded` in RunicGateway.cs; `node scripts/checkPlugin.js` holds the
|
|
# two equal. The release copies it into manifest.json, and the installer's
|
|
# bundle carries the latest RunicNPC release that answers at least it (D224).
|
|
#
|
|
# RunicNPC is required since its stage 9 (D310): without it, or with one older
|
|
# than this, every npc.* command and every NPC an event places, Rust's own
|
|
# scientists included, is refused as `runicnpc-missing` or `runicnpc-old`.
|
|
runicnpc_api = 6
|