Files
ElvUIModernized/ElvUI/Libraries/oUF_Plugins/oUF_DebuffHighlight/oUF_DebuffHighlight.lua
T
2018-12-13 14:51:37 -06:00

110 lines
3.2 KiB
Lua

local ns = oUF
local oUF = ns.oUF
if not oUF then return end
local UnitAura = UnitAura
local UnitCanAssist = UnitCanAssist
local playerClass = select(2, UnitClass("player"))
local CanDispel = {
PRIEST = {Magic = true, Disease = true},
SHAMAN = {Poison = true, Disease = true},
PALADIN = {Magic = true, Poison = true, Disease = true},
MAGE = {Curse = true},
DRUID = {Curse = true, Poison = true}
}
local dispellist = CanDispel[playerClass] or {}
local origColors = {}
local origBorderColors = {}
local origPostUpdateAura = {}
local function GetDebuffType(unit, filter, filterTable)
if not unit or not UnitCanAssist("player", unit) then return nil end
local i = 1
while true do
local name, _, texture, _, debufftype = UnitAura(unit, i, "HARMFUL")
if not texture then break end
local filterSpell = filterTable[name]
if(filterTable and filterSpell and filterSpell.enable) then
return debufftype, texture, true, filterSpell.style, filterSpell.color
elseif(debufftype and (not filter or (filter and dispellist[debufftype]))) then
return debufftype, texture;
end
i = i + 1
end
end
local function Update(object, event, unit)
if(unit ~= object.unit) then return; end
local debuffType, texture, wasFiltered, style, color = GetDebuffType(unit, object.DebuffHighlightFilter, object.DebuffHighlightFilterTable);
if(wasFiltered) then
if(style == "GLOW" and object.DBHGlow) then
object.DBHGlow:Show();
object.DBHGlow:SetBackdropBorderColor(color.r, color.g, color.b);
elseif(object.DBHGlow) then
object.DBHGlow:Hide();
object.DebuffHighlight:SetVertexColor(color.r, color.g, color.b, color.a or object.DebuffHighlightAlpha or .5);
end
elseif(debuffType) then
color = DebuffTypeColor[debuffType];
if(object.DebuffHighlightBackdrop and object.DBHGlow) then
object.DBHGlow:Show();
object.DBHGlow:SetBackdropBorderColor(color.r, color.g, color.b);
elseif(object.DebuffHighlightUseTexture) then
object.DebuffHighlight:SetTexture(texture);
else
object.DebuffHighlight:SetVertexColor(color.r, color.g, color.b, object.DebuffHighlightAlpha or .5);
end
else
if(object.DBHGlow) then
object.DBHGlow:Hide();
end
if(object.DebuffHighlightUseTexture) then
object.DebuffHighlight:SetTexture(nil);
else
object.DebuffHighlight:SetVertexColor(0, 0, 0, 0);
end
end
if object.DebuffHighlight.PostUpdate then
object.DebuffHighlight:PostUpdate(object, debuffType, texture, wasFiltered, style, color)
end
end
local function Enable(object)
-- if we're not highlighting this unit return
if not object.DebuffHighlightBackdrop and not object.DebuffHighlight and not object.DBHGlow then
return
end
-- if we're filtering highlights and we're not of the dispelling type, return
if object.DebuffHighlightFilter and not CanDispel[playerClass] then
return
end
-- make sure aura scanning is active for this object
object:RegisterEvent("UNIT_AURA", Update)
return true
end
local function Disable(object)
object:UnregisterEvent("UNIT_AURA", Update)
if(object.DBHGlow) then
object.DBHGlow:Hide();
end
if(object.DebuffHighlight) then
local color = origColors[object];
if(color) then
object.DebuffHighlight:SetVertexColor(color.r, color.g, color.b, color.a);
end
end
end
oUF:AddElement("DebuffHighlight", Update, Enable, Disable)