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.
- On activate, the channel ability reads the payload (target, success ASC/class), optionally registers a
UCrimsonInteractionDurationContextwith the UIExtension system to spawn its progress widget, and starts a short repeating tick (0.05s). - 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'sOnProgressChanged. - Each tick it also broadcasts
FCrimsonInteractionProgressMessageonMessage.Interaction.Progress- carryingElapsed,Duration,Progress01,bComplete. A hold phase broadcasts the same message, so one widget renders both shapes. - On completion it notifies the target (
NotifyInteractionSuccess- or fires a success ability on the target's ASC for Method-2 targets), sends a finalbComplete = truemessage, 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.