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.

214 lines
5.4 KiB

local PA = _G.ProjectAzilroka
local oUF = PA.oUF
if not oUF then
return
end
--[[
Configuration values for both health and power:
.enabled: enable cutaway for this element, defaults to disabled
.fadeOutTime: How long it takes the cutaway health to fade, defaults to 0.6 seconds
.lengthBeforeFade: How long it takes before the cutaway begins to fade, defaults to 0.3 seconds
]]
-- GLOBALS: ElvUI
local _G = _G
local max = math.max
local hooksecurefunc = hooksecurefunc
local E -- placeholder
local function checkElvUI()
if not E then
E = _G.ElvUI and _G.ElvUI[1]
assert(E, "PBCutaway was not able to locate ElvUI and it is required.")
end
end
local function closureFunc(self)
self.ready = nil
self.playing = nil
self.cur = nil
end
local function fadeClosure(element)
if not element.FadeObject then
element.FadeObject = {
finishedFuncKeep = true,
finishedArg1 = element,
finishedFunc = closureFunc
}
end
E:UIFrameFadeOut(element, element.fadeOutTime, element.__parentElement:GetAlpha(), 0)
end
local function Shared_PreUpdate(self, element, petOwner, petIndex)
element.petOwner = petOwner
element.petIndex = petIndex
element.cur = self.cur
element.ready = true
end
local function UpdateSize(self, element, curV, maxV)
local isVertical = self:GetOrientation() == "VERTICAL"
local pm = (isVertical and self:GetHeight()) or self:GetWidth()
local oum = (1 / maxV) * pm
local c = max(element.cur - curV, 0)
local mm = c * oum
if isVertical then
element:SetHeight(mm)
else
element:SetWidth(mm)
end
end
local PRE = 0
local POST = 1
local function Shared_UpdateCheckReturn(self, element, updateType, ...)
if not element:IsVisible() then
return true
end
if (updateType == PRE) then
local maxV = ...
return (not element.enabled or not self.cur) or element.ready or not maxV
elseif (updateType == POST) then
local curV, maxV, petOwner, petIndex = ...
return (not element.enabled or not element.cur) or (not element.ready or not curV or not maxV) or
element.petOwner ~= petOwner or
element.petIndex ~= petIndex
else
return false
end
end
local function PBHealth_PreUpdate(self, unit)
local petInfo = self.__owner.pbouf_petinfo
local element = self.__owner.PBCutaway.Health
local maxV = (element.GetHealthMax or C_PetBattles.GetMaxHealth)(petInfo.petOwner, petInfo.petIndex)
if Shared_UpdateCheckReturn(self, element, PRE, maxV) then
return
end
Shared_PreUpdate(self, element, unit)
end
local function PBHealth_PostUpdate(self, unit, curHealth, maxHealth)
local element = self.__owner.PBCutaway.Health
if Shared_UpdateCheckReturn(self, element, POST, curHealth, maxHealth, unit) then
return
end
UpdateSize(self, element, curHealth, maxHealth)
if element.playing then
return
end
if (element.cur - curHealth) > (maxHealth * 0.01) then
element:SetAlpha(self:GetAlpha())
E:Delay(element.lengthBeforeFade, fadeClosure, element)
element.playing = true
else
element:SetAlpha(0)
closureFunc(element)
end
end
local function PBHealth_PostUpdateColor(self, _, _, _, _)
local r, g, b = self:GetStatusBarColor()
self.__owner.PBCutaway.Health:SetVertexColor(r * 1.5, g * 1.5, b * 1.5)
end
local defaults = {
health = {
enabled = true,
lengthBeforeFade = 0.3,
fadeOutTime = 0.6
}
}
local function UpdateConfigurationValues(self, db)
local hs = false
if (self.Health) then
local health = self.Health
local hdb = db.health
hs = hdb.enabled
health.enabled = hs
if (hs) then
health.lengthBeforeFade = hdb.lengthBeforeFade
health.fadeOutTime = hdb.fadeOutTime
health:Show()
else
health:Hide()
end
end
return hs
end
local function Enable(self)
local element = self and self.PBCutaway
if (element) then
checkElvUI()
if (element.Health and element.Health:IsObjectType("Texture") and not element.Health:GetTexture()) then
element.Health:SetTexture([[Interface\TargetingFrame\UI-StatusBar]])
end
if (not element.defaultsSet) then
UpdateConfigurationValues(element, defaults)
element.defaultsSet = true
end
if element.Health and self.PBHealth then
self.PBHealth.__owner = self
element.Health.__parentElement = self.PBHealth
element.Health:SetAlpha(0)
if not element.Health.hasCutawayHook then
if self.PBHealth.PreUpdate then
hooksecurefunc(self.PBHealth, "PreUpdate", PBHealth_PreUpdate)
else
self.PBHealth.PreUpdate = PBHealth_PreUpdate
end
if self.PBHealth.PostUpdate then
hooksecurefunc(self.PBHealth, "PostUpdate", PBHealth_PostUpdate)
else
self.PBHealth.PostUpdate = PBHealth_PostUpdate
end
if self.PBHealth.PostUpdateColor then
hooksecurefunc(self.PBHealth, "PostUpdateColor", PBHealth_PostUpdateColor)
else
self.PBHealth.PostUpdateColor = PBHealth_PostUpdateColor
end
element.Health.hasCutawayHook = true
end
end
if not (element.UpdateConfigurationValues) then
element.UpdateConfigurationValues = UpdateConfigurationValues
end
return true
end
end
local function disableElement(element)
if element then
element.enabled = false
element:Hide()
end
end
local function Disable(self)
if self and self.PBCutaway then
disableElement(self.PBCutaway.Health)
end
end
oUF:AddElement("PBCutaway", nil, Enable, Disable)