Valheim
Install with App

Details

Latest version
2.0.7
Last Updated
First Uploaded
Downloads
4.3K
Likes
4
Size
295KB
Dependants
ADDatHost Valheim hosting
30% off

📜 Njord — Changelog


⚓ v2.0.7 — The Dockside Update

[!NOTE] The Harbourmaster will now stand on a dock you built instead of falling through it onto the seabed. Client-side placement only - the ServerSync floor stays at 2.0.5, nothing on the wire changed, and no config entry changed.

  • She Stands On What You Built: post her on a pier, a jetty, a raised deck, anything with a floor, and she stays on it. Until now she was cloned from Haldor and inherited his SnapToGround, which finds the ground by raycasting the terrain layer and only the terrain layer - a dock is simply not there as far as it is concerned. So she was dropped straight through it to whatever the natural ground was underneath, which over water means the seabed, with the Harbourmaster standing on it. Worse, that height was then written into her saved position, so everyone on the server loaded her down there too.
  • Njord Seats Her Itself Now: vanilla's snap is off her prefab entirely, because she was getting it twice and both were terrain-only - once the frame after she spawns, and again on the next global snap pass anywhere in the world, which would have undone any correction. She is now seated once, at the moment she is posted, against every solid surface at that spot: terrain, player pieces, and the world's own structures. Boats are deliberately excluded - a karve moored under her is not a floor - and so is anything directly over her head, so posting her inside a boathouse puts her on its deck rather than in its roof.
  • The Watchdog Measures Her Post, Not Her Feet: for half a minute after she is placed Njord checks she has not sunk into the ground, which covers a zone that finishes settling around her. That check now asks what the floor is where she was posted; asking what is under her feet was useless in exactly the case that mattered, because once she is under a dock the honest answer is "the seabed". It also only ever lifts her, never lowers her, so a dock collider that is slow to stream in can no longer be read as an excuse to drop her off it.

[!TIP] On a world where she is already under the dock, her bad position is saved in the world file and this build will not move her on its own. Stand where you want her and run njord.harbour.place once; she will stay put from then on.


⚓ v2.0.6 — Valheim 1.0.16 compatibility

[!NOTE] Rebuilt against Valheim 1.0.16 and re-verified. No floor change - the ServerSync floor stays at 2.0.5: nothing on the wire and nothing written to the world changed.

Rebuilt against the Valheim 1.0.16 release assemblies (client build 25527674 / dedicated server build 25527701, network version 40) and BepInEx 5.4.2350, and re-verified: a static reference check against both the client and dedicated-server assemblies, and a headless boot of the 1.0.16 dedicated server. Njord touches none of the members 1.0.16 changed (it removed only ObjectDB.GetAllFoodItems() and ButtonSfx.Start(), neither of which Njord reads), so every patch binds exactly as it did before.


⚓ v2.0.5 — The Handover Update

[!IMPORTANT] This is the fix for boats that jitter, refuse to take forward or back, snap around under the crew, or throw people overboard after two players trade the helm — the bug that previously only cleared when the original helmsman dove off. Everyone updates together: the server and every client. The ServerSync floor is raised to 2.0.5 because the hand-off is cooperative — one machine aboard on an older build is enough to bring the fight back for everyone on that hull. No config entry changed.

Traced from two rounds of live logs (two clients plus a dedicated server, with a transition-only ownership trace). There were two causes stacked, and fixing only the first was not enough.

  • The Server Was Never Listening: Njord's helm authority is meant to be arbitrated by the server — a client asks for the helm, the server records who has it and tells every other client. That arbiter was being switched on from a hook that only fires when a player spawns, and a dedicated server has no player. So on a dedicated server it never switched on at all: every helm request was silently dropped and no one was ever told to stand down. The arbiter now comes up the moment the network layer exists, on every peer, headless server included — and re-registers itself cleanly if you log out and join another world in the same session.
  • The Hull Was Being Grabbed, Not Handed Over: with the arbiter alive, every handover still fought for one to six seconds. The incoming helmsman's machine took the hull's physics the instant it took the wheel, while the outgoing helmsman's machine was still simulating the hull and still believed it owned it. Valheim settles two machines' claims by whichever wrote data most recently, and the machine simulating a hull writes every tick — so the grab was undone by its next packet, the helmsman's machine grabbed again, and the two traded the hull back and forth until, by luck of timing, the outgoing side heard the news first. Every swap hard-snaps the hull to the other machine's position under everyone's feet: that is the jerking, the boat that "re-dropped like it was just built" (a snap large enough to teleport rather than glide), the deck throw, and the helm that steered but would not take forward or back (each press landed on a copy that was overwritten a few ticks later).
  • The Fix: vanilla never takes a hull from a machine that is still simulating it — Ship.UpdateOwner has the owner pass it on, and that is the one kind of transfer the game settles in a single exchange. Njord now does the same. When the server announces a new helmsman, the machine simulating the hull hands it to them on the spot; its own simulation stops there and then, and its next packet carries the new owner with the freshest data, which every copy accepts at once. The incoming helmsman no longer claims from a live owner at all; the only hull it takes outright is one nobody holds. Thrust is applied only once the hull has actually arrived, as vanilla gates every force it applies. A helmsman whose hull never arrives — its previous simulator gone or unloaded — still claims it outright, but only after a full second, well past any hand-off that is ever going to come, when nobody else is writing to it.
  • Nobody Left Holding A Dead Rope: if a helmsman's connection drops — logout, timeout, or crash — the server releases their helm and tells everyone, so a hull is never bound to someone who can no longer let go of it. A machine that finds itself simulating a hull with people aboard and no record of who steers it (a late joiner, typically) now asks the server before it could contest the real helmsman without knowing.
  • Your Debug Flags Were Working All Along: Njord's Debug_Enable output was written at a log level BepInEx's default disk logger discards, so turning the flag on appeared to do nothing. Debug output now goes out at Info level; the flag is still the gate. Debug_AuthControl additionally traces every helm request, arbitration reply, and ownership transition — logged on change, never per tick, so it is safe to leave on. A clean swap reads RPC_AuthorityUpdate applied → handed ZDO ownership to peer … on the outgoing machine and a single IsOwner False -> True on the incoming one; no claimed … outright line and no repeating IsOwner flips.

⚓ v2.0.2 — The True Muster Update

[!NOTE] A correctness fix to how a ship knows who is aboard her. No config, RPC, or synced setting changed — the ServerSync floor stays at 2.0.0.

  • The Boarding Roll No Longer Drifts: vanilla adds a player to a ship's boarding list on every single trigger-volume touch, with no check for whether they're already listed. A hull whose deck spans more than one trigger volume — or a standing player jostled by waves at the seam between two — could rack up duplicate entries that never fully cleared, so a solo sailor's own "onboard" count could climb into double digits over a long session on a longship instead of resting at one. Njord now tracks how many of a ship's volumes each player actually overlaps and only touches the real boarding list on a genuine arrival or departure. Every hull behaves exactly as it always has for the ordinary case; the drift is gone for the complex one.
  • Why It Matters Beyond The Log: a stale duplicate entry could leave a ship's own "is anyone still aboard" check stuck on true long after the honest answer was false — the kind of desync that can leave a hull unresponsive at the helm. This closes that specific failure mode. It does not touch helm-claim or ZDO-ownership logic, which are unchanged from 2.0.1.

⚓ v2.0.1 — Valheim 1.0.7 compatibility

Rebuilt against the Valheim 1.0.7 release assemblies (client build 25185596 / dedicated server build 25185644, network version 39) and BepInEx 5.4.2350, and loaded on the 1.0.7 Linux dedicated server with every rune bound and no Harmony errors. Njord touches none of the members 1.0 changed (the sector API, VisEquipment hashes, ItemStand, ZDOExtraData, Inventory.Load, save paths, Version), so every patch binds exactly as it did before.

  • The ship destroy hook is real now. Njord_Ship_Destroy_Patch targeted Ship.OnDestroy, a method that has never existed on any build (Ship's only destruction method is the private OnDestroyed() that WearNTear calls when a hull is broken, which never fires on zone unload or logout). The class was never handed to the rune binder either, so it was dead code rather than a crash — the rune-trail emitter's bookkeeping was simply never cleared when a ship left the world. The cleanup now rides on a NjordShipEmitterCleanup component attached to the ship's GameObject the first time a trail is built for it; its Unity OnDestroy fires on every teardown path — wreck, dismantle, zone unload, logout — and the dead Harmony target is gone.
  • ServerSync floor stays at 2.0.0: no synced entry or RPC changed, so 2.0.0 clients can still join a 2.0.1 server.

⚓ v2.0.0 — The Shipwright Update

[!IMPORTANT] Everyone updates together. 2.0.0 raises ServerSync's floor to 2.0.0, so a 1.x client cannot join a 2.0.0 server. This is a release rather than a test build, and the RPCs behind the shipyard are new.

[!IMPORTANT] Njord now adds an NPC who is written into your world save: the Harbourmaster's ZDO names a prefab only Njord registers, so if you later remove the mod she becomes an object nothing can build. Nothing breaks — she simply fails to appear — but njord.harbour.remove takes her out cleanly if you want the world left tidy.

The Harbour

  • The Harbourmaster: a shipwright takes her post on the shoreline nearest your world spawn, the first time anyone loads that zone. Talk to her to buy a hull, claim your first one, or have the vessel you are stood on refitted. She keeps her post across restarts. On an established world she may never place herself — a dedicated server loads a zone only while somebody is standing in it, and nobody revisits spawn — so put her where your players actually are with njord.harbour.placeat <x> <y> <z>.
  • She Will Not Be Buried: traders are one of only four things in Valheim that snap themselves to the ground, and they do it one frame after spawning, before the terrain has necessarily finished. Njord finishes the ground under anything about to snap, places her only once the ground has settled, and watches her for thirty seconds afterwards — digging her out and persisting the fix if she has sunk.
  • Placing Her Is Done From Your Own Game: the shoreline is found by raycast and she is seated on a settled heightmap, and a dedicated server has no colliders or heightmaps outside the world origin. It decides; it cannot measure. So your machine sites her and the server authorises it and records where she went, checking you against its adminlist.txt first. The ledger half of an answer appears in the server log; what your own machine can see prints in your console.

The Shipyard

  • Your First Hull, Free: every player is given one boat — a Karve — once, for as long as that world exists, named <your name>'s Pride before she touches the water. Eligibility is decided on the server, against a ledger keyed by your persistent player ID, and the row is written before the boat is handed over: a crash mid-grant costs you a boat rather than handing out a second one. Rerolling a character does not get you another.
  • A Gift Is Not A Christening: the free hull arrives already named, and that does not count toward your boats_christened stat. You didn't name her.
  • Hulls Are Paid For In Timber: prices are lists of materials, per hull, set by the server. Vanilla's shop can only count coins, so Njord draws its own — which means no other trader mod on your server is patched or touched.
  • Hulls Are Called What The Game Calls Them: names come from each hull's own Piece token, so vanilla's Trailership gets its real name, modded hulls get theirs, and every name arrives translated.
  • The Shop Wears The VikingOS Frame: the same gilt window chrome as the rest of the suite, shared rather than reproduced — so a frame style changed anywhere changes it here too.

Refits

  • Refits (⭐1–⭐4): stand aboard a hull at the harbour — or moor her alongside — and pay 2×, 3×, then 4× her price to raise her. Anyone aboard may pay for it. What a star is worth is entirely the server's business: Upgrade_Tier2/3/4 are lines of speed, accel, health and cargo values against the hull's base figures, never compounding. Stars show on the helm hover panel and in the HUD.
  • speed Raises The Cap; accel Raises The Boat: if your MaxSpeed_* values are set above what a hull can physically reach — which is how most servers turn the limiter off — then the cap is not what is holding her back, and the speed key does nothing. The tier defaults therefore put the refit's real weight into accel, the only key that changes speed on such a server, and which still helps on a default one by reaching the cap sooner. They are larger than they look because drag rises with velocity, so the return is sub-linear: measure them rather than trusting them.
  • The Panel Quotes m/s, Not Multipliers: the refit tab shows a hull's top speed as 16.8 → 18.8 m/s rather than speed ×1.12. A multiplier is a claim about how fast she will go, and on a server whose caps are unreachable it is a false one. A hull with no cap at all is told so outright.
  • A Refit Does Not Heal Or Hurt Her: raising a hull's maximum health scales what she currently has by the same factor, so a battered boat comes out of the yard exactly as battered as she went in — with a bigger hull around it.
  • Cargo Rows Are Off By Default: they are the one refit that can destroy your belongings, because an item in a slot that stops existing is gone. cargo is 0 in every tier out of the box, and Njord never shrinks a hold within a session. Turn it on knowing that lowering it later — or removing Njord — takes those rows away with whatever is in them.

Admin & Data

  • Admin commands: njord.harbour.place, njord.harbour.placeat <x> <y> <z>, njord.harbour.find, njord.harbour.remove (and remove force), njord.harbour.forget, njord.firstboat.revoke <playerID>, njord.whoami. All print to your console, and help lists them with descriptions.
  • njord.harbour.find Diagnoses An Absence: if there is no harbour it reports the world spawn, whether that zone is loaded on your machine, and whether the shoreline search finds an acceptable site — which separates "the search never ran" from "the search ran and rejected everything". Those two look identical in a log and have completely different fixes.
  • njord.harbour.remove Will Not Orphan Her: it can only destroy a Harbourmaster whose zone is loaded, so when it cannot reach her it keeps the site and says so rather than forgetting where she is. remove force overrides that, and tells you what it cost.
  • Export Schema 5: speed_records and hull_bests now carry tier. A refitted hull sails to a raised cap, so a speed and the cap beside it are only meaningful together with the refit that was on her — without the field a ⭐4 Karve's record would read as either a cheat or a lie about the published cap. null means no record exists, never tier 1.

📐 v1.3.5 — The Legible Ledger Update

[!NOTE] Export shape only. No physics, handling or speed changes — every hull sails exactly as it did in 1.3.4.

  • Sailor Stats Split By Subject: barrkbot_sailors.json now carries only distance and time; wrecks and christenings moved to barrkbot_wrecks.json, and per-hull bests to barrkbot_hull_bests.json. The reason is row width rather than file size — a reader renders one row per sailor into a fixed budget, so a wide row does not just take up space, it pushes whole people out of the visible roster.
  • Per-Hull Bests Are Now Flat: One row per sailor-and-hull pairing instead of a map nested under each sailor. Nested objects are stripped from multi-row listings, so the old shape rendered as a list of names carrying nothing rankable — every hull best reachable one sailor at a time and no other way. "Who is fastest on a Karve" is now a question with an answer.
  • Rollover (schema_version: 4): A collection that outgrows Barrkbot_RowBudget continues into barrkbot_sailors_2.json, _3, and so on, rather than needing a new Njord release. Because Njord pins ServerSync's minimum version to its own, every release disconnects every player until they update — so "the file got big" should never be a reason to make everyone update.
  • Split Files Still Rank Correctly: Every part carries the top three per field computed across the whole collection before splitting. A part holding one row of thirteen still names the true overall leader. Ranking within a fragment would report a wrong winner with complete confidence, and the reader is told to trust that figure over anything said earlier — so this is the difference between a split file being safe and being actively misleading.
  • No Two Fields Share A Name: A sailor's best on a hull is personal_best_speed. top_speed now means exactly one thing across every Njord export — speed_records[hull].top_speed in barrkbot_boats.json, the world record for that hull across everyone. The two are different bases, and one name in two files is a collision a reader cannot see; a name that can't be confused beats a warning telling you not to confuse it.
  • Stale Parts Are Swept: If the roster shrinks, leftover numbered files are deleted rather than left behind for a reader to treat as live data.

🪶 v1.3.4 — The Saga‑Keeper Update

[!IMPORTANT] The Longship and the Drakkar are now speed‑capped for the first time. MaxSpeed_Longship (26) and MaxSpeed_Drakkar (30) have existed since Njord shipped but never once applied — crews used to these two hulls will feel them slow down. Server admins may want to warn their players, and can raise both values in the config if the vanilla ceiling isn't wanted.

  • Speed Limiter Fix: Njord's per‑ship speed cap matched the hulls players call the Longship and the Drakkar, not the prefabs the game actually uses (VikingShip and VikingShip_Ashlands). Neither ever resolved, so both boats fell through the limiter entirely and sailed uncapped. Every other hull — Raft, Karve, and all OdinShip / OdinShipPlus ships — was unaffected and keeps the exact behaviour it had.
  • BarrkBOT Data Export: Njord can now publish what it measures, so a Discord bot, dashboard or status page can answer questions about your fleet. Off by default. Enable Barrkbot_Enable and the server writes BepInEx/config/Njord/barrkbot_boats.json with a per‑prefab boat census and the top speed each hull type has ever reached, including who was at the helm and the cap in force at the time. Records survive server restarts.
  • Honest Absence: The export never reports a fabricated zero. A hull missing from the census means none exist, a hull missing from the records means nobody has ever sailed one, and a null cap means none applied — three different facts that a 0 would flatten into one wrong one.
  • Census Is Cheap To Tune: Counting boats sweeps every ship ZDO, so it runs on its own long interval (Barrkbot_CensusInterval, default 15 minutes) rather than sharing the speed table's cadence. Both intervals are written into the export so a reader labels staleness honestly instead of guessing.
  • Per-Sailor Stats: The export now also writes barrkbot_sailors.json — distance sailed, time at the helm, boats wrecked, boats christened, and per-hull bests, for each player. Kept in a second file so a growing roster never costs a reader the boat census. Controlled by Barrkbot_Sailors_Enable, which can be turned off to publish fleet data without naming individuals.
  • Wrecks Counted Honestly: A shipwreck means a hull destroyed by damage — not one you dismantled with a hammer, and not one that rotted at its mooring. Njord tells those apart, and a hull lost with nobody at the helm is recorded as unattributed rather than blamed on the last person who touched it.
  • Distance Measured Once: The odometer accumulates only on the peer that owns the hull, so two players sailing near each other can't both bank the same distance. A mileage leaderboard that quietly rewarded playing in groups would be worse than none.
  • OdinShip 0.7.8: Verified against the current prefab list — all seven hulls were already supported, and boats are now discovered by inspection rather than a hardcoded list, so future OdinShip additions are picked up with no Njord update.

⚓ v1.3.3 — The Named Vessel Update

[!IMPORTANT] Fixes a single-player regression where boats slowed to a halt the moment you let go of the rudder.

  • Helm Release Fix: Njord now holds the helm binding after you step back from the rudder, matching vanilla — your ship keeps her way until you actually leave the boat. Previously she coasted to a stop as soon as you released the helm. All multiplayer authority handling is unchanged: the helm is still a single, server-tracked binding per ship, so two crewmates can never both claim her.
  • Name Your Vessel: Alt + Use at the helm christens your ship. The name is stored on the ship itself, so it persists through logouts and shows up for everyone on the server.
  • Named Everywhere: Your vessel's name now appears in the helm hover text, on the crosshair hover label, and at the top of the Njord HUD.
  • Taller HUD: The readout panel is one centimetre taller, making room for the vessel name without crowding the rest of the gauges.

🌊 v1.3.2 — The ServerSync & OdinShipPlus Update

[!IMPORTANT] This update migrates Njord to ServerSync for highly stable, server-authoritative configuration locking and syncing.

  • ServerSync Migration: Completely replaced custom sync RPCs with ServerSync. Server admins can now reliably lock configuration settings across the entire server.
  • OdinShipPlus Support: Seamlessly mapped speed limits and physics logic for all new ships provided by OdinShipPlus (CargoCaravel, Skuldelev, GoblinShip, etc.).
  • Multiplayer VFX Fix: Resolved a multiplayer bug that was preventing the runic wake VFX from displaying properly on other clients.
  • Config Safety Engine: Re-wrote the configuration backend with strict float clamping, protecting your server against physics-breaking NaN/Infinity values.

🌬️ v1.3.0 — The Wind & Configuration Update

  • MAJOR CONFIG OVERHAUL: Completely rebalanced default ship handling physics (acceleration, sails, forces) for a smoother, more realistic feel across all ships.
  • Wind System Overhaul: Rebuilt the Njord wind physics system to perfectly blend with Valheim's natural winds. Full Wind Always is now togglable!
  • UI Snap Fix: The wind HUD icon now instantly snaps to the correct natural wind angle when you grab the rudder, rather than slowly interpolating from 0.
  • Mythic Logs: Improved debug and mythic saga logging consistency.
  • Experimental Wind Assists: The Wind_NoDeadZone and Wind_BlendToFull features have been moved to an opt-in [EXPERIMENTAL] status and are disabled by default.
  • Grace Period Mechanics: Added a configurable grace period delay (default 2.5s) to the wind assists. Ships will now feel the punishing effects of natural dead zones and crosswinds before the Njord assist systems kick in.

🔧 v1.2.2 — The Configuration Polish Update

  • Refined default generated configuration values.

⚓ v1.2.1 — The Authority Fix Update

[!WARNING] Fixed a critical network sync bug that caused boats to occasionally refuse to move.

  • Boat control authority tweaks and fixes.
  • Network sync bug that caused boats to refuse to move is fully resolved!

⛵ v1.2.0 — The OdinShip Update

  • Initial OdinShip support.
  • OdinShip prefabs now seamlessly benefit from Njord's advanced physics and custom config generation.

✨ v1.1.0 — The Runic Wake Update

[!NOTE] A visual identity update introducing mythic ship‑trail effects and polishing Njord’s presentation on the open sea.

  • Runic Wake VFX (New)
    • Optional glowing wake effect behind ships.
    • Color‑tinted based on config.
    • Scales with speed and sail state.
    • Fully multiplayer‑safe.
  • HUD & Visual Polish
    • Improved wake blending with waterline motion.
    • Minor HUD clarity adjustments.
    • Better visual consistency across ship types.

🛠️ v1.0.8 — The Deterministic Sea Update

[!TIP] A foundational stability update focused on multiplayer correctness, identity tracking, and predictable helm behavior.

  • ZDOID-Based Ship Identity (New Architecture)
    • Ships now use Valheim’s true network identity system.
    • No HUD flicker, no control loss, no prefab collisions.
  • Multiplayer-Safe Helm Control
    • Each ship tracks its own controller.
    • Identical ships no longer overwrite each other.
  • Deterministic Startup & Config Sync
    • Movement works instantly — no more F8 ritual.

🚀 v1.0.0 — First Public Release

  • Complete overhaul of Valheim ship handling and steering.
  • Added steering multiplier system.
  • Added acceleration and reverse force tuning.
  • Added Half/Full sail force configuration.
  • Added wind‑blend smoothing system for natural sail transitions.
  • Added Njord HUD with configurable X/Y position.
  • Added runtime config reload hotkey (F8).
  • Added server‑to‑client config sync for multiplayer.
  • Added mythic startup logs and diagnostics.
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.