Valheim
You are viewing a potentially older version of this package. View Latest Version
Install with App

Details

Date Uploaded
Downloads
344
Size
76KB
ADDatHost Valheim hosting
30% off

Merchant Signposts

Valheim's no-map mode makes the travelling merchants nearly impossible to find without looking up the seed. Merchant Signposts places fingerpost signs along trails leading to Haldor, Hildir and the Bog Witch, so exploring the right biome is rewarded with a physical marker in the world instead of a map pin.

What it does

  • Trails of signposts. Around each merchant's candidate camps, the server plans trails of signposts from the world seed. Each signpost is a vanilla post with a vanilla sign board that names the merchant and points at the next sign along its trail; the innermost sign points at the camp.
  • Themed per merchant. Haldor's signs use a core-wood post with gold lettering, Hildir's a wood post with pink lettering, and the Bog Witch's a darkwood post with green lettering.
  • The first trail found chooses the camp. Come within 30 m horizontally of a planned signpost and the server marks it seen. If the merchant still has several possible camps and none has spawned, it keeps that sign's camp and discards the others. The camp spawns normally when a player approaches; its trails remain.
  • Found signs leave a readable landmark. If a seen sign's camp is discarded, its board changes to "Haldor has moved on" (or the merchant's name) in its usual colour. The post and board stay in place and keep their direction. Unseen signs toward discarded camps are removed. A found sign also stays if a changed plan drops its point, or its merchant leaves [Merchants] Table, while its camp survives. If a moved-on sign's camp exists in the world again and its merchant is in the table, the sign returns to its usual text.
  • Trails avoid competing camps. Planned signs stay at least 480 m from other possible camps of the same merchant, to avoid spawning a different camp first.
  • Self-repairing. When the world loads, the server removes stale signposts and restores missing ones in generated areas. Player-built posts and signs of the same kinds are never touched. Edits to automatic boards, including found and moved-on signs, are undone on the next sweep. The merchants restore the configured words and clear the editor’s name. Sweeps follow world load, zone generation or a sighting; invalid Placement settings pause them. Hand-placed test signs keep their text.
  • Not a material farm. Breaking a signpost drops part of its materials once. By default the server does not rebuild a signpost that a player, creature, fire or collapse destroyed, and removes the other half of the pair without drops. That memory stays while the merchant camp exists, even if the merchant table or trail settings change and are later put back.
  • Clear of natural obstacles. After rocks, ore deposits and trees generate, the server checks the complete sign and reading space. An obstructed automatic sign moves to the nearest suitable tested point within 50 m without removing the object.
  • Out of player bases. Automatic signs keep clear of the build area around workbenches and other crafting stations, plus 5 m of reach. A sign nobody has found moves out of a base built around it, or is removed if there is no clear spot nearby; a sign players have already found is left where it stands. Bases on worlds without the workbench requirement, and ranges widened by station upgrades, are not detected.

Signposts use only vanilla pieces, so they replicate to every player like any other build piece and are saved with the world.

Installation

Server-side only. Install it on the dedicated server, or in the profile of the player who hosts the world. Players who join do not need it and see the signposts without it; a joining client that also has it does nothing extra. It requires BepInExPack for Valheim 5.4.2351 or later.

Upgrading to 0.2.0

Stop the game or server and back up the world and configuration before upgrading. Keep only one installed copy of MerchantSignposts. In particular, remove hand-installed 1.x builds and internal 0.2.1–0.2.30 builds: their higher version labels can take precedence over 0.2.0. Internal testers should remove the old local package and its cached copy before importing 0.2.0, then verify the installed DLL against the candidate's recorded SHA-256. Public 0.1.0 users can update normally through their mod manager.

Existing configuration values are preserved. To adopt the new defaults, edit these entries while stopped, preserving any other merchant overrides you intentionally use:

  • [Signpost] PolePrefabs: change Haldor's entry to Vendor_BlackForest=wood_pole_log. The old Dvergr post otherwise remains configured and can drop Mistlands materials.
  • [Placement] LocationMargin: set to 16 metres.
  • [Placement] Biomes: use Hildir_camp=Meadows|BlackForest|Plains for Hildir's trails.
  • [Trigger] Enabled: keep false outside trusted disposable test worlds.

New settings use their defaults, including DestroyedSignRestoration=Never. The first sweep can rebuild existing signposts and remove unseen signs that no longer fit the plan. Existing 0.1.0 signs start unseen. Finding a sign can permanently choose its merchant's camp when the world is saved. Removing the mod does not undo that choice; restoring the pre-upgrade world backup is the rollback for saved-world changes.

Configuration

BepInEx/config/com.valheim.merchantsignposts.cfg holds the merchant table, the post and sign pieces, per-merchant colours, and trail density. Placement settings apply after a restart. The defaults suit a standard world.

Setting Default Meaning
[Merchants] Table Vendor_BlackForest=Haldor,Hildir_camp=Hildir,BogWitch_Camp=Bog Witch Location-prefab names and the labels written on signs; comma-separated, case-insensitive names
[Signpost] PolePrefab wood_pole2 Default vertical post for merchants without an override
[Signpost] PolePrefabs Vendor_BlackForest=wood_pole_log,BogWitch_Camp=darkwood_pole Per-merchant vanilla posts; an invalid post warns and pauses new placements for that merchant
[Signpost] SignPrefab sign Vanilla board prefab; must have a Sign component
[Signpost] PoleEmbedDepth 0.3 Post depth below the ground, in metres
[Signpost] SignInnerEndOffset 0.2 Board's inner end offset from the post axis, in metres
[Signpost] SignDropBelowPoleTop 0 Board's top below the post's top, in metres
[Signpost] TextTemplate {merchant} Active sign text; substitutes the merchant label
[Signpost] TextColors Vendor_BlackForest=#E3B341,Hildir_camp=#E48BD2,BogWitch_Camp=#8CC63F Per-merchant rich-text colours; invalid colours warn and fall back to vanilla
[Signpost] FlipFace false Show the text on the other side without changing the pointing direction
[Signpost] LogGeometry false Diagnostic placement logging; exposes world positions
[Placement] WorldPlacement true Enable automatic placement, maintenance and sighting observation
[Placement] Spokes 6 Trails per candidate camp, from 1 to 64
[Placement] OuterRadius 600 Outer trail radius in metres
[Placement] InnerRadius 150 Inner radius in metres; must not exceed OuterRadius
[Placement] Step 150 Positive spacing along each planned trail, in metres
[Placement] SidewaysJitter 20 Maximum sideways displacement, in metres
[Placement] WaterMargin 2 Minimum elevation above sea level, in metres
[Placement] WaterMargins BogWitch_Camp=0.25 Per-merchant elevation overrides
[Placement] Trails BogWitch_Camp=spokes:12;step:50 Per-merchant spokes, outer, inner and step overrides; spokes range 1–64
[Trigger] SweepInterval 2 Seconds between sighting checks and enabled trigger scans; clamped to 0.5–60
[Commitment] Enabled true Record new sightings and commit a camp when its first planned sign is found
[Commitment] CommitDistance 30 Horizontal sighting distance in metres, checked every two seconds by default
[Placement] SameMerchantKeepOut 480 Keep trail points this far from another camp of the same merchant, in metres
[Placement] SameMerchantKeepOuts empty Per-merchant overrides, for example Vendor_BlackForest=500
[Placement] LocationMargin 16 Extra clearance beyond another reserved location's radius, in metres
[Placement] SearchRadius 50 Search up to this far from failed points; 0 disables recovery, maximum 50 m
[Placement] MinimumSignDistance 75 Minimum horizontal separation between all planned signs, in metres; 0 disables thinning
[Placement] Biomes Hildir_camp=Meadows|BlackForest|Plains Hildir's allowed trail biomes; merchants without an entry use their camp's biome
[Placement] DestroyedSignRestoration Never When a destroyed automatic signpost returns: Never, NextServerStart, or AfterDelay
[Placement] DestroyedSignRestorationDelayHours 24 Hours of server running time before AfterDelay rebuilds it; range 0.1–100,000 hours (minimum 6 minutes), clamped to the nearest limit. Each rebuild is another payout of materials, capped at one payout per signpost per delay
[Signpost] RetiredTextTemplate {merchant} has moved on Text on a seen sign while its camp is missing from the world
[Trigger] Enabled false Turn on the test sign trigger; for test worlds only
[Trigger] TriggerPrefix !signpost Text that starts a trigger sign, followed by a merchant name. Must begin with a symbol such as !; a blank prefix, or one that begins with a letter or digit, keeps the trigger off and logs a warning
[Trigger] RequireAdmin true Honour trigger signs only from players in the server's adminlist.txt

Set Commitment.Enabled=false to stop new sightings and commitments; existing seen and retired signs keep their state. Set Placement.WorldPlacement=false to pause observation, placement and reconciliation while leaving existing pieces in place.

Terrain recovery searches nearby ground for failed points while reserving original valid positions. After vegetation generation, obstacle recovery reuses the ordered search, treats the build area around each saved crafting station as obstructed, persists the selected position in the world, and waits when neighboring coverage is not generated yet. A final pass thins both original and recovered signs to at least 75 m apart, across all spokes and camps. Each spoke links its surviving signs in order of their final distance to camp, skipping removed candidates. The innermost sign points at the merchant; manual signs also point directly at the merchant. This does not guarantee visibility or walkable terrain between signs. Previously seen signs outside the current plan and retired signs keep their state and carry the configured text; active signs whose merchant is absent from the table keep their current words until its entry returns. These signs move only when obstructed and a checked nearby destination exists. Existing configuration files keep their saved LocationMargin; set it to 16 to try the new default. They also retain their saved Biomes value. To try Hildir's wider trails, add or replace her entry with Hildir_camp=Meadows|BlackForest|Plains, preserving any other comma-separated merchant entries, then restart. Haldor and the Bog Witch's defaults are unchanged.

Seen and retired marks are saved with the vanilla pieces. A commitment persists once the world saves. Existing signs begin unseen after upgrading from 0.1.0, and the keep-out can remove some at the first sweep. A game update that regenerates unplaced locations can replace a committed camp before it spawns; any seen signs left pointing to it become moved-on notices. Removing the mod leaves its vanilla pieces and the world's already-pruned camp choices in the save.

The player hosting a local world can enable devcommands and use the signpost console command: signpost plan <merchant> lists nearby trail points, and signpost sweep requests reconciliation. These commands do not work from a client joined to a dedicated server, even for an admin. Plan output reveals world positions; use it only where spoilers are acceptable.

For testing on a dedicated server, the mod also has a sign trigger. It is off by default and is meant for test worlds only. With [Trigger] Enabled=true, an admin builds an ordinary sign and writes the prefix and a merchant name on it, for example !signpost Haldor; the server replaces the sign with a signpost pointing at the nearest camp of that merchant, or rewrites the sign with the reason it refused. The trigger ignores the mod's own signposts. Its admin check relies on the player ID that the writing player's game stores on the sign, so a modified game can impersonate an admin; do not enable it on a world shared with players you do not trust. An enabled trigger writes signpost and merchant camp positions to the server log.

Compatibility

Version 0.2.0 targets Valheim 1.0.21 (build 26266951) with BepInExPack 5.4.2351. It remains an early-development mod: settings and placement rules may change in future 0.x releases. Back up an existing world before updating.

The release's gameplay source was tested on a Linux dedicated server with a vanilla Windows client. Disposable-world checks covered relocation around rocks, readable retired signs, placement on dug ground, the core-wood post upgrade, persistence across save/restart, and exploration with one connected player on worlds with up to 4,096 generated zones. A fresh r2modman local-world profile was also tested during development.

Larger worlds and multiple simultaneous players have not been performance-tested. Full index rebuilds can still pause the server. Trail density and terrain vary by seed: signs may be sparse, and a trail is not a guarantee of visibility or a walkable route. Bases without crafting-station build requirements and station-upgrade range extensions are not detected. Physical vegetation without a network view is ignored with a warning. The test trigger's admin identity is client-supplied; keep it disabled on shared worlds.

Reporting problems

Report bugs using the MerchantSignposts issue form. For installation or usage help, use the question form. Search existing issues first; a GitHub account is required to submit a report. Include the version, the world seed, where the signpost was, and the server's BepInEx/LogOutput.log, whose [MerchantSignposts] lines record each sweep. A healthy start also logs [MerchantSignposts] MerchantSignposts <version> loaded. An [MerchantSignposts] off: error means startup found missing game members or patching failed: the whole mod is inactive, with no hooks or per-frame work. The line names the dependencies to report; install a compatible mod update before expecting signposts to be placed or maintained.

Reports are public. Remove passwords, access tokens, and personal information from logs before posting. The world seed and signpost positions reveal merchant camps to that server’s players, so post them only where spoilers do not matter. Say whether the sign trigger or LogGeometry was on: either writes positions to the log.

Thunderstore development is made possible with ads. Please consider making an exception to your adblock.