fix(CoAAuraConditionals): stop refreshing on PLAYER_ENTERING_WORLD
release / release (push) Successful in 3s

Calling bar:UpdateStates() on every zone load was the most likely path
to the "AddOn 'Bartender4' prevented the call of the secure function
'SecureStateDriverManager:SetAttribute()'" warning — RegisterStateDriver
runs internally and every zone fired it across all bars, sometimes
while Bartender's own init was still resolving secure state.

- Drop PLAYER_ENTERING_WORLD as a trigger. Bartender's own init handles
  the initial state; UPDATE_SHAPESHIFT_FORMS fires when forms become
  resolvable on login, so the original intent still holds.
- Cache the shapeshift-form signature and skip the refresh if it hasn't
  actually changed since last run. Avoids redundant secure attribute
  churn from routine UPDATE_SHAPESHIFT_FORMS spam.
- Combat-lockdown guard + PLAYER_REGEN_ENABLED queue-drain unchanged.
This commit is contained in:
2026-05-25 12:04:14 +02:00
parent 9aba0f41b3
commit cd2a99bd02
+29 -1
View File
@@ -91,11 +91,31 @@ end
-- spec respec, etc.) so freshly-resolvable names take effect without
-- a /reload. Skipped during combat lockdown — RegisterStateDriver is
-- secure and the SetAttribute calls inside UpdateStates would taint.
--
-- Triggers: UPDATE_SHAPESHIFT_FORMS (the form set actually changed)
-- and PLAYER_REGEN_ENABLED (drain a refresh queued during combat).
-- PLAYER_ENTERING_WORLD is deliberately NOT a trigger — Bartender's
-- own init handles the initial state, and firing UpdateStates on every
-- zone risked re-entering secure paths while Bartender was mid-flux,
-- producing "prevented the call of SecureStateDriverManager:SetAttribute".
local refresh = CreateFrame("Frame")
refresh:RegisterEvent("UPDATE_SHAPESHIFT_FORMS")
refresh:RegisterEvent("PLAYER_ENTERING_WORLD")
refresh:RegisterEvent("PLAYER_REGEN_ENABLED")
local lastFormSignature
local pendingRefresh = false
local function currentFormSignature()
if type(GetNumShapeshiftForms) ~= "function" then return "" end
local n = GetNumShapeshiftForms() or 0
local parts = {}
for i = 1, n do
local _, fname = GetShapeshiftFormInfo(i)
parts[#parts + 1] = fname or ""
end
return table.concat(parts, "|")
end
refresh:SetScript("OnEvent", function(self, event)
if InCombatLockdown and InCombatLockdown() then
pendingRefresh = true
@@ -103,6 +123,14 @@ refresh:SetScript("OnEvent", function(self, event)
end
if event == "PLAYER_REGEN_ENABLED" and not pendingRefresh then return end
pendingRefresh = false
-- Skip the refresh entirely if the form set hasn't changed since
-- last run. Avoids redundant RegisterStateDriver churn on routine
-- 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