local GetActionInfo, GetActionTexture = GetActionInfo, GetActionTexture;
local GetActionLossOfControlCooldown = GetActionLossOfControlCooldown;
local GetActionCooldown, GetActionCharges = GetActionCooldown, GetActionCharges;
+local GetActionText, GetBindingKey = GetActionText, GetBindingKey;
local IsConsumableAction, IsStackableAction = IsConsumableAction, IsStackableAction;
local IsItemAction, GetActionCount = IsItemAction, GetActionCount;
local IsSpellOverlayed, GetMacroSpell = IsSpellOverlayed, GetMacroSpell;
local CreateFrame = CreateFrame;
local RegisterStateDriver = RegisterStateDriver;
local CooldownFrame_Set, CooldownFrame_Clear = CooldownFrame_Set, CooldownFrame_Clear;
-local CTimerAfter = C_Timer.After;
local GameTooltip = GameTooltip;
local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor;
local COOLDOWN_TYPE_LOSS_OF_CONTROL = COOLDOWN_TYPE_LOSS_OF_CONTROL;
bar = 5,
start = 49,
length = 12,
- columns = 3,
x = 1000,
y = 840,
},
};
local chars = {
+ ["Sylvanas"] = {
+ ["Vildana"] = {1, 2, 3, 4,},
+ },
["Stormreaver"] = {
["Vildan"] = {1, 2, 3, 4,},
["Gedren"] = {1, 2, 3, 4,},
+ ["Gazden"] = {1, 2, 3, 4,},
+ ["Gedran"] = {1, 2, 3, 4,},
+ ["Iled"] = {1, 2, 3, 4,},
+ ["Gilden"] = {1, 2, 3, 4,},
},
};
local locstart, locduration = GetActionLossOfControlCooldown(slot);
local start, duration, enable, modrate = GetActionCooldown(slot);
local charges, maxcharges, chargestart, chargeduration, chargemodrate = GetActionCharges(slot);
+ -- avoid as many updates as possible by checking if there's changes first
+ if button.prev and
+ button.prev[1] == locstart and button.prev[2] == locduration and
+ button.prev[3] == start and button.prev[4] == duration and
+ button.prev[5] == enable and button.prev[6] == modrate and
+ button.prev[7] == charges and button.prev[8] == maxcharges and
+ button.prev[9] == chargestart and button.prev[10] == chargeduration and
+ button.prev[11] == chargemodrate then
+ return;
+ end
+ button.prev = { locstart, locduration, start, duration, enable, modrate,
+ charges, maxcharges, chargestart, chargeduration, chargemodrate };
if (locstart + locduration) > (start + duration) then
if button.cd.currentCooldownType ~= COOLDOWN_TYPE_LOSS_OF_CONTROL then
button.cd:SetEdgeTexture(locCDTexture);
end
local function updateGlow(button, slot)
- local stype, id, _ = GetActionInfo(slot);
+ local stype, id = GetActionInfo(slot);
if stype == "spell" and IsSpellOverlayed(id) then
button.glow:Show();
elseif stype == "macro" then
- local _, _, macroid = GetMacroSpell(id);
+ local macroid = GetMacroSpell(id);
if macroid and IsSpellOverlayed(macroid) then
button.glow:Show();
else
end
local function startGlow(button, slot, spell)
- local stype, id, _ = GetActionInfo(slot);
+ local stype, id = GetActionInfo(slot);
if stype == "spell" and id == spell then
button.glow:Show();
elseif stype == "macro" then
- local _, _, macroid = GetMacroSpell(id);
+ local macroid = GetMacroSpell(id);
if macroid and macroid == spell then
button.glow:Show();
end
end
local function stopGlow(button, slot, spell)
- local stype, id, _ = GetActionInfo(slot);
+ local stype, id = GetActionInfo(slot);
if stype == "spell" and id == spell then
button.glow:Hide();
elseif stype == "macro" then
- local _, _, macroid = GetMacroSpell(id);
+ local macroid = GetMacroSpell(id);
if macroid and macroid == spell then
button.glow:Hide();
end
secure:SetAttribute("flyoutDirection", config.flyout);
end
function secure:ActionChanged(oldslot)
- if oldslot then activeButtons[oldslot] = nil end
+ if oldslot then
+ activeButtons[oldslot] = nil;
+ self.prev = nil; -- invalidate previous CD when slot changes
+ end
self.slot = self:GetAttribute("action");
return updateButton(self, self.slot);
end
end
local function setupBindings()
- BINDING_HEADER_OmaAB = "Oma Action Bar";
+ _G["BINDING_HEADER_OmaAB"] = "Oma Action Bar";
for i = 1,10 do
_G["BINDING_HEADER_OMAABBLANK"..i] = "Bar "..i;
for j = 1,12 do
end
local mounted = false;
--- throttleCD 3-state, nil -> false -> true -> nil
--- this way there's not double update each time the first
--- update event comes, instead the extra throttled update comes
--- if there are >2 ACTIONBAR_UPDATE_COOLDOWN events in one frame
-local throttleCD = nil;
-local function throttleCDDone()
- -- update CD once more to confirm newest CD change is taken in even with some throttling
- for _, button in pairs(activeButtons) do
- updateCooldown(button, button.slot);
- end
-end
-local function throttleCDReset()
- throttleCD = nil;
-end
local events = {
["ACTIONBAR_UPDATE_COOLDOWN"] = function()
- if not throttleCD then -- only update at most once/frame
- throttleCD = throttleCD == false and true or false;
- if throttleCD then
- CTimerAfter(0.01, throttleCDDone); -- wait one frame
- else
- for _, button in pairs(activeButtons) do
- updateCooldown(button, button.slot);
- end
- CTimerAfter(0.01, throttleCDReset); -- wait one frame
- end
+ for _, button in pairs(activeButtons) do
+ updateCooldown(button, button.slot);
end
end,
["SPELL_UPDATE_CHARGES"] = function()
end
end,
["PLAYER_LOGIN"] = function()
- GameTooltip = _G["GameTooltip"];
initialize();
end,
["ADDON_LOADED"] = function(addon)
end,
};
events["LOSS_OF_CONTROL_ADDED"] = events["ACTIONBAR_UPDATE_COOLDOWN"];
-events["LOSS_OF_CONTROL_UPDATE"] = events["ACTIONBAR_UPDATE_COOLDOWN"]; -- TODO might change once tooltips are in
+events["LOSS_OF_CONTROL_UPDATE"] = events["ACTIONBAR_UPDATE_COOLDOWN"];
events["PLAYER_MOUNT_DISPLAY_CHANGED"] = events["ACTIONBAR_UPDATE_USABLE"];
events["TRADE_SKILL_SHOW"] = events["ACTIONBAR_UPDATE_STATE"];
events["TRADE_SKILL_CLOSE"] = events["ACTIONBAR_UPDATE_STATE"];