Valheim
You are viewing a potentially older version of this package. View Latest Version
Install with App

Details

Date Uploaded
last week
Downloads
1.1K
Size
268KB
ADDatHost Valheim hosting
€1

Runemark

A Diablo-style loot and magic item system for Valheim.

Coloured rarities, randomly rolled affixes, pillars of light over things worth walking to, and a station where the junk you do not want becomes the gear you do. If you have played an ARPG, you already know the shape of it.

This is our own take on the idea, written from scratch for GBV rather than adapted from any existing mod. Every mechanic is built on something Valheim already does — its own damage types, its own status effects, its own item storage — which is why affixes behave like the game rather than like a layer sitting on top of it. It is shared publicly in case it suits your server too, but it is tuned for ours.

This is early, and it is going to change.

Everything here works and nothing is known to be broken, but almost none of it has been balanced against real play yet. Drop rates, what breaking gear pays out, what a throw of the dice costs, how fast a Runestone can be upgraded — those numbers are first guesses, and they will move as we actually play with it.

Expect the feel of the economy to shift between versions. Your saves and your items are safe across those changes: everything lives in the item's own data and in a config file you can edit, so tuning is a number in a file rather than a wipe. If a change in defaults does not suit your server, override it.

Feedback from people actually using it is worth more than any amount of theory, so if something feels too generous, too mean, or just dull, say so.

Named for the rune marks carved into an object to give it power, which is exactly what the mod does: it writes a rarity and a set of affixes onto an otherwise ordinary piece of equipment.

What It Does

Vanilla Valheim drop tables are almost entirely materials, so once you know a recipe the world stops handing you gear. Runemark does four things about that:

  1. Puts equipment into loot. Creatures and chests get a configurable chance to yield a piece of equipment they would never normally drop.
  2. Rolls it. Every such drop gets a rarity tier and a set of affixes.
  3. Makes it matter. Affixes change real stats, and they show up in tooltips, as a frame around the item in your inventory, and as a pillar of light on the ground.
  4. Lets you do something about a bad roll. Break gear you do not want into runes and work them back into gear you do.

The Runestone

A standing stone you build for 20 Stone and 10 Wood. You learn it the first time you pick up anything Runemark made. Press Use to open it.

Five things happen here, unlocked as the stone is raised:

Work Rank What it does
Break I Magic gear into runes of its own tier. Trophies into ochre
Fuse I Four runes of one tier into one of the next
Recarve II Replace one mark with a different one
Deepen II Reroll one mark's value, keeping the mark
Inscribe III Cut fresh marks into anything, for a flat price

Raising the stone is paid for in runes, from the panel itself — the Upgrade button under the rank, top right. There is no mining trip that gets you to rank III; you get there by using the stone you have.

Runes and Ochre

Five runes, one per tier and coloured to match: Fehu, Uruz, Ansuz, Tiwaz, Sowilo. They come from breaking magic gear apart, and four of one make one of the next.

Ochre is untiered and comes from trophies. Runes shape gear; ochre gambles on it. That split is deliberate — hunting and looting each feed a different half of the system.

Breaking pays fewer runes as rarity rises (8/6/4/3/2), which is what makes commons worth grinding: a Marked item is only a handful of Fehu, but you have hundreds of them, while a Storied one pays in runes that are each worth 256 Fehu on their own.

Inscribe

A flat 25 Ochre and the stone picks the standing, revealed on a spinning reel. It works on gear that already carries marks, so a poor result is a reason to come back rather than a dead end. The odds are the same ones the world rolls on, and they are shown before you commit.

Locks

Every row in the panel has a padlock, and locked items also say so in their normal tooltip. Nothing Runemark does will consume a locked item — including runes sitting in a chest.

Nearby Chests

The stone reaches into chests standing near it for runes and ochre, so you do not have to carry three hundred Fehu around. The reach is a slider in the panel. Chests behind someone else's ward, set to private, or open at the time are never counted or touched.

Rarity Tiers

Tier Affixes Frame
Marked 1 thin line
Runed 1-2 double line
Hallowed 2-3 chamfered corners
Jarl's 3-4 chamfered, corner studs
Storied 4-5 studs, runic ticks, outer glow

Higher tiers roll more affixes and roll harder within each affix's range.

Installing

Runemark needs BepInEx 5, and it goes on both the client and the server.

Therzie's Warfare and Armory are optional. Install them and their weapons and armour appear in the drop tables sorted by material, beside vanilla's. Leave them out and nothing changes: every pool is filtered to what your install actually has before a drop is rolled, so the drop rate is the same either way.

  • Client: drop Runemark.dll into <Valheim>\BepInEx\plugins\.
  • Server: drop Runemark.dll into <server>\BepInEx\plugins\.

Both sides matter, and for different reasons. The client does the rolling, the stats and the UI. The server owns the loot table and pushes it to every client on connect.

Configuration

BepInEx\config\gbv.valheim.runemark.cfg holds the switches: the master enable, creature and chest drops, verbose logging, and the display options (AffixDescriptions, RarityBorders, GroundBeam, GroundBeamLight, GroundBeamMinRarity).

BepInEx\config\gbv.valheim.runemark.loot.json holds the loot table and the rarity tiers. It is written out with sensible defaults the first time the mod runs. The server's copy is the one that counts — clients replace theirs with the server's on connect, because the roll happens on whichever client owns the dying creature and the tables have to agree.

Loot rules are keyed by prefab name, and keys may be exact (Greydwarf_Elite), a prefix wildcard (Greydwarf*) or the catch-all (*). Exact beats the longest matching wildcard, which beats the catch-all.

The stored file wins over the defaults in the build, which is right for anything you have tuned but means a pool added in a later version never reaches a server that has already run once. runemark_reload defaults rewrites it from the build and keeps the old one as a .bak.

"Greydwarf*": {
  "chance": 0.02,      // odds this source yields Runemark loot at all
  "luck": 1.0,         // bias toward higher rarities; 2.0 doubles the odds at each step up
  "countMin": 1,
  "countMax": 1,
  "items": ["AxeFlint", "ShieldWood"]
}

Star creatures get both a better chance and better luck automatically.

The rarities block holds gameplay settings: weight, minAffixes, maxAffixes and powerScale. Presentation (a tier's name, color and sound) lives in the code and is not written to the file, so updating the mod changes those without a fight. You can still override any of them by adding the key by hand, and it will be honoured.

The file carries a version. If it predates a change to the rarity defaults, the rarity block is discarded in favour of the current defaults and the file is rewritten once. Your loot rules are always kept.

The Enchanting Economy

The enchanting block holds every price, yield and rate the Runestone uses. Like the loot rules, the server's copy is the one that counts, and runemark_reload applies changes without anyone restarting. Every field is optional — write only the ones you want to change.

"enchanting": {
  "breakYields": [8, 6, 4, 3, 2],   // runes from breaking, by tier; falls as rarity rises
  "trophyOchre": 3,
  "bossTrophyOchre": 25,
  "bossTrophies": ["TrophyEikthyr", "..."],
  "fuseRatio": 4,                   // runes of one tier per rune of the next
  "ochreFromTier": 2,               // work below this tier costs runes only
  "recarveRunes": 2, "recarveOchre": 15,
  "deepenRunes": 1,  "deepenOchre": 10,
  "recarveEscalation": 1.0,         // price multiplier per repeat on the same item; 1 is flat
  "deepenEscalation": 1.0,
  "recarveChoices": 3,              // replacements offered at rank III
  "inscribeOchre": 25,              // flat price of a throw
  "upgrades": [
    { "rank": 2, "runeTier": 1, "runes": 12, "ochre": 40 },
    { "rank": 3, "runeTier": 2, "runes": 10, "ochre": 120 }
  ],
  "runeDropChance": 0.12,           // loose runes from creatures, separate from the item roll
  "runeDropMin": 1, "runeDropMax": 3,
  "runeDropLuck": 0.55              // under 1 pushes loose runes toward the common tiers
}

Two of these are worth understanding before turning them:

  • breakYields falls as rarity rises, and that is the load-bearing part of the economy. It makes common gear worth collecting while rare gear still pays far more per item. Making it rise instead turns commons into litter and removes any reason to fuse.
  • The escalations default to 1, meaning recutting the same item costs the same every time. Nothing at a Runestone can fail, so the brake is the rune supply rather than a rising price. Turn them up if your server wants rerolling to be self-limiting; the counters are recorded on every item, so raising them takes effect immediately on gear that already exists.

Values are clamped on load rather than trusted, so a hand-edited file with a fuse ratio of zero or a negative cost is corrected instead of breaking the mod.

Console Commands

Command What it does
runemark_spawn <prefab> [rarity] [affix ...] Put a magic item in your inventory. Rarity is an index or a tier name. Naming affixes forces them. Admin only.
runemark_give <material> [count] Give yourself runes or ochre. Takes a rune name, a tier name, or ochre. Admin only.
runemark_station [level|teach] Report or set the rank of the nearest Runestone, or unlock the piece in your build menu. Admin only.
runemark_inspect Dump the raw Runemark data on everything in your inventory.
runemark_items [filter] List every prefab Runemark will mark, grouped by slot. What you write a loot table from.
runemark_glow Describe the weapon models in your hands and where the elemental effect attaches. For working out why a modded weapon looks wrong.
runemark_validate Check every prefab name in the loot table against the live game and report the ones that do not resolve.
runemark_affixes List every affix, its scope and its roll range.
runemark_reload [defaults] Reload the loot table from disk, and on a server push it to every connected client. defaults rewrites the stored file from this build first, keeping a .bak. Admin only.
runemark_sounds [filter] List the sound effect prefabs this build actually has.
runemark_playsound <prefab> Play a sound prefab at your feet, to audition it.

Drop Sounds

Each rarity names its own sound in the rarities block of the loot table, so the rarer tiers can land harder. The shipped defaults are guesses: sound prefab names live in the game's asset bundles rather than its assemblies, so they cannot be verified without running the game. Pick real ones with runemark_sounds to list, runemark_playsound to audition, then set "sound" on the tier and run runemark_reload. An empty string makes a tier silent.

runemark_validate is worth running once after any edit to the loot table. Item prefab names cannot be checked offline, because they live in the game's asset bundles rather than in its assemblies, so a typo is otherwise invisible until that rule quietly never fires. It checks wildcard keys too, and a wildcard matching nothing is the one worth acting on.

Without Warfare and Armory installed it will list a couple of hundred item names it could not find. That is expected, not a fault: the tables name their gear so that one table serves both, and a pool is filtered to what you have before anything is rolled.

Magic Item Stored Data

In ItemDrop.ItemData.m_customData, a Dictionary<string, string> the game itself owns, under a single key gbv.runemark holding a compact JSON blob.

That one field covers persistence and networking completely, because the game's own ItemData.Save / ItemData.Load pair is simultaneously the player save format, the container ZDO blob, the world-drop ZDO blob and the network wire format. ItemData.Clone deep-copies the dictionary, so splitting stacks and dropping items preserve it too.

It also means uninstalling is non-destructive. Without Runemark the game reads and rewrites the entry blindly, so items keep their data dormant and get it back if the mod returns.

Credits

Reference behaviour was verified against the game's own assemblies. Runemark reimplements ideas that RandyKnapp's EpicLoot popularised, but none of its code, data or assets.

Drop tables name gear from Therzie's Warfare and Armory by prefab name only. Neither is bundled or required.

DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro
DatHost — Valheim server hosting, first month for one euro