CrimsonTeams
A replicated team system where teams are gameplay tags, not numeric ids - so an actor can be on several teams at once and factions nest naturally. Any actor becomes team-aware by holding a UCrimsonTeamAgentComponent; attitude (friendly / neutral / hostile) is a pure function of the tags on either side. The headline feature is dynamic attitude: when a team or hostility tag changes at runtime, every other actor re-evaluates - including AI perception, which Unreal otherwise evaluates once per stimulus and never re-checks.
Two ways to read this
Use the Blueprint / C++ / Both switch at the top of the window. Blueprint readers get the node chains and editor steps written out; C++ readers get code; Both shows everything side by side.
Attitude, at a glance
UCrimsonTeamStatics::GetTeamAttitudeBetween(Source, Target) is the single source of truth, evaluated in this order:
| Priority | Rule | Result |
|---|---|---|
| 0 | Both resolve to players in the same party | Friendly |
| 1 | Either side's HostileToTags overlaps the other's TeamTags | Hostile |
| 2 | The two share any TeamTag | Friendly |
| 3 | Neither side resolves a team component, or no rule matched | Neutral |
What's included
| Area | Key Types | Purpose |
|---|---|---|
| Membership | UCrimsonTeamAgentComponent, ICrimsonTeamAgentInterface | Per-actor team/hostile tags; forward the interface from your pawn or controller so any code (AI perception included) can read attitude without knowing the component |
| Attitude & queries | UCrimsonTeamStatics, UCrimsonTeamSubsystem | Attitude, damage gating, GAS target filtering, agent resolution, faction tag stacks |
| Dynamic re-eval | UCrimsonTeamSubsystem::OnTeamAttitudeChanged | On any team change, refreshes AI perceivers so they re-aggro without re-perceiving from scratch |
| Declared teams | UCrimsonTeamCreationComponent, ACrimsonTeamPublicInfo / PrivateInfo | Declare teams on the Game State, auto-assign players, materialize replicated team-info actors |
| Cosmetics | UCrimsonTeamDisplayAsset | Per-team material/Niagara parameters + short name; apply to actors and UI |
| Observers | UAsyncAction_ObserveTeam, UAsyncAction_ObserveTeamColors | Blueprint async nodes that fire on team / color change |
| GameFeature | UCrimsonGameFeatureAction_AddTeams | Data-driven way to add the agent component + tags to actor classes. Ships in this plugin - needs the GameFeatures plugin, not the rest of the Crimson suite. Prefer a default subobject or Add Component for actors that must always have a team - see How-To: Make an Actor a Team Agent |
| Tooling | Dev Tools window + console cheats | Crimson.Teams.DevTools (multiplayer inspector), CycleTeam / SetTeam / ListTeams |
| Parties | UCrimsonPartySubsystem, UCrimsonPartyMemberComponent, ACrimsonPartyInfo, UCrimsonPartyStatics | Invite-based, exclusive player groups. UCrimsonPartySubsystem (GameInstance, server-authoritative) keeps parties alive across level travel and reconnects; UCrimsonPartyMemberComponent on the PlayerState is the request API; members are Friendly to each other ahead of faction hostility. See How-To: Form Parties. |
Plugin dependencies
| Type | Name |
|---|---|
| Crimson plugins | None. This plugin is fully standalone. |
| Engine modules (runtime) | Core, CoreUObject, Engine, GameplayTags, NetCore, GameplayAbilities, AIModule, ModularGameplay, GameFeatures, DeveloperSettings; private Niagara |
| Engine modules (editor) | Core, CoreUObject, Engine, GameplayTags, SlateIM, SlateCore, Slate, ApplicationCore, ToolMenus, UnrealEd, AssetTools, ContentBrowserData, Json, AssetRegistry, GameplayTagsEditor, Kismet |
| Engine plugins | GameplayAbilities, Niagara, GameFeatures, ModularGameplay, SlateIM, GameplayTagsEditor |
Decoupled by design
The contract
ICrimsonTeamAgentInterface ships in this plugin and extends Epic's IGenericTeamAgentInterface, so engine code (AI perception, FGenericTeamId::GetAttitude) reads Crimson attitudes through the engine interface. Party events arrive on UCrimsonPartySubsystem::OnPartyMessage, and readiness is announced as ModularGameplay feature states (see API Reference -> System readiness).Using with other Crimson plugins
CrimsonTeams works alone. When you own other Crimson plugins, CrimsonCore (CrimsonCore - requires all Crimson plugins) contains the full-suite wiring for this plugin in
Source/CrimsonCore/{Public,Private}/Integration/Teams/: UCrimsonInteractionCondition_TeamAttitude (a team-attitude requirement on interaction options) and UCrimsonCorePartyMessageForwarder (party events re-broadcast on a global message bus). To wire it yourself, see CrimsonCommon -> Concept: Connecting Crimson Plugins; for what CrimsonCore installs, see CrimsonCore -> Concept: The Integration Layer.Where to go next
- New here? Quick Start - two actors treating each other as enemies, end to end.
- Specific tasks: the How-To pages (make an agent, query attitude, react to changes, declared teams & colors, form parties, debug at runtime).
- Mental model: Concept: Dynamic Attitude & Multiplayer and Concept: Team Registration & Info Actors, Concept: Parties.
- Signatures: API Reference.