Gladdy-TBC/EventListener.lua
2022-01-12 16:15:53 +01:00

283 lines
12 KiB
Lua

local select, string_gsub, tostring, pairs = select, string.gsub, tostring, pairs
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF
local AURA_TYPE_BUFF = AURA_TYPE_BUFF
local UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit, UnitExists = UnitName, UnitAura, UnitRace, UnitClass, UnitGUID, UnitIsUnit, UnitExists
local UnitCastingInfo, UnitChannelInfo = UnitCastingInfo, UnitChannelInfo
local GetSpellInfo = GetSpellInfo
local FindAuraByName = AuraUtil.FindAuraByName
local GetTime = GetTime
local Gladdy = LibStub("Gladdy")
local Cooldowns = Gladdy.modules["Cooldowns"]
local Diminishings = Gladdy.modules["Diminishings"]
local EventListener = Gladdy:NewModule("EventListener", nil, {
test = true,
})
function EventListener:Initialize()
self:RegisterMessage("JOINED_ARENA")
end
function EventListener.OnEvent(self, event, ...)
EventListener[event](self, ...)
end
function EventListener:JOINED_ARENA()
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:RegisterEvent("ARENA_OPPONENT_UPDATE")
self:RegisterEvent("UNIT_AURA")
self:RegisterEvent("UNIT_SPELLCAST_START")
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
self:SetScript("OnEvent", EventListener.OnEvent)
-- in case arena has started already we check for units
for i=1,Gladdy.curBracket do
if UnitExists("arena" .. i) then
Gladdy:SpotEnemy("arena" .. i, true)
end
if UnitExists("arenapet" .. i) then
Gladdy:SendMessage("PET_SPOTTED", "arenapet" .. i)
end
end
end
function EventListener:Reset()
self:UnregisterAllEvents()
self:SetScript("OnEvent", nil)
end
function Gladdy:DetectSpec(unit, spec)
if spec then
self.modules["Cooldowns"]:DetectSpec(unit, spec)
end
end
function Gladdy:SpotEnemy(unit, auraScan)
local button = self.buttons[unit]
if not unit or not button then
return
end
button.raceLoc = UnitRace(unit)
button.race = select(2, UnitRace(unit))
button.classLoc = select(1, UnitClass(unit))
button.class = select(2, UnitClass(unit))
button.name = UnitName(unit)
button.stealthed = false
Gladdy.guids[UnitGUID(unit)] = unit
if button.class and button.race then
Gladdy:SendMessage("ENEMY_SPOTTED", unit)
end
if auraScan and not button.spec then
for n = 1, 30 do
local spellName,_,_,_,_,expirationTime,unitCaster = UnitAura(unit, n, "HELPFUL")
if ( not spellName ) then
break
end
if Gladdy.cooldownBuffs[spellName] then -- Check for auras that detect used CDs (like Fear Ward)
for arenaUnit,v in pairs(self.buttons) do
if (UnitIsUnit(arenaUnit, unitCaster)) then
Cooldowns:CooldownUsed(arenaUnit, v.class, Gladdy.cooldownBuffs[spellName].spellId, expirationTime - GetTime())
end
end
end
if Gladdy.specBuffs[spellName] then -- Check for auras that detect a spec
local unitPet = string_gsub(unit, "%d$", "pet%1")
if UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster) then
Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName])
end
end
end
end
end
function EventListener:COMBAT_LOG_EVENT_UNFILTERED()
-- timestamp,eventType,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellId,spellName,spellSchool
local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool = CombatLogGetCurrentEventInfo()
local srcUnit = Gladdy.guids[sourceGUID]
local destUnit = Gladdy.guids[destGUID]
if destUnit then
-- diminish tracker
if Gladdy.buttons[destUnit] and (Gladdy.db.drEnabled and (eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_REFRESH")) then
Diminishings:AuraFade(destUnit, spellID)
end
-- death detection
if (Gladdy.buttons[destUnit] and eventType == "UNIT_DIED" or eventType == "PARTY_KILL" or eventType == "SPELL_INSTAKILL") then
Gladdy:SendMessage("UNIT_DEATH", destUnit)
end
-- spec detection
if Gladdy.buttons[destUnit] and (not Gladdy.buttons[destUnit].class or not Gladdy.buttons[destUnit].race) then
Gladdy:SpotEnemy(destUnit, true)
end
--interrupt detection
if Gladdy.buttons[destUnit] and eventType == "SPELL_INTERRUPT" then
Gladdy:SendMessage("SPELL_INTERRUPT", destUnit,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool)
end
end
if srcUnit then
srcUnit = string_gsub(srcUnit, "pet", "")
if (not UnitExists(srcUnit)) then
return
end
if (eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED") then
local unitRace = Gladdy.buttons[srcUnit].race
-- cooldown tracker
if Gladdy.db.cooldown and Cooldowns.cooldownSpellIds[spellName] then
local unitClass
local spellId = Cooldowns.cooldownSpellIds[spellName] -- don't use spellId from combatlog, in case of different spellrank
if Gladdy.db.cooldownCooldowns[tostring(spellId)] then
if (Gladdy:GetCooldownList()[Gladdy.buttons[srcUnit].class][spellId]) then
unitClass = Gladdy.buttons[srcUnit].class
else
unitClass = Gladdy.buttons[srcUnit].race
end
Cooldowns:CooldownUsed(srcUnit, unitClass, spellId)
Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
end
if Gladdy.db.racialEnabled and Gladdy:Racials()[unitRace].spellName == spellName and Gladdy:Racials()[unitRace][spellID] then
Gladdy:SendMessage("RACIAL_USED", srcUnit)
end
end
if not Gladdy.buttons[srcUnit].class or not Gladdy.buttons[srcUnit].race then
Gladdy:SpotEnemy(srcUnit, true)
end
if not Gladdy.buttons[srcUnit].spec then
Gladdy:DetectSpec(srcUnit, Gladdy.specSpells[spellName])
end
end
end
function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason)
--[[ updateReason: seen, unseen, destroyed, cleared ]]
local button = Gladdy.buttons[unit]
local pet = Gladdy.modules["Pets"].frames[unit]
if button or pet then
if updateReason == "seen" then
-- ENEMY_SPOTTED
if button then
Gladdy:SendMessage("ENEMY_STEALTH", unit, false)
if not button.class or not button.race then
Gladdy:SpotEnemy(unit, true)
end
end
if pet then
Gladdy:SendMessage("PET_SPOTTED", unit)
end
elseif updateReason == "unseen" then
-- STEALTH
if button then
Gladdy:SendMessage("ENEMY_STEALTH", unit, true)
end
if pet then
Gladdy:SendMessage("PET_STEALTH", unit)
end
elseif updateReason == "destroyed" then
-- LEAVE
if button then
Gladdy:SendMessage("UNIT_DESTROYED", unit)
end
if pet then
Gladdy:SendMessage("PET_DESTROYED", unit)
end
elseif updateReason == "cleared" then
--Gladdy:Print("ARENA_OPPONENT_UPDATE", updateReason, unit)
end
end
end
Gladdy.exceptionNames = { -- TODO MOVE ME TO CLASSBUFFS LIB
[31117] = GetSpellInfo(30405) .. " Silence", -- Unstable Affliction Silence
[43523] = GetSpellInfo(30405) .. " Silence",
[24131] = select(1, GetSpellInfo(19386)) .. " Dot", -- Wyvern Sting Dot
[24134] = select(1, GetSpellInfo(19386)) .. " Dot",
[24135] = select(1, GetSpellInfo(19386)) .. " Dot",
[27069] = select(1, GetSpellInfo(19386)) .. " Dot",
[19975] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)), -- Entangling Roots Nature's Grasp
[19974] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[19973] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[19972] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[19971] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[19971] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
[27010] = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)),
}
Gladdy.cooldownBuffs = {
[GetSpellInfo(6346)] = { cd = 180, spellId = 6346 }, -- Fear Ward
}
function EventListener:UNIT_AURA(unit)
local button = Gladdy.buttons[unit]
if not button then
return
end
for i = 1, 2 do
if not Gladdy.buttons[unit].class or not Gladdy.buttons[unit].race then
Gladdy:SpotEnemy(unit, false)
end
local filter = (i == 1 and "HELPFUL" or "HARMFUL")
local auraType = i == 1 and AURA_TYPE_BUFF or AURA_TYPE_DEBUFF
Gladdy:SendMessage("AURA_FADE", unit, auraType)
for n = 1, 30 do
local spellName, texture, count, debuffType, duration, expirationTime, unitCaster, _, shouldConsolidate, spellID = UnitAura(unit, n, filter)
if ( not spellID ) then
Gladdy:SendMessage("AURA_GAIN_LIMIT", unit, auraType, n - 1)
break
end
if Gladdy.cooldownBuffs[spellName] then -- Check for auras that hint used CDs (like Fear Ward)
for arenaUnit,v in pairs(Gladdy.buttons) do
if (UnitIsUnit(arenaUnit, unitCaster)) then
Cooldowns:CooldownUsed(arenaUnit, v.class, Gladdy.cooldownBuffs[spellName].spellId, expirationTime - GetTime())
end
end
end
if not button.spec and Gladdy.specBuffs[spellName] then
local unitPet = string_gsub(unit, "%d$", "pet%1")
if unitCaster and (UnitIsUnit(unit, unitCaster) or UnitIsUnit(unitPet, unitCaster)) then
Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName])
end
end
if Gladdy.exceptionNames[spellID] then
spellName = Gladdy.exceptionNames[spellID]
end
Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, debuffType, i)
Gladdy:Call("Announcements", "CheckDrink", unit, spellName)
end
end
end
function EventListener:UNIT_SPELLCAST_START(unit)
if Gladdy.buttons[unit] then
local spellName = UnitCastingInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName])
end
end
end
function EventListener:UNIT_SPELLCAST_CHANNEL_START(unit)
if Gladdy.buttons[unit] then
local spellName = UnitChannelInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName])
end
end
end
function EventListener:UNIT_SPELLCAST_SUCCEEDED(unit)
if Gladdy.buttons[unit] then
local spellName = UnitCastingInfo(unit)
if Gladdy.specSpells[spellName] and not Gladdy.buttons[unit].spec then
Gladdy:DetectSpec(unit, Gladdy.specSpells[spellName])
end
end
end