Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
BestAutoSort
Standalone storage mod: shared chests, quick-stack, restock, rules, crafting from chests, autofeed, upgrades, sort.
| Last updated | 9 hours ago |
| Total downloads | 6547 |
| Total rating | 5 |
| Categories | Mods Tweaks Crafting Server-side Client-side Building AI Generated Deep North Update |
| Dependency string | maks2204-BestAutoSort-0.6.28 |
| Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
denikson-BepInExPack_Valheim
BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.
Preferred version: 5.4.2350README
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.