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 editor screenshots; 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:

PriorityRuleResult
1Either side's HostileToTags overlaps the other's TeamTagsHostile
2The two share any TeamTagFriendly
3Neither side resolves a team component, or no rule matchedNeutral

What's included

AreaKey TypesPurpose
MembershipUCrimsonTeamAgentComponent, ICrimsonTeamAgentInterfacePer-actor team/hostile tags; the interface (in CrimsonCommon) lets other plugins query attitude with no CrimsonTeams dependency
Attitude & queriesUCrimsonTeamStatics, UCrimsonTeamSubsystemAttitude, damage gating, GAS target filtering, agent resolution, faction tag stacks
Dynamic re-evalUCrimsonTeamSubsystem::OnTeamAttitudeChangedOn any team change, refreshes AI perceivers so they re-aggro without re-perceiving from scratch
Declared teamsUCrimsonTeamCreationComponent, ACrimsonTeamPublicInfo / PrivateInfoDeclare teams on the Game State, auto-assign players, materialize replicated team-info actors
CosmeticsUCrimsonTeamDisplayAssetPer-team material/Niagara parameters + short name; apply to actors and UI
ObserversUAsyncAction_ObserveTeam, UAsyncAction_ObserveTeamColorsBlueprint async nodes that fire on team / color change
GameFeature (CrimsonCore)UGFA_AddTeamsData-driven way to add the agent component + tags to actor classes. Defined in CrimsonCore (needs all Crimson plugins); standalone projects use a default subobject or Add Component instead - see How-To: Make an Actor a Team Agent
ToolingDev Tools window + console cheatsCrimson.Teams.DevTools (multiplayer inspector), CycleTeam / SetTeam / ListTeams

Plugin dependencies

TypeName
CrimsonCrimsonCommon
Engine modulesCore, CoreUObject, Engine, GameplayTags, GameplayAbilities, AIModule, ModularGameplay, Niagara
Decoupled by design
The contract ICrimsonTeamAgentInterface lives in CrimsonCommon, not here. Any plugin can read a team or attitude through it without depending on CrimsonTeams - the Cardinal Rule in action.

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, debug at runtime).
  • Mental model: Concept: Dynamic Attitude & Multiplayer and Concept: Team Registration & Info Actors.
  • Signatures: API Reference.