totempulse

This commit is contained in:
Sumsebrum 2022-03-03 23:38:28 +01:00
parent 907c64a864
commit b14406f75f

View File

@ -1,57 +1,120 @@
local select, pairs, tremove, tinsert, format, strsplit, tonumber = select, pairs, tremove, tinsert, format, strsplit, tonumber
local C_NamePlate = C_NamePlate
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local tremove, tinsert = tremove, tinsert
local GetSpellInfo, CreateFrame = GetSpellInfo, CreateFrame
local GetTime, GetPlayerInfoByGUID, UnitIsEnemy, UnitGUID = GetTime, GetPlayerInfoByGUID, UnitIsEnemy, UnitGUID
local GetTime, UnitIsEnemy, UnitGUID = GetTime, UnitIsEnemy, UnitGUID
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
local cooldowns = {
[2484] = 3, --Earthbind
[8143] = 4, -- Tremor
[8166] = 4, -- Poison Cleansing
[8170] = 4, -- Disease Cleansing
[1535] = { cd = 4, once = true }, -- Fire Nova 1
[8498] = { cd = 4, once = true }, -- Fire Nova 2
[8499] = { cd = 4, once = true }, -- Fire Nova 3
[11314] = { cd = 4, once = true }, -- Fire Nova 4
[11315] = { cd = 4, once = true }, -- Fire Nova 5
[25546] = { cd = 4, once = true }, -- Fire Nova 6
[25547] = { cd = 4, once = true }, -- Fire Nova 7
[8190] = 2, -- Magma 1
[10585] = 2, -- Magma 2
[10586] = 2, -- Magma 3
[10587] = 2, -- Magma 4
[25552] = 2, -- Magma 5
[5394] = 2, -- Healing Stream 1
[6375] = 2, -- Healing Stream 2
[6377] = 2, -- Healing Stream 3
[10462] = 2, -- Healing Stream 4
[10463] = 2, -- Healing Stream 5
[25567] = 2, -- Healing Stream 6
[5675] = 2, -- Mana Spring 1
[10495] = 2, -- Mana Spring 2
[10496] = 2, -- Mana Spring 3
[10497] = 2, -- Mana Spring 4
[25570] = 2, -- Mana Spring 5
}
---------------------------------------------------
-- Helper
---------------------------------------------------
local totemData, npcIdToTotemData, cooldowns = Gladdy:GetTotemData()
local ninetyDegreeInRad = 90 * math.pi / 180
local function TotemOptions()
local defaultDB = {}
local options = {}
local indexedList = {}
for k,v in pairs(totemData) do
if v.pulse then
tinsert(indexedList, {name = k, id = v.id, color = v.color, texture = v.texture})
end
end
table.sort(indexedList, function (a, b)
return a.name < b.name
end)
for i=1,#indexedList do
defaultDB["totem" .. indexedList[i].id] = {enabled = true, attachToGladdyTotemFrame = true, style = "COOLDOWN", reverse = false}
options["totem" .. indexedList[i].id] = {
order = i+1,
name = select(1, GetSpellInfo(indexedList[i].id)),
--inline = true,
width = "3.0",
type = "group",
icon = indexedList[i].texture,
args = {
headerTotemConfig = {
type = "header",
name = format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))),
order = 1,
},
enabled = {
order = 2,
name = L["Enabled"],
desc = "Enable " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))),
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled = value
Gladdy:UpdateFrame()
end
},
attachToGladdyTotemFrame = {
order = 3,
disabled = function() return not Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled end,
name = L["Attach To TotemPlate"],
desc = "Attach " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))) .. " To TotemPlate",
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].attachToGladdyTotemFrame end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].attachToGladdyTotemFrame = value
Gladdy:UpdateFrame()
end
},
style = {
type = "select",
name = L["Style"],
order = 4,
values = {
COOLDOWN = L["Cooldown"],
Vertical = L["Bar vertical"],
Horizontal = L["Bar horizontal"]
},
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].style end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].style = value
Gladdy:UpdateFrame()
end
},
reverse = {
order = 5,
disabled = function() return not Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].enabled end,
name = L["Reverse"],
type = "toggle",
width = "full",
get = function() return Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].reverse end,
set = function(_, value)
Gladdy.dbi.profile.totemPulseTotems["totem" .. indexedList[i].id].reverse = value
Gladdy:UpdateFrame()
end
},
}
}
end
return options,defaultDB
end
---------------------------------------------------
-- Core
---------------------------------------------------
local TotemPulse = Gladdy:NewModule("Totem Pulse", nil, {
local TotemPulse = Gladdy:NewModule("Totem Pulse", 1, {
totemPulseEnabled = true,
totemPulseEnabledShowFriendly = true,
totemPulseEnabledShowEnemy = true,
totemPulseAttachToTotemPlate = true,
totemPulseStyle = "", -- "COOLDOWN", "COOLDOWNREVERSE", "BARVERTICAL", "BARHORIZONTAL"
totemPulseTextColor = { r = 1, g = 1, b = 1, a = 0 },
--text
totemPulseTextColor = { r = 1, g = 1, b = 1, a = 1 },
totemPulseTextSize = 14,
totemPulseTextFont = "DorisPP",
--bar
totemPulseBarWidth = 40,
totemPulseBarHeight = 20,
@ -60,9 +123,15 @@ local TotemPulse = Gladdy:NewModule("Totem Pulse", nil, {
totemPulseBarBorderColor = { r = 0, g = 0, b = 0, a = 1 },
totemPulseBarBorderSize = 5,
totemPulseBarBorderStyle = "Gladdy Tooltip squared",
totemPulseBarTexture = "Smooth",
totemPulseBarTexture = "Flat",
totemPulseBarReverse = false,
--cooldown
totemPulseCooldownWidth = 40,
totemPulseCooldownHeight = 20,
totemPulseCooldownAlpha = 1,
totemPulseCooldownReverse = true,
--totems
totemPulseTotems = select(2, TotemOptions())
})
function TotemPulse.OnEvent(self, event, ...)
@ -70,16 +139,18 @@ function TotemPulse.OnEvent(self, event, ...)
end
function TotemPulse:Initialize()
self.cooldowns = cooldowns
self.timeStamps = {}
self.cooldownCache = {}
self.barCache = {}
self.activeFrames = { bars = {}, cooldowns = {} }
self:SetScript("OnEvent", self.OnEvent)
if Gladdy.db.totemPulseEnabled then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", self.OnEvent)
end
self:RegisterEvent("PLAYER_ENTERING_WORLD")
end
---------------------------------------------------
@ -88,23 +159,46 @@ end
---------------------------------------------------
function TotemPulse:COMBAT_LOG_EVENT_UNFILTERED()
local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName,spellSchool,extraSpellId,extraSpellName,extraSpellSchool = CombatLogGetCurrentEventInfo()
print(eventType, spellName, spellID, destGUID)
if eventType == "SPELL_SUMMON" then
if cooldowns[spellID] then
print(eventType, spellName, spellID, GetPlayerInfoByGUID(sourceGUID))
self.timeStamps[destGUID] = { timeStamp = GetTime(), spellID = spellID }
function TotemPulse:PLAYER_ENTERING_WORLD()
self.timeStamps = {}
end
elseif eventType == "UNIT_DESTROYED" then
function TotemPulse:COMBAT_LOG_EVENT_UNFILTERED()
local _,eventType,_,sourceGUID,_,_,_,destGUID,_,_,_,spellID,spellName = CombatLogGetCurrentEventInfo()
local pulse = cooldowns[spellID] or cooldowns[spellName]
local npcId = tonumber(select(6, strsplit("-", destGUID)), 10)
if eventType == "UNIT_DESTROYED" and self.timeStamps[destGUID] then
self.timeStamps[destGUID] = nil
end
if (eventType == "SWING_DAMAGE" or eventType == "SPELL_DAMAGE") and self.timeStamps[destGUID] and npcIdToTotemData[npcId] then
self.timeStamps[destGUID] = nil
end
if not pulse then
return
end
if eventType == "SPELL_CAST_SUCCESS" then
self.timeStamps[sourceGUID] = { timeStamp = GetTime(), pulse = pulse }
end
if eventType == "SPELL_SUMMON" then
if not npcIdToTotemData[npcId] then
return
end
if not Gladdy.dbi.profile.totemPulseTotems["totem" .. npcIdToTotemData[npcId].id].enabled then
return
end
if self.timeStamps[sourceGUID] then
self.timeStamps[destGUID] = self.timeStamps[sourceGUID]
self.timeStamps[destGUID].id = npcIdToTotemData[npcId].id
self.timeStamps[sourceGUID] = nil
else
self.timeStamps[destGUID] = { timeStamp = GetTime(), pulse = pulse, id = npcIdToTotemData[npcId].id }
end
end
end
function TotemPulse:NAME_PLATE_UNIT_REMOVED(unitId)
local nameplate = C_NamePlate.GetNamePlateForUnit(unitId)
if nameplate.totemTick then
print("NAME_PLATE_UNIT_REMOVED", nameplate.totemTick)
nameplate.totemTick:SetScript("OnUpdate", nil)
nameplate.totemTick:Hide()
nameplate.totemTick:SetParent(nil)
@ -123,16 +217,18 @@ function TotemPulse:UNIT_NAME_UPDATE(unitId)
self:OnUnitAdded(unitId, "UNIT_NAME_UPDATE")
end
function TotemPulse:OnUnitAdded(unitId, event)
function TotemPulse:OnUnitAdded(unitId)
local isEnemy = UnitIsEnemy("player", unitId)
local guid = UnitGUID(unitId)
if strsplit("-", guid) ~= "Creature" then
return
end
local nameplate = C_NamePlate.GetNamePlateForUnit(unitId)
if nameplate then
print(event, self.timeStamps[guid], nameplate.totemTick)
if self.timeStamps[guid] then
self:AddTimerFrame(nameplate, self.timeStamps[guid], Gladdy.db.totemPulseAttachToTotemPlate and nameplate.gladdyTotemFrame)
if nameplate and (isEnemy and Gladdy.db.totemPulseEnabledShowEnemy or not isEnemy and Gladdy.db.totemPulseEnabledShowFriendly) then
if self.timeStamps[guid] and strsplit("-", guid) then
self:AddTimerFrame(nameplate, self.timeStamps[guid])
else
if nameplate.totemTick then
nameplate.totemTick:SetScript("OnUpdate", nil)
@ -153,35 +249,41 @@ end
---------------------------------------------------
function TotemPulse:CreateCooldownFrame(gladdyTotemFrame)
function TotemPulse:CreateCooldownFrame(style)
local totemTick
if gladdyTotemFrame then
if style == "COOLDOWN" then
if #self.cooldownCache > 0 then
totemTick = tremove(self.cooldownCache, #self.cooldownCache)
else
Gladdy:Print("TotemPulse:CreateCooldownFrame()", "CreateCooldown")
totemTick = CreateFrame("Cooldown", nil, nil, "CooldownFrameTemplate")
totemTick.noCooldownCount = true
totemTick = CreateFrame("Frame")
totemTick:SetWidth(Gladdy.db.totemPulseCooldownWidth)
totemTick:SetHeight(Gladdy.db.totemPulseCooldownHeight)
totemTick.cd = CreateFrame("Cooldown", nil, totemTick, "CooldownFrameTemplate")
totemTick.cd:SetAllPoints(totemTick)
totemTick.cd.noCooldownCount = true
totemTick:SetFrameStrata("MEDIUM")
totemTick:SetFrameLevel(4)
totemTick:SetReverse(true)
totemTick:SetHideCountdownNumbers(true)
totemTick:SetAlpha(Gladdy.db.totemPulseCooldownAlpha)
totemTick.cd:SetReverse(Gladdy.db.totemPulseCooldownReverse)
totemTick.cd:SetHideCountdownNumbers(true)
totemTick.cd:SetAlpha(Gladdy.db.totemPulseCooldownAlpha)
totemTick.text = totemTick:CreateFontString(nil, "OVERLAY")
totemTick.text:SetPoint("LEFT", totemTick, "LEFT", 4, 0)
totemTick.text:SetFont("Fonts\\FRIZQT__.TTF", 16, "OUTLINE")
totemTick.text:SetJustifyH("LEFT")
totemTick.textFrame = CreateFrame("Frame", nil, totemTick)
totemTick.textFrame:SetAllPoints(totemTick)
totemTick.text = totemTick.textFrame:CreateFontString(nil, "OVERLAY")
totemTick.text:SetPoint("CENTER", totemTick.textFrame, "CENTER")
totemTick.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
totemTick.text:SetJustifyH("CENTER")
totemTick.text:SetShadowOffset(1, -1)
totemTick.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
end
else
if #self.barCache > 0 then
Gladdy:Print("TotemPulse:CreateCooldownFrame()", #self.barCache)
totemTick = tremove(self.barCache, #self.barCache)
totemTick.bar:SetOrientation(style)
totemTick.spark:SetRotation(style == "Vertical" and ninetyDegreeInRad or 0)
totemTick.spark:SetHeight(style == "Vertical" and Gladdy.db.totemPulseBarWidth or Gladdy.db.totemPulseBarHeight)
else
Gladdy:Print("TotemPulse:CreateCooldownFrame()", "CreateBar")
totemTick = CreateFrame("Frame", nil)
totemTick:SetWidth(Gladdy.db.totemPulseBarWidth)
@ -193,24 +295,21 @@ function TotemPulse:CreateCooldownFrame(gladdyTotemFrame)
edgeSize = Gladdy.db.totemPulseBarBorderSize })
totemTick.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBorderColor))
totemTick.backdrop:SetFrameLevel(1)
--totemTick.backdrop:SetFrameStrata(Gladdy.db.castBarFrameStrata)
--totemTick.backdrop:SetFrameLevel(Gladdy.db.castBarFrameLevel - 1)
totemTick.bar = CreateFrame("StatusBar", nil, totemTick)
totemTick.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
totemTick.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.totemPulseBarColor))
totemTick.bar:SetOrientation("Vertical")
totemTick.bar:SetOrientation(style)
totemTick.bar:SetFrameLevel(0)
totemTick.bar:SetPoint("TOPLEFT", totemTick, "TOPLEFT", (Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset))
totemTick.bar:SetPoint("BOTTOMRIGHT", totemTick, "BOTTOMRIGHT", -(Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset))
totemTick.bar:SetAllPoints(totemTick)
totemTick.spark = totemTick.bar:CreateTexture(nil, "OVERLAY")
totemTick.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
totemTick.spark:SetBlendMode("ADD")
totemTick.spark:SetWidth(8)
totemTick.spark:SetHeight(40)
totemTick.spark:SetHeight(style == "Vertical" and Gladdy.db.totemPulseBarWidth or Gladdy.db.totemPulseBarHeight)
totemTick.spark.position = 0
totemTick.spark:SetRotation(ninetyDegreeInRad)
totemTick.spark:SetRotation(style == "Vertical" and ninetyDegreeInRad or 0)
totemTick.bg = totemTick.bar:CreateTexture(nil, "BACKGROUND")
totemTick.bg:SetTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
@ -218,9 +317,9 @@ function TotemPulse:CreateCooldownFrame(gladdyTotemFrame)
totemTick.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBgColor))
totemTick.text = totemTick.bar:CreateFontString(nil, "OVERLAY")
totemTick.text:SetPoint("LEFT", totemTick, "LEFT", 4, 0)
totemTick.text:SetFont("Fonts\\FRIZQT__.TTF", 16, "OUTLINE")
totemTick.text:SetJustifyH("LEFT")
totemTick.text:SetPoint("CENTER", totemTick, "CENTER", 0, 0)
totemTick.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
totemTick.text:SetJustifyH("CENTER")
totemTick.text:SetShadowOffset(1, -1)
totemTick.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
end
@ -228,64 +327,52 @@ function TotemPulse:CreateCooldownFrame(gladdyTotemFrame)
return totemTick
end
function TotemPulse:AddTimerFrame(nameplate, timestamp, gladdyTotemFrame)
if nameplate:IsShown() and cooldowns[timestamp.spellID] then
function TotemPulse:AddTimerFrame(nameplate, timestamp, test)
if (nameplate:IsShown() or test) and timestamp then
local gladdyTotemFrame = Gladdy.db.totemPulseTotems["totem" .. timestamp.id].attachToGladdyTotemFrame and nameplate.gladdyTotemFrame
if not nameplate.totemTick then
nameplate.totemTick = TotemPulse:CreateCooldownFrame(gladdyTotemFrame)
nameplate.totemTick = TotemPulse:CreateCooldownFrame(Gladdy.db.totemPulseTotems["totem" .. timestamp.id].style)
end
nameplate.totemTick:SetParent(nameplate)
nameplate.totemTick:ClearAllPoints()
if gladdyTotemFrame then
nameplate.totemTick:SetParent(nameplate.gladdyTotemFrame or nameplate)
--nameplate.totemTick:ClearAllPoints()
--[[if gladdyTotemFrame then
nameplate.totemTick:SetPoint("TOPLEFT", gladdyTotemFrame, "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
nameplate.totemTick:SetPoint("BOTTOMRIGHT", gladdyTotemFrame, "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
else
nameplate.totemTick:SetPoint("TOP", nameplate, "BOTTOM")
if nameplate.totemTick.bar then
nameplate.totemTick.spark:SetHeight(Gladdy.db.totemPulseTotems["totem" .. timestamp.id].style == "Vertical" and gladdyTotemFrame:GetWidth() or gladdyTotemFrame:GetHeight())
end
else
nameplate.totemTick:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", 0, -5)
if nameplate.totemTick.bar then
nameplate.totemTick.spark:SetHeight(Gladdy.db.totemPulseTotems["totem" .. timestamp.id].style == "Vertical" and Gladdy.db.totemPulseBarWidth or Gladdy.db.totemPulseBarHeight)
end
end--]]
local cd = type(cooldowns[timestamp.spellID]) == "table" and cooldowns[timestamp.spellID].cd or cooldowns[timestamp.spellID]
local once = type(cooldowns[timestamp.spellID]) == "table"
local cd = type(timestamp.pulse) == "table" and timestamp.pulse.cd or timestamp.pulse
local once = type(timestamp.pulse) == "table"
local cooldown = (timestamp.timeStamp - GetTime()) % cd
if not gladdyTotemFrame then
nameplate.totemTick.bar:SetMinMaxValues(0, cd)
nameplate.totemTick.bar:SetValue(cooldown)
self.activeFrames.bars[nameplate.totemTick] = nameplate.totemTick
else
self.activeFrames.cooldowns[nameplate.totemTick] = nameplate.totemTick
end
nameplate.totemTick.timestamp = timestamp.timeStamp
nameplate.totemTick.maxValue = cd
nameplate.totemTick.value = cooldown
nameplate.totemTick.once = once
nameplate.totemTick.id = timestamp.id
if nameplate.totemTick.bar then
self:UpdateBarPartial(nameplate.totemTick)
nameplate.totemTick.bar:SetMinMaxValues(0, cd)
nameplate.totemTick.bar:SetValue(cooldown)
self.activeFrames.bars[nameplate.totemTick] = nameplate.totemTick
else
self:UpdateCooldown(nameplate.totemTick)
self.activeFrames.cooldowns[nameplate.totemTick] = nameplate.totemTick
end
print("once", once, " - totemTick.once", nameplate.totemTick.once, " - cd off", math.abs(timestamp.timeStamp - GetTime()) > cd)
if once and GetTime() - timestamp.timeStamp > cd then
nameplate.totemTick:SetScript("OnUpdate", nil)
nameplate.totemTick:Hide()
print("nameplate.totemTick:Hide()")
else
nameplate.totemTick:SetScript("OnUpdate", function(totemTick, elapsed)
totemTick.now = GetTime()
totemTick.value = (totemTick.timestamp - totemTick.now) % totemTick.maxValue
if totemTick.once and totemTick.now - totemTick.timestamp >= totemTick.maxValue then
totemTick:SetScript("OnUpdate", nil)
print("OnUpdate totemTick:Hide()")
totemTick:Hide()
end
if not totemTick.bar and not (totemTick.once and totemTick.now - totemTick.timestamp >= totemTick.maxValue) then
totemTick:SetCooldown(totemTick.now - totemTick.value, totemTick.maxValue)
elseif totemTick.bar then
totemTick.spark.position = (totemTick.value / totemTick.maxValue) * totemTick.bar:GetHeight()
if ( totemTick.spark.position < 0 ) then
totemTick.spark.position = 0
end
totemTick.spark:SetPoint("CENTER", totemTick.bar, "BOTTOM", 0, totemTick.spark.position)
totemTick.bar:SetValue(totemTick.value)
end
totemTick.text:SetFormattedText("%.1f", totemTick.value)
end)
print("nameplate.totemTick:Show()")
nameplate.totemTick:SetScript("OnUpdate", TotemPulse.TotemPulseOnUpdate)
nameplate.totemTick:Show()
end
else
@ -301,39 +388,175 @@ function TotemPulse:AddTimerFrame(nameplate, timestamp, gladdyTotemFrame)
end
end
function TotemPulse:UpdateBar(bar)
function TotemPulse:SetSparkPosition(totemTick, referenceSize, vertical)
if not Gladdy.db.totemPulseTotems["totem" .. totemTick.id].reverse then
totemTick.bar:SetValue(totemTick.maxValue - totemTick.value)
totemTick.spark.position = referenceSize / 2 - (totemTick.value / totemTick.maxValue) * referenceSize
if ( totemTick.spark.position < -referenceSize / 2 ) then
totemTick.spark.position = -referenceSize / 2
end
else
totemTick.bar:SetValue(totemTick.value)
totemTick.spark.position = referenceSize / 2 - ((totemTick.maxValue - totemTick.value) / totemTick.maxValue) * referenceSize
if ( totemTick.spark.position > referenceSize / 2 ) then
totemTick.spark.position = referenceSize / 2
end
end
totemTick.spark:SetPoint("CENTER", totemTick.bar, "CENTER", vertical and 0 or totemTick.spark.position, vertical and totemTick.spark.position or 0)
end
function TotemPulse.TotemPulseOnUpdate(totemTick)
totemTick.now = GetTime()
totemTick.value = (totemTick.timestamp - totemTick.now) % totemTick.maxValue
if totemTick.once and totemTick.now - totemTick.timestamp >= totemTick.maxValue then
totemTick:SetScript("OnUpdate", nil)
totemTick:Hide()
end
if not totemTick.bar and not (totemTick.once and totemTick.now - totemTick.timestamp >= totemTick.maxValue) then
if Gladdy.db.totemPulseTotems["totem" .. totemTick.id].reverse then
totemTick.cd:SetCooldown(totemTick.now - totemTick.value, totemTick.maxValue)
else
totemTick.cd:SetCooldown(totemTick.now - (totemTick.maxValue - totemTick.value), totemTick.maxValue)
end
elseif totemTick.bar then
if Gladdy.db.totemPulseTotems["totem" .. totemTick.id].style == "Vertical" then
TotemPulse:SetSparkPosition(totemTick, totemTick.bar:GetHeight(), true)
else
TotemPulse:SetSparkPosition(totemTick, totemTick.bar:GetWidth(), false)
end
end
totemTick.text:SetFormattedText("%.1f", totemTick.value)
end
---------------------------------------------------
-- Update Styles
---------------------------------------------------
function TotemPulse:UpdateBarPartial(bar)
local style = bar.id and Gladdy.db.totemPulseTotems["totem" .. bar.id].style
bar:SetWidth(Gladdy.db.totemPulseBarWidth)
bar:SetHeight(Gladdy.db.totemPulseBarHeight)
bar.spark:SetWidth(8)
bar.spark:SetHeight(style == "Vertical" and Gladdy.db.totemPulseBarWidth or Gladdy.db.totemPulseBarHeight)
bar.spark:SetRotation(style == "Vertical" and ninetyDegreeInRad or 0)
if (bar:GetParent()) then
if bar:GetParent().gladdyTotemFrame then
bar:SetParent(bar:GetParent().gladdyTotemFrame)
else
bar:SetParent(bar:GetParent())
end
--[[if bar.id and Gladdy.db.totemPulseTotems["totem" .. bar.id].attachToGladdyTotemFrame then
if not bar:GetParent().totemIcon and bar:GetParent().gladdyTotemFrame then
bar:SetParent(bar:GetParent().gladdyTotemFrame)
end
elseif bar.id and not Gladdy.db.totemPulseTotems["totem" .. bar.id].attachToGladdyTotemFrame then
if bar:GetParent().totemIcon then
bar:SetParent(bar:GetParent():GetParent())
end
end--]]
bar:ClearAllPoints()
if (bar.id and bar:GetParent().totemIcon and Gladdy.db.totemPulseTotems["totem" .. bar.id].attachToGladdyTotemFrame) then
bar:SetPoint("TOPLEFT", bar:GetParent(), "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
bar:SetPoint("BOTTOMRIGHT", bar:GetParent(), "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
if style then
bar.spark:SetHeight(style == "Vertical" and bar:GetParent():GetWidth() or bar:GetParent():GetHeight())
end
else
bar:SetPoint("TOP", bar:GetParent(), "BOTTOM", 0, 0)
end
end
bar.bar:SetOrientation(style ~= "COOLDOWN" and style or bar.bar:GetOrientation())
end
function TotemPulse:UpdateBar(bar)
self:UpdateBarPartial(bar)
bar.backdrop:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "totemPulseBarBorderStyle"),
edgeSize = Gladdy.db.totemPulseBarBorderSize })
bar.backdrop:SetBackdropBorderColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBorderColor))
bar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
bar.bar:SetStatusBarColor(Gladdy:SetColor(Gladdy.db.totemPulseBarColor))
bar.bar:SetOrientation("Vertical")
bar.bar:SetPoint("TOPLEFT", bar, "TOPLEFT", (Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset))
bar.bar:SetPoint("BOTTOMRIGHT", bar, "BOTTOMRIGHT", -(Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.totemPulseBarBorderSize/Gladdy.db.statusbarBorderOffset))
bar.spark:SetWidth(8)
bar.spark:SetHeight(40)
bar.spark:SetRotation(ninetyDegreeInRad)
bar.bar:SetAllPoints(bar)
bar.bg:SetTexture(Gladdy:SMFetch("statusbar", "totemPulseBarTexture"))
bar.bg:SetVertexColor(Gladdy:SetColor(Gladdy.db.totemPulseBarBgColor))
bar.text:SetFont("Fonts\\FRIZQT__.TTF", 16, "OUTLINE")
bar.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
bar.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
end
function TotemPulse:UpdateCooldown(cooldown)
cooldown:SetReverse(true)
cooldown:SetAlpha(Gladdy.db.totemPulseCooldownAlpha)
cooldown.text:SetFont("Fonts\\FRIZQT__.TTF", 16, "OUTLINE")
cooldown:SetWidth(Gladdy.db.totemPulseCooldownWidth)
cooldown:SetHeight(Gladdy.db.totemPulseCooldownHeight)
if cooldown:GetParent() then
--[[if cooldown.id and Gladdy.db.totemPulseTotems["totem" .. cooldown.id].attachToGladdyTotemFrame then
if not cooldown:GetParent().totemIcon and cooldown:GetParent().gladdyTotemFrame then
cooldown:SetParent(cooldown:GetParent().gladdyTotemFrame)
end
elseif cooldown.id and not Gladdy.db.totemPulseTotems["totem" .. cooldown.id].attachToGladdyTotemFrame then
if cooldown:GetParent().totemIcon then
cooldown:SetParent(cooldown:GetParent():GetParent())
end
end--]]
if cooldown:GetParent().gladdyTotemFrame then
cooldown:SetParent(cooldown:GetParent().gladdyTotemFrame)
else
cooldown:SetParent(cooldown:GetParent())
end
cooldown:ClearAllPoints()
if cooldown.id and Gladdy.db.totemPulseTotems["totem" .. cooldown.id].attachToGladdyTotemFrame and cooldown:GetParent().totemIcon then
cooldown:SetPoint("TOPLEFT", cooldown:GetParent(), "TOPLEFT", Gladdy.db.npTotemPlatesSize/16, -Gladdy.db.npTotemPlatesSize/16)
cooldown:SetPoint("BOTTOMRIGHT", cooldown:GetParent(), "BOTTOMRIGHT", -Gladdy.db.npTotemPlatesSize/16, Gladdy.db.npTotemPlatesSize/16)
else
cooldown:SetPoint("TOP", cooldown:GetParent(), "BOTTOM", 0, -0.5)
end
end
cooldown.cd:SetCooldown(0,0)
cooldown.cd:SetReverse(Gladdy.db.totemPulseCooldownReverse)
cooldown.cd:SetAlpha(Gladdy.db.totemPulseCooldownAlpha)
cooldown.text:SetFont(Gladdy:SMFetch("font", "totemPulseTextFont"), Gladdy.db.totemPulseTextSize, "OUTLINE")
cooldown.text:SetTextColor(Gladdy:SetColor(Gladdy.db.totemPulseTextColor))
end
function TotemPulse:UpdateFrameOnce()
if Gladdy.frame.testing then
TotemPulse:TestOnce()
end
if Gladdy.db.totemPulseEnabled then
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
self:RegisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", self.OnEvent)
else
for _,bar in pairs(self.activeFrames.bars) do
bar:SetScript("OnUpdate", nil)
bar:Hide()
bar:SetParent(nil)
tinsert(self.barCache, bar)
self.activeFrames.bars[bar] = nil
end
for _,cooldown in pairs(self.activeFrames.cooldowns) do
cooldown:SetScript("OnUpdate", nil)
cooldown:Hide()
cooldown:SetParent(nil)
tinsert(self.cooldownCache, cooldown)
self.activeFrames.cooldowns[cooldown] = nil
end
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
self:UnregisterEvent("NAME_PLATE_UNIT_REMOVED")
self:UnregisterEvent("NAME_PLATE_UNIT_ADDED")
self:UnregisterEvent("UNIT_NAME_UPDATE")
self:SetScript("OnEvent", nil)
end
for _,bar in pairs(self.activeFrames.bars) do
self:UpdateBar(bar)
end
@ -354,6 +577,40 @@ end
---------------------------------------------------
function TotemPulse:TestOnce()
local totemPlatesTestFrame = Gladdy.modules["Totem Plates"].testFrame
if totemPlatesTestFrame then
if totemPlatesTestFrame.totemTick
and (Gladdy.db.totemPulseTotems["totem" .. npcIdToTotemData[5913].id].style == "COOLDOWN" and totemPlatesTestFrame.totemTick.bar
or Gladdy.db.totemPulseTotems["totem" .. npcIdToTotemData[5913].id].style ~= "COOLDOWN" and not totemPlatesTestFrame.totemTick.bar) then
totemPlatesTestFrame.totemTick:SetScript("OnUpdate", nil)
totemPlatesTestFrame.totemTick:Hide()
totemPlatesTestFrame.totemTick:SetParent(nil)
totemPlatesTestFrame.totemTick.id = nil
tinsert(totemPlatesTestFrame.totemTick.bar and self.barCache or self.cooldownCache, totemPlatesTestFrame.totemTick)
self.activeFrames.bars[totemPlatesTestFrame.totemTick] = nil
self.activeFrames.cooldowns[totemPlatesTestFrame.totemTick] = nil
totemPlatesTestFrame.totemTick = nil
end
local timestamp = { timeStamp = GetTime(), pulse = npcIdToTotemData[5913].pulse, id = npcIdToTotemData[5913].id }
TotemPulse:AddTimerFrame(totemPlatesTestFrame, timestamp, true)
self.testFrame = totemPlatesTestFrame.totemTick
end
end
function TotemPulse:Reset()
if self.testFrame then
self.testFrame:SetScript("OnUpdate", nil)
self.testFrame:Hide()
self.testFrame:SetParent(nil)
tinsert(self.testFrame.bar and self.barCache or self.cooldownCache, self.testFrame)
self.activeFrames.bars[self.testFrame] = nil
self.activeFrames.cooldowns[self.testFrame] = nil
self.testFrame = nil
Gladdy.modules["Totem Plates"].testFrame.totemTick = nil
end
end
---------------------------------------------------
@ -373,32 +630,28 @@ function TotemPulse:GetOptions()
name = L["Totem Pulse Enabled"],
order = 3,
}),
totemPulseAttachToTotemPlate = Gladdy:option({
type = "toggle",
name = L["Attach to Totem Plates"],
order = 4,
}),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 4,
disabled = function() return not Gladdy.db.totemPulseEnabled end,
args = {
barFrame = {
type = "group",
name = L["Bar"],
order = 1,
order = 2,
args = {
headerSize = {
type = "header",
name = L["Bar Size"],
order = 1,
name = L["Size"],
order = 10,
},
totemPulseBarHeight = Gladdy:option({
type = "range",
name = L["Bar height"],
desc = L["Height of the bar"],
order = 3,
order = 11,
min = 0.1,
max = 200,
step = .1,
@ -407,8 +660,8 @@ function TotemPulse:GetOptions()
totemPulseBarWidth = Gladdy:option({
type = "range",
name = L["Bar width"],
desc = L["Width of the bars"],
order = 4,
desc = L["Width of the bar"],
order = 12,
min = 0.1,
max = 600,
step = .1,
@ -417,13 +670,13 @@ function TotemPulse:GetOptions()
headerTexture = {
type = "header",
name = L["Texture"],
order = 5,
order = 20,
},
totemPulseBarTexture = Gladdy:option({
type = "select",
name = L["Bar texture"],
desc = L["Texture of the bar"],
order = 9,
order = 21,
dialogControl = "LSM30_Statusbar",
values = AceGUIWidgetLSMlists.statusbar,
}),
@ -431,25 +684,25 @@ function TotemPulse:GetOptions()
type = "color",
name = L["Bar color"],
desc = L["Color of the cast bar"],
order = 10,
order = 22,
hasAlpha = true,
}),
totemPulseBarBgColor = Gladdy:colorOption({
type = "color",
name = L["Background color"],
desc = L["Color of the cast bar background"],
order = 11,
order = 23,
hasAlpha = true,
}),
headerBorder = {
type = "header",
name = L["Border"],
order = 12,
order = 30,
},
totemPulseBarBorderSize = Gladdy:option({
type = "range",
name = L["Border size"],
order = 13,
order = 31,
min = 0.5,
max = Gladdy.db.castBarHeight/2,
step = 0.5,
@ -458,19 +711,103 @@ function TotemPulse:GetOptions()
totemPulseBarBorderStyle = Gladdy:option({
type = "select",
name = L["Status Bar border"],
order = 51,
order = 32,
dialogControl = "LSM30_Border",
values = AceGUIWidgetLSMlists.border,
}),
totemPulseBarBorderColor = Gladdy:colorOption({
type = "color",
name = L["Status Bar border color"],
order = 52,
order = 33,
hasAlpha = true,
}),
},
},
cooldownFrame = {
type = "group",
name = L["Cooldown"],
order = 3,
args = {
headerSize = {
type = "header",
name = L["Frame"],
order = 10,
},
totemPulseCooldownHeight = Gladdy:option({
type = "range",
name = L["Height"],
order = 11,
min = 0.1,
max = 200,
step = .1,
width = "full",
}),
totemPulseCooldownWidth = Gladdy:option({
type = "range",
name = L["Width"],
order = 12,
min = 0.1,
max = 600,
step = .1,
width = "full",
}),
totemPulseCooldownAlpha = Gladdy:option({
type = "range",
name = L["Alpha"],
order = 21,
min = 0.1,
max = 1,
step = .1,
width = "full",
}),
},
},
text = {
type = "group",
name = L["Text"],
order = 4,
args = {
headerSize = {
type = "header",
name = L["Text"],
order = 10,
},
totemPulseTextSize = Gladdy:option({
type = "range",
name = L["Size"],
order = 11,
min = 0.5,
max = 30,
step = 0.5,
width = "full",
}),
totemPulseTextFont = Gladdy:option({
type = "select",
name = L["Font"],
desc = L["Font of the bar"],
order = 12,
dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font,
}),
totemPulseTextColor = Gladdy:colorOption({
type = "color",
name = L["Font color"],
desc = L["Color of the text"],
order = 13,
hasAlpha = true,
}),
},
},
},
},
customizeTotems = {
order = 50,
name = L["Customize Totems"],
type = "group",
childGroups = "tree",
disabled = function() return not Gladdy.db.totemPulseEnabled end,
args = select(1, TotemOptions())
},
}
end