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
1.6.0
- Packaging:
manifest.jsonlists theServer_devcommandsdependency 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.csprojandsrc/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 officialtcliCLI, reading the API tokens from the gitignoredapikeysfile. Run./publish.ps1after 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 newDeathCauseHarmony 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 withDeathCauseWindowSeconds(default 5; 0 disables cause attribution). - New
CountdownSecondsconfig (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 whenAnnounceEffectsis on, since the countdown is the effect's reveal.
1.4.0
-
Removed the
lead_feetevent. -
Removed the
smoked_outevent. -
Removed the
skeweredevent. -
pilgrimagenow 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
shelteredevent: its Shelter/CampFire status names do not resolve on a stock client, so the event announced but did nothing. -
Removed the
shamans_graceevent: vanilla'sSE_Greydwarf_shaman_healonly heals non-player creatures, so a player-targeted "heal aura" did nothing. -
magic_barrierandshaman_shieldno longer sustain their status effects: each is applied once and lasts the vanilla default baked into the client asset. -
Removed the
moment_of_silenceevent: its release-formRPC_FreezeFramedoes not hitch animations on a stock client, so the event announced but did nothing. -
Removed the
royaltyevent. -
Removed the
shared_painevent: 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/AdrenalineBuffdefault (and code fallback) is nowPotion_stamina_medium. Existing configs keep the staleStaminaMediumvalue -- 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).
- Kind:
-
New events round two: Kind
lightfoot(5 min),mage_luck(3 min),set_bonus(5 min, random set effect); Meantroll_love(2 min); Harmlessfishing_knot(3 min). -
New events round three: Kind
magic_barrier(90 s, staff shield) andshaman_shield(60 s, fuling shaman heal aura).Slimedis already covered bytar_soaked. -
New event
maddened: neutral and tamed creatures near every player turn hostile, using the same server-authoritativeBaseAI.AggravateAllInAreapath as the vanillaaggravateconsole 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 pathMonsterAI.MakeTame()(publicCharacter.SetTamed→RPC_SetTamed, server-as-owner writess_tamed). -
tar_soakednow applies only Tared;Slimedis its own event (slimed, 20 s) so the two can be tuned independently. -
loud_griefis 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/ itss_noiseZDO), which creature AI hears out to their alert range through walls, instead of a cosmetic ping. - Wakes and aggros every live creature within
LoudGriefNoisePowermetres of each player every few seconds via publicBaseAI.Alert(), so anything nearby stops idling and hunts. Tamed animals and players are spared. - Optionally spawns
LoudGriefSpawnCount(default 2) ofLoudGriefSpawnPrefab(defaultGreyling) next to every player, so a quiet biome still gets something.
- Lasts 60 s by default instead of 20 (
-
New
AttractCreatureshelper inServerActions(server-authoritative wake + aggro within a radius), powering the louderloud_grief. -
Fixed
revealed_pathhanding every player copies of the nearest landmark: vanillaFindClosestLocationreturns 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_lessonsnow applies theSoftDeathbuff 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_brewsnow 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 withserver 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 oldfenris_blessing/berserk_furyweights -- zero them in[Weights]to take them out of the roulette pool too. -
witches_brewsis 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 withserver dr fire <id>but never roll on their own.lightfootnow hands the mead out once and lets it run its full ten minutes instead of a five-minute sustain loop. Existing configs keep the oldlightfoot/mage_luck/troll_loveweights -- zero them in[Weights]to take them out of the roulette pool too. -
buried_luckandfishing_knotapply 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_AddStatusEffectcarries only item level/skill level, and neitherWishbonenorSetEffect_FishingHatdefines 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, mirroringdawn_mercyfor the morning. No vanillaSkipToNightexists, so it replicates EnvMan's smoothed fast-forward by setting the private skip fields to the day-fraction whereIsNightturns true. - New event
riktig_fuling: a band ofGoblin_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 vanillaNoMapglobal 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 vanillaNoPortalsglobal key;TeleportWorld.Teleportblocks 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 usessfx_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.
