docs(rust): the chat-title conditions as built — PROTOCOL 19.10, PLAN_REDESIGNS 5.8 and D209
PROTOCOL.md §19.10 documents player.tally's new fields and the ten hooks behind them. PLAN_REDESIGNS §5.8 records what the build settled (the category ids, where each is read from, the empty-text rule, the admin API, the plugin's counting choices) and what is left before the walk. D209: a title rule's "NPC kills" ranks human NPCs only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
@@ -461,7 +461,7 @@ Every kind protocol 2 defines, and the hook behind it. **`class` is not a field
|
||||
| `player.respawned` | `OnPlayerRespawned` | **presence** | steamId |
|
||||
| `player.death` | `OnPlayerDeath` | **presence** | victim, attacker, attackerType, weapon, distance, grid |
|
||||
| `player.chat` | `OnPlayerChat` | **presence** | steamId, name, channel, message |
|
||||
| `player.tally` | *aggregate* — see §8.6 | **presence** | steamId, gathered{}, npcKills, structures |
|
||||
| `player.tally` | *aggregate* — see §8.6 | **presence** | steamId, gathered{}, npcKills, structures; from protocol 13 the chat-title counts (§19.10) |
|
||||
| `entity.destroyed` | `OnEntityDeath` on owned building blocks — **and doors, external walls and the cupboard from protocol 7 (§13)** | **staff** | ownerId, prefab, grid, attacker; from protocol 7 also `structure`, `buildingId`, `authorized` |
|
||||
| `player.reported` | `OnPlayerReported` | **staff** | reporter, target, subject, message, type |
|
||||
| `player.banned` / `player.unbanned` | `OnUserBanned` / `OnUserUnbanned` | **staff** | id, name, **ip**, reason |
|
||||
@@ -2245,3 +2245,39 @@ logs its summary instead of replying.
|
||||
Walked on both rigs, 2026-09-27/28. Oxide gave 85 permissions, every one owned (`RustCore` owns
|
||||
`oxide.*`), in 148 ms over four ticks. Carbon gave 104, the 30 `adminmodule.*` unowned, in 204 ms. On
|
||||
both, **`zonemanager.ignoreflag.nokits` belongs to ZoneManager**.
|
||||
|
||||
### 19.10 What the tally adds for chat titles
|
||||
|
||||
The twenty-three chat-title conditions (`docs/modules/rust/PLAN_REDESIGNS.md` §5, D172–D174) ride on
|
||||
`player.tally` (rule 2: aggregates, never a frame per shot, craft or swing). Every new field is
|
||||
**absent when nothing moved**, as the existing three are, so a site on an older build ignores them and a
|
||||
frame from an older plugin has none:
|
||||
|
||||
```json
|
||||
{"kind":"player.tally","type":"event","steamId":"76561198038695917","name":"whitlocktech",
|
||||
"npcKills":3,"animalKills":2,"weaponKills":{"bow_hunting.entity":2,"machete.weapon":1},
|
||||
"headshots":1,"bestPvpM":187.5,"bestPveM":42.1,"apcKills":1,"heliKills":1,
|
||||
"crafted":{"attire":3,"weapon":1},"built":12,"repaired":4,"healed":2,"rockets":6,
|
||||
"explosives":3,"missions":1}
|
||||
```
|
||||
|
||||
| Field | Counted from | Notes |
|
||||
|---|---|---|
|
||||
| `animalKills` | `OnEntityDeath`, victim a `BaseNpc` | **Also** counted in `npcKills`, which keeps meaning every NPC and animal so the public column does not change mid-wipe. Human NPCs are the difference (D209) |
|
||||
| `weaponKills` | every credited kill, any victim | By the **same weapon short prefab name the killfeed carries** (`WeaponPrefab`, else `Weapon`). The site classifies them into bow, melee, blade and revolver lists it keeps (§5.3), so a new Rust weapon needs no plugin release |
|
||||
| `headshots` | the killing blow's `HitInfo.isHeadshot`, any victim | |
|
||||
| `bestPvpM`, `bestPveM` | the killfeed's distance | **This interval's maximum, not a sum.** The site keeps the running best with `GREATEST`. PvE is NPCs and animals |
|
||||
| `apcKills`, `heliKills` | `OnEntityDeath`, victim `BradleyAPC`; `PatrolHelicopter` or `CH47Helicopter` | The killing blow's player (D174). A patrol helicopter usually dies by crashing and its blow names nobody, so **the last player who hurt it within 60 s** is credited instead, recorded by `OnEntityTakeDamage` for those three types only |
|
||||
| `crafted` | `OnItemCraftFinished`, by `item.info.category` lower-cased | Every category is sent; the site reads `attire` and `weapon`. Counts `item.amount` |
|
||||
| `built` | `OnEntityBuilt` placing a `BuildingBlock` | A deployable is not a structure |
|
||||
| `repaired` | `OnStructureRepair` | The hook fires on every hammer hit **before** the game decides there is anything to repair, the resources for it, or no recent attack. So the health is read then and again next tick, and only a hit that raised it counts |
|
||||
| `healed` | `OnHealingItemUse` on **another** player; `OnPlayerRevive` | Yourself never counts (D174). A syringe on a downed player raises both hooks for one use; it counts once |
|
||||
| `rockets` | `OnRocketLaunched` | |
|
||||
| `explosives` | `OnExplosiveThrown`, `OnExplosiveDropped` | A `TimedExplosive` that deals damage: a supply signal and a smoke grenade go through the same hooks and do not count |
|
||||
| `missions` | `OnMissionSucceeded` | Rust's own NPC missions (D173). A failed or abandoned one raises a different hook and never counts |
|
||||
|
||||
**All ten hooks are `void`** (§8.7). Four of them can veto — `OnStructureRepair`, `OnHealingItemUse`,
|
||||
`OnPlayerRevive`, and `OnEntityTakeDamage`, which cancels the damage — and none returns anything. All ten
|
||||
are in `ExpectedHooks`, so a framework that stops raising one shows as zero in `rg.hooks`.
|
||||
|
||||
No sidecar change: the sidecar stores and forwards `player.tally` whole, as it does every frame.
|
||||
|
||||
Reference in New Issue
Block a user