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.

Prerequisites
A GameState subclass you can edit (Blueprint or C++), a server-authoritative place to report damage/heals from (e.g. a GAS AttributeSet or your damage pipeline), and at least one gameplay tag to describe the event (e.g. CrimsonCombatText.Damage).
Ships ready to run
CrimsonCombatText includes demo content - a registry (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.

Edit -> Plugins -> search 'Crimson' -> tick CrimsonCombatText's Enabled checkbox -> restart the editor.

C++ projects: after enabling the plugin, add its module to your build file so your code can use its types:

csharp
// YourGame.Build.cs
PublicDependencyModuleNames.Add("CrimsonCombatText");
Verify
CrimsonCombatText shows as enabled in the Plugins window and the editor restarts without errors.

2. Create the motion set and style registry

Two data assets. Content Browser right-click > Crimson > Combat Text:

  1. Motion Set - name it DA_CrimsonCombatTextMotions. It arrives pre-seeded with five editable built-in presets, so it is usable immediately.
  2. Style Registry - name it DA_CrimsonCombatTextStyles. Set its MotionSet to the asset above.
Use these names and setup is zero-config
Matching those two names means the shipped ini already points at them - no settings changes needed.
Content Browser > Crimson > Combat Text > Motion Set and Style Registry.

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.

One row covers a whole tag branch
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.
Use Modifiers, not more style rows
For conditions that cut across types - Crit, Blocked, Absorbed - add a `Modifiers` row instead of more style rows. One 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.

Widget Blueprint with a Rich Text Block named TextBlock.
Both widget binds are optional
Both 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.
Without a style set, text renders unstyled
Set a rich text Text Style Set on the Rich Text Block, and make sure it has rows matching your style's 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:

SettingValue
RegistryPathYour style registry (step 2)
WidgetClassPathYour widget Blueprint (step 3)
RendererClassLeave as the widget renderer
NumberFormatCommaSeparated, Abbreviated or Raw
Project Settings > Crimson > Crimson Combat Text.

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.

GameState Blueprint -> Add Component -> Crimson Combat Text Replication Component.
GameState, not GameMode
The GameMode exists only on the server, so a component placed there never reaches clients. The GameState is the canonical home.
Verify
The GameState lists the component in its component tree, and your project's GameMode uses that GameState class.

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.

Server-side event (e.g. after applying damage): Get Game State -> Get Component by Class (Crimson Combat Text Replication Component) -> Make CrimsonCombatTextEvent (Value, Tags, Target, Instigator) -> Broadcast Combat Text.
Authority is checked for you
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.
Verify
Press Play (try Net Mode = Play As Client with 2 players): dealing damage shows a styled floating number over the target on every client, rising and fading per your registry's physics.
What's next
Give players display control (How-To: Filter Pops Per Player), place pops on a socket (How-To: Position Pops), replace the built-in motion with your own animation (How-To: Play a Custom Widget Animation), and save bandwidth in big worlds (How-To: Cull Pops on the Server).
Pops appear over the target by default (optional reading)
You do not need to configure placement to finish this Quick Start - with none authored, every pop anchors over its target actor.

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.