Where The Crow Flies is an ultra-lightweight client companion mod for Valheim players. It solves the fundamental limitation of Valheim multiplayer architecture: because combat, damage, creature deaths, piece construction, foraging, and player statistics are all simulated on whichever client owns the local zone or character, a dedicated server without client reporting cannot witness any of it directly.
Acting as a silent scout, Where The Crow Flies watches these events in the player’s zone and relays them to servers running The Raven’s Call over routed RPCs — combat, defense, and stat deltas batched every 10 seconds, everything else (kills, deaths, crafts, builds, harvests, and more) sent the moment it happens.
Key Features
👁️ Owner-Gated Event Observation
Watches local Character.Damage, Character.OnDeath (creature deaths, gated on IsOwner()), Player.OnDeath (player deaths — added in 1.1.2 after the original Character.OnDeath hook turned out to never fire for players, since Player.OnDeath overrides it without calling base), and FishingFloat.Catch (gated on Player.m_localPlayer identity). Each event is reported by exactly one client, so multiple nearby players never send duplicates.
🛡️ Combat & Defense Batching
Aggregates each player’s damage dealt and taken — creature, PvP, and environmental tracked separately — plus hits landed, hits taken, blocks, timed parries, and damage mitigated, into one accumulator per player. Flushed every 10 seconds, or immediately once a player’s combined damage dealt and taken passes 500.
💀 Death Cause Resolution
Resolves a player’s m_lastHit into a specific cause: a PvP kill reports combat with <name>, a boss is named directly, another creature reports a <name>, and elemental damage returns burning, freezing, poison, spirit damage, or lightning damage. No hit at all resolves to drowning or a fall, depending on whether the player was in water.
🔨 Crafting, Upgrading & Repairs
Reports a craft, upgrade, or repair when InventoryGui.DoCrafting or OnRepairPressed completes, along with the crafting station used (or “Hand” for none). Since 1.1.3, the amount is counted from the actual change in inventory at the item’s target quality rather than the recipe’s stated amount, so a multi-craft or a station’s quantity bonus is counted correctly, and a craft that silently fails — missing requirements, a full inventory, or an item already at max quality — reports nothing.
🧱 Building & Demolition
Reports a piece placement (Player.PlacePiece) with its prefab name, category, and position. A removal (Player.RemovePiece) reports the same way, but without the specific piece — the hook only knows that a removal succeeded, not what was removed, so it reports a generic “Piece” in the “Structure” category.
🌾 Harvesting & Foraging
Reports a forage or crop pickup from Pickable.Interact, attributed to the player who interacts with it — fixed in 1.1.3, after the previous RPC_Pick-based hook was found to credit every pickup in a zone to whichever client owned that zone, not the player who picked it. A two-second per-pickable debounce stops a held-down interact key from reporting the same pickup twice; the reported amount does not include the rare skill-bonus yield, which is rolled locally on the picker’s client where the hook can’t see it.
🍖 Consumables
Reports food and potion consumption (Player.ConsumeItem) with the item’s health, stamina, and eitr contribution.
🗺️ World Events
Reports boss altar offerings (OfferingBowl.InitiateSpawnBoss), portal traversal (TeleportWorld.Teleport, tagged with the portal’s text label), and guardian power activation (Player.StartGuardianPower).
📊 Full Stat & Skill Sync
Mirrors every vanilla PlayerStatType counter (~205 on Valheim 1.0, 105 before) two ways: a 10-second delta sync for whatever changed (PlayerProfile.IncrementStat), and a full absolute snapshot — plus every raised Skills.SkillType’s level and progress toward the next one — on a configurable interval (FullSyncIntervalSeconds, default 5 minutes, floor-clamped to 10 seconds) and once immediately on spawn. The snapshot is what backfills a player’s pre-existing totals; the server is expected to assign it, not accumulate it, since it already is a running total.
🏷️ Title Picking
On a server running TheRavensCall 1.7.0+ with AcceptClientReports enabled, choose which of your earned titles the server shows with your name in its Discord narration, Chronicle log, and web dashboard — your in-game nameplate is unaffected. /title (chat) or title (F5 console) lists what you’ve earned, /title <name> sets it (multi-word titles work), and /title clear shows no title until you pick one again. /titles (chat), titles (F5 console), or a configurable TitlePanelKey opens a small clickable panel instead — it asks the server on open and after every click, and pauses movement, attacks, the map, and chat while it’s open, the same way the game’s own sign-text dialog does. Against an older TheRavensCall, or a server with client reporting turned off, the request is safe to send but nothing answers, and a one-time hint appears after five seconds naming both possible causes.
⚡ Out Of The Way
Runs silently in the background during normal play — no HUD changes and no performance penalty. The only interface is the title panel above, which stays closed until you open it yourself with /titles or an optional key you configure (unbound by default).
🌐 Safe Everywhere (Drop-In Compatibility)
If a player connects to a vanilla server or any server not running The Raven’s Call, the routed RPC silently no-ops without errors or network warnings.
Wire Format
Where The Crow Flies talks to The Raven’s Call over three routed RPCs: two it sends, described first, and one reply channel it listens for.
RavensCall_EventReport_V2 (primary)
Schema version 2. Thirteen event types share one channel:
| # | Event | Sent |
|---|---|---|
| 1 | Kill | immediately, on a creature death attributed to a player, from the creature’s owning client |
| 2 | Death | immediately, from the victim’s own client |
| 3 | DamageDefenseBatch | every 10s, or sooner once a player’s combined damage passes 500 |
| 4 | FishCatch | immediately |
| 5 | Building | immediately, on piece placement or removal |
| 6 | Crafting | immediately, on a craft, upgrade, or repair |
| 7 | Harvesting | immediately, on a forage or crop pickup |
| 8 | Consumables | immediately, on food or potion consumption |
| 9 | WorldEvent | immediately, on boss summons, portal use, or guardian powers |
| 10 | StatSync | every 10s — deltas only, for whichever PlayerStatType counters changed |
| 11 | StatSnapshot | every FullSyncIntervalSeconds (default 300s, floor-clamped to 10s) and once on spawn — absolute totals for all ~205 counters, backfilling pre-existing data with no separate migration step |
| 12 | SkillSnapshot | same clock as StatSnapshot — level and progress for every skill the player has raised at least once |
| 13 | TitleRequest | on demand, when the player runs /title, /titles, or presses TitlePanelKey — needs TheRavensCall 1.7.0+ to get an answer |
TheRavensCall answers a TitleRequest over a separate routed RPC, RavensCall_TitleReply_V1 (server → client only), carrying the reply text plus the requesting player’s full earned-title list and active title.
RavensCall_CombatReport_V1 (legacy fallback)
Kill, death, damage-batch, and fish-catch events are dual-sent on a second channel for backward compatibility with servers that only understand the original schema:
| Field | Type | Description |
|---|---|---|
schemaVersion |
int |
Wire protocol version (1) |
eventType |
byte |
1=Creature Kill, 2=Player Death, 3=Damage Batch, 4=Fish Catch |
victimPrefab |
string |
Creature prefab name / fish species / death cause string |
attackerName |
string |
In-game character name credited with the event |
position |
Vector3 |
World coordinate of the combat event |
dmgDealt |
float |
Batched physical & elemental damage dealt |
dmgTaken |
float |
Batched damage sustained by player |
Installation
- Install BepInEx for Valheim on your client.
- Download the current release from Hexium (link below), or through a mod manager.
- Extract and place
WhereTheCrowFlies.dllinto yourValheim/BepInEx/plugins/folder. - Launch Valheim — no further configuration is needed.
Configuration
A configuration file is automatically generated at BepInEx/config/com.raveniron.wherethecrowflies.cfg:
[General]
## Send owner-side combat reports, world telemetry, crafting, building, harvesting, consumption, and player stats to servers running TheRavensCall.
# Setting type: Boolean
# Default value: true
EnableReporting = true
## How often (in seconds) to broadcast a full absolute snapshot of all vanilla player stats and skills (StatSnapshot/SkillSnapshot). These are idempotent full-state resyncs, not time-sensitive deltas, so this can be turned up if 10-second combat/damage batching feels like enough network chatter on its own — a full snapshot also always fires immediately on spawn regardless of this setting.
# Setting type: Single
# Default value: 300
FullSyncIntervalSeconds = 300
## Key that opens the title panel (the same panel the /titles command opens). None = command only. Read through the game's own input layer (ZInput), so it works with Valheim 1.0's input system.
# Setting type: KeyCode
# Default value: None
TitlePanelKey = None
Part of the RavenIron Suite
Where The Crow Flies is designed to report combat events to dedicated servers running The Raven's Call.
