ChestButler
Dump-and-sort chests: flag a chest as a Sorter and loot flies to the right chests. One-press Organize tidies the whole base, station-aware: metals by the forge, ore+coal by the smelter. Pin filters, Pull restock. Multiplayer-safe via MultiUserChest.Changelog
1.1.2
Maintenance release: correctness and performance fixes found by a full source audit. No new features, no config migration needed. Cross-compatible with 1.1.x, so it deploys as a normal patch.
Fixes that can affect your items
- Organize could run twice at once (pressing it on a second sorter while the first run was still going). The two runs could not see each other's in-flight moves and could both issue a transfer for the same stack. Only one Organize run at a time now.
- Organize could over-fill a destination chest: it re-checked free space per move but never counted what it had already promised that chest in the same run, and in-flight transfers are not reflected locally. It now tracks its own promises.
- Organize never checked that a source chest still existed. A chest destroyed or unloaded mid-run left a window where a transfer was issued against a dying chest. Both endpoints are validated now.
- Organize now reports what it could NOT move ("N could not move") instead of silently dropping those moves and reporting success.
Performance
- A sorter chest holding items with no home did a full base-wide scan for every one of them, every tick, forever — the most expensive path in the mod on a large base. Unroutable item types are now remembered for 10 s before being retried.
- The sorter tick no longer runs at all on a dedicated server, where it could never do anything (routing needs a local player for the access and ward checks) but still paid for the scan.
- Filter/sign lookups were cached for only 3 seconds and re-resolved by scanning every sign and every chest. The cache is now invalidated on the events that actually change it (editing a sign, changing pins, unloading a chest) and lives longer.
- Item-name matching is ordinal instead of culture-sensitive, wildcard tokens are parsed once instead of per comparison, and normalized names are memoized.
- Organize's per-frame move budget is now also capped in real time, so a high-refresh-rate client no longer sends proportionally more traffic to the server than a 60 fps one.
- Station tracking no longer rescans everything on each registration, and the per-chest station log moved to Debug (it was one synchronous log write per chest per Organize); the "unmapped station" hint is now logged once per station type instead of once per chest.
- The chest spec cache is dropped when a chest unloads, instead of accumulating an entry per chest per zone reload for the whole session.
Consistency
- Chests at exactly the same distance are now ranked by a stable id, so a symmetric storage hall routes the same way every session. Same for a chest sitting equidistant between two crafting stations.
- Group precedence is now explicit and documented in code. Some items match two groups in the default config (FlametalOre matches both
oresandmetals), which was previously resolved by dictionary order. - A
[Stations]mapping that points at a group name which does not exist in[ItemGroups](a typo, or a renamed group) now logs a warning instead of silently attracting nothing. TransferInterval's minimum is now 1 s (was 0.2 s). The default was already 1 s; only settings that were never safe on a large base are removed.
Known, not fixed here — see docs/known-issues-1.1.x.md: a chest opened by another player is invisible to us (m_inUse is a local field), so Organize can still take ownership from someone browsing a chest; and the sorter radius default of 128 m may exceed the distance at which chests are actually loaded. Both need changes that are out of scope for a patch.
1.1.1
- Dependency pin updated to Jotunn 2.29.2 to match the server (no gameplay changes)
- Default sorter/Organize radius raised to 128 m (max raised to 128). Existing config files keep their saved
Radius; on a server the admin value is authoritative and syncs to clients, so set the server'sRadiusto 128 to apply it for everyone
1.1.0
- New Organize button on Sorter chests: one press sweeps every accessible chest within the sorter radius (32 m by default) and consolidates each item type into its best home, in place — you carry nothing
- Previews first ("Organize: move N items across M chests — press again to confirm") and only runs on a second press within 5 seconds; closing the chest, opening another, or the timeout cancels it
- Routing priority per item type: a chest that pins/filters it, then a chest whose adjacent crafting station attracts its group (forge → metals/ores, workbench → wood/hides, stonecutter → stone, cauldron → cooking/meat/seeds, black forge → metals/valuables, galdr table → valuables/meads), then the chest already holding the most of it; otherwise it stays put
- Tools and armor (non-stackables) stay where they are unless a chest explicitly pins them
- Station adjacency also covers processing pieces: smelters and blast furnaces attract ores + fuel (new
fuelitem group with coal), fermenters attract meads; kilns, eitr refineries and cooking stations are detected too (add mappings in config if wanted) - New server-synced
[Stations]config section maps station names to item groups (editable; add modded stations via theCustomStationsentry — the log prints every detected station token); new[Organize] MovesPerTickandStationRangesettings - CAVEAT: windmills are not detectable (no station identity in game code) — pin a chest for barley/flour instead
- Default sorter/Organize radius raised from 20 m to 32 m (existing config files keep their saved value — edit
Radiusin the cfg to adopt the new default) - Fixed the
oresgroup never matching metal scraps (the in-game tokens are singular: ironscrap, bronzescrap, copperscrap) and wrongly claiming leather scraps via the old*scrapswildcard — existing config files keep their saved pattern; delete theoresline under[ItemGroups](or paste the new default) to adopt the fix - This is a minor release: server and all clients must update together (a 1.1.0 client is refused by a 1.0.x server, and vice-versa)
1.0.2
- Rewrote the Thunderstore page: quick start, clearer install/multiplayer instructions, config table, compatibility notes, FAQ
- Chest UI buttons now match the vanilla Take all / Place stacks style and anchor to the panel's bottom-left corner
- Docs no longer mention sign labels (that path stays in the code but is undocumented for now)
1.0.1
- Mod ID changed to eksolutions.chestbutler (config file is now BepInEx/config/eksolutions.chestbutler.cfg; settings reset to defaults once)
- Server and all players must update together, older versions are refused at connect
1.0.0
- First public release
- Sorter chest toggle with tiered routing: pinned filters, then groups, then chests that already hold the item
- Consolidation (fullest chest wins ties) and partial fills
- Pin / Auto / Manual / Clear / Pull buttons in the chest UI
- Sign labels (
sort: ...) with groups, wildcards, priority and off - Server-synced config including editable item groups
- Same-version check for server and clients at connect
