RunicInventory
Labeled native-row equipment and quick slots, automatic empty-role equip, lossless armor swaps, locks, safe sort, and pickup controls for Valheim.Changelog
1.0.0 - standalone runtime architecture
-
Removed mandatory Foundation runtime dependencies (Runic Core, Persistence, and Transactions) without changing the mod version or player topology metadata.
-
Replaced the suite-global mutation gate with one short-lived per-mod mutation scope around native owner-local operations.
-
Removed the durable journal, recovery bridge, quarantine, and cross-mod transaction service.
-
Added a tiny optional reflection API for item-protection consumers; Inventory remains independently installable and consumers continue without it.
-
Kept every gameplay mutation on the native owner-local character inventory path.
-
Added subtle in-inventory labels and an outline for the five equipment roles and three quick roles; no quick-slot HUD is drawn during gameplay, and the diagnostic panel now defaults off.
-
Added empty-role pickup/crafting placement with native equip, plus exact lossless position swapping when the player manually equips a replacement for an occupied armor, cape, or utility role.
-
Fixed ordinary armor replacement falsely entering
MigrationSafeCompatibilitywhen Valheim raisedInventory.Changedafter equipping but before the postfix could relocate the new item. Equipment changes now use an exception-finalized deferred-refresh boundary, genuine role-content failures name the first offending role/item, and a corrected authoritative row reactivates automatically. -
Added Left Alt + right-click as the primary in-inventory lock toggle while keeping the configured Alt+L action as a fallback.
-
Anchored Helmet, Chest, Legs, Cape, Utility, and Quick 1-3 labels and yellow borders to Valheim's exact eight native bottom-row elements.
-
Restored authoritative topology automatically after transient belt/equipment drag states and corrected carried-item protection proof to compare the fresh native item references rather than requiring two separately returned item lists to be the same list object.
-
Made slot lock toggles silent and represented each explicit lock with a bright yellow outline.
-
Yielded the bottom-row overlays whenever a native inventory modal is visible and allowed protected equipment through the exact workstation repair call without weakening protection elsewhere.
1.0.0 — 2026-08-22
-
Implemented Core's provider-neutral
inventory.durable-operationscontract with an independent checksummed atomic local journal, reconnect lock, exact Local-profile current-primary readback, provider-owned profile-source classification, and server-led Cloud/Legacy outstanding-operation adoption. Cloud completion requires an exact account/world/token/manifest/receipt binding plus a later direct session's first pre-mutation provider-recomputed inventory fingerprint; same-session and third-state evidence remains quarantined. -
Added bounded cloned exact-manifest recovery for an owning consumer after restart, with explicit corrupt, file/mirror-conflict, foreign-owner, mismatched-operation, and terminal denial.
-
Replaced Storage's process-only catastrophic rollback flag with a real
IndeterminateInventory crash journal. The three-argument hold seam now succeeds only after an atomic independent flush, exclusive readback, and exact Player mirror; its manifest binds the profile/player identity, failure boundary, and captured/current inventory fingerprints. Disposal and restart retain the quarantine, and 1.0.0 deliberately provides no automatic clear without independent recovery proof. -
Split startup into an early durable safety plane and a later convenience-feature plane. A protocol failure retains native evidence enforcement, while a compatible Core publishes a minimal module plus durable-operation recovery service before topology, gameplay-service, binding, and UI admission. Any later startup or cleanup failure disables new gameplay admission without withdrawing that recovery service, disposing a previously loaded journal runtime, unpatching its native Inventory/Player/death-and-grave guards, or stopping recovery ticks. With no durable evidence, degraded startup continues to yield ordinary vanilla inventory behavior; only final shutdown tears the recovery bridge and safety plane down.
-
Added a bounded provider-owned opaque-state forecast seam for cross-domain intents. Forecast bytes are defensive and side-effect checked, callback/reentrancy faults fail closed, and forecast never substitutes for the separately persisted
TryCaptureLocalPreparedobservation. -
Hardened the independent journal to an exact trusted-root child with reparse-point denial before and after publication, exclusive bounded reread, backup-free atomic replacement, exact-delete identity, and preserved
.new/.bak/.delforensic evidence on every uncertain cut. -
Preserved vanilla death during an unresolved operation:
CreateTombStoneis never suppressed; an exception-finalized exact system-transfer scope journals the spawned grave identity, inventory fingerprint, stable-token evidence when already present, operation-tag counts, and current direct-server session digest. Cloud custody completion requires a different later session; a missing capture-session proof remains locked for server recovery. Added a provider-neutral durable server custody-recovery proof for the crash-before-local-capture cut, requiring the exact issued token/account/world/receipt, conservation evidence, one unique tagged grave, and a later observation session. -
Added an all-or-nothing native bottom row with five equipment roles and exactly three manual quick roles.
-
Kept every item inside Valheim's native inventory; no extra capacity, weight change, stack multiplier, item clone, or secondary item serialization.
-
Added bounded digest-protected slot locks, locked-stack routing, and registered high-level drop, deposit, use, exact upgrade, processing, display, and sacrifice guards.
-
Added deterministic safe regional sort with hotbar/equipment/quick/lock preservation and exception rollback.
-
Added bounded event-driven pickup overflow/encumbrance preview, reserved-row-aware capacity checks, and an exact deny filter with quest-item bypass.
-
Published copied immutable
inventory.topology, legacy coordinate locks, the Core 1.0.0IItemProtectionQueryunderinventory.item-locks, and truthful status services. The typed query proves exact current local membership, protects the full special row, returns false/Unknownonly for NotApplicable external evidence or an explicitly disabled provider, and returns true/Unknownfor unsafe in-domain evidence. -
Added owning-local-player authority for solo, listen-host, and remote dedicated clients. Native player-inventory topology, sort, quick-use, equip relocation, and lock persistence no longer incorrectly require
ZNet.IsServer; non-owner and headless paths remain read-only. -
Corrected headless-client admission so
Application.isBatchModeis never treated as gameplay authority: an exact owningPlayer.m_localPlayerremains eligible on an automated dedicated client, while a true dedicated server with no local Player remains inert and fail closed. -
Added migration-safe dimension/digest/role mismatch behavior with no automatic item movement.
-
Added continuous live-dimension/host-authority revalidation, canonical-location proof for already-equipped gear, deterministic peer patch ordering, and pre-vanilla locked armor-source denial without blocking canonical reload re-equip.
-
Removed the private-reflection/manual-Harmony Storage guard. Storage, Safety, and Interaction consume the Core-owned typed item-protection contract without Inventory reflecting or patching their internals. Storage 1.0.0 is now truthfully a downstream hard consumer of Inventory's separate durable-operation service; Inventory itself still does not hard-reference Storage.
-
Corrected the optional item-protection contract so an explicitly disabled Inventory provider returns NotApplicable before inspecting a player item; Interaction and other optional peers now yield to vanilla transfers while Inventory is disabled, while migration/authority uncertainty remains fail-closed.
-
Closed the complementary lifecycle gap: while Inventory is enabled, any native item queried while the provider is disposed, loading/rebinding, or missing its Player/Inventory now returns in-domain
Unknown. Only explicit disable or bounded exact membership absence can yield NotApplicable, so consumers cannot mutate through a transient unavailable provider. -
Made disabled-topology metadata cleanup sticky across mutation-gate contention, ticks, rebinds, configuration changes, and restart. Inventory now stays fail-closed until the owning local player commits the exact removal, then publishes clean
Disabledstate without requiring another toggle. -
Separated runtime configuration/disable cleanup from optional keybinding refresh. Cleanup now runs first, and failures in either phase are reported and failed closed without suppressing the other.
-
Added bounded once-per-reason verbose diagnostics for every typed item-protection outcome and indeterminate branch without logging item identity, contents, coordinates, or custom data; added direct healthy exact-member
Locked/Unlockedand foreign-item NotApplicable regressions. -
Invalidated cached controller
ButtonDefpaths and active input reservations on Valheim layout-change events, with symmetric shutdown unsubscription. -
Replaced the new-install Quick 1 controller default with layout-independent
JoyMapand normalize only the exact untouched legacy controller set to that route in memory. This closes Valheim Alternative 1'sJoyAltKeys/JoyLBumperleft-shoulder alias without rewriting customized files. Controller validation is now route-local, same-path map/chat aliases remain suppressed, Core registers the actual effective legacy route, and cached steady-state input ticks allocate nothing. -
Declared the exact Runic Core 1.0.0, Runic Persistence 1.0.0, and Runic Transactions 1.0.0 release floors used by the compiled contracts.
-
Added lossless death, tombstone, logout, disable, upgrade, abrupt-uninstall, installed-IL, crash-cleanup, and 100/1,000/10,000 performance regressions.
