The bridge's half of PLAN_FIXES §6 step 2 (decisions D181-D185, docs#288).
- F13: `world.expired` carries the entity's kind as `what`. It used to write
it over the frame's own `kind`, so every expiry left filed as "zone".
- F1 (D159): `gathered` also counts OnDispenserBonus (the final-hit bonus),
OnCollectiblePickup (hemp, mushrooms, stones off the ground) and
OnGrowableGathered (farmed plants); all three are void and in ExpectedHooks.
- F3: taking down a building block you own, or one on a cupboard you are
authorised on, no longer counts toward `structures`. The frame still goes.
- F4: every remaining UserIDString is SteamIdOf(userID), so a player another
plugin spawned is never `steamId: null`.
- F8 (D184): `plugin.loaded` / `plugin.unloaded`, once the world is ready,
with the permissions that plugin added or removed (a diff of the registered
list, taken a tick after the hook).
- F12 (D181, D182): RunicGatewayZones.cs, a D168 helper shipped beside the
bridge, Harmony-postfixes ZoneManager's Zone.InitializeZone and, a tick
later, enters every connected player ZoneManager's own IsPositionInZone
places inside, through ZoneManager's own OnPlayerEnterZone. Without it (or
when it cannot find what it patches) the bridge scores its zones by
IsPositionInZone. Hello reports `zoneHelper: { state, version?, reason? }`.
- release.yml stages every helper beside the bridge and lists each .cs with
its sha256 in manifest.files; the installer and the egg place them all.
Not yet compiled: this is walked on both rigs before it merges.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
80 lines
4.7 KiB
TOML
80 lines
4.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: 13 — 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.
|
|
protocol = 13
|
|
|
|
# ── 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"]
|