From d807b2971c61382b29f482527bab3c77866da883 Mon Sep 17 00:00:00 2001 From: "Johnny C. Lam" Date: Thu, 22 May 2014 12:37:37 +0000 Subject: [PATCH] Fix SpellCooldown(spell) if spell is a shared cooldown name string. Make a list of spells associated with each sharedcd name during script compilation and loop through those spells to get the cooldown information. git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@1487 d5049fe3-3747-40f7-a4b5-f36d6801af5f --- OvaleCompile.lua | 4 ++++ OvaleCooldown.lua | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/OvaleCompile.lua b/OvaleCompile.lua index 7ff066c..4132976 100644 --- a/OvaleCompile.lua +++ b/OvaleCompile.lua @@ -19,6 +19,7 @@ local OvaleTimeSpan = Ovale.OvaleTimeSpan -- Forward declarations for module dependencies. local OvaleCondition = nil +local OvaleCooldown = nil local OvaleData = nil local OvaleEquipement = nil local OvaleOptions = nil @@ -416,6 +417,7 @@ local function ParseSpellInfo(params) end OvaleData.buffSpellList[v][spellId] = true elseif k == "sharedcd" then + OvaleCooldown:AddSharedCooldown(v, spellId) self_sharedCooldownNames[v] = true else si[k] = v @@ -849,6 +851,7 @@ local function CompileScript(text) wipe(self_missingSpellList) wipe(self_functionCalls) wipe(self.customFunctionNode) + OvaleCooldown:ResetSharedCooldowns() -- Return all existing nodes to the node pool. for i, node in pairs(self_node) do @@ -917,6 +920,7 @@ end function OvaleCompile:OnInitialize() -- Resolve module dependencies. OvaleCondition = Ovale.OvaleCondition + OvaleCooldown = Ovale.OvaleCooldown OvaleData = Ovale.OvaleData OvaleEquipement = Ovale.OvaleEquipement OvaleOptions = Ovale.OvaleOptions diff --git a/OvaleCooldown.lua b/OvaleCooldown.lua index 18dc6d3..d0ab5d3 100644 --- a/OvaleCooldown.lua +++ b/OvaleCooldown.lua @@ -30,6 +30,8 @@ local API_UnitClass = UnitClass local _, self_class = API_UnitClass("player") -- Current age of cooldown state. local self_serial = 0 +-- Shared cooldown name (sharedcd) to spell table mapping. +local self_sharedCooldownSpells = {} -- -- @@ -69,6 +71,36 @@ function OvaleCooldown:Update() self_serial = self_serial + 1 end +-- Empty out the sharedcd table. +function OvaleCooldown:ResetSharedCooldowns() + for name, spellTable in pairs(self_sharedCooldownSpells) do + for spellId in pairs(spellTable) do + spellTable[spellId] = nil + end + end +end + +function OvaleCooldown:AddSharedCooldown(name, spellId) + self_sharedCooldownSpells[name] = self_sharedCooldownSpells[name] or {} + self_sharedCooldownSpells[name][spellId] = true +end + +-- Get the cooldown information for the given spell ID. If given a shared cooldown name, +-- then cycle through all spells associated with that spell ID to find the cooldown +-- information. +function OvaleCooldown:GetSpellCooldown(spellId) + local start, duration, enable + if self_sharedCooldownSpells[spellId] then + for id in pairs(self_sharedCooldownSpells[spellId]) do + start, duration, enable = API_GetSpellCooldown(id) + if start then break end + end + else + start, duration, enable = API_GetSpellCooldown(spellId) + end + return start, duration, enable +end + -- Return the GCD after the given spellId is cast. -- If no spellId is given, then returns the GCD after a "yellow-hit" ability has been cast. function OvaleCooldown:GetGCD(spellId) @@ -256,13 +288,13 @@ statePrototype.GetCD = function(state, spellId) -- Populate the cooldown information from the current game state if it is outdated. local cd = state.cd[cdName] if not cd.start or not cd.serial or cd.serial < self_serial then - local start, duration, enable = API_GetSpellCooldown(spellId) + local start, duration, enable = OvaleCooldown:GetSpellCooldown(spellId) if start and start > 0 then charges = 0 end if si and si.forcecd then if si.forcecd then - start, duration = API_GetSpellCooldown(si.forcecd) + start, duration = OvaleCooldown:GetSpellCooldown(si.forcecd) end end cd.serial = self_serial -- 1.7.9.5