Files
coa-bartender/README-CoA.md
T
florian.berthold a32bba6dc0 feat(paging): accept [aura:Name] / [form:Name] / [stance:Name] form-name conditionals
Translate non-numeric stance/form/aura conditionals to [stance:N] via
GetShapeshiftFormInfo() before handing the string to RegisterStateDriver.
Lets CoA custom-class users write self-documenting paging strings:

    [aura:Beetle Form]6;1     -- instead of [stance:1]6;1
    [stance:Beetle Form/Wasp Form]9
    [noaura:Beetle Form]2

All three keywords (aura, form, stance) are accepted equivalently when
the value is a non-numeric form name. Numeric values pass through
unchanged. Unresolved names are left as-is so the failure is visible
at parse time.

Re-applies on UPDATE_SHAPESHIFT_FORMS / PLAYER_ENTERING_WORLD so newly
learned forms take effect without a /reload (defers during combat
lockdown to avoid taint).

Bumps Version to 4.4.2-2-g3b02ee4-coa1 so the loaded copy is
identifiable in-game.
2026-05-08 03:45:58 +02:00

3.6 KiB

CoA Bartender4

This is the Children of Ascension fork of Bartender4 by Hendrik "Nevcairiel" Leppkes, vendored from Ascension's WotLK 3.3.5 client (/srv/add01/wow-ascension/Interface/AddOns/Bartender4, 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.

[aura:Beetle Form]6;1            -- equivalent to [stance:N]6;1
[form:Beetle Form]6;1
[stance:Beetle Form]6;1          -- non-numeric value also accepted

[stance:Beetle Form/Wasp Form]9  -- slash-lists work
[noaura:Beetle Form]2            -- negation works

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

Deploying

rsync -a --delete \
  --exclude=.git --exclude=.gitattributes --exclude='README-CoA.md' \
  /home/sub/repos/coa/coa-bartender/ \
  /srv/add01/wow-ascension/Interface/AddOns/Bartender4/

Same for wow-ptr. After deploy the in-game version string reads 4.4.2-2-g3b02ee4-coa1, so you can confirm the patched copy is loaded.

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.