Vanilla Bartender4 assumes only DRUID/WARRIOR/WARLOCK/PRIEST/ROGUE/HERO have
shapeshift forms. CoA custom classes (Witchdoctor, Templar, …) can register
forms late at runtime and aren't in the whitelist, so the stance/state bar
never came up for them.
StanceBar.lua:
- ApplyConfig() no longer Disable()s the module when GetNumShapeshiftForms()
is 0 at config time. A disabled module never re-enables on
UPDATE_SHAPESHIFT_FORMS, so late-registered forms were lost. We now just
hide the bar frame.
- Register UPDATE_SHAPESHIFT_FORMS and PLAYER_ENTERING_WORLD on the module
itself and re-Enable() / show the bar when forms appear after the fact.
Options/Bar.lua:
- The 'Hide in Stance/Form' visibility option was gated by a hard-coded
stanceClasses whitelist. Add an OR-fallback on GetNumShapeshiftForms() > 0
so CoA classes with forms get the UI.
StateBar.lua:
- DefaultStanceMap only had vanilla entries. For unknown classes with live
forms, synthesise a generic { id="formN", index=N } map at runtime so
UpdateStates() can wire stance-based action bar swaps.
CoA Bartender4
This is the CoA Guild 'Exiles' fork of Bartender4 by
Hendrik "Nevcairiel" Leppkes, vendored from Ascension's WotLK 3.3.5
Conquest of Azeroth (CoA) client
(upstream version 4.4.2-2-g3b02ee4).
What we patched
A single feature: paging conditionals can refer to shapeshift forms by name, not just by numeric stance index.
This will change Bar 1 into like Bar 5 or Bar 9
Bar 1
[noform]1;1
[aura:Beetle Form]5;1
[aura:Spider Form]9;1
Bar 2
[noform]2;2
[aura:Beetle Form]7;2
[aura:Spider Form]10;2
Three keywords are accepted equivalently when the value is a non-numeric
form name: aura:, form:, stance: (and their no…: negations).
All resolve via GetShapeshiftFormInfo() and get rewritten to
[stance:N] before the string reaches Blizzard's secure macro parser.
This covers every Venomancer / Wildkin / etc. CoA custom-class form, plus stock Druid / Warrior / DK / Priest forms — anything that lives in the shapeshift bar. Non-form auras (regular buffs) cannot be expressed as a stance index and are out of scope.
Why upstream can't accept this patch as-is
SecureCmdOptionParse is hardcoded in the WoW client; addons cannot
register new conditional keywords into it. Our translation pass runs
before RegisterStateDriver, rewriting [aura:Name] to [stance:N]
at addon scope. That works on a private server with predictable form
sets, but upstream serves multiple expansions and clients where the
keyword aura may eventually mean something different (or be reserved
by Blizzard) — so it stays a fork patch.
Files we touched
| File | Change |
|---|---|
Bartender4.toc |
Version …-coa1, loads CoAAuraConditionals.lua, Notes appended |
StateBar.lua |
3-line guard before RegisterStateDriver calls our translator |
CoAAuraConditionals.lua |
New file — the translator + UPDATE_SHAPESHIFT_FORMS re-apply |
.gitattributes |
* -text so we don't normalise upstream CRLF (keeps merges clean) |
Pulling future upstream releases
Upstream lives at https://github.com/Nevcairiel/Bartender4. The patch is small and the touched files are stable, so future merges should be mostly painless:
git remote add upstream https://github.com/Nevcairiel/Bartender4.git
git fetch upstream
git merge upstream/master # or whatever upstream's default is
# resolve trivial conflicts in StateBar.lua + Bartender4.toc
luac -p StateBar.lua CoAAuraConditionals.lua
Verifying it works
In-game, run any of:
/run print(SecureCmdOptionParse("[stance:Beetle Form]yes;no"))
/run print(SecureCmdOptionParse("[aura:Beetle Form]yes;no"))
Both should print no even when in Beetle Form, because Blizzard's
parser still doesn't understand the names — but Bartender4's paging
will work, because the translator rewrites the string before
handing it to the state driver. To verify that, set up paging as
[aura:Beetle Form]6;1 in Bar 1 → State Configuration → Custom, shift
into Beetle Form, and watch Bar 1 swap to page 6.