ElvUI/Modules/Nameplates/Elements/Health.lua

186 lines
7.6 KiB
Lua

local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local NP = E:GetModule('NamePlates')
local LSM = E.Libs.LSM
local ipairs = ipairs
local unpack = unpack
local UnitPlayerControlled = UnitPlayerControlled
local UnitIsTapDenied = UnitIsTapDenied
local UnitClass = UnitClass
local UnitReaction = UnitReaction
local UnitIsConnected = UnitIsConnected
local CreateFrame = CreateFrame
function NP:Health_UpdateColor(_, unit)
if not unit or self.unit ~= unit then return end
local element = self.Health
local Selection = element.colorSelection and NP:UnitSelectionType(unit, element.considerSelectionInCombatHostile)
local r, g, b, t
if element.colorDisconnected and not UnitIsConnected(unit) then
t = self.colors.disconnected
elseif element.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapDenied(unit) then
t = NP.db.colors.tapped
elseif (element.colorClass and self.isPlayer) or (element.colorClassNPC and not self.isPlayer) or (element.colorClassPet and UnitPlayerControlled(unit) and not self.isPlayer) then
local _, class = UnitClass(unit)
t = self.colors.class[class]
elseif Selection then
if Selection == 3 then Selection = UnitPlayerControlled(unit) and 5 or 3 end
t = NP.db.colors.selection[Selection]
elseif element.colorReaction and UnitReaction(unit, 'player') then
local reaction = UnitReaction(unit, 'player')
if reaction <= 3 then reaction = 'bad' elseif reaction == 4 then reaction = 'neutral' else reaction = 'good' end
t = NP.db.colors.reactions[reaction]
elseif element.colorSmooth then
r, g, b = self:ColorGradient(element.cur or 1, element.max or 1, unpack(element.smoothGradient or self.colors.smooth))
elseif element.colorHealth then
t = NP.db.colors.health
end
if t then
r, g, b = t[1] or t.r, t[2] or t.g, t[3] or t.b
element.r, element.g, element.b = r, g, b -- save these for the style filter to switch back
end
local sf = NP:StyleFilterChanges(self)
if sf.HealthColor then
r, g, b = sf.HealthColor.r, sf.HealthColor.g, sf.HealthColor.b
end
if b then
element:SetStatusBarColor(r, g, b)
if element.bg then
element.bg:SetVertexColor(r * NP.multiplier, g * NP.multiplier, b * NP.multiplier)
end
end
if element.PostUpdateColor then
element:PostUpdateColor(unit, r, g, b)
end
end
function NP:Construct_Health(nameplate)
local Health = CreateFrame('StatusBar', nameplate:GetName()..'Health', nameplate)
Health:SetFrameStrata(nameplate:GetFrameStrata())
Health:SetFrameLevel(5)
Health:CreateBackdrop('Transparent', nil, nil, nil, nil, true)
Health:SetStatusBarTexture(LSM:Fetch('statusbar', NP.db.statusbar))
local clipFrame = CreateFrame('Frame', nil, Health)
clipFrame:SetClipsChildren(true)
clipFrame:SetAllPoints()
clipFrame:EnableMouse(false)
Health.ClipFrame = clipFrame
--[[Health.bg = Health:CreateTexture(nil, 'BACKGROUND')
Health.bg:SetAllPoints()
Health.bg:SetTexture(E.media.blankTex)
Health.bg.multiplier = 0.2]]
NP.StatusBars[Health] = true
local statusBarTexture = Health:GetStatusBarTexture()
local healthFlashTexture = Health:CreateTexture(nameplate:GetName()..'FlashTexture', 'OVERLAY')
healthFlashTexture:SetTexture(LSM:Fetch('background', 'ElvUI Blank'))
healthFlashTexture:Point('BOTTOMLEFT', statusBarTexture, 'BOTTOMLEFT')
healthFlashTexture:Point('TOPRIGHT', statusBarTexture, 'TOPRIGHT')
healthFlashTexture:Hide()
nameplate.HealthFlashTexture = healthFlashTexture
Health.colorTapping = true
Health.colorSelection = true
Health.UpdateColor = NP.Health_UpdateColor
return Health
end
function NP:Update_Health(nameplate, skipUpdate)
local db = NP:PlateDB(nameplate)
nameplate.Health.colorTapping = true
nameplate.Health.colorSelection = true
nameplate.Health.colorClass = db.health.useClassColor
nameplate.Health.considerSelectionInCombatHostile = true
if skipUpdate then return end
if db.health.enable then
if not nameplate:IsElementEnabled('Health') then
nameplate:EnableElement('Health')
end
nameplate.Health:Point('CENTER')
nameplate.Health:Point('LEFT')
nameplate.Health:Point('RIGHT')
nameplate:SetHealthUpdateMethod(E.global.nameplate.effectiveHealth)
nameplate:SetHealthUpdateSpeed(E.global.nameplate.effectiveHealthSpeed)
E:SetSmoothing(nameplate.Health, NP.db.smoothbars)
elseif nameplate:IsElementEnabled('Health') then
nameplate:DisableElement('Health')
end
nameplate.Health.width = db.health.width
nameplate.Health.height = db.health.height
nameplate.Health:Height(db.health.height)
end
local bars = { 'myBar', 'otherBar', 'absorbBar', 'healAbsorbBar' }
function NP:Construct_HealthPrediction(nameplate)
local HealthPrediction = CreateFrame('Frame', nameplate:GetName()..'HealthPrediction', nameplate)
for _, name in ipairs(bars) do
local bar = CreateFrame('StatusBar', nil, nameplate.Health.ClipFrame)
bar:SetFrameStrata(nameplate:GetFrameStrata())
bar:SetStatusBarTexture(LSM:Fetch('statusbar', NP.db.statusbar))
bar:Point('TOP')
bar:Point('BOTTOM')
bar:Width(150)
HealthPrediction[name] = bar
NP.StatusBars[bar] = true
end
local healthTexture = nameplate.Health:GetStatusBarTexture()
local healthFrameLevel = nameplate.Health:GetFrameLevel()
HealthPrediction.myBar:Point('LEFT', healthTexture, 'RIGHT')
HealthPrediction.myBar:SetFrameLevel(healthFrameLevel + 2)
HealthPrediction.myBar:SetStatusBarColor(NP.db.colors.healPrediction.personal.r, NP.db.colors.healPrediction.personal.g, NP.db.colors.healPrediction.personal.b)
HealthPrediction.myBar:SetMinMaxValues(0, 1)
HealthPrediction.otherBar:Point('LEFT', HealthPrediction.myBar:GetStatusBarTexture(), 'RIGHT')
HealthPrediction.otherBar:SetFrameLevel(healthFrameLevel + 1)
HealthPrediction.otherBar:SetStatusBarColor(NP.db.colors.healPrediction.others.r, NP.db.colors.healPrediction.others.g, NP.db.colors.healPrediction.others.b)
HealthPrediction.absorbBar:Point('LEFT', HealthPrediction.otherBar:GetStatusBarTexture(), 'RIGHT')
HealthPrediction.absorbBar:SetFrameLevel(healthFrameLevel)
HealthPrediction.absorbBar:SetStatusBarColor(NP.db.colors.healPrediction.absorbs.r, NP.db.colors.healPrediction.absorbs.g, NP.db.colors.healPrediction.absorbs.b)
HealthPrediction.healAbsorbBar:Point('RIGHT', healthTexture)
HealthPrediction.healAbsorbBar:SetFrameLevel(healthFrameLevel + 3)
HealthPrediction.healAbsorbBar:SetStatusBarColor(NP.db.colors.healPrediction.healAbsorbs.r, NP.db.colors.healPrediction.healAbsorbs.g, NP.db.colors.healPrediction.healAbsorbs.b)
HealthPrediction.healAbsorbBar:SetReverseFill(true)
HealthPrediction.maxOverflow = 1
HealthPrediction.frequentUpdates = true
return HealthPrediction
end
function NP:Update_HealthPrediction(nameplate)
local db = NP:PlateDB(nameplate)
if db.health.enable and db.health.healPrediction then
if not nameplate:IsElementEnabled('HealthPrediction') then
nameplate:EnableElement('HealthPrediction')
end
nameplate.HealthPrediction.myBar:SetStatusBarColor(NP.db.colors.healPrediction.personal.r, NP.db.colors.healPrediction.personal.g, NP.db.colors.healPrediction.personal.b)
nameplate.HealthPrediction.otherBar:SetStatusBarColor(NP.db.colors.healPrediction.others.r, NP.db.colors.healPrediction.others.g, NP.db.colors.healPrediction.others.b)
nameplate.HealthPrediction.absorbBar:SetStatusBarColor(NP.db.colors.healPrediction.absorbs.r, NP.db.colors.healPrediction.absorbs.g, NP.db.colors.healPrediction.absorbs.b)
nameplate.HealthPrediction.healAbsorbBar:SetStatusBarColor(NP.db.colors.healPrediction.healAbsorbs.r, NP.db.colors.healPrediction.healAbsorbs.g, NP.db.colors.healPrediction.healAbsorbs.b)
elseif nameplate:IsElementEnabled('HealthPrediction') then
nameplate:DisableElement('HealthPrediction')
end
end