1830359943
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.
801 lines
35 KiB
Lua
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
|