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.
Tarn
Water at any height: real lakes above sea level, built from a per-world lake list, swimmable, on the map, synced from the server. Also keeps vegetation off a map maker's roads and lake beds.
| Date uploaded | a day ago |
| Version | 0.4.2 |
| Download link | RavenIronStudios-Tarn-0.4.2.zip |
| Downloads | 30 |
| Dependency string | RavenIronStudios-Tarn-0.4.2 |
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.2360README
ποΈ Tarn
The gods poured one sea around Midgard and filled it to a single line. Every hollow in the high fells stayed dry, and the Vikings who climbed there drank snow. Now the hollows hold water, cold and still, each at its own height.
Real lakes above the sea. Swim in them, sail on them, see them on the map.
Valheim has one water level, so every lake above the sea is a dry hollow. Tarn puts real vanilla water in them, at their own height. It was made for the Ravenrest map, by Raven Iron.
It also keeps trees, rocks and bushes off ground a map maker marks, such as roads, and off every lake's bed. The server owns the lakes and sends them to every player.
This version is Tarn built for Valheim 1.0.21.
| You | It |
|---|---|
| Update the server and your players together | Valheim 1.0.21 uses network version 41: the server and every player's game must be on it to meet |
| Keep your lakes and settings | nothing else changes |
| If⦠| Then⦠| |
|---|---|---|
| π§ͺ | you want something finished | Tarn is a prototype. It works and is used on test worlds, but the details may still change. |
| π€ | you play on a server | install Tarn on the server and on every player, the same version. Without Tarn on the server, players get no lakes. |
| π² | you want ground kept clear on a world you have explored | clearing only touches zones generated after a lake or mask exists. Make a new world, reset those zones, or use tarn clearbeds for lake beds. |
| πΎ | you see grass in the water | paint the lake bed with dirt. Vanilla's grass ignores Tarn's water and its clearing. |
Each lake fills its basin, and behaves like the sea.
| πΉ Fills the basin | everything below the lake's level that joins its deepest point |
| πΉ Vanilla water | swimming, the wet status, boats, floating and the underwater view all behave as at sea |
| πΉ On the map | lakes are drawn as water on the minimap and the large map |
| πΉ The sound of water | near a lake you hear it, a little quieter than the sea |
| πΉ How deep it looks | calm and green, or blue and rough: tarn depth changes it live |
| πΉ Light on the frame rate | lakes are built as you come near and dropped behind you, a few milliseconds a frame |
π Read the saga β how a lake is built
The water is vanilla's own: the sea's tiles and its water volumes, set at the lake's height. That is why everything that works at sea works on a lake.
Each player's game builds the water. The server, or the host in single player, owns the lake list and sends it to every player; a dedicated server builds no water of its own. Lakes within reach are built, a little at a time, and dropped again once you are well past them.
Big lakes are shaped ahead of time, for lakes near any player, so zone generation finds them ready.
Stand in a hollow, type one command, and it fills.
πΉ tarn here |
fills the hollow you stand in, up to just under the point where it would spill |
πΉ tarn at <x> <z> |
the same, at a point on the map |
| πΉ A lake list per world | a map maker can write every lake into one file; tarn here adds to it |
| πΉ Everyone sees it | a new lake goes to every player at once |
π Read the saga β what makes a hollow
A hollow is ground lower than its rim. tarn here finds where the water would spill out and sets the lake just under it. Stand in the low part. A hollow that would spill into the sea gets no lake, and the command says so.
On a server it is the server's lake. A player's tarn here is sent to the server, which runs it for admins on adminlist.txt; the lake list is saved there.
No trees in the lake. No rocks on the road.
| πΉ Lake beds | no trees, rocks, bushes or pickable debris are placed on a lake's bed, from the shore down, for every lake, tarn here lakes included; on by default |
| πΉ A map maker's mask | ground a map maker marks, such as roads, is kept free the same way |
| πΉ Only what would stand there | everything else is placed exactly as vanilla places it |
πΉ tarn clearbeds |
for ground you have already explored: counts what stands on lake beds, then removes it when you add confirm |
π Read the saga β how clearing works, and what it never touches
It uses vanilla's own clear areas, the same ones that keep trees out of locations. Only what would have stood on a marked spot is left out.
Only new ground. Whoever generates a zone places its vegetation, so clearing works on zones generated after a lake or a mask exists. A lake made on explored ground keeps the trees already standing in it, until tarn clearbeds.
tarn clearbeds takes only vanilla vegetation: trees, rocks, bushes and pickables, on the bed as Tarn clears it. Nothing a player built is touched, nor stumps, logs, drops or creatures. A tree grown from a planted sapling looks the same as a wild one, so it goes too if it stands on a bed. Removing can't be undone.
The shore. Clearing reaches a little past the water's edge, 2 m by default (Clearing.LakeBedShore). Lower it for less bare shore; at 0 a bush may still stand in the shallows. Clearing removes trees, rocks and bushes, not grass: paint the bed with dirt for that.
First ten minutes: install Tarn with your mod manager (on the server and every player) β walk to a dry hollow above the sea β open the console (F5) β tarn here β swim.
| Command | |
|---|---|
tarn here [radius] [margin] |
fill the hollow you stand in, up to just under its spill point |
tarn at <x> <z> [radius] [margin] |
the same, at a point |
tarn list [n] |
the nearest lakes, and whether they are built |
tarn depth [scale] |
how deep lakes look (colour, foam, waves); applies live |
tarn reload |
re-read this world's lake list and Tarn's settings on the server |
tarn clearbeds <lake> Β· tarn clearbeds all |
count what stands on lake beds in explored ground; add confirm to remove it |
tarn remove <name> Β· tarn remove all |
remove a lake, or every lake |
tarn info |
the vanilla water Tarn copies |
On a server, the commands that change anything need the player on adminlist.txt.
π Write a lake list
The lake list is BepInEx/config/Tarn/<world name>.txt, read on the server or the host. One lake per line:
name;x;z;level;minX;minZ;maxX;maxZ;depth
x and z are the lake's deepest point, level is the absolute world height of the water's surface, and the box is the area the lake may fill. Lines starting with # are ignored. After editing, run tarn reload.
πΊοΈ Make a clearing mask
The mask is BepInEx/config/Tarn/<world name>.clear, optional. Its header is TARNCLR1, then an int32 size and a float32 half-extent in metres, then size Γ size bits: row 0 is the north edge, high bit first (numpy packbits order).
It is read on the server, the host, or in single player, and sent to every joining player, because whoever generates a zone places its vegetation. It only affects zones generated after it exists, so make a new world, or reset those zones. If a player generates a zone in the seconds before the mask arrives, the log names it.
π§Ή Clear the beds of lakes on explored ground
Run tarn clearbeds <lake> (or all) to count the trees, rocks, bushes and pickables standing on lake beds. Check the count, then run it again with confirm on the end to remove them. It can't be undone. On a server it runs on the server, for admins only, and the answer comes back to your console.
π¨ Tune how lakes look
tarn depth shows the current value. Vanilla's water colour, foam and waves follow depth, so tarn depth 0.2 makes lakes calm and green, and tarn depth 1 makes them look like the sea. On a server it is the server's setting: a player's tarn depth <value> is sent there, admins only, and reaches everyone.
| Without Tarn on the server | Needs Tarn on the server | Needs Tarn on both ends |
|---|---|---|
| a player's Tarn finds no lakes, and its log says so after about a minute | the lake list and the clearing mask Β· every setting Β· the commands that change anything | the water itself, built on each player's game Β· lakes on the map Β· the lake sound Β· clearing in zones a player generates |
Every setting follows the server. Players get the server's settings when they join and whenever one changes: an admin's tarn command, a config manager, or the server's .cfg edited, which is noticed within seconds. A player's own file is never touched and is used again in single player.
Same version on both. If the server's Tarn differs from a player's, the player's log warns: update to match.
| Mod or map | |
|---|---|
| Config managers | A change made with one on the server reaches every player. |
| The Ravenrest map | The map Tarn was made for: its pipeline writes the lake list and the mask, and paints its lake beds with dirt. |
| Better Continents | Ravenrest is a Better Continents map. Better Continents' vegetation map is read once per 64 m zone, too coarse to keep a road clear; Tarn's clearing does that job. |
All in BepInEx/config/com.raveniron.tarn.cfg, and all safe to leave alone.
π Server-synced β on a server, the server's values apply to everyone
| Section | Setting | What it does |
|---|---|---|
| Look | DepthScale |
how deep lakes look (0.5 by default); tarn depth sets it live |
| Sound | LakeVolume |
the lake water sound; 0 is off |
| Performance | BuildRange |
lakes within this many metres are built (400 by default) |
| Performance | BuildBudgetMs |
milliseconds per frame spent building and shaping lakes (2 by default) |
| Clearing | LakeBeds |
keep vegetation off every lake's bed (on by default) |
| Clearing | LakeBedShore |
how far past the water's edge clearing reaches, in metres, 0 to 10 (2 by default); tarn clearbeds uses it too |
π₯οΈ Local: none while you are connected. In single player your own file is used.
Needs: BepInExPack Valheim 5.4.2360 Β· Source: GitHub Β· Website: https://ravenirongames.com/
Made for the Ravenrest map, by Raven Iron.
CHANGELOG
Changelog
0.4.2 (2026-11-01)
Updated due to the Valheim 1.0.21 patch. Rebuilt and checked against Valheim 1.0.21 (network version 41); no code changes beyond the version string. The BepInExPack dependency is now 5.4.2360, and the store page's website link is https://ravenirongames.com/.
0.4.1 (2026-10-12)
- How far lake-bed clearing reaches past the water is a setting now:
Clearing.LakeBedShore, in metres. The default is 2, the same as 0.4.0.- A lake's shape is sampled every 4 m, so at the default the cleared edge lands 0 to 4 m past the real waterline, about 2 m on average.
- Lower it for less bare shore. At 0, a bush can still stand in the shallows here and there.
tarn clearbedsuses the same distance.- In multiplayer, the server's value applies to everyone; it's sent with the lakes. A 0.4.0 server counts as 2.
- Every setting follows the server. The server sends all of Tarn's settings to each player who joins, and again
to everyone whenever one changes. While connected, a player's game uses the server's values in memory only; their
own config file is untouched, so their settings are back in single player. A setting changes on the server when:
- an admin runs a
tarncommand.tarn depthfrom a player now goes to the server, admins only, and comes back to everyone. - a config-manager mod changes it.
- the server's
.cfgfile is edited. The server notices within a few seconds, andtarn reloadre-reads it at once. - A 0.4.0 server sends no settings, so players keep their own (and its lake message's lake-bed values).
- an admin runs a
- The store page links to the source on GitHub.
0.4.0 (2026-10-11)
- Lake beds are kept clear on their own. No trees, rocks, bushes or pickable debris are placed on a lake's bed,
from the shore down. That includes lakes made with
tarn here, so they no longer need a.clearfile. The cleared ground is the same flood that shapes the water. It goes about 4 m past the waterline, so nothing stands in the shallows. It's on by default; the config setting isClearing.LakeBeds.- As with the mask, only zones generated after a lake exists are affected.
tarn hereon ground you've already explored leaves the trees that stand there. - Grass still needs dirt paint on the bed: vanilla's grass follows the ground paint, not clear areas.
- As with the mask, only zones generated after a lake exists are affected.
- New command,
tarn clearbeds <lake|all>, for lakes made on ground already explored. It counts the trees, rocks, bushes and pickables already standing on lake beds.tarn clearbeds <lake|all> confirmremoves them, which can't be undone.- Only what vanilla places as vegetation goes, and only on the bed as Tarn clears it. Nothing a player built is touched, nor stumps, logs, drops or creatures. A tree grown from a planted sapling looks exactly like a wild one, though, so it goes too if it stands on a bed.
- On a server it runs on the server, for admins on
adminlist.txtonly, and the answer comes back to that player's console.
- In multiplayer, the server's setting applies to everyone. It's sent with the lakes. The server and every player clear the same ground, because each machine generates some of the zones. A 0.3.0 player still gets the lakes but clears no beds. A 0.4.0 player on a 0.3.0 server clears none either.
- Big lakes are shaped ahead of time, a few milliseconds a frame, for lakes near any player. Zone generation then finds them ready. If a zone needs a lake that isn't ready yet, it's shaped on the spot, and the log says how long that took when it's slow.
- A lake re-sent by the server keeps its shape if it hasn't changed, so
tarn hereno longer makes every player re-sample every lake. - New log lines: the load line says whether lake beds are kept clear, and one line names the first zone that had a lake bed cleared.
0.3.0 (2026-10-06)
- The clearing mask is synced from the server. Vegetation is placed by whichever machine generates a zone, which in
multiplayer is usually a player. The server (or host) now sends its
<world>.clearto every joining player: deflated (Ravenrest's 2 MB mask is 68 KB) and sent in 48 KB chunks. A connected player never reads their own.clearfile, as with lakes. If a zone is generated before the mask arrives, the log names it. - One log line proves the clearing ran: the first zone with marked ground, and how many clear areas it got.
- The server needs 0.3.0 too: an older server never answers, and the player is told so after about a minute.
0.2.0 (2026-10-06)
- Clearing: a per-world mask (
BepInEx/config/Tarn/<world>.clear) of ground kept free of vegetation, such as a map maker's roads and lake beds. It adds vanilla clear areas toZoneSystem.PlaceVegetation, so only what would have stood on a marked spot goes. Better Continents' vegetation map can't do this, because it is read once per 64 m zone, at the zone's centre. Verified in game on Raventest22. - Fix: the clear-area type is private in the real game, so it is reached by reflection. A first build compiled
against the publicized assemblies threw
MethodAccessExceptionin game. - The load line names the real version. It said "0.1.0" whatever the build.
0.1.0 (2026-10-05)
- Lakes at their own height from
BepInEx/config/Tarn/<world>.txt, built as you come near. - Lakes drawn on the map, and the lake sound.
- Server-owned lake list, synced to every player. The
tarnconsole commands.