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).

FieldTypeNotes
ValuefloatThe number to display
TagsFGameplayTagContainerDrives registry style lookup and per-player filtering
WorldLocationFVector_NetQuantizePre-computed by the server; quantized to 1 cm for bandwidth
bHasWorldLocationboolTrue when WorldLocation was explicitly set - lets a legitimate pop at the world origin work. BroadcastNumberPop also treats any non-zero location as authored
InstigatorAActor*Damage dealer / healer. NetGUID reference - null on clients where the actor is not net-relevant
TargetAActor*Hit actor; the server resolves the pop location from it. Same NetGUID caveat
PrefixTextFStringSubstituted into the style's {Prefix} token; travels over the network
CustomTextFStringSubstituted into {Custom}; travels over the network

Style types

TypeKindDescription
FCrimsonNumberPopPhysicsStruct (BlueprintType)Duration (1.5), HorizontalSpreadRange (-60..60), VerticalBoostRange (-300..-500, negative = up), Gravity (980, positive = down). Screen-space pixels/sec
FCrimsonNumberPopConfigStruct (BlueprintType)FormatString (default <{ValueStyle}>{Value}</>), PrefixStyleTag / ValueStyleTag (rich-text row names, default Default), PhysicsData, AnimationName (default Anim_Pop)
FCrimsonNumberPopStyleRuleStruct (BlueprintType)Query (FGameplayTagQuery), Priority (higher wins among matches), Config
UCrimsonNumberPopRegistryUDataAssetStyleRules 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.

MemberAccessDescription
BroadcastNumberPop(Event)BPServer-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
OnNumberPopReceivedBP (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_NumberPopEventinternalNetMulticast 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.

MemberAccessDescription
RequestNumberPop(TargetActor, ContextTags, Value, PrefixText, CustomText)BPDirect local display, no replication - singleplayer/offline use. Location resolves client-side from the actor. Multiplayer code should use BroadcastNumberPop instead
HandleIncomingEvent(Event)C++ onlyReceives 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++ onlyCalled by the replication component's BeginPlay; binds the subsystem to OnNumberPopReceived
IsPopSystemReady() / GetLoadedRegistry() / GetLoadedWidgetClass() / GetActivePopCount() / GetInactivePoolCount() / HasPendingRequests()C++ onlyRead-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.

MemberAccessDescription
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()BPForce-finishes immediately: hides the widget and broadcasts OnPopFinished (used by the MaxActivePops recycler)
OnPopFinishedBP (assignable)Broadcast when the pop ends; returns the widget to the pool. The native tick broadcasts it automatically after Duration
ActiveAnimationNameBP (read-only)The resolved style's AnimationName, set by the subsystem before StartPop - read it in overrides to play the matching widget animation
BaseRenderScaleBP (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 / TextBlockBP (read-only, BindWidget)Required bindings: a UBorder and a URichTextBlock with those exact names
WorldLocationToTrackinternalWorld 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.

MemberAccessDescription
WidgetScaleBPRender-scale multiplier per pop, 0.5 - 2.0 (default 1.0)
NumberFormatOverrideBP-1 = project default; 0..2 = CommaSeparated / Abbreviated / Raw
bShowMyDamageDealt / bShowAllyDamageDealt / bShowEnemyDamageDealtBPInstigator-based visibility (defaults: true / true / false)
bShowIncomingDamageBPEvents targeting the local pawn; overrides the instigator filters (default true)
bShowHeals / HealTagsBPHeal category toggle + the tags that identify a heal
bShowCritsOnly / CritTagsBPClutter reducer + the tags that identify a crit (default off)
MaxDisplayDistanceBPDistance 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)
IsActorFriendlyC++ onlyFCrimsonIsActorFriendlyDelegate - the fallback team hook used by the native IsInstigatorFriendly; a Blueprint override of the event takes precedence
PassesFilter(Event, LocalPawn)C++ onlyThe filter itself; called by the subsystem per incoming event

UCrimsonNumberPopTargetComponent

MemberAccessDescription
SocketNameBPSkeletal-mesh socket to spawn pops at (e.g. head); falls back to the offset when unset or invalid
RelativeOffsetBPWorld-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.

SettingDefaultDescription
PopRegistryPathunsetSoft reference to the UCrimsonNumberPopRegistry asset; loaded async at startup
PopWidgetClassPathunsetSoft class reference to your UCrimsonNumberPopWidget Blueprint; loaded async
NumberFormatCommaSeparatedProject-wide value formatting (ECrimsonNumberPopFormat); overridable per player
DistanceScaleCurvePathunsetOptional 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
ServerCullDistance0 cmGreater than 0: per-client delivery only to players in range (How-To: Cull Pops on the Server); 0 = multicast to all
InitialPoolSize10Widgets pre-allocated at startup (0 - 64)
MaxActivePops40Concurrent-pop cap; the oldest active pop is recycled early when exceeded; 0 = unlimited
bVerboseLoggingfalseLogs init, replication binding, filtering, and dispatch at Info verbosity - disable in shipping

CrimsonCore glue (full stack only)

TypeModuleDescription
UCrimsonCoreNumberPopSettingsComponentCrimsonCoreDefault 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