Files
ice-hud/modules/TargetCast.lua
fulzamoth b40829abbb add TargetCast support in Classic (#8)
This change adds support for using LibCasterCasterino to get your
target's casting info to enable the TargetCast module. It's not as
clean as the newer retail native calls but works well enough for
most interrupts.

Note: because LibCasterCasterino is using combat log events to get
casting info if a spell cast starts and is immediately cancelled or
interrupted the log may not get updated and the cast bar will zombie
complete.

LibCasterCasterino can be found at:

https://github.com/rgd87/LibClassicCasterino
2019-09-28 22:58:39 -05:00

210 lines
5.3 KiB
Lua

local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local TargetCast = IceCore_CreateClass(IceCastBar)
TargetCast.prototype.notInterruptible = false
-- Constructor --
function TargetCast.prototype:init()
TargetCast.super.prototype.init(self, "TargetCast")
self:SetDefaultColor("CastNotInterruptible", 1, 0, 0)
self.unit = "target"
end
function TargetCast.prototype:Enable(core)
TargetCast.super.prototype.Enable(self, core)
if IceHUD.WowVer >= 30200 then
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", "SpellCastInterruptible")
self:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", "SpellCastNotInterruptible")
end
end
function TargetCast.prototype:SpellCastInterruptible(event, unit)
if unit and unit ~= self.unit then
return
end
self.notInterruptible = false
self:UpdateInterruptibleColor()
end
function TargetCast.prototype:SpellCastNotInterruptible(event, unit)
if unit and unit ~= self.unit then
return
end
self.notInterruptible = true
self:UpdateInterruptibleColor()
end
function TargetCast.prototype:UpdateBar(scale, color, alpha)
TargetCast.super.prototype.UpdateBar(self, scale, color, alpha)
self:UpdateInterruptibleColor()
end
function TargetCast.prototype:UpdateInterruptibleColor()
if self.moduleSettings.displayNonInterruptible then
if self.notInterruptible then
self.barFrame.bar:SetVertexColor(self:GetColor("CastNotInterruptible"))
else
self.barFrame.bar:SetVertexColor(self:GetColor(self:GetCurrentCastingColor()))
end
end
end
-- 'Public' methods -----------------------------------------------------------
-- OVERRIDE
function TargetCast.prototype:GetDefaultSettings()
local settings = TargetCast.super.prototype.GetDefaultSettings(self)
settings["side"] = IceCore.Side.Right
settings["offset"] = 3
settings["flashInstants"] = "Never"
-- Fulzamoth 2019-09-27 : let the flash handler work if in Classic and LibClassicCasterino exists
if LibClassicCasterino then
settings["flashFailures"] = ""
else
settings["flashFailures"] = "Never"
end
settings["shouldAnimate"] = false
settings["hideAnimationSettings"] = true
settings["usesDogTagStrings"] = false
settings["displayNonInterruptible"] = true
return settings
end
-- OVERRIDE
function TargetCast.prototype:TargetChanged(unit)
TargetCast.super.prototype.TargetChanged(self, unit)
if not (self.target) then
self:StopBar()
return
end
if UnitCastingInfo then
local spell = UnitCastingInfo(self.unit)
local notInterruptible = select((IceHUD.WowVer < 80000 and not IceHUD.WowClassic) and 9 or 8, UnitCastingInfo(self.unit))
if spell then
self.notInterruptible = notInterruptibleCast
self:StartBar(IceCastBar.Actions.Cast)
return
end
end
if UnitChannelInfo then
local channel = UnitChannelInfo(self.unit)
notInterruptible = select((IceHUD.WowVer < 80000 and not IceHUD.WowClassic) and 8 or 7, UnitChannelInfo(self.unit))
if channel then
self.notInterruptible = notInterruptibleChannel
self:StartBar(IceCastBar.Actions.Channel)
return
end
end
self:StopBar()
end
function TargetCast.prototype:GetOptions()
local opts = TargetCast.super.prototype.GetOptions(self)
opts["barVisible"] = {
type = 'toggle',
name = L["Bar visible"],
desc = L["Toggle bar visibility"],
get = function()
return self.moduleSettings.barVisible['bar']
end,
set = function(info, v)
self.moduleSettings.barVisible['bar'] = v
if v then
self.barFrame:Show()
else
self.barFrame:Hide()
end
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 28
}
opts["bgVisible"] = {
type = 'toggle',
name = L["Bar background visible"],
desc = L["Toggle bar background visibility"],
get = function()
return self.moduleSettings.barVisible['bg']
end,
set = function(info, v)
self.moduleSettings.barVisible['bg'] = v
if v then
self.frame.bg:Show()
else
self.frame.bg:Hide()
end
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 29
}
opts["displayNonInterruptible"] = {
type = 'toggle',
name = L["Display non-interruptible color"],
desc = L["Toggles whether or not to show the CastNonInterruptible color for this bar when a cast is non-interruptible"],
width = 'double',
get = function()
return self.moduleSettings.displayNonInterruptible
end,
set = function(info, v)
self.moduleSettings.displayNonInterruptible = v
self:Redraw()
end,
disabled = function()
return not self.moduleSettings.enabled
end,
order = 30
}
return opts
end
function TargetCast.prototype:StartBar(action, message)
local spell, notInterruptible
if UnitCastingInfo then
spell = UnitCastingInfo(self.unit)
notInterruptible = select(IceHUD.WowVer < 80000 and 9 or 8, UnitCastingInfo(self.unit))
end
if UnitChannelInfo and not spell then
spell = UnitChannelInfo(self.unit)
notInterruptible = select(IceHUD.WowVer < 80000 and 8 or 7, UnitChannelInfo(self.unit))
if not spell then
return
end
end
self.notInterruptible = notInterruptible
TargetCast.super.prototype.StartBar(self, action, message)
end
-------------------------------------------------------------------------------
-- Fulzamoth 2019-09-27 : load in Classic if LibClassicCasterino exists
-- Load us up
if not IceHUD.WowClassic or LibClassicCasterino then
IceHUD.TargetCast = TargetCast:new()
end