MxW_Addon/Libraries/oUF_Plugins/oUF_DebuffHighlight/oUF_DebuffHighlight.lua

178 lines
5.1 KiB
Lua
Raw Permalink Normal View History

2018-01-05 06:40:15 -05:00
local _, ns = ...
local oUF = oUF or ns.oUF
if not oUF then return end
local playerClass = select(2,UnitClass("player"))
local CanDispel = {
PRIEST = { Magic = true, Disease = true },
SHAMAN = { Magic = false, Curse = true },
PALADIN = { Magic = false, Poison = true, Disease = true },
DRUID = { Magic = false, Curse = true, Poison = true, Disease = false },
MONK = { Magic = false, Poison = true, Disease = true }
}
local blackList = {
[GetSpellInfo(140546)] = true, --Fully Mutated
[GetSpellInfo(136184)] = true, --Thick Bones
[GetSpellInfo(136186)] = true, --Clear mind
[GetSpellInfo(136182)] = true, --Improved Synapses
[GetSpellInfo(136180)] = true, --Keen Eyesight
}
local SymbiosisName = GetSpellInfo(110309)
local CleanseName = GetSpellInfo(4987)
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, _,_,_,_,_, spellID = UnitAura(unit, i, "HARMFUL")
if not texture then break end
local filterSpell = filterTable[spellID] or 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])) and not blackList[name] then
return debufftype, texture
end
i = i + 1
end
end
local function CheckTalentTree(tree)
local activeGroup = GetActiveSpecGroup()
if activeGroup and GetSpecialization(false, false, activeGroup) then
return tree == GetSpecialization(false, false, activeGroup)
end
end
local function CheckSpec(self, event, levels)
if event == "CHARACTER_POINTS_CHANGED" and levels > 0 then return end
--Check for certain talents to see if we can dispel magic or not
if playerClass == "PRIEST" then
if CheckTalentTree(3) then
dispellist.Disease = false
else
dispellist.Disease = true
end
elseif playerClass == "PALADIN" then
if CheckTalentTree(1) then
dispellist.Magic = true
else
dispellist.Magic = false
end
elseif playerClass == "SHAMAN" then
if CheckTalentTree(3) then
dispellist.Magic = true
else
dispellist.Magic = false
end
elseif playerClass == "DRUID" then
if CheckTalentTree(4) then
dispellist.Magic = true
else
dispellist.Magic = false
end
elseif playerClass == "MONK" then
if CheckTalentTree(2) then
dispellist.Magic = true
else
dispellist.Magic = false
end
end
end
local function CheckSymbiosis()
if GetSpellInfo(SymbiosisName) == CleanseName then
dispellist.Disease = true
else
dispellist.Disease = false
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
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
object:RegisterEvent("UNIT_AURA", Update)
if playerClass == "DRUID" then
object:RegisterEvent("SPELLS_CHANGED", CheckSymbiosis)
end
return true
end
local function Disable(object)
object:UnregisterEvent("UNIT_AURA", Update)
if playerClass == "DRUID" then
object:UnregisterEvent("SPELLS_CHANGED", CheckSymbiosis)
end
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
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_TALENT_UPDATE")
f:RegisterEvent("CHARACTER_POINTS_CHANGED")
f:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED")
f:SetScript("OnEvent", CheckSpec)
oUF:AddElement('DebuffHighlight', Update, Enable, Disable)