From 21f8c6983b1c6e8e58021147d3a1eb319fecea4f Mon Sep 17 00:00:00 2001 From: "Johnny C. Lam" Date: Sun, 7 Jul 2013 04:42:54 +0000 Subject: [PATCH] Don't cheat and stash an extra "Magic/Disease/etc." aura. Remove the workaround that stashed an extra aura whose spellId was the debuff type of the aura. This was to allow for implicit spell lists named "Magic", "Poison", "Disease", and "Curse" that could be used where other spell list names are used. We now just check all of the auras on the target to see if there is one of the named debuff type on the target. As part of the cleanup, rename some "spellId" variable names to "auraID" to reduce namespace collision. git-svn-id: svn://svn.curseforge.net/wow/ovale/mainline/trunk@939 d5049fe3-3747-40f7-a4b5-f36d6801af5f --- OvaleAura.lua | 90 +++++++++++++++++++++++++++++++++++--------------------- OvaleState.lua | 6 ++-- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/OvaleAura.lua b/OvaleAura.lua index c1197c4..e61dd7a 100644 --- a/OvaleAura.lua +++ b/OvaleAura.lua @@ -42,6 +42,13 @@ local self_serial = {} local OVALE_UNKNOWN_GUID = 0 local OVALE_AURA_DEBUG = "aura" +-- Aura debuff types +local OVALE_DEBUFF_TYPES = { + Curse = true, + Disease = true, + Magic = true, + Poison = true, +} -- Units for which UNIT_AURA is known to fire. local OVALE_UNIT_AURA_UNITS = {} do @@ -173,21 +180,21 @@ local function RemoveAurasForGUID(guid, expired) local serial = self_serial[guid] local auraTable = self_aura[guid] for filter, auraList in pairs(auraTable) do - for spellId, whoseTable in pairs(auraList) do + for auraId, whoseTable in pairs(auraList) do for whose, aura in pairs(whoseTable) do if expired then - if RemoveAuraIfExpired(guid, spellId, filter, aura, serial) then + if RemoveAuraIfExpired(guid, auraId, filter, aura, serial) then whoseTable[whose] = nil end else Ovale:DebugPrintf(OVALE_AURA_DEBUG, "Removing %s %s (%s) from %s, serial=%d aura.serial=%d", - filter, aura.name, spellId, guid, serial, aura.serial) + filter, aura.name, auraId, guid, serial, aura.serial) whoseTable[whose] = nil self_pool:Release(aura) end end if not next(whoseTable) then - auraList[spellId] = nil + auraList[auraId] = nil end end if not next(auraList) then @@ -256,11 +263,6 @@ local function ScanUnitAuras(event, unitId, guid) if added then Ovale.refreshNeeded[unitId] = true end - if debuffType then - -- TODO: not very clean - -- should be computed by OvaleState:GetAura - UnitGainedAura(guid, debuffType, filter, casterGUID, icon, count, debuffType, duration, expirationTime, isStealable, name, value1) - end i = i + 1 end end @@ -393,25 +395,47 @@ function OvaleAura:GetAuraByGUID(guid, spellId, filter, mine, unitId) local aura local serial = self_serial[guid] - for auraFilter, auraList in pairs(auraTable) do - if not filter or (filter == auraFilter) then - local whoseTable = auraList[spellId] - if whoseTable then - if mine then - if RemoveAuraIfExpired(guid, spellId, filter, whoseTable[self_player_guid], serial) then - whoseTable[self_player_guid] = nil + + if type(spellId) == "number" then + for auraFilter, auraList in pairs(auraTable) do + if not filter or (filter == auraFilter) then + local whoseTable = auraList[spellId] + if whoseTable then + if mine then + if RemoveAuraIfExpired(guid, spellId, filter, whoseTable[self_player_guid], serial) then + whoseTable[self_player_guid] = nil + end + aura = whoseTable[self_player_guid] + else + for k, v in pairs(whoseTable) do + if RemoveAuraIfExpired(guid, spellId, filter, v, serial) then + whoseTable[k] = nil + end + aura = whoseTable[k] + if aura then break end + end end - aura = whoseTable[self_player_guid] - else - for k, v in pairs(whoseTable) do - if RemoveAuraIfExpired(guid, spellId, filter, v, serial) then - whoseTable[k] = nil + if aura then break end + end + end + end + elseif OVALE_DEBUFF_TYPES[spellId] then + for auraFilter, auraList in pairs(auraTable) do + if not filter or (filter == auraFilter) then + for auraId, whoseTable in pairs(auraList) do + for caster, aura in pairs(whoseTable) do + if not mine or caster == self_player_guid then + if RemoveAuraIfExpired(guid, auraId, filter, aura, serial) then + whoseTable[caster] = nil + end + aura = whoseTable[caster] + if aura and aura.debuffType == spellId then + -- Stop after finding the first aura of the given debuff type. + break + end end - aura = whoseTable[k] - if aura then break end end end - if aura then break end end end end @@ -422,9 +446,7 @@ end function OvaleAura:GetAura(unitId, spellId, filter, mine) local guid = OvaleGUID:GetGUID(unitId) - if type(spellId) == "number" then - return self:GetAuraByGUID(guid, spellId, filter, mine, unitId) - elseif OvaleData.buffSpellList[spellId] then + if OvaleData.buffSpellList[spellId] then local newStart, newEnding, newStacks, newTick, newValue, newGain for auraId in pairs(OvaleData.buffSpellList[spellId]) do local start, ending, stacks, tick, value, gain = self:GetAuraByGUID(guid, auraId, filter, mine, unitId) @@ -438,7 +460,7 @@ function OvaleAura:GetAura(unitId, spellId, filter, mine) end end return newStart, newEnding, newStacks, newTick, newValue, newGain - elseif spellId == "Magic" or spellId == "Disease" or spellId == "Curse" or spellId == "Poison" then + else return self:GetAuraByGUID(guid, spellId, filter, mine, unitId) end end @@ -454,9 +476,9 @@ function OvaleAura:GetStealable(unitId) local start, ending local serial = self_serial[guid] - for spellId, whoseTable in pairs(auraList) do + for auraId, whoseTable in pairs(auraList) do for caster, aura in pairs(whoseTable) do - if RemoveAuraIfExpired(guid, spellId, "HELPFUL", aura, serial) then + if RemoveAuraIfExpired(guid, auraId, "HELPFUL", aura, serial) then whoseTable[caster] = nil end aura = whoseTable[caster] @@ -547,9 +569,9 @@ function OvaleAura:Debug() for guid, auraTable in pairs(self_aura) do Ovale:FormatPrint("Auras for %s:", guid) for filter, auraList in pairs(auraTable) do - for spellId, whoseTable in pairs(auraList) do + for auraId, whoseTable in pairs(auraList) do for whose, aura in pairs(whoseTable) do - Ovale:FormatPrint("%s %s %s %s %s stacks=%d tick=%s serial=%d", guid, filter, whose, spellId, aura.name, aura.stacks, aura.tick, aura.serial) + Ovale:FormatPrint("%s %s %s %s %s stacks=%d tick=%s serial=%d", guid, filter, whose, auraId, aura.name, aura.stacks, aura.tick, aura.serial) end end end @@ -562,9 +584,9 @@ function OvaleAura:DebugListAura(unitId, filter) RemoveAurasForGUID(guid, true) if self_aura[guid] and self_aura[guid][filter] then local array = {} - for spellId, whoseTable in pairs(self_aura[guid][filter]) do + for auraId, whoseTable in pairs(self_aura[guid][filter]) do for whose, aura in pairs(whoseTable) do - tinsert(array, aura.name .. ": " .. spellId) + tinsert(array, aura.name .. ": " .. auraId) end end tsort(array) diff --git a/OvaleState.lua b/OvaleState.lua index 6cc2f51..428117b 100644 --- a/OvaleState.lua +++ b/OvaleState.lua @@ -579,9 +579,7 @@ end function OvaleState:GetAura(unitId, spellId, filter, mine) local guid = OvaleGUID:GetGUID(unitId) - if type(spellId) == "number" then - return self:GetAuraByGUID(guid, spellId, filter, mine, unitId) - elseif OvaleData.buffSpellList[spellId] then + if OvaleData.buffSpellList[spellId] then local newStart, newEnding, newStacks, newTick, newValue, newGain for auraId in pairs(OvaleData.buffSpellList[spellId]) do local start, ending, stacks, tick, value, gain = self:GetAuraByGUID(guid, auraId, filter, mine, unitId) @@ -595,7 +593,7 @@ function OvaleState:GetAura(unitId, spellId, filter, mine) end end return newStart, newEnding, newStacks, newTick, newValue, newGain - elseif spellId == "Magic" or spellId == "Disease" or spellId == "Curse" or spellId == "Poison" then + else return self:GetAuraByGUID(guid, spellId, filter, mine, unitId) end end -- 1.7.9.5