--[[-------------------------------------------------------------------- oUF_Phanx/Elements/BurningEmbers.lua Element to display burning embers on oUF frames. Copyright (c) 2008-2015 Phanx <addons@phanx.net>. All rights reserved. You may embed this module in your own layout, but please do not distribute it as a standalone plugin. ----------------------------------------------------------------------]] local _, ns = ... local oUF = ns.oUF or oUF assert(oUF, "BurningEmbers element requires oUF") local MAX_POWER_PER_EMBER = MAX_POWER_PER_EMBER local SPEC_WARLOCK_DESTRUCTION = SPEC_WARLOCK_DESTRUCTION local SPELL_POWER_BURNING_EMBERS = SPELL_POWER_BURNING_EMBERS local WARLOCK_BURNING_EMBERS = WARLOCK_BURNING_EMBERS local UpdateVisibility, Update, Path, ForceUpdate, Enable, Disable function UpdateVisibility(self, event) local element = self.BurningEmbers if UnitHasVehicleUI("player") or GetSpecialization() ~= SPEC_WARLOCK_DESTRUCTION or not IsPlayerSpell(WARLOCK_BURNING_EMBERS) then self:UnregisterEvent("UNIT_DISPLAYPOWER", Path) self:UnregisterEvent("UNIT_POWER", Path) element.__disabled = true for i = 1, #element do element[i]:Hide() end if element.Hide then element:Hide() end return end element.__disabled = nil if element.Show then element:Show() end self:RegisterEvent("UNIT_DISPLAYPOWER", Path) self:RegisterEvent("UNIT_POWER", Path) Update(self, "UpdateVisibility", "player") end function Update(self, event, unit, powerType) if powerType and powerType ~= "BURNING_EMBERS" then return end local element = self.BurningEmbers if element.__disabled then return end if element.PreUpdate then element:PreUpdate() end local embers = UnitPower("player", SPELL_POWER_BURNING_EMBERS, true) local embersMax = UnitPowerMax("player", SPELL_POWER_BURNING_EMBERS, true) local whole = floor(embers / MAX_POWER_PER_EMBER) local wholeMax = floor(embersMax / MAX_POWER_PER_EMBER) local parts = embers % MAX_POWER_PER_EMBER if element.SetValue then element:SetMinMaxValues(0, embersMax) element:SetValue(embers) else local rest = embers for i = 1, #element do local ember = element[i] ember.activated = false if i > wholeMax then --print(i, "Unused") ember:Hide() elseif rest >= MAX_POWER_PER_EMBER then --print(i, "Full") if ember.SetValue then ember:SetMinMaxValues(0, MAX_POWER_PER_EMBER) ember:SetValue(MAX_POWER_PER_EMBER) else ember:SetAlpha(1) end ember.activated = true ember:Show() rest = rest - MAX_POWER_PER_EMBER elseif rest > 0 then --print(i, "Partial", rest, parts) if ember.SetValue then ember:SetMinMaxValues(0, MAX_POWER_PER_EMBER) ember:SetValue(rest) else ember:SetAlpha(1 - (0.75 * (rest / MAX_POWER_PER_EMBER))) end ember:Show() rest = 0 else --print(i, "Empty") if ember.SetValue then ember:SetMinMaxValues(0, MAX_POWER_PER_EMBER) ember:SetValue(0) else ember:SetAlpha(0.25) end ember:Show() end end end if element.PostUpdate then element:PostUpdate(embers, embersMax, SPELL_POWER_BURNING_EMBERS) end end function Path(self, ...) return (self.BurningEmbers.Override or Update)(self, ...) end function ForceUpdate(element) return Path(element.__owner, "ForceUpdate", element.__owner.unit) end function Enable(self) local element = self.BurningEmbers if not element or self.unit ~= "player" then return end element.__name = "BurningEmbers" element.__owner = self element.ForceUpdate = ForceUpdate for i = 1, #element do local ember = element[i] if ember.GetStatusBarTexture and not ember:GetStatusBarTexture() then ember:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]]) end end self:RegisterEvent("PLAYER_TALENT_UPDATE", UpdateVisibility, true) self:RegisterEvent("UNIT_ENTERING_VEHICLE", UpdateVisibility) self:RegisterEvent("UNIT_EXITED_VEHICLE", UpdateVisibility) UpdateVisibility(self, "Enable") return true end function Disable(self) local element = self.BurningEmbers if not element then return end self:UnregisterEvent("UNIT_DISPLAYPOWER", Path) self:UnregisterEvent("UNIT_POWER", Path) self:UnregisterEvent("PLAYER_TALENT_UPDATE", UpdateVisibility) self:UnregisterEvent("UNIT_ENTERING_VEHICLE", UpdateVisibility) self:UnregisterEvent("UNIT_EXITED_VEHICLE", UpdateVisibility) for i = 1, #element do element[i]:Hide() end if element.Hide then element:Hide() end end oUF:AddElement("BurningEmbers", Path, Enable, Disable)