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

Details

Date Uploaded
last week
Downloads
2.3K
Size
284KB
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. Eight pools, one per progression step from the Meadows to the Deep North, so what a creature drops suits where it lives.
  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.

Six 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
Name III Give your finest gear a name of your own

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.

Names

At a rank III stone, Jarl's and Storied gear can be given a name of your own choosing, up to 32 characters. It replaces the rolled name everywhere the item appears: the tooltip, the inventory, the Runestone, and the hover text when it is lying on the ground.

The name travels with the item rather than with you, so anyone who picks it up, is handed it, or finds it in a chest reads the same thing. Drop it and walk away and it is still called what you called it.

One name per item, and it is permanent. Naming costs nothing, so what makes it mean something is that you get a single go: a name cannot be changed, taken off, or cut a second time. The button asks twice for that reason. A locked item is left alone, like everything else at the stone.

Two kinds of character are dropped as you type: < and >, because every place a name is shown is rich text and <size=400> is a layout problem rather than a joke; and $, because the game substitutes $tokens anywhere in a string and an item called $item_sword would rename itself differently on every client. There is no word filter — what people may call their axe is a moderation question for your server, not something to hardcode.

titleMinRarity in the enchanting block moves the bar. 0 lets any marked item be named, and a value above your highest tier switches the feature off.

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.

Other Mods

Nine are recognised, and all of them are optional. Six add gear that Runemark will roll; the other three add creatures that drop it:

Mod What Runemark does with it
Warfare weapons across every tier
Armory the Vidar, Warrior, Fenrir, Rogue, Vigorous, Hunter, Bold and Legion sets
Wizardry Spellslinger robes and staffs, tiered by the biome in their name
SouthsilArmor around forty armour sets
WeaponAdditions the Elven, Draconic, Giant and Flametal lines
Hugo's Armory greatswords, battleaxes, fists and the Core weapons
Monstrum no gear of its own, but its creatures drop Runemark loot for the biome they live in
RenegadeVikings its T1-T7 hostile ladder drops gear, one rung per biome
SeaAnimals / AirAnimals the predators drop loot; the scenery does not

Install any of them and their gear appears in the drop tables at the right tier, and their creatures start paying out. Leave them all 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 and one table serves everybody.

Creatures are placed by the biome the game's own spawn tables put them in, not by what they are called. That distinction has teeth — Monstrum's Bjorn sounds like Deep North content and lives in the Black Forest. runemark_spawns is how you check, and how you find anything a mod adds that nothing covers yet.

Gear is placed by the game's own numbers, not by reading its name. Armour goes on its armour value against the vanilla ladder (leather 2, iron 14, wolf 20, padded 26, carapace 32, flametal 38, Deep North 44); weapons naming a material go on that; the rest go on damage against the same weapon class in vanilla, never across classes, because a 130-damage axe and a 130-damage sword are not the same tier. Caster robes and capes are the two exceptions, tiered by name instead, because in vanilla a Lox Cape and a Deer Hide Cape are both armour 1.

  • 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, the display options (AffixDescriptions, RarityBorders, GroundBeam, GroundBeamLight, GroundBeamMinRarity) and the audio ones (DropSound, DropSoundMinRarity, DropSoundVolume, DropSoundSpatial, DropSoundMaxDistance).

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
  "titleMinRarity": 3,              // lowest rarity that may be named; 3 is Jarl's
  "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, with its armour, damage and max quality. Also written to BepInEx\config\runemark_items.txt, because with a few equipment mods installed it runs to thousands of lines. 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_spawns [filter] List every creature the world spawns, grouped by the biome it spawns in, with its max star level and which loot rule covers it. Uncovered creatures are flagged. Also written to BepInEx\config\runemark_spawns.txt. What you write creature rules from.
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, and your own .wav files.
runemark_playsound <prefab> Play a sound prefab at your feet, to audition it.
runemark_soundcheck Show, per rarity, which sound will actually play and where it came from, plus how far away a drop can be heard.

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.

A drop further away than DropSoundMaxDistance (48m) makes no sound at all. That limit matters more than it sounds like it should: creatures fight and kill each other across the whole loaded world, and Runemark rolls loot for those deaths exactly as it does for yours, so without it you hear chimes for items far out of sight. Set it to 0 to hear every drop wherever it lands. runemark_soundcheck reports the range along with what each tier will actually play.

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. When one matches nothing it also lists what a shorter version of the key would have matched, so correcting it does not need guesswork.

Without the equipment mods installed it will list several hundred item names it could not find. That is expected, not a fault: the tables name their gear so that one table serves every install, 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, Armory and Wizardry, from SouthsilArmor, from WeaponAdditions and from Hugo's Armory, and creatures from Therzie's Monstrum, blacks7ar's RenegadeVikings and Marlthon's SeaAnimals and AirAnimals. All by prefab name only. Nothing is bundled and nothing is 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