API Reference

Public types grouped by area. Every identifier here exists in the CrimsonCommon runtime module's public headers.

Tag stacks

TypeDescription
FCrimsonTagStack / FCrimsonFloatTagStackOne (tag, count) item; GetTag(), GetStackCount()
FCrimsonTagStackContainerReplicated int container: AddStack / RemoveStack / ClearStacks / GetStackCount / ContainsTag / GetStacks
FCrimsonFloatTagStackContainerReplicated float container; adds SetStack to overwrite a value outright
UCrimsonTagStackStaticsBlueprint library: Add/Remove/Clear/Get/Contains TagStack (+ Float variants, Set Float Tag Stack)

Ability system bridge

TypeDescription
UCrimsonAbilitySetData asset bundling abilities/effects/attributes; GiveToAbilitySystem(ASC, &Handles, Source) (C++) / K2_GiveToAbilitySystem -> "Give To Ability System" (BP)
FCrimsonAbilitySet_GrantedHandlesTracks a grant for revocation; TakeFromAbilitySystem(ASC)
UCrimsonAbilitySetStaticsRevokeAbilitySet(Handles, ASC) - BP-friendly revoke (server only)
ICrimsonAbilitySystemOwnerBridge interface: GrantAbilitySet(Set, Source, &Handles), RemoveGrantedAbilitySet(Handles) - no ASC getter
FCrimsonAbilitySet_GameplayAbility / _GameplayEffect / _AttributeSetThe asset's entry structs (ability+input tag, effect+level, attribute set+defaults)
FCrimsonAttributeDefaultOne (FGameplayAttribute, Value) base-value override applied at grant time

Interaction contracts

TypeDescription
ICrimsonInteractableTargetGatherInteractionOptions (C++) / K2_GatherInteractionOptions (BP); plus CustomizeInteractionEventData, OnInteractableHovered/Unhovered, NotifyInteractionSuccess
ICrimsonInteractionInstigatorChooseBestInteractionOption(Query, Options) - arbitrate when several options are offered
FCrimsonInteractionOptionOne option: Text/SubText, InputType, InputHoldDuration, and ability fields (grant / target ASC / action ability)
FCrimsonInteractionQueryRequestingAvatar, RequestingController, OptionalObjectData
FCrimsonInteractionOptionBuilderAccumulates options and stamps each one's target scope
ECrimsonInteractionInputTypeInstant / Hold

Messaging

TypeDescription
UCrimsonMessageSubsystemGet(WorldContext); BroadcastMessage<T> / K2_BroadcastMessage ("Broadcast Message"); RegisterListener<T> (lambda / member-fn / params); UnregisterListener
FCrimsonMessageListenerHandleBinding handle; Unregister(), IsValid()
FCrimsonMessageListenerParams<T>Advanced params - PartialMatch + pre-bound callback
ECrimsonMessageMatchExactMatch / PartialMatch
UCrimsonAsyncAction_ListenForMessageBlueprint async "Listen for Crimson Messages" node

Context menu

TypeDescription
UCrimsonContextActionBlueprintable, EditInlineNew, DefaultToInstanced base. BlueprintNativeEvent hooks: GetAvailability (Hidden/Disabled/Enabled; default maps IsAvailable), GetDisabledReason, ValidateExecution (server anti-cheat), ExecuteAction(Context, Payload) (server-side), GetDynamicDisplayName. Properties: ActionTag, SectionTag, SortPriority, bIsDefault, bIsDestructive, ConfirmationMode, ConfirmationPrompt, CloseBehavior. GetActionId() = wire identity (tag name, else class name)
UCrimsonContextActionSetReusable UPrimaryDataAsset holding an action list (mirrors UCrimsonAbilitySet) - the designer-friendly authoring path. AppendTo(OutActions) for providers. Same loaded asset on client and server -> deterministic
UCrimsonContextAction_GrantAbilityBuilt-in: TryActivateAbilityByClass on the instigator's ASC
UCrimsonContextAction_DebugMessageTest/debug action: logs Message at Display verbosity when executed server-side. Drop into any action list to verify the full menu round-trip without gameplay code
UCrimsonContextAction_FromInteractionOptionTransient wrapper letting ICrimsonInteractableTargets surface in the menu. Wire id derives from the option ability class; ValidateExecution enforces the crimson.ContextMenu.MaxExecuteDistance range CVar (default 1000 cm, <= 0 disables)
UCrimsonContextActionGathererTHE single gather path (provider interface, else interactable actor + components, then registered contributors) + Hidden filtering + deterministic sort (destructive last, section, priority). Helpers: GatherActions, ResolveAction(Actions, ActionId, Occurrence), MakeActionHandle(Actions, Action, OutId, OutOccurrence)
ICrimsonContextActionProviderGatherContextActions - must return a deterministic, identically-ordered list on client and server. Optional native ValidateContextActionRequest(Context) rejects wrong-instigator requests server-side (e.g. another player's item)
ICrimsonContextActionContributorInject actions into OTHER objects' menus (quests add "Turn In" to an NPC). GatherContextActionsForTarget inspects Context.Target and appends only when relevant. Same determinism contract as providers
UCrimsonContextActionContributorRegistryUWorldSubsystem: RegisterContributor(Object, Priority) / UnregisterContributor. Consulted by the gatherer after the target's own gather, in deterministic (priority, class name) order. Register symmetrically on server and client or contributed actions cannot resolve
FCrimsonContextActionContext / FCrimsonContextActionHandleExecution context (instigator/target) / RPC payload ({ Provider, ActionId, Occurrence, Payload } - stable id + occurrence-among-same-id, plus an optional FInstancedStruct argument)
UCrimsonContextActionPlayerComponentPlayer-controller component with the Server_ExecuteContextAction RPC (not auto-attached). Server flow: re-gather via the gatherer -> ValidateContextActionRequest -> resolve by (ActionId, Occurrence) -> GetAvailability == Enabled -> ValidateExecution -> execute. Stale requests drop gracefully

UI foundation

TypeDescription
UCrimsonPrimaryGameLayoutLayer stack: GetPrimaryGameLayout(PC/LP), PushWidgetToLayerStack<T> / ...Async, RegisterLayer, GetLayerWidget, FindAndRemoveWidgetFromLayer
UCrimsonGameUIManagerSubsystem / UCrimsonGameUIPolicyCreate and own each local player's root layout; reach it via GetCurrentUIPolicy() -> GetRootLayout (on the policy); local-multiplayer interaction mode
UCrimsonUIExtensionSubsystemExtension points/widgets: RegisterExtensionPoint, RegisterExtensionAsWidget (+ For Context / As Data), Unregister*, BP K2_*
FCrimsonUIExtensionPointHandle / FCrimsonUIExtensionHandleHandles returned by registration
UCrimsonUIExtensionsStatics: PushContentToLayer_ForPlayer, PushStreamedContentToLayer_ForPlayer, Suspend/ResumeInputForPlayer

Modular actors & player layer

TypeDescription
ACrimsonModular*Character, Pawn, PlayerController, PlayerState, GameMode[Base], GameState[Base], AIController - GFP-extensible framework bases
UCrimsonCommonGameInstancePrimary-player tracking + OnPrimaryPlayerSet hook
UCrimsonCommonLocalPlayerPlayer-side delegate broadcaster
ACrimsonCommonPlayerControllerController -> local-player bridge
UCrimsonUserSubsystemCommonUser port: login, privileges, online context
UCrimsonSessionSubsystemCommonUser port: host/join/matchmaking, beacons
ECrimsonUser* enums + FCrimsonOnlineResultInformationOnline context / init state / privilege / availability / async-task state, and a result wrapper (in CrimsonUserTypes.h)

Input, teams & utilities

TypeDescription
FCrimsonChordRequirementShift/Ctrl/Alt modifier requirement; GetDisplayName(BaseKey)
ECrimsonGamepadSensitivityTen-point Slow->Insane preset scale
ICrimsonInputBindingProviderRead/write chord requirements per mapping+slot (implemented by CrimsonInput, consumed by CrimsonSettings)
ICrimsonTeamAgentInterface / FOnCrimsonTeamTagsChangedDelegateTeam/faction membership tags + change delegate; BroadcastTeamChange (full system in CrimsonTeams)
UCrimsonTagLabelSettingsProject Settings -> Crimson -> Crimson Tag Labels; GetNameForTag (C++) / "Get Tag Label" (BP)
ECrimsonStatDisplayMode / ECrimsonDisplayablePerformanceStatPerf-stat HUD display mode and the displayable stat set (FPS, frame/latency, packet)
FCrimsonAsyncMixinSequential async-load mixin (ported from Epic's AsyncMixin)

Editor tooling

Editor-only surfaces in the CrimsonCommonEditor module. Not available at runtime and not Blueprint-exposed.

MCP toolbar. CrimsonCommonEditor owns the single MCP button in the Level Editor play toolbar - a split control whose left half shows server status and starts/stops the server, and whose arrow opens the Crimson MCP menu. It lives here rather than in CrimsonEditorUtilities because everything it configures is suite-wide: the master switch is read by every Crimson plugin's editor module, so the button must exist for projects that do not install that optional plugin.

TypeDescription
UCrimsonMCPSettingsProject Settings -> Crimson -> Crimson MCP. bEnableCrimsonMCP is the suite-wide master switch (off by default, read at module startup); bShowMCPToolbarButton shows/hides the toolbar button independently. Gate registration with IsEnabled().
SCrimsonMCPButtonThe MCP split button widget: status + start/stop on the left, the Crimson MCP menu on the right.
FCrimsonMCPToolingUtilityBuilds that menu - master switch, Epic toolset plugins (rewrites the .uproject), and per-toolset visibility via the Toolset Registry block list. CanShow() is false during PIE, when project edits are unsafe.

File groups. Lets a plugin teach an editor browse tool how to organize files it owns, without the tool depending on that plugin. A tool that finds no provider for its domain keeps its own default behavior, so registration presence is the whole detection mechanism - there is no setting and no plugin sniffing. The Save Game deleter is the first consumer: CrimsonSaveSystem stores its blobs flat, which a directory-based browser would show as one undifferentiated list, so CrimsonSaveSystemEditor registers a provider for the "SaveGames" domain and the blobs list under a heading per slot.

TypeDescription
ICrimsonFileGroupProviderImplement and register to organize a domain's files. GetDomain() names the domain; GetRootDirectories() reports where the files actually live; GroupFiles() sorts absolute paths into display groups. GroupFiles must account for every input path - put unrecognized files in a catch-all group rather than dropping them - or return false to decline, which makes the tool fall back.
FCrimsonFileGroupRegistrySingleton. Register() from your editor module's StartupModule, Unregister(Domain) in ShutdownModule, FindProvider(Domain) from the tool.
FCrimsonFileGroupOne display group: a DisplayName and the absolute FilePaths in it.
This is the interface bridge, applied to tooling
Same shape as the runtime patterns in Concept: Decoupling Patterns - the contract lives in CrimsonCommon, the owner implements it, the consumer resolves it, and neither includes the other. Adding a public header here rebuilds every dependent editor module, so put a contract here only when more than one plugin genuinely needs it.

Logging

MacroUse
CRIMSON_DECLARE_LOG_CATEGORY / CRIMSON_DEFINE_LOG_CATEGORYDeclare (header) / define (module .cpp) a named, filterable category
CRIMSON_LOG_VERBOSE / _INFO / _DISPLAY / _WARN / _ERROR / _FATALLog at a verbosity; Msg accepts any value FString can build from