You are viewing a potentially older version of this package. View all versions.
TrueNativeStudio-Skald-0.2.0 icon

Skald

Achievements, grisly death announcements, nemeses, survival streaks, raid and boss call-outs, !skald chat commands, and a server watchdog with weekly Discord recaps. Needed on the server and every client.

Date uploaded 2 weeks ago
Version 0.2.0
Download link TrueNativeStudio-Skald-0.2.0.zip
Downloads 9
Dependency string TrueNativeStudio-Skald-0.2.0

This mod requires the following mods to function

denikson-BepInExPack_Valheim-5.4.2350 icon
denikson-BepInExPack_Valheim

BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.

Preferred version: 5.4.2350

README

Skald

The skald remembers every deed. And every death.

Skald keeps the story of your server: who reached the Mistlands first, who has died to trolls eleven times, who has gone twenty days without dying, and whether the server itself is going to make it to Fader.

Install Skald on the server and on every player's game. The server does the remembering; each player's game reports what happened to them and shows Skald's messages. Everyone needs the same version.


What you'll see

Achievements appear in big text in the middle of the screen, with the detail in chat:

Timothy earned "Into the Mist" Timothy is the first on the server to set foot in the Mistlands.

Deaths get a line in chat, and Skald has opinions:

Skald: Daniel came apart in Troll's grip like wet bread. Skald: Fulda was crushed by the very tree they were chopping.

Grudges form when the same thing keeps killing you:

Skald: A grudge is born: Troll has killed Daniel 3 times. Skald: Vengeance: Daniel has cut down Troll at last.

Streaks, returns, bosses and raids:

Skald: Astrid has survived 20 days without dying. Something out there is taking notes. Skald: Bjorn returns after 6 days away. Things died in the meantime. Skald: Moder fell after a 6-minute fight. Casualties: 2 (Daniel, Fulda x2). Skald: The ground is shaking near Daniel's base. Trolls.


Chat commands

Type these in chat. Nobody else sees the command or the answer.

Command Shows
!skald Your achievements, hours, deaths, streak, nemesis, and your three closest achievements with progress
!skald <name> The same for another player
!deaths [name] Deaths by cause and by killer, and active grudges
!top Leaderboards: achievements, time played, deaths, longest streak
!recap (Admins) Post this week's recap so far to Discord

Features

  • 34 achievements: 7 bosses, 6 biomes, 2 playtime tiers, and 19 for combat, work, travel, taming, eating and dying. Progress counts from when Skald first sees you, so veterans don't unlock everything on day one.
  • Death announcements: 133 lines across all 25 ways Valheim can kill you, naming whatever did it.
  • Nemesis system: three deaths to the same kind of creature (or the same player) and it holds a grudge. Killing one settles it.
  • Survival streaks: in-game days survived without dying, counted only while you're online. When a long streak ends, the death message says so.
  • First-to-reach: the first player into each biome is named.
  • Return messages: for players back after three or more days away.
  • Boss fight summaries: how long the fight took, and who died in it.
  • Raid announcements: everyone hears whose base is under attack, and the casualties when it ends.
  • Performance watchdog: frame time, memory, save stalls and world size, alerting a Discord webhook when things degrade.
  • Weekly Discord recap: hours, deaths, achievements, bosses, server health, and a forecast of when the world will outgrow the server.

Achievements are awarded once per character per world, ever, and survive restarts and crashes. A new world starts fresh.


For server owners

Settings are in BepInEx/config/com.dks.skald.cfg, created on first run. Everything is on by default except Discord, which does nothing until you give it a webhook:

[Discord]
WebhookUrl = https://discord.com/api/webhooks/...

Nothing is sent anywhere until you do. Once set, you get performance alerts and the weekly recap (Sundays at 18:00 server time by default). Deaths, achievements and raids can also be posted; see the [Discord] section.

The watchdog thresholds are tuned for a 4 GB server with around 5 players. Adjust MemoryWarnMb, MemoryCriticalMb and ZdoWarnCount for other sizes.

Skald's data sits beside the world save:

worlds_local/<World>.skald.tsv          player profiles, achievements, deaths
worlds_local/<World>.skald.tsv.bak      the previous save, for recovery
worlds_local/<World>.skald-health.tsv   performance history for the recap

Admins can test raid announcements with devcommands then event army_eikthyr.


Compatibility

  • Valheim 1.0 (Unity 6), BepInExPack_Valheim 5.4.2350
  • Works on dedicated and listen servers
  • Doesn't touch gameplay, items or balance, so it should sit alongside other mods

Known limits

  • Players without Skald see none of its messages, and don't report their own deaths or stats.
  • Raid names come from the game's data rather than its code, so a few raids get a generic "something is coming" line.
  • Installing Skald on a world already in progress: the first person to reach each biome after installation is called first.

CHANGELOG

Changelog

Upgrading: the server and every player should run the same version. Where a release changes the protocol it says so, and mismatched clients are turned away at the handshake with the reason in the log.

0.4.0

Added

  • Busiest areas. The world census now also works out where the world is crowded, and whose building it mostly is:

    1. Timothy's build, 1.2 km north-east of the world centre (x 1240, z -380): 41,200 objects, mostly building pieces (38,900)

    Shown in !world, the World tab and the weekly recap, and named in the Discord alert when the object count runs high - so it points at the base or the forgotten pile of dropped loot that is actually to blame.

  • Live server status in Discord. One message that Skald keeps editing in place: who is online, the in-game day, uptime, frame time, memory, world objects, the last save, and the busiest area, under a green, yellow or red light. Pin it once. It says when it was last updated, so a server that went down without warning shows as stale, and it's marked offline on a clean shutdown. Needs the webhook; StatusWebhookUrl can send it to its own channel.

  • Real progress bars in the Skald window. Rounded bars that fill in when a page opens, with the numbers counting up alongside and a glint running along each. New bars for achievements earned and bosses defeated, and gauges on the World tab for memory and world objects that go from green to amber to red as they fill. The game's Texts screen still shows the text version.

Changed

  • The world's object count is tracked, not warned about. It only ever goes up: every area anyone explores adds its trees, rocks and bushes to the world for good, so a warning about it can only ever get louder. It's still counted and shown in !world, the World tab, the weekly recap and the Discord status, now with how fast it's growing. The alert is off by default; ObjectAlertCount turns it back on at a line you choose (it replaces ZdoWarnCount).
  • F10 opens the Skald window on its own, without the inventory behind it. The cursor is freed and your character stays put while it's open; Escape closes the window without opening the pause menu, and opening the inventory, map or menu closes it.
  • Skald is now MIT licensed. See License at the end of the README.

Fixed

  • Memory readings now match your host's panel. Skald read the runtime's "private bytes", which on Linux counts reserved address space and ran hundreds of MB high (3,384 MB against a panel showing 2,785). On a hosted server it now reads the container's own figure, the one the host enforces and its panel shows, and falls back to resident memory elsewhere. Memory alerts fire at the right point, and the status message shows usage against the server's real limit (e.g. 2,785 / 4,096 MB).
  • The Skald window's pages no longer run off its right edge. They were drawn 100 units too wide and clipped, cutting off the ends of long lines.
  • Long pages in the Skald window can be scrolled. The mouse wheel did nothing, so the end of Leaderboards (and any long page) was out of reach. There's a scrollbar now too, shown when a page runs past the window.

Security - update the server as well as clients

  • Players can no longer pose as each other, or as the server. Valheim lets a modified client put any sender on a message. The server now checks every Skald message against the connection it actually came from, and drops forgeries. Before this, a modified client could file deaths or stats under another player's name, use an admin's identity for !recap, or put fake Skald banners on everyone's screen.
  • Clients only accept Skald messages that come from the server.
  • Rate limits per player on everything a client can ask of the server, so a modified client can't flood chat, Discord or the disk. Normal play never gets near them.
  • Stat reports must name one of the game's own counters, with a real number.
  • A character's record of what killed them is capped at 200 kinds of killer.
  • Discord posts explicitly allow no mentions, so a name can never ping @everyone.
  • Webhook URLs are stripped from anything Skald logs. A webhook URL is a password, and admins paste logs into support threads.

Still protocol v3: 0.3.0 and 0.4.0 work together, but the protections above and the new server features need 0.4.0 on the server, and the new bars need it on clients.

0.3.0

Added

  • Skald's own window. Press F10: a tab each for achievements (with progress bars), leaderboards, your death record, and what the world is made of. Escape or Close shuts it. The same pages also appear in the game's Texts screen.
  • achievements.json. The catalog is now a file you can edit. Change thresholds, write your own, mark some hidden. The defaults are written out on first run, and a broken file falls back to the built-ins rather than leaving you with none — with each problem named in the log, line by line.
  • While you were away. Arriving after a break gets you a private summary: bosses downed, what everyone earned, how many died and to what, and whether your streak survived.
  • !world. What the world is actually made of — building pieces, dropped items, creatures — and what grew this week. The weekly recap includes it too, so "your world is getting big" becomes something you can act on.
  • Five hidden achievements. You'll find them the hard way.

Changed

  • Death messages: 133 lines became 326, and they no longer repeat until the pool is exhausted. Lines are dealt like cards rather than rolled, so all 18 ways of describing a fall are used before any comes round again.

  • A dozen creatures have their own lines, added to the general pool rather than replacing it, so a Deathsquito reads differently from a Greydwarf:

    A Deathsquito killed Daniel. Two grams of pure malice. Timothy was killed by Neck. A Neck. Let that sit.

  • Performance alerts name what is actually filling the world instead of listing what might be: "The world holds 267,758 networked objects, mainly building pieces (120,400), dropped items (38,200) and creatures (21,000)."

  • The memory alert no longer prints the figure twice, reads against the ceiling rather than in isolation, and groups large numbers.

  • Protocol v3: every player needs 0.3.0 to match the server.

Fixed

  • !recap refusals now name the exact line adminlist.txt needs. Valheim 1.0 wants the prefixed form (V_7656...), not the bare SteamID64, which 0.2.1 wrongly advised. It also recognises when your ID is listed but in the wrong shape, when the file it reads is empty, and when an old-style STEAM_0: ID is in there.

Experimental

  • A Skald rune for the inventory's row of icons, off by default (PanelIcon). That row is prefab data and other mods rearrange it, so the rune tends to land on top of something. The key bind is the reliable way in.

0.2.1

Fixed

  • !recap refusals explain themselves: the reply shows the ID the server sees for your connection and what is wrong with adminlist.txt. The server log records which file it read and how many entries it had.

Server-only; 0.2.0 clients work with a 0.2.1 server.

0.2.0

Fixed

  • Announcements now actually appear in game. Valheim 1.0 permission-checks the sender's platform account on every chat message and silently drops any without one, which was every Skald message. Skald now displays its own messages.
  • Deaths were never announced: the death report tripped over the hit-type enum being byte-backed.
  • Playtime, biomes and stats were never tracked on dedicated servers, because the player ID Skald keyed on is never filled in by 1.0. It now reads the ID the game stores on each character.
  • Achievement state can no longer be lost to a crash, a mis-timed load, or a half-finished save, any of which could re-award achievements.

Added

  • Achievement banners in the centre of the screen.
  • !skald, !deaths, !top and !recap chat commands, answered privately.
  • Nemesis system: die to the same thing three times and it holds a grudge; kill one to settle it.
  • Survival streaks at 5, 10, 20, 30, 50, 75 and 100 days without dying.
  • First-to-reach call-outs for each biome.
  • Return messages for players back after a long absence.
  • Boss fight summaries with fight length and casualties.
  • Raid announcements naming whose base is under attack, and the toll afterwards.
  • Weekly Discord recap with a world-size forecast.

Changed

  • Protocol v2: every player needs 0.2.0 to match the server.
  • State now lives beside the world save, so it survives a BepInEx reinstall and is picked up by whatever already backs up your worlds.

0.1.0

First release.

  • Achievements for bosses, biomes, playtime and the game's own per-character stats.
  • Death announcements naming the cause and the killer.
  • A performance watchdog for frame time, memory, world saves and world size, alerting a Discord webhook.