Warbandeer: Bars

A **headless data layer** for action bar layouts.

Warbandeer_Bars

A headless data layer for action bar layouts. It automatically tracks each character's action bars, keybinds, macros, pet bar, and equipment-set outfits — one profile per character and spec — so any UI can preview another character/spec's setup and import it onto the one you're playing.

There is no window. Warbandeer_Bars only collects and stores data, and exposes WarbandeerBarsApi for a consuming addon (a Warbandeer view, or a standalone window) to build on. It is the sibling of Warbandeer_Characters and Warbandeer_Collected: a backbone, not a viewer.

This solves the "oh, I forgot to save the layout on X" problem — every character's current setup is captured on its own, in the background, with nothing to remember.

How it tracks

Profiles are captured at session boundaries — never on a churning per-click basis:

Trigger When
onLogin 2 s after entering the world (lets the bars finish loading)
ACTIVE_TALENT_GROUP_CHANGED 500 ms after a spec change (lets the new spec settle)
PLAYER_LOGOUT on logout and on /reload

A capture is skipped during combat (the macro temp-index resolution touches protected APIs) and while a cursor drag is in progress (it would clobber the held action). None of the triggers above fire in combat, so in practice this is just insurance.

Captures are always full fidelity (bars + binds + macros + pet bar + outfits). What a restore applies is filtered separately — see the include settings below.

Stored data

WarbandeerBarsDB (account-wide), keyed by character name then spec ID:

WarbandeerBarsDB = {
  version  = 2,
  profiles = {
    ["Nazuraki"] = {
      [62] = {            -- specID (e.g. 62 = Arcane Mage)
        version  = 1,
        captured = 1717000000,        -- server time
        char     = "Nazuraki",
        realm    = "Area 52",
        class    = "MAGE",            -- class file token
        classID  = 8,
        specID   = 62,
        spec     = "Arcane",          -- spec name
        specIcon = 135932,
        level    = 80,
        slots    = { { id = 1, type = "spell", index = 30451 }, ... },
        binds    = { { command = "ACTIONBUTTON1", key1 = "1" }, ... },
        macros   = { { id = 1, name = "Burst", icon = "...", body = "#showtooltip\n..." }, ... },
        petslots = { { id = 1, type = "spell", index = 2649 }, ... },
        outfits  = { "Raid", "Mythic+" },
      },
    },
  },
  layouts = {            -- Edit Mode layout snapshots (v2), shared across characters
    ["My Layout"] = { [1] = { numIcons = 12, numRows = 1, orientation = 0 }, ... },
  },
}

WarbandeerBarsSettings (per character) is the restore filter only — capture always stores everything:

{ include = { bars = true, macros = true, petbar = true, bindings = false, outfits = false },
  accountMacros = true, charMacros = true }

Bindings and outfits default off so importing buttons doesn't silently rewrite your keybinds.

API — WarbandeerBarsApi

-- Query
:GetCurrentCharacter()                       --> string
:GetCurrentSpecID()                          --> number
:GetProfile(char?, specID?)                  --> profile?   (defaults to current char/spec)
:GetProfiles(char?)                          --> { [specID] = profile }?
:ListCharacters()                            --> string[]   (sorted)
:GetAllProfiles()                            --> profile[]  (flat, for list views)

-- Capture / store
:Snapshot()                                  --> profile?   (capture current char now, and store)
:DeleteProfile(char, specID)

-- Apply to the current character
:Restore(profile, include?, silent?)
:RestoreProfile(char, specID, include?, silent?)  --> boolean (false if no such profile)

-- Engine passthrough
:Capture(include?, accountMacros?, charMacros?)   --> profile (does NOT store)

-- Settings
:GetIncludeSettings()                        --> include table (live; mutate to change)

-- Edit Mode layouts
:GetLayouts()                                --> { [layoutName] = barSettings }
:GetLayout(name)                             --> barSettings?  ({ [barIndex] = {numIcons, numRows, orientation} })

A previewing UI reads profile.slots (each { id, type, index?/strindex? }) and resolves icons/names itself (C_Spell.GetSpellTexture, etc.). :RestoreProfile is the one call needed to import another character's layout onto the current one.

Restore behaviour

Restoring is out-of-combat only. By type:

  • spell / item / mount / pet / flyout / equipment set — picked up and placed; spell overrides and base-spell fallbacks are resolved automatically. Anything you don't know is skipped with a warning.
  • macros — matched by name + body, or recreated on the target character if missing (account or per-character slot as appropriate), then placed. This is what makes a cross-character import actually work.
  • Slots not present in the profile are cleared.

Slash commands

Inspection/testing only (the data layer has no window):

/wbb                          status
/wbb snapshot                 capture the current character now
/wbb list                     list stored profiles
/wbb restore <char> [specID]  restore a stored profile onto the current character
/wbb forget <char> [specID]   delete profile(s)   (omit specID to forget the whole character)

/wbbars is an alias for /wbb.

Dependencies

LibNAddOn only — no LibNUI, no Warbandeer_Characters. Truly headless.

The Warbandeer: Bars Team

profile avatar
  • 20
    Projects
  • 6.7K
    Downloads

More from nazurakiView all