mirror of
https://github.com/parnic/ice-hud.git
synced 2025-06-16 14:50:13 -05:00
There are controls on the player castbar module for flashing when a spell succeeds or fails, and separate controls for flashing when an instant cast completes. Those were broken (flashing never happened), but now work again. UpdateBar() was necessary in MyOnUpdate() in the event that no other spell has been cast (in order to set the alpha so that the bottom text displays). The spellId is being passed along so that spells that aren't currently being cast can have their name and icon displayed appropriately, and so the early-out for "no known spell" doesn't trigger (which allows the Flash to actually work). The self.current reset fixes instant casts after a normal cast (we were only clearing the "current" spell conditionally when we only meant to filter StopBar, so if it wasn't cleared, future successful casts thought they were for a different spell than was currently being cast.
752 lines
24 KiB
Lua
752 lines
24 KiB
Lua
local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
|
|
IceCastBar = IceCore_CreateClass(IceBarElement)
|
|
|
|
local IceHUD = _G.IceHUD
|
|
|
|
IceCastBar.Actions = { None = 0, Cast = 1, Channel = 2, Instant = 3, Success = 4, Failure = 5, ReverseChannel = 6 }
|
|
|
|
IceCastBar.prototype.action = nil
|
|
IceCastBar.prototype.actionStartTime = nil
|
|
IceCastBar.prototype.actionDuration = nil
|
|
IceCastBar.prototype.actionMessage = nil
|
|
IceCastBar.prototype.unit = nil
|
|
IceCastBar.prototype.current = nil
|
|
|
|
local SPELL_POWER_MANA = SPELL_POWER_MANA
|
|
if Enum and Enum.PowerType then
|
|
SPELL_POWER_MANA = Enum.PowerType.Mana
|
|
end
|
|
|
|
local UnitCastingInfo, UnitChannelInfo = UnitCastingInfo, UnitChannelInfo
|
|
if not UnitCastingInfo then
|
|
UnitCastingInfo = CastingInfo
|
|
UnitChannelInfo = ChannelInfo
|
|
end
|
|
|
|
-- Fulzamoth 2019-09-27 : Use LibClassicCasterino if it's there so we can use TargetCast
|
|
-- module in Classic WoW
|
|
if IceHUD.WowClassic then
|
|
LibClassicCasterino = LibStub("LibClassicCasterino", true)
|
|
if LibClassicCasterino then
|
|
UnitCastingInfo = function(unit)
|
|
return LibClassicCasterino:UnitCastingInfo(unit)
|
|
end
|
|
UnitChannelInfo = function(unit)
|
|
return LibClassicCasterino:UnitChannelInfo(unit)
|
|
end
|
|
end
|
|
end
|
|
-- end Fulzamoth change
|
|
|
|
local AuraIconWidth = 20
|
|
local AuraIconHeight = 20
|
|
|
|
-- Constructor --
|
|
function IceCastBar.prototype:init(name)
|
|
IceCastBar.super.prototype.init(self, name)
|
|
|
|
self:SetDefaultColor("CastCasting", 242, 242, 10)
|
|
self:SetDefaultColor("CastChanneling", 242, 242, 10)
|
|
self:SetDefaultColor("CastSuccess", 242, 242, 70)
|
|
self:SetDefaultColor("CastFail", 1, 0, 0)
|
|
if GetUnitEmpowerMinHoldTime then
|
|
self:SetDefaultColor("EmpowerStage0", 165, 165, 165)
|
|
self:SetDefaultColor("EmpowerStage1", 242, 42, 10)
|
|
self:SetDefaultColor("EmpowerStage2", 242, 142, 10)
|
|
self:SetDefaultColor("EmpowerStage3", 242, 242, 10)
|
|
self:SetDefaultColor("EmpowerStage4", 242, 242, 242)
|
|
end
|
|
self.unit = "player"
|
|
|
|
self.delay = 0
|
|
self.action = IceCastBar.Actions.None
|
|
end
|
|
|
|
|
|
-- 'Public' methods -----------------------------------------------------------
|
|
|
|
function IceCastBar.prototype:Enable(core)
|
|
IceCastBar.super.prototype.Enable(self, core)
|
|
|
|
-- Fulzamoth 2019-09-27 : LibClassicCasterino support
|
|
-- Setup callback to the library, and route events to
|
|
-- IceHUD's handler functions.
|
|
if LibClassicCasterino then
|
|
local CastbarEventHandler = function(event, ...) -- unitTarget, castGUID, spellID
|
|
if (event == "UNIT_SPELLCAST_START") then
|
|
return IceCastBar.prototype.SpellCastStart(self, event, ...)
|
|
elseif (event == "UNIT_SPELLCAST_DELAYED") then
|
|
return IceCastBar.prototype.SpellCastDelayed(self, event, ...)
|
|
elseif (event == "UNIT_SPELLCAST_STOP") then
|
|
return IceCastBar.prototype.SpellCastStop(self, event, ...)
|
|
elseif (event == "UNIT_SPELLCAST_FAILED") then
|
|
return IceCastBar.prototype.SpellCastFailed(self, event, ...)
|
|
elseif (event == "UNIT_SPELLCAST_INTERRUPTED") then
|
|
return IceCastBar.prototype.SpellCastInterrupted(self, event, ...)
|
|
elseif (event == "UNIT_SPELLCAST_CHANNEL_START") then
|
|
return IceCastBar.prototype.SpellCastChannelStart(self, event, ...)
|
|
elseif (event == "UNIT_SPELLCAST_CHANNEL_UPDATE") then
|
|
return IceCastBar.prototype.SpellCastChannelUpdate(self, event, ...)
|
|
elseif (event == "UNIT_SPELLCAST_CHANNEL_STOP") then
|
|
return IceCastBar.prototype.SpellCastChannelStop(self, event, ...)
|
|
end
|
|
end
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_START", CastbarEventHandler)
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_DELAYED", CastbarEventHandler) -- only for player
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_STOP", CastbarEventHandler)
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_FAILED", CastbarEventHandler)
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_INTERRUPTED", CastbarEventHandler)
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_CHANNEL_START", CastbarEventHandler)
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_CHANNEL_UPDATE", CastbarEventHandler) -- only for player
|
|
LibClassicCasterino.RegisterCallback(self,"UNIT_SPELLCAST_CHANNEL_STOP", CastbarEventHandler)
|
|
else -- No LibClassicCasterino, or we're not on Classic, so use IceHUD's normal event handlers.
|
|
|
|
self:RegisterEvent("UNIT_SPELLCAST_SENT", "SpellCastSent") -- "player", spell, rank, target
|
|
self:RegisterEvent("CURRENT_SPELL_CAST_CHANGED", "SpellCastChanged")
|
|
self:RegisterEvent("UNIT_SPELLCAST_START", "SpellCastStart") -- unit, spell, rank
|
|
self:RegisterEvent("UNIT_SPELLCAST_STOP", "SpellCastStop") -- unit, spell, rank
|
|
|
|
self:RegisterEvent("UNIT_SPELLCAST_FAILED", "SpellCastFailed") -- unit, spell, rank
|
|
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED", "SpellCastInterrupted") -- unit, spell, rank
|
|
|
|
self:RegisterEvent("UNIT_SPELLCAST_DELAYED", "SpellCastDelayed") -- unit, spell, rank
|
|
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", "SpellCastSucceeded") -- "player", spell, rank
|
|
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START", "SpellCastChannelStart") -- unit, spell, rank
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", "SpellCastChannelUpdate") -- unit, spell, rank
|
|
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", "SpellCastChannelStop") -- unit, spell, rank
|
|
|
|
if GetUnitEmpowerHoldAtMaxTime then
|
|
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_START", "SpellCastChannelStart")
|
|
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_UPDATE", "SpellCastChannelUpdate")
|
|
self:RegisterEvent("UNIT_SPELLCAST_EMPOWER_STOP", "SpellCastChannelStop")
|
|
end
|
|
|
|
end
|
|
self:Show(false)
|
|
end
|
|
|
|
function IceCastBar.prototype:GetDefaultSettings()
|
|
local settings = IceCastBar.super.prototype.GetDefaultSettings(self)
|
|
|
|
settings["showSpellRank"] = true
|
|
settings["showCastTime"] = true
|
|
settings["displayAuraIcon"] = false
|
|
settings["auraIconXOffset"] = 40
|
|
settings["auraIconYOffset"] = 0
|
|
settings["auraIconScale"] = 1
|
|
settings["reverseChannel"] = true
|
|
|
|
return settings
|
|
end
|
|
|
|
function IceCastBar.prototype:GetOptions()
|
|
local opts = IceCastBar.super.prototype.GetOptions(self)
|
|
|
|
opts["showCastTime"] =
|
|
{
|
|
type = 'toggle',
|
|
name = L["Show spell cast time"],
|
|
desc = L["Whether or not to show the remaining cast time of a spell being cast."],
|
|
get = function()
|
|
return self.moduleSettings.showCastTime
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showCastTime = value
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 39.998
|
|
}
|
|
if IceHUD.SpellFunctionsReturnRank then
|
|
opts["showSpellRank"] =
|
|
{
|
|
type = 'toggle',
|
|
name = L["Show spell rank"],
|
|
desc = L["Whether or not to show the rank of a spell being cast."],
|
|
get = function()
|
|
return self.moduleSettings.showSpellRank
|
|
end,
|
|
set = function(info, value)
|
|
self.moduleSettings.showSpellRank = value
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 39.999
|
|
}
|
|
end
|
|
opts["iconSettings"] = {
|
|
type = 'group',
|
|
name = "|c"..self.configColor..L["Icon Settings"].."|r",
|
|
args = {
|
|
displayAuraIcon = {
|
|
type = 'toggle',
|
|
name = L["Display aura icon"],
|
|
desc = L["Whether or not to display an icon for the aura that this bar is tracking"],
|
|
get = function()
|
|
return self.moduleSettings.displayAuraIcon
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.displayAuraIcon = v
|
|
if self.barFrame.icon then
|
|
if v then
|
|
self.barFrame.icon:Show()
|
|
else
|
|
self.barFrame.icon:Hide()
|
|
end
|
|
end
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 51,
|
|
},
|
|
|
|
auraIconXOffset = {
|
|
type = 'range',
|
|
min = -250,
|
|
max = 250,
|
|
step = 1,
|
|
name = L["Aura icon horizontal offset"],
|
|
desc = L["Adjust the horizontal position of the aura icon"],
|
|
get = function()
|
|
return self.moduleSettings.auraIconXOffset
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.auraIconXOffset = v
|
|
self:PositionIcons()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.displayAuraIcon
|
|
end,
|
|
order = 52,
|
|
},
|
|
|
|
auraIconYOffset = {
|
|
type = 'range',
|
|
min = -250,
|
|
max = 250,
|
|
step = 1,
|
|
name = L["Aura icon vertical offset"],
|
|
desc = L["Adjust the vertical position of the aura icon"],
|
|
get = function()
|
|
return self.moduleSettings.auraIconYOffset
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.auraIconYOffset = v
|
|
self:PositionIcons()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.displayAuraIcon
|
|
end,
|
|
order = 53,
|
|
},
|
|
|
|
auraIconScale = {
|
|
type = 'range',
|
|
min = 0.1,
|
|
max = 3.0,
|
|
step = 0.05,
|
|
name = L["Aura icon scale"],
|
|
desc = L["Adjusts the size of the aura icon for this bar"],
|
|
get = function()
|
|
return self.moduleSettings.auraIconScale
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.auraIconScale = v
|
|
self:PositionIcons()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or not self.moduleSettings.displayAuraIcon
|
|
end,
|
|
order = 54,
|
|
},
|
|
},
|
|
}
|
|
|
|
opts["reverseChannel"] = {
|
|
type = 'toggle',
|
|
name = L["Reverse channeling"],
|
|
desc = L["Whether or not to reverse the direction of the cast bar when a spell is being channeled. For example, if a normal cast causes this bar to fill up, then checking this option will cause a channeled spell to empty the bar instead."],
|
|
get = function()
|
|
return self.moduleSettings.reverseChannel
|
|
end,
|
|
set = function(info, v)
|
|
self.moduleSettings.reverseChannel = v
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 32.5,
|
|
}
|
|
|
|
return opts
|
|
end
|
|
|
|
function IceCastBar.prototype:IsFull(scale)
|
|
local retval = IceCastBar.super.prototype.IsFull(self, scale)
|
|
if retval then
|
|
if self.action and self.action ~= IceCastBar.Actions.None then
|
|
return false
|
|
end
|
|
end
|
|
return retval
|
|
end
|
|
|
|
-- 'Protected' methods --------------------------------------------------------
|
|
|
|
-- OVERRIDE
|
|
function IceCastBar.prototype:CreateFrame()
|
|
IceCastBar.super.prototype.CreateFrame(self)
|
|
|
|
self.frame.bottomUpperText:SetWidth(self.settings.gap + 30)
|
|
|
|
if not self.barFrame.icon then
|
|
self.barFrame.icon = self.masterFrame:CreateTexture(nil, "OVERLAY")
|
|
-- default texture so that 'config mode' can work without activating the bar first
|
|
self.barFrame.icon:SetTexture("Interface\\Icons\\Spell_Frost_Frost")
|
|
-- this cuts off the border around the buff icon
|
|
self.barFrame.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
|
|
end
|
|
self:PositionIcons()
|
|
end
|
|
|
|
function IceCastBar.prototype:PositionIcons()
|
|
if not self.barFrame or not self.barFrame.icon then
|
|
return
|
|
end
|
|
|
|
self.barFrame.icon:ClearAllPoints()
|
|
self.barFrame.icon:SetPoint("TOPLEFT", self.frame, "TOPLEFT", self.moduleSettings.auraIconXOffset, self.moduleSettings.auraIconYOffset)
|
|
self.barFrame.icon:SetWidth(AuraIconWidth * self.moduleSettings.auraIconScale)
|
|
self.barFrame.icon:SetHeight(AuraIconHeight * self.moduleSettings.auraIconScale)
|
|
end
|
|
|
|
function IceCastBar.prototype:GetRemainingCastTime()
|
|
return self.actionStartTime + self.actionDuration - GetTime()
|
|
end
|
|
|
|
function IceCastBar.prototype:GetCurrentCastDurationMs()
|
|
return (GetTime() - (self.actionStartTime or GetTime())) * 1000
|
|
end
|
|
|
|
-- OnUpdate handler
|
|
function IceCastBar.prototype:MyOnUpdate()
|
|
-- safety catch
|
|
if (self.action == IceCastBar.Actions.None) then
|
|
--IceHUD:Debug("Stopping action ", self.action)
|
|
self:StopBar()
|
|
return
|
|
end
|
|
|
|
self:Update()
|
|
self:SetTextAlpha()
|
|
|
|
-- handle casting and channeling
|
|
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
|
|
local remainingTime = self:GetRemainingCastTime()
|
|
local scale = 1 - (self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0)
|
|
|
|
if self.action == IceCastBar.Actions.ReverseChannel then
|
|
scale = self.actionDuration ~= 0 and remainingTime / self.actionDuration or 0
|
|
end
|
|
|
|
self:UpdateBar(IceHUD:Clamp(scale, 0, 1), self:GetCurrentCastingColor())
|
|
|
|
if (remainingTime <= 0) then
|
|
self:StopBar()
|
|
end
|
|
|
|
local timeString = self.moduleSettings.showCastTime and string.format("%.1fs ", remainingTime) or ""
|
|
local empowerString = self.NumStages ~= nil and (L["Stage %d"]):format(self:GetCurrentStage()) or ""
|
|
local line1 = timeString .. self.actionMessage
|
|
if self.moduleSettings.empowerStageTextDisplay == "TOPLINE" then
|
|
line1 = line1 .. " " .. empowerString
|
|
end
|
|
if self.moduleSettings.empowerStageTextDisplay == "BOTTOMLINE" then
|
|
self:SetBottomText2(empowerString)
|
|
end
|
|
self:SetBottomText1(line1)
|
|
|
|
return
|
|
end
|
|
|
|
|
|
-- stop bar if casting or channeling is done (in theory this should not be needed)
|
|
if (self.action == IceCastBar.Actions.Cast or self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
|
|
self:StopBar()
|
|
return
|
|
end
|
|
|
|
|
|
-- handle bar flashes
|
|
if (self.action == IceCastBar.Actions.Instant or
|
|
self.action == IceCastBar.Actions.Success or
|
|
self.action == IceCastBar.Actions.Failure)
|
|
then
|
|
local scale = GetTime() - self.actionStartTime
|
|
|
|
if (scale > 1) then
|
|
self:StopBar()
|
|
return
|
|
end
|
|
|
|
self:UpdateBar(1, self:GetCurrentCastingColor())
|
|
|
|
if (self.action == IceCastBar.Actions.Failure) then
|
|
self:FlashBar("CastFail", 1-scale, self.actionMessage, "CastFail")
|
|
else
|
|
self:FlashBar("CastSuccess", 1-scale, self.actionMessage)
|
|
end
|
|
return
|
|
end
|
|
|
|
-- something went wrong
|
|
IceHUD:Debug("OnUpdate error ", self.action, " -- ", self.actionStartTime, self.actionDuration, self.actionMessage)
|
|
self:StopBar()
|
|
end
|
|
|
|
function IceCastBar.prototype:GetStageDuration(stage)
|
|
if not GetUnitEmpowerMinHoldTime then
|
|
return 0
|
|
end
|
|
|
|
if stage == 0 then
|
|
return GetUnitEmpowerMinHoldTime(self.unit)
|
|
end
|
|
|
|
return GetUnitEmpowerStageDuration(self.unit, stage);
|
|
end
|
|
|
|
function IceCastBar.prototype:GetDurationUpToStage(stage)
|
|
if stage == nil or stage < 0 then
|
|
return 0
|
|
end
|
|
|
|
local total = 0
|
|
for i=0,stage-1 do
|
|
total = total + self:GetStageDuration(i)
|
|
end
|
|
|
|
return total
|
|
end
|
|
|
|
function IceCastBar.prototype:GetCurrentStage()
|
|
if not GetUnitEmpowerMinHoldTime then
|
|
return 0
|
|
end
|
|
|
|
local castDuration = self:GetCurrentCastDurationMs()
|
|
for i=1,self.NumStages do
|
|
if castDuration < self:GetDurationUpToStage(i) then
|
|
return i - 1
|
|
end
|
|
end
|
|
|
|
return self.NumStages
|
|
end
|
|
|
|
function IceCastBar.prototype:IsCastingEmpowerSpell()
|
|
return self.NumStages ~= nil
|
|
end
|
|
|
|
function IceCastBar.prototype:GetCurrentCastingColor()
|
|
if self:IsCastingEmpowerSpell() then
|
|
return ("EmpowerStage%d"):format(self:GetCurrentStage())
|
|
end
|
|
|
|
if self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel then
|
|
return "CastChanneling"
|
|
end
|
|
|
|
return "CastCasting"
|
|
end
|
|
|
|
function IceCastBar.prototype:FlashBar(color, alpha, text, textColor)
|
|
self.frame:SetAlpha(alpha)
|
|
|
|
local r, g, b = self.settings.backgroundColor.r, self.settings.backgroundColor.g, self.settings.backgroundColor.b
|
|
if (self.settings.backgroundToggle) then
|
|
r, g, b = self:GetColor(color)
|
|
end
|
|
|
|
self.frame.bg:SetVertexColor(r, g, b, 0.3)
|
|
self.barFrame.bar:SetVertexColor(self:GetColor(color, 0.8))
|
|
|
|
self:SetScale(1)
|
|
self:SetBottomText1(text, textColor or "Text")
|
|
end
|
|
|
|
|
|
function IceCastBar.prototype:StartBar(action, message, spellId)
|
|
local spell, rank, displayName, icon, startTime, endTime, isTradeSkill, numStages
|
|
if IceHUD.SpellFunctionsReturnRank then
|
|
spell, rank, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit)
|
|
else
|
|
spell, displayName, icon, startTime, endTime, isTradeSkill = UnitCastingInfo(self.unit)
|
|
end
|
|
if not (spell) then
|
|
if IceHUD.SpellFunctionsReturnRank then
|
|
spell, rank, displayName, icon, startTime, endTime = UnitChannelInfo(self.unit)
|
|
else
|
|
spell, displayName, icon, startTime, endTime, isTradeSkill, _, _, _, numStages = UnitChannelInfo(self.unit)
|
|
end
|
|
end
|
|
|
|
if spellId and not spell then
|
|
spell, rank, icon = GetSpellInfo(spellId)
|
|
end
|
|
|
|
local isChargeSpell = numStages and numStages > 0
|
|
if isChargeSpell then
|
|
self.NumStages = numStages
|
|
endTime = endTime + GetUnitEmpowerHoldAtMaxTime(self.unit)
|
|
action = IceCastBar.Actions.ReverseChannel
|
|
else
|
|
self.NumStages = nil
|
|
end
|
|
|
|
if self.moduleSettings.reverseChannel then
|
|
if action == IceCastBar.Actions.Channel then
|
|
action = IceCastBar.Actions.ReverseChannel
|
|
elseif action == IceCastBar.Actions.ReverseChannel then
|
|
action = IceCastBar.Actions.Channel
|
|
end
|
|
end
|
|
|
|
-- Fulzamoth 2019-09-27 : LibClassicCasterino won't return spell info on target's failed or interrupted cast
|
|
if LibClassicCasterino and not spell then
|
|
self:StopBar()
|
|
elseif not spell then
|
|
return
|
|
end
|
|
|
|
if icon ~= nil then
|
|
self.barFrame.icon:SetTexture(icon)
|
|
end
|
|
|
|
if IceHUD.IceCore:IsInConfigMode() or self.moduleSettings.displayAuraIcon then
|
|
self.barFrame.icon:Show()
|
|
else
|
|
self.barFrame.icon:Hide()
|
|
end
|
|
|
|
self.action = action
|
|
self.actionStartTime = GetTime()
|
|
self.actionMessage = message
|
|
|
|
if (startTime and endTime) then
|
|
self.actionDuration = (endTime - startTime) / 1000
|
|
|
|
-- set start time here in case we start to monitor a cast that is underway already
|
|
self.actionStartTime = startTime / 1000
|
|
else
|
|
self.actionDuration = 1 -- instants/failures
|
|
end
|
|
|
|
if not (message) and spell then
|
|
self.actionMessage = spell .. (self.moduleSettings.showSpellRank and self:GetShortRank(rank) or "")
|
|
end
|
|
|
|
self:Show(true)
|
|
self:ConditionalSetupUpdate()
|
|
end
|
|
|
|
|
|
function IceCastBar.prototype:StopBar()
|
|
self.action = IceCastBar.Actions.None
|
|
self.actionStartTime = nil
|
|
self.actionDuration = nil
|
|
|
|
self:SetBottomText1()
|
|
self:SetBottomText2()
|
|
self:SetScale(0)
|
|
self:Show(false)
|
|
end
|
|
|
|
function IceCastBar.prototype:GetShortRank(rank)
|
|
if IceHUD.SpellFunctionsReturnRank and rank then
|
|
local _, _, sRank = string.find(rank, "(%d+)")
|
|
if (sRank) then
|
|
return " (" .. sRank .. ")"
|
|
end
|
|
end
|
|
return ""
|
|
end
|
|
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- NORMAL SPELLS --
|
|
-------------------------------------------------------------------------------
|
|
|
|
function IceCastBar.prototype:SpellCastSent(event, unit, target, castGuid, spellId)
|
|
if (unit ~= self.unit) then return end
|
|
IceHUD:Debug("SpellCastSent", unit, target, castGuid, spellId)
|
|
end
|
|
|
|
function IceCastBar.prototype:SpellCastChanged(event, cancelled)
|
|
IceHUD:Debug("SpellCastChanged", cancelled)
|
|
end
|
|
|
|
function IceCastBar.prototype:SpellCastStart(event, unit, castGuid, spellId)
|
|
if (unit ~= self.unit) then return end
|
|
IceHUD:Debug("SpellCastStart", unit, castGuid, spellId)
|
|
--UnitCastingInfo(unit)
|
|
|
|
self:StartBar(IceCastBar.Actions.Cast, nil, spellId)
|
|
self.current = castGuid
|
|
end
|
|
|
|
function IceCastBar.prototype:SpellCastStop(event, unit, castGuid, spellId)
|
|
if (unit ~= self.unit) then return end
|
|
IceHUD:Debug("SpellCastStop", unit, castGuid, spellId)
|
|
|
|
-- ignore if not coming from current spell
|
|
if (self.current and castGuid and self.current ~= castGuid) then
|
|
return
|
|
end
|
|
|
|
if (self.action ~= IceCastBar.Actions.Success and
|
|
self.action ~= IceCastBar.Actions.Failure and
|
|
self.action ~= IceCastBar.Actions.Channel and
|
|
self.action ~= IceCastBar.Actions.ReverseChannel)
|
|
then
|
|
self:StopBar()
|
|
end
|
|
|
|
self.current = nil
|
|
end
|
|
|
|
|
|
function IceCastBar.prototype:SpellCastFailed(event, unit, castGuid, spellId)
|
|
if (unit ~= self.unit) then return end
|
|
IceHUD:Debug("SpellCastFailed", unit, castGuid, spellId)
|
|
|
|
-- ignore if not coming from current spell
|
|
if (self.current and castGuid and self.current ~= castGuid) then
|
|
return
|
|
end
|
|
|
|
-- channeled spells will call ChannelStop, not cast failed
|
|
if self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel then
|
|
return
|
|
end
|
|
|
|
self.current = nil
|
|
|
|
-- determine if we want to show failed casts
|
|
if (self.moduleSettings.flashFailures == "Never") then
|
|
return
|
|
elseif (self.moduleSettings.flashFailures == "Caster") then
|
|
if (UnitPowerType("player") ~= SPELL_POWER_MANA) then
|
|
return
|
|
end
|
|
end
|
|
|
|
self:StartBar(IceCastBar.Actions.Failure, "Failed", nil, spellId)
|
|
end
|
|
|
|
function IceCastBar.prototype:SpellCastInterrupted(event, unit, castGuid, spellId)
|
|
if (unit ~= self.unit) then return end
|
|
IceHUD:Debug("SpellCastInterrupted", unit, castGuid, spellId)
|
|
|
|
-- ignore if not coming from current spell
|
|
if (self.current and castGuid and self.current ~= castGuid) then
|
|
return
|
|
end
|
|
|
|
self.current = nil
|
|
|
|
self:StartBar(IceCastBar.Actions.Failure, "Interrupted", spellId)
|
|
end
|
|
|
|
function IceCastBar.prototype:SpellCastDelayed(event, unit, castGuid, spellId)
|
|
if (unit ~= self.unit) then return end
|
|
--IceHUD:Debug("SpellCastDelayed", unit, UnitCastingInfo(unit))
|
|
|
|
local endTime = select(IceHUD.SpellFunctionsReturnRank and 6 or 5, UnitCastingInfo(self.unit))
|
|
|
|
if (endTime and self.actionStartTime) then
|
|
-- apparently this check is needed, got nils during a horrible lag spike
|
|
self.actionDuration = endTime/1000 - self.actionStartTime
|
|
end
|
|
end
|
|
|
|
|
|
function IceCastBar.prototype:SpellCastSucceeded(event, unit, castGuid, spellId)
|
|
if (unit ~= self.unit) then return end
|
|
--IceHUD:Debug("SpellCastSucceeded", unit, castGuid, spellId)
|
|
|
|
-- never show on channeled (why on earth does this event even fire when channeling starts?)
|
|
if (self.action == IceCastBar.Actions.Channel or self.action == IceCastBar.Actions.ReverseChannel) then
|
|
return
|
|
end
|
|
|
|
-- ignore if not coming from current spell
|
|
if (self.current and self.current ~= castGuid) then
|
|
return
|
|
end
|
|
|
|
local spell = GetSpellInfo(spellId)
|
|
|
|
-- show after normal successfull cast
|
|
if (self.action == IceCastBar.Actions.Cast) then
|
|
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank), spellId)
|
|
return
|
|
end
|
|
|
|
-- determine if we want to show instant casts
|
|
if (self.moduleSettings.flashInstants == "Never") then
|
|
return
|
|
elseif (self.moduleSettings.flashInstants == "Caster") then
|
|
if (UnitPowerType("player") ~= SPELL_POWER_MANA) then
|
|
return
|
|
end
|
|
end
|
|
|
|
self:StartBar(IceCastBar.Actions.Success, spell.. self:GetShortRank(rank), spellId)
|
|
end
|
|
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- CHANNELING SPELLS --
|
|
-------------------------------------------------------------------------------
|
|
|
|
function IceCastBar.prototype:SpellCastChannelStart(event, unit)
|
|
if (unit ~= self.unit) then return end
|
|
--IceHUD:Debug("SpellCastChannelStart", unit)
|
|
|
|
self:StartBar(IceCastBar.Actions.Channel)
|
|
end
|
|
|
|
function IceCastBar.prototype:SpellCastChannelUpdate(event, unit)
|
|
if (unit ~= self.unit or not self.actionStartTime) then return end
|
|
--IceHUD:Debug("SpellCastChannelUpdate", unit, UnitChannelInfo(unit))
|
|
|
|
local spell, rank, displayName, icon, startTime, endTime
|
|
if IceHUD.SpellFunctionsReturnRank then
|
|
spell, rank, displayName, icon, startTime, endTime = UnitChannelInfo(unit)
|
|
else
|
|
spell, displayName, icon, startTime, endTime = UnitChannelInfo(unit)
|
|
end
|
|
if not spell then
|
|
self.actionDuration = 0
|
|
else
|
|
self.actionDuration = endTime/1000 - self.actionStartTime
|
|
end
|
|
end
|
|
|
|
function IceCastBar.prototype:SpellCastChannelStop(event, unit)
|
|
if (unit ~= self.unit) then return end
|
|
--IceHUD:Debug("SpellCastChannelStop", unit)
|
|
|
|
self:StopBar()
|
|
end
|
|
|
|
|
|
|