diff --git a/modules/rust/PLAN.md b/modules/rust/PLAN.md index a0b16f4..2aed1c2 100644 --- a/modules/rust/PLAN.md +++ b/modules/rust/PLAN.md @@ -1,7 +1,7 @@ # `module-rust` — the plan **Before the Module-Rust cutover (phase 19):** the first player walk's fixes and the org lead's -decisions from it (D159–D172) are planned in [`PLAN_FIXES.md`](PLAN_FIXES.md), 2026-09-26. +decisions from it (D159–D174) are planned in [`PLAN_FIXES.md`](PLAN_FIXES.md), 2026-09-26. **Status:** phases 0 and 1 done, 2026-09-15. **Twenty-two decisions of record, no open questions.** Audited against the whole contract, not just the game-facing chapters (§7); the event and engagement catalogues are §9 and §10; §11 is a second pass over `MODULE_API.md` @@ -6989,7 +6989,7 @@ line, `confirms it connected.` (installer#34). The first walk of [`PLAYER_WALK.md`][pw] with a real player (the Oxide pass, org lead in game) found fifteen places where the bridge or the site does something other than this plan and [`PROTOCOL.md`][protocol] say, and the -org lead took fourteen decisions on it (D159–D172) — among them **D160, which reverses D31**: the site now owns every +org lead took sixteen decisions on it (D159–D174) — among them **D160, which reverses D31**: the site now owns every permission and group, not only those it authored. They are planned in their own document, [`PLAN_FIXES.md`](PLAN_FIXES.md), so this one stays a record of the phases as built. diff --git a/modules/rust/PLAN_FIXES.md b/modules/rust/PLAN_FIXES.md index b74d07e..514798d 100644 --- a/modules/rust/PLAN_FIXES.md +++ b/modules/rust/PLAN_FIXES.md @@ -1,7 +1,7 @@ # `module-rust` — plan fixes **Status:** plan, awaiting the org lead's approval, 2026-09-26; its four open questions were answered the same -day (D169–D172). **Everything in it — fixes and redesigns alike — lands before Module-Rust's cutover +day (D169–D174). **Everything in it — fixes and redesigns alike — lands before Module-Rust's cutover (phase 19, [`PLAN.md`](PLAN.md) §34, D145; D169).** Everything here comes from the first walk of [`PLAYER_WALK.md`](../../rust-link/PLAYER_WALK.md) with a real player in the game — the Oxide pass, walked by the org lead on the `rust-oxide` rig with every frame checked on the console, the sidecar and the site's @@ -56,6 +56,8 @@ Taken by the org lead during and straight after the walk. | **D170** | **An expired zone is marked expired on the site.** Once F13 makes `world.expired` recognisable, ingest marks the run's resource row `expired`. This amends D96's "the website maps it to nothing". F14. | | **D171** | **Steam sign-in belongs to the website's own plan and is part of the base website**, exposed to modules however they need it. It leaves this document (§4.8). | | **D172** | **Chat titles use all twenty-three conditions the org lead listed, under new names** (§4.6). Rejected: a first subset. | +| **D173** | **"Quests completed" counts Rust's own missions** — the ones the game's NPCs already hand out on the map. No quest plugin. How the bridge detects a completed mission is settled by a spike on the rig (§4.6), because uMod's catalogue names no mission hook and [`CARBON.md`](CARBON.md) lists none among Carbon's own. | +| **D174** | **The title rules §4.6 recommended are adopted:** the two kill-distance titles are *best* columns (the longest single kill), not sums; a weapon-class kill counts any kill the player is credited with (players, NPCs, animals), from weapon lists kept in one place; the APC and the helicopter credit the killing blow; healing counts only other players. | ## 2. Fixes @@ -288,20 +290,36 @@ path requires (PROTOCOL.md §8.7), and each must be checked on Carbon, whose cat | Players healed | **Mender** | healing *another* player — `OnHealingItemUse` on someone else, and `OnPlayerRevive` | | Rockets fired | **Artillerist** | `OnRocketLaunched` | | Explosives thrown | **Demolitionist** | `OnExplosiveThrown` and `OnExplosiveDropped` | -| Quests completed | **Wayfarer** | a quest plugin — none is installed; choose one, or a D168 helper | +| Quests completed | **Wayfarer** | Rust's own NPC missions (D173) — detection settled by the spike below | -What the detailed plan has to settle before building: +The rules, adopted (D174): -- **Two kinds of column.** Every existing leaderboard column is a sum; the two distance titles need a *best* (the +- **Two kinds of column.** Every existing leaderboard column is a sum; the two distance titles are a *best* (the largest single value). The tally carries the interval's maximum, and the site keeps the running best. -- **What a weapon-class kill counts.** Recommended: any kill the player is credited with — players, NPCs and - animals — so Fletcher rewards a hunter as well as a raider. The weapon lists (bow, blade, revolver) are named - sets in one place, so a Rust update adds a weapon by editing a list. -- **Credit for a vehicle kill.** The APC and the helicopter are usually killed by several people. Credit the player - who dealt the killing blow (`HitInfo.InitiatorPlayer`) — simple, and the rule the killfeed already uses. -- **Healing someone else**, never yourself — otherwise Mender is earned by bandaging after every fight. +- **A weapon-class kill counts any kill the player is credited with** — players, NPCs and animals — so Fletcher + rewards a hunter as well as a raider. The weapon lists (bow, blade, revolver) are named sets in one place, so a + Rust update adds a weapon by editing a list. +- **A vehicle kill goes to the killing blow.** The APC and the helicopter are usually killed by several people; + credit the player who dealt the last hit (`HitInfo.InitiatorPlayer`) — the rule the killfeed already uses. +- **Healing counts only other players**, never yourself — otherwise Mender is earned by bandaging after every fight. - **Counters are aggregates** (rule 2): all of these ride on `player.tally`, never one frame per shot, craft or swing. -- **Quests** wait on a quest plugin; the other twenty-two do not. + +**Wayfarer: Rust's own missions (D173).** The game already has quests — the missions its NPCs hand out at +monuments — so no quest plugin is installed and none is needed. What is not known is how to see one finish: +**uMod's hook catalogue ([`HOOKS.md`](HOOKS.md)) names no mission hook, and [`CARBON.md`](CARBON.md) lists none +among Carbon's own**, so the detailed plan +starts with a spike on the rig, trying in this order and keeping the first that works on both frameworks: + +1. **A framework hook** the catalogues missed — check Oxide's and Carbon's current hook lists at build time, since + both grow with Rust updates. +2. **Read the game's own record.** The player object keeps its missions and their status; at each tally flush the + plugin counts the ones that became *completed* since the last flush. No hook, main thread, public fields only + (R2). The spike confirms the field names and statuses against the live server's assembly. +3. **A D168 helper** that patches mission completion (both frameworks load Harmony) and raises a hook the bridge + subscribes to — the last resort, because a patch breaks when Facepunch changes the method. + +The spike's pass condition is a person on the rig taking a mission from an NPC, finishing it, and seeing Wayfarer's +count move by exactly one — and not moving for a mission abandoned or failed. ### 4.7 NPCs @@ -374,11 +392,11 @@ After step 2 of §6, on both frameworks: ## 9. Answered, and what stays open The four questions this plan first asked were answered on 2026-09-26: the gate (D169), F14 (D170), Steam sign-in -(D171) and the title conditions (D172). +(D171) and the title conditions (D172) — then quests (D173) and the title rules (D174). Left for the detailed plans of §6 step 3, none of them blocking the fixes: -1. The quest plugin behind Wayfarer — or a D168 helper. +1. How a completed mission is detected — the spike in §4.6 (D173). 2. Whether the plugin or the site filters monument types (§4.5). 3. The ZoneDomes default type and stack, chosen by looking at each on the rig (§4.4). 4. The NPC route — a plugin, or extending `rust.npc.place` (§4.7). diff --git a/modules/rust/README.md b/modules/rust/README.md index 396b4ee..7466998 100644 --- a/modules/rust/README.md +++ b/modules/rust/README.md @@ -24,7 +24,7 @@ differ. for actually building `module-rust`. Everything else in this directory is copied from uMod; those two are written by this project and are where the phases, the settled decisions and the local test rig are recorded. [`PLAN_FIXES.md`](PLAN_FIXES.md) is its companion: the first player walk's fixes and decisions -D159–D172, all to land before the Module-Rust cutover. +D159–D174, all to land before the Module-Rust cutover. > **This is a mirror, not a specification we own.** uMod is upstream and wins any disagreement; the > point of copying it is availability and grep-ability, not authority. Nothing here may be cited as a