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