Vaettir
Plant an ancient seed, feed it greydwarf blood, and a forest spirit answers. Build it a home and it sorts your chests.
- Features
- The ritual
- The stowing post
- Farming
- Installation
- Configuration
- Multiplayer
- Compatibility
- Troubleshooting
- Bug reports
- Discord
- Upgrading from Stow
- Design notes
- Building
- Licence
- Part of Longhouse
Plant an ancient seed in the Black Forest and it grows on greydwarf deaths instead of on a timer. When it opens, a forest spirit rises out of it and folds itself into a heartwood you carry away and build into a stowing post: a shallow container that hands its contents to the chests around it, sorted by rules you set on each chest.
The same DLL also carries two mods that used to ship separately: Stow, which is the post and the chest sorting, and Furrow, which is the cultivator's planting grid and area harvest. Wild plant transplanting and a bonemeal recipe are here too.
Features
- Ancient sapling. Planted with the cultivator, fed by greydwarf kills within 24m, and it calls greydwarfs to itself in waves while a player is nearby. It has 500 health and can be destroyed.
- Forest spirit and heartwood. One spirit per sapling, one heartwood per spirit.
- Stowing post. A 6x2 container on the hammer's Furniture tab. Drop things in, close it, and a spirit flies them to the chests that asked for them.
- Chest rules. A
Holds…button in every chest window. Chests hold groups (ore, fuel, seeds, building materials) or single items, and can refuse things. - Planting grid. From Farming 10 the cultivator's ghost snaps to a lattice so hand-placed beds come out in rows. A ring shows whether a sapling will actually have room.
- Area harvest. From Farming 15, Shift+E on a ripe crop picks its neighbours too, reaching further as Farming rises. Plain E still picks one.
- Transplanting. Dig up wild berry bushes, thistle, dandelion and mushrooms with the cultivator and carry them somewhere else. Gated on Farming, one plant at a time, and the world's plant count never changes.
- Bonemeal. Two bone fragments and an entrail make five at the workbench. A fed crop yields three times when picked and trains Farming.
- Multi-seed sowing. Sow a row or a circle per click, scaled by Farming. Off by default.
The ritual
- Kill greydwarf brutes and shamans until one drops an ancient seed. Vanilla loot, and nothing here changes the drop.
- Plant it with the cultivator, in the Black Forest, at least 5m inside the biome and outside anybody's base. The refusal message says which of the two stopped you.
- Kill greydwarfs within 24m of it. Greydwarf 1 point, shaman 3, brute 4, greyling 0, and 50 points opens it. Only the nearest sapling is fed by a kill.
- You do not have to go looking for them. A planted seed calls greydwarfs in from 25 to 40m out, 2 to 5 at a time, every 20 seconds falling to every 6 as it fills. Everyone within 48m is told once that the forest is enraged. It only calls while a player is within 48m, and it stops calling if a base grows around it.
- Defend it. 500 health is about ten hits from a brute, and the seed is not refunded if it dies. It says when something is hitting it and when it is gone.
- When it opens a forest spirit rises out of it. Press use once and it folds itself into a heartwood.
- Build a stowing post: 20 fine wood, 20 iron nails and 1 heartwood, hammer, Furniture tab. Taking the post down gives the heartwood back.
The sapling's hover text carries its stage and its exact count, so rooting ( 18 / 50 ) tells
you what is left. It looks the same the whole way through, so the hover text is the only thing
that reports progress. It is pinned on your own map while it stands, and the pin comes off when
it opens or dies.
The stowing post
The post is a real container, 12 slots, and it empties when you close its window rather than
continuously, so two half-stacks dropped in can merge first. A spirit then carries the contents
out 10 items per trip, flying in an arc over whatever is in the way, and re-checks every three
seconds until the post is clear. Turn CarrierEnabled off and the post moves everything the
instant you close it. The sorting is identical either way.
Anything with no home stays in the post. Its hover text separates the two cases: waiting
means a home exists and the spirit has not got there yet, with nowhere to go means no chest
in range wants it.
Telling a chest what it holds
Chest windows get a Holds… button under the game's own Stack all. The post has no button of
its own because it distributes outward, so the rules live on the chests. The panel offers
groups and single items, a search box for naming an exact item, and a Learn from contents
button that reads the chest's current contents into a rule. Clicking a group cycles it through
ignored, holds and refused, and shift-clicking a search result refuses that item instead of
holding it, so "ore, but never tin" is two presses. A chest with a rule says so in gold in its
hover text.
The rule is stored on the chest itself, so it saves with the world, travels to everyone on a server without any syncing of ours, and disappears when the chest is torn down.
Groups are derived from the game's own data at runtime, not from a list in the mod:
| Group | Members |
|---|---|
| Ore | whatever any smelter accepts |
| Bars & ingots | whatever any smelter produces |
| Fuel | whatever burns in a smelter, kiln, cooking station or fireplace |
| Wood | whatever a charcoal kiln eats |
| Raw food | whatever a cooking station accepts |
| Cooked food | anything that fills you up |
| Mead & potions | whatever a fermenter takes or produces |
| Seeds & crops | whatever the cultivator's pieces cost |
| Building materials | whatever the hammer's pieces cost |
| Crafting materials | item type Material |
| Weapons & armour | equippable gear, tools and torches |
| Ammo, Trophies, Fish, Valuables | by item type |
A mod that adds black metal ore or a new crop lands in the right group without this mod knowing it exists. Groups that end up empty are not drawn.
How an item picks its chest
Every item asks which chest wants it most, rather than every chest being asked what it wants.
The order is: a chest naming that exact item, then one holding a group it belongs to, then one
set to "Anything else", then a chest with no rule at all that already holds some of that item
(MatchContents, which is what makes the post useful before you have configured anything).
Ties go to the nearer chest, and a chest you have given a rule never falls into that last tier.
The post skips chests that are out of range, warded against you, set to anything but Public, open by anyone, on a cart or a ship, and other stowing posts.
Farming
Grid. With the cultivator out and a plant selected, from Farming 10, the ghost snaps to a
lattice spaced by the plant's own grow radius. The lattice is drawn on the ground before you
plant. The mouse wheel turns it in 22.5 degree steps, GridPinKey (numpad period) anchors it
where you are standing instead of on the nearest plant of the same kind, and holding the game's
AltPlace key (Shift unless you rebound it) plants free of the grid entirely. One seed per press
throughout: the skill unlock is alignment, not quantity.
A ring at the plant's grow radius shows green when it would have room and red when it would not. The game itself does not check this at placement time. It checks ten seconds later, and a sapling with no room turns unhealthy or deletes itself with the seed already spent.
Area harvest. Shift+E on a ripe crop from Farming 15, reaching 2m at 15 and 8m at 80, up to
50 crops per press. Only crops are taken, meaning the grown stage of something plantable, read
off the game rather than listed in the mod. Wild berries, mushrooms, thistle and dandelion are
never touched. By default only the crop you clicked is taken, so a mixed bed comes off a kind at
a time. Every neighbour goes through vanilla's own Interact, so skill gain, the level bonus
roll, drop scaling and ownership are identical to picking each by hand.
Transplanting. Select Transplant on the cultivator, where it sits beside the crops, and click a wild plant. It comes up into your arms, no item and no inventory slot. While carrying you can walk but not run, jump, attack, use the hotbar or equip anything. Click open ground where that kind grows to plant it, or press R to set it down where you stand regardless of biome. Dying or logging out plants it at your feet. The same grown bush goes back down, picked-empty because its berries dropped into your hands at the dig, and it regrows on vanilla's own timer.
Each plant has a Farming level and a biome list:
| Plant | Farming | Grows in |
|---|---|---|
| Dandelion | 5 | Meadows |
| Raspberry bush | 10 | Meadows, Black Forest |
| Mushrooms | 15 | Meadows, Black Forest |
| Blueberry bush | 25 | Black Forest |
| Thistle | 35 | Black Forest, Swamp |
| Yellow mushrooms | 45 | Black Forest |
| Cloudberry bush | 60 | Plains |
| Blue mushrooms | 75 | Mountain |
Yellow mushrooms are a burial chamber crop and Plant refuses anything under a roof, so they
can only be farmed in the forest above the crypt.
Bonemeal. BoneFragments:2, Entrails:1 at the workbench makes 5. Use it on a growing crop
(crops only, never trees) and it marks the plant: picking the crop it becomes yields three times
and grants 5 Farming skill, once, and the mark is spent. A fed plant says "Fertilised" on hover
and a second bonemeal cannot stack the bonus. It does not speed growth up.
Sowing. Sowing/Enabled is false by default. Turned on, one click sows a row or circle of
seeds, 1 at Farming 0 rising to 20 at Farming 80 for crops and 5 for trees, spaced by each
plant's own grow radius. Numpad plus and minus change the count and numpad star cycles the shape.
Installation
- Install BepInEx for Valheim, version 5.4.2350. This is BepInEx 5, not 6.
- Put the
Vaettirfolder from the release intoBepInEx/plugins/.
The mod is one DLL plus the .obj, .col and .png files beside it, which are read at
runtime. They have to stay in the same folder together. There is no asset bundle.
Longhouse Core is an optional soft dependency. It is not needed in single player, and on a server it does the version check described under Multiplayer.
Built against Valheim 1.0.7, Unity 6000.0.75, BepInEx 5.4.23.5 and Harmony 2.9. Version 1.5.0 and later require Valheim 1.0; 1.4.2 and earlier do not run on it.
Configuration
One file, BepInEx/config/ezomic.valheim.vaettir.cfg, written on first run. Every entry carries
its reasoning as a comment in the file.
BepInEx writes every entry to disk on first run and the saved value beats any new default in code, so changing a default in a later version does nothing on a machine that has already run the mod. Edit the cfg.
[Sapling]
| Key | Default | Effect |
|---|---|---|
SaplingName |
Ancient sapling | What the planted seed is called |
SaplingCost |
AncientSeed:1 |
What planting costs. Not refunded |
SaplingDonor |
sapling_carrot | Vanilla piece it is cloned from |
SaplingScale |
1 | Scale of the planted piece |
SaplingIcon |
grove_sapling_icon.png | Cultivator icon, read from beside the DLL |
SaplingHealth |
500 | Damage it takes before it is destroyed |
NeedsCultivated |
false | Whether it must go in tilled soil |
PinSaplings |
true | Put a marker on your own map while it stands |
PinIcon |
Icon3 | Which vanilla map icon to use |
BloodNeeded |
50 | Points of greydwarf death needed to open it |
FeedRange |
24 | How close a kill must be to count, in metres |
FeedWeights |
Greydwarf:1,Greydwarf_Elite:4,Greydwarf_Shaman:3,Greyling:0 |
What each death is worth. Anything unlisted is worth nothing |
Messages |
true | Corner counter each time a kill feeds a sapling |
SaplingBiomes |
BlackForest | Biomes that will take a seed. Blank for anywhere |
BiomeMargin |
5 | Metres inside the biome required, checked on a ring |
BiomeRefusal |
Too far from its own wood to grow. | Message when refused for biome |
NotInBases |
true | Refuse planting inside a base, and stop calling if one grows around it |
BaseMargin |
8 | Extra metres on top of the game's own base radius |
BaseRefusal |
Too close to a hearth. This belongs in the wild. | Message when refused for a base |
Beckon |
true | Whether a planted seed draws greydwarfs to itself |
BeckonRoster |
Greydwarf:10,Greydwarf_Shaman:3,Greydwarf_Elite:2 |
What it calls, as prefab:weight |
BeckonInterval |
20-6 | Seconds between waves, unfed to nearly open. Two is the floor |
BeckonPack |
2-5 | How many arrive together, unfed to nearly open |
BeckonDistance |
25-40 | Metres out they appear before walking in. Keep under about 70 |
BeckonRange |
48 | How close a player must be for it to call at all |
BeckonArea |
96 | Neighbourhood width that BeckonMaxTotal counts inside |
BeckonMaxNear |
10 | Most it will have standing around it at once |
BeckonMaxTotal |
24 | Most it will have alive in the wider area |
BeckonMessage |
The forest is enraged. | Said centre screen to everyone in range. Blank for none |
[Spirit] and [Heartwood]
| Key | Default | Effect |
|---|---|---|
SpiritName |
Forest spirit | What it is called when you look at it |
SpiritScale |
1 | Scale of the whole thing |
SpiritRise |
0.4 | How far above the sapling it appears |
MoteCount |
6 | Beads per ring |
RingCount |
2 | How many circles of beads |
ShowHoop |
false | Draw the torus the beads ride on |
PartingEffect |
vfx_ghost_death,vfx_HealthUpgrade,vfx_DraugrSpawn |
Vanilla effect played where it stood when it goes. First name that resolves wins. Blank for none |
GlowDonors |
fire_pit,piece_walltorch,bonfire,Ember,piece_groundtorch_green,guard_stone |
Prefabs to lift the glowing material from, best first |
HeartwoodName |
Heartwood | What the material is called |
HeartwoodDonor |
SurtlingCore | Vanilla item it is cloned from |
HeartwoodStack |
10 | How many fit in a slot |
HeartwoodGiven |
1 | How many a spirit folds itself into |
[Post], [Sorting] and [Carrier]
| Key | Default | Effect |
|---|---|---|
PostEnabled |
true | Put the post in the hammer's menu. The prefab is registered either way, so turning it off never deletes a post already built |
PostName |
Stowing post | Name of the piece and its window |
PostCost |
FineWood:20,IronNails:20 |
Build cost, before the heartwood is added |
PostWidth / PostHeight |
6 / 2 | Slots across and down |
CoupleToStow |
true | Add the heartwood to the post's cost. Off puts it back to wood and nails |
StowPostCost |
GroveHeartwood:1 |
What is added to that cost. An ingredient already there is raised, not counted twice |
PostDonor |
piece_chest_wood | Vanilla piece the post is cloned from |
PostModelFile |
stow_post_canopy.obj | Mesh beside the DLL. Its .col and _icon.png are picked up automatically |
PostScale |
1 | Scale of the whole piece |
PostLightRange |
7 | How far the heartwood in the post throws light |
PostLightIntensity |
1.15 | Brightness of that light |
PostFlareScale |
0.75 | Size of the halo on the post's heartwood |
PostGlowDonors |
piece_dvergr_lantern,guard_stone,piece_walltorch,fire_pit |
Prefabs to lift the post's glowing recess from |
LookForProps |
(blank) | Comma-separated words. Logs every loaded prop whose name contains one |
Range |
12 | How far a chest may be from the post, measured through walls |
MatchContents |
true | Let a chest with no rule take more of what it already holds |
Messages (Sorting) |
true | Corner message summarising what went where |
CarrierEnabled |
true | Fly items out one stack at a time instead of moving everything on close |
Couriers |
1 | How many spirits a post flies at once |
CarrierSpeed |
2.6 | Metres per second in the air |
CarrierPause |
0.5 | Seconds hovering at each end |
ItemsPerTrip |
10 | Items carried per trip. 0 carries the whole stack |
CarrierCruise |
1.1 | How high above the higher end it arcs |
CarrierScale |
0.62 | Scale of the carrying spirit. 1 is a full-size one |
FlareDonors |
piece_dvergr_lantern,guard_stone,piece_walltorch,fire_pit |
Prefabs to lift the halo off, best first |
[Furrow], [Harvest], [Sowing], [Crops], [Trees]
| Key | Default | Effect |
|---|---|---|
GridEnabled |
true | Snap the cultivator's ghost to a lattice |
GridLevel |
10 | Farming level that unlocks the grid |
GridCell |
0 | Metres between plants. 0 uses each plant's own grow radius |
GridAngle |
0 | Which way the rows run, in degrees |
GridPreview |
true | Draw the lattice on the ground under the ghost |
GridPreviewRings |
3 | How many cells the drawing reaches in each direction |
RoomPreview |
true | Ring at the plant's grow radius, green or red |
PickArea |
true | Shift+E on a ripe crop harvests its neighbours |
PickLevel |
15 | Farming level that unlocks the area harvest |
PickAtLevel |
80 | Farming level at which it reaches PickRadius |
PickRadiusMin |
2 | Metres reached at PickLevel |
PickRadius |
8 | Metres reached at PickAtLevel, and the most it ever reaches |
PickMax |
50 | Most crops one press may take |
PickSameCropOnly |
true | Take only the crop you clicked |
Enabled (Sowing) |
false | Sow more than one seed per click |
Shape |
Row | Starting shape: Row, Circle or Grid |
RowAcrossFacing |
true | Row runs left to right across your facing |
Spacing |
1 | Multiplier on the gap between sown seeds. Below 1 drops seeds |
Crops/MaxSeeds |
20 | Most seeds a click can sow. 1 switches crops off |
Crops/MaxAtLevel |
80 | Farming level at which MaxSeeds is reached |
Trees/MaxSeeds |
5 | Most saplings a click can sow |
Trees/MaxAtLevel |
80 | Farming level at which the tree maximum is reached |
[Thicket] and [Plants]
| Key | Default | Effect |
|---|---|---|
Enabled |
true | Register the wild plants and the Transplant entry |
Donor |
sapling_carrot | Vanilla plant each seedling prefab is cloned from |
Scale |
1 | Scale of the seedling in the ground |
SpacingScale |
1 | Multiplier on how much clear ground each seedling demands |
DigReach |
6 | Metres a wild plant can be dug from, measured from you |
DigAssist |
12 | Degrees off the crosshair a plant may sit and still be dug. 0 turns it off |
SayTheLevel |
true | Write the required Farming level into the menu entry and the refusal |
Verbose (Thicket) |
false | Log every row as it is parsed and every prefab not found |
[Plants] holds one row per plant, formatted
Farming level | cost | biomes | seconds to take root (min-max). The level and the biome list
are live. The cost and grow time only configure the seedling prefabs, which are still
registered for anything planted before 1.2.0 but are never planted new, since a dug plant now
goes straight back down grown.
[Bonemeal]
| Key | Default | Effect |
|---|---|---|
BonemealName |
Bonemeal | What the item is called |
BonemealCost |
BoneFragments:2,Entrails:1 |
What one craft costs |
BonemealYield |
5 | How many one craft produces |
BonemealStation |
piece_workbench | Where it is crafted. Blank makes it craftable by hand |
BonemealStack |
50 | How many fit in a slot |
BonemealHarvest |
3 | Multiplier on what a fertilised crop yields when picked. 1 drops the bonus |
BonemealSkillGain |
5 | Farming skill granted when a fertilised crop is picked |
BonemealRadius |
0 | Feed every plant within this many metres in the same press. Off at 0 |
BonemealAdvance |
0.34 | Growth advance. Not read by the code. Its comment describes a growth speed-up that was cut before release |
BonemealDonor |
BarleyFlour | Vanilla item it is cloned from |
BonemealModel |
grove_bonemeal.obj | Mesh beside the DLL. Blank keeps the donor's model |
BonemealTint |
(blank) | Colour multiplied into the sack, as r,g,b |
BonemealIcon |
grove_bonemeal_icon.png | Inventory picture, read from beside the DLL |
[Keys]
Every key is read through the game's own input layer, so gamepads work and a key typed into chat, the console or a text box is ignored.
| Key | Default | Effect |
|---|---|---|
GridFreeKey |
None | Hold to plant free of the grid. At None this is the game's AltPlace key, Shift unless rebound |
GridPinKey |
KeypadPeriod | Pin the lattice where the ghost is standing. Press again to unpin |
GridTurnKey |
None | Optional key that turns the grid by GridTurnStep. Setting it to Mouse2 stops middle click removing pieces while a plant is selected |
GridTurnScroll |
true | Turn the grid with the mouse wheel while planting |
GridTurnStep |
22.5 | Degrees per press of GridTurnKey |
IncreaseKey / DecreaseKey |
KeypadPlus / KeypadMinus | Sow one more or one fewer seed per click |
ShapeKey |
KeypadMultiply | Cycle the sowing shape |
KeyStow |
None | Empty your pack into the chests around you, skipping the post |
KeyConfigure |
None | Look at a chest and press to open its rules panel |
KeepHotbar |
true | KeyStow only: leave the hotbar row alone |
NeverStow |
Hammer,Hoe,Cultivator |
KeyStow only: prefab names that never leave your pack |
[Diagnostics]
| Key | Default | Effect |
|---|---|---|
TestMode |
false | Drops what a sapling needs to three greydwarfs. Announced in the log on every startup |
Verbose |
false | Log every feed, every sown position, and one line per chest the post skipped with the reason |
DumpMaterials |
false | Log every material on each glow donor with its shader |
LookForPrefabs |
(blank) | Comma-separated words. Logs every loaded prefab whose name contains one |
Multiplayer
Install it on the server and on every client. The sapling, the spirit, the heartwood and the post are registered prefabs, and the game discards any saved object whose prefab name does not resolve rather than erroring. A server without Vaettir silently destroys everything already standing, and so does a client that joins without it.
Longhouse Core is what turns that into a refused connection. It checks each Ezomic mod's version and build id when a client connects and the server rejects mismatches. Without Core nothing checks. In single player none of this applies.
Core also applies the host's config values on connected clients, in memory, without writing the
client's own config file. Thirty-three entries are per-player and never imposed by the host: the
grid and sowing gestures and the grid angle, your map pins, the biome and base refusal messages,
the sorting summary, the spirit's and post's local rendering (MoteCount, RingCount,
ShowHoop, PartingEffect, CarrierScale, Thicket/Scale, the post light and flare settings
and their donor lists), SayTheLevel, KeepHotbar, NeverStow, and every verbose or
diagnostic toggle. Costs, ranges, health, rosters, caps and shared prefab facts stay the host's
decision, and so do three that look personal: BeckonMessage and the sapling's Messages are
read on the machine that owns the sapling and decide what other players see, and SpiritScale
is baked into a networked object's transform.
Saplings, spirits and posts are each driven by whoever owns them. Map pins are local to you and saved in your own profile.
Compatibility
- BepInEx 5 only.
- Item groups are read off the game at runtime, so a mod that adds an ore, a crop or a building material lands in the right group with no work.
- The area harvest rides
Pickable.Interact'saltargument, which vanilla never reads. Another mod that uses Shift+E on pickables will clash with it. SetPickAreato false. - Setting
GridTurnKeyto Mouse2 suppresses middle-click removal while the cultivator has a plant selected. It is None by default, so removal is vanilla. - A patch group that fails to apply costs one feature and names it in the log. The prefabs are declared before any patching, so a failure there cannot destroy anything built.
Troubleshooting
The post says it has nowhere to go, or the spirit never sets off. Three separate bugs caused this and all three are fixed in 1.5.1 through 1.5.3. Update first. The last one was a fixed collider buffer that silently truncated the search, which meant the post could not see any chest in a base with more than about 256 colliders within range. It passed in a test world and failed in a real base.
If it persists, check the chest: it must be Public rather than private, within Range (12m by
default), not open by anybody, not warded against you, and not on a cart or ship. Turn
Diagnostics/Verbose on and the log names every chest it skipped and why, then counts the
usable ones.
Items multiplied in a chest. Fixed in 1.5.1. It affected partial takes, meaning any stack
larger than ItemsPerTrip, and only once trips were landing at all.
A config change did nothing. BepInEx wrote the file on first run and the saved value wins.
Edit BepInEx/config/ezomic.valheim.vaettir.cfg rather than expecting a new default to apply.
The sapling refuses to plant. Black Forest only by default, at least 5m inside the biome, and outside the area any workbench or fire radiates. The message says which of the two it was. A ward refuses it like any other piece.
A sapling stopped calling greydwarfs. It goes quiet while no player is within 48m, and while it sits inside a base. Kills still feed it either way.
The Transplant entry is missing from the cultivator. The build menu only shows known pieces
and that list is rebuilt when you learn a recipe or a station, so a piece registered seconds
after you spawned can stay hidden. The mod nudges that update itself. If the log says it could
not read Player.m_knownRecipes, learning anything new will bring it back.
A sapling needs only three greydwarfs. TestMode is on. It warns on every startup.
A vanilla mechanic broke and LogOutput.log is clean. Gameplay exceptions land in
AppData\LocalLow\IronGate\Valheim\Player.log, not in the BepInEx log.
Bug reports
The Discord is the fastest route and the right one if you are not sure whether what you are seeing is a bug. Issues on the repo work too and suit anything long.
Attach BepInEx\LogOutput.log and say whether you were on a server or in single player. For
anything about the post, turn Diagnostics/Verbose on first and include the lines naming the
chests it skipped. For a vanilla mechanic breaking, include
AppData\LocalLow\IronGate\Valheim\Player.log as well. Your config file helps when a number
looks wrong.
Discord
discord.gg/hJzAVaZ5wb is where updates, support, bug reports and compatibility questions go.
There's also a small EU server running the pack if you want somewhere to play: hard combat difficulty, resources at 1x, everything else vanilla, no application and no activity requirements. Details are in the Discord.
Upgrading from Stow
Stow shipped as a separate mod until 1.0.0 and is part of this one now. The post keeps its
internal name, so every post already standing survives. Its settings moved into this mod's
config file under [Post], [Sorting], [Carrier] and [Keys]. If you had tuned
ezomic.valheim.stow.cfg, copy those values across once and delete it, and delete
BepInEx/plugins/Stow if you are upgrading by hand. Two copies loaded at once is the thing
that will go wrong.
Stow's and Furrow's history is in archive/, one git bundle each. See archive/README.md.
Design notes
Why the seed counts kills instead of ticking a clock, why the heartwood is a home rather than a heart, why the sorting rules live on the chest, and why the spirit carries things instead of teleporting them: DESIGN.md.
Building
Target is net462 against the game's own managed assemblies, no NuGet. ValheimDir defaults to
the usual Steam path and ProfileDir to the repo's own testprofile\, both overridable:
dotnet build Vaettir.csproj -p:ProfileDir=<your BepInEx profile>
The build copies the DLL and assets\*.obj, *.col and *.png into
<ProfileDir>\BepInEx\plugins\Vaettir. tools/ holds the Blender scripts that produce every
model, including the rejected ones.
Licence
MIT. Robbin Thijssen (Thijssen Software), GitHub Ezomic. Published on Thunderstore.
Part of Longhouse
Vaettir is in the Longhouse pack, which pins exact versions of the Ezomic mods and installs in one click. You do not need the pack to use this, and nothing here behaves differently on its own.
Changelog
1.5.5 in Longhouse
Fixed
Transplant is back in the cultivator's menu. Valheim 1.0 rebuilt the build menu, and the new one draws repair-type entries as a special button beside the tag list instead of in the piece grid, then hides that whole column for a tool using the simplified menu, which the cultivator does. Transplant wore that type so its click would land on the world rather than place a piece, so it vanished from the menu while staying registered, unlocked and in the table - nothing in the log said a word. It is now an ordinary entry beside the crops, taking the menu category and usage tags of whatever else is in that table, and the click is caught in
discussPlayer.TryPlacePiecerather thanPlayer.Repair. Digging, carrying and replanting are unchanged, and it still costs no resources, stamina, durability or building skill.
1.5.4
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.5.3
The bug the previous three releases were chasing. None of them was it.
Fixed
The post could not see the chests in a real base.
CollectChestssearched with a fixedCollider[256]and a singlePhysics.OverlapSphereNonAlloccall, with no layer mask. That is a silent truncation: the method fills the buffer you hand it, returns how many it wrote, and never reports that there were more. Every wall, beam, floor, roof tile and terrain collider within range competed for those 256 slots.In a test world that is a handful of objects and the chests are always found. Measured in a real base: over 1,024 colliders within 12m of one post, and all 24 of its chests invisible. The post reported "0 usable chest(s)" with a configured chest two metres away.
It fails exactly where the mod is used and passes exactly where it is tested, which is why it survived three releases and four reports from the same player. The buffer doubles until the result fits now, so nothing can be missed, and it says so when it grows.
Not fixed with a layer mask, though that would be faster: a mask hardcodes an assumption about which layers a container may sit on - chests, ships, carts, anything another mod adds - and a wrong mask fails the same silent way this did.
discuss
1.5.2
The stowing post still refused to send its spirit anywhere after 1.5.1, reported by the same player who found the original bug. Same root cause, one caller further on.
Fixed
The post would not dispatch a single trip, and said nothing. 1.5.1 stopped trusting
Container.IsInUse()for destination chests, because the rawm_inUsefield is only ever written by the peer that owns the ZNetView and strands the moment ownership moves.CarryRun.Availablewas still asking that same question about the post itself, so the chests became reachable and the post never set off - the fix could not reach the person it was written for.It is worse on a post than on a chest, because you have to open a post to put anything in it. That is the act that sets the flag, so losing ownership before the window closes strands it permanently - and building a new post does not help, because using it recreates the state. Both callers go through one helper now.
discussThe post claimed "nowhere to go" about things that had somewhere to go. The hover text counted
NrOfItems()- everything the post held - and called that number homeless. A post between runs holding one perfectly placeable stack said exactly what a post holding one nothing wanted says. It counts what it claims now, and says "waiting" for the rest.That sentence is what both reports quoted, and it was never evidence about chests. It sent three rounds of searching at real but unrelated bugs.
discuss
1.5.1
Two long-standing stowing-post bugs, both older than Valheim 1.0, and the reason neither had been found: nothing in the run said a word about either.
Fixed
A chest you had once opened was never used again.
Container.IsInUse()returns the rawm_inUsefield, butContainer.SetInUseonly assigns that field when the caller owns the ZNetView. So on a client that does not own the chest the value is wrong in both directions, and worst of all a chest this client opened and then lost ownership of never receives itsSetInUse(false)- the guard drops it - leaving it "occupied" for the rest of the session.Depositor.Usablerejected it there, before the chest's rule was ever read, and the post reported having nowhere to go while a correctly configured chest stood in range.It is worse than a stale read, because the state seals itself in.
UpdateUseVisualis the only code that ever writesZDOVars.s_inUse, it is reached only fromCheckForChangesthroughLoad(), andLoad()returns false outright whilem_inUseis true. So the flag blocks the one path that would clear it - on the instance and in the world file both - and stops that chest reloading its contents from the ZDO into the bargain.m_inUseis no longer consulted at all. When we do not own the chest,ZDOVars.s_inUseoff the ZDO carries the shared answer, which is what vanilla's ownUpdateUseVisualreads in its non-owner branch. When we do own it, nobody else can have it open - opening transfers ownership, becauseContainer.RPC_RequestOpenends inSetOwner(uid)- so the only honest question is whether we have it open, andInventoryGuianswers that through public API with no private field to go stale.Both halves matter and they cover different people. A player on a shared server hits the non-owner path; a player in singleplayer owns every ZDO and only ever hits the owner one.
discussThe spirit flew back and forth without ever delivering. A trip carried an
ItemDrop.ItemDatareference, andContainerrebuilds its entire inventory from the ZDO on every revision change - which a stow run causes constantly, because each deposit changes a container.Inventory.ContainsItemis reference equality on aList, so the reference was orphaned in flight almost every time.Movetreated that as handled and returned silently, so the spirit landed, moved nothing, and set off again forever.The item is re-found on arrival by shared name, quality, variant and world level - the same fields
Inventory.FindFreeStackItemuses to decide two stacks may merge, so anything matched is something the destination would have stacked with the original anyway.This one was hidden behind the first: with the chest excluded, no trip was ever dispatched.
discussA stow could duplicate what it moved.
Depositor.Deposittook the trip's share out of the source by writingitem.m_stackdirectly, and only calledInventory.RemoveItemonce the stack reached zero. A raw field write is invisible to the inventory:Inventory.Changednever fires, soContainer.OnContainerChangednever runs and the post's ZDO is never saved. The destination's side does save -AddItemcallsChanged- so the post reloaded its old contents from a stale ZDO, the stack came back, and the next trip moved it again. Measured at 21 coal in the post producing 140 in the chest.Only a partial take was affected, which is every trip of a stack larger than
discussItemsPerTrip, and it needs a trip to actually land - so it was invisible for as long as the two bugs above kept trips from landing at all. The removal goes throughInventory.RemoveItem(item, amount)now, and the source is checked for the item before anything is added anywhere, because an add that succeeds beside a removal that fails is the definition of this bug.
Changed
The run explains itself now. A homeless report lists, per item, every usable chest, the rule it carries and whether it wanted the item, refused it, or was full.
discussMove's three silent exits each say which one fired. Previously the log could show "2 usable chest(s)" and then nothing at all, which is the state both bugs above lived in.
1.5.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
A patch failure can no longer delete what you built. The four prefabs were declared after thirteen
discussPatchAllcalls, so any one of those throwing - one renamed method after a game update, which is ordinary - took the declarations with it. That is not a lost feature: the game discards any saved object whose prefab name does not resolve, so every Heartwood, sapling, spirit and stow post in the world went with it. They are declared first now, and each patch group is applied on its own so one failure costs one feature and says which.Runs on Valheim 1.0.
discussHoverablegained a member, andInventory.AddItemgained a required flag - the spirit's heartwood is handed over as legitimately earned, which is what it is.
1.4.2
Added
Hold Shift to plant free of the grid. A Longhouse player asked to switch the grid off sometimes, to put one plant where it wanted to be - which is a gesture, not a setting. So it is a held key rather than a toggle or a cfg edit: the lattice, its preview, the scroll wheel and middle mouse all return to vanilla while it is down, and come back when the hand opens. The key is the game's own AltPlace - Shift unless rebound, which is already vanilla's "place free of snapping" gesture while building, so the habit transfers whole and follows a rebind in the game's controls for free.
discussGridFreeKeyin config replaces it for anyone whose Shift is overloaded.
Fixed
Bonemeal threw on every use.
discussBonemealRadiuswas read each time bonemeal was consumed on a plant, but it was never bound to the config file, so the read was a NullReferenceException on the one path the item exists for. The plant still advanced, because that happens first, and the exception landed in Player.log rather than the BepInEx log - which is why it read as working. It is now bound, off by default at 0; set a radius in metres to feed the neighbours in the same press. The radius could never actually be switched on before this, since no cfg row existed to set.
Changed
Every config entry is now settled as either the host's or yours. The 1.4.1 grid-angle fix closed one instance of a class, so this release classified all 137 entries against Longhouse Core's sync. Thirty-three are per-player by nature and now say so through
discussSuite.Local: the grid and sowing gestures, your map pins, the refusal messages on your own screen, the spirit's and post's local renders,KeepHotbarandNeverStow, and every Verbose and diagnostics toggle. Every gameplay number - costs, ranges, health, rosters, caps - stays host-decided on purpose, and so does every shared prefab fact. Three that look personal stay synced deliberately, and the code records which and why.
1.4.1
Fixed
The grid would not turn on a server, while turning perfectly in singleplayer - which is the shape of bug that sends you looking everywhere except at the cause.
GridAngleis a float, and Longhouse Core's config sync exempts onlyKeyCodeandKeyboardShortcutfrom being decided by the host. So on a server the host's angle was imposed on the client, and Core's watch put an imposed setting straight back the moment anything wrote it: every scroll notch set the angle and had it reverted in the same frame. Nothing was wrong with the wheel, the input or the grid.The angle is now declared personal through Core's own
Suite.Local, which is written for exactly this and names a UI scale or a colour as the same kind of setting. The host's value is never applied rather than applied and then fought.The actual rules stay host-decided on purpose -
discussGridCell,GridLevel,GridEnabledand the harvest numbers are all things a server is entitled to settle for everyone. Which way one player's rows happen to run is not.
1.4.0
Added
Shift+E on a ripe crop harvests the bed, reaching further as Farming rises: two metres at level 15, growing smoothly to eight by level 80. Plain E is untouched and still picks exactly one - an area harvest with no way to opt out is a mod deciding when you wanted the whole bed. Shift+E costs nothing to take:
Pickable.Interactalready accepts analtargument and never once reads it.What it takes is deliberately narrow. Only crops - the grown stage of something plantable - and that set is read off the game rather than listed in the mod, by walking every prefab carrying a
Plantand collecting itsm_grownPrefabs. So a crop another mod adds is included the day it is added, and no wild berry, mushroom, thistle or dandelion is ever touched: those are Thicket's, and clearing a forest from one keypress is a different and far more generous mod than this one. By default it also takes only the crop you actually clicked, so a mixed bed is harvested a kind at a time rather than stripped in one press.Every neighbour goes through vanilla's own
discussInteract, one call each, rather than reaching intoRPC_Pick- which keeps the skill gain, the level bonus roll, the effects, the drop scaling and the ownership identical to picking each by hand. An area harvest the server disagreed with about who owns what is the kind of bug that only appears with other people watching.PickMaxcaps a single press so a dense field cannot empty an inventory onto the ground.
1.3.1
Three reports against 1.3.0's grid, all from one session of actually using it.
Fixed
The grid did not exist until the second plant. Its origin could only ever be a plant that already stood there, so the first plant of every bed went down blind - nothing drawn, nothing to turn - and wherever it landed silently fixed the phase and the angle for every plant after it. The one plant that most needed aiming was the only one with no help. The bed now starts under the cursor: the lattice is drawn before anything is planted, and the first seed lands where it says it will.
discussThe turn key was never received. Furrow read its keys with
discussUnityEngine.Input.GetKeyDown, and Valheim runs on the new Input System - ZInput routes a KeyCode to the mouse, keyboard or pad itself, and the legacy class does not see the middle mouse button at all. The key was bound, the config held the right value, and nothing happened. All of Furrow's keys go through ZInput now, which also repairs Sowing's shape, increase and decrease keys - broken the same way, and never reported only because Sowing is off by default.
Changed
The mouse wheel turns the grid, and it is the gesture rather than an option. While planting the wheel is very nearly free: a crop carries
discussm_randomInitBuildRotation, so the game re-rolls the ghost's facing after every single placement and the yaw you scrolled to is discarded as the seed goes in. Spending the same wheel on the rows spends it on the one thing that survives the click - and scrolling back turns back, which a key that only stepped one way could not.
discussGridTurnKeynow defaults to None, so middle click is vanilla's remove again. Set it to Mouse2 to have a key as well, and only then is removal suppressed while a plant is selected.The first grid drawn in a session names the gesture that is actually bound, so it cannot tell you to press something that does nothing.
discuss
1.3.0
Four reports, and the answer to each one.
Fixed
"Sometimes it says there is nothing to dig up." Transplant took the first
discussPickableout ofPhysics.RaycastAlland answered with it - and RaycastAll returns its hits in ARBITRARY order, not nearest first. So whichever pickable the array happened to list first spoke for the plant you were actually aiming at, and when that one was not on the roster the dig was refused with a bush filling your screen. Nothing about the failure depended on where you pointed, which is exactly why it read as intermittent. Hits are sorted now, a roster plant always beats a stranger however close, and a refusal names what it found ("Mushroom cannot be dug up") instead of claiming there is nothing there. A clean miss falls back to a cone, because wild plants are ragged and several carry a collider narrower than they look.
Added
The grid can be lined up with what you have built. All three properties of the lattice were the mod's and are now yours:
discussGridCellin absolute metres,GridAnglefor a building that does not sit square to the world, andGridPinKey, which anchors the lattice where you stand rather than on the nearest plant.You can see the grid before you plant in it. The rows are drawn on the ground under the ghost, from the same anchor, spacing and angle the snap itself uses, so the drawing cannot disagree with where the plant lands. It follows the terrain, and turns live with the grid.
discussThe grid turns on the middle mouse button. 22.5 degrees a press - vanilla's own building step, so anything you built square is reachable - wrapping at 90, where a square lattice repeats. Tying it to the ghost's own rotation was the obvious choice and is wrong: crops carry
discussm_randomInitBuildRotation, so the game re-rolls that yaw after every placement and the grid would jump each time a seed went in. While the cultivator is up with a plant selected, middle click turns the grid and does NOT remove the piece under your cursor; removal is untouched everywhere else, and rebinding the key restores it.A ring says whether a sapling will actually have room. Green when it would grow, red when it would not, at the plant's own radius. The game never checks this when you place:
discussPlant.UpdateHealthskips the test entirely for the first ten seconds after planting, so a sapling with no room looks healthy, then quietly turns unhealthy - or deletes itself, if it carriesm_destroyIfCantGrow. The seed is spent before anything says no, and the loss shows up later somewhere you are no longer standing. The ring runs vanilla's own test, and shows whatever the grid is doing.The stowing post can say why it is doing nothing. Its hover text carries the count of items with nowhere to go, a corner message fires once when nothing in the post has a home, and
discussDiagnostics/Verboselogs one line per nearby chest naming why it was skipped - privacy, range, a ward, an open window, a cart or a ship.
Note
Nothing about how anything looks has changed. A repo-wide rework of texture density is finished and held back deliberately: it has not been seen in game, and two choices about the stowing post are still open.
1.2.1
Fixed
Grid rows no longer drift out of line while planting. Two causes, both only visible on a server where fields have had time to grow. The grid re-chose its anchor every frame (the nearest plant of the same kind), so a nearby free-placed plant could re-seat the whole lattice mid-row; and a grown crop is a different prefab from its sapling, so replanting a half-harvested field found no anchor at all and every new row started its own grid. The anchor is now held for the whole bed - one bed, one grid - and grown crops anchor exactly like the saplings they stand in place of.
discuss
1.2.0
Four features, every one reshaped in play before it shipped.
Thicket: move wild plants
Select Transplant on the cultivator and click a wild berry bush, thistle, dandelion or mushroom patch: it comes up roots-and-all INTO YOUR ARMS - no item, no inventory - riding the tool's tined end while you walk it home. Walking is the whole verb set: running, jumping, attacking, the hotbar, equipping and every ordinary interaction wait until the plant is down. Click open ground where its kind grows (the biome gate refuses elsewhere, keeping the carry), press R to set it down anywhere regardless, and the SAME plant stands there - picked-empty, its berries having dropped at the dig, regrowing on vanilla's own timer. Dying or logging out plants it at your feet: conservation does not take an exit as an excuse. The Farming ladder gates digging per plant, and the world's plant count only ever stays the same.
Bonemeal, without the bone mill
a lathe-turned tied sack in flat painted colours matching its icon.
discuss
The planting grid, from Farming 10
The cultivator's ghost snaps onto a lattice anchored to the nearest plant of the same kind, spaced by the plant's own grow radius - so beds come out in rows and columns you place yourself, one seed per press, exactly as vanilla plants. The first plant of a bed goes wherever you like and anchors it; no kin nearby, no snap. (Furrow's multi-sow machinery exists behind a config flag, off: one press planting a square was built and struck the day it was met.)
Housekeeping
1.1.0 was published with its version constants still reading 1.0.0; the gate never noticed because both ends ran the same bytes. This release re-aligns the numbers.
1.1.0
The sapling half. Four things, and the first of them is the one that matters.
The seed calls the forest to it
A planted sapling now draws greydwarfs to itself, and calls harder the closer it is to opening. Without this it was entirely passive, and the quest it actually set was "go and find a place greydwarfs already walk through, then stand in it" - a scouting problem rather than a defending one, and the wrong half of what the piece is for. Now the place you chose is the thing that matters, and what it summons is what feeds it: a seed planted in an empty meadow is slow rather than impossible, and one planted beside a real camp is still faster, because the camp counts too.
discussIt ramps, and it is a raid rather than wildlife. The interval falls from 20 seconds at an unfed seed to 6 at one about to open, so the loudest part of the fight is the end of it. A constant rate is a wave you learn to stand in; a rising one can be heard without looking at anything. 90 and 30 were the first numbers and they were far too polite - one greydwarf every minute and a half is something you deal with between other jobs.
discussRidden on vanilla's own
discussSpawnArea, which is the component a greydwarf nest is made of. That buys the near and total caps, the floor-finding, the spawn effect, and - the part that matters most - its own guards: owner only, inside the active area, with a player in range. Nothing happens while you are asleep, which was the sapling's first principle and is the one thing a spawner could most easily have broken.They arrive from a distance and run in rather than appearing around the seed. Found in play: they were materialising on top of it. Widening the radius does not fix that, because vanilla's FindSpawnPoint draws its distance from Random.Range(0, radius) - uniform across a disc, so most points land near the middle however wide it is. A prefix replaces that search with one that draws from a band, 35 to 60 metres by default, making the same two ZoneSystem checks in the same order so nothing lands inside a rock. Every other SpawnArea in the game runs vanilla's own method untouched.
discussGetting them to actually come is a second thing. SetPatrolSpawnPoint is off, so they do not treat the trees they appeared in as home, and a sweep every two seconds calls SetHuntPlayer on everything from the roster within reach - which is what a vanilla raid does and means "stop wandering, go and find someone". They hunt the player rather than the sapling: there is no vanilla "attack this object" to ride, the player is standing at the sapling anyway, and it puts the raid on the person holding the ground instead of on the thing with 500 health.
discussIt says so. "The forest is enraged." goes to everyone within BeckonRange, centre screen, once per sapling per load - fired from the first wave actually landing rather than from planting, so a sapling that can find nowhere to spawn never announces a siege that is not coming. Everyone nearby rather than whoever planted it, because it is a warning about a place and on that frame there is nothing on screen to account for the noise. The text is a config line and blank turns it off.
discussThe first wave leaves immediately. Vanilla counts its spawn timer up from zero on a two-second repeat and fires when it exceeds the interval, so an unfed seed produced nothing at all for 22 seconds and then the wave still had to walk in - half a minute of silence after planting, which reads as the mod not working. The timer now starts full, so the first wave goes out on the next tick. It does the same on every later load, and since the timer only advances with a player in range, walking back to a half-fed sapling restarts the siege as you arrive rather than after another silent interval.
discussThe band came in from 35-60m to 25-40m with it, so the first wave is on you in roughly fifteen seconds rather than forty. Still far enough to be out of sight in forest.
discussThey arrive in waves, from one side. Vanilla's spawner produces exactly one creature per interval, which is a queue rather than a raid - a greydwarf, a wait, another greydwarf, and nothing that has to be handled as a group. A wave is 2 at an unfed seed rising to 5 at one about to open, and the whole wave comes out of the trees within 40 degrees of one bearing so it can be turned to face. The extra members go through the game's own SpawnOne, so MaxNear and MaxTotal police themselves and a wave that would breach them simply comes up short.
discussA sapling now costs 50 greydwarf deaths, not 30. Thirty was chosen when the sapling was passive and thirty was roughly one raid happening to arrive. It does not wait for a raid any more, it makes one, so the number is the length of a fight you started rather than the odds of one finding you. Ten of them around you at a time, twenty-four alive in the area.
discussThe trigger range is 48m rather than vanilla's 256m. A nest filling a forest you are nowhere near is one thing; a sapling quietly getting itself killed by what it summoned while you are two zones away is another.
discussSix standing around it at once, sixteen alive in the area. Deliberately more than the sapling survives being ignored for - it has 500 health and about ten brute hits in it - which is the trade the whole feature makes: the forest comes to you instead of you going out to find it, and the price is having to hold the ground.
discussAll of it is off with one setting, and every number above is config.
discuss
Black Forest only
A seed refuses to go in anywhere but the Black Forest, and refuses the last five metres before the edge of it too. It is a greydwarf ritual - what it calls and what feeds it both live there - and one that works in the meadows makes the biome a backdrop rather than the reason.
discussThe margin is checked on a ring of eight points as well as under the cursor, so the whole circle has to be inside. Planting one step past the treeline and then summoning the forest would put half the fight in the meadow, and a boundary is where a raid is least interesting.
discussBoth the biome list and the margin are config, and the refusal says which of the two reasons it was.
discuss
It will not go in anybody's base
A sapling cannot be planted inside a base, and one already standing goes quiet if a base grows around it. This is the price of the seed calling: passive, one planted in someone else's home was rude; summoning waves of greydwarfs at it is a weapon, and a dozen around a stranger's longhouse is the obvious grief on a public server.
discussA ward already refused it and always did - the sapling is an ordinary piece, so PrivateArea turns it down like anything else. The gap was unwarded bases, which is most of them.
discussFilled with the game's own EffectArea.PlayerBase, which is what a workbench or fire radiates and the same test vanilla uses to keep creatures from spawning in your house. So the counter-play to a sapling planted next to you is to put a workbench down rather than to fight it, and "is this someone's home" stays the game's question rather than a guess of ours.
discussAny base, including your own. Working out whose it is means reading Piece.m_creator off whatever is nearby, which is more code for a worse answer - it would still stop you at a friend's base in co-op - and a wilderness ritual has no business in your own hall either.
discussThe refusal says which reason. Vanilla would show "invalid placement", which is true and useless to somebody standing in their own garden.
discussClient-side, honestly. A modded client could ignore it; what makes it stick on a server is Core's version gate.
discuss
Everyone defending it can see the count
Fixed: only whoever landed the killing blow saw the counter.
discussCharacter.OnDeathruns on the client that owns the creature and nowhere else, and the message went toPlayer.m_localPlayer- so with two players clearing greydwarfs around one sapling, each of them saw roughly half the kills register and neither could tell whether the other's were counting at all. They always were; only the message was missing. It now goes to every player within the sapling's own feed range, which needs no networking of ours becausePlayer.Messagealready RPCs to a player this client does not own.
A marker on the map
A planted sapling puts a pin on your map, and takes it off again when it opens or is destroyed. This is the one piece in the mod you are meant to walk away from, and a seed in bare ground is not findable from fifty metres away - losing one to "I know it was around here" costs the same ancient seed as losing it to a brute.
discussClient-side and per player, saved in your own profile like a pin you placed by hand. Nothing about it is networked and a server needs to know nothing about it.
discussThe pin comes off by reconciling against the world - a pin whose zone is loaded with no sapling under it is stale - rather than from the sapling's own OnDestroy. Found in play: the pins never went away. OnDestroy fires on a destroyed sapling and an unloaded one alike, and the test meant to tell them apart asked ZDOMan whether the ZDO was gone, which it never is on that frame - DestroyZDO only queues the uid on m_destroySendList and the ZDO leaves m_objectsByID some frames later. Both endings read as "merely unloaded". Asking whether a sapling is standing there needs no guess, covers every ending including one another player removed, and clears the pins the first version stranded.
discuss
The spirit's parting has an effect again
The parting effect shipped blank in 1.0 because the name it wanted was a guess about the game and the honest answer was "not confirmed". It is now a list walked in order -
discussvfx_ghost_death, then two fallbacks - and the first name that resolves is used, so the wrong ones cost nothing and are skipped in silence. Looked up through PropIndex as well as ZNetScene, because plenty of effect prefabs carry no ZNetView and are invisible to ZNetScene however loaded they are.
Not in this yet
The sapling's staged growth and the sowing of a rank of seeds are still on
discussv1.1-sowing, cut from 1.0 for their art. They are 1.2 now: the roadmap in the 1.0 entry below was renumbered when this release took the 1.1 slot, and that branch keeps its old name. Nothing here touches it, and merging is a separate job - it predates the 1.0 tidy-up and does not fast-forward.
1.0.0
First release. The number sat at 1.0 once before, early, and was taken back down when whole mods arrived on top of it without it moving. This is the version that earns it: one chain, finished, with everything that was not finished cut out and held on its own branch.
The chain, played end to end in a real world: an ancient seed planted, fed on greydwarf deaths through its growth, opened into a forest spirit, communed with, and the heartwood carried away and built into a stowing post that sorts the chests around it.
The sapling
Plant an ancient seed in the Black Forest. It does not grow on time, it grows on death, and only on the deaths of greydwarfs, and only within sight of it. About thirty of them and it opens, which is one raid if the forest comes to you.
discussGreydwarfs specifically, not "forest creatures". An early version used the game's own forest faction and swept up trolls, boars and the Elder, which turned clearing out a nest into killing anything anywhere near here. Greylings are on the list at zero, so it is visible that they were considered and refused.
discussIt can be destroyed, because being asked to fight for an hour beside something you cannot lose is not defending it. Around ten hits from a brute: a fight happening nearby is survivable, a mob left to work on it is not. It says when something is chewing on it and when it is gone, because losing an hour in silence is a mystery rather than a difficulty.
discussOne hand-built model, with its own icon so the cultivator stops offering a carrot. Built to the game's own measurements rather than to taste, because smoothness is most of what reads as modded and nothing else in the game at that size is round.
discussThe sapling does not change shape as it fills, and the hover text is what tells you how far along it is. Four staged models exist and work, and three of them were not good enough to ship, so the staging is held for 1.1 rather than released and apologised for.
discuss
The spirit and the heartwood
The sapling opens into a forest spirit. Light with no body, bobbing and pulsing, and waking as you approach. Two rings of beads turn around it in step with each other, with no visible hoop, so it reads as one thing turning rather than as a swarm.
discussPress use once and it folds itself into a piece of heartwood you carry away. It is a home rather than a heart: the spirit does not die and hand over a piece of itself.
discussBuild the heartwood somewhere and you have housed it.
discuss
The stowing post
One mod, not two shipped together. Stow arrived carrying its own
discuss[BepInPlugin], and leaving it there meant one DLL announcing two plugins in the log, writing two config files, registering with Core's version gate twice, and reporting two different version numbers. It reads as two mods in a trenchcoat, and it was one. The post's half is now driven by Vaettir's own plugin class: one GUID, one config file, one Harmony instance, one registration.Nothing you have built is affected. The piece keeps its internal name, so posts already standing survive.
discussIts settings moved into
discussezomic.valheim.vaettir.cfg, under[Post],[Sorting],[Carrier]and[Keys]. Anyone who had tunedezomic.valheim.stow.cfgcopies those values across once; nothing reads that file any more.Delete
discussBepInEx/plugins/Stowif you are upgrading by hand. Two copies loaded at once is the one thing that will go wrong.One spirit, not two. Each mod used to build its own from its own script and they had drifted into visibly different creatures. There is one now, and the carrier is that one at 0.62 scale so it is the size it has always been on screen. Set the scale to 1 for a full-size spirit.
discussOne setting still drops the heartwood from the recipe and puts the post back to wood and nails, for anyone who wants the sorting without the ritual.
discussA spirit carries ten items a trip, so a stack of fifty wood leaves the post in five trips rather than crossing the room in one. A big load looks like a big load.
discussItemsPerTripsets it and 0 restores the whole stack. This is the number the post upgrades are meant to raise.The carrying spirit and the one you commune with are the same creature, which took three passes to actually mean. The merge gave them one mesh; they still resolved their material through two different lookups against two different donor lists, and even once that was fixed only one of them glowed. The glow is a Light and an emission write, and the carrier had half of one, so the room around it lit up while its own mesh stayed flat. Colour, range, pulse depth and pulse period were each a second value too.
discussThe last of the seams from when these were two repos are gone. Icons and PropIndex each existed in two diverged copies, one per old namespace, and the comment justifying that said a copy was better than reaching into a sibling repo. There is no sibling repo.
discuss
Requires
Longhouse Core is optional. Without it nothing refuses a client that lacks this mod, and that matters: the sapling, the spirit, the heartwood and the post are registered pieces, and a client that cannot resolve one throws the object away rather than erroring. A server without Vaettir silently destroys everything already standing. Solo, none of that applies.
Known gaps
Dedicated servers are untested. Everything here has been exercised in single-player. Each spirit, sapling and post is driven by whoever owns it, so co-op should be fine, and should is doing real work in that sentence.
discussThe spirit's parting has no effect on it. The setting names a vanilla particle to play where it stood and ships blank, because a wrong name costs the moment its flourish rather than breaking anything. It is a flourish that is missing, not a step that fails.
discussThe sapling stirs while it grows, and that motion is new enough that it has had far less play than the rest of the chain.
discuss
Held for later releases
1.2 - sowing a rank of seeds by Farming skill, and the sapling's staged growth. The staging works and has been played; three of its four models were not good enough. It sits directly behind 1.1 rather than ahead of it because the staged models are the visible half of the same piece, and it is worth knowing how a sapling plays once it is worth standing next to before choosing how it should look while you do.
discuss1.3, a refinement pass - better animation throughout, and the post's own panel: fetch, tidy and presence. All three were built and none of them were proven, and with the three of them out the panel had nothing left in it, so it goes whole.
discuss1.4 - bonemeal, and the bone mill that grinds it.
discuss1.5 - upgrades for the stowing post. It starts out carrying ten items a trip and each upgrade raises that, so a post becomes something you improve rather than something you finish. It also gives the heartwood somewhere to go after the post is built.
discuss1.6 - an upgrade that houses a second spirit, so two stacks are in the air at once rather than one moving faster. Two of them working is worth watching; one of them hurrying is a number.
discussUnscheduled - the vaettr visitor and the market they were to stand in.
discuss
Late fixes
A dropped heartwood no longer falls through the floor. Stripping the donor's mesh took the collider with it, because on that donor both live on the same object, and an item with weight and nothing to rest on simply keeps going. Found by throwing one away.
discussThe spirit's parting effect setting was renamed before release rather than after, when it would have stranded the old key in other people's configs.
discuss
Archived history
Stow and Furrow were separate repos before this. Their history is in archive/, one git
bundle each, clonable with git clone archive/stow.bundle. See archive/README.md.
Every setting · 126
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.vaettir.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.
Bonemeal 13
| Setting | What it does | Default | Whose |
|---|---|---|---|
| BonemealName | What the item is called. | Bonemeal | server |
| BonemealDonor | The vanilla item it is cloned from - visual included. Barley flour is the game's own meal-in-a-sack, so bonemeal wears vanilla art instead of a hand-built shape that never earned its place; the name and icon are what tell them apart. | BarleyFlour | server |
| BonemealModel | The mesh, read from beside the dll: a lathe-built tied sack, the shape that finally earned the slot after six read as random parts and the borrowed flour sack read as flour. Blank keeps the donor's own model. | grove_bonemeal.obj | server |
| BonemealTint | Colour multiplied into the sack, as r,g,b - bone-ivory by default, so bonemeal and barley flour share vanilla's one sack the way the meads share one jug and still read apart at a glance. Blank leaves the donor's colour untouched. | (empty) | server |
| BonemealIcon | The inventory picture, read from beside the dll. Optional in the same way. | grove_bonemeal_icon.png | server |
| BonemealStack | How many fit in a slot. Generous, because the whole point is using several on a field and a stack of ten would mean a trip back to a chest mid-row. | 50 | server |
| BonemealCost | What one craft costs, as Item:Amount. Entrails rather than bone alone so it is a craft rather than a free conversion of the drop everybody is drowning in by the Black Forest. The bone mill stayed on its branch, so this recipe is the one source. An ingredient that does not resolve abandons the whole recipe rather than quietly cheapening it. | BoneFragments:2,Entrails:1 | server |
| BonemealYield | How many one craft produces. | 5 | server |
| BonemealStation | Where it is crafted. Blank, or a name that does not resolve, makes it craftable by hand. | piece_workbench | server |
| BonemealAdvance | How much of a plant's own growth one use brings forward, as a fraction. A third, so three uses mature anything. A share of the plant's time rather than a flat number of seconds, because grow times differ enormously and a modded crop should be advanced by a third of *its* season without this mod knowing it exists. It is applied by moving the planted moment earlier on the plant's own ZDO, which is why it survives a reload and why the growth is still the game's rather than a timer of ours. Set it to 1 and one use matures a crop outright. That is deliberately not the default: a fertiliser that finishes the job is a harvest button, and it makes the Farming skill Furrow exists to reward moot. | 0.34 | server |
| BonemealHarvest | What a fertilised crop yields when picked, as a multiplier. Three, so a fed carrot gives two. It travels down RPC_Pick's own bonus argument - the same channel the Farming skill's max-level bonus already uses - so the extra goes through the game's own drop loop and world drop scaling, extra drops and the way pickups spread out all still apply. The base it multiplies is recomputed exactly as the game recomputes it, so doubling doubles what you would really have got rather than what the prefab says. The mark is set, not counted. A second bonemeal on the same plant brings more time forward but does not stack the harvest, so this cannot be farmed by standing over one carrot. It is also spent on picking, which matters for anything that respawns rather than being consumed. Set it to 1 to keep the speed and drop the bounty. | 3 | server |
| BonemealSkillGain | Farming skill gain granted when a fertilised crop is picked - his call: a fed field is also a lesson. Granted to the local player on the machine that owns the crop, which in this pack's bases is the picker. | 5 | server |
| BonemealRadius | Feed every plant within this many metres of the one you clicked, in the same press. Off at 0, which is the default: one press per plant is the constrained reading, and the radius exists only so somebody with a full field does not reach for a mod that does far more than this. This entry used to be read without ever being bound, so the read threw on every use and the radius could not be turned on at all. | 0 | server |
Carrier 8
| Setting | What it does | Default | Whose |
|---|---|---|---|
| CarrierEnabled | A spirit carries the items to the chests, one stack per trip, instead of the post emptying itself the instant you close it. Turn this off and the post goes back to moving everything at once - the sorting is identical either way, only the waiting changes. | true | server |
| Couriers | How many spirits a post flies at once. One is the deliberate default: the point is watching a thing carry a thing, and three of them make it a conveyor belt. Raise it if a post that serves twenty chests takes longer to clear than you want to stand there. | 1 | server |
| CarrierSpeed | Metres per second in the air. A brisk walk. Faster than a run and the trip is over before you have looked at it. | 2.6 | server |
| CarrierPause | Seconds spent hovering at each end, loading and unloading. Without a pause the spirit bounces off the chest and the delivery is invisible. | 0.5 | server |
| ItemsPerTrip | How many items a spirit carries in one trip. A stack of fifty wood leaves the post ten at a time and takes five trips, so a big load looks like a big load rather than crossing the room in one go. 0 carries the whole stack however large, which is what this did before. This is the number the post upgrades are meant to raise. | 10 | server |
| CarrierCruise | How high above the higher end it arcs. This is what carries it over furniture and walls: it flies rather than walks, so nothing here has to know what pathing is. | 1.1 | server |
| CarrierScale | Scale of the spirit. The carrier is the Vaettir spirit and now wears its mesh exactly, which is built knee-to-chest rather than the forearm-across copy Stow used to generate for itself. 0.62 is that ratio, so the carrier is the size it has always been on screen and the only thing that changed is the model underneath being the right one. Set it to 1 for a full-size spirit. That is the honest reading - it is the same being either way - but it is a large thing to have crossing a storage room with a crate under it, so the default keeps what was already there rather than resizing anyone's post without asking. | 0.62 | yours |
| FlareDonors | Prefabs to lift the halo off, best first. What is taken is the child named flare - a ParticleSystem wearing light_glow - which is how every glowing thing in the game actually reads as glowing. The mesh's own emission is a painted texture that is almost entirely black, so a borrowed emissive material lands our UVs on the black part and does nothing. The lantern is first because its flare is a single soft halo; guard_stone works but hangs four other billboards off itself. | piece_dvergr_lantern,guard_stone,piece_walltorch,fire_pit | yours |
Crops 2
| Setting | What it does | Default | Whose |
|---|---|---|---|
| MaxSeeds | Most seeds a single click can sow, once Farming reaches MaxAtLevel. Set to 1 to switch crops off entirely. | 20 | server |
| MaxAtLevel | Farming level at which MaxSeeds is reached. Levels above this add nothing. With the defaults: 1 seed at level 0, 5 at 20, 10 at 40, 15 at 60, 20 at 80. | 80 | server |
Diagnostics 4
| Setting | What it does | Default | Whose |
|---|---|---|---|
| TestMode | Drops what a sapling needs to three greydwarfs, so the whole chain - stages, spirit, commune, heartwood - can be walked in a minute instead of an hour. Announced in the log on startup so it is hard to leave on. | false | server |
| Verbose | Log every feed. | false | yours |
| DumpMaterials | On startup, log every material on each donor with its shader and whether it exposes an emission property. This is how to find a donor worth naming rather than guessing at one. | false | yours |
| LookForPrefabs | Comma-separated words. Logs every loaded prefab whose name contains one. The asset manifest lists what exists on disk, most of which is never loaded; this lists what is genuinely there. | (empty) | yours |
Furrow 7
| Setting | What it does | Default | Whose |
|---|---|---|---|
| GridEnabled | From GridLevel up, the cultivator's ghost snaps onto a lattice anchored on the nearest plant of the same kind, so hand-placed plants land in rows and columns. One seed per press stays vanilla; the skill unlock is the alignment. | true | server |
| GridLevel | The Farming level that unlocks the grid shape. Below it the shape cycle offers row and circle only; a rank of seeds is a hand skill, a whole field laid out at once is what the levels are for. | 10 | server |
| GridCell | Metres between plants on the grid. Leave it at 0 - that keeps EVERY PLANT ON ITS OWN SPACING, taken from its grow radius, which is the distance the game itself needs clear around it. A carrot wants centimetres and an oak wants metres, so one fixed number for both either spaces carrots out like trees or packs trees in like carrots. A number here overrides all of them, and setting it below a tree's own radius is exactly how a sapling gets planted with no room and is wasted. Watch the ring, not this line. | 0 | server |
| GridAngle | Which way the rows run, in degrees. The lattice is world-aligned at 0, so rows run north-south whatever direction you approach from. Turn it to match a building that does not sit square to the world. | 0 | yours |
| GridPreview | Draw the lattice on the ground under the ghost, so the rows, the spacing and the angle can be seen before anything is planted rather than worked out from where the last seed landed. | true | yours |
| GridPreviewRings | How many cells the drawn lattice reaches in each direction. 3 draws a seven by seven patch, which is enough to see the rows without covering the ground you are trying to look at. | 3 | yours |
| RoomPreview | Draw a ring at the plant's grow radius, green when it would have room and red when it would not. The game does not check this when you place: it checks ten seconds later, and a sapling that fails simply turns unhealthy or deletes itself, so the seed is gone before anything says no. Shown whatever the grid is doing. | true | yours |
Harvest 7
| Setting | What it does | Default | Whose |
|---|---|---|---|
| PickArea | Shift+E on a ripe crop harvests its neighbours too. Plain E still picks exactly one and is untouched - an area harvest you cannot switch off is a mod deciding for you when you wanted the whole bed. | true | server |
| PickLevel | The Farming level that unlocks the area harvest. Below it Shift+E is an ordinary single pick. | 15 | server |
| PickAtLevel | The Farming level at which the harvest reaches PickRadius. Between the unlock and here it grows smoothly, so the reward arrives over the whole skill rather than all at one threshold. | 80 | server |
| PickRadiusMin | Metres reached at PickLevel, the moment it unlocks. Small on purpose: a couple of neighbours, not a field. | 2 | server |
| PickRadius | Metres reached at PickAtLevel, and the most it ever reaches. | 8 | server |
| PickMax | Most crops one Shift+E may take. The radius already limits this; the cap is what stops a very dense field emptying an inventory into items on the ground in one press. | 50 | server |
| PickSameCropOnly | Take only the crop you clicked, so a mixed bed is harvested a kind at a time instead of stripped in one press. Turn it off to take every ripe crop in reach. Either way it is ONLY crops - the grown stage of something plantable, read from the game rather than listed here - so wild berries, mushrooms, thistle and dandelion are never touched. | true | server |
Heartwood 4
| Setting | What it does | Default | Whose |
|---|---|---|---|
| HeartwoodName | What the material is called. | Heartwood | server |
| HeartwoodDonor | The vanilla item it is cloned from, for its ItemDrop, Rigidbody, colliders and float-in-water behaviour. Only the mesh, the name and the icon change. | SurtlingCore | server |
| HeartwoodStack | How many fit in a slot. | 10 | server |
| HeartwoodGiven | How many a spirit folds itself into. One, and really only one: the heartwood is where the spirit lives, so a spirit that produced five of them would have five homes and be in none of them. It is also the economy - the whole chain exists to make a single stowing post cost something real, and five would make the rest free - but the story is the harder constraint of the two. | 1 | server |
Keys 12
| Setting | What it does | Default | Whose |
|---|---|---|---|
| GridFreeKey | Hold to plant free of the grid - the lattice and its preview stand down until the key is released. Left at None this is the game's own AltPlace key, Shift unless rebound, which is already vanilla's 'place free of snapping' gesture - one habit, both meanings. Set a KeyCode here only if Shift is overloaded for you; the named key then replaces AltPlace rather than joining it. | None | yours |
| GridPinKey | Pin the grid to where the ghost is standing, so a row starts exactly there. Without a pin the lattice lines up on the nearest plant of the same crop, which is right for extending a bed and wrong for lining one up with a floor you just laid. Press again to unpin. Only works with the cultivator out and a plant selected, since the ghost is what says where 'here' is. | KeypadPeriod | yours |
| GridTurnKey | An OPTIONAL key that turns the grid by GridTurnStep, for anyone who would rather not use the wheel. None by default, because GridTurnScroll below is the gesture. Setting this to Mouse2 also stops middle click removing the piece under your cursor while a plant is selected, since one click cannot do both. | None | yours |
| GridTurnScroll | Turn the grid with the mouse wheel while the cultivator is up with a plant selected and the grid is running. The wheel is nearly free here: it is vanilla's rotate gesture, and a crop's own facing is re-randomised by the game after every single placement, so the yaw you scroll to is thrown away as soon as the seed goes in. Turning the rows instead spends it on the one thing that does last. | true | yours |
| GridTurnStep | Degrees per press of GridTurnKey. 22.5 is the step vanilla turns a building by, so anything you built square is reachable exactly. | 22.5 | yours |
| IncreaseKey | Sow one more seed per click, up to what your Farming level allows. | KeypadPlus | yours |
| DecreaseKey | Sow one fewer seed per click, down to one. | KeypadMinus | yours |
| ShapeKey | Switch between row and circle. | KeypadMultiply | yours |
| KeyStow | Optional. Empties your pack into the chests around you from wherever you stand, skipping the post entirely. Unbound by default. | None | yours |
| KeyConfigure | Optional. Look at a chest and press this to say what it holds. Unbound by default because the chest window has a button for it. | None | yours |
| KeepHotbar | For KeyStow only: leave the hotbar row alone. Your axe and your food live there on purpose. A post takes whatever you put in it, hotbar or not, because putting it in was already the decision. | true | yours |
| NeverStow | For KeyStow only: prefab names that never leave your pack. Comma-separated. | Hammer,Hoe,Cultivator | yours |
Post 15
| Setting | What it does | Default | Whose |
|---|---|---|---|
| CoupleToStow | Make the stowing post cost heartwood - which is to say, make the post the place the spirit ends up living. That is where the sorting comes from, and it is why the post is worth an hour of greydwarfs when a chest is worth ten wood. Off puts the post back to plain wood and nails, for anyone who wants the sorting without the ritual. | true | server |
| StowPostCost | What is *added* to the stowing post's cost, as Item:Amount. Added rather than replacing, because the rest of that recipe is Post/PostCost and someone may have changed it deliberately. An ingredient already there is raised to whichever amount is higher rather than counted twice. | GroveHeartwood:1 | server |
| PostEnabled | Add the stowing post to the hammer. | true | server |
| PostName | What the piece and its window are called. | Stowing post | server |
| PostCost | What it costs to build, as Item:Amount pairs. Nails put it past the forge rather than in the first camp: a post that sorts a storage room should arrive when there is a storage room to sort. An item name that does not resolve is logged and skipped, which makes the post cheaper rather than unbuildable - check the log after editing this. | FineWood:20,IronNails:20 | server |
| PostWidth | Slots across. Wide and shallow on purpose: the post is a table you pass things over, not somewhere to keep them. | 6 | server |
| PostHeight | Slots down. | 2 | server |
| PostDonor | The vanilla piece the post is cloned from. It keeps the donor's Container, Piece and WearNTear - only the label and the visuals change. | piece_chest_wood | server |
| PostModelFile | The hand-built mesh the post wears, beside the dll. Its .col sidecar and its _icon.png are picked up automatically, and wherever its `core` group sits is where the post is lit and where the spirit is born - so a different model moves all three without anything here changing. The plain shapes from tools/post_designs.py ship alongside it: stow_post_rack.obj, stow_post_chute.obj, stow_post_table.obj, stow_post_barrow.obj - none of those carry a heartwood. | stow_post_canopy.obj | server |
| PostScale | Scale of the whole piece. | 1 | server |
| LookForProps | Comma-separated words. On startup, logs every loaded prop whose name contains one. Nothing is grafted from these - the post's shape is its own - but each material group is skinned from a real vanilla prefab, and this is how to find one worth borrowing from. Try: wood, forge, stone. | (empty) | yours |
| PostLightRange | How far the heartwood in the post throws light. It is a lamp in a storage room as well as a component, and this is the number that decides which. | 7 | yours |
| PostLightIntensity | Brightness of that light. The mesh itself does not glow - vanilla paints emission into a texture and a borrowed material lands our UVs on the black part of it - so this and the flare are the whole effect. | 1.15 | yours |
| PostFlareScale | Size of the halo on the post's heartwood, relative to the donor's own. The dvergr lantern it is lifted from is a metre and a bit across. | 0.75 | yours |
| PostGlowDonors | Prefabs to lift the post's glowing recess from, best first - the first that resolves and has an albedo wins. This used to skin the carrying spirit too, under the name CarrierGlowDonors, and the two spirits came out wearing different materials from different lists: the one you commune with took stone from fire_pit and the one carrying your ore took the dvergr lantern's metal. They are one creature, so the carrier reads Spirit/GlowDonors now and this list serves only the post. The old comment here called fire_pit leading the list a real bug, on the grounds that a fire pit's first material with an albedo is its stones. It is - and that is what the better-looking spirit is wearing. | piece_dvergr_lantern,guard_stone,piece_walltorch,fire_pit | yours |
Sapling 29
| Setting | What it does | Default | Whose |
|---|---|---|---|
| SaplingName | What the planted seed is called. | Ancient sapling | server |
| SaplingCost | What planting one costs. Not refunded when you take it back up - a seed put into the ground is spent. | AncientSeed:1 | server |
| SaplingDonor | The vanilla piece it is cloned from, for its placement rules and its Piece and WearNTear. The donor's own Plant component is torn out: it grows on a timer, which is exactly what must not happen here. | sapling_carrot | server |
| SaplingScale | Scale of the planted piece. | 1 | server |
| SaplingIcon | The picture on the cultivator, read from beside the dll. Without one the piece keeps the donor's icon and the cultivator offers you a carrot. Rendered from stage one - the seed you actually place - because the grown stages are two metres of mostly trunk and at inventory size they come out as a brown stick. tools/sapling_icon.py renders the alternatives if you want a different one. | grove_sapling_icon.png | server |
| SaplingHealth | How much punishment it takes before it is destroyed. The donor is a carrot and carries a carrot's health, which is a few points - so a single greydwarf swinging near it ended the whole ritual, and the seed is not refunded. Five hundred is roughly ten hits from a brute: it survives a fight happening around it and does not survive a mob left to work on it, which is the point. Defending it is meant to be the hard part of the hour, not a formality and not a coin flip. | 500 | server |
| NeedsCultivated | Whether it must go in tilled soil. Off by default: an ancient seed answering to a forest is a stranger idea than a crop, and making it want a vegetable patch shrinks it. | false | server |
| PinSaplings | Put a marker on the map where a sapling is standing, and take it off again when the sapling opens or is destroyed. The sapling is the one piece here you are meant to walk away from - it grows on kills rather than on a clock - and a seed in bare ground is not findable from fifty metres away. The pin is yours alone, saved in your own profile like any pin you place by hand, and nothing about it is networked. | true | yours |
| PinIcon | Which of the game's own map icons to use. | Minimap.PinType.Icon3 | yours |
| Beckon | Whether a planted seed draws greydwarfs to itself. Off, the sapling is passive and the quest is really 'find somewhere greydwarfs already walk, then wait there', which is a scouting problem rather than a defending one. On, the place you chose becomes the thing that matters, and what it calls is what feeds it. It rides vanilla's own SpawnArea - the component a greydwarf nest is made of - so it only ever runs on the owner, inside the active area, with a player in range. Nothing happens while you are asleep. | true | server |
| BeckonRoster | What it calls, as Prefab:Weight, comma separated. Weights are relative, so these are ten ordinary ones to three shamans to two elites. Deliberately a separate list from FeedWeights, which says what a death is worth. Tying the two together would mean a shaman worth three points had to arrive three times as often as it should. | Greydwarf:10,Greydwarf_Shaman:3,Greydwarf_Elite:2 | server |
| BeckonInterval | Seconds between arrivals, slowest first: the first number is a seed nobody has fed and the second is one about to open. This is meant to read as a raid on the clearing rather than as wildlife wandering past it. 90 and 30 were the first numbers here and they were far too polite: one greydwarf every minute and a half is something you deal with between other jobs, not something you hold ground against. It still ramps, because a constant rate is a wave you learn to stand in, and getting louder as it fills means you can hear how close it is without looking at anything. Both ends simply moved. Below about two seconds nothing more happens whatever is written here: SpawnArea wakes on its own two-second repeat and spawns at most one creature each time, so two is the floor. | 20-6 | server |
| BeckonPack | How many arrive together, fewest first: the first number is a seed nobody has fed and the second is one about to open. Vanilla's spawner produces exactly one creature per interval, which is a queue rather than a raid - you fight a greydwarf, then wait, then fight another greydwarf. A wave arrives from one direction together and has to be handled as a group, which is the difference between a chore and a fight. The caps still apply. Each of a wave is spawned through the game's own SpawnOne, which checks MaxNear and MaxTotal for itself, so a wave that would breach them simply comes up short. | 2-5 | server |
| SaplingBiomes | Which biomes will take an ancient seed at all, comma separated, using Valheim's own biome names. Blank for anywhere. Black Forest alone by default. It is a greydwarf ritual - what it calls and what feeds it both live there - and a seed that works in the meadows makes the biome a backdrop rather than the reason. | BlackForest | server |
| BiomeMargin | How far inside its biome the seed has to be, in metres. Checked on a ring as well as under the cursor, so the whole ring has to be in. Standing one step into the forest and planting a thing that summons the forest is the case this refuses: the fight would happen half in the meadow, and a boundary is where a raid is least interesting. Nought checks only the spot itself. | 5 | server |
| BiomeRefusal | Said when a seed is refused for being outside its biome, or too near the edge of it. | Too far from its own wood to grow. | yours |
| NotInBases | A sapling cannot be planted in anybody's base, and one already standing goes quiet if a base grows around it. This is the anti-grief. A passive sapling planted in someone else's home was rude; one that summons waves of greydwarfs at it is a weapon, and planting a dozen around a stranger's longhouse is the obvious grief on a public server. A base is the game's own EffectArea.PlayerBase - what a workbench or a fire radiates, and the same test vanilla uses to keep creatures from spawning in your house. So the counter-play to a sapling planted next to you is to put a workbench down rather than to fight it. Any base, including your own. Working out whose it is would mean reading Piece.m_creator off whatever happens to be nearby, which is more code for a worse answer - it would still stop you at a friend's base in co-op - and a wilderness ritual has no business in your own hall either. A ward already refuses the sapling with no help from this: it is an ordinary piece, so PrivateArea turns it down like anything else. | true | server |
| BaseMargin | Extra metres on top of the game's own base radius. Nought means exactly the area a workbench already covers; larger pushes saplings further out than the ground a base actually protects. | 8 | server |
| BaseRefusal | Said when a sapling is refused for being in a base. Vanilla would say 'invalid placement', which is true and useless - somebody standing in their own garden needs to be told it is the workbench, because that is also how they defend against one. | Too close to a hearth. This belongs in the wild. | yours |
| BeckonMessage | Said once, centre screen, when a sapling starts calling. Blank for nothing. Everyone within BeckonRange is told, not only whoever planted it, because it is a warning about a place rather than a note to an owner - and on the frame it appears there is nothing on screen yet to account for the noise coming out of the trees. Said again if you leave and come back, since the sapling goes quiet while nobody is near it and starts over when someone is. | The forest is enraged. | server |
| BeckonDistance | How far out they appear, nearest first. They walk in from there. A band rather than one radius, and that is the whole of why they arrive instead of materialising: vanilla picks its spawn point at a random distance between nought and the radius, which is uniform across a disc, so most of them land near the middle however wide it is set. This was 12 metres and they appeared in your face. Kept under about 70. Past that the ground at the spawn point may not be loaded yet, the floor test simply fails, and the sapling reads as having stopped calling. | 25-40 | server |
| BeckonRange | How close you have to be for it to call at all. Vanilla nests use 256m, which would have a sapling filling a forest you are nowhere near - and quietly getting itself killed by what it summoned. Close enough to hear is the intent. | 48 | server |
| BeckonArea | How wide the neighbourhood is that BeckonMaxTotal counts inside. This was effectively the whole loaded world, and it broke the feature outright: the count matches creatures by prefab name, so every wild greydwarf for a kilometre filled the cap and a sapling in the Black Forest called nothing at all, silently and for ever. The cap should mean this clearing is already crowded, not this half of the map contains greydwarfs. | 96 | server |
| BeckonMaxNear | Most it will have standing around it at once. Ten is a fight rather than an encounter, and it is deliberately more than the sapling survives being ignored for: it has 500 health and about ten brute hits in it, so a raid you wander off halfway through takes the seed with it. That is the trade - the forest comes to you instead of you going out to find it, and the price is having to hold the ground. Three was the first number here and it was tuned for a sapling that trickled. Put it back if a raid is more than you wanted. | 10 | server |
| BeckonMaxTotal | Most it will have alive in the wider area. The ceiling that stops a sapling left alone from being the reason a whole zone is full of greydwarfs - it is a raid on a clearing, and a raid ends. | 24 | server |
| BloodNeeded | How much death it takes. With the default weights that is about fifty greydwarfs - rather fewer if elites turn up, since they are worth four and shamans three. This was thirty, chosen when the sapling was passive and thirty was roughly one raid arriving on its own. It does not wait for a raid any more, it makes one: the seed calls the forest to itself in waves that get heavier as it fills, so the number is now the length of a fight you have started rather than the odds of one finding you. Fifty is a siege you have to hold rather than an errand you complete. | 50 | server |
| FeedRange | How close a kill must be to count. Only the nearest sapling is fed - otherwise a heap of saplings planted together would all grow at once off the same work. | 24 | server |
| FeedWeights | What each death is worth, as Prefab:Amount. Anything not listed is worth nothing. A list rather than a faction check, because ForestMonsters would also catch trolls, boars and the Elder, and 'kill anything in the forest' is a duller quest than 'clear out the greydwarfs'. Greylings are listed at zero so it is visible that they were considered and refused. | Greydwarf:1,Greydwarf_Elite:4,Greydwarf_Shaman:3,Greyling:0 | server |
| Messages | Corner counter each time a kill feeds a sapling. | true | yours |
Sorting 3
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Range | How far a chest may be from the post and still be stowed into. Measured from the post, through walls - a storage room is still one room when the shelves are behind a pillar. | 12 | server |
| MatchContents | Let a chest that has been given no rules still take more of what it already holds. This is what makes the mod useful before you have configured anything, and it is the lowest-priority match: any chest that actually asked for the item wins over one that merely has some. | true | server |
| Messages | Corner message summarising what went where. With the carrier on this arrives when the last trip lands, not when you close the post. | true | yours |
Sowing 4
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Enabled | Sow more than one seed per click. Turn this off and the mod does nothing, which is also what it does at Farming level 0. | false | server |
| Shape | Row lays the seeds in a line. Circle rings them around the one under your cursor. Switchable in game with ShapeKey; this is only the starting value. | SowShape.Row | yours |
| RowAcrossFacing | Row runs left to right across your facing, so you sow a rank and step forward. False runs it away from you instead, which plants the far end on ground you cannot see clearly. | true | yours |
| Spacing | Multiplier on the gap between sown seeds. 1 uses the plant's own grow radius, which is the same distance the game itself refuses to plant inside, so neighbours never choke each other. Below 1 will drop seeds. | 1 | server |
Spirit 8
| Setting | What it does | Default | Whose |
|---|---|---|---|
| SpiritName | What it is called when you look at it. | Forest spirit | server |
| SpiritScale | Scale of the whole thing. The mesh is built knee-to-chest height. | 1 | server |
| MoteCount | How many beads ride each ring. Six rather than the original seven: seven was chosen so no two beads sat opposite each other on a single circle, and with several circles crossing that buys nothing while an even count divides more cleanly. | 6 | yours |
| RingCount | How many circles of beads. One is the original single hoop. Two crossed circles is the default: it reads as an orbit rather than a swarm and keeps both rings separable, which three only just manages and four does not - at four the beads stop reading as being on circles at all and become a cloud. | 2 | yours |
| ShowHoop | Draw the torus the beads sit on. Off: the circle is implied by where the beads are and by their moving together, which is a lighter and stranger thing than a visible ring - and with several rings crossing, the torus meshes turn the whole shape into a ball of wire. | false | yours |
| SpiritRise | How far above the sapling the spirit appears. | 0.4 | server |
| PartingEffect | Vanilla effects played once, where the spirit stood, at the moment it folds into the heartwood and goes. A list, best first: the first name that resolves in this world is used and the rest are ignored. A list rather than one name because which prefab is actually loaded is a question for the game rather than a guess made here - the shipped manifest lists what exists on disk, not what a session has - and the cost of guessing wrong used to be that this shipped blank for a whole release. vfx_ghost_death leads because a wisp coming apart is the nearest thing vanilla has to a spirit folding itself away. Not the glow: the spirit's breathing is a light and an emission colour driven in code, always on, and nothing to do with this setting. This was called FadeEffect and that name cost a conversation, because the spirit visibly fades in and out on its own and the two are unrelated. Blank for none. | vfx_ghost_death,vfx_HealthUpgrade,vfx_DraugrSpawn | yours |
| GlowDonors | Prefabs to try to lift the glowing material from, best first. The first one that resolves and has an albedo wins. | fire_pit,piece_walltorch,bonfire,Ember,piece_groundtorch_green,guard_stone | yours |
Thicket 8
| Setting | What it does | Default | Whose |
|---|---|---|---|
| Enabled | Move the things the game does not let you move: dig wild berry bushes, thistle, dandelion and mushrooms up with the cultivator and replant them where you want them. Off and none of the pieces or items are registered at all - which is safe to do only before any have been replanted or dug up, because a prefab that no longer resolves takes every standing seedling and every uprooted item in a chest with it. | true | server |
| Donor | The vanilla plant each seedling is cloned from, for its Piece, its ZNetView, its WearNTear and its Plant. Unlike the ancient sapling the donor's Plant is kept and reconfigured rather than torn out: an ordinary plant growing on an ordinary timer is exactly what is wanted here, so riding the game's own component is both less code and one less thing to break on an update. | sapling_carrot | server |
| Scale | Scale of the seedling in the ground. The grown bush is the game's own and is not affected. | 1 | yours |
| SpacingScale | Multiplier on how much clear ground each seedling demands around it. The base figure comes from the plant's own size - a bush needs metres where a mushroom needs centimetres - and this scales all of them at once. Below 1 packs them tighter than the grown bushes will fit. | 1 | server |
| DigReach | How far away a wild plant can be dug up, in metres, measured from you rather than from the camera. Roughly the reach of any other click on the world. | 6 | server |
| DigAssist | How many degrees off the crosshair a plant may sit and still be dug, when the crosshair itself hits nothing. Wild plants are ragged and several have a collider narrower than they look, so an exact ray is a harder shot than the plant appears to be. The plant nearest the aim line wins, not the nearest plant. 0 turns the help off. | 12 | server |
| SayTheLevel | Write the Farming level a plant needs into its build-menu description, and say it on screen when you try to plant one you have not earned. Without this the piece is simply greyed out, which reads as missing materials and sends you looking through your chests for berries you are already carrying. | true | yours |
| Verbose | Log every row as it is parsed, and every prefab that could not be found. | false | yours |
Trees 2
| Setting | What it does | Default | Whose |
|---|---|---|---|
| MaxSeeds | Most saplings a single click can sow. Deliberately far below the crop number: a sapling needs several metres of clear ground where a carrot needs centimetres, so the same count covers an enormous area. | 5 | server |
| MaxAtLevel | Farming level at which the tree MaxSeeds is reached. | 80 | server |
Discussion
Nothing said yet.
Sign in or make an account to join in.