How-To: World Indicators & Hold-Progress Feedback

Goal: give the player feedback - on the target itself, on the HUD, and (if your project can use CrimsonCore) as floating world indicators.

1. Per-target progress (no dependencies)

During a hold or channel, the interactor pushes normalized progress to the target via NotifyInteractionProgress (0 on cancel/release, 1 on completion) - a CrimsonCommon interface method with a no-op default. Override it on the interactable to drive a radial fill, material parameter, light glow, anything. No coupling to any plugin.

Override 'Notify Interaction Progress' on the interactable; drive a progress bar / dynamic material with the Progress (0..1) value.

2. HUD progress via the message bus (CrimsonCommon)

Broadcast FCrimsonInteractionProgressMessage on Message.Interaction.Progress from your hold/channel code and any widget can render it with only a CrimsonCommon dependency. Blueprint: Listen For Crimson Messages async node; C++: RegisterListener - full snippet in How-To: Add Holds, Channels & a Progress Prompt, step 3. Always filter on Instigator == your pawn.

3. Floating world indicators (CrimsonCore - requires all Crimson plugins)

If your project has all Crimson plugins installed, CrimsonCore's prebuilt interact ability shows one world indicator per option (PromptMode = WorldIndicator); the required indicator manager (CrimsonUI) is added to the local player controller automatically, and the widget class resolves per option (InteractionWidgetClass on the option, else the ability's defaults). Building standalone? Your equivalent is any widget you drive from OnOptionsChanged - the option's InteractionWidgetClass field is yours to interpret (e.g. spawn a UWidgetComponent on the focused target).

CrimsonCore ability (requires all Crimson plugins): set Default Indicator Widget Class (or InteractionWidgetClass per option). The indicator manager component is added to the player controller automatically.
Verify
In range, your prompt appears (indicator or HUD). Hold: the target-side bar (step 1) and any HUD listener (step 2) fill together, reset on early release, and complete at 1.0.