Geckuss-DeathRoulette icon

DeathRoulette

When a player dies, a random event fires for everyone. Server-side; players need nothing, admins use Server Devcommands for in-game control.

CHANGELOG

Changelog

1.6.0

  • Packaging: manifest.json lists the Server_devcommands dependency again, so a fresh install from Thunderstore or Hexium brings the in-game admin console the package description and the README both promise.
  • Packaging: dropped the stray UTF-8 BOMs from manifest.json, thunderstore.toml, DeathRoulette.csproj and src/Plugin.cs. A BOM in the manifest breaks the JSON parse on upload.
  • New publish.ps1: builds the upload zip and pushes it to Thunderstore and Hexium with the official tcli CLI, reading the API tokens from the gitignored apikeys file. Run ./publish.ps1 after bumping the four version fields.

1.5.0

  • The death announcement now names the cause when the server can see it. A dedicated server only ever executes server-owned damage (falling trees and rocks, carts, ballistae/turrets, creature projectiles, environment AOEs), which all flow through Character.Damage -- a new DeathCause Harmony prefix records the last such hit per player and the death line becomes e.g. "X has died — crushed by a falling tree" or "X has died — killed by a Fuling". Most causes (melee hits, falls, DoTs) are computed on the victim's own client and stay generic. Tunable with DeathCauseWindowSeconds (default 5; 0 disables cause attribution).
  • New CountdownSeconds config (default 3): the rolled effect no longer fires instantly. The death is announced, the raid-banner slot walks down 3, 2, 1, and only then the event fires and announces itself. Set it to 0 for the old instant behaviour. The countdown only runs when AnnounceEffects is on, since the countdown is the effect's reveal.

1.4.0

  • Removed the lead_feet event.

  • Removed the smoked_out event.

  • Removed the skewered event.

  • pilgrimage now remembers where everyone stood, watches the summoned boss, ends the stuck boss-event music the moment the boss dies (vanilla never clears it for a bare spawned boss), and teleports everyone back home 20 seconds after the kill.

  • Removed the sheltered event: its Shelter/CampFire status names do not resolve on a stock client, so the event announced but did nothing.

  • Removed the shamans_grace event: vanilla's SE_Greydwarf_shaman_heal only heals non-player creatures, so a player-targeted "heal aura" did nothing.

  • magic_barrier and shaman_shield no longer sustain their status effects: each is applied once and lasts the vanilla default baked into the client asset.

  • Removed the moment_of_silence event: its release-form RPC_FreezeFrame does not hitch animations on a stock client, so the event announced but did nothing.

  • Removed the royalty event.

  • Removed the shared_pain event: a random harmful status effect, redundant with the dedicated status events (pyre, deep_chill, slimed, tar_soaked, etc.).

  • Fixed the adrenaline event's stamina-regen buff, which silently no-oped since the 1.0.7 mead rework: the Effects/AdrenalineBuff default (and code fallback) is now Potion_stamina_medium. Existing configs keep the stale StaminaMedium value -- reset that one key to pick up the fix.

  • New events using status-effect names verified against a 1.0.7 ObjectDB:

    • Kind: fenris_blessing (5 min), berserk_fury (45 s), hold_lessons (2 min), giants_strength (5 min), witches_brews (5 min), wolf_sight (5 min).
    • Mean: seasick (20 s), rooted (12 s).
    • Harmless: buried_luck (3 min), dvergr_ally (90 s).
  • New events round two: Kind lightfoot (5 min), mage_luck (3 min), set_bonus (5 min, random set effect); Mean troll_love (2 min); Harmless fishing_knot (3 min).

  • New events round three: Kind magic_barrier (90 s, staff shield) and shaman_shield (60 s, fuling shaman heal aura). Slimed is already covered by tar_soaked.

  • New event maddened: neutral and tamed creatures near every player turn hostile, using the same server-authoritative BaseAI.AggravateAllInArea path as the vanilla aggravate console command. Aggravation is normally permanent in vanilla, so the event now tracks the affected creatures and clears the flag again after 60 s (CalmCreatures), so animal pens recover.

  • New event animal_friends: tames up to 4 untouched tameables (boar, wolf, lox, hen) near every player using the vanilla completion path MonsterAI.MakeTame() (public Character.SetTamed → RPC_SetTamed, server-as-owner writes s_tamed).

  • tar_soaked now applies only Tared; Slimed is its own event (slimed, 20 s) so the two can be tuned independently.

  • loud_grief is substantially meaner and fully configurable under [Events]:

    • Lasts 60 s by default instead of 20 (LoudGriefDuration, 0 disables the noise).
    • Makes everyone genuinely loud through the client's real noise pipeline (RPC_AddNoise → Character.m_noiseRange / its s_noise ZDO), which creature AI hears out to their alert range through walls, instead of a cosmetic ping.
    • Wakes and aggros every live creature within LoudGriefNoisePower metres of each player every few seconds via public BaseAI.Alert(), so anything nearby stops idling and hunts. Tamed animals and players are spared.
    • Optionally spawns LoudGriefSpawnCount (default 2) of LoudGriefSpawnPrefab (default Greyling) next to every player, so a quiet biome still gets something.
  • New AttractCreatures helper in ServerActions (server-authoritative wake + aggro within a radius), powering the louder loud_grief.

  • Fixed revealed_path handing every player copies of the nearest landmark: vanilla FindClosestLocation returns the same instance to everyone standing near it, so several players could all be pointed at one cave. Each player now gets a different instance of the chosen landmark while any remain, reusing one only when the world has none left.

  • hold_lessons now applies the SoftDeath buff exactly once instead of re-applying it every two seconds for two minutes: the buff's own duration is ten minutes, so the refresh loop was pointless.

  • witches_brews now picks a brew per player and never hands a player the same resistance mead twice in a row (status effects are client-side, so this is the server's best proxy for "a potion you do not already have"). It also applies once instead of refreshing for five minutes.

  • The seven armour sets are now separate, callable events -- fenris_blessing, berserk_fury, wolf_set, root_set, troll_set, lox_set, harvester_set -- all shipped disabled (weight 0) so they never roll on their own, but each can be fired directly with server dr fire <id>. Armour Fitting (set_bonus) now hands everyone one of the seven at random (45 seconds for the berserker set, five minutes for the rest). Existing configs keep their old fenris_blessing/berserk_fury weights -- zero them in [Weights] to take them out of the roulette pool too.

  • witches_brews is now the single potion event: its pool is every potion the mod uses (the three resistance brews plus lightfoot mead, eitr mead, troll pheromones and the stamina mead), keeping the per-player "not the same drink twice in a row" rule. The standalone potion events -- lightfoot, mage_luck, troll_love -- ship disabled (weight 0) like the armour sets, so they can still be fired directly with server dr fire <id> but never roll on their own. lightfoot now hands the mead out once and lets it run its full ten minutes instead of a five-minute sustain loop. Existing configs keep the old lightfoot/mage_luck/troll_love weights -- zero them in [Weights] to take them out of the roulette pool too.

  • buried_luck and fishing_knot apply their buff once and accept it lasts until death: vanilla has no server-side way to expire a status whose asset carries no duration (RPC_AddStatusEffect carries only item level/skill level, and neither Wishbone nor SetEffect_FishingHat defines a TTL), so the old re-apply loop just leaked a permanent buff. Descriptions now say so instead of promising "three minutes".

1.3.0

  • New event dusk_mercy: time skips to the next nightfall, mirroring dawn_mercy for the morning. No vanilla SkipToNight exists, so it replicates EnvMan's smoothed fast-forward by setting the private skip fields to the day-fraction where IsNight turns true.
  • New event riktig_fuling: a band of Goblin_Gem (the genuine, undressed Fulings) spawns on the corpse. Spawns 2-4 like the swarm event, but these are full goblins.
  • New event fog_of_war: the map (minimap and full) is hidden from everyone for five minutes via the vanilla NoMap global key, which every client honours and gets re-synced to in real time.
  • New event no_escape: portals refuse to work for five minutes via the vanilla NoPortals global key; TeleportWorld.Teleport blocks with the stock "$msg_blocked" message and the key is removed again after the timer.

1.2.0

  • Status-effect events now last a set time instead of a vanilla-baked instant. The server cannot set a status duration directly (the RPC has no duration and the TTL lives in the client asset), so these are sustained by re-applying on a short cadence: Feather Fall and Mistveil 5 min; Sheltered, Smoked Out and Deep Chill 3 min; Tar-Soaked, Pyre and Plague 20 s.
  • Damage-over-time events (Deep Chill, Pyre, Plague) now deal a small, health-capped tick each interval, since environmental damage from a server-named status does not reliably apply.
  • Loud Grief now sustains the noise for 20 seconds so it actually draws creatures in.
  • Adrenaline reworked: full-ish heal plus a stamina-regen buff (configurable) plus Ashlands adrenaline, so it does something noticeable pre-Ashlands.
  • New event corpse_run: ten seconds after a real death, the fallen player is pulled back to their grave.
  • Raised weights for Scatter, Swarm and Grave Guardian.

1.1.0

  • Added in-game admin commands through the developer console. With Server Devcommands (now a dependency) installed on the server and admin client, run server dr <command> from the F5 console: list, status, fire <id>, roll, fx <prefab>, stopraid, reload, help. Admin-only, enforced by Server Devcommands and the server adminlist.
  • The roulette no longer fires the same event twice in a row when an alternative exists.
  • Cold Rain now applies Wet + Cold with a water-splash effect, instead of a bare Wet debuff.
  • Fixed Lament and Ancient Omen, which were silent: they used prefabs that render as nothing under a bare server spawn. Lament now layers sfx_gjall_alerted + sfx_gjall_idle_vocals; Ancient Omen uses sfx_frostfoundry_activate.

1.0.0

First public release.

When a player dies on a dedicated server, a random event fires for everyone connected. The mod is server-side only: clients run stock Valheim and install nothing.

  • 34 weighted events across four flavours (Harmless, Kind, Mean, Brutal), each independently weighted and disableable in config without a rebuild.
  • Death detection via a Harmony postfix on ZRoutedRpc.HandleRoutedRPC, which is the only place a dedicated server sees a player death.
  • Announcements through MessageHud (the raid-banner channel), since chat cannot carry server-originated messages to clients.
  • Two safety rails: self-inflicted damage is capped below lethal, and a global cooldown stops a party wipe firing multiple raids at once.
  • Raids are progression-gated by default, honouring vanilla's global-key, biome and base checks.
  • Configurable effect prefab lists, thunderclap damage, raid pool/gating, and pilgrimage boss summoning.
  • Admin command channel via a polled command file for live testing without a restart.