432 lines
12 KiB
Lua
432 lines
12 KiB
Lua
--[[
|
|
-- Kui_Nameplates
|
|
-- By Kesava at curse.com
|
|
-- All rights reserved
|
|
-- Backported by: Kader at github.com/bkader
|
|
]]
|
|
local kui = LibStub("Kui-1.0")
|
|
local addon = LibStub("AceAddon-3.0"):GetAddon("KuiNameplates")
|
|
local mod = addon:NewModule("Castbar", addon.Prototype, "AceEvent-3.0")
|
|
local L = LibStub("AceLocale-3.0"):GetLocale("KuiNameplates")
|
|
|
|
mod.uiName = L["Cast bars"]
|
|
|
|
local format = format
|
|
local function ResetFade(f)
|
|
if not f or not f.castbar then
|
|
return
|
|
end
|
|
|
|
kui.frameFadeRemoveFrame(f.castbar)
|
|
f.castbar.shield:Hide()
|
|
f.castbar:Hide()
|
|
f.castbar:SetAlpha(1)
|
|
end
|
|
|
|
local sizes = {}
|
|
|
|
local function SetCVars()
|
|
-- force these to true as the module hides them anyway
|
|
SetCVar("showVKeyCastbar", 1)
|
|
end
|
|
------------------------------------------------------------- Script handlers --
|
|
local function OnDefaultCastbarShow(self)
|
|
if not mod.enabledState then
|
|
return
|
|
end
|
|
|
|
local f = self:GetParent().kui
|
|
ResetFade(f)
|
|
|
|
if mod:FrameIsIgnored(f) then
|
|
return
|
|
end
|
|
|
|
if f.castbar.name and f.castbar.spellName then
|
|
f.castbar.name:SetText(f.castbar.spellName)
|
|
end
|
|
|
|
-- is cast uninterruptible?
|
|
if f.shield:IsShown() then
|
|
f.castbar.bar:SetStatusBarColor(unpack(mod.db.profile.display.shieldbarcolour))
|
|
f.castbar.shield:Show()
|
|
else
|
|
f.castbar.bar:SetStatusBarColor(unpack(mod.db.profile.display.barcolour))
|
|
f.castbar.shield:Hide()
|
|
end
|
|
|
|
if f.trivial then
|
|
-- hide text & icon
|
|
if f.castbar.icon or f.castbar.curr then
|
|
f.castbar.curr:Hide()
|
|
end
|
|
else
|
|
if f.castbar.icon then
|
|
f.castbar.icon.tex:SetTexture(f.spell:GetTexture())
|
|
f.castbar.icon:Show()
|
|
end
|
|
|
|
if f.castbar.curr then
|
|
f.castbar.curr:Show()
|
|
end
|
|
end
|
|
-- castbar is shown on first update
|
|
end
|
|
local function OnDefaultCastbarHide(self)
|
|
local f = self:GetParent().kui
|
|
if f.castbar:IsShown() then
|
|
kui.frameFade(
|
|
f.castbar,
|
|
{
|
|
mode = "OUT",
|
|
timeToFade = .5,
|
|
startAlpha = 1,
|
|
endAlpha = 0,
|
|
finishedFunc = function()
|
|
ResetFade(f)
|
|
end
|
|
}
|
|
)
|
|
|
|
if f.castbar.name then
|
|
f.castbar.spellName = nil
|
|
f.castbar.name:SetText("")
|
|
end
|
|
|
|
if f.castbar.icon then
|
|
f.castbar.icon.tex:SetTexture(nil)
|
|
end
|
|
end
|
|
end
|
|
local function OnDefaultCastbarUpdate(self, elapsed)
|
|
if not mod.enabledState then
|
|
return
|
|
end
|
|
|
|
local f = self:GetParent().kui
|
|
|
|
if mod:FrameIsIgnored(f) then
|
|
return
|
|
end
|
|
|
|
local min, max = self:GetMinMaxValues()
|
|
|
|
if f.castbar.curr then
|
|
f.castbar.curr:SetText(format("%.1f", self:GetValue()))
|
|
end
|
|
|
|
if f.castbar.name and f.castbar.spellName then
|
|
f.castbar.name:SetText(f.castbar.spellName)
|
|
end
|
|
|
|
f.castbar.bar:SetMinMaxValues(min, max)
|
|
f.castbar.bar:SetValue(self:GetValue())
|
|
|
|
if f.shield:IsShown() then
|
|
f.castbar.bar:SetStatusBarColor(unpack(mod.db.profile.display.shieldbarcolour))
|
|
f.castbar.shield:Show()
|
|
else
|
|
f.castbar.bar:SetStatusBarColor(unpack(mod.db.profile.display.barcolour))
|
|
f.castbar.shield:Hide()
|
|
end
|
|
|
|
if f.trivial then
|
|
-- hide text & icon
|
|
if f.castbar.icon or f.castbar.curr then
|
|
f.castbar.curr:Hide()
|
|
end
|
|
else
|
|
if f.castbar.icon then
|
|
f.castbar.icon.tex:SetTexture(f.spell:GetTexture())
|
|
f.castbar.icon:Show()
|
|
end
|
|
|
|
if f.castbar.curr then
|
|
f.castbar.curr:Show()
|
|
end
|
|
end
|
|
|
|
f.castbar:Show()
|
|
end
|
|
local function OnDefaultCastbarEvent(self, event, unit, spellName, spellRank)
|
|
if event == "UNIT_SPELLCAST_START" or event == "UNIT_SPELLCAST_CHANNEL_START" then
|
|
local frame = addon:GetUnitPlate(unit)
|
|
if frame and frame.castbar then
|
|
frame.castbar.spellName = spellName
|
|
end
|
|
end
|
|
end
|
|
---------------------------------------------------------------------- create --
|
|
-- update castbar height and icon size
|
|
local function UpdateCastbar(frame)
|
|
if not frame.castbar then
|
|
return
|
|
end
|
|
|
|
if frame.castbar.bg then
|
|
frame.castbar.bg:SetHeight(sizes.cbheight)
|
|
end
|
|
|
|
if frame.castbar.icon then
|
|
frame.castbar.icon.bg:SetSize(sizes.icon, sizes.icon)
|
|
end
|
|
end
|
|
function mod:CreateCastbar(frame)
|
|
if frame.castbar then
|
|
return
|
|
end
|
|
-- container ---------------------------------------------------------------
|
|
frame.castbar = CreateFrame("Frame", nil, frame)
|
|
frame.castbar:SetFrameLevel(1)
|
|
frame.castbar:Hide()
|
|
|
|
-- background --------------------------------------------------------------
|
|
frame.castbar.bg = frame.castbar:CreateTexture(nil, "ARTWORK", nil, 1)
|
|
frame.castbar.bg:SetTexture(kui.m.t.solid)
|
|
frame.castbar.bg:SetVertexColor(0, 0, 0, 0.8)
|
|
|
|
frame.castbar.bg:SetPoint("TOPLEFT", frame.bg.fill, "BOTTOMLEFT", 0, -1)
|
|
frame.castbar.bg:SetPoint("TOPRIGHT", frame.bg.fill, "BOTTOMRIGHT", 0, 0)
|
|
|
|
-- cast bar ------------------------------------------------------------
|
|
frame.castbar.bar = CreateFrame("StatusBar", nil, frame.castbar)
|
|
frame.castbar.bar:SetStatusBarTexture(addon.bartexture)
|
|
frame.castbar.bar:GetStatusBarTexture():SetDrawLayer("ARTWORK", 2)
|
|
|
|
frame.castbar.bar:SetPoint("TOPLEFT", frame.castbar.bg, "TOPLEFT", 1, -1)
|
|
frame.castbar.bar:SetPoint("BOTTOMLEFT", frame.castbar.bg, "BOTTOMLEFT", 1, 1)
|
|
frame.castbar.bar:SetPoint("RIGHT", frame.castbar.bg, "RIGHT", -1, 0)
|
|
|
|
frame.castbar.bar:SetMinMaxValues(0, 1)
|
|
|
|
-- spark
|
|
frame.castbar.spark = frame.castbar.bar:CreateTexture(nil, "ARTWORK")
|
|
frame.castbar.spark:SetDrawLayer("ARTWORK", 6)
|
|
frame.castbar.spark:SetVertexColor(1, 1, 0.8)
|
|
frame.castbar.spark:SetTexture("Interface\\AddOns\\Kui_Nameplates\\Media\\t\\spark")
|
|
frame.castbar.spark:SetPoint("TOP", frame.castbar.bar:GetRegions(), "TOPRIGHT", 0, 3)
|
|
frame.castbar.spark:SetPoint("BOTTOM", frame.castbar.bar:GetRegions(), "BOTTOMRIGHT", 0, -3)
|
|
frame.castbar.spark:SetWidth(6)
|
|
|
|
-- uninterruptible cast shield -----------------------------------------
|
|
frame.castbar.shield = frame.castbar.bar:CreateTexture(nil, "ARTWORK")
|
|
frame.castbar.shield:SetTexture("Interface\\AddOns\\Kui_Nameplates\\Media\\Shield")
|
|
frame.castbar.shield:SetTexCoord(0, 0.84375, 0, 1)
|
|
frame.castbar.shield:SetVertexColor(0.5, 0.5, 0.7)
|
|
|
|
frame.castbar.shield:SetSize(sizes.shield * .84375, sizes.shield)
|
|
frame.castbar.shield:SetPoint("LEFT", frame.castbar.bg, -7, 0)
|
|
|
|
frame.castbar.shield:SetBlendMode("BLEND")
|
|
frame.castbar.shield:SetDrawLayer("ARTWORK", 7)
|
|
|
|
frame.castbar.shield:Hide()
|
|
|
|
-- cast bar text -------------------------------------------------------
|
|
if self.db.profile.display.spellname then
|
|
frame.castbar.name = frame:CreateFontString(frame.castbar.bar, {size = "small"})
|
|
frame.castbar.name:SetPoint("TOP", frame.castbar.bar, "BOTTOM", 0, -3)
|
|
end
|
|
|
|
if self.db.profile.display.casttime then
|
|
frame.castbar.curr = frame:CreateFontString(frame.castbar.bar, {size = "small"})
|
|
frame.castbar.curr:SetPoint("LEFT", frame.castbar.bg, "RIGHT", 2, 0)
|
|
end
|
|
|
|
if self.db.profile.display.spellicon then
|
|
frame.castbar.icon = CreateFrame("Frame", nil, frame.castbar)
|
|
|
|
frame.castbar.icon.bg = frame.castbar:CreateTexture(nil, "BACKGROUND")
|
|
frame.castbar.icon.bg:SetTexture(kui.m.t.solid)
|
|
frame.castbar.icon.bg:SetVertexColor(0, 0, 0, 0)
|
|
frame.castbar.icon.bg:SetPoint("TOPRIGHT", frame.health, "TOPLEFT", -2, 1)
|
|
|
|
frame.castbar.icon.tex = frame.castbar:CreateTexture(nil, "ARTWORK")
|
|
frame.castbar.icon.tex:SetPoint("TOPLEFT", frame.castbar.icon.bg, "TOPLEFT", 1, -1)
|
|
frame.castbar.icon.tex:SetPoint("BOTTOMRIGHT", frame.castbar.icon.bg, "BOTTOMRIGHT", -1, 1)
|
|
end
|
|
|
|
UpdateCastbar(frame)
|
|
|
|
-- scripts -------------------------------------------------------------
|
|
frame.oldCastbar:HookScript("OnShow", OnDefaultCastbarShow)
|
|
frame.oldCastbar:HookScript("OnHide", OnDefaultCastbarHide)
|
|
frame.oldCastbar:HookScript("OnUpdate", OnDefaultCastbarUpdate)
|
|
frame.castbar:RegisterEvent("UNIT_SPELLCAST_START")
|
|
frame.castbar:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
|
|
frame.castbar:SetScript("OnEvent", OnDefaultCastbarEvent)
|
|
|
|
if frame.oldCastbar:IsVisible() then
|
|
OnDefaultCastbarShow(frame.oldCastbar)
|
|
end
|
|
end
|
|
------------------------------------------------------------------------ Hide --
|
|
function mod:HideCastbar(frame)
|
|
ResetFade(frame)
|
|
end
|
|
------------------------------------------------------------------- Functions --
|
|
function mod:FrameIsIgnored(frame)
|
|
return frame.castbar_ignore_frame or (frame.friend and not self.db.profile.onfriendly)
|
|
end
|
|
function mod:IgnoreFrame(frame)
|
|
frame.castbar_ignore_frame = (frame.castbar_ignore_frame and frame.castbar_ignore_frame + 1 or 1)
|
|
|
|
if frame.castbar and frame.castbar:IsShown() then
|
|
ResetFade(frame)
|
|
end
|
|
end
|
|
function mod:UnignoreFrame(frame)
|
|
frame.castbar_ignore_frame = (frame.castbar_ignore_frame and frame.castbar_ignore_frame - 1 or nil)
|
|
if frame.castbar_ignore_frame and frame.castbar_ignore_frame <= 0 then
|
|
frame.castbar_ignore_frame = nil
|
|
end
|
|
end
|
|
---------------------------------------------------- Post db change functions --
|
|
mod:AddConfigChanged(
|
|
"enabled",
|
|
function(v)
|
|
mod:Toggle(v)
|
|
end
|
|
)
|
|
mod:AddConfigChanged(
|
|
{"display", "shieldbarcolour"},
|
|
nil,
|
|
function(f, v)
|
|
f.castbar.shield:SetVertexColor(unpack(v))
|
|
end
|
|
)
|
|
mod:AddConfigChanged(
|
|
{"display", "cbheight"},
|
|
function()
|
|
sizes.cbheight = mod.db.profile.display.cbheight
|
|
sizes.icon = addon.db.profile.general.hheight + sizes.cbheight + 1
|
|
end,
|
|
UpdateCastbar
|
|
)
|
|
mod:AddGlobalConfigChanged("addon", {"general", "hheight"}, mod.configChangedFuncs.display.cbheight.ro, UpdateCastbar)
|
|
-------------------------------------------------------------------- Register --
|
|
function mod:GetOptions()
|
|
return {
|
|
enabled = {
|
|
type = "toggle",
|
|
name = L["Enable cast bar"],
|
|
desc = L["Show cast bars (at all)"],
|
|
order = 0,
|
|
disabled = false
|
|
},
|
|
onfriendly = {
|
|
type = "toggle",
|
|
name = L["Show friendly cast bars"],
|
|
desc = L["Show cast bars on friendly nameplates"],
|
|
order = 10,
|
|
disabled = function()
|
|
return not self.db.profile.enabled
|
|
end
|
|
},
|
|
display = {
|
|
type = "group",
|
|
name = L["Display"],
|
|
inline = true,
|
|
order = 20,
|
|
disabled = function()
|
|
return not self.db.profile.enabled
|
|
end,
|
|
args = {
|
|
casttime = {
|
|
type = "toggle",
|
|
name = L["Show cast time"],
|
|
desc = L["Show cast time and time remaining"],
|
|
order = 20
|
|
},
|
|
spellname = {
|
|
type = "toggle",
|
|
name = L["Show spell name"],
|
|
order = 15
|
|
},
|
|
spellicon = {
|
|
type = "toggle",
|
|
name = L["Show spell icon"],
|
|
order = 10
|
|
},
|
|
barcolour = {
|
|
type = "color",
|
|
name = L["Bar colour"],
|
|
desc = L["The colour of the cast bar during interruptible casts"],
|
|
order = 0
|
|
},
|
|
shieldbarcolour = {
|
|
type = "color",
|
|
name = L["Uninterruptible colour"],
|
|
desc = L["The colour of the cast bar and shield during UNinterruptible casts."],
|
|
order = 5
|
|
},
|
|
cbheight = {
|
|
type = "range",
|
|
name = L["Height"],
|
|
desc = L["The height of castbars on nameplates. Also affects the size of the spell icon."],
|
|
order = 25,
|
|
step = 1,
|
|
min = 3,
|
|
softMax = 20,
|
|
max = 100
|
|
}
|
|
}
|
|
}
|
|
}
|
|
end
|
|
function mod:OnInitialize()
|
|
self.db =
|
|
addon.db:RegisterNamespace(
|
|
self.moduleName,
|
|
{
|
|
profile = {
|
|
enabled = true,
|
|
onfriendly = true,
|
|
display = {
|
|
casttime = false,
|
|
spellname = true,
|
|
spellicon = true,
|
|
cbheight = 5,
|
|
barcolour = {.43, 0.47, 0.55, 1},
|
|
shieldbarcolour = {.8, 0.1, 0.1, 1}
|
|
}
|
|
}
|
|
}
|
|
)
|
|
|
|
addon:InitModuleOptions(self)
|
|
self:SetEnabledState(self.db.profile.enabled)
|
|
|
|
sizes = {cbheight = self.db.profile.display.cbheight, shield = 16}
|
|
|
|
self.configChangedFuncs.display.cbheight.ro(sizes.cbheight)
|
|
|
|
-- handle default interface cvars & checkboxes
|
|
InterfaceOptionsCombatPanel:HookScript(
|
|
"OnShow",
|
|
function()
|
|
InterfaceOptionsCombatPanelEnemyCastBarsOnNameplates:SetChecked(true)
|
|
InterfaceOptionsCombatPanelEnemyCastBarsOnNameplates:Disable()
|
|
end
|
|
)
|
|
InterfaceOptionsFrame:HookScript(
|
|
"OnHide",
|
|
function()
|
|
SetCVars()
|
|
end
|
|
)
|
|
|
|
SetCVars()
|
|
end
|
|
function mod:OnEnable()
|
|
for _, frame in pairs(addon.frameList) do
|
|
if not frame.kui or not frame.kui.castbar then
|
|
self:CreateCastbar(frame.kui)
|
|
end
|
|
end
|
|
end
|
|
function mod:OnDisable()
|
|
for _, frame in pairs(addon.frameList) do
|
|
self:HideCastbar(frame.kui)
|
|
end
|
|
end |