Jafna
Levelling with the hoe continues the flat ground it touches, and your Crafting decides how far it reaches.
- Why
- What it does
- Holding a height
- Reach, and why it is earned
- Wards
- Installing
- Settings
- Multiplayer
- What the hoe actually does
- What has not been tested
Levelling with the hoe continues the flat ground it touches instead of chasing your crosshair, and your Crafting skill decides how much ground one swing covers.
Jafna is Old Norse for to level, to make even.
Why
Flattening a large area with the hoe is miserable, and it is worth being precise about why, because the obvious answer is wrong. It is not that the tool is small. It is that the tool has no fixed idea of what height you are aiming for.
The hoe's Level ground eases every point under the tool toward the height of the placement ghost, and the ghost sits wherever your crosshair last met the ground. So the reference height follows the camera. Take one swing, walk two steps, take another, and the strip of ground both swings covered is pulled toward two different heights. You cannot aim your way out of that, because the thing moving is not your aim, it is the target. It is also why the ripples get worse the more carefully you work around the edges: every correction is another swing at another height.
Jafna gives the swing somewhere fixed to level to, and the game turns out to have been keeping it all along. Every zone's terrain data carries a flag per grid point meaning "a terrain operation has touched this", saved with the world and shared with everyone. So a swing can look at the ground it is about to cover, find the parts of it a previous swing already shaped, and use that height rather than your crosshair's. Flat spreads outward from wherever you started it, at one height, and keeps spreading in your next session and under another player's hoe.
A swing that covers nothing you levelled before is left completely alone, which is how you still start a new platform at a new height: stand clear of the old one and swing.
What it does
- A level swing continues the flat it touches. If it covers ground you already levelled, it uses that height. If it covers none, it behaves exactly like vanilla.
- It refuses rather than guesses. Where two platforms at different heights meet under one swing, it hands the decision back to your crosshair instead of averaging them into a ramp.
- You can hold a height. Press Left Alt to pin the one under your crosshair, and every swing flattens toward it wherever you stand, until you press again.
- Reach grows with Crafting. Nothing below about Crafting 25, growing to a 6 metre radius at Crafting 60 against the hoe's own 3. Never a discount: a swing costs exactly the stamina vanilla charges.
- A ward you cannot use blocks the whole swing, not just its centre.
- The build panel shows the numbers: the reach you have, the height the swing will use, and where that height came from.
- No new prefabs, items, recipes or saved values. A world played with Jafna is an ordinary world, and the ground you shaped is ground vanilla's own operation shaped.
Holding a height
Continuing the flat answers "what height is this ground meant to be" from the ground itself. That is right most of the time and certain none of the time, and two cases it cannot settle turned up within an hour of playing: a higher platform beside you captures swings you are aiming lower, and a swing crossing a zone boundary has each zone decide from its own half of the footprint.
Both are the mod guessing at an intention you already have, so you can state it instead. With a levelling tool out, press Left Alt and the height under your crosshair is held. Walk anywhere, aim anywhere, and every swing eases the ground toward that one number until you press again. Nothing is searched for and nothing is guessed while it is on.
The panel says HOLDING height, press LeftAlt to release for as long as it lasts. That wording
is deliberate: the single mistake this feature can cause is forgetting it is on, and a line
that tells you how to stop cannot be read as decoration.
A held height more than about a metre from the ground will not be reached, and that is vanilla rather than this mod. The hoe's flattening eases each point and caps its total movement at roughly one metre; only raising ground banks that and frees the budget again. So hold 32m, stand on 34m, and the ground comes down to about 33m and then stops, short of the number the panel is still showing. Use Raise ground to get within a metre first. Making a held swing ignore the cap was considered and rejected: it would turn the hoe into a tool that sets ground to any height in one swing, which is a different mod.
A held height is not kept across a logout. Coming back, swinging, and watching the ground move toward a number you set yesterday for a reason you no longer remember - with nothing on screen having changed to warn you - is a worse trap than setting it again.
Left Alt is also vanilla's alt-placement key, which does have a meaning for terrain tools. If
the placement ghost starts behaving oddly while you use this, move HoldKey to something of
its own. A server never takes a keybind over, so it stays yours whatever the host runs.
Reach, and why it is earned
This is Skaft's rule applied to a second tool: Crafting buys reach and never buys a discount. The curve is the same one, out of the same shared source file, so "8 metres at 60" cannot come to mean two different things in two mods.
Reach is deliberately the smaller half of this mod. A wider swing is genuinely useful, because one swing has one reference height and so whatever a single swing covers is flat by construction. But it does not fix anything on its own. The moment an area needs two swings you are back to two heights, and the seam between a pair of 6 metre swings is a far worse thing to repair than the seam between two vanilla ones. Continuing the flat is what makes a big swing a good idea rather than a dangerous one, which is why it is on at every skill level and the reach is not.
The reach used is always the larger of the curve and the tool's own radius, so MinRadius can
sit at zero and mean "a new character gets exactly the hoe the game shipped". Worth knowing
when tuning: the hoe's own radius is 3 metres, so with the default curve nothing changes at all
until about Crafting 25, and MaxRadius of 6 is double the vanilla radius at the top.
Wards
Vanilla checks one point when you level: the one under your crosshair. It does not check what the tool actually covers. So even the stock hoe can already cut ground out from under a neighbour's wall while you stand outside their fence, with the ghost showing blue and the ward never flashing. That is a small hole at vanilla's radius and a wide one the moment Crafting makes the tool bigger, so Jafna tests the whole footprint and refuses the swing if any of it falls inside a ward you have no access to. The hoe's op is round, so the test is a circle; a square one is padded to its corners instead.
Be clear about what that is worth. It is enforced where you swing, not where the world is saved. Terrain in Valheim is applied by whichever client owns that zone, and there is no server-side validation anywhere in that path, so this stops the mod and it stops an honest player. It cannot stop a hostile one. That was already true of vanilla and this does not make it worse.
Installing
Needs BepInEx. Nothing else. Through a mod manager it is one install. By hand, put Jafna.dll
in BepInEx/plugins/Jafna/.
Then start the game once and quit. That first run writes the config file. It does not exist before the mod has loaded, which is the usual reason people think it is broken.
Core is optional and soft. With it, Jafna joins the version gate and the host's reach and ward settings are the ones everybody plays by. Without it the mod works exactly the same for you, and the ward rule becomes an agreement between players rather than a property of the server.
Settings
Every setting is in BepInEx/config/ezomic.valheim.jafna.cfg, and each one carries its
reasoning in the file rather than here, so there is only one place to keep up to date. The ones
worth knowing exist:
ContinueFlatturns the whole idea off and leaves you with vanilla levelling.MaxRadiusis the radius a swing reaches at Crafting 60. It defaults to 6 metres, against the hoe's own 3.ContinueToleranceis how far apart the nearby shaped ground may be before the mod stops trusting it. A smoothed patch is a shallow dish rather than a plateau, so this is looser than it looks like it should be.RespectWardFootprintis the ward rule above.ShowReadoutis the build panel lines.
BepInEx writes every entry to disk on the first run and the saved value beats a later default in code, so if a setting looks like it is doing nothing, read the cfg before anything else.
Multiplayer
Terrain is applied by whichever client owns the zone, which is often not the player swinging.
Continuing a flat needs nothing to travel, because the flags it reads are already on that client's machine. The reach does, and vanilla's terrain message has no room for it, so Jafna appends the number in a place nothing reads. An owner running Jafna finds it and uses it; an owner without Jafna never looks and applies a perfectly ordinary vanilla operation. Nothing breaks in either direction, and a player without the mod is never refused the server.
What the hoe actually does
Read off the running game on 20 September 2026, because none of it is on disk. The hoe's
Level ground entry is mud_road_v2, and it is a smooth operation, not a level one:
m_smooth true, m_level false, radius 3 metres, power 1, painting dirt over the same
3 metres. Raise ground is raise_v2 and Path is paint only. Nothing in the hoe's table uses
m_level.
That matters for what this mod can promise. SmoothTerrain eases each point toward the target
by 1 - (distance/radius)^power and clamps its own accumulated movement to one metre per
point, and only a level operation ever banks that into the permanent height and frees the
budget again. So flattening with the hoe is asymptotic by design and capped near a metre per
point, which is why a real slope still wants Raise ground first. Jafna does not change any of
that. It changes the height all those swings are easing toward, so they converge on one answer
instead of following your crosshair.
The hoe's piece table names no skill. Using it raises nothing, and Player.GetBuildStamina
skips its discount branch, so unlike the hammer there is no second reward hiding behind the
first - reach here is the only thing Crafting buys. It also means the reach is not self-earning:
you cannot level your way to a wider hoe, the skill comes from crafting and upgrading at a
station. That is the same shape as Skaft, where repairing buildings trains nothing either.
What has not been tested
The mod has been in a world and its patches run, but nothing below has been watched end to end: the height actually holding across a row of swings, the ward footprint refusing anything, and any of it with a second player.
Changelog
1.0.0 in Longhouse
First release. Built, played and corrected in one sitting; the "Verified in game" section below is what was actually watched rather than what was argued from the source.
Levelling continues the flat ground it touches. Vanilla's level operation sets every point
under the tool to the height of the placement ghost, which sits wherever your crosshair last
met the ground, so the height a swing aims at follows the camera. Two swings taken a step apart
level their shared overlap to two different heights and the second one wins, permanently. That
is the reason a large flat area is miserable to make, and it is worth saying plainly because it
looks like the opposite problem: the tool feels too small, and every attempt to tidy an edge is
another swing at another height, so working more carefully makes it worse. Jafna reads the
per-point "a terrain operation touched this" flag the game already saves in each zone, and a
swing covering ground that was levelled before uses that height instead of the crosshair's. A
swing covering none is untouched, so starting a new platform at a new height still works.
Where two platforms at different heights meet under one swing the heights disagree by more than
ContinueTolerance and the decision goes back to the crosshair, rather than averaging them
into a ramp nobody asked for.
Reach grows with Crafting, on Skaft's rule and off Skaft's curve, which now lives in
core\shared\CraftingReach.cs so the two mods cannot drift into meaning different things by
the same sentence. Skaft still carries its own copy of the arithmetic and should adopt the
shared file the next time it is opened for a real change; refactoring a published mod is its
own release. Nothing at low levels, 12x12 metres at Crafting 60, and never a discount - a swing
costs the stamina vanilla charges.
A ward you cannot use blocks the whole swing. Vanilla tests the single point under your crosshair and nothing else, whatever the tool covers, so even the stock hoe can already cut ground from under a neighbour's wall from outside their fence with the ghost showing blue. Jafna tests the square footprint. It is enforced where you swing, not where the world is saved, because terrain is applied by whichever client owns the zone with no server-side validation anywhere in that path. It stops the mod and an honest player, not a hostile one, and that was already true of vanilla.
The build panel carries the numbers while a levelling tool is out: reach and the Crafting it came from, the height the swing will use, and whether that height came from your crosshair or from flat the swing is continuing. That last part is not decoration. A tool that quietly overrules your aim is indistinguishable from a tool that has started misbehaving, which is the complaint this mod exists to answer rather than to join.
Corrected during the first play test
Three things this was built on turned out to be wrong, all of them asset data that only the running game could answer.
The hoe does not use a level operation. Its Level ground entry is mud_road_v2, and it is
m_smooth with m_level false, radius 3 metres, power 1, painting dirt over the same 3. Raise
ground is m_raise and Path is paint only; nothing in the hoe's table uses m_level at all.
Every guard in the mod tested m_level, so it correctly decided the hoe was none of its
business and did nothing, with a clean log. Retargeted onto m_smooth || m_level.
The vanilla radius is 3 metres, not 2. The 2 was m_levelRadius, which this op never
reads. That moves the whole curve: with MaxRadius at 6 nothing changes until about Crafting
25, and the top of the curve is double the vanilla radius rather than triple.
The agreement test was asking for something the tool cannot produce. Requiring the whole
footprint to agree within 5 cm refused nearly every swing on ground that was visibly being
flattened, because SmoothTerrain eases from full effect at the centre to nothing at the rim -
a smoothed patch is a shallow dish, not a plateau. It now judges only the eight points nearest
the crosshair, which are the ones an earlier swing centred on and pulled all the way to its
target, takes their median, and defaults to a 0.25 m tolerance.
The hoe's piece table names no skill. So using it raises nothing and GetBuildStamina
skips its discount branch - there is no double dip here, unlike the hammer, and reach is the
only thing Crafting buys. It also means the reach is not self-earning, which is the same shape
as Skaft, where repairing buildings trains nothing either.
Verified in game, 20 September 2026
Continuing the flat holds a height across a working area. Swings metres apart all landed on 32,08-32,10 from crosshairs at 32,66, so over half a metre of drift removed per swing, with the eight nearest points agreeing to within 4-26mm against a 250mm tolerance.
discussHolding a height works in both directions. Standing 1,7m above the held number and 1,9m below it, every swing aimed at the held figure rather than at the player's feet. Toggle on and off both clean.
discussNon-terrain tools are untouched.
discusspiece_repairandwoodwallboth report no terrain op and the mod attaches nothing to them.
Known and open
The ward footprint has never refused anything in a test - there was no ward to refuse it.
discussA held height above about a metre away cannot be reached, and it stays that way. SmoothTerrain clamps its accumulated movement to one metre per point and only a level or raise operation banks that and frees the budget, so holding 32,08 while standing on 33,76 brings the ground down to roughly 32,76 and stops, short of the number the panel is showing. That is vanilla's clamp rather than anything here. Converting a held swing into a true level operation would remove the ceiling in two lines - decided against, because it would turn the hoe into a tool that sets ground to any height in one swing, and every mod in this suite is meant to be narrower than the thing it replaces. Raise ground first, then hold and flatten. Documented in the README so it does not read as a fault.
discussLeft Alt is confirmed double booked: mud_road_v2's piece sets both
discussm_groundPieceandm_allowAltGroundPlacement, which is exactly the conditionPlayer.UpdatePlacementGhostrequires before it readsAltPlace. In practice a tap captured 32,07 on a flat sitting at 32,08-32,10, so the single frame of alt placement does not appear to shift the reading. Left Alt stays as the default, on that evidence and because it is the key that was asked for;HoldKeyis configurable if the ghost ever misbehaves, and a server never takes a keybind over.
discussSmoothTerrainclamps its accumulated movement to one metre per point and only a level operation banks that and frees the budget, so flattening with the hoe is capped near a metre per point however the target is chosen. Whether that ceiling is the real obstacle in practice is untested.The appended reach travels to a Jafna owner and is invisible to a vanilla one, by design. Two players on very different Crafting levels working the same ground has not been watched.
discuss
Every setting · 12
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.jafna.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.
Jafna 2
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Enabled | Off leaves the plugin loaded and changing nothing - vanilla levelling, vanilla reach, no readout. Not "unloaded": a plugin cannot unload itself, and a switch that pretends otherwise is a lie somebody will debug. | true | server |
| Verbose | Write what each swing decided to BepInEx/LogOutput.log. Off unless something looks wrong; it is a line per swing. It also logs the levelling tool's piece table skill once per session, which is the only way to read that number - it is asset data and no decompiler or prefab rip can reach it. | false | server |
Levelling 4
| Setting | What it does | Default | Whose |
|---|---|---|---|
| ContinueFlat | The whole point of the mod. Vanilla levels every point under the tool to whatever height your crosshair happens to be resting on, so walking two steps moves the target and the overlap between two swings ends up at two heights. That is why a large yard comes out rippled however carefully you work. With this on, a swing that touches ground you have already levelled takes THAT height instead of your crosshair's, so flat spreads outward from wherever you started and keeps spreading across sessions. A swing touching nothing you levelled before behaves exactly like vanilla, which is how you start a new platform at a new height. | true | server |
| ContinueTolerance | How far apart, in metres, the already-levelled ground under one swing may be before the mod gives up and lets vanilla decide. This is the setting that stops two platforms at different heights being averaged into a ramp through the middle: stand where a 2m terrace meets a 4m one, the readings disagree by 2m, and the swing falls back to your crosshair so you stay in control. Raising it past about half a metre turns that safety off and starts inventing heights that were never on screen. | 0.25 | server |
| ContinueMinVertices | How many already-levelled grid points a swing must touch before it will adopt their height. Terrain is stored on a 1 metre grid, so this reads as "at least three square metres of existing flat". One is too few: a single stray point left over from an old op, or from the corner of something levelled last winter, would silently capture the swing and drag a new platform to a height you cannot see. | 3 | server |
| HoldKey | Press this while a levelling tool is out to hold the height under your crosshair, and press it again to let go. While a height is held every swing flattens toward that one number, wherever you stand and wherever you aim - so you can walk a whole yard flat from one reading instead of taking what is under your feet at each step. It also settles the two cases the mod cannot decide on its own: a higher platform beside you capturing swings you meant lower, and a swing crossing a zone boundary where each zone would otherwise choose for itself. Nothing is held across a logout, on purpose - coming back to a swing that moves ground toward a number you set yesterday, with nothing on screen having changed, is a worse trap than setting it again. NOTE: Left Alt is also vanilla's alt-placement key, which does have a meaning for terrain tools, so if the ghost starts behaving oddly while you use this, move it to a key of its own. Keybinds are never taken over by a server, so this one stays yours whatever the host runs. | LeftAlt | yours |
Reach 4
| Setting | What it does | Default | Whose |
|---|---|---|---|
| MinRadius | Levelling radius in metres at Crafting 0. Zero means the mod never makes the tool narrower or wider than vanilla at the bottom of the skill - the reach used is always the larger of this curve and the tool's own radius, so a new character gets exactly the hoe the game shipped. Raise it only if you want the reach handed over rather than earned. | 0 | server |
| MaxRadius | Levelling radius in metres once Crafting reaches FullLevel. The tool levels a square, so 6 is a 12x12 metre platform in one swing - a longhouse footprint and its doorstep. Every extra metre buys three things at once and only one of them is good: fewer swings, a wider strip of ground you can flatten inside somebody else's ward before the check stops you, and a bigger block of height data saved into the zone and pushed to everyone near it. Terrain does not heal, so this number is worth being stingy with. | 6 | server |
| FullLevel | The Crafting level at which the radius reaches MaxRadius. Above it nothing changes. Deliberately not 100, which costs roughly 20,300 crafts against about 5,700 for 60 - a reward nobody arrives at is a reward that does not exist. Skaft uses the same number for the same reason and they are meant to stay in step. | 60 | server |
| Curve | Exponent on the skill fraction: radius = min + (max-min) * (level/FullLevel)^Curve. 1.0 is a straight line, below 1 opens the reach earlier, above 1 hoards it for the top. Matches Skaft. | 0.8 | server |
Readout 1
| Setting | What it does | Default | Whose |
|---|---|---|---|
| ShowReadout | Put the numbers on screen while a levelling tool is out: the height under your crosshair, the height the swing will actually use, and whether that came from the crosshair or from flat ground the swing is continuing. Without it the mod is invisible and indistinguishable from the hoe behaving oddly, which is the complaint it was built to answer. | true | server |
Wards 1
| Setting | What it does | Default | Whose |
|---|---|---|---|
| RespectWardFootprint | Refuse a level swing whose footprint does not clear a ward you have no access to. Vanilla checks the single point under your crosshair and nothing else, so even the stock hoe can already shave ground out from under a neighbour's wall while the ghost stays blue and the ward never flashes. That is a small hole at 2 metres and a wide one the moment Crafting makes the tool bigger, which is why this setting exists and why it defaults on. It is enforced where you swing, not where the world is saved: terrain is applied by whichever client owns that zone and there is no server-side validation anywhere in the path, so this stops the mod and an honest player and cannot stop a hostile one. That was already true of vanilla and this does not make it worse. | true | server |
Discussion
Nothing said yet.
Sign in or make an account to join in.