You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.5 KiB

local Power = {}
local powerMap = ShadowUF.Tags.powerMap
ShadowUF:RegisterModule(Power, "powerBar", ShadowUF.L["Power bar"], true)
function Power:OnEnable(frame)
frame.powerBar = frame.powerBar or ShadowUF.Units:CreateBar(frame)
frame:RegisterUnitEvent("UNIT_POWER_FREQUENT", self, "Update")
frame:RegisterUnitEvent("UNIT_MAXPOWER", self, "Update")
frame:RegisterUnitEvent("UNIT_CONNECTION", self, "Update")
frame:RegisterUnitEvent("UNIT_POWER_BAR_SHOW", self, "Update")
frame:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", self, "Update")
frame:RegisterUnitEvent("UNIT_DISPLAYPOWER", self, "UpdateColor")
frame:RegisterUnitEvent("UNIT_CLASSIFICATION_CHANGED", self, "UpdateClassification")
-- run an update after returning to life
if ( frame.unit == "player" ) then
frame:RegisterNormalEvent("PLAYER_UNGHOST", self, "Update")
end
-- UNIT_MANA fires after repopping at a spirit healer, make sure to update powers then
frame:RegisterUnitEvent("UNIT_MANA", self, "Update")
frame:RegisterUpdateFunc(self, "UpdateClassification")
frame:RegisterUpdateFunc(self, "UpdateColor")
frame:RegisterUpdateFunc(self, "Update")
end
function Power:OnDisable(frame)
frame:UnregisterAll(self)
end
local altColor = {}
function Power:UpdateColor(frame)
local powerID, currentType, altR, altG, altB = UnitPowerType(frame.unit)
frame.powerBar.currentType = currentType
-- Overridden power types like Warlock pets, or Ulduar vehicles use "POWER_TYPE_#####" but triggers power events with "ENERGY", so this fixes that
-- by using the powerID to figure out the event type
if( not powerMap[currentType] ) then
frame.powerBar.currentType = powerMap[powerID] or "ENERGY"
end
if( ShadowUF.db.profile.units[frame.unitType].powerBar.onlyMana ) then
ShadowUF.Layout:SetBarVisibility(frame, "powerBar", currentType == "MANA")
if( currentType ~= "MANA" ) then return end
end
local color
if( frame.powerBar.minusMob ) then
color = ShadowUF.db.profile.healthColors.offline
elseif( ShadowUF.db.profile.units[frame.unitType].powerBar.colorType == "class" and UnitIsPlayer(frame.unit) ) then
local class = frame:UnitClassToken()
color = class and ShadowUF.db.profile.classColors[class]
end
if( not color ) then
color = ShadowUF.db.profile.powerColors[frame.powerBar.currentType]
if( not color ) then
if( altR ) then
altColor.r, altColor.g, altColor.b = altR, altG, altB
color = altColor
else
color = ShadowUF.db.profile.powerColors.MANA
end
end
end
frame:SetBarColor("powerBar", color.r, color.g, color.b)
self:Update(frame)
end
function Power:UpdateClassification(frame, event, unit)
local classif = UnitClassification(frame.unit)
local minus = nil
if( classif == "minus" ) then
minus = true
frame.powerBar:SetMinMaxValues(0, 1)
frame.powerBar:SetValue(0)
end
if( minus ~= frame.powerBar.minusMob ) then
frame.powerBar.minusMob = minus
-- Only need to force an update if it was event driven, otherwise the update func will hit color/etc next
if( event ) then
self:UpdateColor(frame)
end
end
end
function Power:Update(frame, event, unit, powerType)
if( event and powerType and powerType ~= frame.powerBar.currentType ) then return end
if( frame.powerBar.minusMob ) then return end
frame.powerBar.currentPower = UnitPower(frame.unit)
frame.powerBar:SetMinMaxValues(0, UnitPowerMax(frame.unit))
frame.powerBar:SetValue(UnitIsDeadOrGhost(frame.unit) and 0 or not UnitIsConnected(frame.unit) and 0 or frame.powerBar.currentPower)
end