DX_Tweaks/modules/movementtracker/MovementTracker.lua

92 lines
2.9 KiB
Lua

local _, DX = ...
local LSM = LibStub("LibSharedMedia-3.0")
local moduleName = "MovementTracker"
local moduleDesc = "Tracks different movement cooldowns like Blink, Shimmer or Shift"
local moduleTicker
local movementCooldowns = {
Blink = 1953,
Shimmer = 212653,
Shift = 123
}
local movementConfig = {
[movementCooldowns.Blink] = {
text = "No Blink: "
},
[movementCooldowns.Shimmer] = {
text = "No Shimmer: "
},
[movementCooldowns.Shift] = {
text = "No Shift: "
}
}
local function LoadMovementTracker()
local eventFrame = CreateFrame("Frame")
-- Create the frame
local trackerFrame = CreateFrame("Frame", "DX_MovementTracker", UIParent)
trackerFrame:SetSize(400, 50)
trackerFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 18)
trackerFrame:SetFrameStrata("LOW")
trackerFrame:Show()
local trackerText = trackerFrame:CreateFontString(nil, "OVERLAY")
local trackerFont = LSM:Fetch("font", "DX Narrow")
trackerText:SetFont(trackerFont, 20, "OUTLINE")
trackerText:SetPoint("CENTER")
trackerText:SetJustifyH("CENTER")
trackerText:SetTextColor(1, 1, 1, 1)
-- Returns the spellId of the learned movement cooldown
local function getRelevantSpellId()
if C_SpellBook.IsSpellKnown(movementCooldowns.Shimmer) then
return movementCooldowns.Shimmer
elseif C_SpellBook.IsSpellKnown(movementCooldowns.Blink) then
return movementCooldowns.Blink
elseif C_SpellBook.IsSpellKnown(movementCooldowns.Shift) then
return movementCooldowns.Shift
else
-- No spell known
return -1
end
end
-- Applies the cooldown to the TextFrame and hide/shows it accordingly
local function applyCooldownText()
local spellId = getRelevantSpellId()
local config = movementConfig[spellId]
local durationObject = C_Spell.GetSpellCooldownDuration(spellId)
local cooldown = durationObject:GetRemainingDuration(1)
-- Ignore spell if only on GCD or not on cooldown
if (C_Spell.GetSpellCooldown(spellId).isOnGCD ~= false) or (not cooldown) or (cooldown == 0) then
trackerFrame:Hide()
if moduleTicker then
moduleTicker:Cancel()
end
return
end
trackerFrame:Show()
trackerText:SetText(string.format("%s%.1f", config.text, cooldown))
end
function eventFrame:SPELL_UPDATE_COOLDOWN()
if getRelevantSpellId() == -1 then
return
end
if moduleTicker then
moduleTicker:Cancel()
end
moduleTicker = C_Timer.NewTicker(0.1, applyCooldownText)
end
eventFrame:SetScript("OnEvent", function(self, event, ...) return self[event](self, ...) end)
eventFrame:RegisterEvent("SPELL_UPDATE_COOLDOWN")
end
DX:AddModule(moduleName, moduleDesc, LoadMovementTracker)