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.

162 lines
5.7 KiB

local Fader = {}
local powerDepletes = {[Enum.PowerType.Mana] = true, [Enum.PowerType.Energy] = true, [Enum.PowerType.Focus] = true}
ShadowUF:RegisterModule(Fader, "fader", ShadowUF.L["Combat fader"])
-- TODO: Remove once Blizzard fixes cooldown wheels not taking parents alpha
local function tempAuraFader(frame, alpha)
if( not frame.auras ) then return end
local childAlpha = 0.8 * alpha
if( frame.auras.buffs ) then
for id, button in pairs(frame.auras.buffs.buttons) do
button.cooldown:SetSwipeColor(0, 0, 0, childAlpha)
end
end
if( frame.auras.debuffs ) then
for id, button in pairs(frame.auras.debuffs.buttons) do
button.cooldown:SetSwipeColor(0, 0, 0, childAlpha)
end
end
end
local function faderUpdate(self, elapsed)
self.timeElapsed = self.timeElapsed + elapsed
if( self.timeElapsed >= self.fadeTime ) then
tempAuraFader(self.parent, self.alphaEnd)
self.parent:SetAlpha(self.alphaEnd)
self:Hide()
if( self.fadeType == "in" ) then
self.parent:DisableRangeAlpha(false)
end
return
end
if( self.fadeType == "in" ) then
self.parent:SetAlpha((self.timeElapsed / self.fadeTime) * (self.alphaEnd - self.alphaStart) + self.alphaStart)
else
self.parent:SetAlpha(((self.fadeTime - self.timeElapsed) / self.fadeTime) * (self.alphaStart - self.alphaEnd) + self.alphaEnd)
end
tempAuraFader(self.parent, self.parent:GetAlpha())
end
local function startFading(self, type, alpha, speedyFade)
if( self.fader.fadeType == type ) then return end
if( type == "out" ) then
self:DisableRangeAlpha(true)
end
self.fader.fadeTime = speedyFade and 0.15 or type == "in" and 0.25 or type == "out" and 0.75
self.fader.fadeType = type
self.fader.timeElapsed = 0
self.fader.alphaEnd = alpha
self.fader.alphaStart = self:GetAlpha()
self.fader:Show()
end
function Fader:OnEnable(frame)
if( not frame.fader ) then
frame.fader = CreateFrame("Frame", nil, frame)
frame.fader.timeElapsed = 0
frame.fader.parent = frame
frame.fader:SetScript("OnUpdate", faderUpdate)
frame.fader:Hide()
end
frame:RegisterNormalEvent("PLAYER_REGEN_ENABLED", self, "Update")
frame:RegisterNormalEvent("PLAYER_REGEN_DISABLED", self, "Update")
frame:RegisterUpdateFunc(self, "Update")
if( InCombatLockdown() ) then
Fader:PLAYER_REGEN_DISABLED(frame, "PLAYER_REGEN_DISABLED")
else
Fader:PLAYER_REGEN_ENABLED(frame, "PLAYER_REGEN_ENABLED")
end
end
function Fader:OnLayoutApplied(frame)
if( frame.visibility.fader ) then
frame.fader.fadeType = nil
frame:DisableRangeAlpha(false)
end
end
function Fader:OnDisable(frame)
frame:UnregisterAll(self)
frame:SetAlpha(1.0)
if( frame.fader ) then
frame.fader.fadeType = nil
frame.fader:Hide()
end
end
-- While we're in combat, we don't care about the other events so we might as well unregister them
function Fader:PLAYER_REGEN_ENABLED(frame, event)
self:Update(frame, event)
frame:RegisterNormalEvent("PLAYER_TARGET_CHANGED", self, "Update")
frame:RegisterNormalEvent("UNIT_SPELLCAST_CHANNEL_START", self, "CastStart")
frame:RegisterNormalEvent("UNIT_SPELLCAST_CHANNEL_STOP", self, "CastStop")
frame:RegisterNormalEvent("UNIT_SPELLCAST_START", self, "CastStart")
frame:RegisterNormalEvent("UNIT_SPELLCAST_STOP", self, "CastStop")
frame:RegisterUnitEvent("UNIT_HEALTH", self, "Update")
frame:RegisterUnitEvent("UNIT_MAXHEALTH", self, "Update")
frame:RegisterUnitEvent("UNIT_POWER_FREQUENT", self, "Update")
frame:RegisterUnitEvent("UNIT_MAXPOWER", self, "Update")
end
function Fader:PLAYER_REGEN_DISABLED(frame, event)
self:Update(frame, event)
frame:UnregisterSingleEvent("PLAYER_TARGET_CHANGED", self)
frame:UnregisterSingleEvent("UNIT_SPELLCAST_CHANNEL_START", self)
frame:UnregisterSingleEvent("UNIT_SPELLCAST_CHANNEL_STOP", self)
frame:UnregisterSingleEvent("UNIT_SPELLCAST_START", self)
frame:UnregisterSingleEvent("UNIT_SPELLCAST_STOP", self)
frame:UnregisterSingleEvent("UNIT_HEALTH", self)
frame:UnregisterSingleEvent("UNIT_POWER_FREQUENT", self)
frame:UnregisterSingleEvent("UNIT_MAXHEALTH", self)
frame:UnregisterSingleEvent("UNIT_MAXPOWER", self)
end
local activeCastID
function Fader:CastStart(frame, event, unit, id)
if( unit ~= "player" or activeCastID == id ) then return end
activeCastID = id
frame.fader.playerCasting = true
self:Update(frame)
end
function Fader:CastStop(frame, event, unit, id)
if( unit ~= "player" or activeCastID ~= id ) then return end
activeCastID = nil
frame.fader.playerCasting = nil
self:Update(frame)
end
function Fader:Update(frame, event)
-- In combat, fade back in
if( InCombatLockdown() or event == "PLAYER_REGEN_DISABLED" ) then
startFading(frame, "in", ShadowUF.db.profile.units[frame.unitType].fader.combatAlpha)
-- Player is casting, fade in
elseif( frame.fader.playerCasting ) then
startFading(frame, "in", ShadowUF.db.profile.units[frame.unitType].fader.combatAlpha, true)
-- Ether mana or energy is not at 100%, fade in
elseif( powerDepletes[UnitPowerType(frame.unit)] and UnitPower(frame.unit) ~= UnitPowerMax(frame.unit) ) then
startFading(frame, "in", ShadowUF.db.profile.units[frame.unitType].fader.combatAlpha)
-- Health is not at max, fade in
elseif( UnitHealth(frame.unit) ~= UnitHealthMax(frame.unit) ) then
startFading(frame, "in", ShadowUF.db.profile.units[frame.unitType].fader.combatAlpha)
-- Targetting somebody, fade in
elseif( frame.unitType == "player" and UnitExists("target") ) then
startFading(frame, "in", ShadowUF.db.profile.units[frame.unitType].fader.combatAlpha)
-- Nothing else? Fade out!
else
startFading(frame, "out", ShadowUF.db.profile.units[frame.unitType].fader.inactiveAlpha)
end
end