Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Utangard
Biomes nobody in your group has earned starve you: food burns away, buffs are refused, and the land leaves you sapped.
| Date uploaded | 17 hours ago |
| Version | 1.1.0 |
| Download link | Ezomic-Utangard-1.1.0.zip |
| Downloads | 10 |
| Dependency string | Ezomic-Utangard-1.1.0 |
This mod requires the following mods to function
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.2333README
Utangard
A biome you have not earned will not feed you.
Utangards is Old Norse for "outside the enclosure". The Norse divided the world into the fenced and settled ground, where a person has protection and hospitality, and everything beyond it. This mod puts every biome your group has not earned on the far side of that fence.
Nothing stops you walking into the Swamp on day two. But while you are there, food burns down five times faster, you cannot eat or drink at all, and you leave Sapped: three quarters of your stamina regeneration gone, for up to half a minute. An early run for barley is still your call. It is just a raid now rather than an errand.
A biome counts as earned when every member of your group has personally been at that boss's death, not when the boss has died in the world. Kill Moder yourself and the Plains stays shut until the friend who was offline that night has killed it too.
How it works
Biome pressure
While you are standing in a gated biome:
- Food burns 5× faster. A 1600-second meal becomes a 320-second one. Your existing food is not deleted, it just runs out fast.
- You cannot eat or drink. Meals, mead and potions are all refused, with "The land will not feed you here" on screen. Nothing is consumed or destroyed. The item stays in your inventory.
- Running buffs burn 5× faster, and new ones are refused. Guardian powers are refused without burning the cooldown, so you can use yours the moment you leave.
- Rested and Resting count as buffs, so a fire and a roof buy you nothing inside. This is the harshest single rule in the mod and it has its own switch.
- Harmful effects are never touched. Wet, Cold, Freezing, Burning, Poison and the rest run exactly as normal. Speeding up Poison would be a mercy, not a penalty.
And on the way out:
- Sapped gives you 75% less stamina regeneration. One second in the biome banks one second of it, up to 30 seconds, and it only spends itself once you are somewhere the land tolerates you. A dash in and out still costs you; living there is a flat tax rather than an escalating one. It stacks with food and Rested rather than replacing them, so a sapped player with good food still regenerates faster than a sapped player without, just badly.
You get a HUD icon while you are inside, a second one for Sapped, and a message on the way in and out that names who the biome is still waiting on.
The gate is the same for everybody. It is one answer about the group, not a per-player one. If the roster has not all cleared Moder, the Plains withers you too, even if you personally landed the kill. That is the point rather than a side effect. See below.
Two things worth knowing. Dungeons inherit the biome above them, so a Swamp crypt withers you exactly like the Swamp. And a player without the mod installed is not gated at all. This is a rule for a group that all runs it, not an anti-cheat. If you want that enforced, see Installation.
Group progression
- Everyone on the roster has to have done the boss personally. The world key the game sets when a boss dies is not enough on its own.
- Credit is earned by being there. When a boss dies, everyone within 100 m of the body is credited. You do not have to land the killing blow, and you do not have to be the host.
- Joining late does not undo anything. Once the group has cleared a boss, that biome is open permanently. A friend arriving with a fresh character gates only what the group has not yet cleared.
- A deadline opens the biome anyway. Once the first person clears a boss, the rest of the group has a set number of days before it opens regardless: one day for Eikthyr, and one more for each boss after. This is what stops one person who vanishes holding a biome shut, and it is usually what unblocks you.
- The roster forgets people who stop playing. A character stops counting for a boss after 14 days without logging in. This is what decides who "everyone" means, so a friend who visited for one evening, or an alt made once, cannot hold the gate forever. No admin command and no list to maintain. With the default deadlines above this rarely decides anything on its own, but it is the only backstop if you clear the deadlines or point a biome at a boss that has none.
- Existing worlds and characters are handled. Installing on a long-running save does not re-lock everything: a character is credited for a boss its own file says it attended, as long as that boss has already died in this world.
At a glance
Every value here is the shipped default and every one is configurable.
| Mechanic | Default |
|---|---|
| Food drain in a gated biome | 5× |
| Buff drain in a gated biome | 5× |
| Eating and drinking | refused |
| New buffs | refused |
| Rested / Resting | treated as buffs |
| Stamina regeneration while Sapped | 25% of normal (a 75% penalty) |
| Sapped banked per second inside | 1 second |
| Sapped maximum | 30 seconds |
| Boss credit radius | 100 m |
| Roster absence before you stop counting | 14 real days |
| Catch-up deadline | 1 day for Eikthyr, +1 per boss after |
| Gate basis | the whole group, not the world |
| Already-earned biomes | never re-lock |
Biome progression
The defaults are the vanilla progression offset by one: the boss of the previous biome opens the next.
| Biome | Opened by | Global key |
|---|---|---|
| Meadows | nothing | ungated |
| Black Forest | Eikthyr | defeated_eikthyr |
| Swamp | The Elder | defeated_gdking |
| Mountain | Bonemass | defeated_bonemass |
| Plains | Moder | defeated_dragon |
| Mistlands | Yagluth | defeated_goblinking |
| Ashlands | The Queen | defeated_queen |
| Deep North | Fader | defeated_fader |
| Ocean | nothing | ungated |
It is a table, not a hardcoded progression, so the interesting variations are all edits to it. Blank a row and that biome is never gated. Point every row at one key and you have a single-boss gate. Point a row at a key some other mod sets and it gates on that instead.
The Black Forest row is the one to look at first. Gating it on Eikthyr walls off the copper run most people do before touching him. That is the intended shape, and it is also a real change to the opening hour.
Two key names could not be verified from the game's code. defeated_queen and
defeated_fader are set from prefab data rather than named in Valheim's GlobalKeys enum. A
wrong key fails closed, which looks exactly like a working gate, so LogGlobalKeys is on by
default and prints what your world actually records. Check it once against a save where those
bosses are down.
Installation
Single DLL, no asset bundle. Built for BepInEx 5.4.23.3 on net462.
- Install BepInExPack Valheim 5.4.2333. It is the only required dependency.
- Drop
Utangard.dllintoBepInEx/plugins/. - Launch once. The config file is written to
BepInEx/config/ezomic.valheim.utangard.cfg.
Everyone should install it, including the server. The gate is enforced by each client on itself, so a player without the plugin is not gated by it.
Longhouse Core is optional. Install it and the server refuses a client that does not have Utangard at a matching version, and the host's gate settings are pushed to every client so nobody can disagree about the rules. Without Core, Utangard is fully functional (solo you need nothing else at all), but the gate becomes an agreement between players rather than a rule of the server. Utangard says so loudly, once, in the log if it finds the group gate running in multiplayer with no Core.
Why Utangard exists
A particular kind of evening. Somebody has not killed The Elder yet and the Swamp trip is already being planned. Somebody else has been up a Mountain and come back with onion seeds, so the whole server is eating onion soup in the Black Forest.
Nobody cheated. Valheim's gates are made of damage, and damage is a soft gate: it can be out-geared, out-run or simply out-healed, which is why the Plains stops being frightening about ten minutes after it starts. A careful player with a decent shield walks through any of them hours early, and the food, the gear and the map all come back with them.
What that does is not "harder" or "easier" in the abstract. It makes the game easy early and empty later. The opening hours are trivialised by food nobody should have yet, and the biomes those things came from have nothing left to give when the group finally arrives properly. Progression stops being a sequence of places you earn and turns into a shopping list you can run in any order.
The usual mod answer is the opposite extreme: a hard boss gate that refuses to let you across the border at all. That fixes the pacing by deleting the thing worth having, which is the walk into somewhere you should not be.
Utangard sits between them. You can go anywhere, immediately, and nothing stops you at the edge. The land just will not sustain you while you are there.
Read on
The rest of the argument, and the technical notes on how Valheim actually records boss attendance, are in DESIGN.md.
Multiplayer and persistence
- Progress belongs to the world, and is saved with it. A gate that forgot people the moment they logged off would not be a group gate at all.
- Credit is per world, not per character. A character that cleared a solo world does not arrive on your server pre-credited. Imported credit is only honoured for a boss this world has already seen die, so it can never open a biome on its own.
- Nothing about your character is modified. Vanilla's own record of which bosses you have attended is read, never written.
- The mod is client-side in what it does to you. Food timers and status effects belong to the owning client; nothing here reaches into another player's character.
Configuration
BepInEx/config/ezomic.valheim.utangard.cfg. Every entry has a comment in the file explaining
the reasoning, not just the units.
BepInEx writes this file on first run, and the saved value beats any new default in code. If a change appears to do nothing, check the cfg before reading anything else.
With Longhouse Core installed, every setting that decides a rule is synced from the host: all of Gate including the biome keys, the drains and blocks under Food and Buffs, and both Sapped values. Anything that decides wording stays yours: the two blocked messages, all of Presentation, and all of Diagnostics. The host sets the rules of the gate; it does not get to pick your phrasing or your log level.
Gate
| Setting | Default | What it does |
|---|---|---|
Enabled |
true |
Master switch. Off leaves the game completely untouched. |
GateOnGroup |
true |
Gate on whether everyone has personally done the boss. Off restores "one kill opens it for all". |
GateNeverRegresses |
true |
Once the group clears a boss, that biome stays open forever. Off makes the gate strictly weakest-link at all times. |
RosterDays |
14 |
Real days a character counts for after it was last seen. |
RosterDaysPerBoss |
(empty) | Per-boss overrides, as key:days pairs. E.g. defeated_eikthyr:7, defeated_fader:60 |
BackfillFromCharacter |
true |
Credit a character from its own file, for a boss this world has already seen die. The migration path for existing worlds. |
CatchUpDays |
0 |
Fallback deadline for any boss not named below. 0 means none. |
CatchUpDaysPerBoss |
eikthyr:1 … fader:7 |
Days the group has to catch up once the first player clears a boss. |
CreditRadius |
100 |
Metres from a dying boss to be credited. |
ExcludePlayerIds |
(empty) | Character IDs that never count towards the gate. IDs, not names. |
Key_<Biome> |
see table above | The global key that opens each biome. Blank means never gated. |
Food
| Setting | Default | What it does |
|---|---|---|
FoodDrainMultiplier |
5 |
How much faster food burns. 1 disables the drain and leaves only the refusal. |
BlockEating |
true |
Refuse to eat or drink anything at all. |
EatBlockedMessage |
The land will not feed you here |
Shown when a bite is refused. |
Buffs
| Setting | Default | What it does |
|---|---|---|
BuffDrainMultiplier |
5 |
How much faster a running buff burns. |
BlockNewBuffs |
true |
Refuse to apply any new buff. |
BlockRested |
true |
Treat Rested and Resting as buffs. Off, a well-built camp becomes a real answer to the biome. |
AlsoBlock |
(empty) | Extra status effect names to treat as buffs. |
NeverBlock |
Puke |
Names to leave alone even if the rules caught them. Wins over AlsoBlock. |
BuffBlockedMessage |
The land turns your power aside |
Shown when a potion or guardian power is refused. |
Sapped
| Setting | Default | What it does |
|---|---|---|
StaminaRegenMultiplier |
0.25 |
Stamina regeneration while Sapped, as a fraction of normal. |
MaxSeconds |
30 |
Ceiling on how much Sapped you can bank. Also how long you must stand there to reach full penalty. |
Presentation
| Setting | Default | What it does |
|---|---|---|
ShowStatusEffects |
true |
Show the two effects on the HUD. |
MarkIconFrom |
Poison |
Vanilla effect whose icon the in-biome marker borrows. |
SappedIconFrom |
Encumbered |
Vanilla effect whose icon Sapped borrows. |
EnterMessage |
Something here refuses you |
Shown once on entering. Blank to say nothing. |
LeaveMessage |
The land loosens its grip |
Shown once on leaving. |
NameTheBlockers |
true |
Name the characters the biome is still waiting on. |
BlockedByPrefix |
Still owed by: |
Prefix for that list. |
Diagnostics
| Setting | Default | What it does |
|---|---|---|
Verbose |
false |
Log every gate transition and blocked effect. |
LogGlobalKeys |
true |
Log the world's keys and the whole gate table on spawn. Leave this on. It is how you catch a wrong key name. |
LogBlockedEffects |
false |
Log the full list of effects the mod decided are buffs. |
Status
Played, not merely built. On a local world and on a real dedicated server: refused meals and potions keep their items, both HUD icons render, food and buff timers visibly burn at 5×, Sapped accumulates and follows you out, a guardian power is refused without burning its cooldown, gates open and close at borders in both directions, credit is granted at the kill and survives a world reload, the latch fires, a two-character roster names both debtors, and the catch-up deadline opens a biome for a group that had not all earned it. Running standalone with no Core has been confirmed in game.
What has not been tested, and only this:
- Attendee credit with more than one player. Solo you own the boss ZDO and credit yourself either way. The loop is identical for one player or five; what is unproven is whether other players' objects are instantiated on the owning client at fight range.
- Whether
defeated_queenanddefeated_faderare the real key names. See Biome progression.
MIT licensed. Part of a suite of mods written to be played with rather than published from; Longhouse Core is the optional shared library.
CHANGELOG
Changelog
Notable changes to Utangard. Format follows Keep a Changelog, and the mod uses semantic versioning.
[1.1.0] - 2026-08-17
An API for other mods to ask what the group has earned
UtangardApi.GroupHasKey(bossKey) answers the one question this mod knows and nothing else
does: whether the group has earned a boss, rather than whether the world has merely seen it
die. Those two answers part company the moment somebody is offline for a kill.
It exists because Hoard scales stack sizes by world progression. Reading the raw defeated_
key there would hand out Plains-era stacks for a biome still fenced off here, which is two mods
disagreeing out loud about the same word in a way that reads as a bug in whichever one the
player happens to be looking at.
A facade rather than making Progression public: the roster, the latch and the deadline are
nobody else's business. Read-only by construction, so a consumer cannot open a biome by asking
about it.
The README is half the length
The source-code archaeology moved to DESIGN.md - why Character.OnDeath credits one player
rather than all of them, what the global keys are called and why, and the handful of things
that were nearly bugs. None of it is needed to play, and it was sitting between a new reader
and the part that says what the mod does.
Nothing about the gameplay changed in this release.
[1.0.0] - 2026-08-16
First release. Played, not merely built.
Core is optional
Utangard installs and runs on its own. Core is a soft dependency: present, it is used exactly as before; absent, the mod is fully functional without it.
Nothing about the gameplay needed Core. The drain, the refusal and Sapped are local patches, and the group gate travels over vanilla global keys, which every client replicates already. Singleplayer is unaffected in every respect.
What Core buys is enforcement, and that is the whole of what standalone gives up. Core is what refuses a client that does not have Utangard; without it, a player who skips the mod is not gated at all and walks into the Ashlands on day one while everyone else waits on the roster. The gate becomes an agreement between players rather than a rule of the server.
That is a real trade and it belongs to whoever runs the server, so the mod logs it rather than refusing to run, and it says so loudly, once, on spawn, when it finds the group gate enabled in a multiplayer session with no Core. That combination is the one that looks like it is working and is not, and failing silently there is the worst of the options.
Mechanically: [BepInDependency] is SoftDependency, every Suite call sits behind a
Chainloader.PluginInfos check inside a [MethodImpl(MethodImplOptions.NoInlining)] method,
and the project reference to Core is compile-time only. The no-inlining is load-bearing rather
than decorative. The JIT resolves the assemblies a method needs when it first compiles that
method, so a Suite call sitting directly in Awake would drag Ezomic.Core in before the
check could prevent it, and the missing-assembly exception would land during plugin load.
Core is not listed in manifest.json, so installing Utangard does not install Core with it.
Confirmed in game: Utangard loads alone, logs that it is running standalone, and the whole gate
works without Core present.
The group gate, finished
0.2.0 shipped the idea; this is the version where it holds up.
- Credit is earned at the kill, by everyone present. The owning client credits every
player within
CreditRadius(100 m) of the corpse. It had to be done that way:Character.OnDeathlooks like it runs on every client that had the boss loaded, since it pushes vanilla's key above anIsOwnerearly-return. But that guard is unreachable, becauseCheckDeathis its only caller and sits insideif (zDO.IsOwner()). Crediting "the local player" would have credited exactly one member of a group that killed a boss together, and the gate would then have jammed shut while looking like it worked. - Credit is per world. A character that cleared a solo world no longer arrives
pre-credited.
BackfillFromCharacterstill allows the migration case, and only for a boss this world has already seen die. - Progress never regresses. Once the group clears a boss the biome latches open, so a newcomer gates only what has not been cleared rather than revoking what has.
- A catch-up deadline, defaulting to a ladder of one day for Eikthyr and one more per
boss after. Without it a single person who stops logging in holds a biome shut for everyone
until
RosterDaysfinally drops them. A biome the deadline opens latches too. - Per-boss roster windows via
RosterDaysPerBoss, for when one boss deserves a shorter leash than another. - The blocker line names other people, never you, and shows how long is left.
Fixed
- A refused meal or potion is no longer destroyed.
Player.ConsumeItemremoves the item regardless of whatEatFoodreturns, so the refusal had to move toCanConsumeItem, the gate that path actually respects. - Refusing a guardian power no longer burns its cooldown;
StartGuardianPowersets the cooldown before applying the effect. Restedcan no longer be topped up past the drain.SEManrefreshes a running effect throughInternal_AddStatusEffectwithout ever reaching the public overload.Pukeis no longer treated as a buff. An item applies it on consume, so the potion rule swept up a debuff, which would have made a gated biome the one place bad food cannot hurt you.
Played, not merely built
On a local world and on a real dedicated server: refused meals and potions keep their items, both HUD icons render, food and buff timers burn at 5×, Sapped accumulates and follows you out and cripples stamina regeneration, a guardian power is refused without burning its cooldown, gates open and close at borders, credit is granted at the kill and survives a reload, the latch fires, a two-character roster names both debtors, and the catch-up deadline opens a biome for a group that had not all earned it. No exceptions in a long session.
Known limits
- Attendee credit has never run with more than one player. Solo, you own the boss and credit yourself either way, and two characters taken in turns only credits whoever is logged in. The loop is the same for one player or five; what is unproven is whether other players' objects are instantiated on the owner's client at fight range.
defeated_queenanddefeated_faderare taken from prefab data rather than the game'sGlobalKeysenum. A wrong key fails closed, which is indistinguishable from a working gate.LogGlobalKeysprints what your world actually has.
[0.2.0] - 2026-08-15
Written and building. Never run in game.
The line this sits on
A biome you have not earned will not feed you. It never stops you walking in.
Valheim gates its biomes with damage, which is a soft gate: out-geared, out-run or out-healed, which is why the Plains stops being frightening ten minutes after it starts. The usual mod answer is a hard boss gate that refuses to let you across the border, which fixes the pacing by deleting the thing worth having: the walk into somewhere you should not be.
Utangard sits between them. You can go anywhere, immediately, and nothing stops you at the edge. The land just will not sustain you while you are there.
The three parts
Three parts rather than one number, because they do different jobs:
- The drain. Food and buffs burn down five times faster in an unearned biome. This sets the clock, and it is the part you feel while things are going well.
- The refusal. You cannot eat or drink anything at all while you are there. Without it the drain is simply beaten by a bigger pack, and the mod becomes an inventory tax rather than a time limit.
- Sapped. Seventy-five percent less stamina regeneration, one second per second spent in the biome up to thirty, and it keeps ticking after you leave. Without it the optimal play is to sprint in, grab and sprint out at no cost, and a penalty you can dodge by being quick is a penalty for slow players only.
The gate is on the group, not the world
By default a biome opens when every member of the roster has personally killed the boss, not when the boss has died in this world. Kill Moder yourself and the Plains stays shut until the friend who was offline that night has killed it too.
This rides on Character.OnDeath pushing m_defeatSetGlobalKey into
Player.m_addUniqueKeyQueue, which is how the game records a boss kill against a character
rather than a world.
Known limits
- Never played. None of the three parts has been felt in a session, and the numbers are therefore first guesses rather than tuned values.
- The per-character kill record is only refreshed when a player loads in, so a boss killed during the current session is not visible until then unless the kill itself is hooked.