Lur
Sound a horn in one of Hildir's dungeons and its mini-boss wakes again.
- Features
- The three dungeons
- Using the horn
- What it does not restore
- Installation
- Configuration
- Multiplayer
- Compatibility
- Troubleshooting
- Known limitations
- Bug reports
- Discord
- Server
- Building
- Part of Longhouse
- Licence
Hildir sells a horn. Sound it inside one of her three dungeons and the mini-boss you already killed there comes back, so you can fight it again.
Features
- A horn on Hildir's shelf, 500 coins by default.
- Sounding it inside one of her three dungeons clears the spent mark on the mini-boss's spawner. Vanilla's own spawner code does the spawning a second later.
- Wakes the mini-boss and nothing else. Looted chests stay looted, smashed pots stay smashed, mined veins stay mined.
- A cooldown per dungeon, measured in in-game days. Five by default.
- The horn is only consumed if something actually wakes. Every refusal names its reason on screen.
- Deletes no saved objects, never regenerates a dungeon, never touches terrain and never writes a global key.
The three dungeons
| Setting | Dungeon | Biome |
|---|---|---|
WakeCrypt |
Smouldering Tomb | Black Forest |
WakeCave |
Howling Cavern | Mountains |
WakeTower |
Sealed Tower | Plains |
Lur finds them by the theme flags the game puts on the dungeon generator
(ForestCryptHildir, CaveHildir, PlainsFortHildir), not by prefab or location names.
Ordinary crypts, caves and Fuling camps are never matched.
Using the horn
Put it on the hotbar and use it there. Using it from the inventory window does nothing; only the hotbar path is hooked.
You have to be standing inside the dungeon. "Inside" means inside one of the generator's own
room boxes, plus RoomPadding metres of slack.
When the horn is accepted:
- The spent mark is cleared on the mini-boss's spawner, and on the other spawners in its spawn group if it has one. A grouped spawner counts spawns across the whole group, so a spent neighbour would keep the group shut on its own.
- Lur watches those spawners for up to
WatchSeconds(30 by default) and checks what actually appears against the creature the boss spawner holds. - On a match the horn is consumed and the dungeon is stamped with the current world time, which starts the cooldown.
- On a timeout every spawner is put back exactly as it was and you keep the horn.
- If something spawns but it is not the boss, the horn is not consumed and the log explains it. The spawners are not rolled back in that case, since the spawn has already happened and restoring the old mark could leave a live creature beside a spawner free to make another.
What it says and what it means
| Message | Meaning |
|---|---|
| Nothing sleeps here. | Not inside one of the three dungeons, that dungeon is switched off in config, two dungeons overlap at this point, or no boss spawner was found in it. |
| The stone is still settling. | The dungeon's rooms are still streaming in. Wait a second and sound it again. |
| This place has not settled. N days yet. | Cooldown. Counted in in-game days. |
| Someone lies unclaimed here. | There is a tombstone inside the dungeon. Collect it first. |
| It is already awake. | The spawner never fired, or the creature it made is still alive. |
| Something built here keeps it away. | Someone has built inside the dungeon and the spawner now sits in a player base area, where vanilla will not spawn. |
| Nothing here answers the horn. | A global key on the spawner blocks it. |
| Something wakes. | Success. The horn is spent. |
| Nothing stirred. | Nothing spawned in time. The horn is not spent. |
| Something else stirs. | Something spawned, but not the boss. The horn is not spent; turn on Diagnose and report the census. |
What it does not restore
Only the mini-boss. Chests you emptied stay empty, props you broke stay broken, veins you mined stay mined. A repeat run buys the fight, its drops and its trophy, and nothing you already took. If you want a dungeon that restocks itself, Dvala is the mod for that.
Hildir will not accept a second quest chest. Her turn-in is recorded on the world and her own code refuses an offering whose key the world already holds, before the item is taken. So the cosmetic reward happens once per world however many times you fight for it.
Installation
Requires BepInEx 5.4.2350. BepInEx 5 API only; this is not compatible with BepInEx 6.
Through a mod manager it is one install. By hand, put Lur.dll, lur.obj and lur.png in
BepInEx/plugins/Lur/. The .obj and .png are the horn's model and icon and are read off
disk at runtime, so the item cannot be built without them.
Then start the game once and quit. That first run writes the config file, which does not exist before the mod has loaded.
Version 1.1.0 is built for Valheim 1.0.7 and does not run on pre-1.0 Valheim. 1.0.1 is the last version for older game builds.
Configuration
The file is BepInEx/config/ezomic.valheim.lur.cfg. Every entry has its reasoning in a
comment above it.
BepInEx writes every entry on first run and the saved value beats a new default in code, so changing a default in a new version does nothing on a machine that has already run the mod. If a setting looks like it is being ignored, read the cfg before anything else.
Lur
| Setting | Default | Effect |
|---|---|---|
Enabled |
true |
Off leaves the plugin loaded, drops the horn from Hildir's stock and makes sounding it do nothing. Horns already in an inventory stay there. |
ItemName |
Lur |
Display name only. The prefab name is fixed in code, because renaming it would orphan every horn already saved in a world. |
ItemDonor |
SurtlingCore |
Vanilla item the horn borrows its machinery from: ZNetView, ItemDrop, Rigidbody, colliders, floating in water. Its appearance is not used. SurtlingCore and Wood are tried as fallbacks if the named one is missing. |
SoundEffectPrefab |
empty | Vanilla effect prefab played where the horn is sounded. Empty for none. A name that does not resolve is logged once and skipped. |
Dungeons
| Setting | Default | Effect |
|---|---|---|
WakeCrypt |
true |
Allow waking the Smouldering Tomb. |
WakeCave |
true |
Allow waking the Howling Cavern. |
WakeTower |
true |
Allow waking the Sealed Tower. |
CooldownDays |
5 |
In-game days before the same dungeon can be woken again. 0 leaves the horn's price as the only cost. Measured on the world clock, so time with nobody online does not count and a server that sat empty for a week does not come back with everything due at once. |
RoomPadding |
1 |
Metres of slack added to each room's box when deciding what counts as inside the dungeon. Raise it if a boss refuses to wake and the log shows its spawner just outside. |
UseLocationRadiusFallback |
false |
Also count anything inside the location's own radius as part of the dungeon, not just the generator's rooms. Looser, and it can reach a spawner standing outside the tower wall. Turn it on only if the diagnostic log shows a boss spawner that is in no room at all. |
WatchSeconds |
30 |
How long to wait for something to spawn before giving up and putting the spawners back. On a timeout the horn is not consumed. Must comfortably exceed the spawners' own interval. |
Store
| Setting | Default | Effect |
|---|---|---|
Price |
500 |
What Hildir charges, in coins. Her own stock runs from a few hundred to somewhat over a thousand. |
Stack |
1 |
How many horns one purchase buys. Vanilla clamps this to the item's max stack size, which is 10. |
SoldAfterKey |
empty | A global key Hildir requires before she stocks the horn. Empty means always on sale, which is the recommended setting, since sounding it already refuses in a dungeon whose boss is still alive. bosshildir1 is the value for a host who wants the shop gated too. An unknown key is not an error: the row simply never appears. |
Diagnostics
| Setting | Default | Effect |
|---|---|---|
Diagnose |
false |
Log a full census of every Hildir dungeon as it loads: its generator, its themes, its rooms, and every spawner near it with an inside-or-outside verdict. The first thing to turn on if the horn does nothing. |
Verbose |
false |
Currently reads as no change. The lines its comment describes are written to the log either way. |
Multiplayer
Install it on every client and on the server, at the same version and build. It registers an item prefab, and a client that cannot resolve that prefab does not fail loudly: the game discards the saved object as junk, and a horn sitting in somebody's chest is gone.
With Longhouse Core installed, Lur registers with
the version check and the server rejects clients whose version or build id does not match.
Core also applies the host's config values on connected clients in memory only; your own
config file is never written to, and your values are back the moment you disconnect.
Diagnose and Verbose stay yours. Everything else is the host's, because two clients
disagreeing about what may be woken is two clients disagreeing about the world's ZDOs.
Without Core the mod still runs. What is lost is the enforcement: nothing refuses a client that does not have it.
Not tested with more than one player. Everything it does has been tested in single player, where you are also the server.
Compatibility
Three Harmony patches, all on seams the game already provides: a prefix on Humanoid.UseItem
for the hotbar, a postfix on DungeonGenerator.Awake that only logs, and a postfix on
Trader.GetAvailableItems for the store row. Nothing patches movement, spawning or the zone
system.
The store row is appended to the list Hildir hands out rather than added to the Trader
prefab, so other mods that add trader stock are unaffected. Haldor is not touched.
Troubleshooting
Hildir does not stock the horn. Look for Hildir will stock Lur at 500 coins in
BepInEx/LogOutput.log. If that line is missing the item has not registered, and the usual
cause is lur.obj not being in the plugin folder. If the line is there but the row is not,
check SoldAfterKey: a key the world does not hold reads as "she does not sell it".
The horn refuses in a dungeon it should work in. Turn on Diagnose, re-enter the
dungeon, and read the census in BepInEx/LogOutput.log. It lists the generator, its themes,
its rooms and every spawner with an inside-or-outside verdict. A boss spawner that reads as
just outside wants a higher RoomPadding. One that is in no room at all is the case
UseLocationRadiusFallback exists for.
A vanilla mechanic broke. Gameplay exceptions land in
AppData\LocalLow\IronGate\Valheim\Player.log, not in BepInEx's log.
Known limitations
- Not tested with more than one player.
- The Sealed Tower is the least proven of the three in play. Its dungeon sits on the ground
rather than in the sky, and whether its boss spawner is inside a generated room is the
question
UseLocationRadiusFallbackexists to answer. Verboseis bound but nothing reads it.
Bug reports
Report in the Discord or on the issue tracker. Useful things to attach:
BepInEx/LogOutput.log, ideally withDiagnoseturned on and after re-entering the dungeon.- Whether you were on a server or in single player.
- Which of the three dungeons it was.
AppData\LocalLow\IronGate\Valheim\Player.logif a vanilla mechanic broke.- Your
ezomic.valheim.lur.cfgif you changed anything in it.
Discord
discord.gg/hJzAVaZ5wb 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. Details are in the Discord.
Building
net462, no NuGet. It references Valheim's managed DLLs from the game folder and BepInEx's
from whichever profile it deploys to, so a fresh clone builds with nothing to restore.
ProfileDir defaults to the repo's own testprofile.
The six horn shapes this one was chosen against are kept in assets/variants/, with the
reasoning for each in tools/lur_designs.py. The one that ships is scroll.
Part of Longhouse
Lur is in the Longhouse modpack, which pins the exact versions it ships with. It behaves the same installed on its own.
Licence
MIT. See LICENSE. By Robbin Thijssen, Thijssen Software.
Changelog
1.1.1 in Longhouse
Changed
Rewritten README. Same mod, clearer documentation: what it does and how to install it come first, then configuration, multiplayer behaviour, compatibility and troubleshooting. Every config table was checked against the plugin's own Config.Bind calls, so the settings, sections and defaults listed are the ones actually bound. No code changed in this release.
discuss
1.1.0
Rebuilt for Valheim 1.0. This version does not run on pre-1.0 Valheim, and the previous one does not run on 1.0.
Fixed
Hildir offered the horn at 12345 coins, and would not sell it. Valheim 1.0 grew Trader.TradeItem from four fields to eleven, and the store reads one of the new ones without a guard -
discussif (tradeItem.m_tooltip.Length > 0). A row built in code leaves unset strings null where Unity's own rows come from an asset and hold "", so drawing this row threw. The price label is written below the throw, so it kept the list template's placeholder text; the click listener is added lower still, so the row could not be bought at all. Every string on the row is now set explicitly, including the ones this mod has no use for, so the next release that adds a field does not repeat it.
1.0.1
Fixed
The readme explained itself with something untrue. It said most of what a dungeon loses is deleted rather than changed, so only regenerating a whole room could put it back, and that Lur therefore could not restock a crypt even in principle. Reading the game says otherwise: a looted chest, a picked bush, a part-mined vein and a spent spawner all still exist, each carrying a flag or a value recording what happened to it, and writing those back restores them without destroying anything.
Nothing in the mod changes. Lur still wakes the boss and nothing else, and that is a choice rather than a limit - the horn is sold as the fight again, not the crypt again. But the reason given for it was wrong, and somebody reading it to decide whether a restocking mod was even possible would have been told no. It points at Dvala now, which is that mod.
discuss
1.0.0
First release.
Hildir sells a horn. Sound it inside one of her three dungeons and the mini-boss you already killed there wakes up again, so you can fight it again.
What it does
The boss, and nothing else. Not the draugr on the way in, not the chests, not the pots. Looted chests stay looted, smashed props stay smashed, mined veins stay mined. A repeat run buys the fight, its drops and its trophy, and nothing you already took.
discussProven in all three - the Sealed Tower, the Howling Cavern and the Smouldering Tomb - and in none of them does anything come back except the fight.
discussThe horn is only spent if something actually wakes. If the boss is still alive, or somebody has built inside the dungeon, it refuses and you keep it.
discussHildir will not accept a second quest chest. Her turn-in is recorded on the world and her own code refuses an offering whose key the world already holds, before the item is even taken. So the cosmetic reward happens once per world however many times you fight for it. Sold as "fight it again", never as "farm Hildir".
discuss
Known limits
Untested with more than one player. Everything it does has been proven in singleplayer, where you are also the server. The reasoning for why it holds with several people connected is written down in the README; reasoning is not a test.
discussThe horn's model and icon have never been seen in a running game. They were changed on the day of release - the horn was a single curved blowing horn until 2026-09-07 and is now a coiled one - and the mechanic they hang off is unchanged and tested, but how a dropped horn rests on the ground is not something the build can check.
discuss
Note for anyone reading the source
The six horns this one was chosen against are kept in assets/variants/, each with the
reasoning for its shape - and for its rejection - in tools/lur_designs.py. The one that
ships is scroll.
Every setting · 16
All of it lives in one file, written on first run with each description beside its default. The file is the source of truth; edit it there.
BepInEx/config/ezomic.valheim.lur.cfg
server On a server, the host's value applies to everyone while they are connected; your own file is left alone and counts again when you leave. yours Keys and personal settings stay as you set them, on any server.
Diagnostics 2
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Diagnose | Log a full census of every Hildir dungeon as it loads: its generator, its themes, its rooms, and every spawner near it with an inside-or-outside verdict. This is how the open questions about the Sealed Tower get answered, and it is the first thing to turn on if the horn does nothing. | false | yours |
| Verbose | Write what was found and what was changed to BepInEx/LogOutput.log. Note that exceptions land in Player.log instead, not here. | false | yours |
Dungeons 7
| Setting | What it does | Default | Whose |
|---|---|---|---|
| WakeCrypt | Wake the Smouldering Tomb (Hildir's Black Forest crypt). | true | server |
| WakeCave | Wake the Howling Cavern (Hildir's mountain cave). | true | server |
| WakeTower | Wake the Sealed Tower (Hildir's plains fortress). This one is a ground location rather than a sky interior. It needs no separate code path - Lur deletes nothing and so has no height test anywhere - but it is the one of the three least proven in play. | true | server |
| CooldownDays | In-game days before the same dungeon can be woken again. 0 leaves the horn's price as the only cost. Measured on the world clock, so time spent with nobody online does not count. | 5 | server |
| RoomPadding | Metres of slack added to each room's box when deciding what is inside the dungeon. Raise it if a boss refuses to wake and the log shows its spawner just outside. | 1 | server |
| UseLocationRadiusFallback | Also count anything inside the Location's own radius as part of the dungeon, not just the generator's rooms. Off by default because it is looser and can reach a spawner standing outside the tower wall. Turn it on only if the diagnostic log shows the tower's boss spawner is not in any room - that is the single case it exists for. | false | server |
| WatchSeconds | How long to wait for something to actually spawn before giving up and putting the spawners back as they were. On a timeout the horn is not consumed. Must comfortably exceed the spawners' own interval. | 30 | server |
Lur 4
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Enabled | Off leaves the plugin loaded and changing nothing. The horn still exists in any inventory that holds one; sounding it simply does nothing. | true | server |
| ItemName | The horn's display name. This is the label only. The prefab name is fixed in code and can never change: ZNetScene keys on it and discards the ZDO of anything it cannot resolve, so a rename would delete every horn already sitting in a chest, silently. | Lur | server |
| ItemDonor | Vanilla item to take the horn's machinery from. Its appearance is not used. | SurtlingCore | server |
| SoundEffectPrefab | Name of a vanilla effect prefab to play where the horn is sounded. Empty for none. Resolved through ZNetScene; a name that does not exist is logged and skipped, so a rename in a game update costs the noise and nothing else. | (empty) | server |
Store 3
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Price | What Hildir charges, in coins. Her own stock runs a few hundred to somewhat over a thousand, so this sits mid-range. Together with CooldownDays it is the entire cost of a rematch. | 500 | server |
| Stack | How many horns one purchase buys. Vanilla clamps this to the item's own max stack size at the till. | 1 | server |
| SoldAfterKey | A global key Hildir requires before she will stock the horn. Empty means always on sale, which is the recommended setting: sounding it already refuses in a dungeon whose boss is still alive. 'bosshildir1' is the value for a host who wants the shop gated as well. An unknown key is not an error - the row simply never appears, so a typo reads as 'she does not sell it'. | (empty) | server |
Discussion
Nothing said yet.
Sign in or make an account to join in.