A layout-agnostic, fully replicated inventory: pluggable topology (flat / grid / weight / custom), nested bags, a runtime-mutable constraint stack, fragment-composed items, currency, scoped world containers, pickups, and zero hand-written Server RPCs.
Gameplay · Inventory · Unreal Engine 5
Diablo grid, Skyrim weight, MMO slots. One replicated component.
Topology is a UCrimsonInventoryLayout data asset: flat slots, 2D grid, weight list, or your own. Rules live in a runtime-mutable constraint stack; items are Blueprint classes composed from fragments. Nested bags, currency, world containers and pickups are included, fully replicated. You bring the items, layouts and UI.
Why CrimsonInventory
The topology-agnostic inventory core that action RPGs, survival games, and MMOs can all ship on, replication included.
Topology is a data asset, not a rewrite
A UCrimsonInventoryLayout asset picks the shape: _FlatSlot for MMO slot lists, _Grid for Tetris grids, _Weight for Skyrim-style weight lists, or a C++ subclass for your own. Layouts hold no numbers: capacities are tags on the component, so swapping the asset swaps genre.
A constraint stack you mutate at runtime
Caps and rules are replicated UCrimsonInventoryConstraint objects: slot caps, tag-keyed budgets, type allow/block lists, per-region grid rules, or a Blueprint child of your own. Equipping a backpack is two calls that both replicate automatically, so a UI bound to OnConstraintChanged refreshes itself.
Items are Blueprint classes composed from fragments
A UCrimsonInventoryItemDefinition is a Blueprint class whose Fragments array defines it: stacking, footprint, visuals, tooltip, bag interior, consumable, currency. StateFragments like durability are instantiated per item and replicated. Live items are addressed by a stable server-assigned EntryId, never a slot index.
Pickups and containers with real ownership
ACrimsonPickupActorBase covers single-item drops and multi-item bags and reports partial takes when the taker's bag fills up. ACrimsonContainerActorBase gives world chests four scopes (Shared, PerPlayer, PerParty, PerMapInstance), with per-party and per-map instances net-relevant only to the players actually looking at them.
Zero hand-written Server RPCs
UCrimsonInventoryRoutingComponent on the PlayerController owns every Server RPC (move, transfer, split, sort, drop, containers, pickups), each with a _Validate that rejects nonsense first. Your UI calls it directly, and every request answers on OnOperationResult, so a refusal is never silent.
Currency, save structs, and a live inspector
Currencies come from data tables and replicate on every inventory; save data is plain structs with no save-system dependency. An editor-only Inventory Dev Tools window inspects and mutates any live inventory during PIE, and console cheats take the real client-to-server path.
A closer look
A replicated inventory running in a sitting
The Quick Start goes from an empty project to a moving, replicated inventory whose client sends a validated move request. Blueprint-only projects never touch a .uproject or a .Build.cs.
- Register a scan path for your item Blueprints and create a layout asset
- Put
UCrimsonInventoryManagerComponenton your PlayerState and initialize it with your caps - Drop the routing component on your PlayerController and grant an item from the server
Change genre by swapping one asset
The same component becomes an MMO slot list, a Tarkov grid with rotation, or a Skyrim weight list by assigning a different layout asset. Constraints compose on top.
- Typed grid cells for a potion belt, or a weight cap plus per-type count caps
- Layouts, entries and capacity tags all replicate, so the client runs
PreviewPlacementagainst the server's exact numbers - A drag ghost turns red before anything is sent, with the reason the server would have given

Bags inside bags, moved as one piece
Add the Bag fragment to an item and it becomes an inventory: its own layout, its own caps, its own constraints, up to four levels deep. Moving a bag moves a subtree, so a bag never arrives empty.
- Each bag is a layout group keyed by its entry id, so UI draws one panel per group
- An
OnLayoutGroupsChangeddelegate fires when the set shifts - Or let a bag widen the root capacity instead of getting its own panel
- Extract and add are the primitives; transfers and drops use the same path
Chests, banks, and party loot without netcode
Place a container actor and pick its scope: shared for everyone, per-player so each looter gets their own instance, per-party, or per-map-instance for dungeon runs. Every open, close and transfer flows through the routing component, so the whole loop is authoritative from day one.
- Per-player containers live on that player's routing component and persist with its save struct
- Party and map-instance containers resolve to a spawned instanced actor keyed by a scope key you supply
- Server-side distance check on every open, close and transfer
- Open from any input via
OpenContainer; CrimsonCore adds an interact prompt and open conditions
One ability serves every consumable
Add the Consumable fragment to an item and it answers ICrimsonUsableObject. One use-ability granted once serves every consumable, so a hundred potions still cost the ability system a single spec. Trigger your own on the item's UseEventTag, or use the one CrimsonCore ships.
- The fragment declares the gameplay event, effects, SetByCaller magnitudes, stack cost and cooldown tag
- Your UI sends the use with
SendUseEvent; CrimsonCore adds context-menu Use and action-bar presses - Every entry point sends the same use event, so a menu and a hotbar cannot drift apart
Technical details
- Engine
- UE 5.8
- Tested platforms
- Windows
- Blueprint-ready
- Yes
- C++ required
- No
- Network replicated
- Yes
- Dependencies
- GameplayTags, GameplayAbilities, NetCore, GameFeatures, ModularGameplay, DeveloperSettings, UMG, IrisCore, AssetRegistry
Frequently asked questions
Do I need C++ to use it?
.uproject or .Build.cs to edit. Layouts, item definitions, fragments, constraints and capacity values are all authored in the editor, and custom rules are a Blueprint child of UCrimsonInventoryConstraint overriding CanAcceptItem. Two things are C++-only today: a brand-new layout topology, and the personal-container accessors on the routing component (per-player containers call those for you). One trap worth knowing: a Blueprint constraint's rule variables are not replicated unless you tick Replicated on each one, and without that the client's placement preview disagrees with the server.Does it work in multiplayer?
EntryId that survives reorders and sorting; item instances, state fragments, constraints and currency handlers are all registered replicated subobjects; capacity tags replicate as their own fast arrays; and every mutator on the manager is authority-only. The routing component provides the client-to-server path, so you never write inventory RPCs. And because a failed request changes no state and would replicate nothing, the server always answers the requesting client through OnOperationResult, success or failure.Does it come with an inventory UI?
PreviewPlacement for drag validity, and a delegate per kind of change. CrimsonCore ships a complete inventory screen with drag-and-drop, tooltips and a context menu on top of this plugin; it is free to download, but compiles only with all Crimson plugins installed.Does it depend on other Crimson plugins?
ItemInstanceClass, SetEntryEquipped, ICrimsonItemHost, ICrimsonUsableObject and its delegates. CrimsonCore, the free full-suite integration layer (it requires every Crimson plugin), adds item context menus, the equip flow with CrimsonEquipment, action-bar binding, interactable containers and the shared use ability. There is deliberately no save-system dependency either: save data is plain structs.Do I need CrimsonCommon?
Can one game mix a grid stash, a weight backpack, and a flat hotbar?
EntryId regardless of topology, and moving items between them is one TransferItem call on the routing component, which carries a bag and its contents with it as a subtree.Will my item Blueprints survive packaging?
AlwaysCook primary assets. An item outside a scanned path that nothing hard-references is cooked out of a packaged build: it works perfectly in the editor and is simply missing in the shipped game, so the docs include a page on verifying this before you ship.Ship inventory features, not inventory plumbing
Assign a layout, stack your constraints, add the routing component, and replication, bags, pickups, containers and currency are already done. Then swap topologies as your design evolves without rewriting a thing.
Pricing
CrimsonInventory is sold on Fab under Epic’s two standard licenses. Both include the full plugin, source, and updates.
Completes your setup
Each Crimson plugin runs standalone, so add only what your game needs:
Equipment slots that grant abilities and spawn gear.
- Slot-Based Equipping
- Grants Abilities & Effects
- Spawns Visual Actors
- Interface-Decoupled
Keybound, paged action bars over a replicated binding store.
- Automatic Stance Pages
- Pluggable Providers
- Server-Validated Edits
- Layout Editor
- UI-Agnostic Snapshots
Fragment-based saving: each system owns its own data.
- Independent Fragments
- No Cross-Plugin Coupling
- Blueprint-Ready
GAS interaction layer: scanning, granting and conditions.
- Scan Tasks
- Server-Side Granting
- Instant, Hold & Channel
- Interaction Conditions