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.

Prerequisites
Quick Start steps 1-2 (plugin enabled, components on the controller).

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.

Verify
Both are non-null on the owning client after the first tick and on the server immediately.

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.

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

Project Settings -> Crimson -> Crimson Action Bar.
SettingDefaultMeaning
StatePollRateHz10How often live slot state is re-queried on the owning client. Sweeps interpolate between polls.
GlobalCooldownTagsemptyCooldown tags that mean global cooldown; drives the bar-wide GCD sweep. Tag intersection only.
HiddenFromActionBarQueryemptyAbilities whose asset tags match are never offered by the picker.
DefaultEditBlockedQueryemptyOwner tags under which bars may not be rearranged (your in-combat tag), for bars whose own query is empty.
bBarsLockedByDefaultfalseFresh 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.

Sections are dock tabs
Every titled section of a tab is a real dock tab: drag one to reorder it, drop it onto another to stack them as tabs, drag it to a window edge to split them side by side, or drag the divider between two to resize. Drag a section out to tear it off into its own window, or right-click it for Dock to Sidebar - sections that are reference-only start in the sidebar. The arrangement is saved per window and comes back after you switch tabs, close the window, or restart the editor. Reset layout (top of the window) restores the default arrangement.
The Bars tab: every bar of the selected player as a live table - one row per slot with key, binding, enabled / active / cooldown / charges state, and Press / Release / Tap / Highlight / Target / Clear per row. The Consumables header shows its provider gate: takes: Object.
TabWhat it does
BarsLive 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.
AssignGathers 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".
StoreThe raw slot binding store: layouts with their entries, layout sets (save / apply / delete), and the save-data dump with copy-to-clipboard.
EventsA tail of the component's delegates (slot changed, live state, page changed, refusals) as they fire.
ReplicationPicks the same player on the server and a client and diffs the two stores - the multiplayer smoke test in one view.
The Assign tab after Gather on the ability provider: every bindable entry with its identity and filter tags, and the AllowedProviders verdict - accepted by ActionBar.Main, refused by ActionBar.Consumables.
Verify
Assign an ability from Client 1, switch the net context to the server: the Store tab shows the same binding for that player. Stop and restart PIE - it comes back from the save.

See also

  • Quick Start
  • How-To: Bind a Slot Widget
  • API Reference