CrimsonEquipmentv1.0Coming to FabPersonal $9.99 · Professional $19.99
Join the Discord

A slot-based equipment system: equip a definition and it grants abilities, effects and attribute sets, spawns visual actors on sockets, and fires lifecycle hooks. Unequip and every bit of it is reversed, in a defined order, replicated.

Gameplay · Equipment · Unreal Engine 5

Equip the sword. The abilities, the mesh, the cleanup: all handled.

Two pawn components: one declares your slot layout, the other owns the replicated equipment list. Equipping a definition grants its abilities, effects and attribute sets to the pawn's ASC, spawns visual actors on every machine and fires lifecycle hooks; unequipping reverses it all in order. No Crimson dependencies.

Why CrimsonEquipment

The equip/unequip machinery every RPG rewrites, done once: replicated, and decoupled from your inventory and GAS setup.

Two components, whole system

UCrimsonEquipmentSlotsComponent declares which slot tags exist and how many indices each has. UCrimsonEquipmentManagerComponent owns the replicated equipment list and the runtime work. Add both in the Components panel, or let the Add Equipment Slots Game Feature action put them on a pawn you never open.

One Blueprint class per piece of gear

UCrimsonEquipmentDefinition is Const and Abstract: read from class defaults, never instantiated. A slot tag, an instance class, grant lists and actors to spawn, with no runtime state, so a hundred swords share one definition and per-copy state lives on the source object.

Equipping grants real abilities

On equip the manager grants the definition's GrantedAbilities, GrantedEffects and GrantedAttributeSets to the pawn's ASC; unequip revokes exactly those, nothing else. UCrimsonGameplayAbility_FromEquipment lets a shared ability read the instance that granted it, so one attack ability serves every weapon.

Visual actors, spawned and forgotten

Each definition lists actors to spawn: class, socket, transform. Leave the class empty and the shipped ACrimsonEquipmentDisplayActor carries your static or skeletal mesh, so ordinary gear needs no actor Blueprint; bUseLeaderPose drives armor from the character's skeleton. Every spawned actor is destroyed on unequip.

No hard dependencies to bridge

The manager finds the ASC through Epic's IAbilitySystemInterface, so any ASC works, including a vanilla one. Inventory items pass through as an opaque SourceObject the plugin stores, replicates and hands back but never inspects. No Crimson plugin dependency, and zero cross-plugin includes.

Multiplayer and save-game ready

The equipment list replicates via FastArray deltas, instances are replicated UObjects, and Iris fragments are registered for you. GatherSaveData / RestoreFromSaveData round-trip a plain SaveGame struct with no save-system dependency, and a restore that arrives before the ASC does is cached until you flush it.

A closer look

From an empty pawn to an equipped weapon

Author your slot tags, add the two components, create a UCrimsonEquipmentDefinition Blueprint for your sword and call EquipItem on the server. The abilities are live, the mesh is in the hand, and unequip undoes all of it.

  • Ships no slot tags: Equipment.Slot.Weapon and friends are yours to author
  • A definition is a slot tag, its grant lists, a mesh and a socket
  • In a Blueprint-only project, ticking the plugin in Edit → Plugins is the entire install

Server-authoritative, and it ships no client routing

Every mutation (EquipItem, UnequipItem, SwapEquippedItems, the save calls) is BlueprintAuthorityOnly and refuses to run without authority. Routing player intent is the game's job, so you write the Server_ RPC that carries the click.

  • No RPCs at all in the plugin: your UI's click reaches the server through your own RPC
  • Usually a custom event on the PlayerController; the docs show the exact shape in Blueprint and C++

Bring your own inventory. Bring your own ASC.

EquipItem takes any UObject* as the source and hands it back through GetSourceObject; the manager never inspects it. Item systems can go further and talk only to ICrimsonEquipmentHost, which this plugin owns, so neither side includes a header from the other.

  • Bridge reads (is this equipped, what's in this slot, the slot layout) are Blueprint-pure
  • Mutating half is C++-only; a Blueprint-only project calls EquipItem on the manager from its own server event
  • With CrimsonCore, CrimsonInventory items equip through ready-made statics and re-equip after a load

Lifecycle ordering you can build systems on

Equipping into an occupied slot applies the incoming item before removing the occupant, with an OnBeforeSwapUnequip hook in between, so a shared resource like a hotbar context or a weapon-type skill tree never briefly has zero owners.

  • CanEquipItem / CanUnequipItem gate the flow on your own manager subclass
  • SwapEquippedItems and MoveEquippedItemToSlot only rewrite slot assignments: nothing granted, revoked, spawned or destroyed
  • A swap notifies clients only through OnCharacterLookChanged, so slot-tracking UI must bind it and re-read

Technical details

Engine
UE 5.8
Tested platforms
Windows
Blueprint-ready
Yes
C++ required
No
Network replicated
Yes
Dependencies
GameplayAbilities, GameplayTags, ModularGameplay, GameFeatures, NetCore, DeveloperSettings, IrisCore

Frequently asked questions

Do I need C++ to use it?
No. Enable the plugin, add the two components, author UCrimsonEquipmentDefinition Blueprints, and route the player's click through a Run on Server custom event on your PlayerController. In a Blueprint-only project that is the whole build. Two honest limits: the mutating half of the ICrimsonEquipmentHost bridge is C++-only (a Blueprint equips by calling EquipItem on the manager directly), and a Blueprint child of UCrimsonEquipmentInstance cannot declare replicated variables, so per-item state that must reach clients needs a C++ subclass or lives on your source object.
Does it ship any content?
No: no assets, no widgets, and no slot tags. Equipment.Slot.Weapon and every other slot tag is yours to author, and the same tag has to appear in the pawn's layout and in each definition that fills it. What it does ship is the Blueprint bases (Content Browser → Add → Crimson Plugins → Equipment) and ACrimsonEquipmentDisplayActor, the ready-made cosmetic actor that carries a mesh so ordinary gear needs no actor Blueprint.
Does it work in multiplayer?
Yes. It is built for it, server-authoritative with no client prediction. Equip operations are BlueprintAuthorityOnly; clients receive state through the FastArray-replicated equipment list, instances are replicated UObjects with SourceObject and Definition replicated, and Iris is supported. One thing to know: OnEquipped / OnUnequipped run on the server and on every client (on clients from the list's replication callbacks), so anything authoritative inside them must sit behind an authority branch. The parameterless OnEquipmentChanged delegate, by contrast, is server-only; UI binds OnEquipmentChangedMessage, which fires on the server and every client.
Does it depend on other Crimson plugins?
No. It builds and runs standalone with only engine plugins (GameplayAbilities, GameFeatures, ModularGameplay), and it owns its ICrimsonEquipmentHost bridge and its grant lists. There are no cross-plugin includes. CrimsonCore, the free full-suite integration layer (it requires every Crimson plugin), adds the cross-plugin pieces automatically: a definition's AbilitySetsToGrant from CrimsonAbilitySystem, and the CrimsonInventory equip flow with equipped-flag sync and re-equip after load. Without CrimsonCore, AbilitySetsToGrant is ignored, so use the Granted* lists.
Do I need CrimsonInventory or CrimsonAbilitySystem for it to work?
No. Any actor implementing the engine's IAbilitySystemInterface (including a vanilla UAbilitySystemComponent) receives the granted abilities, effects and attribute sets, and the source object can be any UObject from any inventory system. Owning CrimsonInventory or CrimsonAbilitySystem does not connect them by itself: CrimsonCore is the zero-glue pairing, or you call EquipItem from your own code.
What happens if I equip into a slot that is already full?
The occupant is displaced rather than the equip being refused: with no free index the manager targets index 0 and force-unequips whatever was there. Because that unequip is forced, CanUnequipItem does not get a vote; an item that must never leave a slot has to refuse the incoming equip in CanEquipItem. When you equip through the ICrimsonEquipmentHost bridge, the result reports the displaced object as DisplacedSource; putting it back in the bag is the item system's job, not the equipment system's.
Do I need CrimsonCommon?
No. CrimsonCommon is an optional toolbox that nothing depends on. The equipment host interface, bridge statics and request/result types it used to hold now live in this plugin, grants go straight through the engine ASC, and every event is a delegate on the manager component rather than a message-bus broadcast.

Stop hand-rolling equip/unequip plumbing

Two components on your pawn, one Blueprint class per piece of gear: equipping grants abilities, spawns meshes and replicates, and unequip reverses it all in order. You write the server RPC that carries the click; the rest is done.

Pricing

CrimsonEquipment is sold on Fab under Epic’s two standard licenses. Both include the full plugin, source, and updates.

Personal$9.99For individuals & teams under $100K revenueComing to Fab. Join the Discord
Professional$19.99For companies over $100K revenueComing to Fab. Join the Discord