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:

PriorityRuleResult
0Both resolve to players in the same partyFriendly
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; forward the interface from your pawn or controller so any code (AI perception included) can read attitude without knowing the component
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
GameFeatureUCrimsonGameFeatureAction_AddTeamsData-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
ToolingDev Tools window + console cheatsCrimson.Teams.DevTools (multiplayer inspector), CycleTeam / SetTeam / ListTeams
PartiesUCrimsonPartySubsystem, UCrimsonPartyMemberComponent, ACrimsonPartyInfo, UCrimsonPartyStaticsInvite-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

TypeName
Crimson pluginsNone. 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 pluginsGameplayAbilities, 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.