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.
RustyHeathensWarSaddle
Jo-bags for normal and summoned moose. Animated leather saddlebags, server-controlled storage up to 32 slots, and item drops on normal death or native unsummon. Press K to open.
| Date uploaded | 2 weeks ago |
| Version | 1.0.3 |
| Download link | RustyLaserGaming-RustyHeathensWarSaddle-1.0.3.zip |
| Downloads | 10 |
| Dependency string | RustyLaserGaming-RustyHeathensWarSaddle-1.0.3 |
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.2351README
Rusty Heathens War Saddle
Give your tamed moose Jo-bags: leather saddlebags with persistent storage. Rounded bags, stitched flaps, leather straps and metal buckles follow the saddle as your moose walks, runs and bends to eat.
Uses the ordinary moose saddle. Built for the Rusty Heathens community.
New in 1.0.3 — summoned moose
Jo-bags now supports the Spirit Caller summoned moose (Moose_spiritcaller) as well as normal moose. The moose must still be tamed, saddled and alive, with no rider when opening the bags. Use K as before.
Native unsummoning drops bag contents on the ground at the moose's location before it disappears, including the native distance, logout and summon-limit removal paths that use the unsummon RPC. Contents do not transfer to the next summoned moose. If loading or dropping an item fails, owner-side removal is delayed and retried. A real death takes priority over a pending dismissal. Ordinary scene unloading does not trigger drops.
Forced deletion by console or another mod bypassing native unsummon is not covered. World rollback, crashes, and separately restored character/world saves are not made transactional by this change.
Update War Saddle on the server and every client, replacing 1.0.2 and keeping the existing config. Keep only one active DLL. This version keeps the existing storage keys and capacity protocol.
This test build compiled against the supplied Valheim 1.0.21 assemblies with no warnings or errors. Passed 11,164 policy/mesh assertions and 12 simulated capacity handshake checks. The compiled unsummon hook and current game method signatures were also inspected. Summoned-moose bag fitting, item drops and multiplayer still need an in-game check.
Features
- Configurable storage: 16 slots by default; up to 32 slots in an 8-column, 4-row layout.
- Server-controlled capacity: multiplayer clients receive the host/server's storage settings automatically.
- Safe size reductions: loaded bags retain their existing size until emptied and closed.
- Persistent contents: items stay with the moose across saves and restarts and drop on normal death.
- Animated leather bags: rounded bodies, stitched flaps and open metal buckles.
- Cosmetic appearance: no changes to defense, health, damage, movement speed or hitboxes.
- Saddle protection: empty and close the bags before removing the saddle.
Controls
| Control | Action |
|---|---|
| K | Look at a saddled moose while dismounted to open its bags. Nobody can be riding it. |
| E | Ride the moose as usual. |
| Shift + E | Remove the saddle after emptying and closing the bags. |
K is configurable. G remains available for your backpack.
Installation
Install BepInExPack Valheim and RustyHeathensWarSaddle through your mod manager. Install the same version on the server and every client, then restart both. No Jotunn or external ServerSync dependency is required.
For manual installation, put RustyHeathensWarSaddle.dll in BepInEx/plugins/RustyHeathensWarSaddle/.
Upgrading from a manual test build: replace/remove the old manually installed DLL so only one copy remains. Keep your existing config and world. Existing saddlebag contents use the same saved item format. Back up the world before upgrading. Empty expanded bags before downgrading to a version without configurable capacity.
Set the number of slots
Start once to generate:
BepInEx/config/com.rustyheathens.warsaddle.cfg
In multiplayer, edit this file on the server. In single-player, edit your local file. Stop the server/game before editing, then restart.
Default: 16 slots:
[Storage]
Columns = 4
Rows = 4
Maximum: 32 slots:
[Storage]
Columns = 8
Rows = 4
| Setting | Default | Allowed range |
|---|---|---|
| Columns | 4 | 1–8 |
| Rows | 4 | 1–4 |
Total slots = Columns × Rows. For example, 6 columns and 4 rows gives 24 slots. Bounds are enforced to keep the layout within 8×4; no extra inventory window rows are added. A player changing their local storage settings cannot override the server's capacity.
Increasing both dimensions, or increasing one while keeping the other unchanged, preserves all existing item positions. Reducing either dimension waits until that moose's bags are empty and closed. Until then, the hover text shows the current capacity and a reminder to empty the bags. No items are discarded or pushed into hidden slots to meet a smaller setting.
If the bags say they are waiting for settings, confirm that the server and clients all have version 1.0.3, then reconnect. Capacity synchronization is required to open bags in multiplayer.
Appearance settings
Appearance / BagScale and BagOffset adjust the fit; restart after changing them. Shoulder and chest armor are removed. An older experimental headpiece remains available through ShowHeadArmor, but is disabled by default and is not part of the finished bag appearance.
Compatibility and item safety
- Supports normal moose and Spirit Caller summoned moose. Other creature types are excluded.
- Do not combine with another mod that attaches a storage container to the same moose. This mod refuses that combination to avoid conflicting container handlers.
- Normal death drops the stored items. Failed drops are retried before death cleanup.
- If saved items cannot be read, the original saved bytes are retained and access is blocked; check the log and restore the missing item/mod dependency.
- Empty the bags before uninstalling. Vanilla Valheim cannot access their contents.
- Do not console-delete a moose carrying items. Keep ordinary world backups.
For servers running ModGuard, allow the plugin GUID com.rustyheathens.warsaddle. Existing allow-lists for this mod still work. No private server/admin configuration is included in this package.
Release verification
The 0.1.6 baseline was confirmed in-game by the server owner: bag appearance, animation, storage, restart/rejoin persistence and normal death drops. Version 1.0.0 preserves that appearance and adds configurable capacity and synchronization.
The release compiles against supplied game references with no warnings/errors. Automated mesh/capacity checks and simulated server/client handshake tests pass. The new configurable sizes and synchronization still need an in-game check: use 8×4, save/rejoin, then reduce the size with items present and verify it applies after emptying and closing.
Source, build script and offline tests are included in the source folder. No game or third-party DLLs are redistributed.
When reporting a problem, include your mod version, server/client configs, BepInEx/LogOutput.log, and screenshots. Fitting messages start with WarSaddle fit: and WarSaddle attachment:.
CHANGELOG
1.0.4
- Increment manifest, plugin and assembly versions to 1.0.4 because the existing 1.0.3 upload cannot be replaced.
- Keep the package name and plugin GUID unchanged.
- No functional changes from 1.0.3; summoned-moose support and native-unsummon drops retained.
- Package and version checks passed; live-game verification remains pending.
1.0.3
- Add Jo-bags support for Spirit Caller summoned moose, retaining normal-moose support.
- Drop stored items before native unsummoning; delay and retry owner-side removal if cleanup fails.
- Keep ordinary unloads separate from unsummoning and retain the existing storage/capacity protocol.
- Rebuild against supplied Valheim 1.0.21 references, including the current message API.
- Offline tests passed; live summoned-moose and multiplayer validation pending.
1.0.2 — Jo-bags
- Rename the storage window, interaction prompt and bag messages to Jo-bags.
- Keep existing saved items, capacity settings and bag appearance unchanged.
1.0.1 — release package cleanup
- Remove source code, build scripts and test files from the Thunderstore installation ZIP to follow the package rules.
- Provide development files in a separate source archive.
- Clarify the version-matching message. Storage capacity, item format, bags and animations are unchanged.
1.0.0 — configurable storage and public release
- Add server-controlled Storage / Columns (1–8) and Rows (1–4); retain 4×4 by default.
- Cap supported layout at 8×4 (32 slots).
- Synchronize capacity over the direct server connection; ignore other peers and invalid settings.
- Retain loaded bag dimensions when either dimension is reduced; apply the smaller layout after emptying and closing.
- Preserve item positions during growth, saved item data, and inventory change callbacks.
- Save dimensions with the moose; show actual capacity and pending size changes in hover text.
- Verify loaded item counts and positions before replacing inventory; preserve original saved bytes if loading fails.
- Preserve the owner-tested 0.1.6 bag appearance, animations and death-drop behavior.
- Add Thunderstore manifest, branded icon, installation/configuration instructions and source.
0.1.6 — follow the animated saddle rig
- Replace parenting to the static Sadle interaction object with parenting to an animated back bone.
- Prefer the saddle mesh's spine influences near the riding seat; fall back to body influences or the nearest spine when needed.
- Detect saddle renderers outside the interaction hierarchy by mesh/material name.
- Retain fitted world position and scale on attachment; let the animator drive movement directly.
- Log the chosen bone and selection source; sample mesh data only during visual initialization.
- Preserve 0.1.5 geometry/materials and all storage/grid/interaction rules. Clean compilation; feeding animation still requires live verification.
0.1.5 — rounded leather saddlebags
- Replace rigid boxes with smoothly shaded pouches, rounded bottoms and tapered mouths.
- Add folded leather flaps with curved stitched hems.
- Fit dark leather straps over the pouch surfaces; use open metal buckle frames and pins.
- Preserve attachment, bag centers, size controls, storage and inventory grid.
- Keep body armor removed and head armor disabled by default.
- Clean compile and 10,778 policy/mesh checks; live appearance check pending.
0.1.4 — remove leftover armor
- Remove shoulder plates, chest plate and the floating horizontal strip above the bags.
- Keep visible bag bodies, flaps, vertical straps, buckles and fitting unchanged from 0.1.3.
- Retire body armor offset/scale settings; head armor remains disabled by default.
- Storage and grid source remain unchanged; 16 slots and the K shortcut are retained.
- User confirmed slots in 0.1.2 and visible bags in 0.1.3. This cosmetic cleanup needs an in-game check.
0.1.3 — fix model scale and attachment
- Fix the logged oversized moose measurement: explicitly compensate renderer scale when baking the skinned mesh.
- Compare baked dimensions with live renderer bounds; reject implausible results and use rendered bounds as a conservative fallback.
- Retain the real saddle/riding anchor instead of replacing it with a mesh-bound estimate.
- Parent the bag/body visual to the active vanilla saddle attachment while preserving world size and rotation.
- Log renderer scale and measurement checks for fitting verification.
- Preserve the working grid and storage source unchanged. Head armor remains disabled by default.
- Zero compile warnings/errors; 386 automated checks pass. Placement still needs an in-game check.
0.1.2 — saddlebag slots and fitting
- Fix initial blank 4×4 inventory: invalidate the native layout cache when dimensions match but slot elements are missing, then let the original grid code build the controls.
- Patch applies only to this mod's active saddlebag inventory.
- Sample all available moose skinned meshes and remove the fixed maximum flank width; position bag inner edges beyond the measured body surface.
- Separate shoulder measurement from bag measurement; log sampling counts and both widths.
- Brighter brown leather with subtle procedural grain and muted blue straps.
- Disable the experimental head armor by default while bag functionality/fit is tested.
- Storage serialization, slot count, K shortcut, and cosmetic-only stats unchanged.
- Clean compile; 378 policy/mesh checks pass. Live verification pending.
0.1.1 — visual initialization fix
- Fix confirmed
No supported opaque shader foundfailure: clone a loaded opaque saddle/moose material instead of depending on named shader lookup. - Preserve original materials; give custom geometry plain tinted surfaces.
- Retry failed visual initialization at five-second intervals, up to six attempts.
- Log selected material and shader for fitting diagnostics.
- Storage format, 16-slot capacity, cosmetic-only behavior, and K shortcut unchanged.
- Builds cleanly against supplied game references; live visual verification pending.
0.1.0 — test build
- Existing normal moose saddle receives 16-slot persistent storage.
- K opens bags; shortcut configurable. G stays available for backpack use.
- Brown leather bags, blue trim, shoulder/chest plates, and animated open-face head armor.
- Cosmetics only; no character stats or hitboxes changed.
- Loaded/open bags block saddle removal; ridden moose block storage access.
- Native container interaction and separate inventory save key.
- Normal death transfers contents to world drops; failed drops defer cleanup and retry.
- Automatic fitting with configuration offsets and diagnostic bone logging.