Ezomic-Yoke icon

Yoke

Bigger stacks, earned biome by biome.

Last updated 2 days ago
Total downloads 1743
Total rating 3 
Categories Mods Tweaks Misc AI Generated
Dependency string Ezomic-Yoke-1.2.2
Dependants 2 other packages depend on this package

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

Yoke

Yoke raises stack sizes one biome at a time. Kill a biome's boss and the things that biome gives you start stacking higher; everything else stays at vanilla until its own boss falls.

Which biome an item belongs to is worked out from the game's own vegetation, spawn, conversion and recipe tables rather than from a list in the mod, so items added by other mods are placed too.

Built against Valheim 1.0.7, Unity 6000.0.75, BepInEx 5.4.23.5, Harmony 2.9.

Features

  • Stacks start at vanilla. Each boss raises one biome's items to 2x, capped at 200.
  • Weight is untouched by default, so carry weight still decides what comes home.
  • Equipment is never made stackable.
  • Ore and bars wait for the boss of the biome they come from.
  • Stacks move the moment a boss dies, including what is already in your pack.
  • A generated item list beside the config names every item, what happened to it, and why.
  • Everything is a config entry: the tier table, the multipliers, the cap, per-item exclusions.

How stacks are earned

Stack sizes sit at vanilla (ProgressionBase = 1) until a boss key is set in the world. Each row of ProgressionTiers names a boss, a biome and a multiplier. The default table:

Boss Global key Raises
Eikthyr defeated_eikthyr Meadows
The Elder defeated_gdking Black Forest
Bonemass defeated_bonemass Swamp and Ocean
Moder defeated_dragon Mountain
Yagluth defeated_goblinking Plains
The Queen defeated_queen Mistlands
Fader defeated_fader Ashlands

The highest earned row naming a biome wins, so rows never compound, and one boss may name several biomes. Bonemass carries the Ocean because no boss lives in the water; without that row every fish, chitin and bait would sit at vanilla all game.

Deep North has no row in the default table, so its items stay at the base multiplier however many bosses fall. Yoke logs one line at startup saying so.

The change lands when the boss dies, not at the next login. Item prefabs, the stacks in your inventory and the stacks in a container are all rewritten (a container catches up the moment you open it).

Any global key works in ProgressionTiers, not just boss keys, so a modded boss can be added as a row.

How an item's biome is decided

Six routes, all reading the game's own data:

  • Vegetation table. A copper deposit is placed in the Black Forest and the deposit drops copper ore, so copper ore is a Black Forest item.
  • Spawn tables. Fulings are Plains and the Fuling's drop list has black metal scrap, so black metal is Plains.
  • Spawners. A greydwarf nest or a surtling geyser is what the tables know about, not the creature it makes.
  • Recipes, smelters, cooking stations and fermenters. Anything made takes the biome of its latest ingredient. Barley is Plains, so flour is, so dough is, so bread is.
  • Boss drops. A boss prefab knows the global key its death sets and the tier table knows which biome that key belongs to, so Moder's trophy is a Mountain item without either side naming it.
  • BiomeOverrides, for the roots none of that reaches: ore deposits inside locations, dungeon loot, fish, and trophies of creatures that only appear inside a location. Roots only; the recipe pass turns each one into everything made from it.

An item found in several biomes takes the earliest. A crafted one takes the latest of its ingredients: found is about where it turns up, made is about when you can make it.

Anything no route can place stays at vanilla and shows as none in the item list, which is where you find candidates for BiomeOverrides. On a current 1.0 install that is around 80 stackable items out of roughly 1,500 in the database.

Ore and bars

Items the game marks as non-teleportable (ore, bars, and a handful of others) are held at vanilla until the boss of their own biome falls: copper and tin at the Elder, iron at Bonemass, silver at Moder, black metal at Yagluth, flametal at Fader. IncludeNonTeleportable = true gives them their bigger stacks straight away.

Yoke does not read or write what may go through a portal. The no-portal flag is only how it finds the metals; the rule being applied is about stack size.

The load guard

Inventory.Load clamps every stored stack to the item's current maximum. For a moment after login, before the server's global keys have arrived, those maximums are briefly vanilla again, and a stack clamped during that window is saved clamped and permanently smaller. Yoke removes the clamp from the load path only, so pickup, crafting and splitting keep vanilla's rules.

That patch is a transpiler, and a game update can move the IL out from under it. If it cannot install, Yoke holds every stack at its vanilla size and logs an error rather than raising stacks it cannot protect. See Troubleshooting.

Installation

Yoke is a single DLL with no assets.

Requires BepInEx 5.4.2350. BepInEx 5 only; this does not run on BepInEx 6.

Mod manager: install Yoke from Thunderstore.

Manual: drop Yoke.dll into BepInEx\plugins\.

Install it on the dedicated server and on every client, at the same version. It loads fine on valheim_server.exe.

Configuration

BepInEx\config\ezomic.valheim.yoke.cfg, written on first run.

Stacks

Key Default Effect
StackMultiplier 2 Flat multiplier on vanilla stack size. Used only when ScaleWithProgression is off.
StackCap 200 Ceiling on stack growth. An item whose vanilla stack is already above it keeps its vanilla stack, so coins stay at 999.
WeightMultiplier 1 Multiplies item weight. 1 leaves weight alone.
IncludeNonTeleportable false Give ore and bars their bigger stacks immediately instead of waiting for their own biome's boss.
IncludeTrophies true Also affect trophies.
ExcludeItems empty Comma-separated prefab names to leave completely alone.

Progression

Key Default Effect
ScaleWithProgression true Each boss raises one biome. Off falls back to StackMultiplier for everything.
ProgressionBase 1 Multiplier for a biome no boss has unlocked. 1 is vanilla.
ProgressionTiers the eight rows above boss:biome:multiplier, comma separated. Biomes: meadows, blackforest, ocean, swamp, mountain, plains, mistlands, ashlands, deepnorth, all.
ProgressionOrder the seven bosses The order bosses come in, which is what makes ProgressionStep mean "later". Idle while ProgressionStep is 0.
ProgressionStep 0 How much every boss after the one that unlocked a biome raises it again, compounding. 0.1 makes Meadows 2x at Eikthyr, 2.2x after the Elder, 3.54x with all seven dead.
BiomeOverrides ~100 entries prefab:biome, comma separated, for items the tables cannot place. The shipped list is the roots (ore deposits, dungeon loot, fish, location-only trophies); everything made from them is derived.
DeferToUtangard true When Utangard is installed, ask it whether the group has earned a boss instead of reading the world key. No effect otherwise.

Diagnostics

Key Default Effect
WriteItemList true Write ezomic.valheim.yoke.items.txt beside the config.
Verbose false Log every item whose stack size or weight changed.

A malformed ProgressionTiers or BiomeOverrides entry is logged and dropped; the rest of the line still applies.

With ScaleWithProgression = false, metals are held at vanilla permanently unless you also set IncludeNonTeleportable = true. There is no biome tier left for them to wait for.

BepInEx writes every entry to disk on first run and the saved value beats a new default in code, so a default that changes in a later version does nothing on a machine that has already run the mod. Edit the .cfg.

The item list

BepInEx\config\ezomic.valheim.yoke.items.txt, rewritten whenever the numbers change.

ExcludeItems takes prefab names, and prefab names are not guessable: copper ore is CopperOre but raspberries are Raspberry and a draugr's arrow is draugr_arrow. So the mod writes down every item it saw, what it did to each one, and which rule stopped it when it did nothing.

Prefab       Name              Type       Biome        Stack       Weight  Status
Wood         Wood              Material   meadows      50 -> 100   2
CopperOre    Copper Ore        Material   blackforest  30 -> 60    10
Barley       Barley            Material   plains       100         0.2     awaiting defeated_goblinking
BlackMetal   Black Metal       Material   plains       30          12      metal-held until defeated_goblinking
SwordIron    Iron Sword        OneHanded  swamp        1           0.8     equipment

An arrow means Yoke changed that value. A single number means it did not, and the Status column says why: a rule that refused the item, or the boss whose death will raise that biome. Rows are sorted by biome, which puts the unplaced none rows at the bottom.

The header carries the settings that pass ran under, what each biome is currently worth, how many items the biome index placed, and a count per reason:

  Earned so far: meadows 2x, blackforest 2x, ocean 2x, swamp 2x, mountain 2x, plains 1x, ...
  1522 items: 219 raised above vanilla, 200 waiting on a boss, 978 left alone by a rule, 125 unchanged
  (equipment 966, metal-held 12, trophy 0, excluded 0, unguarded 0)

unguarded is the one reason in that list that means the mod is not doing its job rather than that it decided not to. On a healthy run it is 0.

Multiplayer

Progression is the world's, not the character's. Stack size lives on the item prefab, so per-player stacks would mean two clients holding different item databases: one drops a hundred wood in a shared chest, the other opens it holding a slot over its own maximum, and the next move writes back through the smaller rules. Global keys are world state the server pushes to every client, so everyone computes the same answer. A fresh character joining a Mistlands-era world gets Mistlands-era stacks.

Install the same version on the server and on all clients. A client rebuilds its item database from the server's copy when it joins, and Yoke re-applies its own numbers after that copy.

With Longhouse Core installed, Yoke registers with the version check and the host's Yoke settings are applied on connected clients in memory, without writing to the client's own config file.

Compatibility

Longhouse Core is an optional soft dependency. Installed, Yoke joins the version check (clients whose mod versions or build ids do not match the server are rejected on connect) and follows the host's config. Absent, Yoke installs and runs on its own with none of that. In single player it makes no difference.

Utangard opens a biome only when every member of the group was personally present at that boss's death, which is not the same as the boss having died in the world. When Utangard is installed, Yoke asks it instead of reading the key, so stacks do not arrive for a biome Utangard is still holding shut. Soft in both directions: neither mod needs the other, and DeferToUtangard = false turns it off.

Other stack mods. Do not run a second one. Yoke captures each item's original stack size and weight the first time it sees the item, so whatever another mod wrote before that point becomes what Yoke treats as vanilla.

If you are coming from Hoard (Yoke's old name), the old .cfg is copied over on first run so settings carry across, including a hand-edited BiomeOverrides.

Troubleshooting

Everything is at vanilla size. Look in BepInEx\LogOutput.log for UNGUARDED or LoadGuard could not find Inventory.AddItem. The load guard failed to install, and Yoke holds stacks at vanilla rather than raising stacks it cannot protect through a world load. It needs retargeting against the current game version; report it.

One item did not change. Open ezomic.valheim.yoke.items.txt and find its row. The Status column gives the reason: equipment, metal-held, trophy, excluded, or the boss it is waiting on.

A whole biome's items never grow. Either no ProgressionTiers row names that biome (the startup log says which), or the items came out with no biome at all and need a BiomeOverrides entry. The none rows at the bottom of the item list are the candidates.

A setting I changed did nothing. Check the .cfg on the machine in question. On a server, Core applies the host's values to clients, so a client-side edit to a synced setting is overwritten while connected.

A stack reads 100/50. That is a stack that was legal when it was made and is now over its own limit, usually after a biome reclassification in a mod update. The game tolerates it: the slot refuses to grow and shrinks as it is spent. Nothing is lost.

Bug reports

Discord is the fastest route, and the right one if you are not sure whether what you are seeing is a bug. Issues on the repo work too and suit anything long.

Attach:

  • BepInEx\LogOutput.log
  • BepInEx\config\ezomic.valheim.yoke.items.txt and the .cfg beside it
  • whether you were on a server or in single player
  • the prefab name of the item, if it is about one item
  • AppData\LocalLow\IronGate\Valheim\Player.log if a vanilla mechanic broke, since exceptions thrown mid-frame land there rather than in the BepInEx log

Bugs and ideas

Both go to the site. longhouse.thijssensoftware.nl/bugs is for anything broken, and longhouse.thijssensoftware.nl/ideas is for what a mod should do next. You can vote on other people's ideas there as well.

Signing in takes a Steam or Discord account. I work from that list, so the votes decide what I pick up next.

Discord

discord.gg/hJzAVaZ5wb is used for mod information, updates, support, bug reports, and compatibility questions.

Server

There is also a small EU server running the pack if you want somewhere to play: hard combat difficulty, resources at 1x, everything else vanilla, no application and no activity requirements. Connection details are in the Discord.

Building

dotnet build

Targets net462 and references the game's managed assemblies directly, so no NuGet restore is needed. The build deploys to the repo-local testprofile\; override with -p:ProfileDir=<path>.

Design notes

Why both ObjectDB entry points are patched, why every value is computed from the item's captured original, where the biome routes stop, and the bugs that shaped the load guard and the live-inventory sweep: DESIGN.md.

Part of Longhouse

Yoke is part of the Longhouse modpack, which pins exact versions of the Ezomic mods. You do not need the pack to use Yoke, and it behaves the same on its own.

Author

Yoke is an original mod by Robbin Thijssen (Thijssen Software). Copyright (c) 2026 Robbin Thijssen. MIT licensed. See LICENSE.