df7cc26a64
Fix remaining lua errors covered by ascension patches Add Addon Skins Add Enhanced Friends List
214 lines
7.1 KiB
Lua
214 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 class = frame.UnitClass
|
|
local classColor = RAID_CLASS_COLORS[class]
|
|
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 |