From ea9ad32a7f8f3f245a3d0f2dec6baf07a43f2bec Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Mon, 23 Nov 2020 17:03:08 -0300 Subject: [PATCH] Shaladownlands Launch --- .gitignore | 1 + Details.toc | 3 +- Libs/DF/LibDFramework-1.0.toc | 2 +- Libs/DF/fw.lua | 23 ++-- Libs/DF/normal_bar.lua | 36 ++++--- Libs/DF/panel.lua | 24 ++++- Libs/DF/slider.lua | 11 +- boot.lua | 4 +- classes/class_custom.lua | 34 +++--- classes/class_damage.lua | 5 +- classes/container_actors.lua | 26 +++-- frames/window_cdtracker.lua | 197 ++++++++++++++++++++++++++++++++++ functions/coach.lua | 68 +++++++++--- functions/immersion.lua | 13 ++- functions/playerclass.lua | 3 + functions/profiles.lua | 11 ++ images/special_bar_icons.tga | Bin 0 -> 4194348 bytes startup.lua | 2 + 18 files changed, 375 insertions(+), 88 deletions(-) create mode 100644 frames/window_cdtracker.lua create mode 100644 images/special_bar_icons.tga diff --git a/.gitignore b/.gitignore index 3b0f5e9f1..4a37c63a8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ a.lua functions/pack2.lua *.json *.afphoto +wowapi.lua diff --git a/Details.toc b/Details.toc index 5727930dc..481ad8abe 100644 --- a/Details.toc +++ b/Details.toc @@ -1,4 +1,4 @@ -## Interface: 90001 +## Interface: 90002 ## Title: Details! Damage Meter ## Notes: Essential tool to impress that chick in your raid. ## SavedVariables: _detalhes_global @@ -67,6 +67,7 @@ frames\window_copy.lua frames\window_options2.lua frames\window_options2_sections.lua frames\window_api.lua +#frames\window_cdtracker.lua frames\window_playerbreakdown.lua frames\window_playerbreakdown_list.lua frames\window_report.lua diff --git a/Libs/DF/LibDFramework-1.0.toc b/Libs/DF/LibDFramework-1.0.toc index 5f5426ab1..a1ab4868d 100644 --- a/Libs/DF/LibDFramework-1.0.toc +++ b/Libs/DF/LibDFramework-1.0.toc @@ -1,4 +1,4 @@ -## Interface: 90001 +## Interface: 90002 ## Title: Lib: LibDFramework-1.0 ## Notes: Base Framework for many Addons diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index e03d3f19f..acc4593ae 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 215 +local dversion = 220 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary (major, minor) @@ -611,7 +611,7 @@ function DF:TruncateText (fontString, maxWidth) end end - DF:CleanTruncateUTF8String(text) + text = DF:CleanTruncateUTF8String(text) fontString:SetText (text) end @@ -3399,13 +3399,13 @@ function DF:CoreDispatch (context, func, ...) error (errortext) end - local okay, result1, result2, result3, result4 = pcall (func, ...) - - if (not okay) then - local stack = debugstack(2) - local errortext = "D!Framework (" .. context .. ") error: " .. result1 .. "\n====================\n" .. stack .. "\n====================\n" - error (errortext) - end + local okay, result1, result2, result3, result4 = xpcall(func, geterrorhandler(), ...) + + --if (not okay) then --when using pcall + --local stack = debugstack(2) + --local errortext = "D!Framework (" .. context .. ") error: " .. result1 .. "\n====================\n" .. stack .. "\n====================\n" + --error (errortext) + --end return result1, result2, result3, result4 end @@ -4204,10 +4204,9 @@ end end } - function DF:SetEnvironment(func, environmentHandle) + function DF:SetEnvironment(func, environmentHandle, newEnvironment) environmentHandle = environmentHandle or DF.DefaultSecureScriptEnvironmentHandle - - local newEnvironment = {} + newEnvironment = newEnvironment or {} setmetatable(newEnvironment, environmentHandle) _G.setfenv(func, newEnvironment) diff --git a/Libs/DF/normal_bar.lua b/Libs/DF/normal_bar.lua index ee77536ab..f37735dd4 100644 --- a/Libs/DF/normal_bar.lua +++ b/Libs/DF/normal_bar.lua @@ -534,14 +534,14 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] return end end - + local OnMouseDown = function (frame, button) local capsule = frame.MyObject local kill = capsule:RunHooksForWidget ("OnMouseDown", frame, button, capsule) if (kill) then return end - + if (not frame.MyObject.container.isLocked and frame.MyObject.container:IsMovable()) then if (not frame.isLocked and frame:IsMovable()) then frame.MyObject.container.isMoving = true @@ -549,14 +549,14 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] end end end - + local OnMouseUp = function (frame, button) local capsule = frame.MyObject local kill = capsule:RunHooksForWidget ("OnMouseUp", frame, button, capsule) if (kill) then return end - + if (frame.MyObject.container.isMoving) then frame.MyObject.container:StopMovingOrSizing() frame.MyObject.container.isMoving = false @@ -565,14 +565,14 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] ------------------------------------------------------------------------------------------------------------ --> timer - + function BarMetaFunctions:OnTimerEnd() local capsule = self local kill = capsule:RunHooksForWidget ("OnTimerEnd", self.widget, capsule) if (kill) then return end - + self.timer_texture:Hide() self.timer_textureR:Hide() self.div_timer:Hide() @@ -580,7 +580,7 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] self.timer = false end - function BarMetaFunctions:CancelTimerBar (no_timer_end) + function BarMetaFunctions:CancelTimerBar(no_timer_end) if (not self.HasTimer) then return end @@ -592,7 +592,11 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] self.statusbar:SetScript ("OnUpdate", nil) end end + self.righttext = "" + self.timer_texture:Hide() + self.timer_textureR:Hide() + if (not no_timer_end) then self:OnTimerEnd() end @@ -601,6 +605,7 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] local OnUpdate = function (self, elapsed) --> percent of elapsed local pct = abs (self.end_timer - GetTime() - self.tempo) / self.tempo + if (self.inverse) then self.t:SetWidth (self.total_size * pct) else @@ -624,7 +629,6 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] end function BarMetaFunctions:SetTimer (tempo, end_at) - if (end_at) then self.statusbar.tempo = end_at - tempo self.statusbar.remaining = end_at - GetTime() @@ -637,13 +641,13 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] self.statusbar.total_size = self.statusbar:GetWidth() self.statusbar.inverse = self.BarIsInverse - - self (0) - + + self(0) + self.div_timer:Show() self.background:Show() self:Show() - + if (self.LeftToRight) then self.timer_texture:Hide() self.timer_textureR:Show() @@ -659,19 +663,19 @@ local BarMetaFunctions = _G[DF.GlobalWidgetControlNames ["normal_bar"]] self.timer_texture:SetPoint ("left", self.statusbar, "left") self.div_timer:SetPoint ("left", self.timer_texture, "right", -16, -1) end - + if (self.BarIsInverse) then self.statusbar.t:SetWidth (1) else self.statusbar.t:SetWidth (self.statusbar.total_size) end - + self.timer = true - + self.HasTimer = true self.TimerScheduled = DF:ScheduleTimer ("StartTimeBarAnimation", 0.1, self) end - + function DF:StartTimeBarAnimation (timebar) timebar.TimerScheduled = nil timebar.statusbar:SetScript ("OnUpdate", OnUpdate) diff --git a/Libs/DF/panel.lua b/Libs/DF/panel.lua index 8a6a936ef..65713aaa9 100644 --- a/Libs/DF/panel.lua +++ b/Libs/DF/panel.lua @@ -5131,6 +5131,7 @@ DF.IconRowFunctions = { cooldownFrame:SetAllPoints() cooldownFrame:EnableMouse (false) cooldownFrame:SetFrameLevel (newIconFrame:GetFrameLevel()+1) + cooldownFrame:SetHideCountdownNumbers (self.options.surpress_blizzard_cd_timer) cooldownFrame.noCooldownCount = self.options.surpress_tulla_omni_cc newIconFrame.CountdownText = cooldownFrame:CreateFontString (nil, "overlay", "GameFontNormal") @@ -5224,12 +5225,15 @@ DF.IconRowFunctions = { iconFrame.CountdownText:SetPoint (self.options.text_anchor or "center", iconFrame, self.options.text_rel_anchor or "center", self.options.text_x_offset or 0, self.options.text_y_offset or 0) DF:SetFontSize (iconFrame.CountdownText, self.options.text_size) + DF:SetFontFace (iconFrame.CountdownText, self.options.text_font) + DF:SetFontOutline (iconFrame.CountdownText, self.options.text_outline) iconFrame.CountdownText:SetText (formattedTime) - iconFrame.Cooldown:SetHideCountdownNumbers (true) + else iconFrame.CountdownText:Hide() - iconFrame.Cooldown:SetHideCountdownNumbers (false) end + + iconFrame.Cooldown:SetHideCountdownNumbers (self.options.surpress_blizzard_cd_timer) else iconFrame.CountdownText:Hide() end @@ -5240,6 +5244,8 @@ DF.IconRowFunctions = { iconFrame.Desc:SetTextColor (DF:ParseColors (descText.text_color or self.options.desc_text_color)) iconFrame.Desc:SetPoint(self.options.desc_text_anchor or "bottom", iconFrame, self.options.desc_text_rel_anchor or "top", self.options.desc_text_x_offset or 0, self.options.desc_text_y_offset or 2) DF:SetFontSize (iconFrame.Desc, descText.text_size or self.options.desc_text_size) + DF:SetFontFace (iconFrame.Desc, self.options.desc_text_font) + DF:SetFontOutline (iconFrame.Desc, self.options.desc_text_outline) else iconFrame.Desc:Hide() end @@ -5250,6 +5256,8 @@ DF.IconRowFunctions = { iconFrame.StackText:SetTextColor (DF:ParseColors (self.options.desc_text_color)) iconFrame.StackText:SetPoint (self.options.stack_text_anchor or "center", iconFrame, self.options.stack_text_rel_anchor or "bottomright", self.options.stack_text_x_offset or 0, self.options.stack_text_y_offset or 0) DF:SetFontSize (iconFrame.StackText, self.options.stack_text_size) + DF:SetFontFace (iconFrame.StackText, self.options.stack_text_font) + DF:SetFontOutline (iconFrame.StackText, self.options.stack_text_outline) else iconFrame.StackText:Hide() end @@ -5330,6 +5338,8 @@ local default_icon_row_options = { show_text = true, text_color = {1, 1, 1, 1}, text_size = 12, + text_font = "Arial Narrow", + text_outline = "NONE", text_anchor = "center", text_rel_anchor = "center", text_x_offset = 0, @@ -5337,6 +5347,8 @@ local default_icon_row_options = { desc_text = true, desc_text_color = {1, 1, 1, 1}, desc_text_size = 7, + desc_text_font = "Arial Narrow", + desc_text_outline = "NONE", desc_text_anchor = "bottom", desc_text_rel_anchor = "top", desc_text_x_offset = 0, @@ -5344,6 +5356,8 @@ local default_icon_row_options = { stack_text = true, stack_text_color = {1, 1, 1, 1}, stack_text_size = 10, + stack_text_font = "Arial Narrow", + stack_text_outline = "NONE", stack_text_anchor = "center", stack_text_rel_anchor = "bottomright", stack_text_x_offset = 0, @@ -5356,6 +5370,7 @@ local default_icon_row_options = { backdrop_border_color = {0, 0, 0, 1}, anchor = {side = 6, x = 2, y = 0}, grow_direction = 1, --1 = to right 2 = to left + surpress_blizzard_cd_timer = false, surpress_tulla_omni_cc = false, } @@ -7287,6 +7302,11 @@ DF.StatusBarFunctions = { end healthBarMetaFunctions.UpdateHealth = function (self) + -- update max health regardless to avoid weird wrong values on UpdateMaxHealth sometimes + -- local maxHealth = UnitHealthMax (self.displayedUnit) + -- self:SetMinMaxValues (0, maxHealth) + -- self.currentHealthMax = maxHealth + local health = UnitHealth (self.displayedUnit) self.currentHealth = health PixelUtil.SetStatusBarValue (self, health) diff --git a/Libs/DF/slider.lua b/Libs/DF/slider.lua index a2e25fde2..c87ad1a73 100644 --- a/Libs/DF/slider.lua +++ b/Libs/DF/slider.lua @@ -847,23 +847,22 @@ local SwitchOnClick = function (self, button, forced_value, value) slider._thumb:SetPoint ("right", slider.widget, "right") end end - + if (slider.OnSwitch and not forced_value) then local value = _rawget (slider, "value") if (slider.return_func) then value = slider:return_func (value) end - - --> safe call - local success, errorText = pcall (slider.OnSwitch, slider, slider.FixedValue, value) + + local success, errorText = xpcall (slider.OnSwitch, geterrorhandler(), slider, slider.FixedValue, value) if (not success) then error ("Details! Framework: OnSwitch() " .. (button.GetName and button:GetName() or "-NONAME-") .. " error: " .. (errorText or "")) end - + --> trigger hooks slider:RunHooksForWidget ("OnSwitch", slider, slider.FixedValue, value) end - + end local default_switch_func = function (self, passed_value) diff --git a/boot.lua b/boot.lua index 33392e7d6..8745f1e99 100644 --- a/boot.lua +++ b/boot.lua @@ -4,8 +4,8 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 7950 - _detalhes.alpha_build_counter = 7950 --if this is higher than the regular counter, use it instead + _detalhes.build_counter = 8000 + _detalhes.alpha_build_counter = 8000 --if this is higher than the regular counter, use it instead _detalhes.game_version = "v9.0.1" _detalhes.userversion = "v9.0.1." .. _detalhes.build_counter _detalhes.realversion = 144 --core version, this is used to check API version for scripts and plugins (see alias below) diff --git a/classes/class_custom.lua b/classes/class_custom.lua index 2348e43cf..10a7a15f3 100644 --- a/classes/class_custom.lua +++ b/classes/class_custom.lua @@ -1,14 +1,14 @@ --> customized display script - + local _detalhes = _G._detalhes local gump = _detalhes.gump local _ - + _detalhes.custom_function_cache = {} - + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> local pointers - + local _cstr = string.format --lua local local _math_floor = math.floor --lua local local _table_sort = table.sort --lua local @@ -24,7 +24,7 @@ local _unpack = unpack --lua local local _type = type --lua local local _pcall = pcall -- lua local - + local _GetSpellInfo = _detalhes.getspellinfo -- api local local _IsInRaid = IsInRaid -- api local local _IsInGroup = IsInGroup -- api local @@ -32,34 +32,34 @@ local _GetNumPartyMembers = GetNumPartyMembers or GetNumSubgroupMembers -- api local local _GetNumRaidMembers = GetNumRaidMembers or GetNumGroupMembers -- api local local _GetUnitName = GetUnitName -- api local - + local _string_replace = _detalhes.string.replace --details api local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) - + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> constants local atributo_custom = _detalhes.atributo_custom atributo_custom.mt = {__index = atributo_custom} - + local combat_containers = { ["damagedone"] = 1, ["healdone"] = 2, } - + --> hold the mini custom objects atributo_custom._InstanceActorContainer = {} atributo_custom._InstanceLastCustomShown = {} atributo_custom._InstanceLastCombatShown = {} atributo_custom._TargetActorsProcessed = {} - + local ToKFunctions = _detalhes.ToKFunctions local SelectedToKFunction = ToKFunctions [1] local FormatTooltipNumber = ToKFunctions [8] local TooltipMaximizedMethod = 1 local UsingCustomRightText = false local UsingCustomLeftText = false - + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> core @@ -78,22 +78,22 @@ --> save the custom name in the instance instance.customName = custom_object:GetName() - + --> get the container holding the custom actor objects for this instance local instance_container = atributo_custom:GetInstanceCustomActorContainer (instance) - + local last_shown = atributo_custom._InstanceLastCustomShown [instance:GetId()] if (last_shown and last_shown ~= custom_object:GetName()) then instance_container:WipeCustomActorContainer() end atributo_custom._InstanceLastCustomShown [instance:GetId()] = custom_object:GetName() - + local last_combat_shown = atributo_custom._InstanceLastCombatShown [instance:GetId()] if (last_combat_shown and last_combat_shown ~= combat) then instance_container:WipeCustomActorContainer() end atributo_custom._InstanceLastCombatShown [instance:GetId()] = combat - + --> declare the main locals local total = 0 local top = 0 @@ -104,9 +104,9 @@ --> be save reseting the values on every refresh instance_container:ResetCustomActorContainer() - + local func - + if (_detalhes.custom_function_cache [instance.customName]) then func = _detalhes.custom_function_cache [instance.customName] else diff --git a/classes/class_damage.lua b/classes/class_damage.lua index cd8c41e4b..001ae7456 100644 --- a/classes/class_damage.lua +++ b/classes/class_damage.lua @@ -4708,7 +4708,10 @@ function atributo_damage:MontaDetalhesDamageDone (spellid, barra, instancia) table.wipe (data) --> GERAL - local media = esta_magia.total/total_hits + local media = 0 + if (total_hits > 0) then + media = esta_magia.total/total_hits + end local this_dps = nil if (esta_magia.counter > esta_magia.c_amt) then diff --git a/classes/container_actors.lua b/classes/container_actors.lua index d4fa262a1..18d4f590c 100644 --- a/classes/container_actors.lua +++ b/classes/container_actors.lua @@ -535,12 +535,21 @@ novo_objeto.flag_original = flag novo_objeto.serial = serial + --> seta a classe default para desconhecido, assim nenhum objeto fica com classe nil + novo_objeto.classe = "UNKNOW" + local forceClass + --get the aID (actor id) if (serial:match("^C")) then novo_objeto.aID = tostring(Details:GetNpcIdFromGuid(serial)) if (Details.immersion_special_units) then - novo_objeto.grupo = Details.Immersion.IsNpcInteresting(novo_objeto.aID) + local shouldBeInGroup, class = Details.Immersion.IsNpcInteresting(novo_objeto.aID) + novo_objeto.grupo = shouldBeInGroup + if (class) then + novo_objeto.classe = class + forceClass = novo_objeto.classe + end end elseif (serial:match("^P")) then @@ -559,14 +568,6 @@ end end - --> seta a classe default para desconhecido, assim nenhum objeto fica com classe nil - novo_objeto.classe = "UNKNOW" - ---8/11 00:57:49.096 SPELL_DAMAGE, ---Creature-0-2084-1220-24968-110715-00002BF677,"Archmage Modera",0x2111,0x0, ---Creature-0-2084-1220-24968-94688-00002BF6A7,"Diseased Grub",0x10a48,0x0, ---220128,"Frost Nova",0x10,Creature-0-2084-1220-24968-94688-00002BF6A7,0000000000000000,63802,311780,0,0,1,0,0,0,4319.26,4710.75,110,10271,-1,16,0,0,0,nil,nil,nil - -- tipo do container ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -716,8 +717,13 @@ _detalhes_global.debug_chr_log = _detalhes_global.debug_chr_log .. logLine end - end + end + --only happens with npcs from immersion feature + if (forceClass) then + novo_objeto.classe = forceClass + end + return novo_objeto, dono_do_pet, nome else return nil, nil, nil diff --git a/frames/window_cdtracker.lua b/frames/window_cdtracker.lua new file mode 100644 index 000000000..6c4173123 --- /dev/null +++ b/frames/window_cdtracker.lua @@ -0,0 +1,197 @@ + + +local Details = _G.Details +local DF = _G.DetailsFramework + +--namespace +Details.CooldownTracking = {} + +function Details:InitializeCDTrackerWindow() + local DetailsCDTrackerWindow = DF:CreateSimplePanel(UIParent, 700, 480, "Details! Online CD Tracker", "DetailsCDTrackerWindow") + DetailsCDTrackerWindow.Frame = DetailsCDTrackerWindow + DetailsCDTrackerWindow.__name = "OCD 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() + Details.OpenCDTrackerWindow() + end + + --check if is enabled at startup + if (Details.CooldownTracking.IsEnabled()) then + Details.CooldownTracking.RefreshScreenPanel() + end + + DetailsCDTrackerWindow:Hide() +end + +function Details.CooldownTracking.IsEnabled() + return Details.cd_tracker.enabled +end + +function Details.CooldownTracking.EnableTracker() + Details.CooldownTracking.RefreshScreenPanel() +end + +function Details.CooldownTracking.DisableTracker() + --hide the panel + if (DetailsOnlineCDTrackerScreenPanel) then + DetailsOnlineCDTrackerScreenPanel:Hide() + end + + --unregister callbacks + local libRaidStatus = LibStub("LibRaidStatus-1.0") + libRaidStatus.UnregisterCallback(Details.CooldownTracking, "CooldownListUpdate", "CooldownListUpdateFunc") + libRaidStatus.UnregisterCallback(Details.CooldownTracking, "CooldownListWiped", "CooldownListWipedFunc") + libRaidStatus.UnregisterCallback(Details.CooldownTracking, "CooldownUpdate", "CooldownUpdateFunc") + + --unregister events + +end + +function Details.CooldownTracking.CooldownListUpdateFunc() + +end + +function Details.CooldownTracking.CooldownListWipedFunc() + +end + +function Details.CooldownTracking.CooldownUpdateFunc() + +end + +function Details.CooldownTracking.RefreshScreenPanel() + if (not DetailsOnlineCDTrackerScreenPanel) then + --screen panel (goes into the UIParent and show cooldowns there) + local screenPanel = CreateFrame("frame", "DetailsOnlineCDTrackerScreenPanel", UIParent) + screenPanel:Hide() + + --register on libwindow + local libWindow = LibStub("LibWindow-1.1") + libWindow.RegisterConfig(screenPanel, _detalhes.cd_tracker.pos) + libWindow.MakeDraggable(screenPanel) + libWindow.RestorePosition(screenPanel) + end + + local screenPanel = _G.DetailsOnlineCDTrackerScreenPanel + + if (Details.cd_tracker.show_conditions.only_in_group) then + if (not IsInGroup()) then + screenPanel:Hide() + return + end + end + + if (Details.cd_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 + screenPanel:Hide() + return + end + end + + --register callbacks from LibRaidStatus + local libRaidStatus = LibStub("LibRaidStatus-1.0") + if (libRaidStatus) then + libRaidStatus.RegisterCallback(Details.CooldownTracking, "CooldownListUpdate", "CooldownListUpdateFunc") + libRaidStatus.RegisterCallback(Details.CooldownTracking, "CooldownListWiped", "CooldownListWipedFunc") + libRaidStatus.RegisterCallback(Details.CooldownTracking, "CooldownUpdate", "CooldownUpdateFunc") + end + + --parei aqui, precisa pegar a tabela de cooldowns da library e atualizar as statusbars +end + +function Details.OpenCDTrackerWindow() + + --check if the window exists, if not create it + if (not _G.DetailsCDTrackerWindow or not _G.DetailsCDTrackerWindow.Initialized) then + _G.DetailsCDTrackerWindow.Initialized = true + local f = _G.DetailsCDTrackerWindow or DF:CreateSimplePanel(UIParent, 700, 480, "Details! Online CD Tracker", "DetailsCDTrackerWindow") + + --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 tracking + type = "toggle", + get = function() return Details.cd_tracker.enabled end, + set = function (self, fixedparam, value) + if (value) then + Details.CooldownTracking.EnableTracker() + else + Details.CooldownTracking.DisableTracker() + end + end, + name = "Enable Online Cooldown Tracker", + desc = "Enable Online Cooldown Tracker", + }, + } + DF:BuildMenu(generalOptions, f, 5, -5, 150, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) + + + --cooldown selection + local cooldownProfile = Details.cd_tracker.cds_enabled + + local cooldownSelectionFrame = CreateFrame("frame", "$parentCooldownSelectionFrame", f, "BackdropTemplate") + cooldownSelectionFrame:SetPoint("topleft", f, "topleft", 0, -150) + cooldownSelectionFrame:SetPoint("bottomright", f, "bottomright", 0, 10) + DF:ApplyStandardBackdrop(cooldownSelectionFrame) + + --list of cooldowns to show, each one with a toggle button + local cooldownList = {} + if (LIB_RAID_STATUS_COOLDOWNS_BY_SPEC) then + for specId, cooldownTable in pairs(LIB_RAID_STATUS_COOLDOWNS_BY_SPEC) do + cooldownList[#cooldownList+1] = {type = "label", get = function() return "" .. specId end} + + for spellId, cooldownType in pairs(cooldownTable) do + local spellName, _, spellicon = GetSpellInfo(spellId) + + if (spellName) then + if (cooldownType == 3 or cooldownType == 4) then + cooldownList[#cooldownList+1] = { + type = "toggle", + get = function() + if (cooldownProfile[spellId] == nil) then + if (cooldownType == 3 or cooldownType == 4) then + cooldownProfile[spellId] = true + else + cooldownProfile[spellId] = false + end + end + return cooldownProfile[spellId] + end, + set = function (self, fixedparam, value) + cooldownProfile[spellId] = value + end, + name = spellName, + desc = spellName, + boxfirst = true, + } + end + end + end + + cooldownList[#cooldownList+1] = {type = "blank"} + end + end + + DF:BuildMenu(cooldownSelectionFrame, cooldownList, 5, -5, cooldownSelectionFrame:GetHeight(), false, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template) + + + + end + + _G.DetailsPluginContainerWindow.OpenPlugin(_G.DetailsCDTrackerWindow) + _G.DetailsCDTrackerWindow:Show() + +end \ No newline at end of file diff --git a/functions/coach.lua b/functions/coach.lua index dbe2e260f..b465d2138 100644 --- a/functions/coach.lua +++ b/functions/coach.lua @@ -41,24 +41,32 @@ end function Details.Coach.SendRLCombatStartNotify(raidLeaderName) Details:SendCommMessage(_G.DETAILS_PREFIX_NETWORK, Details:Serialize(_G.DETAILS_PREFIX_COACH, UnitName("player"), GetRealmName(), Details.realversion, "CCS"), "WHISPER", raidLeaderName) - Details:Msg("sent to raid leader a combat start notification.") + if (_detalhes.debug) then + Details:Msg("sent to raid leader a combat start notification.") + end end function Details.Coach.SendRLCombatEndNotify(raidLeaderName) Details:SendCommMessage(_G.DETAILS_PREFIX_NETWORK, Details:Serialize(_G.DETAILS_PREFIX_COACH, UnitName("player"), GetRealmName(), Details.realversion, "CCE"), "WHISPER", raidLeaderName) - Details:Msg("sent to raid leader a combat end notification.") + if (_detalhes.debug) then + Details:Msg("sent to raid leader a combat end notification.") + end end --the coach is no more a coach function Details.Coach.SendRaidCoachEndNotify() Details:SendCommMessage(_G.DETAILS_PREFIX_NETWORK, Details:Serialize(_G.DETAILS_PREFIX_COACH, UnitName("player"), GetRealmName(), Details.realversion, "CE"), "RAID") - Details:Msg("sent to raid a coach end notification.") + if (_detalhes.debug) then + Details:Msg("sent to raid a coach end notification.") + end end --there's a new coach, notify players function Details.Coach.SendRaidCoachStartNotify() Details:SendCommMessage(_G.DETAILS_PREFIX_NETWORK, Details:Serialize(_G.DETAILS_PREFIX_COACH, UnitName("player"), GetRealmName(), Details.realversion, "CS"), "RAID") - Details:Msg("sent to raid a coach start notification.") + if (_detalhes.debug) then + Details:Msg("sent to raid a coach start notification.") + end end --send data to raid leader @@ -133,7 +141,9 @@ function Details.Coach.StartUp() if (UnitIsGroupAssistant("player")) then local raidLeaderName = Details.Coach.Client.GetLeaderName() if (raidLeaderName) then - Details:Msg("i'm a raid assistant, sent combat start notification to raid leader.") + if (_detalhes.debug) then + Details:Msg("i'm a raid assistant, sent combat start notification to raid leader.") + end Details.Coach.SendRLCombatStartNotify(raidLeaderName) end end @@ -154,7 +164,9 @@ function Details.Coach.StartUp() if (UnitIsGroupAssistant("player")) then local raidLeaderName = Details.Coach.Client.GetLeaderName() if (raidLeaderName) then - Details:Msg("i'm a raid assistant, sent combat end notification to raid leader.") + if (_detalhes.debug) then + Details:Msg("i'm a raid assistant, sent combat end notification to raid leader.") + end Details.Coach.SendRLCombatEndNotify(raidLeaderName) end end @@ -170,7 +182,9 @@ function Details.Coach.StartUp() if (isInRaidZone()) then --the raid leader entered a raid instance Details.Coach.Disable() - Details:Msg("Coach feature stopped: you entered in a raid instance.") + if (_detalhes.debug) then + Details:Msg("Coach feature stopped: you entered in a raid instance.") + end end return else @@ -179,7 +193,9 @@ function Details.Coach.StartUp() if (UnitIsGroupLeader("player")) then --player is the raid leader if (not Details.Coach.Server.IsEnabled()) then --the coach feature isn't running Details.Coach.Server.EnableCoach() - Details:Msg("Coach feature is now running, if this come as surprise, use '/details coach' to disable.") + if (_detalhes.debug) then + Details:Msg("Coach feature is now running, if this come as surprise, use '/details coach' to disable.") + end end end return @@ -193,7 +209,9 @@ function Details.Coach.StartUp() if (not Details.Coach.Client.IsEnabled()) then local raidLeaderName = Details:GetRaidLeader() if (raidLeaderName) then - Details:Msg("sent ask to raid leader, is coach?") + if (_detalhes.debug) then + Details:Msg("sent ask to raid leader, is coach?") + end Details.Coach.AskRLForCoachStatus(raidLeaderName) return end @@ -248,19 +266,25 @@ end --the player used '/details coach' or it's Details! initialization function Details.Coach.Server.EnableCoach(fromStartup) if (not IsInRaid()) then - Details:Msg("cannot enabled coach: not in raid.") + if (_detalhes.debug) then + Details:Msg("cannot enabled coach: not in raid.") + end Details.coach.enabled = false Details.Coach.Server.enabled = false return elseif (not UnitIsGroupLeader("player")) then - Details:Msg("cannot enabled coach: you aren't the raid leader.") + if (_detalhes.debug) then + Details:Msg("cannot enabled coach: you aren't the raid leader.") + end Details.coach.enabled = false Details.Coach.Server.enabled = false return elseif (isInRaidZone()) then - Details:Msg("cannot enabled coach: you are inside a raid zone.") + if (_detalhes.debug) then + Details:Msg("cannot enabled coach: you are inside a raid zone.") + end Details.coach.enabled = false Details.Coach.Server.enabled = false return @@ -276,7 +300,9 @@ function Details.Coach.Server.EnableCoach(fromStartup) Details.Coach.EventFrame:RegisterEvent("GROUP_ROSTER_UPDATE") if (fromStartup) then - Details:Msg("coach feature enabled, welcome back captain!") + if (_detalhes.debug) then + Details:Msg("coach feature enabled, welcome back captain!") + end end end @@ -308,7 +334,9 @@ function Details.Coach.Client.EnableCoach(raidLeaderName) --enable group roster to know if the raid leader has changed Details.Coach.EventFrame:RegisterEvent("GROUP_ROSTER_UPDATE") - Details:Msg("there's a new coach: ", raidLeaderName) + if (_detalhes.debug) then + Details:Msg("there's a new coach: ", raidLeaderName) + end end --raid leader received a notification that a new combat has started @@ -367,7 +395,9 @@ Details.Coach.EventFrame:SetScript("OnEvent", function(event, ...) local unitName = UnitName("raid" .. i) if (_G.Ambiguate(unitName .. "-" .. GetRealmName(), "none") ~= Details.Coach.Client.coachName) then --the raid leader has changed, finish the coach feature on the client - Details:Msg("raid leader has changed, coach feature has been disabled.") + if (_detalhes.debug) then + Details:Msg("raid leader has changed, coach feature has been disabled.") + end Details.Coach.Client.CoachEnd() end break @@ -382,7 +412,9 @@ Details.Coach.EventFrame:SetScript("OnEvent", function(event, ...) if (not Details.Coach.Server.IsEnabled()) then if (IsInRaid()) then if (not isInRaidZone()) then - Details:Msg("you're now the coach of the group.") + if (_detalhes.debug) then + Details:Msg("you're now the coach of the group.") + end --delay to set the new leader to give time for SendRaidCoachEndNotify() _G.C_Timer.After(3, Details.Coach.Server.EnableCoach) end @@ -393,7 +425,9 @@ Details.Coach.EventFrame:SetScript("OnEvent", function(event, ...) --player isn't the raid leader, check if the player is the coach and disable the feature if (Details.Coach.IsEnabled()) then if (Details.Coach.Server.IsEnabled()) then - Details:Msg("you're not the raid leader, disabling the coach feature.") + if (_detalhes.debug) then + Details:Msg("you're not the raid leader, disabling the coach feature.") + end Details.Coach.Disable() end end diff --git a/functions/immersion.lua b/functions/immersion.lua index 8a916c4a8..4b781d8de 100644 --- a/functions/immersion.lua +++ b/functions/immersion.lua @@ -49,9 +49,16 @@ end) --store the GUID of the npc or player and point to the coords there the icon is local iconPath1 = [[Interface\AddOns\Details\images\special_bar_icons]] Details.Immersion.IconDatabase = { - ["167826"] = {file = iconPath1, iconId = 1, interest = true}, --lady jaina proudmoore - ["167827"] = {file = iconPath1, iconId = 2, interest = true}, --Thrall + ["167826"] = {file = iconPath1, iconId = 1, interest = true, class = "MAGE"}, --lady jaina proudmoore + ["167827"] = {file = iconPath1, iconId = 2, interest = true, class = "SHAMAN"}, --Thrall + ["157432"] = {file = iconPath1, iconId = 3, interest = true, class = "WARRIOR"}, --bloodletter phantoriax, a npc inside torghast + ["166148"] = {file = iconPath1, iconId = 4, interest = true, class = "WARRIOR"}, --sawn, a npc inside torghast + ["171996"] = {file = iconPath1, iconId = 5, interest = true, class = "WARRIOR"}, --kythekios, a npc inside torghast + ["172007"] = {file = iconPath1, iconId = 6, interest = true, class = "WARRIOR"}, --thelia, a npc inside torghast + ["172024"] = {file = iconPath1, iconId = 7, interest = true, class = "WARRIOR"}, --telethakas, a npc inside torghast + ["157406"] = {file = iconPath1, iconId = 8, interest = true, class = "WARRIOR"}, --renavyth, a npc inside torghast + ["166151"] = {file = iconPath1, iconId = 9, interest = true, class = "WARRIOR"}, --moriaz the red, a npc inside torghast } local customIconsDB = Details.Immersion.IconDatabase @@ -75,6 +82,6 @@ end function Details.Immersion.IsNpcInteresting(aID) local npcImmersion = customIconsDB[aID] if (npcImmersion and npcImmersion.interest) then - return true + return true, npcImmersion.class end end \ No newline at end of file diff --git a/functions/playerclass.lua b/functions/playerclass.lua index 4ba98aac9..a76c5554c 100644 --- a/functions/playerclass.lua +++ b/functions/playerclass.lua @@ -95,6 +95,9 @@ do function _detalhes:GetSpecIcon (spec, useAlpha) if (spec) then + if (spec > 500) then --hack to new spec ids on new leveling zones from level 1-10 + spec = 65 + end if (useAlpha) then return [[Interface\AddOns\Details\images\spec_icons_normal_alpha]], unpack (_detalhes.class_specs_coords [spec]) else diff --git a/functions/profiles.lua b/functions/profiles.lua index 88c93b9de..5ee2ffc89 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -1104,6 +1104,17 @@ local default_player_data = { enabled = false, }, + --> cd tracker + cd_tracker = { + pos = {}, + enabled = false, + cds_enabled = {}, + show_conditions = { + only_in_group = true, + only_inside_instance = true, + } + }, + --> force all fonts to have this outline force_font_outline = "", diff --git a/images/special_bar_icons.tga b/images/special_bar_icons.tga new file mode 100644 index 0000000000000000000000000000000000000000..f7cabb8a672192762966fb080c06743359654923 GIT binary patch literal 4194348 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 z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj eFkrxd0RsjM7%*VKz#jv9zV(Y0qvzA&sU=-+Bb4d@ literal 0 HcmV?d00001 diff --git a/startup.lua b/startup.lua index 9eb4d837c..b568af1e5 100644 --- a/startup.lua +++ b/startup.lua @@ -53,6 +53,8 @@ function Details:StartMeUp() --I'll never stop! self:InitializeRunCodeWindow() self:InitializePlaterIntegrationWindow() self:InitializeMacrosWindow() + + --self:InitializeCDTrackerWindow() --custom window self.custom = self.custom or {}