How-To: Get the Building Blocks
Goal: know how to reach every object the other pages assume - the bar component, the store, the layout, the settings, the owning player.
1. The bar component and the store
Find (Crimson Action Bar Component) with the player controller (searches the controller, its Player State, then its Pawn). Get Binding Store on it returns the CrimsonSlotBindingComponent, or Find (Crimson Slot Binding Component) directly.
2. The layout and its providers
Get Layout Definition on the bar component. Bars and Providers are readable; find a provider by class or by its ProviderId.
FindBar returns non-null for every BarTag you authored.3. Addresses
Every slot API takes an FCrimsonActionBarSlotAddress (BarTag, PageIndex, SlotIndex). Pass PageIndex = -1 to mean whatever page is effective right now - that is what a HUD widget bound to a bar wants, because it keeps working when the bar flips pages under it.
4. Project settings
Edit -> Project Settings -> Crimson -> Crimson Action Bar.
| Setting | Default | Meaning |
|---|---|---|
StatePollRateHz | 10 | How often live slot state is re-queried on the owning client. Sweeps interpolate between polls. |
GlobalCooldownTags | empty | Cooldown tags that mean global cooldown; drives the bar-wide GCD sweep. Tag intersection only. |
HiddenFromActionBarQuery | empty | Abilities whose asset tags match are never offered by the picker. |
DefaultEditBlockedQuery | empty | Owner tags under which bars may not be rearranged (your in-combat tag), for bars whose own query is empty. |
bBarsLockedByDefault | false | Fresh players start with bars locked (UX guard, not anti-cheat). |
Drive the bars without in-game UI: the Dev Tools
Tools -> Crimson Action Bar -> Action Bar Dev Tools (or Crimson.ActionBar.DevTools in the console) opens a live panel while PIE runs. Pick the net context (server / each client) and the player, then use Assign to gather what a provider offers and put it on any slot, Bars to press / clear / highlight / page, Store for layout sets and the save-data dump, Events for the delegate tail, and Replication to compare server vs client for the same player. From a client context every mutating button goes through the real client -> server RPC, so it doubles as the multiplayer test harness.
| Tab | What it does |
|---|---|
| Bars | Live per-slot table for every bar: press / release / tap a slot, toggle highlights, target a slot for the next assign, clear it, cycle pages, lock the bars, reset a bar or all of them. A bar narrowed by AllowedProviders shows takes: <providers> in its header. |
| Assign | Gathers what each provider offers this player (what a picker or spellbook would show), pre-flights the write, then assigns to the targeted slot, auto-places, clears or moves bindings. Below the gathered entries it lists which bars accept the selected provider and which refuse it (AllowedProviders); assigning to a refusing bar fails the pre-flight with "This bar does not take that kind of thing". |
| Store | The raw slot binding store: layouts with their entries, layout sets (save / apply / delete), and the save-data dump with copy-to-clipboard. |
| Events | A tail of the component's delegates (slot changed, live state, page changed, refusals) as they fire. |
| Replication | Picks the same player on the server and a client and diffs the two stores - the multiplayer smoke test in one view. |
See also
- Quick Start
- How-To: Bind a Slot Widget
- API Reference