213 lines
7.1 KiB
Lua
213 lines
7.1 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
|
|
|
|
--Lua functions
|
|
--WoW API / Variables
|
|
|
|
function NP:Update_HealthOnValueChanged()
|
|
local frame = self:GetParent().UnitFrame
|
|
if not frame.UnitType then return end -- Bugs
|
|
|
|
NP:Update_Health(frame)
|
|
NP:Update_HealthColor(frame)
|
|
NP:Update_Glow(frame)
|
|
NP:StyleFilterUpdate(frame, "UNIT_HEALTH")
|
|
end
|
|
|
|
function NP:Update_HealthColor(frame)
|
|
if not frame.Health:IsShown() then return end
|
|
|
|
local r, g, b
|
|
local scale = 1
|
|
|
|
local classColor = E.media.herocolor
|
|
local useClassColor = NP.db.units[frame.UnitType].health.useClassColor
|
|
if classColor and ((frame.UnitType == "FRIENDLY_PLAYER" and useClassColor) or (frame.UnitType == "ENEMY_PLAYER" and useClassColor)) then
|
|
r, g, b = classColor.r, classColor.g, classColor.b
|
|
else
|
|
local db = self.db.colors
|
|
local status = frame.ThreatStatus
|
|
if status then
|
|
if status == 3 then
|
|
if E.Role == "Tank" then
|
|
r, g, b = db.threat.goodColor.r, db.threat.goodColor.g, db.threat.goodColor.b
|
|
scale = NP.db.threat.goodScale
|
|
else
|
|
r, g, b = db.threat.badColor.r, db.threat.badColor.g, db.threat.badColor.b
|
|
scale = NP.db.threat.badScale
|
|
end
|
|
elseif status == 2 then
|
|
if E.Role == "Tank" then
|
|
r, g, b = db.threat.badTransition.r, db.threat.badTransition.g, db.threat.badTransition.b
|
|
else
|
|
r, g, b = db.threat.goodTransition.r, db.threat.goodTransition.g, db.threat.goodTransition.b
|
|
end
|
|
scale = 1
|
|
elseif status == 1 then
|
|
if E.Role == "Tank" then
|
|
r, g, b = db.threat.goodTransition.r, db.threat.goodTransition.g, db.threat.goodTransition.b
|
|
else
|
|
r, g, b = db.threat.badTransition.r, db.threat.badTransition.g, db.threat.badTransition.b
|
|
end
|
|
scale = 1
|
|
else
|
|
if E.Role == "Tank" then
|
|
r, g, b = db.threat.badColor.r, db.threat.badColor.g, db.threat.badColor.b
|
|
scale = self.db.threat.badScale
|
|
else
|
|
r, g, b = db.threat.goodColor.r, db.threat.goodColor.g, db.threat.goodColor.b
|
|
scale = self.db.threat.goodScale
|
|
end
|
|
end
|
|
end
|
|
|
|
if (not status) or (status and not NP.db.threat.useThreatColor) then
|
|
local reactionType = frame.UnitReaction
|
|
if reactionType == 4 then
|
|
r, g, b = db.reactions.neutral.r, db.reactions.neutral.g, db.reactions.neutral.b
|
|
elseif reactionType and reactionType > 4 then
|
|
if frame.UnitType == "FRIENDLY_PLAYER" then
|
|
r, g, b = db.reactions.friendlyPlayer.r, db.reactions.friendlyPlayer.g, db.reactions.friendlyPlayer.b
|
|
else
|
|
r, g, b = db.reactions.good.r, db.reactions.good.g, db.reactions.good.b
|
|
end
|
|
else
|
|
r, g, b = db.reactions.bad.r, db.reactions.bad.g, db.reactions.bad.b
|
|
end
|
|
end
|
|
end
|
|
|
|
if r ~= frame.Health.r or g ~= frame.Health.g or b ~= frame.Health.b then
|
|
if not frame.HealthColorChanged then
|
|
frame.Health:SetStatusBarColor(r, g, b)
|
|
|
|
if frame.HealthColorChangeCallbacks then
|
|
for _, cb in ipairs(frame.HealthColorChangeCallbacks) do
|
|
cb(self, frame, r, g, b)
|
|
end
|
|
end
|
|
end
|
|
frame.Health.r, frame.Health.g, frame.Health.b = r, g, b
|
|
end
|
|
|
|
if frame.ThreatScale ~= scale then
|
|
frame.ThreatScale = scale
|
|
if frame.isTarget and self.db.useTargetScale then
|
|
scale = scale * self.db.targetScale
|
|
end
|
|
self:SetFrameScale(frame, scale * (frame.ActionScale or 1))
|
|
end
|
|
end
|
|
|
|
function NP:Update_Health(frame)
|
|
local health = frame.oldHealthBar:GetValue()
|
|
local _, maxHealth = frame.oldHealthBar:GetMinMaxValues()
|
|
frame.Health:SetMinMaxValues(0, maxHealth)
|
|
|
|
if frame.HealthValueChangeCallbacks then
|
|
for _, cb in ipairs(frame.HealthValueChangeCallbacks) do
|
|
cb(self, frame, health, maxHealth)
|
|
end
|
|
end
|
|
|
|
frame.Health:SetValue(health)
|
|
frame.FlashTexture:Point("TOPRIGHT", frame.Health:GetStatusBarTexture(), "TOPRIGHT") --idk why this fixes this
|
|
|
|
if self.db.units[frame.UnitType].health.text.enable then
|
|
frame.Health.Text:SetText(E:GetFormattedText(self.db.units[frame.UnitType].health.text.format, health, maxHealth))
|
|
end
|
|
end
|
|
|
|
function NP:RegisterHealthBarCallbacks(frame, valueChangeCB, colorChangeCB)
|
|
if valueChangeCB then
|
|
frame.HealthValueChangeCallbacks = frame.HealthValueChangeCallbacks or {}
|
|
tinsert(frame.HealthValueChangeCallbacks, valueChangeCB)
|
|
end
|
|
|
|
if colorChangeCB then
|
|
frame.HealthColorChangeCallbacks = frame.HealthColorChangeCallbacks or {}
|
|
tinsert(frame.HealthColorChangeCallbacks, colorChangeCB)
|
|
end
|
|
end
|
|
|
|
function NP:Update_HealthBar(frame)
|
|
if self.db.units[frame.UnitType].health.enable or (frame.isTarget and self.db.alwaysShowTargetHealth) then
|
|
frame.Health:Show()
|
|
else
|
|
frame.Health:Hide()
|
|
end
|
|
end
|
|
|
|
function NP:Configure_HealthBarScale(frame, scale, noPlayAnimation)
|
|
if noPlayAnimation then
|
|
frame.Health:SetWidth(self.db.units[frame.UnitType].health.width * scale)
|
|
frame.Health:SetHeight(self.db.units[frame.UnitType].health.height * scale)
|
|
else
|
|
if frame.Health.scale:IsPlaying() then
|
|
frame.Health.scale:Stop()
|
|
end
|
|
|
|
frame.Health.scale.width:SetChange(self.db.units[frame.UnitType].health.width * scale)
|
|
frame.Health.scale.height:SetChange(self.db.units[frame.UnitType].health.height * scale)
|
|
frame.Health.scale:Play()
|
|
end
|
|
end
|
|
|
|
function NP:Configure_HealthBar(frame, configuring)
|
|
local db = self.db.units[frame.UnitType].health
|
|
local healthBar = frame.Health
|
|
|
|
healthBar:SetPoint("TOP", frame, "TOP", 0, 0)
|
|
|
|
if configuring then
|
|
healthBar:SetStatusBarTexture(LSM:Fetch("statusbar", self.db.statusbar), "BORDER")
|
|
|
|
self:Configure_HealthBarScale(frame, frame.currentScale or 1, configuring)
|
|
|
|
E:SetSmoothing(healthBar, self.db.smoothbars)
|
|
|
|
if db.text.enable then
|
|
healthBar.Text:ClearAllPoints()
|
|
healthBar.Text:Point(E.InversePoints[db.text.position], db.text.parent == "Nameplate" and frame or frame[db.text.parent], db.text.position, db.text.xOffset, db.text.yOffset)
|
|
healthBar.Text:FontTemplate(LSM:Fetch("font", db.text.font), db.text.fontSize, db.text.fontOutline)
|
|
healthBar.Text:Show()
|
|
else
|
|
healthBar.Text:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function HealthBar_OnSizeChanged(self, width)
|
|
local health = self:GetValue()
|
|
local _, maxHealth = self:GetMinMaxValues()
|
|
self:GetStatusBarTexture():SetPoint("TOPRIGHT", -(width * ((maxHealth - health) / maxHealth)), 0)
|
|
end
|
|
|
|
function NP:Construct_HealthBar(parent)
|
|
local frame = CreateFrame("StatusBar", "$parentHealthBar", parent)
|
|
frame:SetStatusBarTexture(LSM:Fetch("statusbar", self.db.statusbar), "BORDER")
|
|
self:StyleFrame(frame)
|
|
|
|
frame:SetScript("OnSizeChanged", HealthBar_OnSizeChanged)
|
|
|
|
parent.FlashTexture = frame:CreateTexture(nil, "OVERLAY")
|
|
parent.FlashTexture:SetTexture(LSM:Fetch("background", "ElvUI Blank"))
|
|
parent.FlashTexture:Point("BOTTOMLEFT", frame:GetStatusBarTexture(), "BOTTOMLEFT")
|
|
parent.FlashTexture:Point("TOPRIGHT", frame:GetStatusBarTexture(), "TOPRIGHT")
|
|
parent.FlashTexture:Hide()
|
|
|
|
frame.Text = frame:CreateFontString(nil, "OVERLAY")
|
|
frame.Text:SetAllPoints(frame)
|
|
frame.Text:SetWordWrap(false)
|
|
|
|
frame.scale = CreateAnimationGroup(frame)
|
|
frame.scale.width = frame.scale:CreateAnimation("Width")
|
|
frame.scale.width:SetDuration(0.2)
|
|
frame.scale.height = frame.scale:CreateAnimation("Height")
|
|
frame.scale.height:SetDuration(0.2)
|
|
|
|
frame:Hide()
|
|
|
|
return frame
|
|
end |