152 lines
4.9 KiB
Lua
152 lines
4.9 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 unpack = unpack
|
||
|
local UnitPlayerControlled = UnitPlayerControlled
|
||
|
local UnitIsTapDenied = UnitIsTapDenied
|
||
|
local UnitClass = UnitClass
|
||
|
local UnitReaction = UnitReaction
|
||
|
local UnitIsConnected = UnitIsConnected
|
||
|
local CreateFrame = CreateFrame
|
||
|
local UnitPowerType = UnitPowerType
|
||
|
local ALTERNATE_POWER_INDEX = Enum.PowerType.Alternate or 10
|
||
|
|
||
|
function NP:Power_UpdateColor(_, unit)
|
||
|
if self.unit ~= unit then return end
|
||
|
|
||
|
local element = self.Power
|
||
|
local ptype, ptoken, altR, altG, altB = UnitPowerType(unit)
|
||
|
element.token = ptoken
|
||
|
|
||
|
local sf = NP:StyleFilterChanges(self)
|
||
|
if sf.PowerColor then return end
|
||
|
|
||
|
local Selection = element.colorSelection and NP:UnitSelectionType(unit, element.considerSelectionInCombatHostile)
|
||
|
|
||
|
local r, g, b, t, atlas
|
||
|
if element.colorDisconnected and not UnitIsConnected(unit) then
|
||
|
t = self.colors.disconnected
|
||
|
elseif element.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapDenied(unit) then
|
||
|
t = self.colors.tapped
|
||
|
elseif element.colorPower then
|
||
|
if element.displayType ~= ALTERNATE_POWER_INDEX then
|
||
|
t = NP.db.colors.power[ptoken or ptype]
|
||
|
if not t then
|
||
|
if element.GetAlternativeColor then
|
||
|
r, g, b = element:GetAlternativeColor(unit, ptype, ptoken, altR, altG, altB)
|
||
|
elseif altR then
|
||
|
r, g, b = altR, altG, altB
|
||
|
if r > 1 or g > 1 or b > 1 then -- BUG: As of 7.0.3, altR, altG, altB may be in 0-1 or 0-255 range.
|
||
|
r, g, b = r / 255, g / 255, b / 255
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
t = NP.db.colors.power.ALT_POWER
|
||
|
end
|
||
|
|
||
|
if element.useAtlas and t and t.atlas then
|
||
|
atlas = t.atlas
|
||
|
end
|
||
|
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
|
||
|
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
|
||
|
local adjust = 0 - (element.min or 0)
|
||
|
r, g, b = self:ColorGradient((element.cur or 1) + adjust, (element.max or 1) + adjust, unpack(element.smoothGradient or self.colors.smooth))
|
||
|
end
|
||
|
|
||
|
if t then
|
||
|
r, g, b = t[1] or t.r, t[2] or t.g, t[3] or t.b
|
||
|
end
|
||
|
|
||
|
if atlas then
|
||
|
element:SetStatusBarAtlas(atlas)
|
||
|
element:SetStatusBarColor(1, 1, 1)
|
||
|
elseif b then
|
||
|
element:SetStatusBarColor(r, g, b)
|
||
|
end
|
||
|
|
||
|
if element.bg and b then element.bg:SetVertexColor(r * NP.multiplier, g * NP.multiplier, b * NP.multiplier) end
|
||
|
|
||
|
if element.PostUpdateColor then
|
||
|
element:PostUpdateColor(unit, r, g, b)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function NP:Power_PostUpdate(_, cur) --unit, cur, min, max
|
||
|
local db = NP.db.units[self.__owner.frameType]
|
||
|
|
||
|
if not db then return end
|
||
|
|
||
|
if self.__owner.frameType ~= 'PLAYER' and db.power.displayAltPower and not self.displayType then
|
||
|
self:Hide()
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if db.power and db.power.enable and db.power.hideWhenEmpty and (cur == 0) then
|
||
|
self:Hide()
|
||
|
else
|
||
|
self:Show()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function NP:Construct_Power(nameplate)
|
||
|
local Power = CreateFrame('StatusBar', nameplate:GetName()..'Power', nameplate)
|
||
|
Power:SetFrameStrata(nameplate:GetFrameStrata())
|
||
|
Power:SetFrameLevel(5)
|
||
|
Power:CreateBackdrop('Transparent', nil, nil, nil, nil, true)
|
||
|
|
||
|
local clipFrame = CreateFrame('Frame', nil, Power)
|
||
|
clipFrame:SetClipsChildren(true)
|
||
|
clipFrame:SetAllPoints()
|
||
|
clipFrame:EnableMouse(false)
|
||
|
Power.ClipFrame = clipFrame
|
||
|
|
||
|
NP.StatusBars[Power] = true
|
||
|
|
||
|
Power.frequentUpdates = true
|
||
|
Power.colorTapping = false
|
||
|
Power.colorClass = false
|
||
|
|
||
|
Power.PostUpdate = NP.Power_PostUpdate
|
||
|
Power.UpdateColor = NP.Power_UpdateColor
|
||
|
|
||
|
return Power
|
||
|
end
|
||
|
|
||
|
function NP:Update_Power(nameplate)
|
||
|
local db = NP:PlateDB(nameplate)
|
||
|
|
||
|
if db.power.enable then
|
||
|
if not nameplate:IsElementEnabled('Power') then
|
||
|
nameplate:EnableElement('Power')
|
||
|
end
|
||
|
|
||
|
nameplate.Power:SetStatusBarTexture(LSM:Fetch('statusbar', NP.db.statusbar))
|
||
|
nameplate.Power:Point('CENTER', nameplate, 'CENTER', db.power.xOffset, db.power.yOffset)
|
||
|
|
||
|
nameplate:SetPowerUpdateMethod(E.global.nameplate.effectivePower)
|
||
|
nameplate:SetPowerUpdateSpeed(E.global.nameplate.effectivePowerSpeed)
|
||
|
|
||
|
E:SetSmoothing(nameplate.Power, NP.db.smoothbars)
|
||
|
elseif nameplate:IsElementEnabled('Power') then
|
||
|
nameplate:DisableElement('Power')
|
||
|
end
|
||
|
|
||
|
nameplate.Power.displayAltPower = db.power.displayAltPower
|
||
|
nameplate.Power.useAtlas = db.power.useAtlas
|
||
|
nameplate.Power.colorClass = db.power.useClassColor
|
||
|
nameplate.Power.colorPower = not db.power.useClassColor
|
||
|
nameplate.Power.width = db.power.width
|
||
|
nameplate.Power.height = db.power.height
|
||
|
nameplate.Power:Size(db.power.width, db.power.height)
|
||
|
end
|