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.
Jafna
Levelling with the hoe continues the flat ground it touches, and your Crafting decides how far it reaches.
| Date uploaded | a day ago |
| Version | 1.2.1 |
| Download link | Ezomic-Jafna-1.2.1.zip |
| Downloads | 106 |
| Dependency string | Ezomic-Jafna-1.2.1 |
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.2350README
Jafna
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.
- Low ground is raised with stone. When a swing wants the ground higher than the hoe can lift it, that swing lifts its whole circle straight to your height and your pack pays for what the hoe would not have done, at the rate the hoe's own Raise ground charges. It leaves a step at the edge of the circle until you swing next to it. Like Raise ground, it needs a workbench nearby.
- 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.
- Only your own swing is changed. Ground shaped by anything else, a location, another mod, a Devkit flatten or a player without Jafna, is shaped exactly as vanilla shapes it.
- A ward you cannot use blocks the whole swing, not just its centre.
- The build panel shows the numbers, in thirteen fixed rows that never change count or order: what the swing does to the ground, the height it will use and where that height came from, and what raising the low ground will cost and whether stone fill is on. See The build panel below.
- 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 operations shaped.
The build panel
The numbers go in the hoe's build tooltip, under the piece's own description, and the box they make is always the same size. A tooltip sizes itself to its text, so a readout that grew a warning over a bad swing and dropped a price over a good one resized the box as the crosshair moved, and at working speed that cannot be read. So every state writes the same rows, in the same places, and a row with nothing to say holds a dash:
All clear the one warning slot, red when it has something to say
GROUND
Raise up to: 1.20m the most the ground under the swing comes up
Lower up to: 0.80m and the most it goes down
Flattens 6.0m across (Crafting 52)
HEIGHT
Crosshair: 5.40m
This swing: 5.00m
Taken from: flat ground or your crosshair, or HOLDING until the key you pressed
COST
Stone: carry 20, need 14 Stone
Workbench: in range
Stone fill: on, J turns off
The warning slot is replaced in place, never added to, and shows one thing in this order: a ward
you cannot use, ground past the eight metre limit, no workbench near, then too little stone. The
rows below it say the rest. Each row ends with the value that moves as you look around, so
nothing after it shifts. No row is longer than the box, so none wraps onto a second line, and a
row that would be (several kinds of item in a price, a longer language) is cut with .. rather
than allowed to. ShowReadout turns all of it off.
The panel is rebuilt only when something it shows has changed (the aim to the nearest centimetre, the reach, the price, the pack, the stone fill switch, AutoRaise, the language), not on every frame, and the item names are looked up in the language once.
jafnareadout is a development command, in the console, and it ships in the build on purpose so
the scenarios can run against it. It only reads: it prints how many lines the panel drew, whether
any wrapped or was cut, and whether the rows hold dashes. It is not a cheat and needs no
devcommands. You have no reason to type it.
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's Taken from row says HOLDING until LeftAlt for as long as it lasts. That wording
is deliberate: the single mistake this feature can cause is forgetting it is on, and a row
that tells you how to stop cannot be read as decoration. A key name longer than 14 characters is
cut to 14 on that row so the row stays inside the box.
The key counts when you let go of it, and only when you pressed it on its own. Press another key or a mouse button while it is down, or let the game window lose focus before you let go, and nothing happens. That is for Alt+Tab. Switching windows starts with Alt going down while the game still has the focus, and the first version, which acted the moment the key went down, pinned a height whenever you tabbed out with a levelling tool in your hands, and it stayed on when you came back. The height held is still taken when you press, not when you let go.
Hold a height above the ground and swinging raises it all the way, for stone, as long as the height is within eight metres of where the world made the ground. The next section has the price. Hold one more than about a metre below the ground and the ground still stops short: hold 32m, stand on 34m, and it comes down to about 33m and no further. The hoe only digs a metre, or two on ground it raised before, and digging is the pickaxe's job.
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.
Raising low ground, and what it costs
The hoe's Level ground moves each point a metre at most. It eases the point toward the height the swing is aiming at, keeps a running total, and stops once that total reaches a metre. Only raising ground clears the total again. So a swing aimed well above the ground used to bring it up a metre and then do nothing, however often you swung, while the panel kept showing a height the ground never reached.
Now a swing over ground further below your height than the hoe's metre can reach lifts its whole circle straight to your height, and you pay for it in stone. Hold 34m while standing on 32m and swing, and all the ground inside the swing that is below 34m ends at 34m, in that one swing, with the stone taken from your pack. Ground above your height is eased down by the hoe for free, as it always was.
That leaves a step at the edge of the circle, as tall as the ground was low there. Your next swing beside it that needs stone continues the flat and takes the step away. A step of less than a metre is within what the hoe does for free, so an ordinary swing beside it eases it into the hoe's usual slope instead. That is the trade, and it was chosen on purpose. The hoe eases ground toward your height rather than setting it: fully at the middle of a swing, less further out, and not at all at its edge. The other way to spend the stone was to follow that easing, finishing only the middle in one swing and creeping outward over the next few. Lifting the whole circle at once is faster, and the step is the price of it.
A paid swing takes more stone than one that followed the easing, because it does at once what that took several swings to do, but the ground costs the same in the end. Every point comes up its free metre first and you pay for the rest of the way, however many swings it takes to get there. Over ground two metres below your height, a swing at the hoe's own reach takes about 7 Stone, and one 12 metres across about 27.
A swing where the hoe's free metre is enough for every point in it is left exactly as the hoe does it, easing and all, and costs nothing. The hoe gets all of that ground there on its own over a few swings, and charging for it would make ordinary flattening cost stone. The flat top comes with paying, not with the hoe.
A point is left out of the fill in two cases, and then it gets only the hoe's own free, eased movement and costs nothing. The game never lets ground sit more than eight metres above where the world made it, so ground further below your height than that cannot ever get there, however much stone you carry. And when your stone runs out partway, the ground it did not reach stays where the hoe puts it, which is covered further down.
Neither is left out in silence, because silence is how this started: a height on the panel and
ground that stops short of it with nothing to say why. Ground too far below turns the panel's
top row red before you swing, Past 8m of the original ground, and the swing puts
Too far below to raise in the middle of the screen. Running out of stone has its
own panel line and message, below.
The price is the hoe's own. Jafna finds the Raise ground entry on the hoe, takes what it costs, and works out how much ground one Raise ground swing adds to flat ground. Filling costs stone at that rate per cubic metre. Both numbers come from the running game and go in the log once a session, so if another mod changes what Raise ground costs, filling follows it.
So does where you may do it. Raising with stone needs a workbench nearby, because Raise ground
does: its entry names the workbench, and the game will not let you swing it further from one than
the workbench's build range, 20 metres for a bench with no extensions, measured from where you
stand. Filling reads the station off the same entry and follows the same rule. Out of range, a
swing that would need stone is the hoe's alone: the ground comes up its free metre, eased the
hoe's way, and no stone is taken. The panel's top row says Filling needs a Workbench nearby
and its Workbench row says none near, and the swing puts Raising needs a Workbench nearby in the
middle of the screen. A world with NoWorkbench set lifts the rule and so does the nocost command,
both as they do for Raise ground. NoBuildCost does not: Raise ground is free there and still
wants the workbench.
On a slope Raise ground adds less for the same stone, so there filling is cheaper than doing it by hand. Alternating Raise ground and Level ground by hand can still beat it. Every Raise ground gives the next Level ground swing its free metre back, and a fill does not. If it did, every swing would get a free metre and flattening would raise ground for nothing.
Only the part the hoe could never do is charged. Every point gets the metre the hoe would have given it for free, less whatever earlier swings already used of it, and you pay for the rest of the way. A point less than three centimetres past its free metre is not raised past it and costs nothing, so going over ground that is already flat does not eat stone. Stone leaves your pack whole. When a swing needs part of a stone, a whole one is taken and the rest is kept toward your next swing until you log out. If the entry you swing costs stone of its own, the fill leaves that much in your pack for it.
When you run short, the swing spends your stone on the middle of the circle first and works outward, lifting each point all the way to your height, until the stone runs out. The ground further out gets only the hoe's own easing and costs nothing, and the middle of the screen says you ran out. So a short swing leaves a flat patch in the middle with a step round it. The middle comes first because that is where you aimed, and a patch that grows out from it leaves one clean edge to carry on from. The first version spread the stone evenly instead, which brought every point up by the same fraction of what it needed and left not even the middle at your height.
The build panel shows what a swing will cost before you take it, and that is what the swing
takes. When you carry enough it is the price of the whole circle. When you do not, the Stone row
shows what you carry and what all of it would cost in red, and the top row says
Short of stone, fills only the middle. When you cannot pay for even the middle, the top row says
Not enough stone to fill any of it, and that swing takes nothing.
A world with NoBuildCost set raises for free. The nocost command lifts the limit but still takes any stone you carry, which is what vanilla's Raise ground does as well.
AutoRaise in the config turns this off and gives the one metre ceiling back. On a server the
host decides it.
Turning the stone off for yourself
AutoRaise is the host's rule and a file edit. For the player there is a switch of their own,
StoneFill, flipped in game with J (StoneFillKey) while a levelling tool is out. Off, every
swing of yours is the hoe's alone: its free metre, no stone taken, nothing lifted past it, and
the panel stops quoting a price. The panel's last row, under Cost, says which it is, Stone fill: on, J turns off, so a swing that took no stone is never a surprise. The key does nothing with the
hoe put away or while chat or the console has the keyboard, and it tells you what it did in the
top left of the screen.
The host's AutoRaise stays the upper bound. Off there means off for everybody and the switch
cannot turn it back on, which the panel says: Stone fill: off, this server has it off. On
there means each player may still turn it off for themselves, and the switch is yours alone: it
is never taken over by a server and another player's switch changes nothing for you. It is kept in
the cfg, so it is the same next session. A held height is not, because a held height is a number
you set for a reason you may forget, and this is a preference the panel shows every time.
J is a plain letter with no job in the game's own bindings and none in the other mods here. It is
not Left Alt, which is Jafna's HoldKey, and not Left Shift, which is vanilla's alt placement.
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, ward and raising 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.AutoRaiseis raising low ground for stone. On by default.StoneFillis your own switch for that, andStoneFillKeyflips it in game. Personal, so a server never sets either.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.
The flags a continued flat reads are already on that client's machine. The reach is not, 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.
That appended note is also how the owner knows the operation is a swing at all. By the time a terrain operation reaches the owner, a hoe swing looks exactly like a location shaping its own ground, another mod's operation or a Devkit flatten. So your client adds the note to every swing you take, at the hoe's own width too, and to nothing else, and the owner reshapes only what carries it. Everything else it applies as vanilla, a swing from a player without Jafna included. A client on 1.0.0 added the note only to a swing wider than the hoe's own or aimed at a held height, so an owner on this version no longer continues the flat under that client's other swings.
Raising ground for stone splits the same way. Your client works out whether the swing needs stone and how far out from the middle of the swing your pack pays for, and sends that distance along with the reach. The owner lifts every low point inside it to your height, tells your client what it raised, and your client takes the stone. A distance rather than an amount of stone, so that a swing across a zone line stops at the same place on both sides of it, and the owner of each zone takes your client's word that the swing needs stone rather than deciding from its own half, so a paid swing has one flat top and not a flat half beside an eased one. Paying afterwards is on purpose: an owner without this version raises nothing and sends no bill, so you pay nothing for ground that never moved.
Whether you are near a workbench is also your client's answer, since only your client knows where you stand. When you are not, your client sends no distance at all, so the owner is never asked to raise anything for that swing and no bill can come back.
When somebody else owns the zone, the stone for a swing leaves your pack once their machine answers. Two quick swings can therefore be billed for more stone than you held. The difference is owed, and it comes out of the stone you carry at your next fill.
Your view of that ground can also be a swing behind. A quick second swing may still see ground the first one already raised, so it raises less of the patch than your stone would pay for and says you ran short while you still have stone. It can also take a swing for a paid one when the owner's ground is already close enough for the hoe alone; the owner then lifts only what it finds still low, and bills only that. Either way you pay for ground that really moved, and the next swing finishes the patch.
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 or raise 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. Jafna leaves the easing alone on every swing the cap would not stop short. It changes the
height all those swings are easing toward, so they converge on one answer instead of following
your crosshair. Going up, a swing over ground the cap would stop short is finished for stone:
every point of the circle below the height comes up what is left of its free metre, counted where
vanilla counts it, and the rest of the way goes into the same permanent height Raise ground writes
to. So a swing never gets a fresh free metre out of being filled.
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
Nothing has been run with a second player: the reach and the bill travelling between two machines, and an owner leaving a swing from a player without Jafna as vanilla. The ward footprint has never refused anything in a test either, because there was no ward to refuse it.
Raising low ground for stone went through a scenario in singleplayer on 29 September 2026. That covers a paid swing's whole circle landing on the height with a step at its edge, the stone it takes and each point's free metre coming off the bill, the middle coming up first when the stone runs short, and the workbench rule and its two messages. Not watched yet: the panel's price before a swing, ground past the eight metre limit being left alone and said so, and leftover stone carrying over to the next swing.
The stone switch was built and compiled and has not been run in game. Its scenario
(jafna-stone-switch.txt) has not been run, and nothing has pressed the key.
The hold key ignoring Alt+Tab was checked by hand the same day. A chord pressed with it spoiling the tap was not.
The same scenario checks that a Devkit flatten beside a flat at another height levels to its own height, and it passes. Nothing checks a held height or a Crafting reach staying off an operation that is not a swing.
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.
CHANGELOG
Changelog
1.2.1 - 8 October 2026
The hoe's panel is readable again. The game gives the build panel's text a box 61 pixels high and shrinks the text to fit it, so the thirteen rows added in 1.2.0 came out a few pixels tall. The box now grows downward to fit its text, the text is a fixed size, and the panel is eight lines: Ground and Height sit side by side, and the workbench and the stone fill switch share a line (Fill: on (J)). The game's own one-line description of the hoe piece is hidden while the readout is up, and the faint headings are lighter. Nothing it says has changed, and the box still never changes size from one state to the next.
1.2.0 - 8 October 2026
A switch for the stone fill, yours alone. AutoRaise is the host's rule, so on a server you could not turn the stone off for yourself. There is now StoneFill, flipped in game with J (StoneFillKey) while a levelling tool is out. Off, a swing is the hoe's alone: its free metre, no stone taken, no price on the panel. The key says what it did in the top left. The host's AutoRaise stays the upper bound, so off there is off for everybody, and the panel says so. The switch is personal: Core never syncs it, and it is kept in your cfg between sessions. jafna stone on|off does the same from the console, for the scenario.
The hoe's tooltip stays one size. The build panel used to grow and shrink as you swept the crosshair, because lines came and went (a warning, a price, the 8 m note) and some were long enough to wrap. It is now thirteen rows in every state, in three groups under a single warning slot: Ground (how far the ground comes up and goes down, how wide the swing is), Height (the crosshair, the height the swing uses, where that came from) and Cost (stone, the workbench, whether stone fill is on). A row with nothing to say holds a dash, and the warning slot reads All clear until the one thing that is wrong replaces it. No row is longer than 40 characters, so nothing wraps. Raise up to and Lower up to are new rows.
Three wordings changed to fit: the stone row reads carry 20, need 14 Stone, the short-of-stone message moved into the warning slot as Short of stone, fills only the middle, and the held height reads HOLDING until LeftAlt. A key name over 14 characters is cut to 14 on that row. The panel is rebuilt only when something it shows changes, and scrolling to another entry of the same hoe no longer shows the old entry's numbers for a frame.
Two development console commands ship with it, jafnareadout and the stone switch one. They only read or flip your own setting and are not cheats. Two Devkit scenarios cover this, jafna-stone-switch and jafna-readout-one-size. Both compile; neither has been played in game yet.
1.1.0 - 30 September 2026
Low ground is raised, and paid for in stone. This reverses the call made on 20 September to keep the one metre ceiling. The hoe's flattening moves a point a metre at most and then stops, so a swing aimed well above the ground never got there. Now the rest is raised, and your pack pays for it at the rate of the hoe's own Raise ground: what that entry costs, divided by the ground one Raise ground swing adds to flat ground. Both numbers are read from the running game and written to the log once. Alternating Raise ground and Level ground by hand can still be cheaper, because every Raise ground gives Level ground its free metre back and a fill does not.
A paid swing lifts its whole circle to your height at once, and leaves a step at the edge of the circle until the next swing beside it that needs stone. A step under a metre is eased away by ordinary swings instead. That shape was picked over letting the stone follow the hoe's easing, which would finish only the middle of a swing and creep outward over the next few: the flat top is faster, and the step is its price. A paid swing takes more stone than one that followed the easing, because it does the work of several at once, but the ground costs the same in the end. Over ground two metres low that is about 7 Stone a swing at the hoe's own reach and about 27 at 12 metres across.
Only the part the hoe could never do is charged. Every point comes up the metre the hoe would have
given it for free, less what earlier swings used of it, and you pay for the rest of the way. A swing
where every point is within that metre of your height is one the hoe can finish on its own, and it
is left exactly as vanilla has it and costs nothing, so the flat top comes with paying and ordinary
flattening is untouched. A point less than three centimetres past its free metre is not charged
for, so going over flat ground does not cost stone. Stone comes out whole and the remainder carries
over to the next swing until you log out. NoBuildCost makes it free, and nocost behaves the way it
does for vanilla's Raise ground. It is on by default as AutoRaise, and the host decides it on a
server.
Each point comes all the way up or not at all, and you pay only for what came up. Short of stone, a swing lifts the middle of the circle first and works outward as far as the stone goes, and says so. The ground it did not reach gets the hoe's own easing and nothing else, so a short swing leaves a flat patch in its middle with a step round it. The game never lets ground sit more than eight metres above where the world made it, so ground further below the height than that is left alone too, rather than raised partway and charged for a height it can never reach. The build panel says so before the swing, and the swing says "Too far below to raise".
The build panel says what a swing will cost before you take it, and that is what it takes. Short of stone it says what you carry, what this swing fills and takes for it, and what all of it would cost, or that it fills none of it when your stone does not reach even the middle.
Raising with stone needs a workbench nearby, the rule vanilla's Raise ground follows. The
station is read off the same Raise ground entry as the price, so on the hoe it is the workbench,
within its build range of where you stand. Out of range, a swing that would need stone is left to
the hoe, its free metre and its easing, takes no stone, and says Raising needs a Workbench nearby, and the build panel says the same in place of the price. NoWorkbench and nocost lift it
and NoBuildCost does not, as for Raise ground.
Alt+Tab no longer pins a height. The hold key now counts when you let go of it, and only when you pressed it on its own with the game in front the whole time. It used to act the moment it went down, and switching windows starts with Left Alt going down while the game still has the focus, so tabbing out with a levelling tool in your hands pinned a height and left it on for the rest of the session. The first scenario run caught it holding a height nobody had asked for. The height held is still taken when you press, not when you let go.
Only your own swing is reshaped. Continuing the flat, the reach Crafting buys and a held height used to apply to any flattening operation, not only to the hoe in your hands: a location shaping its own ground, another mod's operation, a Devkit flatten, and on a zone you own, a swing from a player without Jafna. A scenario log caught a Devkit flatten levelled 0.2 m below its own target, to a flat its circle happened to touch. Now all of them come through exactly as vanilla has them, by the rule raising with stone already followed: the operation has to be your swing, with the entry it came from selected. Your client marks its own swing with the note Jafna already appends, now on every swing and not only a wide or held one, and the zone owner reshapes only what carries that note. A client on 1.0.0 added the note only to a wide or held swing, so an owner on this version no longer continues the flat under that client's other swings. The auto-raise scenario has a new check for it, and no longer lets Devkit level the ground before it starts.
In multiplayer the client that owns the zone raises the ground and sends your client the bill, and your client pays it out of your pack. A zone owner without this version raises nothing and bills nothing, so you are never charged for ground that did not move. How far out your stone reaches rides at the end of the message Jafna already appends, where 1.0.0 stops reading. Whether you stand near a workbench is your client's answer too, and a swing it turns down never asks the owner to raise anything.
Lowering has not changed. Ground well above the target still stops after about a metre, or two where it was raised before.
Verified in game, 29 September 2026
Singleplayer, a fresh test world. The auto-raise scenario passed all 168 of its steps, and it covers this much:
- Digging a mound down further than the hoe's metre takes no stone, and a swing with nothing to raise costs nothing and says nothing.
- With enough stone one swing lifts its whole circle to the height. Ground halfway to the edge is on the height, ground just outside the circle is where it was, and there is a step between.
- With no stone the ground comes up the hoe's own metre and stops, and the screen says "Not enough Stone". With too little, all of it goes, the middle comes up to the height, and nothing is left owing.
- Out of a workbench's range a swing that would be paid takes no stone and comes up the free metre only, and both the build panel and the middle of the screen say a Workbench is needed.
- A Devkit flatten beside a flat at another height levels to its own height, so an operation that is not your swing is left as vanilla has it.
Tapping Left Alt was checked by hand the same day: it holds a height, and Alt+Tab no longer does.
Known and open
- Nothing here has run with a second player. The bill travelling between two machines, and an owner leaving a swing from a player without Jafna as vanilla, are argued from the source only.
- Not watched in a game: the price the build panel shows before a swing, ground past the eight metre limit being left alone and the message for it, leftover stone carrying over to the next swing, NoBuildCost, nocost and NoWorkbench, and a chord pressed with Left Alt spoiling the tap.
1.0.0 - 20 September 2026
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
Singleplayer, one world, Crafting 52, reach 5,4m against the hoe's own 3,0m.
- 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.
- Holding 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.
- Non-terrain tools are untouched.
piece_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.
- A 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.
- Left Alt is confirmed double booked: mud_road_v2's piece sets both
m_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. SmoothTerrainclamps 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.