fix(bridge): protocol 13 step 2 — expiry, gathering, raids, plugin loads, and a ZoneManager helper (F1 F3 F4 F8 F12 F13) #18
Reference in New Issue
Block a user
No description provided.
Delete Branch "fix/protocol-13-step2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The bridge's half of PLAN_FIXES §6 step 2. Decisions D181–D185 are in docs#288; the spec is in the step-2 docs PR (PROTOCOL.md §19.4–19.7).
Fixes
world.expiredcarries the entity's kind aswhat. It used to write that over the frame's ownkind, so every expiry was filed as "zone".gatheredalso countsOnDispenserBonus,OnCollectiblePickupandOnGrowableGathered. All three are void and listed inExpectedHooks.structures. The frame still goes out.UserIDStringnow goes throughSteamIdOf(userID).plugin.loaded/plugin.unloadedcarry the permissions that plugin added or removed, as a diff taken one tick after the hook. They are sent only after the world is ready.RunicGatewayZones.cs. It Harmony-postfixes ZoneManager'sZone.InitializeZone, then one tick later enters every connected player that ZoneManager'sIsPositionInZoneputs inside, through ZoneManager's ownOnPlayerEnterZone. Without it, the bridge scores its zones byIsPositionInZone. Hello carrieszoneHelper: { state, version?, reason? }.release.ymlstages the helper beside the bridge and lists every.cswith its sha256 inmanifest.files. The installer (installer PR) and the egg (Rust-Link PR) place them all.Walked on both rigs, 2026-09-27
ListHashSethas noToArray. It loggedpatched ZoneManager 3.1.14on both.HarmonyLibresolved with no reference directive.zoneHelper: {"state":"patched","version":"0.1.0"}from both hellos.["kits.admin","kits.rgreward"]on both frameworks, and the helper's own load sent[]. A Carbonc.reload(unload and load in one tick) sends[]on both frames, which is correct: the registered list didn't change.Not walked yet (needs a player in game): F12 with somebody standing in a zone (created, and across a restart), F1 wood and hemp, F3 own wall, F13 end to end with a zone expiring into a site that records it. These are the new PLAYER_WALK section's rows 3–9.
Tracking: Module-Rust#21.
🤖 Generated with Claude Code
https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
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