API Reference
All types live in the CrimsonNumberPop module unless noted. BP = Blueprint-accessible; C++ only = no Blueprint node or binding.
FCrimsonNumberPopEvent
The payload sent server-to-client. All fields are BlueprintReadWrite (Make/Break nodes available).
| Field | Type | Notes |
|---|
Value | float | The number to display |
Tags | FGameplayTagContainer | Drives registry style lookup and per-player filtering |
WorldLocation | FVector_NetQuantize | Pre-computed by the server; quantized to 1 cm for bandwidth |
bHasWorldLocation | bool | True when WorldLocation was explicitly set - lets a legitimate pop at the world origin work. BroadcastNumberPop also treats any non-zero location as authored |
Instigator | AActor* | Damage dealer / healer. NetGUID reference - null on clients where the actor is not net-relevant |
Target | AActor* | Hit actor; the server resolves the pop location from it. Same NetGUID caveat |
PrefixText | FString | Substituted into the style's {Prefix} token; travels over the network |
CustomText | FString | Substituted into {Custom}; travels over the network |
Style types
| Type | Kind | Description |
|---|
FCrimsonNumberPopPhysics | Struct (BlueprintType) | Duration (1.5), HorizontalSpreadRange (-60..60), VerticalBoostRange (-300..-500, negative = up), Gravity (980, positive = down). Screen-space pixels/sec |
FCrimsonNumberPopConfig | Struct (BlueprintType) | FormatString (default <{ValueStyle}>{Value}</>), PrefixStyleTag / ValueStyleTag (rich-text row names, default Default), PhysicsData, AnimationName (default Anim_Pop) |
FCrimsonNumberPopStyleRule | Struct (BlueprintType) | Query (FGameplayTagQuery), Priority (higher wins among matches), Config |
UCrimsonNumberPopRegistry | UDataAsset | StyleRules array + DefaultConfig fallback. Assign in Project Settings; loaded async at startup |
UCrimsonNumberPopReplicationComponent
Add to your GameState. Replicated by default so RPCs route even when added dynamically.
| Member | Access | Description |
|---|
BroadcastNumberPop(Event) | BP | Server-only entry point. Validates authority, resolves WorldLocation from Target when unset, then multicasts - or, with ServerCullDistance > 0, sends per-client to players in range of the event |
OnNumberPopReceived | BP (assignable) | Fires on every machine that receives the multicast. The subsystem binds to it automatically; bind extra listeners for custom HUD/analytics. Does not fire on the server-culled path |
Multicast_NumberPopEvent | internal | NetMulticast Unreliable RPC (protected) |
UCrimsonNumberPopClientComponent
Per-PlayerController delivery channel for server-culled events. Added lazily by the plugin on the server when `ServerCullDistance` > 0 - never add it manually. Its Client_NumberPopEvent (Client, Unreliable) feeds the owning client's subsystem directly.
UCrimsonNumberPopSubsystem
UTickableWorldSubsystem, client-side. Not created on dedicated servers or non-game worlds; PIE run-as-dedicated is caught by a lazy net-mode check at every entry point.
| Member | Access | Description |
|---|
RequestNumberPop(TargetActor, ContextTags, Value, PrefixText, CustomText) | BP | Direct local display, no replication - singleplayer/offline use. Location resolves client-side from the actor. Multiplayer code should use BroadcastNumberPop instead |
HandleIncomingEvent(Event) | C++ only | Receives events from both replication paths (a UFUNCTION so the multicast delegate can bind it - no Blueprint node); applies the player filter, then queues the display |
RegisterEventSource(Source) | C++ only | Called by the replication component's BeginPlay; binds the subsystem to OnNumberPopReceived |
IsPopSystemReady() / GetLoadedRegistry() / GetLoadedWidgetClass() / GetActivePopCount() / GetInactivePoolCount() / HasPendingRequests() | C++ only | Read-only inspection accessors (readiness, loaded assets, pool/queue counts) - the dev tools Status tab is built on them (How-To: Test Pops with the Dev Tools) |
UCrimsonNumberPopWidget
Abstract, Blueprintable UUserWidget base for pop visuals.
| Member | Access | Description |
|---|
StartPop(DisplayText, WorldLocation, PopTypeTag, PhysicsSettings) | BP (BlueprintNativeEvent) | Entry point per pop. The native implementation sets the text, resets visuals for pooling, randomizes velocity, and starts the physics motion - call the parent from overrides to keep it |
CancelPop() | BP | Force-finishes immediately: hides the widget and broadcasts OnPopFinished (used by the MaxActivePops recycler) |
OnPopFinished | BP (assignable) | Broadcast when the pop ends; returns the widget to the pool. The native tick broadcasts it automatically after Duration |
ActiveAnimationName | BP (read-only) | The resolved style's AnimationName, set by the subsystem before StartPop - read it in overrides to play the matching widget animation |
BaseRenderScale | BP (read-only) | The per-player WidgetScale stored at dispatch; the subsystem multiplies it with the distance-scale curve each frame to produce the final render scale |
TextBorder / TextBlock | BP (read-only, BindWidget) | Required bindings: a UBorder and a URichTextBlock with those exact names |
WorldLocationToTrack | internal | World position the subsystem projects to the screen each tick |
UCrimsonNumberPopPlayerSettings
Optional PlayerController component; local-only, never replicated. Blueprintable - subclass it in Blueprint to override the team hook. All UPROPERTYs are EditAnywhere, BlueprintReadWrite.
| Member | Access | Description |
|---|
WidgetScale | BP | Render-scale multiplier per pop, 0.5 - 2.0 (default 1.0) |
NumberFormatOverride | BP | -1 = project default; 0..2 = CommaSeparated / Abbreviated / Raw |
bShowMyDamageDealt / bShowAllyDamageDealt / bShowEnemyDamageDealt | BP | Instigator-based visibility (defaults: true / true / false) |
bShowIncomingDamage | BP | Events targeting the local pawn; overrides the instigator filters (default true) |
bShowHeals / HealTags | BP | Heal category toggle + the tags that identify a heal |
bShowCritsOnly / CritTags | BP | Clutter reducer + the tags that identify a crit (default off) |
MaxDisplayDistance | BP | Distance cap in cm, applies to all categories including heals; events targeting the local pawn are exempt; 0 = no limit (default 3000) |
IsInstigatorFriendly(LocalPawn, Instigator) | BP (BlueprintNativeEvent, overridable) | The team hook consulted by the filter for third-party events - return true when the instigator is friendly. Native implementation: IsActorFriendly delegate when bound, else true. Instigator may be null on clients (How-To: Bind Your Team System) |
IsActorFriendly | C++ only | FCrimsonIsActorFriendlyDelegate - the fallback team hook used by the native IsInstigatorFriendly; a Blueprint override of the event takes precedence |
PassesFilter(Event, LocalPawn) | C++ only | The filter itself; called by the subsystem per incoming event |
UCrimsonNumberPopTargetComponent
| Member | Access | Description |
|---|
SocketName | BP | Skeletal-mesh socket to spawn pops at (e.g. head); falls back to the offset when unset or invalid |
RelativeOffset | BP | World-space offset from the actor root (default 0, 0, 100) |
ResolvePopLocation(TargetActor) | C++ only (static) | Full fallback chain: socket, then root + RelativeOffset, then root + 100 cm when the actor has no component |
UCrimsonNumberPopSettings
Project Settings -> Crimson -> Crimson Number Pop (Config = CrimsonNumberPop, DefaultConfig). The plugin's DefaultCrimsonNumberPop.ini ships non-empty defaults for the three asset paths (demo registry, widget, and distance curve), so the unset defaults below are class defaults the shipped config overrides.
| Setting | Default | Description |
|---|
PopRegistryPath | unset | Soft reference to the UCrimsonNumberPopRegistry asset; loaded async at startup |
PopWidgetClassPath | unset | Soft class reference to your UCrimsonNumberPopWidget Blueprint; loaded async |
NumberFormat | CommaSeparated | Project-wide value formatting (ECrimsonNumberPopFormat); overridable per player |
DistanceScaleCurvePath | unset | Optional soft reference to a UCurveFloat mapping camera-to-pop distance (X, cm) to a scale multiplier (Y), evaluated every frame per active pop; Y of 0 or less hides the pop; unset = constant size (How-To: Scale Pops by Camera Distance). Loaded async; a failed load warns and falls back to constant size |
ServerCullDistance | 0 cm | Greater than 0: per-client delivery only to players in range (How-To: Cull Pops on the Server); 0 = multicast to all |
InitialPoolSize | 10 | Widgets pre-allocated at startup (0 - 64) |
MaxActivePops | 40 | Concurrent-pop cap; the oldest active pop is recycled early when exceeded; 0 = unlimited |
bVerboseLogging | false | Logs init, replication binding, filtering, and dispatch at Info verbosity - disable in shipping |
CrimsonCore glue (full stack only)
| Type | Module | Description |
|---|
UCrimsonCoreNumberPopSettingsComponent | CrimsonCore | Default component on ACrimsonPlayerController. Applies the CrimsonSettings shared-store NumberPop.* keys to the local player's UCrimsonNumberPopPlayerSettings (creating it on demand); event-driven re-apply on every setting change. Key list: How-To: Expose Pop Options as User Settings |