Files
coa-elvui/ElvUI/Modules/Nameplates/Plugins/TargetIndicator.lua
T
Andrew 8edf2d7f8a Nameplate Overhaul (#38)
* ElvUI/NamePlates: initial nameplate conversions

* More nameplate work

* Modules/Cooldowns: various CD fixes, nameplates cant show 'swipe' texture

* ElvUI/NamePlates: final nameplate polish

* Modules/Misc: add space before interrupted announcement
2023-05-22 19:18:59 -07:00

153 lines
5.3 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local NP = E:GetModule('NamePlates')
local ElvUF = E.oUF
local UnitHealth = UnitHealth
local UnitIsUnit = UnitIsUnit
local UnitHealthMax = UnitHealthMax
--[[ Target Glow Style Option Variables
style1:'Border',
style2:'Background',
style3:'Top Arrow Only',
style4:'Side Arrows Only',
style5:'Border + Top Arrow',
style6:'Background + Top Arrow',
style7:'Border + Side Arrows',
style8:'Background + Side Arrows'
]]
local function HideIndicators(element)
if element.TopIndicator then element.TopIndicator:Hide() end
if element.LeftIndicator then element.LeftIndicator:Hide() end
if element.RightIndicator then element.RightIndicator:Hide() end
if element.Shadow then element.Shadow:Hide() end
if element.Spark then element.Spark:Hide() end
end
local function ShowIndicators(element, isTarget, color)
if isTarget then
if element.TopIndicator and (element.style == 'style3' or element.style == 'style5' or element.style == 'style6') then
element.TopIndicator:SetVertexColor(color.r, color.g, color.b)
element.TopIndicator:SetTexture(element.arrow)
element.TopIndicator:Show()
end
if element.LeftIndicator and element.RightIndicator and (element.style == 'style4' or element.style == 'style7' or element.style == 'style8') then
element.LeftIndicator:SetVertexColor(color.r, color.g, color.b)
element.RightIndicator:SetVertexColor(color.r, color.g, color.b)
element.LeftIndicator:SetTexture(element.arrow)
element.RightIndicator:SetTexture(element.arrow)
element.RightIndicator:Show()
element.LeftIndicator:Show()
end
end
if element.Shadow and (element.style == 'style1' or element.style == 'style5' or element.style == 'style7') then
element.Shadow:SetBackdropBorderColor(color.r, color.g, color.b)
element.Shadow:Show()
end
if element.Spark and (element.style == 'style2' or element.style == 'style6' or element.style == 'style8') then
element.Spark:SetVertexColor(color.r, color.g, color.b)
element.Spark:Show()
end
end
local function Update(self)
local element = self.TargetIndicator
if element.PreUpdate then
element:PreUpdate()
end
HideIndicators(element)
if element.style ~= 'none' then
local isTarget = UnitIsUnit(self.unit, 'target')
local lowHealth = element.lowHealthThreshold > 0
if isTarget and (element.preferGlowColor or not lowHealth) then
ShowIndicators(element, isTarget, NP.db.colors.glowColor)
elseif lowHealth then
local health, maxHealth = UnitHealth(self.unit), UnitHealthMax(self.unit)
local perc = (maxHealth > 0 and health/maxHealth) or 0
-- color tables are class updated in UpdateMedia
if perc <= element.lowHealthThreshold * 0.5 then
ShowIndicators(element, isTarget, NP.db.colors.lowHealthHalf)
elseif perc <= element.lowHealthThreshold then
ShowIndicators(element, isTarget, NP.db.colors.lowHealthColor)
elseif isTarget then
ShowIndicators(element, isTarget, NP.db.colors.glowColor)
end
end
end
if element.PostUpdate then
return element:PostUpdate(self.unit)
end
end
local function Path(self, ...)
return (self.TargetIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
end
local function Enable(self)
local element = self.TargetIndicator
if element then
element.__owner = self
element.ForceUpdate = ForceUpdate
if not element.style then element.style = 'style1' end
if not element.preferGlowColor then element.preferGlowColor = true end
if not element.lowHealthThreshold then element.lowHealthThreshold = .4 end
if element.Shadow and element.Shadow:IsObjectType('Frame') and not element.Shadow:GetBackdrop() then
element.Shadow:SetBackdrop({edgeFile = E.Media.Textures.GlowTex, edgeSize = 5})
end
if element.Spark and element.Spark:IsObjectType('Texture') and not element.Spark:GetTexture() then
element.Spark:SetTexture(E.Media.Textures.Spark)
end
if element.TopIndicator and element.TopIndicator:IsObjectType('Texture') and not element.TopIndicator:GetTexture() then
element.TopIndicator:SetTexture(E.Media.Textures.ArrowUp)
element.TopIndicator:SetTexCoord(1, 1, 1, 0, 0, 1, 0, 0) --Rotates texture 180 degress (Up arrow to face down)
end
if element.LeftIndicator and element.LeftIndicator:IsObjectType('Texture') and not element.LeftIndicator:GetTexture() then
element.LeftIndicator:SetTexture(E.Media.Textures.ArrowUp)
element.LeftIndicator:SetTexCoord(1, 0, 0, 0, 1, 1, 0, 1) --Rotates texture 90 degrees clockwise (Up arrow to face right)
end
if element.RightIndicator and element.RightIndicator:IsObjectType('Texture') and not element.RightIndicator:GetTexture() then
element.RightIndicator:SetTexture(E.Media.Textures.ArrowUp)
element.RightIndicator:SetTexCoord(1, 1, 0, 1, 1, 0, 0, 0) --Flips texture horizontally (Right facing arrow to face left)
end
self:RegisterEvent('UNIT_HEALTH', Path)
self:RegisterEvent('UNIT_MAXHEALTH', Path)
self:RegisterEvent('PLAYER_TARGET_CHANGED', Path, true)
return true
end
end
local function Disable(self)
local element = self.TargetIndicator
if element then
HideIndicators(element)
self:UnregisterEvent('UNIT_HEALTH', Path)
self:UnregisterEvent('UNIT_MAXHEALTH', Path)
self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
end
end
ElvUF:AddElement('TargetIndicator', Path, Enable, Disable)