From 0b512af2b7ba5f537e8f56bf27d89db6c53bb6af Mon Sep 17 00:00:00 2001 From: Sumsebrum Date: Thu, 27 Jan 2022 01:02:31 +0100 Subject: [PATCH] cooldowns first refactor: - no more lastCooldownSpell - unused icons are in iconCache for later reuse - only create as many icons as needed - no more weired indexing - cleanup duplicate code - testmode cleanup --- Modules/Cooldowns.lua | 569 ++++++++++++++++++++---------------------- 1 file changed, 269 insertions(+), 300 deletions(-) diff --git a/Modules/Cooldowns.lua b/Modules/Cooldowns.lua index 9c8b190..61ec21a 100644 --- a/Modules/Cooldowns.lua +++ b/Modules/Cooldowns.lua @@ -1,4 +1,4 @@ -local type, pairs, ipairs, ceil, tonumber, mod, tostring, upper, select = type, pairs, ipairs, ceil, tonumber, mod, tostring, string.upper, select +local type, pairs, ipairs, ceil, tonumber, mod, tostring, upper, select, tinsert, tremove = type, pairs, ipairs, ceil, tonumber, mod, tostring, string.upper, select, tinsert, tremove local GetTime = GetTime local CreateFrame = CreateFrame local RACE_ICON_TCOORDS = { @@ -74,6 +74,7 @@ local Cooldowns = Gladdy:NewModule("Cooldowns", nil, { function Cooldowns:Initialize() self.cooldownSpellIds = {} self.spellTextures = {} + self.iconCache = {} for _,spellTable in pairs(Gladdy:GetCooldownList()) do for spellId,_ in pairs(spellTable) do local spellName, _, texture = GetSpellInfo(spellId) @@ -91,6 +92,10 @@ function Cooldowns:Initialize() self:RegisterMessage("UNIT_DESTROYED") end +--------------------- +-- Frame +--------------------- + function Cooldowns:CreateFrame(unit) local button = Gladdy.buttons[unit] -- Cooldown frame @@ -99,42 +104,105 @@ function Cooldowns:CreateFrame(unit) spellCooldownFrame:SetMovable(true) spellCooldownFrame:SetFrameStrata(Gladdy.db.cooldownFrameStrata) spellCooldownFrame:SetFrameLevel(Gladdy.db.cooldownFrameLevel) - for x = 1, 14 do - local icon = CreateFrame("Frame", nil, spellCooldownFrame) + spellCooldownFrame.icons = {} + button.spellCooldownFrame = spellCooldownFrame +end + +function Cooldowns:CreateIcon() -- returns iconFrame + local icon + if (#self.iconCache > 0) then + icon = tremove(self.iconCache, #self.iconCache) + else + icon = CreateFrame("Frame") icon:EnableMouse(false) - icon:SetFrameStrata(Gladdy.db.cooldownFrameStrata) - icon:SetFrameLevel(Gladdy.db.cooldownFrameLevel) + icon.texture = icon:CreateTexture(nil, "BACKGROUND") icon.texture:SetMask("Interface\\AddOns\\Gladdy\\Images\\mask") icon.texture:SetAllPoints(icon) icon.cooldown = CreateFrame("Cooldown", nil, icon, "CooldownFrameTemplate") icon.cooldown.noCooldownCount = true - - icon.cooldown:SetFrameStrata(Gladdy.db.cooldownFrameStrata) - icon.cooldown:SetFrameLevel(Gladdy.db.cooldownFrameLevel + 1) icon.cooldown:SetReverse(false) icon.cooldown:SetHideCountdownNumbers(true) icon.cooldownFrame = CreateFrame("Frame", nil, icon) icon.cooldownFrame:ClearAllPoints() icon.cooldownFrame:SetAllPoints(icon) - icon.cooldownFrame:SetFrameStrata(Gladdy.db.cooldownFrameStrata) - icon.cooldownFrame:SetFrameLevel(Gladdy.db.cooldownFrameLevel + 2) icon.border = icon.cooldownFrame:CreateTexture(nil, "OVERLAY") icon.border:SetAllPoints(icon) - icon.border:SetTexture(Gladdy.db.cooldownBorderStyle) - icon.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.cooldownBorderColor)) icon.cooldownFont = icon.cooldownFrame:CreateFontString(nil, "OVERLAY") - icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 2 * Gladdy.db.cooldownFontScale, "OUTLINE") - icon.cooldownFont:SetTextColor(Gladdy:SetColor(Gladdy.db.cooldownFontColor)) icon.cooldownFont:SetAllPoints(icon) - spellCooldownFrame["icon" .. x] = icon + self:UpdateIcon(icon) + end + return icon +end + +function Cooldowns:UpdateIcon(icon) + icon:SetFrameStrata(Gladdy.db.cooldownFrameStrata) + icon:SetFrameLevel(Gladdy.db.cooldownFrameLevel) + icon.cooldown:SetFrameStrata(Gladdy.db.cooldownFrameStrata) + icon.cooldown:SetFrameLevel(Gladdy.db.cooldownFrameLevel + 1) + icon.cooldownFrame:SetFrameStrata(Gladdy.db.cooldownFrameStrata) + icon.cooldownFrame:SetFrameLevel(Gladdy.db.cooldownFrameLevel + 2) + + icon:SetHeight(Gladdy.db.cooldownSize) + icon:SetWidth(Gladdy.db.cooldownSize * Gladdy.db.cooldownWidthFactor) + icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 2 * Gladdy.db.cooldownFontScale, "OUTLINE") + icon.cooldownFont:SetTextColor(Gladdy:SetColor(Gladdy.db.cooldownFontColor)) + + icon.cooldown:SetWidth(icon:GetWidth() - icon:GetWidth()/16) + icon.cooldown:SetHeight(icon:GetHeight() - icon:GetHeight()/16) + icon.cooldown:ClearAllPoints() + icon.cooldown:SetPoint("CENTER", icon, "CENTER") + icon.cooldown:SetAlpha(Gladdy.db.cooldownCooldownAlpha) + + icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), (icon:GetWidth()/2 - 1) * Gladdy.db.cooldownFontScale, "OUTLINE") + icon.cooldownFont:SetTextColor(Gladdy:SetColor(Gladdy.db.cooldownFontColor)) + + icon.border:SetTexture(Gladdy.db.cooldownBorderStyle) + icon.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.cooldownBorderColor)) +end + +function Cooldowns:IconsSetPoint(button) + for i,icon in ipairs(button.spellCooldownFrame.icons) do + icon:SetParent(button.spellCooldownFrame) + icon:ClearAllPoints() + if (Gladdy.db.cooldownXGrowDirection == "LEFT") then + if (i == 1) then + icon:SetPoint("LEFT", button.spellCooldownFrame, "LEFT", 0, 0) + elseif (mod(i-1,Gladdy.db.cooldownMaxIconsPerLine) == 0) then + if (Gladdy.db.cooldownYGrowDirection == "DOWN") then + icon:SetPoint("TOP", button.spellCooldownFrame.icons[i-Gladdy.db.cooldownMaxIconsPerLine], "BOTTOM", 0, -Gladdy.db.cooldownIconPadding) + else + icon:SetPoint("BOTTOM", button.spellCooldownFrame.icons[i-Gladdy.db.cooldownMaxIconsPerLine], "TOP", 0, Gladdy.db.cooldownIconPadding) + end + else + icon:SetPoint("RIGHT", button.spellCooldownFrame.icons[i-1], "LEFT", -Gladdy.db.cooldownIconPadding, 0) + end + end + if (Gladdy.db.cooldownXGrowDirection == "RIGHT") then + if (i == 1) then + icon:SetPoint("LEFT", button.spellCooldownFrame, "LEFT", 0, 0) + elseif (mod(i-1,Gladdy.db.cooldownMaxIconsPerLine) == 0) then + if (Gladdy.db.cooldownYGrowDirection == "DOWN") then + icon:SetPoint("TOP", button.spellCooldownFrame.icons[i-Gladdy.db.cooldownMaxIconsPerLine], "BOTTOM", 0, -Gladdy.db.cooldownIconPadding) + else + icon:SetPoint("BOTTOM", button.spellCooldownFrame.icons[i-Gladdy.db.cooldownMaxIconsPerLine], "TOP", 0, Gladdy.db.cooldownIconPadding) + end + else + icon:SetPoint("LEFT", button.spellCooldownFrame.icons[i-1], "RIGHT", Gladdy.db.cooldownIconPadding, 0) + end + end + end +end + +function Cooldowns:UpdateFrameOnce() + for _,icon in ipairs(self.iconCache) do + Cooldowns:UpdateIcon(icon) end - button.spellCooldownFrame = spellCooldownFrame end function Cooldowns:UpdateFrame(unit) @@ -145,7 +213,6 @@ function Cooldowns:UpdateFrame(unit) button.spellCooldownFrame:SetWidth(1) button.spellCooldownFrame:SetFrameStrata(Gladdy.db.cooldownFrameStrata) button.spellCooldownFrame:SetFrameLevel(Gladdy.db.cooldownFrameLevel) - button.spellCooldownFrame:Show() Gladdy:SetPosition(button.spellCooldownFrame, unit, "cooldownXOffset", "cooldownYOffset", Cooldowns:LegacySetPosition(button, unit), Cooldowns) @@ -155,92 +222,65 @@ function Cooldowns:UpdateFrame(unit) Gladdy.db.cooldownSize * Gladdy.db.cooldownWidthFactor, Gladdy.db.cooldownSize, 0, 0, "cooldown") end -- Update each cooldown icon - local o = 1 - for j = 1, 14 do - local icon = button.spellCooldownFrame["icon" .. j] - - icon:SetFrameStrata(Gladdy.db.cooldownFrameStrata) - icon:SetFrameLevel(Gladdy.db.cooldownFrameLevel) - icon.cooldown:SetFrameStrata(Gladdy.db.cooldownFrameStrata) - icon.cooldown:SetFrameLevel(Gladdy.db.cooldownFrameLevel + 1) - icon.cooldownFrame:SetFrameStrata(Gladdy.db.cooldownFrameStrata) - icon.cooldownFrame:SetFrameLevel(Gladdy.db.cooldownFrameLevel + 2) - - icon:SetHeight(Gladdy.db.cooldownSize) - icon:SetWidth(Gladdy.db.cooldownSize * Gladdy.db.cooldownWidthFactor) - icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 2 * Gladdy.db.cooldownFontScale, "OUTLINE") - icon.cooldownFont:SetTextColor(Gladdy:SetColor(Gladdy.db.cooldownFontColor)) - icon:ClearAllPoints() - if (Gladdy.db.cooldownXGrowDirection == "LEFT") then - if (j == 1) then - icon:SetPoint("LEFT", button.spellCooldownFrame, "LEFT", 0, 0) - elseif (mod(j-1,Gladdy.db.cooldownMaxIconsPerLine) == 0) then - if (Gladdy.db.cooldownYGrowDirection == "DOWN") then - icon:SetPoint("TOP", button.spellCooldownFrame["icon" .. o], "BOTTOM", 0, -Gladdy.db.cooldownIconPadding) - else - icon:SetPoint("BOTTOM", button.spellCooldownFrame["icon" .. o], "TOP", 0, Gladdy.db.cooldownIconPadding) - end - o = o + tonumber(Gladdy.db.cooldownMaxIconsPerLine) - else - icon:SetPoint("RIGHT", button.spellCooldownFrame["icon" .. j - 1], "LEFT", -Gladdy.db.cooldownIconPadding, 0) - end - end - if (Gladdy.db.cooldownXGrowDirection == "RIGHT") then - if (j == 1) then - icon:SetPoint("LEFT", button.spellCooldownFrame, "LEFT", 0, 0) - elseif (mod(j-1,Gladdy.db.cooldownMaxIconsPerLine) == 0) then - if (Gladdy.db.cooldownYGrowDirection == "DOWN") then - icon:SetPoint("TOP", button.spellCooldownFrame["icon" .. o], "BOTTOM", 0, -Gladdy.db.cooldownIconPadding) - else - icon:SetPoint("BOTTOM", button.spellCooldownFrame["icon" .. o], "TOP", 0, Gladdy.db.cooldownIconPadding) - end - o = o + tonumber(Gladdy.db.cooldownMaxIconsPerLine) - else - icon:SetPoint("LEFT", button.spellCooldownFrame["icon" .. j - 1], "RIGHT", Gladdy.db.cooldownIconPadding, 0) - end - end - - if (icon.active) then - icon.active = false - icon.cooldown:SetCooldown(GetTime(), 0) - icon.cooldownFont:SetText("") - icon:SetScript("OnUpdate", nil) - end - icon.spellId = nil - icon:SetAlpha(1) - icon.texture:SetTexture("Interface\\Icons\\Spell_Holy_PainSupression") - - icon.cooldown:SetWidth(icon:GetWidth() - icon:GetWidth()/16) - icon.cooldown:SetHeight(icon:GetHeight() - icon:GetHeight()/16) - icon.cooldown:ClearAllPoints() - icon.cooldown:SetPoint("CENTER", icon, "CENTER") - icon.cooldown:SetAlpha(Gladdy.db.cooldownCooldownAlpha) - - icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), (icon:GetWidth()/2 - 1) * Gladdy.db.cooldownFontScale, "OUTLINE") - icon.cooldownFont:SetTextColor(Gladdy:SetColor(Gladdy.db.cooldownFontColor)) - - icon.border:SetTexture(Gladdy.db.cooldownBorderStyle) - icon.border:SetVertexColor(Gladdy:SetColor(Gladdy.db.cooldownBorderColor)) - icon:Hide() + for _,icon in pairs(button.spellCooldownFrame.icons) do + self:UpdateIcon(icon) end + self:IconsSetPoint(button) button.spellCooldownFrame:Show() else button.spellCooldownFrame:Hide() end - if (Gladdy.frame.testing) then - self:Test(unit) +end + +function Cooldowns:ResetUnit(unit) + local button = Gladdy.buttons[unit] + if not button then + return + end + for i=#button.spellCooldownFrame.icons,1,-1 do + self:ClearIcon(button, i) end end +function Cooldowns:ClearIcon(button, index, spellId, icon) + if index then + icon = tremove(button.spellCooldownFrame.icons, index) + else + for i=#button.spellCooldownFrame.icons,1,-1 do + if icon then + if button.spellCooldownFrame.icons[i] == icon then + icon = tremove(button.spellCooldownFrame.icons, index) + end + end + if not icon and spellId then + if button.spellCooldownFrame.icons[i].spellId == spellId then + icon = tremove(button.spellCooldownFrame.icons, index) + end + end + end + end + icon:ClearAllPoints() + icon:SetParent(nil) + icon:Hide() + icon.spellId = nil + icon.active = false + icon.cooldown:Hide() + icon.cooldownFont:SetText("") + icon:SetScript("OnUpdate", nil) + tinsert(self.iconCache, icon) +end + +--------------------- +-- Test +--------------------- + function Cooldowns:Test(unit) local button = Gladdy.buttons[unit] if Gladdy.db.cooldown then button.spellCooldownFrame:Show() - button.lastCooldownSpell = 1 self:UpdateTestCooldowns(unit) else button.spellCooldownFrame:Hide() - button.lastCooldownSpell = 1 self:UpdateTestCooldowns(unit) end @@ -250,11 +290,9 @@ function Cooldowns:UpdateTestCooldowns(unit) local button = Gladdy.buttons[unit] if (button.testSpec and button.testSpec == Gladdy.testData[unit].testSpec) then - button.lastCooldownSpell = 1 self:UpdateCooldowns(button) button.spec = nil self:DetectSpec(unit, button.testSpec) - button.test = true -- use class spells for spellId,_ in pairs(Gladdy:GetCooldownList()[button.class]) do @@ -267,6 +305,10 @@ function Cooldowns:UpdateTestCooldowns(unit) end end +--------------------- +-- Events +--------------------- + function Cooldowns:ENEMY_SPOTTED(unit) self:UpdateCooldowns(Gladdy.buttons[unit]) end @@ -275,18 +317,25 @@ function Cooldowns:SPEC_DETECTED(unit, spec) self:DetectSpec(unit, spec) end +function Cooldowns:UNIT_DESTROYED(unit) + +end + +--------------------- +-- Cooldown Start/Ready +--------------------- + function Cooldowns:CooldownStart(button, spellId, duration, start) -- starts timer frame if not duration or duration == nil or type(duration) ~= "number" then return end - for i = 1, button.lastCooldownSpell + 1 do - if (button.spellCooldownFrame["icon" .. i].spellId == spellId) then - local frame = button.spellCooldownFrame["icon" .. i] - frame.active = true - frame.timeLeft = start and start - GetTime() + duration or duration - if (not Gladdy.db.cooldownDisableCircle) then frame.cooldown:SetCooldown(start or GetTime(), duration) end - frame:SetScript("OnUpdate", function(self, elapsed) + for _,icon in pairs(button.spellCooldownFrame.icons) do + if (icon.spellId == spellId) then + icon.active = true + icon.timeLeft = start and start - GetTime() + duration or duration + if (not Gladdy.db.cooldownDisableCircle) then icon.cooldown:SetCooldown(start or GetTime(), duration) end + icon:SetScript("OnUpdate", function(self, elapsed) self.timeLeft = self.timeLeft - elapsed local timeLeft = ceil(self.timeLeft) if timeLeft >= 540 then @@ -298,26 +347,25 @@ function Cooldowns:CooldownStart(button, spellId, duration, start) end Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 0) if (self.timeLeft <= 0) then - Cooldowns:CooldownReady(button, spellId, frame) + Cooldowns:CooldownReady(button, spellId, icon) end if (self.timeLeft <= 0) then - Cooldowns:CooldownReady(button, spellId, frame) + Cooldowns:CooldownReady(button, spellId, icon) end end) + --C_VoiceChat.SpeakText(2, GetSpellInfo(spellId), 3, 4, 100) end end end function Cooldowns:CooldownReady(button, spellId, frame) if (frame == false) then - for i = 1, button.lastCooldownSpell do - frame = button.spellCooldownFrame["icon" .. i] - - if (frame.spellId == spellId) then - frame.active = false - frame.cooldown:Hide() - frame.cooldownFont:SetText("") - frame:SetScript("OnUpdate", nil) + for _,icon in pairs(button.spellCooldownFrame.icons) do + if (icon.spellId == spellId) then + icon.active = false + icon.cooldown:Hide() + icon.cooldownFont:SetText("") + icon:SetScript("OnUpdate", nil) end end else @@ -328,175 +376,6 @@ function Cooldowns:CooldownReady(button, spellId, frame) end end -local function notIn(spec, list) - for _,v in ipairs(list) do - if spec == v then - return false - end - end - return true -end - -function Cooldowns:DetectSpec(unit, spec) - - local button = Gladdy.buttons[unit] - if (not button or not spec or button.spec) then - return - end - if button.class == "PALADIN" and notIn(spec, {L["Holy"], L["Retribution"], L["Protection"]}) - or button.class == "SHAMAN" and notIn(spec, {L["Restoration"], L["Enhancement"], L["Elemental"]}) - or button.class == "ROGUE" and notIn(spec, {L["Subtlety"], L["Assassination"], L["Combat"]}) - or button.class == "WARLOCK" and notIn(spec, {L["Demonology"], L["Destruction"], L["Affliction"]}) - or button.class == "PRIEST" and notIn(spec, {L["Shadow"], L["Discipline"], L["Holy"]}) - or button.class == "MAGE" and notIn(spec, {L["Frost"], L["Fire"], L["Arcane"]}) - or button.class == "DRUID" and notIn(spec, {L["Restoration"], L["Feral"], L["Balance"]}) - or button.class == "HUNTER" and notIn(spec, {L["Beast Mastery"], L["Marksmanship"], L["Survival"]}) - or button.class == "WARRIOR" and notIn(spec, {L["Arms"], L["Protection"], L["Fury"]}) then - return - end - - button.spec = spec - if not button.test then - Gladdy:SendMessage("UNIT_SPEC", unit, spec) - end - - - -- update cooldown tracker - --[[ - All of this could possibly be handled in a "once they're used, they show up"-manner - but I PERSONALLY prefer it this way. It also meant less work and makes spec-specific cooldowns easier - ]] - if (Gladdy.db.cooldown) then - local class = Gladdy.buttons[unit].class - for k, v in pairs(Gladdy:GetCooldownList()[class]) do - if Gladdy.db.cooldownCooldowns[tostring(k)] then - --if (self.db.cooldownList[k] ~= false and self.db.cooldownList[class] ~= false) then - if (type(v) == "table" and ((v.spec ~= nil and v.spec == spec) or (v.notSpec ~= nil and v.notSpec ~= spec))) then - local sharedCD = false - if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then - for spellId, _ in pairs(v.sharedCD) do - for i = 1, button.lastCooldownSpell do - local icon = button.spellCooldownFrame["icon" .. i] - if (icon.spellId == spellId) then - sharedCD = true - end - end - end - end - if sharedCD then - return - end - - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.texture:SetTexture(self.spellTextures[k]) - icon.spellId = k - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 - end - end - end - end - ---------------------- - --- RACE FUNCTIONALITY - ---------------------- - local race = Gladdy.buttons[unit].race - if Gladdy:GetCooldownList()[race] then - for k, v in pairs(Gladdy:GetCooldownList()[race]) do - if Gladdy.db.cooldownCooldowns[tostring(k)] then - --if (self.db.cooldownList[k] ~= false and self.db.cooldownList[class] ~= false) then - if (type(v) == "table" and ((v.spec ~= nil and v.spec == spec) or (v.notSpec ~= nil and v.notSpec ~= spec))) then - local sharedCD = false - if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then - for spellId, _ in pairs(v.sharedCD) do - for i = 1, button.lastCooldownSpell do - local icon = button.spellCooldownFrame["icon" .. i] - if (icon.spellId == spellId) then - sharedCD = true - end - end - end - end - if sharedCD then - return - end - - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.texture:SetTexture(self.spellTextures[k]) - icon.spellId = k - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 - end - end - end - end -end - -function Cooldowns:ResetUnit(unit) - Gladdy.buttons[unit].lastCooldownSpell = nil - Gladdy.buttons[unit].test = nil -end - -function Cooldowns:UNIT_DESTROYED(unit) - -end - -function Cooldowns:UpdateCooldowns(button) - local class = button.class - local race = button.race - if ( not button.lastCooldownSpell) then - button.lastCooldownSpell = 1 - end - - if (Gladdy.db.cooldown) then - for k, v in pairs(Gladdy:GetCooldownList()[class]) do - if Gladdy.db.cooldownCooldowns[tostring(k)] then - if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil and v.notSpec == nil)) then - -- see if we have shared cooldowns without a cooldown defined - -- e.g. hunter traps have shared cooldowns, so only display one trap instead all of them - local sharedCD = false - if (type(v) == "table" and v.sharedCD ~= nil and v.sharedCD.cd == nil) then - for spellId, _ in pairs(v.sharedCD) do - for i = 1, button.lastCooldownSpell do - local icon = button.spellCooldownFrame["icon" .. i] - if (icon.spellId == spellId) then - sharedCD = true - end - end - end - end - - if (not sharedCD) then - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.spellId = k - icon.texture:SetTexture(self.spellTextures[k]) - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 - end - end - end - end - ---- - -- RACE FUNCTIONALITY - ---- - - for k, v in pairs(Gladdy:GetCooldownList()[race]) do - if Gladdy.db.cooldownCooldowns[tostring(k)] then - if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil and v.notSpec == nil)) then - local icon = button.spellCooldownFrame["icon" .. button.lastCooldownSpell] - icon:Show() - icon.spellId = k - icon.texture:SetTexture(self.spellTextures[k]) - button.spellCooldownFrame["icon" .. button.lastCooldownSpell] = icon - button.lastCooldownSpell = button.lastCooldownSpell + 1 - end - end - end - end -end - function Cooldowns:CooldownUsed(unit, unitClass, spellId, expirationTimeInSeconds) local button = Gladdy.buttons[unit] if not button then @@ -535,8 +414,7 @@ function Cooldowns:CooldownUsed(unit, unitClass, spellId, expirationTimeInSecond for spellID,_ in pairs(cooldown.sharedCD) do if (spellID ~= "cd") then local skip = false - for i = 1, button.lastCooldownSpell do - local icon = button.spellCooldownFrame["icon" .. i] + for _,icon in pairs(button.spellCooldownFrame.icons) do if (icon.spellId == spellID and icon.active and icon.timeLeft > sharedCD) then skip = true break @@ -566,6 +444,119 @@ function Cooldowns:CooldownUsed(unit, unitClass, spellId, expirationTimeInSecond end ]] end +--------------------- +-- Detect Spec +--------------------- + +local function notIn(spec, list) + for _,v in ipairs(list) do + if spec == v then + return false + end + end + return true +end + +function Cooldowns:DetectSpec(unit, spec) + local button = Gladdy.buttons[unit] + if (not button or not spec or button.spec) then + return + end + if button.class == "PALADIN" and notIn(spec, {L["Holy"], L["Retribution"], L["Protection"]}) + or button.class == "SHAMAN" and notIn(spec, {L["Restoration"], L["Enhancement"], L["Elemental"]}) + or button.class == "ROGUE" and notIn(spec, {L["Subtlety"], L["Assassination"], L["Combat"]}) + or button.class == "WARLOCK" and notIn(spec, {L["Demonology"], L["Destruction"], L["Affliction"]}) + or button.class == "PRIEST" and notIn(spec, {L["Shadow"], L["Discipline"], L["Holy"]}) + or button.class == "MAGE" and notIn(spec, {L["Frost"], L["Fire"], L["Arcane"]}) + or button.class == "DRUID" and notIn(spec, {L["Restoration"], L["Feral"], L["Balance"]}) + or button.class == "HUNTER" and notIn(spec, {L["Beast Mastery"], L["Marksmanship"], L["Survival"]}) + or button.class == "WARRIOR" and notIn(spec, {L["Arms"], L["Protection"], L["Fury"]}) then + return + end + if not button.spec then + button.spec = spec + Gladdy:SendMessage("UNIT_SPEC", unit, spec) + Cooldowns:UpdateCooldowns(button) + end +end + +function Cooldowns:AddCooldown(spellID, value, button) + -- see if we have shared cooldowns without a cooldown defined + -- e.g. hunter traps have shared cooldowns, so only display one trap instead all of them + local sharedCD = false + if (type(value) == "table" and value.sharedCD ~= nil and value.sharedCD.cd == nil) then + for spellId, _ in pairs(value.sharedCD) do + for _,icon in pairs(button.spellCooldownFrame.icons) do + if (icon.spellId == spellId) then + sharedCD = true + end + end + end + end + for _,icon in pairs(button.spellCooldownFrame.icons) do + if (icon and icon.spellId == spellID) then + sharedCD = true + end + end + if (not sharedCD) then + local icon = self:CreateIcon() + icon:Show() + icon.spellId = spellID + icon.texture:SetTexture(self.spellTextures[spellID]) + tinsert(button.spellCooldownFrame.icons, icon) + self:IconsSetPoint(button) + Gladdy:Debug("Cooldowns:AddCooldown", button.unit, GetSpellInfo(spellID)) + end +end + +function Cooldowns:UpdateCooldowns(button) + local class = button.class + local race = button.race + local spec = button.spec + if not class or not race then + return + end + + if spec then + if class == "PALADIN" and notIn(spec, {L["Holy"], L["Retribution"], L["Protection"]}) + or class == "SHAMAN" and notIn(spec, {L["Restoration"], L["Enhancement"], L["Elemental"]}) + or class == "ROGUE" and notIn(spec, {L["Subtlety"], L["Assassination"], L["Combat"]}) + or class == "WARLOCK" and notIn(spec, {L["Demonology"], L["Destruction"], L["Affliction"]}) + or class == "PRIEST" and notIn(spec, {L["Shadow"], L["Discipline"], L["Holy"]}) + or class == "MAGE" and notIn(spec, {L["Frost"], L["Fire"], L["Arcane"]}) + or class == "DRUID" and notIn(spec, {L["Restoration"], L["Feral"], L["Balance"]}) + or class == "HUNTER" and notIn(spec, {L["Beast Mastery"], L["Marksmanship"], L["Survival"]}) + or class == "WARRIOR" and notIn(spec, {L["Arms"], L["Protection"], L["Fury"]}) then + return + end + end + + for k, v in pairs(Gladdy:GetCooldownList()[class]) do + if Gladdy.db.cooldownCooldowns[tostring(k)] then + if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil)) then + Cooldowns:AddCooldown(k, v, button) + end + if (type(v) == "table" and v.spec ~= nil and v.spec == spec) then + Cooldowns:AddCooldown(k, v, button) + end + end + end + for k, v in pairs(Gladdy:GetCooldownList()[button.race]) do + if Gladdy.db.cooldownCooldowns[tostring(k)] then + if (type(v) ~= "table" or (type(v) == "table" and v.spec == nil)) then + Cooldowns:AddCooldown(k, v, button) + end + if (type(v) == "table" and v.spec ~= nil and v.spec == spec) then + Cooldowns:AddCooldown(k, v, button) + end + end + end +end + +--------------------- +-- Options +--------------------- + function Cooldowns:GetOptions() return { headerCooldown = { @@ -900,28 +891,6 @@ function Cooldowns:GetCooldownOptions() return group end -function Gladdy:UpdateTestCooldowns(i) - local unit = "arena" .. i - local button = Gladdy.buttons[unit] - - if (button.testSpec and button.testSpec == Gladdy.testData[unit].testSpec) then - button.lastCooldownSpell = 1 - Cooldowns:UpdateCooldowns(button) - button.spec = nil - Cooldowns:DetectSpec(unit, button.testSpec) - - -- use class spells - for spellID,_ in pairs(Gladdy:GetCooldownList()[button.class]) do - --k is spellId - Cooldowns:CooldownUsed(unit, button.class, spellID) - end - -- use race spells - for spellID,_ in pairs(Gladdy:GetCooldownList()[button.race]) do - Cooldowns:CooldownUsed(unit, button.race, spellID) - end - end -end - --------------------------- -- LAGACY HANDLER