BestAutoSort
Standalone storage mod: shared chests, quick-stack, restock, rules, crafting from chests, autofeed, upgrades, sort.BestAutoSort
![]()
Standalone storage mod for Valheim (GUID dev.maks2204.bestautosort).
Updated and tested for Valheim 1.0.12.
- Shared chests: every player can open the same chest at the same time, no lockouts
- Quick-stack: hotkey moves matching items into nearby storage
- Lock and restock: Alt + left-click cycles an item through Locked → Replenish → Nothing
- Storage rules: per-chest item/category filters, presets, reserves
- Crafting and building: materials from nearby chests within radius
- Fuel and ingredients: machines, cooking stations, kilns, smelters, fermenters pull from nearby chests
- Animal feeding: hungry tame animals fed automatically from nearby chests
- Chest upgrades: wooden → Reinforced / Black Metal / Grausten tiers, contents kept
- Sort and trash: LeftAlt + S sorts the open chest, Trash button deletes
Notes:
- Own plugin folder (
BepInEx/plugins/BestAutoSort/), own config (dev.maks2204.bestautosort.cfg). - Console command:
bestautosort. - All players + server must run the same version (exact-match hello gate).
0.6.x server authority: the
0.6.x-Dedicated-Testline makes the server/host the permanent owner of eligible chests (option-B ZDO manager: Take / Add / Move / Sort / UpgradeRequest / Destroy served server-side — validate → apply → Save() → revision → respond; upgrades charge target-minus-current with pocket refunds). Live-verified single-peer (Accepted end-to-end, incl. upgrades with marker/dims/look). The multi-peer invariant is not yet claimed (2-player flow, hammer destroy on the run, autofeed soak pending). Mode/hello gate: peers must match onversionANDauthmode (version;auth=N); mismatched peers are rejected. Vanilla (mod-less) clients are unsupported for managed chests (view-only grant at best; local vanilla takes fork ghost items). Remote chest upgrade runs only via the server-mediatedTxOp.UpgradeRequestcontract (legacy direct-upgrade frames refused); seedocs/remote-upgrade-mediated.mdincluding its 4 documented residuals.
Multiplayer protocol (ChestTX)
+----------------+
| ONE CHEST |
| ONE OWNER | <- ZDO owner = SERVER, permanent, never migrates
| ONE TX | <- validate -> apply -> Save() -> revision -> respond
| AT A TIME | (per-chest serial queue, main thread)
+----------------+
Details: docs/CHEST_TX.md.
Actors & channels
+----------+ TxRequest +----------------------+ TxResponse +----------+
| CLIENT | -----------> | CHEST ZNetView | -----------> | CLIENT |
| (any peer| (no target: | (engine routes the | (targeted | (same |
| incl. | straight to | packet to the ZDO | at the | peer) |
| server) | the owner) | owner = SERVER) | requester) | |
+----------+ +----------------------+ +----------+
TxFlights (target 0 = broadcast, loopback included) ----------> EVERYBODY
MultiUserHello (version string, exact match) -----------------> EVERYBODY
Packets (ZPackage, nested)
| Packet | Layout |
|---|---|
| Request outer | [txId:long] txId = peerId<<32 | counter + [body:ZPackage] |
| Request body | [proto:int=2/3] [op:int] [baseRev:uint] [playerId:long] [actorPos:vec3] [enforceRule:bool] [respectReserves:bool] [op-body...] (+ v3 trailing [isTransientRetry:bool]) |
| Response | [txId:long] [status:int] [revision:uint] [totalsOnly:bool] [body:ZPackage] |
| Take body | [count:int] then per entry [prefabHash:int] [item:ZPackage] [accepted:int] |
| Add body | [count:int] then per entry [accepted:int] |
| Item snapshot | [prefabHash] [itemPkg] [amount] [x] [y] [maxStack]; itemPkg = ItemData.Save (quality/variant/durability/stack/crafter/customData/world/gridPos) |
| Ops | Add / AddBatch / Take / TakeBatch / Move / Sort / Upgrade (legacy direct frames refused on managed chests) / UpgradeRequest (server-mediated, v3) / SetRule / ViewerOpen / ViewerClose / Query |
| Statuses | Accepted / Partial / Rejected / Duplicate / UnknownTx / TransientUnavailable (v3, non-terminal: retain same txId, never terminal-forget) |
Take one stack (GUI drag)
Deposit batch (quick-stack, per chest)
Viewers (many GUIs, one chest) + feeding
Install
- Install BepInExPack Valheim
- Drop
BestAutoSort.dllintoValheim/BepInEx/plugins/BestAutoSort/
Build from source
# Game path (if not D:/SteamLibrary/steamapps/common/Valheim)
$env:VALHEIM_INSTALL = "D:/SteamLibrary/steamapps/common/Valheim"
# Debug build + auto-deploy to the game
dotnet build BestAutoSort.csproj -c Debug
# Thunderstore release zip
.\package.ps1
See DEV.md.
