ModerWarehouse
Server-only Valheim warehouse with multilingual sorting, REQ target stock, typo suggestions, category and refill chests, validated multi-warehouse lookup, automatic labels, and interactive stock and statistics boards.Changelog
2.0.3 - 2026-10-21
Performance follow-up from the first 4Net measurements of 2.0.2.
- Arriving at a base no longer triggers a full-world topology scan (240-270 ms on 4Net): the global validation now remembers every IN marker in the world, not only the loaded ones, including while a base is still loading.
- The first cycle at a freshly loaded base waits at most 3 s while chest inventories are decoded a few milliseconds per frame instead of all at once (70-160 ms on 4Net). In the LAB, arriving at the bases now costs 82 ms instead of 339 ms.
- Global REQ stock queries use a world index of signs and chests plus a per-chest decode cache instead of walking every world object (440 ms on 4Net, 157 ms in the LAB on first use); a full scan still runs at least every 30 minutes.
- One spelling per warehouse in logs and diagnostics (no more "HB" next to "hb").
- The performance-revision log line and the assembly metadata follow the build id.
2.0.2 - 2026-10-20
Maintenance release: faster cycles, correctness fixes and removal of obsolete code. No world migration is required; existing statistics, labels and boards carry over.
Performance
- Warehouse cycles with an awake board dropped from about 110 ms to about 45 ms in the LAB (567 storage chests); ZDO keys are pre-hashed, chest lookups memoized per cycle and the spatial index no longer allocates per probe. Sign and label text parsing is memoized, item aliases are computed once per item type, container events only dirty warehouses whose radius contains the change, and a quadratic blank-sign scan was removed.
- Walking between bases no longer triggers 300-600 ms full-world topology rescans.
- Statistics history is kept in memory and written at most once per minute (and before every world save) instead of after every transfer.
Fixes
- Bars, ores and scrap no longer share German extra names (Kupfer/Kupfererz, Eisen/Eisenerz, Silber/Silbererz, Schwarzmetall/Schwarzmetallschrott).
- A withdrawal delivers exactly one item type even when the game gives two items the same name (German Harz, Stein, Irrlicht); target lists count the same way. Current item names win over legacy prefab names (Flametal).
- Target-stock commands accept every keyword a sign displays in any language
(SOLL, TARGET, OBJECTIF, OBIETTIVO, FINAMIRA, ...). English
TARGETlines were also processed as a withdrawal of "TARGET <item>". - Requests without an OUT chest show a clear message instead of being retried every scan without feedback.
- Several signs at one chest are checked individually: identical signs work, contradicting signs still never create mixed storage.
- Chests a player has open stay in stock, capacity, boards and statistics.
- The network page lists every accepted warehouse, with last-known stock for bases that are not loaded.
- Statistics keep daily totals for 365 days (item details 90 days); the period can be
set from 1 to 365 days, records span the whole year, and
TRACKED SINCEshows the permanent start day including the year. - Signed chests holding internal or cheated items are reported in the log; nothing is deleted.
- Released DLLs no longer embed the build machine path.
New
- Category labels (ERZ/ORE, BARREN/BARS, ESSEN/FOOD, MET/MEADS, MUNITION/AMMO, TROPHÄEN/TROPHIES, WAFFEN/WEAPONS, RÜSTUNG/ARMOR, WERKZEUG/TOOLS, FISCH/FISH).
- Catch-all SONSTIGES/MISC chest as last resort, refiled by the janitor.
- NO ROOM notice on the stock board, red chest counter and a log line when items find no place.
- Refill chests: [WH:<id>:FILL] Kohle 50 keeps any chest in the radius stocked.
- Compaction of item types spread over several chests; freed automatic labels return to "...".
- Capacity forecast (chests per week, days until full) on the trends page.
- Daily statistics CSV per warehouse, written on every world save.
- Boards show INACTIVE with the reason when a warehouse cannot run, instead of freezing; the reason is logged once.
Removed
- Pre-2.0 migration code that a world census showed had nothing left to migrate.
- The
AutoLabelDelaysetting: since 2.0 every storage chest has an opt-in sign, so labels always reuse that sign and the delayed new-sign path could not run.
2.0.1 - 2026-10-03
- Empty managed chests can be released for reuse by changing their sign to
...; the old automatic item name is no longer restored. - Added warehouse-bound numbered automatic labels such as
HOLZ1andHOLZ2. Lower numbers are filled first and higher numbers are emptied first. Only labels already managed by that warehouse interpret the small displayed suffix as a priority, so unrelated numbered signs are ignored. - Reduced synchronous server stalls: unchanged global warehouse topology now receives a 30-minute safety validation instead of a five-minute full-world pass, while local IN changes still invalidate immediately.
- Coalesced global read-only REQ stock scans for ten seconds. Reused results retain their timestamp instead of being reported as newly read LIVE data.
- Added the explicit startup build ID
4net-20261003for log verification.
2.0.0 - 2026-09-26
Final feature release. Future updates are expected to focus on bug fixes and game or dependency compatibility.
- Added globally unique warehouse identities, minimum-distance validation and clear, localized rejection reasons while protecting already registered warehouses.
- Duplicate IN validation now persists the accepted marker identity and leaves the IN marker text untouched; rejection details are shown on its linked help sign instead.
- Added linked-group rename migration for REQ, INFO, help, BOARD and STATS signs, generated board cells, runtime state and warehouse statistics.
- Added read-only world inventory lookup for REQ suggestions, including explicit live, timestamped last-known and unknown freshness states; remote items are never moved.
- Added typo-tolerant item suggestions on the large stock board, with highlighted item names, paging and automatic return to the normal board.
- REQ results now return within at most eight seconds to unmet target stock or the localized neutral prompt when all targets are met.
- Made stock/statistics sleep colours follow translated word length in every loaded language; restored the default three-second board rotation and retained the responsive warehouse scheduler.
- Warehouse network pages are informational summaries; inventory and movement history remain separated by warehouse.
- Enforced explicit storage-sign opt-in throughout local sorting, storage displays and
persisted world-stock reads: ordinary chests without a label or blank
...sign are ignored. Remote warehouse requests remain read-only and never transfer items. - Reduced synchronous global REQ lookup work with spatial sign-to-container matching and by decoding only signed storage inventories inside valid warehouse radii; remote stock remains informational and is never transferred.
- Declared YamlDotNet 16.3.1 directly for optional JSON translation files; the shared library remains a separate dependency and is not bundled in the Warehouse package.
All notable public changes to Moder Warehouse are documented here. Private laboratory iteration notes are maintained separately and are not public release entries.
1.2.1 - 2026-09-20
- Changed IN safety filtering to be non-destructive: internal, cheated and otherwise invalid items remain in the player-facing IN chest and are ignored by sorting.
- Kept automatic cleanup for forbidden items found in managed storage containers.
- Prevented rejected custom or unknown prefabs from poisoning later legitimate IN transfers through stale live-container state.
- Added a separate one-metre storage-label association radius while retaining the three-metre functional-marker radius for IN, OUT and control signs.
- A blank
...sign directly at a chest now supersedes an obsolete hidden label that the mod previously generated for the same chest. - Fixed automatic labels being placed behind vanilla chests. New labels use the decorated oval side, and previously generated back-side labels migrate once.
- Added housekeeping for genuine items manually placed in the wrong labelled storage chest. They are safely refiled and every move logs item, amount, source and target.
- Stock and statistics boards now wake when a player approaches any of their 16 signs, rather than measuring only from the bottom-left anchor.
1.2.0 - 2026-09-20
- Added an optional automatic 4x4 statistics board using
[WH:<id>:STATS]. - Added rolling daily movement history with automatic pruning after 90 days and no player identity tracking.
- Added four statistics pages for period totals, comparisons, trends/forecast and dated records.
- Added interactive period and page controls, including freely selectable periods from 1 to 90 days and automatic return to rotation after 60 seconds.
- Added a combined control sign below the board for commands such as
27 TREND,30 3,HEUTE UEBERSICHTandAUTO. - Added safe migration of the earlier 3x3 statistics prototype to the final 4x4 layout while preserving recorded history.
- Added clear insufficient-data reporting for projections instead of presenting immature forecasts as reliable results.
- Fixed item routing collisions caused by one label being contained in another name,
such as German
SteinmatchingBernsteinorHolzmatchingEdelholz. - Automatic labels now route by their persisted internal item id. Ambiguous manual
translations such as German
Harzrequire a matching sample item in the chest, preventing the server from guessing between distinct item types. - Fixed the stock board and visit-difference snapshot failing when two distinct item
tokens share the same localized display name, such as two English
Clubentries. - Added a safety filter for Valheim's persistent per-item
m_cheatedmarker. Cheated items are rejected at IN with a visible red board message and removed from managed storage without touching legitimate items in the same chest. - Added protection against internal attack, boss-ability, developer and cheat prefabs that technically expose ItemDrop data but are not real player inventory items.
- Added
[WH:IGNORE]as an explicit quarantine escape hatch: ignored containers are never scanned or cleaned by the safety filter. - Fixed persistent automatic labels becoming associated with a merely nearby chest while their originally linked chest was temporarily unloaded.
- Validated blank automatic assignment and routing against a 1,081-prefab laboratory run, followed by a physical per-container inventory audit.
1.1.0 - 2026-09-18
- Added maintained English and German interface localization.
- Added global
Languageconfiguration and per-warehouseLANG=overrides. - Added external JSON translation files with English fallback and a generated template.
- Added English and German item-name lookup for deposits, requests and target stock.
- Automatic chest labels now follow the selected warehouse language while manually written signs remain untouched.
- Existing linked automatic labels are migrated safely when their origin can be identified.
- Fixed target-stock shopping lists overwriting newly entered withdrawal requests and their result messages.
- Preserved server-side request transfers and automatic labels across restarts.
1.0.0 - 2026-09-18
- First public release candidate.
- Server-only sorting from one input chest into nearby storage containers.
- Safe multi-player input ownership and open-container protection.
- Output requests by German, English or internal item name.
- Persistent multi-item target stock lists with coloured status.
- Interactive rotating 4x4 stock board with filters, pages and sleep mode.
- Delivery confirmation and changes-since-last-visit display.
- Capacity warnings and live warehouse information signs.
- Persistent automatic labels for homogeneous storage chests.
- Administrative markers for ignoring containers and removing generated signs.
