ElvUI/Libraries/oUF_Plugins/oUF_AuraHighlight/oUF_AuraHighlight.lua

186 lines
5.3 KiB
Lua
Raw Normal View History

2020-11-13 14:27:50 -05:00
local _, ns = ...
local oUF = ns.oUF
if not oUF then return end
local UnitAura = UnitAura
local UnitCanAssist = UnitCanAssist
local GetSpecialization = GetSpecialization
local GetActiveSpecGroup = GetActiveSpecGroup
local Classic = WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
local DispelList, BlackList = {}, {}
-- GLOBALS: DebuffTypeColor
--local DispellPriority = { Magic = 4, Curse = 3, Disease = 2, Poison = 1 }
--local FilterList = {}
if Classic then
DispelList.PRIEST = { Magic = true, Disease = true }
DispelList.SHAMAN = { Poison = true, Disease = true }
DispelList.PALADIN = { Magic = true, Poison = true, Disease = true }
DispelList.MAGE = { Curse = true }
DispelList.DRUID = { Curse = true, Poison = true }
DispelList.WARLOCK = { Magic = true }
else
DispelList.PRIEST = { Magic = true, Disease = true }
DispelList.SHAMAN = { Magic = false, Curse = true }
DispelList.PALADIN = { Magic = false, Poison = true, Disease = true }
DispelList.DRUID = { Magic = false, Curse = true, Poison = true, Disease = false }
DispelList.MONK = { Magic = false, Poison = true, Disease = true }
DispelList.MAGE = { Curse = true }
end
local playerClass = select(2, UnitClass('player'))
local CanDispel = DispelList[playerClass] or {}
if not Classic then
BlackList[140546] = true -- Fully Mutated
BlackList[136184] = true -- Thick Bones
BlackList[136186] = true -- Clear mind
BlackList[136182] = true -- Improved Synapses
BlackList[136180] = true -- Keen Eyesight
BlackList[105171] = true -- Deep Corruption
BlackList[108220] = true -- Deep Corruption
BlackList[116095] = true -- Disable, Slow
BlackList[137637] = true -- Warbringer, Slow
end
local function GetAuraType(unit, filter, filterTable)
if not unit or not UnitCanAssist('player', unit) then return end
local i = 1
while true do
local name, texture, _, debufftype, _, _, _, _, _, spellID = UnitAura(unit, i, 'HARMFUL')
if not texture then break end
local filterSpell = filterTable[spellID] or filterTable[name]
if filterTable and filterSpell then
if filterSpell.enable then
return debufftype, texture, true, filterSpell.style, filterSpell.color
end
elseif debufftype and (not filter or (filter and CanDispel[debufftype])) and not (BlackList[name] or BlackList[spellID]) then
return debufftype, texture
end
i = i + 1
end
i = 1
while true do
local _, texture, _, debufftype, _, _, _, _, _, spellID = UnitAura(unit, i)
if not texture then break end
local filterSpell = filterTable[spellID]
if filterTable and filterSpell and filterSpell.enable then
return debufftype, texture, true, filterSpell.style, filterSpell.color
end
i = i + 1
end
end
--[[
local function FilterTable()
local debufftype, texture, filterSpell
return debufftype, texture, true, filterSpell.style, filterSpell.color
end
]]
local function CheckTalentTree(tree)
local activeGroup = GetActiveSpecGroup()
local spec = activeGroup and GetSpecialization(false, false, activeGroup)
if spec then
return tree == spec
end
end
local function CheckSpec()
if Classic then return end
-- Check for certain talents to see if we can dispel magic or not
if playerClass == 'PALADIN' then
CanDispel.Magic = CheckTalentTree(1)
elseif playerClass == 'SHAMAN' then
CanDispel.Magic = CheckTalentTree(3)
elseif playerClass == 'DRUID' then
CanDispel.Magic = CheckTalentTree(4)
elseif playerClass == 'MONK' then
CanDispel.Magic = CheckTalentTree(2)
end
end
local function Update(self, _, unit)
if unit ~= self.unit then return end
local debuffType, texture, wasFiltered, style, color = GetAuraType(unit, self.AuraHighlightFilter, self.AuraHighlightFilterTable)
if wasFiltered then
if style == 'GLOW' and self.AuraHightlightGlow then
self.AuraHightlightGlow:Show()
self.AuraHightlightGlow:SetBackdropBorderColor(color.r, color.g, color.b)
elseif self.AuraHightlightGlow then
self.AuraHightlightGlow:Hide()
self.AuraHighlight:SetVertexColor(color.r, color.g, color.b, color.a)
end
elseif debuffType then
color = DebuffTypeColor[debuffType or 'none']
if self.AuraHighlightBackdrop and self.AuraHightlightGlow then
self.AuraHightlightGlow:Show()
self.AuraHightlightGlow:SetBackdropBorderColor(color.r, color.g, color.b)
elseif self.AuraHighlightUseTexture then
self.AuraHighlight:SetTexture(texture)
else
self.AuraHighlight:SetVertexColor(color.r, color.g, color.b, color.a)
end
else
if self.AuraHightlightGlow then
self.AuraHightlightGlow:Hide()
end
if self.AuraHighlightUseTexture then
self.AuraHighlight:SetTexture(nil)
else
self.AuraHighlight:SetVertexColor(0, 0, 0, 0)
end
end
if self.AuraHighlight.PostUpdate then
self.AuraHighlight:PostUpdate(self, debuffType, texture, wasFiltered, style, color)
end
end
local function Enable(self)
if self.AuraHighlight then
self:RegisterEvent('UNIT_AURA', Update)
return true
end
end
local function Disable(self)
local element = self.AuraHighlight
if element then
self:UnregisterEvent('UNIT_AURA', Update)
if self.AuraHightlightGlow then
self.AuraHightlightGlow:Hide()
end
if element then
element:SetVertexColor(0, 0, 0, 0)
end
end
end
local f = CreateFrame('Frame')
f:RegisterEvent('CHARACTER_POINTS_CHANGED')
if not Classic then
f:RegisterEvent('PLAYER_TALENT_UPDATE')
f:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED')
end
f:SetScript('OnEvent', CheckSpec)
oUF:AddElement('AuraHighlight', Update, Enable, Disable)