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.
102 lines
3.5 KiB
102 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
|
|
|