Initial Commit
This commit is contained in:
@@ -0,0 +1,230 @@
|
||||
--[[
|
||||
-- Kui_Nameplates
|
||||
-- By Kesava at curse.com
|
||||
-- All rights reserved
|
||||
-- Backported by: Kader at https://github.com/bkader
|
||||
]]
|
||||
local addon = LibStub("AceAddon-3.0"):GetAddon("KuiNameplates")
|
||||
local mod = addon:NewModule("CastWarnings", addon.Prototype, "AceEvent-3.0")
|
||||
local kui = LibStub("Kui-1.0")
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("KuiNameplates")
|
||||
|
||||
mod.uiName = L["Cast warnings"]
|
||||
|
||||
-- combat log events to listen to for cast warnings/healing
|
||||
local warningEvents = {
|
||||
["SPELL_CAST_START"] = true,
|
||||
["SPELL_CAST_SUCCESS"] = true,
|
||||
["SPELL_INTERRUPT"] = true,
|
||||
["SPELL_HEAL"] = true,
|
||||
["SPELL_PERIODIC_HEAL"] = true
|
||||
}
|
||||
|
||||
-- spell school colors
|
||||
local schoolcolors = {
|
||||
[1] = {a = 1.00, r = 1.00, g = 1.00, b = 0.00}, -- Physical
|
||||
[2] = {a = 1.00, r = 1.00, g = 0.90, b = 0.50}, -- Holy
|
||||
[4] = {a = 1.00, r = 1.00, g = 0.50, b = 0.00}, -- Fire
|
||||
[8] = {a = 1.00, r = 0.30, g = 1.00, b = 0.30}, -- Nature
|
||||
[16] = {a = 1.00, r = 0.50, g = 1.00, b = 1.00}, -- Frost
|
||||
[20] = {a = 1.00, r = 0.50, g = 1.00, b = 1.00}, -- Frostfire
|
||||
[32] = {a = 1.00, r = 0.50, g = 0.50, b = 1.00}, -- Shadow
|
||||
[64] = {a = 1.00, r = 1.00, g = 0.50, b = 1.00} -- Arcane
|
||||
}
|
||||
|
||||
-- wrapper for kui.framefade;
|
||||
-- reimplementing previous behaviour from animation groups
|
||||
local function FadeFrame(self, from, to, duration, end_delay, callback)
|
||||
kui.frameFadeRemoveFrame(self)
|
||||
|
||||
self:Show()
|
||||
self:SetAlpha(from)
|
||||
|
||||
kui.frameFade(self, {
|
||||
mode = "OUT",
|
||||
startAlpha = from,
|
||||
endAlpha = to,
|
||||
timeToFade = duration,
|
||||
fadeHoldTime = end_delay,
|
||||
finishedFunc = function(self)
|
||||
if to == 0 then
|
||||
self:Hide()
|
||||
else
|
||||
self:SetAlpha(to)
|
||||
end
|
||||
|
||||
if callback then
|
||||
callback(self)
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
------------------------------------------------------------- Frame functions --
|
||||
local function SetCastWarning(self, spellName, spellSchool)
|
||||
self.castWarning:Stop()
|
||||
|
||||
if spellName == nil then
|
||||
-- hide the warning instantly
|
||||
self.castWarning:SetText()
|
||||
self.castWarning:Hide()
|
||||
else
|
||||
local col = schoolcolors[spellSchool] or {r = 1, g = 1, b = 1}
|
||||
|
||||
self.castWarning:SetText(spellName)
|
||||
self.castWarning:SetTextColor(col.r, col.g, col.b)
|
||||
self.castWarning:Fade()
|
||||
end
|
||||
end
|
||||
|
||||
local function SetIncomingWarning(self, amount)
|
||||
if amount == 0 then
|
||||
return
|
||||
end
|
||||
self.incWarning:Stop()
|
||||
|
||||
if amount > 0 then
|
||||
-- healing
|
||||
amount = "+" .. amount
|
||||
self.incWarning:SetTextColor(0, 1, 0)
|
||||
else
|
||||
-- damage (nyi)
|
||||
self.incWarning:SetTextColor(1, 0, 0)
|
||||
end
|
||||
|
||||
self.incWarning:SetText(amount)
|
||||
self.incWarning:Fade()
|
||||
end
|
||||
|
||||
-------------------------------------------------------------- Event handlers --
|
||||
function mod:COMBAT_LOG_EVENT_UNFILTERED(_, castTime, event, guid, name, _, targetGUID, targetName, _, _, spellName, spellSchool, amount)
|
||||
if not (guid and targetGUID) then
|
||||
return
|
||||
end
|
||||
|
||||
if warningEvents[event] then
|
||||
if event == "SPELL_HEAL" or event == "SPELL_PERIODIC_HEAL" then
|
||||
-- fetch the spell's target's nameplate
|
||||
guid, name = targetGUID, targetName
|
||||
end
|
||||
|
||||
if self.db.profile.useNames and name then
|
||||
name = name and name:gsub("%-.+$", "") -- remove realm names
|
||||
else
|
||||
name = nil
|
||||
end
|
||||
|
||||
local f = addon:GetNameplate(guid, name)
|
||||
if f then
|
||||
if not f.castWarning or f.trivial then
|
||||
return
|
||||
end
|
||||
if event == "SPELL_HEAL" or event == "SPELL_PERIODIC_HEAL" then
|
||||
-- display heal warning
|
||||
f:SetIncomingWarning(amount)
|
||||
elseif event == "SPELL_INTERRUPT" then
|
||||
-- hide the warning
|
||||
f:SetCastWarning(nil)
|
||||
else
|
||||
-- or display it for this spell
|
||||
f:SetCastWarning(spellName, spellSchool)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------- Create --
|
||||
function mod:CreateCastWarnings(msg, frame)
|
||||
-- casting spell name
|
||||
frame.castWarning = frame:CreateFontString(frame.overlay, {size = "spellName", outline = "OUTLINE"})
|
||||
frame.castWarning:Hide()
|
||||
frame.castWarning:SetPoint("BOTTOM", frame.name, "TOP", 0, 1)
|
||||
|
||||
frame.castWarning.Fade = function(self)
|
||||
FadeFrame(self, 1, 0, 3)
|
||||
end
|
||||
frame.castWarning.Stop = function(self)
|
||||
kui.frameFadeRemoveFrame(self)
|
||||
end
|
||||
|
||||
-- incoming healing
|
||||
frame.incWarning = frame:CreateFontString(frame.overlay, {size = "small", outline = "OUTLINE"})
|
||||
frame.incWarning:Hide()
|
||||
frame.incWarning:SetPoint("TOP", frame.name, "BOTTOM", 0, -3)
|
||||
|
||||
frame.incWarning.Fade = function(self, full)
|
||||
if full then
|
||||
FadeFrame(self, 0.5, 0, 0.5)
|
||||
else
|
||||
FadeFrame(self, 1, 0.5, 0.5, 0.5, function(self) self:Fade(true) end)
|
||||
end
|
||||
end
|
||||
frame.incWarning.Stop = function(self)
|
||||
kui.frameFadeRemoveFrame(self)
|
||||
end
|
||||
|
||||
-- handlers
|
||||
frame.SetCastWarning = SetCastWarning
|
||||
frame.SetIncomingWarning = SetIncomingWarning
|
||||
end
|
||||
|
||||
function mod:Hide(msg, frame)
|
||||
if frame.castWarning then
|
||||
frame.castWarning:Stop()
|
||||
frame.castWarning:SetText()
|
||||
frame.castWarning:Hide()
|
||||
|
||||
frame.incWarning:Stop()
|
||||
frame.incWarning:SetText()
|
||||
frame.incWarning:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------- Post db change functions --
|
||||
mod:AddConfigChanged("warnings", function(v) mod:Toggle(v) end)
|
||||
-------------------------------------------------------------------- Register --
|
||||
function mod:GetOptions()
|
||||
return {
|
||||
warnings = {
|
||||
type = "toggle",
|
||||
name = L["Show cast warnings"],
|
||||
desc = L["Display cast and healing warnings on plates"],
|
||||
order = 1,
|
||||
disabled = false
|
||||
},
|
||||
useNames = {
|
||||
type = "toggle",
|
||||
name = L["Use names for warnings"],
|
||||
desc = L["Use character names to decide which frame to display warnings on. May increase memory usage and may cause warnings to be displayed on incorrect frames when there are many units with the same name. Reccommended on for PvP, off for PvE."],
|
||||
order = 2
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
function mod:OnInitialize()
|
||||
self.db = addon.db:RegisterNamespace(self.moduleName, {profile = {warnings = false, useNames = false}})
|
||||
|
||||
addon:InitModuleOptions(self)
|
||||
mod:SetEnabledState(self.db.profile.warnings)
|
||||
end
|
||||
|
||||
function mod:OnEnable()
|
||||
self:RegisterMessage("KuiNameplates_PostCreate", "CreateCastWarnings")
|
||||
self:RegisterMessage("KuiNameplates_PostHide", "Hide")
|
||||
|
||||
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
||||
|
||||
for _, frame in pairs(addon.frameList) do
|
||||
if not frame.castWarning then
|
||||
self:CreateCastWarnings(nil, frame.kui)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mod:OnDisable()
|
||||
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
||||
|
||||
for _, frame in pairs(addon.frameList) do
|
||||
self:Hide(nil, frame.kui)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user