Files
ice-hud/modules/PlayerAlternatePower.lua
Parnic b1adbe8090 Add Dragonriding Vigor module
This displays the Vigor charges for the player whenever they're on a Dragonriding mount (which is detected via explicit buff ID scanning from a hardcoded list...I'd like to make that more robust so I don't have to keep up with new mounts being added, but I'm not sure how to do it another way just yet). The Alternate Power bar is hidden if the Vigor module is enabled so that we don't end up with duplicate Vigor trackers (although right now it flashes on the screen before the mount buff is detected, so I'd also like to fix that...).

I've effectively had to implement my own Vigor module from scratch by poking into the internals of the Vigor widget by its ID in order to determine the recharge amount on the final Vigor charge because there's currently no API to get this information otherwise. Hopefully this gets added; if it does, I'll happily rip out this widget inspection junk. Aside from the partial charge stuff, this is just a skinned version of an Alternate Power indicator that only shows when the user is on a dragonriding mount. ClassPowerCounter doesn't sound like a particularly appropriate base class for this, but since Vigor is implemented as Alternate Power, it worked out nicely.
2023-01-15 13:03:18 -06:00

147 lines
3.6 KiB
Lua

local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local PlayerAlternatePower = IceCore_CreateClass(IceUnitBar)
-- Constructor --
function PlayerAlternatePower.prototype:init(moduleName, unit)
PlayerAlternatePower.super.prototype.init(self, moduleName or "PlayerAlternatePower", "player")
self.bTreatEmptyAsFull = true
self.power = 0
self.maxPower = 0
self.powerPercent = 0
self.powerIndex = ALTERNATE_POWER_INDEX
self.powerName = "MANA"
end
function PlayerAlternatePower.prototype:GetDefaultSettings()
local settings = PlayerAlternatePower.super.prototype.GetDefaultSettings(self)
settings["side"] = IceCore.Side.Left
settings["offset"] = -1
settings["upperText"] = "[PercentAltP:Round]"
settings["lowerText"] = "[FractionalAltP]"
settings["hideBlizz"] = false
return settings
end
function PlayerAlternatePower.prototype:Enable(core)
PlayerAlternatePower.super.prototype.Enable(self, core)
self:RegisterEvent(IceHUD.UnitPowerEvent, "UpdateEvent")
if IceHUD.EventExistsUnitMaxPower then
self:RegisterEvent("UNIT_MAXPOWER", "UpdateEvent")
end
self:RegisterEvent("UNIT_POWER_BAR_SHOW", "PowerBarShow")
self:RegisterEvent("UNIT_POWER_BAR_HIDE", "PowerBarHide")
self.wantToShow = true
self:Update(self.unit)
if self.maxPower == 0 then
self:Show(false)
end
if self.moduleSettings.hideBlizz then
self:HideBlizz()
end
end
function PlayerAlternatePower.prototype:PowerBarShow(event, unit)
if unit ~= self.unit then
return
end
self.wantToShow = true
self:Show(true)
self:Update(self.unit)
end
function PlayerAlternatePower.prototype:PowerBarHide(event, unit)
if unit ~= self.unit then
return
end
self.wantToShow = false
self:Show(false)
self:Update(self.unit)
end
function PlayerAlternatePower.prototype:UpdateEvent(event, unit)
self:Update(unit)
end
function PlayerAlternatePower.prototype:Update(unit)
PlayerAlternatePower.super.prototype.Update(self)
if (unit and (unit ~= self.unit)) then
return
end
if IceHUD.DragonridingVigor and IceHUD.DragonridingVigor.bIsVisible then
self:Show(false)
elseif self.wantToShow then
self:Show(true)
end
self.maxPower = UnitPowerMax(self.unit, self.powerIndex)
self.power = UnitPower(self.unit, self.powerIndex)
if self.maxPower > 0 then
self.powerPercent = self.power / self.maxPower
else
self.powerPercent = 0
end
self:UpdateBar(self.powerPercent)
local info = PowerBarColor[self.powerName];
self.barFrame.bar:SetVertexColor(info.r, info.g, info.b, self.alpha)
if not IceHUD.IceCore:ShouldUseDogTags() then
self:SetBottomText1(math.floor(self.powerPercent * 100))
self:SetBottomText2(self:GetFormattedText(self.power, self.maxPower), color)
end
end
function PlayerAlternatePower.prototype:GetOptions()
local opts = PlayerAlternatePower.super.prototype.GetOptions(self)
opts["lowThresholdColor"] = nil
opts["hideBlizz"] = {
type = "toggle",
name = L["Hide Blizzard Frame"],
desc = L["Hides Blizzard Player frame and disables all events related to it"],
get = function()
return self.moduleSettings.hideBlizz
end,
set = function(info, value)
self.moduleSettings.hideBlizz = value
if value then
self:HideBlizz()
else
self:ShowBlizz()
end
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 51
}
return opts
end
function PlayerAlternatePower.prototype:ShowBlizz()
PlayerPowerBarAlt:GetScript("OnLoad")(PlayerPowerBarAlt)
end
function PlayerAlternatePower.prototype:HideBlizz()
PlayerPowerBarAlt:Hide()
PlayerPowerBarAlt:UnregisterAllEvents()
end
-- Load us up
if ALTERNATE_POWER_INDEX then
IceHUD.PlayerAlternatePower = PlayerAlternatePower:new()
end