Compare commits

...

5 commits

Author SHA1 Message Date
aadeb06793 fix: cache form signature only after bar refresh actually runs
UPDATE_SHAPESHIFT_FORMS firing before the ActionBars module exists
cached the signature without refreshing, causing the identical later
event to be skipped.
2026-06-10 02:14:21 +02:00
6c0c1f0624 ci(release): sync release.yml from coa-template
hide_archive_links is only honored by Gitea on release edit, not create —
add the PATCH step after create/lookup so auto-generated source archive
links actually stay hidden (coa-template 90874c5).
2026-06-10 02:11:46 +02:00
bb20d1df36 ci(release): hide auto-generated source archives (hide_archive_links) 2026-05-29 20:51:21 +02:00
c88e53d18b fix(libs): pcall AceGUI OnGamePadButtonDown (3.3.5 has no gamepad script type)
All checks were successful
release / release (push) Successful in 2s
2026-05-29 20:23:32 +02:00
b9bb16f632 fix(MultiCast): nil-safe Enum.ClassMask guard so file-load can't crash for custom classes 2026-05-29 10:43:54 +02:00
5 changed files with 23 additions and 11 deletions

View file

@ -37,10 +37,14 @@ jobs:
RID=$(curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"$API/repos/$REPO/releases" \
-d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false}')" \
-d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false,hide_archive_links:true}')" \
| jq -r '.id')
fi
echo "release id: $RID"
# Gitea honors hide_archive_links only on edit, not create — PATCH it
# so the auto-generated Source Code (zip/tar.gz) links stay hidden.
curl -sf -X PATCH -H "Authorization: token $GITEA_TOKEN" -H "Content-Type: application/json" \
"$API/repos/$REPO/releases/$RID" -d '{"hide_archive_links":true}' >/dev/null || true
# Upload every dist/*.zip. Per-asset failures don't fail the job —
# we want partial releases to still publish rather than block the
# whole pipeline on one big file.

View file

@ -129,11 +129,13 @@ refresh:SetScript("OnEvent", function(self, event)
-- UPDATE_SHAPESHIFT_FORMS spam.
local sig = currentFormSignature()
if sig == lastFormSignature then return end
lastFormSignature = sig
local mod = Bartender4 and Bartender4.GetModule and Bartender4:GetModule("ActionBars", true)
if not mod or not mod.actionbars then return end
for _, bar in pairs(mod.actionbars) do
if bar and bar.UpdateStates then bar:UpdateStates() end
end
-- Only cache the signature once a refresh actually ran, so an event
-- arriving before module init doesn't swallow the next identical one.
lastFormSignature = sig
end)

View file

@ -7,11 +7,14 @@ if not HasMultiCastActionBar then return end
local classMask = UnitClassMask("player")
-- CoA: the SHAMAN/HERO mask check doesn't know about CoA custom classes
-- (e.g. Witchdoctor, which also uses the totem bar). Fall back to the
-- game-created MultiCastActionBarFrame: if the engine produced it for this
-- player, we wrap it regardless of class.
if not bit.contains(EnumUtil.CombineMasks(Enum.ClassMask.SHAMAN, Enum.ClassMask.HERO), classMask)
-- CoA: Enum.ClassMask only knows vanilla classes (SHAMAN/HERO); custom classes
-- (e.g. Witchdoctor) won't match. EnumUtil/Enum.ClassMask may also be nil on
-- this client. Guard both: if the mask API is unavailable OR the player's class
-- isn't in the vanilla set, fall through to the MultiCastActionBarFrame check —
-- if the engine created the bar for this player we wrap it regardless of class.
local _vanillaMask = EnumUtil and Enum and Enum.ClassMask
and EnumUtil.CombineMasks(Enum.ClassMask.SHAMAN, Enum.ClassMask.HERO)
if _vanillaMask and not bit.contains(_vanillaMask, classMask)
and not MultiCastActionBarFrame then
return
end

View file

@ -7,9 +7,12 @@ if not HasMultiCastActionBar then return end
local classMask = UnitClassMask("player")
-- CoA: see MultiCastBar.lua — same gate, same fallback so the options
-- panel is registered for custom classes (e.g. Witchdoctor) too.
if not bit.contains(EnumUtil.CombineMasks(Enum.ClassMask.SHAMAN, Enum.ClassMask.HERO), classMask)
-- CoA: see MultiCastBar.lua — same gate, same fallback so the options panel is
-- registered for custom classes (e.g. Witchdoctor) too. Guard EnumUtil /
-- Enum.ClassMask for nil in case they are absent on this client.
local _vanillaMask = EnumUtil and Enum and Enum.ClassMask
and EnumUtil.CombineMasks(Enum.ClassMask.SHAMAN, Enum.ClassMask.HERO)
if _vanillaMask and not bit.contains(_vanillaMask, classMask)
and not MultiCastActionBarFrame then
return
end

View file

@ -199,7 +199,7 @@ local function Constructor()
button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel)
button:SetScript("OnGamePadButtonDown", Keybinding_OnKeyDown)
pcall(button.SetScript, button, "OnGamePadButtonDown", Keybinding_OnKeyDown)
button:SetPoint("BOTTOMLEFT")
button:SetPoint("BOTTOMRIGHT")
button:SetHeight(24)