Concept: Duration Interactions & Progress UI

A duration (channel) interaction runs an action-phase ability on the avatar - the one you author in How-To: Add Holds, Channels & a Progress Prompt, step 2. Here is how a timer keeps a widget's remaining-duration display current, using this plugin's payload object and CrimsonCommon's message.

  1. On activate, the channel ability reads the payload (target, success ASC/class), optionally registers a UCrimsonInteractionDurationContext with the UIExtension system to spawn its progress widget, and starts a short repeating tick (0.05s).
  2. Each tick it advances CurrentProgress (scale the step by an attribute for stat-based speed) and pushes (CurrentProgress, Duration) to the widget via the context's OnProgressChanged.
  3. Each tick it also broadcasts FCrimsonInteractionProgressMessage on Message.Interaction.Progress - carrying Elapsed, Duration, Progress01, bComplete. A hold phase broadcasts the same message, so one widget renders both shapes.
  4. On completion it notifies the target (NotifyInteractionSuccess - or fires a success ability on the target's ASC for Method-2 targets), sends a final bComplete = true message, and ends - the UIExtension removes the widget.
Two ways to consume progress
The UIExtension context (UCrimsonInteractionDurationContext.OnProgressChanged) is the per-instance channel for the spawned widget. The message (FCrimsonInteractionProgressMessage) is the decoupled channel: any widget in any plugin can subscribe with only a CrimsonCommon dependency. Prefer the message for reusable HUD progress. Remaining time = Duration - Elapsed; bar fill = Progress01.