Quick Start
By the end of this page, a server-side broadcast makes a floating combat text appear over a target actor on every client - styled by your registry and recycled through the widget pool.
CrimsonCombatText.Damage).DA_CrimsonCombatTextRegistry), a pop widget (WBP_CrimsonCombatText), and a distance curve - and DefaultCrimsonCombatText.ini already points Project Settings at them. So a fresh install pops numbers as soon as you wire the GameState component and broadcast (steps 5-6). Steps 2-4 show how to author and assign your own assets - skip them to try the shipped defaults first.1. Enable the plugin
Open Edit -> Plugins, type Crimson in the search box, tick CrimsonCombatText's checkbox (and CrimsonCommon, its dependency), and restart the editor when prompted. For a Blueprint project that's the entire install - you never hand-edit the .uproject or any .Build.cs.
C++ projects: after enabling the plugin, add its module to your build file so your code can use its types:
// YourGame.Build.csPublicDependencyModuleNames.Add("CrimsonCombatText");
2. Create the motion set and style registry
Two data assets. Content Browser right-click > Crimson > Combat Text:
- Motion Set - name it
DA_CrimsonCombatTextMotions. It arrives pre-seeded with five editable built-in presets, so it is usable immediately. - Style Registry - name it
DA_CrimsonCombatTextStyles. Set itsMotionSetto the asset above.
In the registry, add a row to `Styles` keyed by the tag your gameplay code will send - Damage is the obvious first one. Set its MotionPreset to CrimsonCombatText.Motion.ArcOut and leave everything else at default.
Styles resolves hierarchically: a hit tagged Damage.Fire.Burn falls back to Damage.Fire, then Damage, then DefaultStyle. You only author the specificity you care about - one Damage row already covers every damage type.Crit modifier layers onto whichever style matched, so you never need Damage.Fire.Crit and Damage.Ice.Crit as separate entries.3. Create the combat text widget
Content Browser right-click > Crimson > Combat Text > Combat Text Widget, named WBP_CrimsonCombatText. Add a Rich Text Block and name it TextBlock to get formatted text for free.
TextBlock and TextBorder binds are optional. Bind nothing and implement the On Combat Text Applied event instead if you would rather drive your own visuals.ValueStyleTag / PrefixStyleTag (Default out of the box). Without them the text renders unstyled.4. Point Project Settings at your assets
Open Project Settings -> Crimson -> Crimson Combat Text. If you used the asset names above these are already correct; otherwise set them:
| Setting | Value |
|---|---|
RegistryPath | Your style registry (step 2) |
WidgetClassPath | Your widget Blueprint (step 3) |
RendererClass | Leave as the widget renderer |
NumberFormat | CommaSeparated, Abbreviated or Raw |
5. Add the replication component to your GameState
UCrimsonCombatTextReplicationComponent is the broadcast entry point. It must live on the GameState (replicated, exists on every client) - it registers itself with each client's subsystem on BeginPlay, so there is no manual wiring.
6. Broadcast a pop from the server
Wherever damage or healing is applied on the server, build a FCrimsonCombatTextEvent and call Broadcast Combat Text. Set Target (the hit actor - the server resolves the pop's world location from it) and Tags (matched against your registry rules and the per-player filters). Instigator, PrefixText, and CustomText are optional.
BroadcastCombatText validates HasAuthority() and ignores (with a warning) calls made on a client - safe to call from code that runs on both sides. In singleplayer and on listen servers the local player is also a client of the multicast, so this same path works everywhere.When you want text somewhere else - under the enemy for healing, in a fixed HUD area, next to a health bar - see How-To: Position Pops and How-To: Show Pops on the HUD or a Health Bar.