Files
coa-details/frames/window_cdtracker.lua
T
Tercio Jose 1830359943 General Fixes, Backend Improvements, Library Updates.
Release Documentation:
- Classic now uses the same combat log reader as retail (Flamanis).
- Merged Rage of Fyr'alath spells (equara).
- Added Rogue Ambushes to merged spells (WillowGryph).
- The Remove Common Segments option now also removes segments trash between raid bosses.
- Fixed an issue where auras applied before combat start, such as Power Infusion and Prescience, which are counted towards the target, were not being accounted for.
- Added to Combat Class: classCombat:GetRunTimeNoDefault(). This returns the run time of the Mythic+ if available, nil otherwise.

Technical Notes:
- Classic now uses retail parser.
- Combat class now have the member: classCombat:GetRunTimeNoDefault(); Returns the run time of a M+ (after completed).
- The Utility class's buff scan at the start of combat has been improved, and the code has been cleaned. Also, the scan runs now on the next frame after combat start.
- Augmentation Evoker won't track auras from the combat start aura scan, if the player isn't in combat (example: a player in the group enters in combat).
- Remove tier bonus for Augmentation Evoker Ebon Might damage prediction and nerfed Close as Cluthmates to 10%.
- Segments Container's ResetDataByCombatType() now supports multiple combat types per classification.
- Code cleanup on Segments menu code to use the new Mythic+ functions added to Combat class.
- Mythic+ start detection produced errors if a WORLD_STATE_TIMER_START event triggered before the CHALLENGE_MODE_START event.
- Mythic+ finish code was bugging when 'time' returned by C_ChallengeMode.GetCompletionInfo() wasn't being checked again nil value.
- Rogue's Ambush ability and Rage of Fyr'alath spellIds added to override_spellId within the parser.
- Details! Framework updated.
- Open Raid Library updated.
2023-12-14 11:33:30 -03:00

801 lines
35 KiB
Lua

local Details = _G.Details
local DF = _G.DetailsFramework
local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0", true)
local addonName, Details222 = ...
--a cooldownFrame is the frame which holds cooldownLines
--cooldownFrame has a key where the value is a table with all cooldownLines created for the frame. The key is called "bars"
--namespace
Details222.CooldownTracking = {
--a cooldown panel is a frame that shows the cooldowns of a specific filter type
--this table store all frames created to show cooldowns
--frames are created for filter types (example: all cooldowns, only player cooldowns, only raid cooldowns, etc)
--the key on the table is the filter name and the value is the frame object
cooldownPanels = {},
}
--return a hash table with all cooldown panels created
function Details222.CooldownTracking.GetAllCooldownFrames()
return Details222.CooldownTracking.cooldownPanels
end
--return a hash table with all cooldown panels created
function Details222.CooldownTracking.GetCooldownFrame(filterName)
return Details222.CooldownTracking.cooldownPanels[filterName]
end
--hide all bars created
function Details222.CooldownTracking.HideAllBars(filterName)
local allCooldownFrames = Details222.CooldownTracking.GetAllCooldownFrames()
local cooldownFrame = allCooldownFrames[filterName]
for _, cooldownLine in ipairs(cooldownFrame.bars) do
cooldownLine:ClearAllPoints()
cooldownLine:Hide()
cooldownLine.cooldownInfo = nil
cooldownLine.spellId = nil
cooldownLine.class = nil
cooldownLine.unitName = nil
end
end
function Details222.CooldownTracking.HideAllLines(cooldownFrame)
for _, cooldownLine in ipairs(cooldownFrame.bars) do
cooldownLine:ClearAllPoints()
cooldownLine:Hide()
cooldownLine.cooldownInfo = nil
cooldownLine.spellId = nil
cooldownLine.class = nil
cooldownLine.unitName = nil
end
end
--get or create a cooldownLine
function Details222.CooldownTracking.GetOrCreateNewCooldownLine(cooldownFrame, lineId)
local cooldownLine = cooldownFrame.bars[lineId]
if (cooldownLine) then
return cooldownLine
else
cooldownLine = DF:CreateTimeBar(cooldownFrame, [[Interface\AddOns\Details\images\bar_serenity]], Details.ocd_tracker.width-2, Details.ocd_tracker.height-2, 100, nil, cooldownFrame:GetName() .. "CDFrame" .. lineId)
table.insert(cooldownFrame.bars, cooldownLine)
cooldownLine:EnableMouse(false)
return cooldownLine
end
end
--return truen if the cooldown tracker is enabled
function Details222.CooldownTracking.IsEnabled()
return Details.ocd_tracker.enabled
end
--enable the cooldown tracker
function Details222.CooldownTracking.EnableTracker()
if (not Details.ocd_tracker.show_options) then
return
end
Details.ocd_tracker.enabled = true
--register callbacks with the openRaidLib
openRaidLib.RegisterCallback(Details222.CooldownTracking, "CooldownListUpdate", "OnReceiveUnitFullCooldownList")
openRaidLib.RegisterCallback(Details222.CooldownTracking, "CooldownUpdate", "OnReceiveSingleCooldownUpdate")
openRaidLib.RegisterCallback(Details222.CooldownTracking, "CooldownListWipe", "OnCooldownListWipe")
openRaidLib.RegisterCallback(Details222.CooldownTracking, "CooldownAdded", "OnCooldownAdded")
openRaidLib.RegisterCallback(Details222.CooldownTracking, "CooldownRemoved", "OnCooldownRemoved")
Details222.CooldownTracking.RefreshAllCooldownFrames()
end
--disable the cooldown tracker
function Details222.CooldownTracking.DisableTracker()
Details.ocd_tracker.enabled = false
--hide the panel
local allCooldownFrames = Details222.CooldownTracking.GetAllCooldownFrames()
for filterName, cooldownFrame in pairs(allCooldownFrames) do
cooldownFrame:Hide()
end
--unregister callbacks
openRaidLib.UnregisterCallback(Details222.CooldownTracking, "CooldownListUpdate", "OnReceiveUnitFullCooldownList")
openRaidLib.UnregisterCallback(Details222.CooldownTracking, "CooldownUpdate", "OnReceiveSingleCooldownUpdate")
openRaidLib.UnregisterCallback(Details222.CooldownTracking, "CooldownListWipe", "OnCooldownListWipe")
end
--Library Open Raid Callbacks
--callback on the event 'CooldownListUpdate', this is triggered when a player in the group sent the list of cooldowns
--@unitId: which unit got updated
--@unitCooldows: a table with [spellId] = cooldownInfo
--@allUnitsCooldowns: a table containing all units [unitName] = {[spellId] = cooldownInfo}
function Details222.CooldownTracking.OnReceiveUnitFullCooldownList(unitId, unitCooldows, allUnitsCooldowns)
--print("|cFFFFFF00received full cooldown list|r from:", unitId)
Details222.CooldownTracking.RefreshAllCooldownFrames()
end
--callback on the event 'CooldownUpdate', this is triggered when a player uses a cooldown or a cooldown got updated (time left reduced, etc)
--@unitId: which unit got updated
--@spellId: which cooldown spell got updated
--@cooldownInfo: cooldown information table to be passed with other functions
--@unitCooldows: a table with [spellId] = cooldownInfo
--@allUnitsCooldowns: a table containing all units [unitName] = {[spellId] = cooldownInfo}
function Details222.CooldownTracking.OnReceiveSingleCooldownUpdate(unitId, spellId, cooldownInfo, unitCooldows, allUnitsCooldowns)
--TODO: make a function inside lib open raid to get the filters the cooldown is in
--I dont known which panel will be used
--need to get the filter name which that spell belong
--and then check if that filter is enabled
local gotUpdate = false
--get a map with the filters the spell is in, the key is the filter name and the value is boolean true
local spellFilters = openRaidLib.CooldownManager.GetSpellFilters(spellId)
--get all cooldownFrames created
local allCooldownFrames = Details222.CooldownTracking.GetAllCooldownFrames()
for filterName in pairs(spellFilters) do
local cooldownFrame = allCooldownFrames[filterName]
if (cooldownFrame) then
local unitName = GetUnitName(unitId, true)
local cooldownLine = cooldownFrame.playerCache[unitName] and cooldownFrame.playerCache[unitName][spellId]
if (cooldownLine) then
--get the cooldown time from the lib, it return data ready to use on statusbar
local isReady, normalizedPercent, timeLeft, charges, minValue, maxValue, currentValue
local bRunOkay, errorText = pcall(function()
isReady, normalizedPercent, timeLeft, charges, minValue, maxValue, currentValue = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
end)
if (not bRunOkay) then
local spellName = GetSpellInfo(spellId)
--print("error on cooldown update:", unitName, spellName, errorText)
return
end
if (not isReady) then
cooldownLine:SetTimer(currentValue, minValue, maxValue)
else
cooldownLine:SetTimer()
end
gotUpdate = true
end
end
end
if (not gotUpdate) then
Details222.CooldownTracking.RefreshAllCooldownFrames()
end
end
--when the list of cooldowns got wiped, usually happens when the player left a group
--@allUnitsCooldowns: a table containing all units [unitName] = {[spellId] = cooldownInfo}
function Details222.CooldownTracking.OnCooldownListWipe(allUnitsCooldowns)
Details222.CooldownTracking.RefreshAllCooldownFrames()
end
--when a cooldown has been added to an unit
function Details222.CooldownTracking.OnCooldownAdded(unitId, spellId, cooldownInfo, unitCooldows, allUnitsCooldowns)
--here could update the cooldown of the unit, but I'm too lazy so it update all units
Details222.CooldownTracking.RefreshAllCooldownFrames()
end
--when a cooldown has been removed from an unit
function Details222.CooldownTracking.OnCooldownRemoved(unitId, spellId, unitCooldows, allUnitsCooldowns)
Details222.CooldownTracking.RefreshAllCooldownFrames()
end
local eventFrame = CreateFrame("frame")
eventFrame:RegisterEvent("GROUP_ROSTER_UPDATE")
eventFrame:SetScript("OnShow", function()
eventFrame:RegisterEvent("GROUP_ROSTER_UPDATE")
end)
eventFrame:SetScript("OnHide", function()
eventFrame:UnregisterEvent("GROUP_ROSTER_UPDATE")
end)
eventFrame:SetScript("OnEvent", function(self, event)
if (event == "GROUP_ROSTER_UPDATE") then
if (eventFrame.scheduleRosterUpdate) then
return
end
--eventFrame.scheduleRosterUpdate = C_Timer.NewTimer(1, Details222.CooldownTracking.RefreshCooldownFrames)
end
end)
--create the screen panel, goes into the UIParent and show cooldowns
function Details222.CooldownTracking.CreateCooldownFrame(filterName)
if (not Details222.CooldownTracking.AnchorFrame) then
local anchorFrame = CreateFrame("frame", "DetailsOnlineCDTrackerAnchorFrame", UIParent, "BackdropTemplate")
Details222.CooldownTracking.AnchorFrame = anchorFrame
anchorFrame:SetPoint("center", 0, 0)
anchorFrame:SetSize(20, 20)
anchorFrame:EnableMouse(true)
DetailsFramework:ApplyStandardBackdrop(anchorFrame)
Details.ocd_tracker.frames["anchor_frame"] = Details.ocd_tracker.frames["anchor_frame"] or {}
--register on libwindow
local libWindow = LibStub("LibWindow-1.1")
libWindow.RegisterConfig(anchorFrame, Details.ocd_tracker.frames["anchor_frame"])
libWindow.MakeDraggable(anchorFrame)
libWindow.RestorePosition(anchorFrame)
end
filterName = filterName or "main"
local frameName = "DetailsOnlineCDTrackerScreenPanel" .. filterName
local cooldownFrame = CreateFrame("frame", frameName, UIParent, "BackdropTemplate")
cooldownFrame:Hide()
cooldownFrame.filterName = filterName
cooldownFrame:SetSize(Details.ocd_tracker.width, Details.ocd_tracker.height)
cooldownFrame:SetPoint("center", 0, 0)
DetailsFramework:ApplyStandardBackdrop(cooldownFrame)
cooldownFrame:EnableMouse(true)
local titleString = cooldownFrame:CreateFontString(nil, "overlay", "GameFontNormal")
titleString:SetPoint("bottomleft", cooldownFrame, "topleft", 0, 1)
cooldownFrame.TitleString = titleString
--register on libwindow
local libWindow = LibStub("LibWindow-1.1")
Details.ocd_tracker.frames[filterName] = Details.ocd_tracker.frames[filterName] or {}
libWindow.RegisterConfig(cooldownFrame, Details.ocd_tracker.frames[filterName])
libWindow.MakeDraggable(cooldownFrame)
libWindow.RestorePosition(cooldownFrame)
cooldownFrame.bars = {}
cooldownFrame.cooldownCache = Details.ocd_tracker.current_cooldowns
cooldownFrame.playerCache = {}
cooldownFrame.nextLineId = 1
local allCooldownFrames = Details222.CooldownTracking.GetAllCooldownFrames()
allCooldownFrames[filterName] = cooldownFrame
return cooldownFrame
end
function Details222.CooldownTracking.SetupCooldownLine(cooldownLine)
local spellIcon = GetSpellTexture(cooldownLine.spellId)
if (spellIcon) then
cooldownLine:SetIcon(spellIcon, .1, .9, .1, .9)
local classColor = C_ClassColor.GetClassColor(cooldownLine.class or "PRIEST")
if (classColor) then
cooldownLine:SetStatusBarColor(classColor.r, classColor.g, classColor.b)
else
cooldownLine:SetStatusBarColor(1, 1, 1)
end
cooldownLine:SetLeftText(DF:RemoveRealmName(cooldownLine.unitName))
cooldownLine:SetSize(Details.ocd_tracker.width, Details.ocd_tracker.height)
end
end
function Details222.CooldownTracking.ProcessUnitCooldowns(cooldownFrame, unitId, unitCooldowns, cooldownsOrganized)
if (unitCooldowns) then
local unitInfo = openRaidLib.GetUnitInfo(unitId)
local filterName = false
local classId = unitInfo and unitInfo.classId
if (unitInfo and not classId) then
classId = select(3, UnitClass(unitInfo.nameFull))
end
if (unitInfo and classId) then
local allCooldownFrames = Details222.CooldownTracking.GetAllCooldownFrames()
for spellId, cooldownInfo in pairs(unitCooldowns) do
--get a cooldownLine
local cooldownLine = Details222.CooldownTracking.GetOrCreateNewCooldownLine(cooldownFrame, cooldownFrame.nextLineId)
cooldownLine.cooldownInfo = cooldownInfo
--local isReady, normalizedPercent, timeLeft, charges, minValue, maxValue, currentValue = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
cooldownLine.spellId = spellId
cooldownLine.class = unitInfo.class
cooldownLine.unitName = unitInfo.nameFull
--setup the cooldown in the line
Details222.CooldownTracking.SetupCooldownLine(cooldownLine)
--add the cooldown into the organized by class table
table.insert(cooldownsOrganized[classId], cooldownLine)
--iterate to the next cooldown line
cooldownFrame.nextLineId = cooldownFrame.nextLineId + 1
--store the cooldown line into a cache to get the cooldown line quicker when a cooldown receives updates
cooldownFrame.playerCache[unitInfo.nameFull] = cooldownFrame.playerCache[unitInfo.nameFull] or {}
cooldownFrame.playerCache[unitInfo.nameFull][spellId] = cooldownLine
end
end
end
end
function Details222.CooldownTracking.RefreshSingleCooldownFrame(cooldownFrame)
local filterName = cooldownFrame.filterName
if (Details.ocd_tracker.framme_locked) then
cooldownFrame:EnableMouse(false)
else
cooldownFrame:EnableMouse(true)
end
Details222.CooldownTracking.HideAllLines(cooldownFrame)
--check if can show the title string where the text is the filter name
if (Details.ocd_tracker.show_title) then
cooldownFrame.TitleString:SetText(filterName)
cooldownFrame.TitleString:Show()
else
cooldownFrame.TitleString:Hide()
end
cooldownFrame.scheduleRosterUpdate = nil
Details:Destroy(cooldownFrame.playerCache)
cooldownFrame.nextLineId = 1
if (Details.ocd_tracker.show_conditions.only_in_group) then
if (not IsInGroup()) then
cooldownFrame:Hide()
return
end
end
if (Details.ocd_tracker.show_conditions.only_inside_instance) then
local isInInstanceType = select(2, GetInstanceInfo())
if (isInInstanceType ~= "party" and isInInstanceType ~= "raid" and isInInstanceType ~= "scenario" and isInInstanceType ~= "arena") then
cooldownFrame:Hide()
return
end
end
local cooldownsOrganized = {}
for classId = 1, 13 do --13 classes
cooldownsOrganized[classId] = {}
end
local numGroupMembers = GetNumGroupMembers()
if (IsInRaid()) then
for i = 1, numGroupMembers do
local unitId = "raid"..i
local unitCooldowns = openRaidLib.GetUnitCooldowns(unitId, filterName)
Details222.CooldownTracking.ProcessUnitCooldowns(cooldownFrame, unitId, unitCooldowns, cooldownsOrganized)
end
elseif (IsInGroup()) then
for i = 1, numGroupMembers - 1 do
local unitId = "party"..i
local unitCooldowns = openRaidLib.GetUnitCooldowns(unitId, filterName)
Details222.CooldownTracking.ProcessUnitCooldowns(cooldownFrame, unitId, unitCooldowns, cooldownsOrganized)
end
--player
local unitCooldowns = openRaidLib.GetUnitCooldowns("player", filterName)
Details222.CooldownTracking.ProcessUnitCooldowns(cooldownFrame, "player", unitCooldowns, cooldownsOrganized)
else
--player
local unitCooldowns = openRaidLib.GetUnitCooldowns("player", filterName)
Details222.CooldownTracking.ProcessUnitCooldowns(cooldownFrame, "player", unitCooldowns, cooldownsOrganized)
end
for classId = 1, 13 do --13 classes
table.sort(cooldownsOrganized[classId], function(t1, t2) return t1.spellId < t2.spellId end)
end
local xPos = 1
local cooldownFrameIndex = 1
local lineIndex = 1
local totalLinesUsed = 0
for classId = 1, 13 do
local cooldownFrameList = cooldownsOrganized[classId]
for index, cooldownLine in ipairs(cooldownFrameList) do
local cooldownInfo = cooldownLine.cooldownInfo
local isReady, normalizedPercent, timeLeft, charges, minValue, maxValue, currentValue = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
if (not isReady) then
cooldownLine:SetTimer(currentValue, minValue, maxValue)
else
cooldownLine:SetTimer()
end
cooldownLine:ClearAllPoints()
local yLocation = (lineIndex - 1) * Details.ocd_tracker.height * -1
cooldownLine:SetPoint("topleft", cooldownFrame, "topleft", xPos, yLocation - 1)
lineIndex = lineIndex + 1
if (lineIndex > Details.ocd_tracker.lines_per_column) then
xPos = xPos + Details.ocd_tracker.width + 2
lineIndex = 1
end
cooldownFrameIndex = cooldownFrameIndex + 1
totalLinesUsed = totalLinesUsed + 1
end
end
if (totalLinesUsed == 0) then
cooldownFrame:Hide()
return
end
local totalColumns = ceil(totalLinesUsed / Details.ocd_tracker.lines_per_column)
local maxRows = math.min(Details.ocd_tracker.lines_per_column, totalLinesUsed)
local width = 1 + totalColumns * Details.ocd_tracker.width + (totalColumns * 2)
local height = 2 + maxRows * Details.ocd_tracker.height
cooldownFrame:SetSize(width, height)
cooldownFrame:Show()
end
--update cooldown frames based on the amount of players in the group or raid
function Details222.CooldownTracking.RefreshAllCooldownFrames()
if (not Details.ocd_tracker.enabled) then
Details222.CooldownTracking.DisableTracker()
return
end
local allCooldownFrames = Details222.CooldownTracking.GetAllCooldownFrames()
local allFilters = Details.ocd_tracker.filters
for filterName, bIsEnabled in pairs(allFilters) do
if (bIsEnabled) then
local cooldownFrame = allCooldownFrames[filterName]
if (not cooldownFrame) then
cooldownFrame = Details222.CooldownTracking.CreateCooldownFrame(filterName)
end
cooldownFrame:Show()
else
local cooldownFrame = Details222.CooldownTracking.GetCooldownFrame(filterName)
if (cooldownFrame) then
cooldownFrame:Hide()
end
end
end
local previousFrame
for filterName, cooldownFrame in pairs(allCooldownFrames) do
if (cooldownFrame:IsShown()) then
Details222.CooldownTracking.RefreshSingleCooldownFrame(cooldownFrame)
--
if (Details.ocd_tracker.group_frames) then
if (not previousFrame) then
previousFrame = cooldownFrame
cooldownFrame:ClearAllPoints()
cooldownFrame:SetPoint("topleft", Details222.CooldownTracking.AnchorFrame, "topleft", 5, 0)
else
cooldownFrame:ClearAllPoints()
cooldownFrame:SetPoint("topleft", previousFrame, "topright", 2, 0)
previousFrame = cooldownFrame
end
end
end
end
end
--Options panel
--initialize the cooldown options window and embed it to Details! options panel
function Details:InitializeCDTrackerWindow()
if (not Details.ocd_tracker.show_options) then
return
end
local DetailsCDTrackerWindow = CreateFrame("frame", "DetailsCDTrackerWindow", UIParent, "BackdropTemplate")
DetailsCDTrackerWindow:SetSize(700, 480)
DetailsCDTrackerWindow.Frame = DetailsCDTrackerWindow
DetailsCDTrackerWindow.__name = "Cooldown Tracker"
DetailsCDTrackerWindow.real_name = "DETAILS_CDTRACKERWINDOW"
DetailsCDTrackerWindow.__icon = [[Interface\TUTORIALFRAME\UI-TUTORIALFRAME-SPIRITREZ]]
DetailsCDTrackerWindow.__iconcoords = {130/512, 256/512, 0, 1}
DetailsCDTrackerWindow.__iconcolor = "white"
_G.DetailsPluginContainerWindow.EmbedPlugin(DetailsCDTrackerWindow, DetailsCDTrackerWindow, true)
function DetailsCDTrackerWindow.RefreshWindow()
Details222.CooldownTracking.OpenCDTrackerWindow()
end
--check if is enabled at startup
if (Details222.CooldownTracking.IsEnabled()) then
Details222.CooldownTracking.EnableTracker()
end
DetailsCDTrackerWindow:Hide()
end
function Details222.CooldownTracking.OpenCDTrackerWindow()
if (not Details.ocd_tracker.show_options) then
return
end
--check if the window exists, if not create it
if (not _G.DetailsCDTrackerWindow or not _G.DetailsCDTrackerWindow.Initialized) then
local f = _G.DetailsCDTrackerWindow or DF:CreateSimplePanel(UIParent, 700, 480, "Details! Online CD Tracker", "DetailsCDTrackerWindow")
_G.DetailsCDTrackerWindow.Initialized = true
DF:ApplyStandardBackdrop(f)
--enabled with a toggle button
--execute to reset position
--misc configs
local options_text_template = DF:GetTemplate("font", "OPTIONS_FONT_TEMPLATE")
local options_dropdown_template = DF:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
local options_switch_template = DF:GetTemplate("switch", "OPTIONS_CHECKBOX_TEMPLATE")
local options_slider_template = DF:GetTemplate("slider", "OPTIONS_SLIDER_TEMPLATE")
local options_button_template = DF:GetTemplate("button", "OPTIONS_BUTTON_TEMPLATE")
local generalOptions = {
{--enable ocd
type = "toggle",
get = function() return Details.ocd_tracker.enabled end,
set = function(self, fixedparam, value)
if (value) then
if (not Details.ocd_tracker.show_options) then
return
end
Details222.CooldownTracking.EnableTracker()
else
Details222.CooldownTracking.DisableTracker()
end
end,
name = "Enable Experimental Cooldown Tracker",
desc = "Enable Experimental Cooldown Tracker",
},
{--show only in group
type = "toggle",
get = function() return Details.ocd_tracker.show_conditions.only_in_group end,
set = function(self, fixedparam, value)
Details.ocd_tracker.show_conditions.only_in_group = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Only in Group",
desc = "Only in Group",
},
{--show only inside instances
type = "toggle",
get = function() return Details.ocd_tracker.show_conditions.only_inside_instance end,
set = function(self, fixedparam, value)
Details.ocd_tracker.show_conditions.only_inside_instance = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Only Inside Instances",
desc = "Only Inside Instances",
},
{--lock frame
type = "toggle",
get = function() return Details.ocd_tracker.framme_locked end,
set = function(self, fixedparam, value)
Details.ocd_tracker.framme_locked = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Lock Frame",
desc = "Lock Frame",
},
{type = "breakline"},
{--filter: show raid wide defensive cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["defensive-raid"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["defensive-raid"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Defensive: Raid",
desc = "Example: druid tranquility.",
},
{--filter: show target defensive cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["defensive-target"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["defensive-target"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Defensive: Target",
desc = "Example: priest pain suppression.",
},
{--filter: show personal defensive cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["defensive-personal"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["defensive-personal"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Defensive: Personal",
desc = "Example: mage ice block.",
},
{--filter: show ofensive cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["ofensive"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["ofensive"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Offensive Cooldowns",
desc = "Example: priest power infusion.",
},
{--filter: show utility cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["utility"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["utility"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Utility Cooldowns",
desc = "Example: druid roar.",
},
{--filter: show interrupt cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["interrupt"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["interrupt"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Interrupt Cooldowns",
desc = "Example: rogue kick.",
},
{--filter: item cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["itemheal"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["itemheal"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Item: Healing",
desc = "Example: Healthstone.",
},
{--filter: item cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["itempower"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["itempower"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Item: Power Increase",
desc = "Example: Elemental Potion of Power.",
},
{--filter: item cooldowns
type = "toggle",
get = function() return Details.ocd_tracker.filters["itemutil"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["itemutil"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Item: Utility",
desc = "Example: Invisibility Potion.",
},
{--filter: crowd control
type = "toggle",
get = function() return Details.ocd_tracker.filters["crowdcontrol"] end,
set = function(self, fixedparam, value)
Details.ocd_tracker.filters["crowdcontrol"] = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Crowd Control",
desc = "Example: Incapacitaion Roar.",
},
{type = "breakline"},
{--bar width
type = "range",
get = function() return Details.ocd_tracker.width end,
set = function(self, fixedparam, value)
Details.ocd_tracker.width = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
min = 10,
max = 200,
step = 1,
name = "Width",
desc = "Width",
},
{--bar height
type = "range",
get = function() return Details.ocd_tracker.height end,
set = function(self, fixedparam, value)
Details.ocd_tracker.height = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
min = 10,
max = 200,
step = 1,
name = "Height",
desc = "Height",
},
{--bar height
type = "range",
get = function() return Details.ocd_tracker.lines_per_column end,
set = function(self, fixedparam, value)
Details.ocd_tracker.lines_per_column = floor(value)
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
min = 1,
max = 30,
step = 1,
name = "Lines Per Column",
desc = "Lines Per Column",
},
{--show anchor
type = "toggle",
get = function() return Details.ocd_tracker.show_title end,
set = function(self, fixedparam, value)
Details.ocd_tracker.show_title = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Show Title",
desc = "Show Title",
},
{--show anchor
type = "toggle",
get = function() return Details.ocd_tracker.group_frames end,
set = function(self, fixedparam, value)
Details.ocd_tracker.group_frames = value
Details222.CooldownTracking.RefreshAllCooldownFrames()
end,
name = "Group Frames",
desc = "Group Frames",
},
}
generalOptions.always_boxfirst = true
DF:BuildMenu(f, generalOptions, 5, -30, 150, false, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template)
--cooldown selection
local cooldownProfile = Details.ocd_tracker.cooldowns
local cooldownSelectionFrame = CreateFrame("frame", "$parentCooldownSelectionFrame", f, "BackdropTemplate")
cooldownSelectionFrame:SetPoint("topleft", f, "topleft", 0, -150)
cooldownSelectionFrame:SetPoint("bottomright", f, "bottomright", 0, 10)
DF:ApplyStandardBackdrop(cooldownSelectionFrame)
--lib test test warning texts
local warning1 = cooldownSelectionFrame:CreateFontString(nil, "overlay", "GameFontNormal", 5)
warning1:SetPoint("center", f, "center", 0, 0)
warning1:SetText("A cooldown tracker on Details!?\nWhat's next, a Caw counter for Elwynn Forest?")
DF:SetFontColor(warning1, "silver")
DF:SetFontSize(warning1, 14)
local animationHub = DF:CreateAnimationHub(warning1)
local anim1 = DF:CreateAnimation(animationHub, "rotation", 1, 0, 35)
anim1:SetEndDelay(10000000)
anim1:SetSmoothProgress(1)
animationHub:Play()
animationHub:Pause()
local warning2 = cooldownSelectionFrame:CreateFontString(nil, "overlay", "GameFontNormal", 5)
warning2:SetJustifyH("left")
warning2:SetPoint("topleft", f, "topleft", 5, -160)
DF:SetFontColor(warning2, "lime")
warning2:SetText("This is a concept of a cooldown tracker using the new library 'Open Raid' which uses comms to update cooldown timers.\nThe code to implement is so small that can fit inside a weakaura\nIf you're a coder, the implementation is on Details/frames/window_cdtracker.lua")
end
_G.DetailsPluginContainerWindow.OpenPlugin(_G.DetailsCDTrackerWindow)
_G.DetailsCDTrackerWindow:Show()
end