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

Details

Date Uploaded
last week
Downloads
1.4K
Size
567KB
ADDatHost Valheim hosting
30% off

RoleplayNPCs

RoleplayNPCs is a standalone BepInEx resident mod for Valheim. The 0.8.19 playtest build adds evolving or fixed relationships, spouses, happiness, richer English/Russian conversations and daily tavern table service, alongside the Settlement Charter journal, visual schedules, resident professions and resource upkeep.

Residents do not fight or use weapons. Their work gestures are decorative, while eligible fuel deliveries and Blacksmith loose-metal storage move actual resources. Land travel uses walking locomotion and disables running; water emergencies use native swimming. Wardrobe equipment is cosmetic and grants no armor, status effects, or combat behavior.

See NPC_BEHAVIOUR.md for the complete schedule, area, service, stock, conversation, reaction and recovery reference, including defaults and limits.

Install and start playing

  1. Install BepInExPack Valheim in your Gale Valheim profile. The package declares denikson-BepInExPack_Valheim-5.4.2351 as its dependency.
  2. With Valheim closed, import RoleplayNPCs-0.8.19.zip as a local mod in Gale. Enable RoleplayNPCs and launch modded. When updating, replace the previous copy rather than keeping two DLLs.
  3. Install the same RoleplayNPCs build on the server and every client. Back up your world before updating a playtest build.
  4. As the host/server administrator, craft the reusable Settlement Charter with 2 Leather scraps + 1 Coal. Open it from your inventory or hotbar, summon a resident, then assign their home, workplace, profession and optional bed/social area.
  5. The Hours page shows the active routine. Choose Edit beside Work & rest or Social time. Labelled From / Until fields open inside that section, with Save hours / Cancel directly below. Saved hours remain visible above the draft; work and rest save together. Cancel discards edits; typing alone does not change the routine. Overnight intervals are marked +1 day, and overlapping work/rest hours show a warning.

The walking/debug overlay is hidden by default. Administrators can toggle it locally with rpnpc_debug in the game console.

For manual installation, place RoleplayNPCs.dll in BepInEx/plugins/RoleplayNPCs/ with BepInEx installed. The ZIP contains documentation and package metadata as well as the DLL; no compilation is needed to play.

Share this build

Just the mod: send RoleplayNPCs-0.8.19.zip to your friends through a file-sharing service. In this source checkout it is under dist/. Recipients follow the installation steps above. This is the packaged 0.8.19 playtest, with the Charter, visual schedules, resident gestures, storage/fuel fixes and bounded avoidance. Automated checks pass; live movement, animation appearance and multiplayer recovery still need playtesting.

Your mod setup: in Gale, choose Export > ...profile as code and send the generated code. Also provide this ZIP while RoleplayNPCs is an unpublished local mod, so recipients have the exact build. See the official Gale sharing instructions.

Your settlement: the mod ZIP does not contain your world, placed residents or their saved assignments. Share a separate world backup if you want others to load the same settlement. A profile export is not a world backup.

A public release: sign in to Thunderstore, select the Valheim community and use its package upload flow with the release ZIP. Preview the README and validate the manifest before publishing. Keep manifest.json, README.md and the 256x256 icon.png at the ZIP root; do not wrap the package in an extra folder. Later published updates need an increased version number. See the official package requirements. The prepared ZIP is ready to share locally; preparing it does not publish anything.

When reporting a playtest issue, include the mod version, resident profession, intended activity, what actually happened, whether you were hosting or joining, and the relevant log excerpt. This helps distinguish routing, resource access and multiplayer issues.

Settlement Charter and resident journal

Hand-craft a Settlement Charter with 2 Leather scraps + 1 Coal after learning those materials. This reusable parchment scroll has its own icon, rolled-paper model and wax seal. Existing summoning scrolls retain the same item identity. Right-click it in your inventory or use its hotbar slot. The server and all clients need the same development build for the new visual messages.

The dark journal uses warm text and a serif title (with system-font fallbacks). The Hours page has a compact active-routine summary and one inline editor at a time. Each schedule section keeps its saved hours, editable fields and Save/Cancel actions together. Work and rest apply together; the daylight reset is inside their editor. Sleep overrides social time, which overrides work. New summons appear after a 2.2-second glowing-circle/spiral effect; the arrival floor and clearance are checked again before creation. If the spot becomes blocked, the summon is cancelled without consuming the charter.

Low-fuel baths are included in home and workplace fuel errands, using actual fuel from accessible chests. Residents check ownership, access and capacity again before delivery. Bath approach searches start outside the basin; blocked routes still defer the errand. Household refuelling must be enabled. Fisherman audits now report wind/calm waiting, customer service, maintenance and shoreline retry status.

Seated residents occasionally mime a tankard drink after 45-90 seconds, then at 90-180 second intervals when eligible. The tankard and meal hand props are cosmetic meshes, not inventory items. Real meals still use the existing reservation/consumption protocol and native eat trigger. Supported native wave, shrug and beckon gestures accompany greetings, uncertain conversation lines and newcomer invitations; merchants may shrug when a nearby shop visitor leaves without buying. Standing gestures do not override seats, sleep, work or services, and use a 15-second cooldown.

Only server administrators can open its management logbook. Select a loaded resident or enter a new name and permanent sex to summon one. Tabs provide home/work/social anchors, radii, kitchen/bath points, nearest-to-player bed assignment, overnight hours, profession, autonomy, wardrobe, appearance randomization, route/status inspection and dismissal. Location buttons use your character's position, while selected residents use stable IDs. Server responses appear inside the logbook; existing diagnostic text remains English. Buttons/labels are English/Russian. Mouse/keyboard UI; Escape or controller B closes it.

Recall reuses the safe rescue command: the resident must be nearby (within 30m) and free of active interactions, seating, sleep and danger. Ordinary movement can be cancelled by Recall. It does not load or summon distant unloaded residents. Send through the veil asks for confirmation, cancels ordinary errands, fishing and social activities, then plays a 2.2-second portal effect before permanently removing the resident and wardrobe and clearing bed assignments. No idle-state wait is needed. Active paid services/trades, reserved stock and unresolved paid requests still prevent deletion, with a specific reason. Console rpnpc_remove uses the same departure flow. rpnpc_autonomy <on|off> [name] changes autonomy; committed interactions finish safely.

New summons say one of six arrival lines after a short delay, including puzzled afterlife and hangover reactions. Recall has three separate lines. Speech is server-issued, varies between arrivals, respects sleep/danger/conversation interruptions, and uses the speaker's sex in Russian. Loading a saved NPC does not replay arrival speech. Inventory registration, crafting, input focus, remote replies and arrival timing need live playtesting.

Fisherman (0.8)

Assign rpnpc_profession fisherman Bjorn, choose the centre of the fishing work area with rpnpc_setwork Bjorn, and adjust rpnpc_setradius_work 20 Bjorn to include shoreline. Fishermen choose their own standing spot within that radius; the marker does not need to be the fishing spot. Searches cover the area one floor candidate at a time, checking twelve casting directions with short staggered retries until a reachable dry spot with clear water is found. Narrow or obstructed shores may still offer no valid spot. Work hours also include fuel deliveries and lighting of unlit fueled candles.

After a completed fishing session, the day's catch is fixed: 1-3 species, 1-3 fish each, with a 20% empty-catch chance. Shops never generate fish before fishing. Wind at 0.65 or above stops fishing; recovery requires 20 seconds at 0.45 or below. A fresh session can start after 20 seconds of safe wind below 0.65. Thresholds use the game's normalized wind intensity. Pole gestures are decorative; no wild fish are removed. Native bait compatibility and progression filter the virtual catch. Cave bait is excluded.

Background discovery is spread across frames and residents; profession scheduling processes one resident per frame. Updates exceeding 15ms produce a throttled [Performance] log entry with the activity/state, useful when reporting regular freezes. Live frame-time measurements are still required.

During a weather pause, fishermen check cached fuel, lighting and bath errands every 5-8 seconds, then look for an ordinary workplace seat if nothing needs tending. Covered seats are preferred. A sustained strong-wind/recovery wait gets an occasional spoken explanation in English/Russian, at most once per three minutes. Calm wind, customers and duty changes end the break. Other idle workers can take short seated breaks after their errands and counter dwell. Full discovery retains its normal interval to avoid scan bursts.

Rain makes residents seek reachable covered seating or a safe building floor within their current home, social or workplace area. Outdoor routines pause once shelter is found; indoor work and covered upkeep can continue. Residents explain shelter seeking and returning to their routine with occasional English/Russian lines. Sleep, paid commitments, danger and water recovery retain priority. If no safe shelter is found, the existing routine continues while bounded searches retry. Native roof detection and walking need live playtesting.

Fishermen reuse their last shoreline after checking its floor, occupancy, work radius, ward access, water and route again. Completed sessions have a 2-4 second pause; the rod is put away during breaks and other activities. Social gestures cannot override fishing. Temporarily unequipped rods get a bounded recovery attempt, and missing replicated hand state is repaired during active fishing. Debug logs report rod restoration failures; visual appearance still needs playtesting.

Workplace planning spreads approach tests across frames, admitting one approach per frame across NPCs with fair rotation. Pending routes retain task priority and do not receive failure cooldowns. Real transfers still check ownership, wards, capacity, inventory and reservations when executed. Individual native path calls can remain slow and are logged with fixture names. Work rest time starts on actual chair arrival, with an eight-second settling period before routine errands interrupt; customers, danger and schedule changes can still preempt it.

The wheel accepts 20 of the selected bait, with a 60% improvement roll on the next safe fishing day. Requests remain pending through days without a completed session. Stock stays capped at three species/three per species; already-full or incompatible offers cannot improve. Fish are sold separately during work hours. Sold-out, no-catch and off-duty replies reflect stock state; unsold leftovers are consumed for supper after work, once pending purchases finish.

Every profession, including residents with autonomy disabled, attempts to swim to a validated dry landing after entering deep water. After 25 seconds without progress or 90 seconds overall, emergency rescue tries a validated last dry position, home or workplace. Unloaded/blocked destinations defer rescue. Logs distinguish landing search, rescue deferral and schedule resumption. Test waves, shore slopes and pole animation in game; automated tests cannot certify Unity physics.

Build

Current build: 0.8.19, prepared for the consolidated live playtest; automated checks do not certify Unity movement or multiplayer recovery. Server and all clients must use this same build, especially for paid-service messages.

Custom hours are server-saved and use the in-game 24-hour clock:

rpnpc_schedule Astrid
rpnpc_sethours_work 08:00 19:00 Astrid
rpnpc_sethours_sleep 22:00 06:00 Astrid
rpnpc_sethours 20:00 04:00 06:00 14:00 Astrid
rpnpc_schedule default Astrid
rpnpc_setsocial Astrid
rpnpc_setradius_social 20 Astrid
rpnpc_sethours_social 19:00 21:00 Astrid
rpnpc_social Astrid
rpnpc_social off Astrid

Use rpnpc_sethours to change both windows together, especially for night shifts. Windows may cross midnight and overlap; equal endpoints are rejected. Sleep overrides social, then work, then home. First customization starts from work 08:00-19:00 / sleep 22:00-06:00; the response prints both resulting windows. default clears the override and restores existing automatic behavior, without changing profession, home, workplace or bed. Default Traders without beds and default Patrons still stay on duty; explicit hours override that behavior. During custom sleep hours a missing/unreachable bed means quiet time at home with bounded retries. In-progress services and committed meals finish safely. rpnpc_audit reports schedule/duty state.

Social time requires an area plus enabled hours and is optional for every profession. Sleep overrides social time; social time overrides work. It allows sitting and conversation, never gambling or other profession services. social off preserves its settings; schedule default does not disable social time.

The project targets the classic BepInEx/Mono runtime. If BepInEx is managed by Thunderstore, pass that profile's core directory:

.\build.ps1 `
  -ValheimPath "C:\Program Files (x86)\Steam\steamapps\common\Valheim" `
  -BepInExCorePath "C:\path\to\profile\BepInEx\core"

Copy bin\RoleplayNPCs.dll into BepInEx\plugins\RoleplayNPCs\ for every client/server that loads the world. The 0.6.x line changes the network protocol and requires the same build on the server and every connected client.

Run ./review.ps1 before packaging. It compiles against the installed game, checks version metadata, persistent keys, routed RPC names, and DLL consistency, then prints the required live-world review steps. The qualitative criteria are in IMMERSION_REVIEW.md.

The current package was compiled against Valheim 1.0.16 and BepInEx 5.4.23.5. Record a built artifact's SHA-256 before distributing it:

Get-FileHash .\bin\RoleplayNPCs.dll -Algorithm SHA256

The legacy compiler embeds build-specific data, so rebuilding unchanged source can produce a different hash.

Commands

  • rpnpc_spawn <female|male> <name>
  • rpnpc_remove [name]
  • rpnpc_sethome [name]
  • rpnpc_setradius_home <meters> [name]
  • rpnpc_walk [name]
  • rpnpc_returnhome [name]
  • rpnpc_list
  • rpnpc_state [name]
  • rpnpc_sit [name]
  • rpnpc_seats [name]
  • rpnpc_setpoi <kitchen|bath> [name]
  • rpnpc_clearpoi <kitchen|bath> [name]
  • rpnpc_pois [name]
  • rpnpc_goto <kitchen|bath> [name]
  • rpnpc_chat [name]
  • rpnpc_setnearestbed [name]
  • rpnpc_clearbed [name]
  • rpnpc_bed [name]
  • rpnpc_sleep [name]
  • rpnpc_wake [name]
  • rpnpc_profession <none|harlot|trader|patron|tavernkeeper|blacksmith|fisherman> [name]
  • rpnpc_setsocial [name]
  • rpnpc_setradius_social <5..100> [name]
  • rpnpc_sethours_social <HH:mm> <HH:mm> [name]
  • rpnpc_social [off] [name]
  • rpnpc_payment (local receipt inspection)
  • rpnpc_setwork [name]
  • rpnpc_clearwork [name]
  • rpnpc_work [name]
  • rpnpc_audit [name]
  • rpnpc_wardrobe [name]
  • rpnpc_reload
  • rpnpc_debug
  • rpnpc_log [on|off]
  • rpnpc_resetmodel [name] — randomize hair, beard, hair colour and skin tone while preserving current sex and outfit. Female residents receive no beard. Uses the same persistent appearance path as the individual appearance commands.
  • rpnpc_hair <prefab|none> [name]
  • rpnpc_beard <prefab|none> [name]
  • rpnpc_skin <r> <g> <b> [name]
  • rpnpc_haircolor <r> <g> <b> [name]
  • rpnpc_chest <prefab|none> [name]
  • rpnpc_legs <prefab|none> [name]
  • rpnpc_helmet <prefab|none> [name]
  • rpnpc_cape <prefab|none> [name]

Resident management and inspection commands execute on the server after it verifies the requesting peer against Valheim's administrator list. The client sends the command text and an optional crosshair target; the server derives the administrator's position and facing from the player's network state. rpnpc_debug remains a local overlay toggle, and wardrobe access uses its own authenticated server lease.

Commands that act on a resident accept an optional exact NPC name. Without a name they use exact-ray plus forgiving sphere-assisted crosshair targeting (maximum range is configurable) while still respecting walls. For commands with another value, such as rpnpc_hair Hair1 Astrid, put the NPC name last. Names are matched case-insensitively and must be unique among loaded residents. For existing duplicate names, rpnpc_list prints a short id:<prefix> target that can be used anywhere a name is accepted, such as rpnpc_state id:a1b2c3d4. rpnpc_sethome Astrid uses the authenticated player's current server-known position. Spawn examples are rpnpc_spawn female Astrid and rpnpc_spawn male Bjorn; sex and name are required, and sex remains fixed after spawning. Each new resident receives a persistent random hairstyle, natural hair color, skin tone, and (for male residents) beard or clean-shaven look.

rpnpc_sit Astrid immediately tests and starts the normal reserved-chair route. rpnpc_seats Astrid lists up to twelve nearby loaded chairs and explains whether each is ready, occupied/reserved, outside the home, blocked, waiting for Valheim's navigation area, or unreachable. rpnpc_state Astrid includes autonomy, network ownership, remaining wait time, conversation reservations/cooldown, and the most recent activity failure. Use rpnpc_log on to persist detailed state-transition logging in BepInEx/LogOutput.log.

Kitchen and bath activities do not require per-NPC setup. Kitchen points use a manual override, a compatible shared override, or automatic discovery of cooking stations, feast/serving objects, cauldrons, and ovens. Stand at a preferred spot and run rpnpc_setpoi kitchen Astrid only when automatic placement is unsuitable. rpnpc_goto kitchen Astrid tests the resolved path immediately; rpnpc_pois Astrid reports the source and path. At a kitchen point, the resident periodically uses a synchronized interaction gesture while facing the fixture. Baths use native Chair seats inside a loaded vanilla piece_bathtub, including occupancy checks and seat reservations. An optional rpnpc_setpoi bath Astrid restricts bath selection to a tub within 4m of that point; without an override any eligible tub in the home may be used. A bare floor point is no longer a bath. Bathing does not remove equipment, apply Wet or grant player status effects.

Autonomous random wandering is disabled. After a short Waiting period, residents choose among configured kitchen/bath points, a randomly selected reachable chair, or a nearby player/resident conversation. rpnpc_chat Astrid forces one conversation test. NPC exchanges contain four connected alternating lines over roughly 18 seconds unless interrupted; players receive a greeting, not invented replies. Speech uses synchronized Valheim NPC world text. rpnpc_walk remains available only as a manual navigation test.

Home territory is a horizontal radius rather than a single-floor height band. Saved POIs, chairs, beds, and meal approaches may be on different floors when Valheim's humanoid pathfinder can find a complete route to them. Scheduled conversations have a cooldown and the previously completed activity category is tried last, preventing conversation loops from starving household activities.

To assign a bed, stand beside the intended bed and run rpnpc_setnearestbed Astrid. The loaded bed nearest to your character is selected first. If it is stationary and inside her home radius, it becomes exclusively assigned even if its approach is temporarily blocked. Otherwise the command explains the rejection and leaves the assignment unchanged; it never selects a farther bed silently. Sleeping searches 24 approach positions and retries later when none is reachable. Assignment persists through unload/reload; reassignment releases the old claim, and failed assignment leaves it unchanged. rpnpc_clearbed Astrid removes the assignment. Default residents sleep at night when free of profession duty; custom schedules use their configured sleep window, including daytime. Players keep priority over beds. Decorative sleep never changes a player's spawn point, skips world time or grants Rested. Use rpnpc_bed Astrid to inspect the route/lease, rpnpc_sleep Astrid to attempt sleep during sleeping hours, and rpnpc_wake Astrid to detach safely.

Professions

Use rpnpc_profession <none|harlot|trader|patron|tavernkeeper|blacksmith|fisherman> Astrid. For workers and Patrons, stand at the workplace, face the intended direction with your character, then run rpnpc_setwork Astrid. Workplaces can be outside home. rpnpc_setradius_work 50 Astrid sets a server-saved task radius (5..100m, default 50); rpnpc_work Astrid reports it and stock units. Work travel uses a bounded connecting area, while household searches remain home-scoped. Only loaded, reachable objects are used: no off-screen simulation or teleport commuting. Profession/work/schedule commands are admin-only.

During a bath, ordinary bed sleep or Harlot bed visit, the server temporarily hides cosmetic chest/leg clothing, helmet and cape, leaving the vanilla base-model underwear. Walking to the activity does not undress the NPC. The saved outfit and wardrobe inventory are untouched, and clothing returns when the activity ends or is interrupted. Wheel selection blocks combat and hotbar input until the selection input is released, with a short close guard.

Run rpnpc_audit Astrid after setup and after adding behavior. It uses the live AI validators to report blocking bed/workplace/chair/path problems, current ownership and activity failures, plus explicit design/path caveats that require playtesting. A computed path is not treated as proof that the NPC can pass a closed door or a newly placed obstruction.

A Harlot displays “I want to have fun.” She must have an assigned bed. On interaction the server reserves that bed and sends her there; the requesting player has two minutes to follow within 3m. Successful arrival produces a short fade-to-black and adds ten minutes to the player's remaining Rested duration. The service does not move the player, change the bed's player spawn ownership, advance time, or bypass another player's bed occupancy.

The fee is 25 coins by default, controlled by server [Professions] HarlotFee (1–10000). The wheel and NPC show the quoted price. Coins are taken only at valid bed completion, before the fade/bonus; failed travel and cancelled visits are not charged. Explicit work hours and social-time refusals apply to new visits.

Traders, Tavernkeepers and Blacksmiths use the vanilla shop interface, selling one item per purchase. Their daily stock is separate, finite and server-persisted. Traders offer 5-7 material types: Wood/Resin always appear at restock with 20-40 each; common materials have 10-20, uncommon materials/ores 5-10. Tavernkeepers offer 4-5 foods/meads, 1-3 each. Blacksmiths offer 4-5 smithing-material types. Later-tier goods have lower selection weights and boss-progression gates. Stock is replaced once per new Valheim day, not accumulated or rerolled on reload/clock rollback. Sold-out goods remain sold out until restock. Old bundle-format stock migrates to a fresh unit-based assortment once.

A Patron displays “I wanna gamble.” He repeatedly reserves usable chairs within 5m of his workplace, changes seats between visits, and waits with gambling unavailable when no chair is available. Casual visits last 90-180 seconds before another workplace seat is selected. A gamble is an even-odds server roll for a random whole-coin amount from 1 through the lesser of 20 or the coins the player carries. A win adds that amount and a loss removes it; no single result exceeds 20 coins.

Press E once to open the action wheel immediately, with Talk, the resident's profession action, and Wardrobe for administrators. Click a wedge or press its displayed number to choose. Opening the wheel does not request dialogue, start a service or wake the resident. Click the center/outside, right-click, or press Escape to leave. The hint follows your configured Use binding. Administrators can also use rpnpc_wardrobe Astrid. Controller controls: D-pad or left stick cycles choices, A confirms, B goes back/closes, and Start closes. Release the opening/selection button before confirming again.

Merchant wheels also have Next stock. Trader/Tavernkeeper requests cost 30/25 coins and modestly improve the next restock's eligible rarity weights without guaranteeing a better shipment. Blacksmiths normally stock 1–2 basic/bronze weapons among 4–5 total item types. Their metal selector accepts 20 Bronze, Iron, Silver, Black Metal or Flametal bars for a 40% chance of a matching weapon offer next restock, subject to progression. The resulting weapon is sold separately and is not reserved. One request per NPC may be pending. See the behaviour guide for payment receipts, retries, limits and all outcome rules.

Household refuelling uses Household.Refuelling: free residents occasionally visit public storage and supply one Wood/Resin to a low-fuel fireplace within home/20m. Merchant workplace maintenance uses the same enable setting but its assigned work radius. Only stationary, unwarded, server-owned fixtures and public, unused chests are eligible. Wardrobes, tombstones, private chests and ship storage are excluded; client-owned objects are skipped rather than forcibly claimed. Every delivery rechecks ownership, stock, capacity, proximity and obstruction. Stock remains at the source until synchronous delivery; interruption beforehand consumes nothing. There is no carried-item prop or crash-atomic multi-object ledger.

Workplace behavior, prices and dialogue

Merchants spend most of their shift at the post. Occasional errands have bounded routes/leases, a hard timeout, and a longer rest at the post after long trips. Opening a shop or talking pauses errands; shifts and danger still take priority. Tavernkeepers visit cooking stations/cauldrons/ovens/fermenters; Traders inspect public chests and workbenches; Blacksmiths use workbenches/forges, supply ordinary Wood to kilns and compatible ore/Coal to furnaces. Native crafting/reach gestures and brief cosmetic chest-lid openings are used, not invented production animations. Decorative work does not consume recipe ingredients or generate sale stock.

Blacksmiths collect up to three stationary, eligible loose metal bars per completed trip. Collection discovers accessible chests across the work area independently of the rotating fixture cache. When a chest already contains that metal, they only consider matching chests, nearest to the loose bars first, and path-check up to eight candidates. Full, unreachable or reserved matching chests mean no pickup; they retry later instead of mixing metal into unrelated storage. General storage is used only when no accessible chest in the work area contains that metal. More than 64 accessible chests pauses collection instead of selecting from an incomplete set; narrow the work radius in that case. Capacity and source identity are rechecked at delivery; two workers cannot reserve the same source/target. This is a modest upkeep routine, not bulk automation.

Prices are per item: Wood 1 coin, Resin 2, Flint 3, leather scraps 4, cooked boar 8, cooked deer 10, minor healing mead 22, medium healing 40, lox pie 65. Ores and processed bars cost more with progression and processing effort. Prices are fixed per catalog item in 0.7, not randomly fluctuating. Shops are sell-only. Requests bind the exact prefab, price, quantity and daily revision; rollover clears stale selection. Already accepted purchases keep their original terms, and late cancellations cannot add yesterday's items to today's stock. Player inventory is client-owned: ambiguous lost acknowledgements remain logged as sold, without unsafe automatic refunds; a server wallet/crash-recovery ledger is deferred.

NPC speech and wheel labels follow each viewer's Valheim language (Russian or English fallback). Technical/admin status text remains English. Remarks use actual consumed meal quality/time, visibly changed equipment, nearby observed ships/items/NPCs and recently departed named visitors. Ship lines do not claim something was newly built merely because it loaded. Memory is bounded and expires; contextual remarks have a 90-second cooldown and occur during Talk or existing NPC conversations, not constant unsolicited chatter.

Workplace fuel deliveries also maintain wood-burning ovens at half fuel or below, using one ordinary Wood per completed trip. Light sources use their configured Wood or Resin. Fuel storage is discovered across the assigned work area; chests must still be accessible and contain the actual fuel. Stalled work routes try up to two alternative approach points. Completed deliveries log the fuel and destination coordinates; visits and gestures alone do not consume fuel.

Residents pause for 1-3 seconds after conversations, with shorter work rests and counter dwell. New configurations default to 2-6 seconds of ordinary idle time; existing timing settings are retained. When accessible home/work storage contains fewer than five ordinary Wood or Resin, residents can ask for more, at most once every five minutes each. Speech bubbles are limited to 10 metres from your character. Cauldron work uses its native cooking pose, and walking residents yield to players.

Wardrobe access

Hold E and choose Open inventory (wardrobe), or run rpnpc_wardrobe Astrid while nearby. Only the single-player/listen-server host or a user authenticated by the server's Valheim administrator list is granted wardrobe access. Every wardrobe is a separate hidden persistent network object, so opening it does not transfer ownership of the resident or its AI. The hidden container is leased to the administrator only while Valheim's vanilla inventory UI needs it; the server remains the source of truth for the resident and reclaims the container afterward.

The wardrobe has eight slots. Every inventory change is normalized and synchronized into a server-held canonical snapshot, and close receives an explicit server acknowledgement. On close, timeout, or disconnect, the server restores the latest accepted snapshot rather than trusting the client's temporary container ownership. The first chest, legs, helmet, and shoulder item becomes the NPC's cosmetic outfit. Removing a slot type clears that visual. Other item types may be stored but are ignored by auto-equipping. Wardrobe clothing is the canonical source for these four visuals, so closing a wardrobe can overwrite clothing previously assigned by console commands.

Casual sitting and daily table meals

Bath visits are separate from ordinary sitting: 30-60 seconds in the tub, then a five-minute cooldown during the loaded session. Residents do not eat in baths. A visit requires a grounded standing/exit point outside the tub footprint; rpnpc_audit reports the bath timers and debug logs record entry/exit positions.

Residents can also sit at loaded barber tables during waking home time. The station must be within home, reachable and unoccupied; normal seat reservations apply. Barber visits use the native seated pose without opening the appearance editor, changing hair or eating there. They are excluded from work and social-area seating. Newly loaded stations enter the normal seat discovery cache (up to 90 seconds; rpnpc_seats refreshes immediately).

Russian speech uses the actual speaker and listener character models independently, including милый/милая, просил/просила and нашёл/нашла. Bystanders see the same addressed character regardless of their own model. Unknown listeners receive neutral wording. All clients and the server must use the same current version to decode the new speech context.

Residents normally choose the nearest reachable stationary chair slot, with occasional variation among similarly close alternatives. Each physical slot of a multi-seat bench is reserved independently. Residents walk to a tightly validated grounded approach, sit kinematically without gravity fighting the pose, and stand at that validated floor point before chair collisions return. Route validation asks Valheim for a complete route before validating its actual endpoint; when a player-built navigation tile is still being prepared, the resident retries briefly instead of permanently rejecting the furniture. A resident already safely beside a chair may use its current position. Random player-style idle fidget variants are suppressed, and resident/player body collisions are enabled. A due meal never causes a resident to walk directly to food or seek out a chair. Ship-mounted chairs are ignored.

Once per Valheim day, during daytime, an already-seated resident looks for genuine solid food within 2.1m of the chair. Supported sources are food physically placed with Valheim's vanilla Serving Tray/Feaster placement tool, a stocked vanilla Feast platter, and food attached to a horizontal item stand (itemstandh). If no food is within seated reach, the resident simply finishes the casual sit and tries again during a later sitting opportunity. After a successful serving, the dinner sit varies with the schedule, normally lasting roughly 75–210 seconds.

Meads, potions, drinks, non-food consumables, vertical/all-orientation stands, chests, loose dropped items, and food beyond seated reach are never selected. Directly placed food must be a real networked ItemDrop piece created by the vanilla placement system. The meal is counted only after the food object's owner confirms consumption. Reservations prevent two residents from using the same chair or successfully consuming the same serving.

The debug overlay reports state, destination, destination distance, requested locomotion, Valheim's actual GetWalk/IsWalking/IsRunning flags, and horizontal speed. Household paths remain within the home radius, allowing a 0.15m NavMesh tolerance; profession commutes use the separate home-to-work travel area. A home/radius edit cancels stale movement immediately.

Configuration

Section Key Default Runtime bounds
General DefaultHomeRadius 10 2..50m
Workplace DefaultRadius 50 5..100m; persisted per resident, override with rpnpc_setradius_work
Movement WalkSpeed 1.6 0.5..4m/s
Timing IdleMinSeconds 5 minimum waiting time 0.25s
Timing IdleMaxSeconds 20 minimum waiting time 0.25s
Timing WanderMinSeconds 5 legacy/manual-walk timeout key
Timing WanderMaxSeconds 30 manual-walk/return timeout key
General Invulnerable true boolean
Debug DebugLogging false boolean
Commands CommandTargetRange 12 0.5..100m

Reversed minimum/maximum timing values are tolerated. Non-finite numeric values fall back to finite defaults before clamping.

The server's configuration controls authoritative resident simulation. Client copies still provide local command targeting and debug-overlay settings, so keep the same configuration where predictable administrator tooling matters.

Compilation and extracted-decision reviews pass against the installed game. Live route, animation, store rollover, mixed-language multiplayer, interruption and save/reload gates remain to be run together in TEST_PLAN.md. Version 0.8.19 remains a playtest build; those live gates have not been certified by automated checks.

Scope

Branching dialogue, combat, gathering, player following, regional weather and ship-arrival reactions remain out of scope. Counter trading, seated gambling, role-specific speech, raid interruptions and bounded unlocked-door interaction are implemented. See REFERENCE_ANALYSIS.md for the original source/API review.

0.6.2 verification

Use the changed scenarios in IMMERSION_REVIEW.md during the planned full audition. No live pass is claimed. Verify off-counter rejection, Patron seat priority and 90-180 second visits, bounded door attempts, long detours, local raid interruption/resumption, purchase cancellation and ambiguous-disconnect logging. Regional weather, ship events, a server wallet, crash-safe transactions and cinematic player locking are deferred.

Consistent radius and hours commands (0.7.5)

rpnpc_setradius_home 40 Lola
rpnpc_setradius_work 50 Lola
rpnpc_setradius_social 20 Lola
rpnpc_sethours_work 08:00 19:00 Lola
rpnpc_sethours_social 19:00 21:00 Lola
rpnpc_sethours_sleep 22:00 06:00 Lola

These change the named resident's settings on the server. Assign the area centres separately with rpnpc_sethome, rpnpc_setwork, and rpnpc_setsocial. Social hours require a social area. Overnight hours are supported; overlaps resolve as sleep > social > work > home. Legacy radius/hour aliases were removed in 0.7.11. Use rpnpc_sethours to change both work and sleep windows together.

While asleep, residents answer deliberate Talk or new profession actions with a short localized sleepy reply, at most once every 10 seconds per resident across all players. They stay asleep and do not start a new service. Ambient speech remains silent; existing payment receipts still resolve.

Household upkeep also lights switched-off, fueled candles during waking free time. The existing [Household] Refuelling setting controls this alongside fuel deliveries. Checks occur every 60-120 seconds within home and at most 20m from its centre. Residents walk to the candle and recheck its state before lighting it; already-lit, empty, warded or non-server-owned candles are skipped. Work, sleep and social time interrupt the task. No wax/fuel is created or spent, and rain/blocked-burning conditions are not overridden.

Administrators can inspect an NPC's unresolved stock quote with rpnpc_stockpayment [name]. Compare its player, token, world, material and amount with the payer's rpnpc_payment receipt. Preserve both saves for ambiguous debits; quote expiry alone does not prove whether payment happened. Retry using the original player/NPC/world when the receipt state allows it. These commands only inspect records and never clear, refund or debit them.

Residents without a profession occasionally talk about learning fishing, smithing, trading or running a tavern. These English/Russian wishes appear during Talk and eligible ambient remarks, stop after a profession is assigned, and do not automatically change the resident's profession.

Tavern cooking and daily menus (0.8.19)

A tavernkeeper working at a lit cooking stand can hang a decorative boar/deer/neck meat, wait its normal cooking time and collect it. This is a visual routine: it does not consume supplies or create sale stock. The display is not a collectible item, leaves real food untouched, and clears on interruption or a player using its position. Fueled ovens use the same routine with native bread or lox-pie models; cauldrons keep their crafting pose. Home kitchen errands use the same full cooking/baking routine for all residents, when a usable fixture is nearby inside home radius.

At the next daily restock, grilled meat and baked foods require a loaded, accessible cooking station with the corresponding native conversion inside the assigned work radius. A suitable oven permits occasional bread and lox pies; suitable stands permit roast lox. Boss progression still controls availability. Existing daily stock is preserved until restock, including pending purchases. Other food/mead catalog rules stay the same. Shop greetings and on-duty conversation may mention dishes actually remaining in stock; sold-out dishes are excluded. New lines support English/Russian. Native visuals and multiplayer replication still need live testing.

Relationships and wellbeing: Chronicle > Relations offers Auto and Fixed relationships, three-segment bond/happiness displays, and admin-only spouse assignment (NPC or player character). Auto relationships can develop friendship or rivalry over time; Fixed locks the type while feelings still change. The interaction wheel includes a direct mood question; NPC social conversations can discuss known unhappy residents. See NPC_BEHAVIOUR.md for tuning and observation limits. Relationship dialogue text is in content/relationship-dialogue.json and embedded when built.

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