How-To: Test Pops with the Dev Tools (Optional)

Goal: exercise the whole pop pipeline without real gameplay events - fire test broadcasts at any pawn or pop-target actor, live-edit the per-player filters, burst-test the pool cap, and inspect replication wiring - using the live Crimson.NumberPop.DevTools window. Editor-only: the tool lives in the editor module and never ships.

Prerequisites
You completed Quick Start and are in PIE (the tool is PIE-gated - outside PIE it shows a start-PIE notice). Open it via Tools -> Crimson Number Pop -> Number Pop Dev Tools, or the console command Crimson.NumberPop.DevTools.
The Crimson Number Pop Dev Tools window in PIE, showing the Net Context picker and the Spawn / Filters / Status tabs.
The Net Context picker
The picker at the top selects which PIE world (server / client N) the tool inspects. Spawn candidates always come from the server world (broadcasts are authoritative); the Filters and Status tabs read the selected context, so you can compare what each client sees.

What each tab shows

TabShowsUse it to
SpawnSearchable Target and Instigator combos listing every pawn in the server world (players, enemies, NPCs, summons) plus any actor carrying a `UCrimsonNumberPopTargetComponent` - player entries first, with a Refresh button (the list also re-scans automatically when a listed actor dies). Instigator offers None for the third-party path. Below: Value with an optional 50%-150% randomize, comma-separated context tags, Prefix/Custom text, and a Burst count (1-200). Two send buttons: Broadcast (server path) and Request direct (local path).Fire the real combat pairings without gameplay code: enemy damaging a player (Instigator = enemy, Target = you), player damaging an enemy, or player vs player. Broadcast exercises replication, per-player filters, and server culling on every client; the direct request queues on the selected context's subsystem only and skips the player-settings filter.
FiltersThe selected context's local UCrimsonNumberPopPlayerSettings, live-editable: all six visibility toggles, widget scale, format override, max display distance - plus the configured heal/crit tags and which team hook is active (Blueprint override / C++ delegate / none). Offers an Add component now button when the component is missing.Flip a filter and immediately re-broadcast to see it take effect - no options menu required.
StatusA project-settings snapshot (registry/widget paths, ServerCullDistance, the distance-scale curve path or (none - constant size), pool sizes), whether the server GameState has the replication component, the selected context's subsystem readiness with loaded assets and active/pooled/queued counts, and whether the client cull component is present on the local PlayerController.Diagnose 'no pops' in seconds: unassigned assets, a missing GameState component, or a not-yet-loaded subsystem all show here.
Broadcast needs the GameState component
The Broadcast (server path) button is disabled when the server GameState has no UCrimsonNumberPopReplicationComponent (the tab says so). That is the same wiring Quick Start step 5 sets up - the tool cannot substitute for it.
Edits are session-local
Filter edits write directly to the runtime component and last for the PIE session. On the full stack, the CrimsonCore settings glue re-applies the saved user settings on top whenever a shared setting changes (How-To: Expose Pop Options as User Settings).
How the direct path finds the actor
Request direct must resolve the chosen server actor inside the selected context's world. Player pawns map reliably by PlayerState id; everything else falls back to actor-name matching, which is stable for level-placed actors - a runtime-spawned replicated actor may have no name match, and the tool then tells you to use Broadcast (the reliable path for those).

Testing recipes

RecipeStepsExpect
Verify a filter toggleRun 2+ players. On the Spawn tab set Instigator to another player and broadcast; then on the Filters tab (client context) turn Show ally damage dealt off and broadcast again.The first broadcast pops on that client; the second is filtered out. Set Instigator to None to exercise the third-party/null-instigator path instead.
Verify incoming vs dealt damageSet Instigator to an enemy pawn and Target to your player pawn, broadcast; then swap them (you hit the enemy) and broadcast again.The first pop is governed by Show incoming damage (always-see-what-hits-you), the second by Show my damage dealt - toggle each on the Filters tab to confirm.
Verify the MaxActivePops capSet Burst count to 100+ and broadcast (or request direct).Active pops never exceed MaxActivePops (the Status tab shows the live active/pooled counts) - the oldest pops are recycled early instead of the widget count growing.
Verify server cullingSet ServerCullDistance low in Project Settings, run 2 clients far apart, and broadcast at one of them.Only the nearby client shows the pop; the Status tab on each client reports whether the client cull component is present (culled path) or absent (multicast path).
Verify
With PIE running, a Spawn-tab broadcast at your own pawn pops a styled number on every client in range - styled by the registry rule matching the tags you typed.

See also

  • How-To: Filter Pops Per Player - what each Filters-tab knob does.
  • How-To: Cull Pops on the Server - the culled delivery path the recipes exercise.
  • Concept: Styles, Formatting & the Widget Pool - the pool guards the burst recipe stresses.