API Reference

Public types. Everything here is in the CrimsonCombatText module unless noted.

UCrimsonCombatTextSubsystem

UTickableWorldSubsystem. Owns the client-side simulation - queue, live instances, merging, motion evaluation - and hands each frame to a renderer. It renders the totals the server stamped on each event and never accumulates on its own. Never created on a dedicated server.

MemberKindPurpose
RequestCombatText(Target, Tags, Value, Prefix, Custom, Instigator, bApplyFilters)Local/singleplayer entry point. Supply Instigator so relationship rules can judge it; clear bApplyFilters for pops that must always appearQueue combat text locally. Singleplayer, or client-side effects
HandleIncomingEvent(Event)UFUNCTIONEntry point from the replication path; applies per-player filters
GetFilterSet()UFUNCTION (BlueprintPure)The active UCrimsonCombatTextFilterSet, or null. What the settings layer and the dev tools enumerate
OnRegistryLoadedFSimpleMulticastDelegate (C++ only)Fires when the async-loaded registry (and its filter set) is ready. Subscribe rather than polling
ShouldDisplayEvent(Event, OutTrace)C++ onlyRuns the chain against one event without spawning anything. OutTrace reports which row decided
Scope functions-Not here. Scopes and running totals are server state on UCrimsonCombatTextReplicationComponent

UCrimsonCombatTextRegistry

UDataAsset. Maps tags to styles.

MemberTypePurpose
StylesTMap<FGameplayTag, FCrimsonCombatTextStyle>Tag to style. Hierarchical; most specific match wins
DefaultStyleFCrimsonCombatTextStyleUsed when nothing matches
ModifiersTMap<FGameplayTag, FCrimsonCombatTextStyleModifier>Orthogonal overlays, applied in ApplyOrder
MotionSetUCrimsonCombatTextMotionSet*Shared motion library styles resolve presets against
PlacementSetUCrimsonCombatTextPlacementSet*Shared placement library styles resolve presets against. Optional - unset anchors everything over its target
FilterSetTObjectPtr<UCrimsonCombatTextFilterSet>The ordered visibility chain. Unset means nothing is ever filtered
AdvancedRulesTArray<FCrimsonCombatTextStyleRule>Query escape hatch. Empty by default, never scanned unless populated
TextStyleTablesTArray<TObjectPtr<UDataTable>>Editor-only. Rich text style tables (RichTextStyleRow) the authoring dropdowns offer row names from, and the only reason row names can be validated. Never read at runtime
ResolveStyle(Tags)BlueprintNativeEventReturns FCrimsonCombatTextResolvedStyle. Override for custom selection
ResolveCompanionPop(ModifierKey, OutResolved)C++ onlyResolves the companion pop a modifier asks for, keyed by that modifier's own tag. Resolved with an empty modifier list, so a companion can never spawn one of its own. Returns false when the key names no modifier, or one that does not want a companion
IsDataValid(Context)Editor overrideValidates preset tags, summary style keys and rich text row names across Styles, DefaultStyle, AdvancedRules and Modifiers - including a modifier's CompanionPop, which is a whole style and gets the same checks. A ScopeSummaryStyle that names no Styles row, or whose row would inherit back into the same ledger root, is an error

UCrimsonCombatTextMotionSet

UDataAsset. A shared library of curve-authored motion presets, seeded with built-ins on creation.

MemberTypePurpose
PresetsTMap<FGameplayTag, FCrimsonCombatTextMotion>Named motions. Add rows to define your own
FindPreset(Tag, OutMotion)BlueprintCallableLookup; false when the tag has no row

FCrimsonCombatTextStyle

FieldPurpose
FormatStringRich text. Tokens: {Value}, {Prefix}, {Custom}, {ValueStyle}, {PrefixStyle}
PrefixStyleTag / ValueStyleTagRich-text style rows applied to those segments
AnimationNameUWidgetAnimation the widget may play
MotionPresetTag resolved against the registry's MotionSet
MotionInline motion, used only when MotionPreset is unset
PlacementPresetTag resolved against the registry's PlacementSet. Unset anchors over the target
PlacementOffsetExtra offset on top of the placement, in layout units. Slate +Y is DOWN
AggregationWindowSeconds between consecutive hits before the server's run lapses. Declaring it makes this row a ledger root. 0 = off. Read on the server
AggregationDisplayECrimsonCombatTextAggregationDisplay. How long one running number lives: fade with its own motion and re-pop the total on the next hit, or hold while the scope is open. Read on the client; inherited from the ledger root like the window and the scope
ScopeTagWhile the target holds this tag, the run never lapses. Also makes this row a ledger root. Watched on the server's copy of the target's ASC
ScopeSummaryStyleStyle key for the payoff sent when the scope closes - reliably, to each attacker's own PlayerController and to nobody else. An attacker with no controller gets none. Must not inherit back into the same root
bInheritAggregationDefault true. When this row declares neither a window nor a scope, take the nearest ancestor's (that ancestor is the row's ledger root). Clear it to keep this row's hits out of the parent's running total
ValueEmphasisScaleCurve: raw value to extra scale multiplier
ValueEmphasisColorCurve: raw value to tint

ECrimsonCombatTextAggregationDisplay

UENUM(BlueprintType). The AggregationDisplay of a style: how long one running number stays on screen. It changes nothing about what the server accumulates, and it is inherited from the ledger root like the window and the scope.

ValueWhat happens
FadeWithMotionThe default. The number fades when its own motion ends, even while the scope is open; the next hit pops a fresh number already showing the running total
HoldWhileScopedThe number is pinned on screen while the scope is open and retired by the payoff

An attacker is a PlayerState wherever one can be reached - see UCrimsonCombatTextPlayerSettings::ResolveInstigatorIdentity - so a row survives respawns and pawns that are not net relevant. Concept: Style Resolution, Motion & Rendering covers the ledger and the multiplayer consequences.

FCrimsonCombatTextStyleModifier

FieldPurpose
ExcludeTagsHits carrying any of these tags skip the modifier even though its tag matched (hierarchical). The shipped Crit excludes Damage.Type.Poison so a poison crit keeps its own look
ApplyOrderApplication order when several match, lowest first
ValueStyleTagReplaces the style's value row (guarded by its toggle)
TintMultiplied into the instance tint (guarded by its toggle)
FormatWrapperWraps the resolved text; {0} is the base result
ScaleMultiplierMultiplies the instance's base render scale
DurationMultiplierMultiplies the resolved motion's Duration
MotionPresetOverrideSwaps the motion wholesale
PlacementPresetOverrideRe-routes the pop to a different placement
PlacementOffsetAdded to the style's placement offset. Additive across modifiers
bSpawnCompanionPopRaise a second, separate pop for this modifier instead of (or as well as) changing the number. Leave every other field at its default for a pure companion
CompanionPopFCrimsonCombatTextStyle. The companion's own text, motion, placement and aggregation. Resolved with no modifiers applied, and keyed by this modifier's tag, so it merges only with companions of the same kind on the same target

FCrimsonCombatTextResolvedStyle

What a registry lookup returns: the base style with every matching modifier applied and Motion already resolved. Modifiers contribute at two levels, which is why this is not just a style - text and motion changes fold into Style, while scale and tint are per-instance and accumulate.

FieldPurpose
StyleFCrimsonCombatTextStyle with modifiers applied and Motion fully resolved
StyleKeyWhich Styles key won. Invalid means DefaultStyle or a rule-chosen inline style
AggregationRootFGameplayTag, BlueprintReadOnly. The Styles key whose window and scope this hit accumulates under - this row itself, or the ancestor it inherited from. Unset when no row in the chain declares either
ScaleMultiplierAccumulated instance scale from every applied modifier
TintAccumulated instance tint from every applied modifier
DurationMultiplierAccumulated duration multiplier, already folded into Style.Motion.Duration
PlacementThe resolved placement. Null is legal and common: anchor over the target
PlacementKeyWhich PlacementId won. Invalid means the default. Part of the merge identity
PlacementOffsetThe style's offset plus every modifier's, in layout units
CompanionModifierKeysKeys of every applied modifier asking for a companion pop, in ApplyOrder. The subsystem resolves each through ResolveCompanionPop and emits it after the main pop

FCrimsonCombatTextMotion

FieldPurpose
DurationLifetime in seconds
RiseDistance / SpreadDistanceAmplitudes in layout units (post-DPI)
RiseCurve / SpreadCurveNormalized alpha to 0..1 progress. Empty = linear
ScaleCurveAlpha to scale multiplier. Empty = constant 1
OpacityCurveAlpha to opacity. Empty = opaque until 80%, then linear to 0
bUseSpreadFan / FanWidth / FanSlotsDeterministic anti-overlap fan
RandomJitterWobble as a fraction of SpreadDistance. 0 = fully deterministic
RiseStaggerPerSlotExtra rise per concurrent hit as a fraction of RiseDistance (-1..1). Ladders the end heights of a burst; 0 = flat stack
RiseJitterRandom rise variation as a fraction of RiseDistance (0..1), rolled once per instance
DurationJitterRandom variation in Duration as a fraction of it (0..0.9), rolled once per instance and baked into the instance's duration at spawn
MergeHoldAlphaCategory Motion|Merge. The lifetime alpha the base motion is held at when a hit merges into this pop (0..1, default 0.6). It parks there instead of rewinding to the anchor
MergePunchDurationSeconds the merge punch runs for, on top of the held motion. 0 disables the punch and leaves a plain hold
MergePunchScaleCurvePunch progress 0..1 to a scale multiplier on the held sample. Empty = a sine hump 1 -> 1.3 -> 1
MergePunchRiseCurvePunch progress to extra upward layout units, added to the held sample's offset. Empty = 0
GetEffectiveDuration(Seed)Duration after DurationJitter for one seed; the subsystem bakes it at spawn and the preview calls it per slot
Evaluate(Alpha, Seed)Returns FCrimsonCombatTextMotionSample (offset, scale, opacity) for a 0..1 lifetime alpha
ComputeFanFactor(Seed) / ComputeRiseFactor(Seed)The lateral deflection in -1..1, and the multiplier on RiseDistance, for one seed
EvaluateMergePunch(PunchAlpha)Returns the punch's own FCrimsonCombatTextMotionSample for a 0..1 punch alpha - Scale is a multiplier, Offset.Y is additive (negative is up), and Opacity is always 1 and ignored by the composer. Pure; the punch alpha is independent of the lifetime alpha
DefaultMergePunchScale(PunchAlpha)Static. The built-in sine hump used when MergePunchScaleCurve is empty

FCrimsonCombatTextMotionSeed

The per-instance inputs Evaluate needs beyond the alpha. A plain struct, not a USTRUCT - C++ only.

FieldPurpose
SpreadIndexFan slot among concurrent hits on the same group. 0 = straight up, and the rung of the end-height ladder
JitterSeedLateral wobble in -1..1, sampled once at spawn
RiseSeedRise wobble in -1..1, sampled once at spawn

UCrimsonCombatTextRenderer

Abstract presentation strategy, selected by RendererClass. Subclasses key their view state off FCrimsonCombatTextInstance::Handle, never off array position.

MemberPurpose
InitializeRenderer(World, PC)Returns false if it cannot run; the subsystem then falls back to the widget renderer
OnTextStarted / OnTextUpdated / OnTextFinishedPer-instance lifecycle
RenderTexts(Instances, Frames)Per-frame, all live instances at once. Parallel arrays
SupportsRichText()False on the Niagara path; the subsystem warns once
PreWarm(Count) / GetPooledViewCount()Optional pooling hooks
ImplementationNotes
UCrimsonCombatTextRenderer_WidgetDefault. One pooled UUserWidget per instance; full rich text. ZOrder sets the viewport layer, so pops can draw over or under your HUD
UCrimsonCombatTextRenderer_NiagaraOne batched Niagara system. No rich text. Needs authored content. Screen-space pops are deprojected onto a camera plane at ScreenSpacePlaneDistance, which world geometry can occlude

UCrimsonCombatTextWidget

UUserWidget, Abstract, DisableNativeTick. A passive view - no motion, no timing, no lifetime of its own.

MemberKindPurpose
ApplyCombatText(Text, StyleKey, AnimationName)BlueprintNativeEventCalled when the widget is assigned to a new instance
OnCombatTextApplied(...)BlueprintImplementableEventHook for custom visuals or animations
TextBorder / TextBlockBindWidgetOptionalOptional stock widgets. TextBlock receives the rich text

UCrimsonCombatTextReplicationComponent

Lives on the GameState. The server-side broadcast entry point, and the owner of the aggregation ledger: per target and per ledger root, one running row for each attacker identity.

MemberKindPurpose
BroadcastCombatText(Event)BlueprintCallableServer only. Validates authority, resolves location, stamps the ledger fields onto the event, and sends it
BeginCombatTextScope(Target, ScopeTag)BlueprintCallable, Category CrimsonCombatText|LedgerServer only. Opens a scope by hand for projects without GAS: rows on that target whose style names this tag are held open from the next hit on. Warns and returns without authority
EndCombatTextScope(Target, ScopeTag)BlueprintCallable, Category CrimsonCombatText|LedgerServer only. Closes the scope: each attacker's payoff goes reliably to that attacker's own PlayerController, and to nobody else. An attacker with no controller gets none. The rows are then dropped
GetCombatTextScopeTotal(Target, ScopeTag, Instigator)BlueprintPure, Category CrimsonCombatText|LedgerServer only. Total of the row on Target whose ScopeTag matches, for that attacker identity - normalized through ResolveInstigatorIdentity, with null reading the shared unknown-attacker row. 0 when there is no such row
OnCombatTextReceivedBlueprintAssignableFires on each client; the subsystem binds automatically. Multicast path only
Delivery
Hit events go out on unreliable RPCs - Multicast_CombatTextEvent, or UCrimsonCombatTextClientComponent::Client_CombatTextEvent when ServerCullDistance is set. A scope payoff goes out on Client_CombatTextSummary, which is reliable, addressed to one PlayerController and never distance-tested. All of them are protected and internal: gameplay code calls BroadcastCombatText and the scope functions, never the RPCs.

UCrimsonCombatTextTargetComponent

Optional per-actor anchor override.

MemberPurpose
RelativeOffset / SocketNameWhere text appears. A valid socket wins over the offset
ResolveAnchorLocation(Actor)One-shot world anchor. Used by the server for the event's fallback location and by UCrimsonCombatTextPlacement_WorldActor for its first frame
ResolveAnchor(...) / EvaluateAnchor(...)Re-evaluatable anchor so text can follow a moving or animating target

UCrimsonCombatTextPlacement

Abstract, Blueprintable, EditInlineNew. Decides where one pop sits. Instances are shared by every pop routed to them, so both entry points are const and all per-pop data lives in the state struct.

MemberKindPurpose
PlacementIdFGameplayTagKey styles route to. Restricted to CrimsonCombatText.Placement
ScreenOffsetFVector2DAdded to the resolved anchor every frame, in layout units
FallbackUCrimsonCombatTextPlacement* (Instanced)Tried when this placement declines. Chains walk up to 4 deep
AcquirePlacement(Context, OutState)BlueprintNativeEventSpawn time. Return false to decline the pop
UpdatePlacement(Context, State)BlueprintNativeEventPer frame while bUpdateEveryFrame. Returns the new state
GetPlacementDescription()virtualShort description shown in the dev tools
Built-inNotes
UCrimsonCombatTextPlacement_WorldActorThe default. AnchorActor, SocketOverride, WorldOffset, bFollowTarget, bFallBackToEventLocation, bClampToViewportEdge, ViewportEdgePadding
UCrimsonCombatTextPlacement_ScreenAnchorFixed HUD spot. ViewportAnchor, AnchorOffset
UCrimsonCombatTextPlacement_WidgetAnchored to registered UI. AnchorId, bUseTargetActorContext, WidgetAlignment, AnchorOffset, bHideWhenAnchorLost

FCrimsonCombatTextPlacementContext

What a placement is told. Its actor pointers are raw and rewritten each frame - never store a copy.

FieldPurpose
TargetActor / InstigatorActorWho was hit, and who hit them. Either may be null on a client
EventWorldLocation / bHasEventWorldLocationThe network fallback location carried by the event
ContextTags / StyleKey / ValueWhat the pop was requested with, and which style won
ViewingPlayerThe player this pop is drawn for
ViewportSize / ViewportScaleViewport in layout units, and the DPI scale that produced it
TimeAlive / AlphaAge in seconds, and normalized 0..1 lifetime progress. Both 0 during acquire

FCrimsonCombatTextPlacementState

What a placement returns, and its entire per-pop memory.

FieldPurpose
SpaceWorld or Screen. Screen is exempt from camera-distance culling
WorldAnchorWorld anchor. Meaningless in Screen space
ScreenPositionFinal anchor in layout units. Filled in both spaces
ScreenOffsetConstant offset folded into the motion offset each frame
bOnScreenfalse hides the pop this frame
bUpdateEveryFramefalse freezes this state for the rest of the pop's life
bFollowAnchorKeep re-resolving the world anchor. Distinct from bUpdateEveryFrame: a pinned pop still re-projects because the camera moves
AnchorComponent / AnchorSocket / AnchorOffsetThe world-follow cache, so an animated socket costs no component search per frame
SpreadOwner / SpreadGroupAnti-overlap fan grouping. Pops sharing both deflect away from each other
UserVector / UserScalarScratch for custom placements. Ignored by the plugin

UCrimsonCombatTextPlacementSet

Data asset holding the named placements. An Instanced array rather than a map, because instancing is reliable on array elements and unreliable on map values.

MemberKindPurpose
PlacementsTArray<UCrimsonCombatTextPlacement*> (Instanced)The rows. Each carries its own PlacementId
FindPlacement(Tag)BlueprintCallableNull when the tag is unset or no row carries it
SeedBuiltInPlacements()CallInEditorAdds any missing built-in rows. Never overwrites an id you authored

UCrimsonCombatTextPlacementLibrary

The maths a placement needs, exposed to Blueprint so custom placements are not C++-only.

FunctionPurpose
ProjectWorldToLayout(Context, World, OutLayout)World point to layout units. false behind the camera
ClampToViewportEdge(Context, World, Layout, bProjected, Padding)Pushes an off-screen position to the padded viewport edge, handling anchors behind the camera
ViewportAnchorToLayout(Context, NormalizedAnchor, PixelOffset)Normalized viewport anchor to layout units
GetActorAnchorLocation(Actor)The actor's combat text anchor: target component socket, its offset, else 100 cm above the root

UCrimsonCombatTextAnchorSubsystem

World subsystem making UI widgets addressable by tag. Local and cosmetic - never created on a dedicated server. Holds weak pointers, so a destroyed widget cannot dangle.

MemberKindPurpose
RegisterAnchorWidget(Id, Widget, ContextActor)BlueprintCallableNull ContextActor registers the global anchor for that id
UnregisterAnchorWidget(Id, ContextActor)BlueprintCallableDrops one registration
UnregisterAllAnchorsForWidget(Widget)BlueprintCallableDrops every id a widget registered
FindAnchorWidget(Id, ContextActor)BlueprintPurePer-actor registration wins over the global one
GetAnchorViewportPosition(Id, ContextActor, Alignment, OutPos)BlueprintCallableLayout-unit position. false when unregistered, hidden, destroyed, or never painted

UCrimsonCombatTextAnchorWidget

A USizeBox that registers itself as an anchor for its lifetime. Palette category Crimson.

MemberKindPurpose
AnchorIdFGameplayTagThe id to register under. Deliberately unrestricted - these name your widgets
SetAnchorId(Id)BlueprintCallableRe-registers under a new id
SetAnchorContextActor(Actor)BlueprintCallableMakes this a per-actor anchor, for nameplates

FCrimsonCombatTextEvent

FieldPurpose
ValueThe number to display
TagsSelects style and modifiers; also drives per-player filtering
WorldLocation / bHasWorldLocationServer-resolved position, FVector_NetQuantize (1cm)
Instigator / TargetMay be null on clients where the actor is not net-relevant
InstigatorIdentityWho the instigator is, for per-attacker totals - the instigator's PlayerState wherever one can be reached. Filled server-side by BroadcastCombatText when you leave it unset, and replicated with the event, because a PlayerState stays relevant when the pawn that swung does not
PrefixText / CustomTextSubstituted into {Prefix} and {Custom}
LedgerRootStamped by the server: the Styles key whose window and scope this hit accumulates under. Unset means the hit is in no ledger
InstigatorTotal / InstigatorHitCountStamped by the server: this attacker's running total on this target under that root, including this hit, and how many hits are in the run. A count of 1 is a fresh number; 0 means the hit is in no ledger
bLedgerScopeOpenA scope is holding the run open - the number stays on screen until the summary arrives
bLedgerSummaryThis event is a scope payoff carrying the final total in Value. It never feeds the ledger, and it retires the held number it pays off

UCrimsonCombatTextSettings

Project Settings > Crimson > Crimson Combat Text.

SettingPurpose
RegistryPathThe style registry data asset. Required on a dedicated server too - the replication component loads it itself to resolve ledger roots
WidgetClassPathWidget Blueprint for the widget renderer
RendererClassPresentation strategy. Unset falls back to the widget renderer
NumberFormatCommaSeparated / Abbreviated / Raw
DistanceScaleCurvePathOptional camera-distance to scale multiplier
ServerCullDistance0 = multicast to all; > 0 = per-client RPCs within range
InitialPoolSize / MaxActiveTextsPool pre-warm and concurrent cap (0 = unlimited)
SpreadDecayTimeHow long a burst keeps fanning before resetting to center
bVerboseLoggingPer-dispatch logging. Off in shipping

UCrimsonCombatTextFilter

Abstract, Blueprintable, EditInlineNew. One rule in the visibility chain. Instances are shared by every pop that runs through the set and must stay stateless, which is why Matches is const.

MemberPurpose
Matches(Context)BlueprintNativeEvent. Does this rule describe this event? - not a verdict. Override this
FilterIdIdentity, under CrimsonCombatText.Filter. Also the settings storage key and the player-override key
DisplayName / DescriptionLabel and tooltip. The tag-label resolver, when bound, can rename the label
bUserConfigurableFalse hides the row from the settings screen and pins it to bEnabledByDefault
bEnabledByDefaultThe state the row starts in
MatchResultVerdict when the row is ON and Matches returns true
DisabledResultVerdict when the row is OFF and Matches returns true
bHasScalarParameterRow exposes one tunable. Read it in Matches from Context.ScalarParameter, never from ScalarDefault
ScalarDisplayName / ScalarRange / ScalarStep / ScalarDefaultSlider label, bounds, step and starting value
GetFilterDisplayName() / GetScalarDisplayName()Resolved labels: the tag-label resolver when bound, else DisplayName, else the raw tag
GetFilterDescription()One-line summary for the dev tools
Built-inMatches when
UCrimsonCombatTextFilter_RelationshipThe actor in Role (Instigator / Target) is in RelationshipMask. bRequireViewerIsNotOtherRole excludes self-inflicted events
UCrimsonCombatTextFilter_TagQueryQuery matches the event's context tags. An empty query matches nothing
UCrimsonCombatTextFilter_DistanceFurther from the viewer than the scalar. bExemptWhenViewerIsTarget spares events aimed at you

UCrimsonCombatTextFilterSet

UDataAsset. The ordered chain, assigned on the registry. An Instanced array with an id on each row rather than a TMap - a map has no order, and UPROPERTY(Instanced) is unreliable on map values.

MemberPurpose
FiltersThe chain, evaluated top to bottom. First non-Ignore verdict wins
DefaultResultVerdict when no row had an opinion. Hide by default
FindFilter(FilterId)Row lookup by tag, through a rebuilt index
GetUserConfigurableFilters()The rows a settings screen should offer, in chain order
SeedDefaultFilters()CallInEditor. Adds the seven built-in rows; never overwrites an id you already authored

FCrimsonCombatTextFilterContext

What a filter is told. Built once per event, before the chain runs, and handed to every row unchanged - so relationship is resolved once no matter how long the chain is.

FieldMeaning
InstigatorActor / TargetActorWeak pointers, normalized to the avatar pawn. Frequently null on clients
InstigatorRelationship / TargetRelationshipSelf / Ally / Enemy / Unknown. A null side goes to the team hook and reads as Ally; Unknown means there was no viewing pawn
bViewerIsInstigator / bViewerIsTargetDirect identity against the viewing pawn
ContextTags / ValueThe pop as requested, before style resolution
EventWorldLocation / bHasEventWorldLocationServer-resolved anchor; survives a null target
ViewingPawn / ViewingPlayerWho the text is being drawn for
ScalarParameterThe tunable for the row being evaluated - the player's override, or its ScalarDefault

UCrimsonCombatTextPlayerSettings

PlayerController component. Per-player filter choices, display overrides and placement re-routing. Local only, never replicated, and the plugin does not persist it.

MemberPurpose
FilterEnabledOverridesFilterId -> on/off. No entry means the row's bEnabledByDefault
FilterScalarOverridesFilterId -> tunable. No entry means the row's ScalarDefault
SetFilterEnabled(FilterId, bEnabled) / ClearFilterEnabledOverride(FilterId)Set or clear the player's choice for one row
IsFilterEnabled(Filter) / GetFilterScalar(Filter)The values actually in effect. A non-configurable row always reports its authored default
ResolveEventActor(Actor)Static. Normalizes an event actor to its avatar pawn - a GAS instigator is the ASC owner (the PlayerState), the target is the pawn. Without this a player's own damage never reads as Self
BuildFilterContext(Event, LocalPawn)Builds the context the chain runs against, resolving both relationships up front
PassesFilter(Event, LocalPawn, FilterSet, OutTrace)Walks the chain. A null FilterSet passes everything
IsActorFriendly(LocalPawn, Other)BlueprintNativeEvent team hook. Asked at most twice per event
IsActorFriendlyDelegateC++ binding for the same hook. Unbound treats every actor as an ally
WidgetScale / NumberFormatOverridePer-player render scale and number format (-1 = project default)
PlacementOverridesStyle key -> placement id, matched hierarchically. Most specific entry wins
ApplyPlacementOverride(Resolved, PlacementSet)Applied after style resolution, before the placement is acquired. A stale id warns and keeps the authored placement