feat(bridge): RaidableBases — raid.* events, raid.spawn, the raids helper (PLAN_REDESIGNS §11.4) #42

Merged
whitlocktech merged 1 commits from feat/raidable-bases into edge 2026-10-17 01:32:36 -05:00
Member

PLAN_REDESIGNS §11.4 (D202–D208, D386–D391), protocol 14. Spec: docs rust-link/PROTOCOL.md §20.12 (docs PR docs/raidablebases-build).

RunicGatewayRaids.cs, the raids helper (D168, D204–D207, D387). It ships beside the bridge, and release.yml lists it in HELPERS.

  • Three Harmony patches: the spawn queue's Add (tags the request our own call made), OpenEvent (the base it became), and each base's BypassUseOwners() (the run's own lock, D206).
  • A spawn's PvP, NPCs, despawn time and height go on a member-by-member copy of its profile. Setup, NPC and DespawnOptions are copied again, so the shared profile is never touched. PvP is also set on the base after OpenEvent.
  • A spot is checked (D208, D388, D389) and then pasted: our own look for players, buildings, deployables and raid bases; then the plugin's area check with its reason, where rocks and cliffs are warnings; then the ocean level against the ground.
  • One base is despawned through its own Despawn(), and the profiles are reloaded under watch.
  • Both editions are served (the paid SpawnRandomBase call, the free private typed one), every member is found by name, and rgr.status prints the state.

The bridge

  • Hello's integrations.raidableBases: edition, spawnCall, CopyPaste, the plugin's own difficulties (D386), the helper, and with it the grid and profiles.
  • raid.started, raid.completed, raid.ended, raid.purchased and raid.locked. The unload trap's completions (no owner, no raiders) are neither sent nor counted. The tally gains raidsCompleted.
  • map.live gains a raids layer, kept by the hooks and seeded from GetAllEvents().
  • raid.spawn: with the helper, the base is a world registry entry (raid-<ms>-<n>), so world.revert, world.owned and world.expired serve it (never-started after 15 min, raidablebases-unloaded). Without the helper, the paid call or rbevent is used, and the base is not the run's.
  • raid.check gives the editor's advice.
  • RaidableBases' profiles are in the configuration editor under a virtual @data/RaidableBases/Profiles/ path (D205). Writes are all profiles or none, reloaded by the helper, and rolled back when a profile doesn't load.

Tested on both rigs (Rust 25902425, Oxide 2.0.7830, Carbon 2.0.262; paid 3.2.2, CopyPaste 4.3.0, tier-3 pack) through a throwaway plugin calling the handlers. Both routes passed with every setting, plus the spot check, a repeat key, revert, expiry, the unload, and a good and a broken profile edit. Details are in PLAN_REDESIGNS §11.4.6.

One rig finding. Paid RaidableBases on the Oxide rig broke on every spawn with none of our plugins loaded, and a restart cleared it. Recorded in §11.4.6. Both rigs are back on the edge bridge, with the helper, RaidableBases and CopyPaste removed; the pack's config and data stay for the end walk.

node scripts/checkPlugin.js: protocol 14, 89 hooks, all void and listed. Tests 18/18.

Siblings: Rust-Link feat/raidable-bases, Module-Rust feat/raidable-bases, installer feat/raidable-bases, website#217.

  • AI-assisted: written with Claude Code (Claude Opus 5.5)

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

PLAN_REDESIGNS §11.4 (D202–D208, D386–D391), protocol 14. Spec: docs `rust-link/PROTOCOL.md` §20.12 (docs PR `docs/raidablebases-build`). **`RunicGatewayRaids.cs`, the raids helper** (D168, D204–D207, D387). It ships beside the bridge, and `release.yml` lists it in `HELPERS`. - Three Harmony patches: the spawn queue's `Add` (tags the request our own call made), `OpenEvent` (the base it became), and each base's `BypassUseOwners()` (the run's own lock, D206). - A spawn's PvP, NPCs, despawn time and height go on a **member-by-member copy** of its profile. `Setup`, `NPC` and `DespawnOptions` are copied again, so the shared profile is never touched. PvP is also set on the base after `OpenEvent`. - A spot is checked (D208, D388, D389) and then pasted: our own look for players, buildings, deployables and raid bases; then the plugin's area check with its reason, where rocks and cliffs are warnings; then the ocean level against the ground. - One base is despawned through its own `Despawn()`, and the profiles are reloaded under watch. - Both editions are served (the paid `SpawnRandomBase` call, the free private typed one), every member is found by name, and `rgr.status` prints the state. **The bridge** - Hello's `integrations.raidableBases`: edition, `spawnCall`, CopyPaste, the plugin's own difficulties (D386), the helper, and with it the grid and profiles. - `raid.started`, `raid.completed`, `raid.ended`, `raid.purchased` and `raid.locked`. The unload trap's completions (no owner, no raiders) are neither sent nor counted. The tally gains `raidsCompleted`. - `map.live` gains a `raids` layer, kept by the hooks and seeded from `GetAllEvents()`. - `raid.spawn`: with the helper, the base is a world registry entry (`raid-<ms>-<n>`), so `world.revert`, `world.owned` and `world.expired` serve it (`never-started` after 15 min, `raidablebases-unloaded`). Without the helper, the paid call or `rbevent` is used, and the base is not the run's. - `raid.check` gives the editor's advice. - RaidableBases' profiles are in the configuration editor under a virtual `@data/RaidableBases/Profiles/` path (D205). Writes are all profiles or none, reloaded by the helper, and rolled back when a profile doesn't load. **Tested** on both rigs (Rust 25902425, Oxide 2.0.7830, Carbon 2.0.262; paid 3.2.2, CopyPaste 4.3.0, tier-3 pack) through a throwaway plugin calling the handlers. Both routes passed with every setting, plus the spot check, a repeat key, revert, expiry, the unload, and a good and a broken profile edit. Details are in PLAN_REDESIGNS §11.4.6. **One rig finding.** Paid RaidableBases on the Oxide rig broke on every spawn with none of our plugins loaded, and a restart cleared it. Recorded in §11.4.6. Both rigs are back on the edge bridge, with the helper, RaidableBases and CopyPaste removed; the pack's config and data stay for the end walk. `node scripts/checkPlugin.js`: protocol 14, 89 hooks, all void and listed. Tests 18/18. Siblings: Rust-Link `feat/raidable-bases`, Module-Rust `feat/raidable-bases`, installer `feat/raidable-bases`, website#217. - [x] AI-assisted: written with Claude Code (Claude Opus 5.5) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-10-16 19:30:31 -05:00
feat(bridge): RaidableBases — raid.* events, raid.spawn, the raids helper (PLAN_REDESIGNS §11.4)
All checks were successful
PR Checks / plugin-checks (pull_request) Successful in 11s
e0d6c46850
PLAN_REDESIGNS §11.4 (D202-D208, D386-D390), protocol 14. Spec: docs
rust-link/PROTOCOL.md §20.12.

- RunicGatewayRaids.cs, the raids helper (D168, D204-D207, D387), shipped
  beside the bridge and released with it. Harmony patches on RaidableBases'
  spawn queue Add, OpenEvent and each base's BypassUseOwners(): a run's base
  is tagged at birth, its PvP/NPCs/despawn/lock set on a member-by-member copy
  of its profile (Setup, NPC and DespawnOptions copied again, so the shared
  profile is never touched), PvP also set on the base after OpenEvent; a spot
  checked (own look, then the plugin's area check with its reason, rocks and
  cliffs a warning; then the ocean level, D388, D389) and pasted; one base
  despawned; profiles reloaded under watch. Both editions, every member found
  by name. rgr.status.
- Hello's integrations.raidableBases: edition, the paid spawn call (looked
  for by name, D348), CopyPaste, the plugin's own difficulties (D386), the
  helper, and with it the grid and the profiles.
- raid.started / raid.completed / raid.ended / raid.purchased / raid.locked
  from the lifecycle hooks; the unload trap's completions (no owner, no
  raiders) are neither sent nor counted. The tally's raidsCompleted (Warlord).
- map.live's raids layer, kept by the hooks and seeded from GetAllEvents().
- raid.spawn: with the helper the base is a world registry entry, so
  world.revert / world.owned / world.expired serve it (never-started after
  15 min, raidablebases-unloaded); without it the paid call or rbevent, not
  the run's. raid.check for the editor's advice (D208, D391).
- RaidableBases' profiles in the configuration editor (D205): a virtual
  @data/RaidableBases/Profiles/ path, all-profiles-or-none writes, reloaded by
  the helper and rolled back when a profile does not load.

Compiled on both rigs (Rust 25902425, Oxide 2.0.7830, Carbon 2.0.262) and
driven on both rigs with the paid 3.2.2 and the tier-3 pack through a
throwaway plugin: the pick and spot routes with every setting, a repeat key,
revert, expiry, and a good and a broken profile edit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit 48aa62a07a into edge 2026-10-17 01:32:36 -05:00
whitlocktech deleted branch feat/raidable-bases 2026-10-17 01:32:37 -05:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RunicGateway/Rust-Plugins#42
No description provided.