Valkyrie’s Cargo adds a wandering merchant encounter that nobody summons. When the server decides you have earned a quiet moment — rested, comfortable, at your own fire — a Valkyrie carries Ingvar the Far-Travelled down out of the sky and sets him beside your hearth. He walks up, calls out, and opens a trade window backed by a live, persistent, server-owned economy. Five minutes later, he vanishes into the mist the way Odin does.
There is no horn to summon him and no patch on the vanilla trader or store — the Cargo Terminal is the mod’s own window, opened from its own interact handler. Nothing happens on command except an admin’s cargo visit.
What It Does
The Visit
The server rolls for a visit every 25 minutes at 25% odds, while at least one player is rested with comfort level 4 or higher on ground somebody has actually built on. Vanilla’s own base-value check also counts the game’s own camps, so a set of gates added in 0.1.1 — after a report of Ingvar landing inside the Bog Witch’s camp — refuse a drop inside another merchant’s camp, a dungeon’s door, or one of the game’s own map-pinned landmarks. Once a spot is chosen, the Valkyrie flies a planned line through the sky rather than teleporting in, sets Ingvar down, and turns off; he then crosses the ground to the player himself and calls out.
The Market
Press E on Ingvar for the Cargo Terminal: his wares on one side, what he wants on the other, a staging tray in between. His stock is one shared, persistent catalogue of 101 entries — grown from 72 in 0.1.1, when food and drink joined the ores and hides — of which ShelfSize (20 by default) sit on his shelf at a time, re-rolled every two game days. Prices move with what is actually bought and sold: buy him out and the price climbs, flood him and he pays less. What he only buys relaxes back toward its target over game days (three, by default); what he actively sells holds where players left it, by design, unless an admin’s own target says otherwise. The Fair Market Act caps what he pays to buy a thing back at par, so a high sell price can never be turned into free coins by buying and reselling to him. He arrives with a purse of 1500 coins and stops buying once it runs dry; barter — paying with goods at his live buy price — is a first-class option instead. If a price moves while a deal is staged, the line goes amber and the trade asks for confirmation once more before anything leaves an inventory.
Ingvar Himself
Ingvar is a clone of the vanilla Dverger prefab, not a wholly separate creature — Character, Humanoid, MonsterAI and the collider all come from it, and the Dverger’s own renderers are switched off, not destroyed. What isn’t Dverger is everything you see: a separate model, rig and animation, attached as a child and built so nothing maps onto the Dverger’s own rig. They ship inside the plugin, so nothing extra downloads. Since 0.1.2 he also carries a guard against taming mods that hook every Dverger prefab on load: the moment his clone wakes, any tame or breeding component a mod like DvergrAllies attached is stripped before the mod’s own components take over, so he trades and hovers as himself rather than becoming somebody’s pet.
Server Authority and Persistence
The market, the schedule, the purse and every settled deal live on the server; a client proposes a deal and the server decides at the price it actually holds. Every gameplay-affecting setting is pushed from the server and locked through ServerSync, so a client cannot edit its way to a better price. Stock, purse and a running visit are written beside the world save and survive a restart — including, since 0.1.3, the visit’s own clock, which now runs whether or not anyone stands near Ingvar, so a visit begun at bedtime no longer freezes silently and holds up every later event; PauseVisitWhenEmpty (off by default) can hold that clock on an empty dedicated server instead. One gap is named outright rather than hidden: redelivery of a deal to a player who loses connection mid-trade is proven only off-game so far — the window it needs is too small to have been caught happening live yet.
A Config That Migrates Itself
New in 0.1.4. Updating used to mean deleting the config file by hand so new defaults would take, because a stored value otherwise out-shadows a new one — which is how a 72-row catalogue line survived two updates on a live server and hid 29 new food rows from its owner. From 0.1.4 the mod reads its own config file before anything else binds: a value still sitting at an old default moves to the new one, anything an admin actually set is left exactly as set, and the file itself is copied beside itself first as <file>.v<N>.bak — not a timestamp; a second migration attempt falls back to a timestamped name instead of overwriting that copy. The catalogue itself moves to CatalogueOverrides — the shipped rows plus only what has actually changed — so a future default can never be shadowed by an old stored line again.
Technical Specifications
| Parameter | Detail |
|---|---|
| Runs On | Client & Server — required on both, at matching versions |
| Target Runtime | BepInExPack Valheim 5.4.2350 |
| Engine Target | Valheim 1.0.12 (Unity Engine) |
| Current Version | 0.1.4 |
| Catalogue | 101 entries, persisted per world |
| Optional Companion | Smoothbrain’s Backpacks — doubles the shelf when installed |
Console
Prefix cargo. Admin verbs are checked on the server, so running one from a client that is not on the admin list simply fails.
| Command | What it does |
|---|---|
cargo status |
Role, config authority, the catalogue, the market and the live visit |
cargo stock [item] |
His shelf as this machine last heard it: stock against target, what you pay, what he pays |
cargo catalogue list |
Every entry he sells and buys |
cargo deal buy|sell <item> [count] |
Runs a trade over the same wire as the terminal, without opening it |
cargo terminal demo |
Opens the Cargo Terminal on a stand-in market — no server or visit needed |
cargo body / cargo body preview |
Ingvar’s model and clips; stands him in front of you to look at, no visit needed |
cargo config |
The config file’s migration state and the catalogue overrides, in words |
cargo visit [player] |
Admin. Forces a visit; cooldowns are ignored, every other gate is kept |
cargo dismiss |
Admin. Ends the running visit now |
cargo catalogue add|remove|reset |
Admin. Edits the shelf live, no restart |
Installation
Required on the server and every client, at exactly the same version — a mismatch is refused at the handshake, with the mod’s own message naming both numbers. The only dependency is BepInExPack Valheim; nothing else. On a Gale-managed client the plugin folder is %APPDATA%\com.kesomannen.gale\valheim\profiles\<profile>\BepInEx\plugins\, not the Steam one.
Updating a server that already has the mod needs nothing by hand from 0.1.4 on: the config file migrates itself on first boot, before anything else binds. A backup lands beside it first, and the boot log names what moved and what was left alone.
Compatibility
Built against Valheim 1.0.12, and good from there forward — that release moved the network version to 40, and the game refuses a peer on a different number before this mod is ever consulted, so a build made for 1.0.7 or earlier cannot connect at all. 1.0.15 kept network version 40 and moved nothing this mod reaches for, so the same build runs there unchanged.
Patches nothing a trading mod might want: no touch on StoreGui, EnvMan, or any vanilla trader, and the Cargo Terminal is its own window opened from the mod’s own interact handler. Detects Smoothbrain’s Backpacks automatically — when it is loaded server-side, Ingvar’s shelf doubles; absent, nothing changes.
Part of the RavenIron Suite
Every RavenIron project is engineered server-authoritative in C# and .NET, and shares the same forge.
