From 7538b36b2a8768599984bc96662f71d22021bbee Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Sat, 13 Jul 2024 23:56:21 -0300 Subject: [PATCH] Added more tools to debug pets on '/details debug' and '/details mypets' --- Libs/DF/header.lua | 22 +-- Libs/DF/scrollbox.lua | 1 + boot.lua | 9 +- classes/container_actors.lua | 15 +- classes/container_pets.lua | 24 ++++ core/parser.lua | 27 +++- frames/window_debug.lua | 271 ++++++++++++++++++++++++++++++++++- functions/profiles.lua | 4 + functions/slash.lua | 3 + startup.lua | 14 +- 10 files changed, 366 insertions(+), 24 deletions(-) diff --git a/Libs/DF/header.lua b/Libs/DF/header.lua index b988f389..3910b981 100644 --- a/Libs/DF/header.lua +++ b/Libs/DF/header.lua @@ -13,17 +13,17 @@ local wipe = wipe --definitions ---@class df_headercolumndata : table ----@field key string ----@field name string ----@field icon string ----@field texcoord table ----@field text string ----@field canSort boolean ----@field selected boolean ----@field width number ----@field height number ----@field align string ----@field offset number +---@field key string? +---@field name string? +---@field icon string? +---@field texcoord table? +---@field text string? +---@field canSort boolean? +---@field selected boolean? +---@field width number? +---@field height number? +---@field align string? +---@field offset number? ---@class df_headerchild : uiobject ---@field FramesToAlign table diff --git a/Libs/DF/scrollbox.lua b/Libs/DF/scrollbox.lua index 173ea08c..3c3959fe 100644 --- a/Libs/DF/scrollbox.lua +++ b/Libs/DF/scrollbox.lua @@ -131,6 +131,7 @@ detailsFramework.ScrollBoxFunctions = { ---@return frame line The line object at the specified index. GetLine = function(self, lineIndex) local line = self.Frames[lineIndex] + --print(self, line, line and line:GetName(), lineIndex, self:GetName()) if (line) then line._InUse = true end diff --git a/boot.lua b/boot.lua index afa462b7..d22e51e2 100644 --- a/boot.lua +++ b/boot.lua @@ -73,6 +73,8 @@ DamageSpellsCache = {} } + Details222.StartUp = {} + Details222.Unknown = _G["UNKNOWN"] --namespace color @@ -115,7 +117,12 @@ Details222.DamageSpells = {} --namespace for texture Details222.Textures = {} - Details222.Debug = {} + + Details222.Debug = { + DebugPets = false, + DebugPlayerPets = false, + } + Details222.Tvs = tvs --namespace for pet Details222.Pets = {} diff --git a/classes/container_actors.lua b/classes/container_actors.lua index 073c61a2..f67d22db 100644 --- a/classes/container_actors.lua +++ b/classes/container_actors.lua @@ -639,7 +639,7 @@ end ---@param actorName string ---@param actorFlags number ---@param bShouldCreateActor boolean - ---@return table|nil, table|nil, string|nil + ---@return actor|nil, actor|nil, actorname|nil function actorContainer:PegarCombatente(actorSerial, actorName, actorFlags, bShouldCreateActor) return self:GetOrCreateActor(actorSerial, actorName, actorFlags, bShouldCreateActor) end @@ -648,7 +648,7 @@ end ---@param actorName string ---@param actorFlags number ---@param bShouldCreateActor boolean - ---@return table|nil, table|nil, string|nil + ---@return actor|nil, actor|nil, actorname|nil function actorContainer:GetOrCreateActor(actorSerial, actorName, actorFlags, bShouldCreateActor) --need to check if the actor is a pet local petOwnerObject @@ -657,12 +657,23 @@ end --check if this actor is a pet and the pet is in the pet cache if (petContainer.IsPetInCache(actorSerial)) then --this is a registered pet --hashName is "petName " + --actorSerial: petGuid, actorName: petName local hashName, ownerName, ownerGuid, ownerFlag = petContainer.GetOwner(actorSerial, actorName) --hashName, ownerName, ownerGuid, ownerFlags + if (hashName and ownerName and ownerGuid and ownerGuid ~= actorSerial and ownerFlag) then actorName = hashName petOwnerObject = self:PegarCombatente(ownerGuid, ownerName, ownerFlag, true) end + if (Details222.Debug.DebugPets or Details222.Debug.DebugPlayerPets) then + Details:Msg("DebugPets|ActorContainer|petContainer.IsPetInCache(actorSerial) = true") + if (hashName) then + Details:Msg("DebugPets|ActorContainer|Owner Found In Pet Cache|OwnerName:", ownerName, "Actor Hash:", hashName, "petOwnerObject:", petOwnerObject) + else + Details:Msg("DebugPets|ActorContainer|Pet Is Orphan|petContainer.GetOwner(", actorSerial, actorName, ") == nil") + end + end + --this actor isn't in the pet cache elseif (not petBlackList[actorSerial]) then --check if is a pet --try to find the owner diff --git a/classes/container_pets.lua b/classes/container_pets.lua index fa56d7b1..8378d527 100644 --- a/classes/container_pets.lua +++ b/classes/container_pets.lua @@ -100,6 +100,22 @@ function Details.DebugPets() dumpt(toShow) end +function Details.DebugMyPets() + local amountPets = 0 + local myPets = {} + local playerGUID = UnitGUID("player") + + for petGuid, petData in pairs(petContainer.Pets) do + ---@cast petData petdata + if (petData.ownerGuid == playerGUID) then + myPets[petGuid] = petData + amountPets = amountPets + 1 + end + end + + dumpt(myPets) +end + ---add a pet guid into the ignored list, when a pet is ignored the system will not try to find its owner as it already failed to find it once ---@param petGuid guid function petContainer.IgnorePet(petGuid) @@ -119,6 +135,7 @@ end ---return the pet data from the cache by passing the pet guid ---@param petGuid guid +---@return petdata? function petContainer.GetPetInfo(petGuid) return petContainer.Pets[petGuid] end @@ -161,6 +178,13 @@ function petContainer.AddPet(petGuid, petName, petFlags, ownerGuid, ownerName, o return end + if (Details222.Debug.DebugPets) then + Details:Msg("petContainer.AddPet", petGuid, petName, petFlags, ownerGuid, ownerName, ownerFlags, summonSpellId) + + elseif (Details222.Debug.DebugPlayerPets and ownerName == Details.playername) then + Details:Msg("petContainer.AddPet", petGuid, petName, petFlags, ownerGuid, ownerName, ownerFlags, summonSpellId) + end + --print("====================================") --print(petName) --print(debugstack()) diff --git a/core/parser.lua b/core/parser.lua index 1b3762af..2bcb3fdb 100755 --- a/core/parser.lua +++ b/core/parser.lua @@ -664,6 +664,14 @@ if (not damage_cache[ownerActor.serial] and ownerActor.serial ~= "") then damage_cache[ownerActor.serial] = ownerActor end + + if (ownerActor) then + if (Details222.Debug.DebugPets) then + Details:Msg("Parser|DebugPets|ActorCreated|PetName:", sourceActor:Name(), "sourceName:", sourceName, "ownerName:", ownerActor:Name()) + elseif (Details222.Debug.DebugPlayerPets and sourceName == Details.playername) then + Details:Msg("Parser|DebugPets|ActorCreated|PetName:", sourceActor:Name(), "sourceName:", sourceName, "ownerName:", ownerActor:Name()) + end + end else --there's no owner actor if (sourceFlags) then @@ -680,6 +688,19 @@ end end + --if a owner actor isn't found and debug pets is enabled and this is a pet or guardian + if (not ownerActor and (Details222.Debug.DebugPets or Details222.Debug.DebugPlayerPets) and bitBand(sourceFlags, 0x00003000) ~= 0) then --OBJECT_TYPE_PETGUARDIAN + --note: the actor wasn't found in the cache and got created + Details:Msg("DebugPets|Parser|Owner Actor Not Found|", sourceName, sourceSerial, sourceFlags, bitBand(sourceFlags, 0x00003000) ~= 0) + + ---@type petdata? + local petData = petContainer.GetPetInfo(sourceSerial) + if (sourceName == "Fire Spirit") then + Details:Msg("DebugPets|Parser|PetData|Exists?", petData, sourceName, "Dumping petData on dumpt.") + dumpt(petData) + end + end + elseif (ownerActor) then --has (sourceActor and ownerActor) --sourceName is the name of the pet local cachedPetName = names_cache[sourceSerial] @@ -1675,6 +1696,10 @@ end end + if (Details222.Debug.DebugPets) then + + end + --differenciate army and apoc pets for DK if (spellId == 42651) then --army of the dead dk_pets_cache.army[petSerial] = sourceName @@ -5693,7 +5718,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 local playerLogin = CreateFrame("frame") playerLogin:RegisterEvent("PLAYER_LOGIN") playerLogin:SetScript("OnEvent", function() - Details:StartMeUp() + Details222.StartUp.StartMeUp() end) function Details.parser_functions:PET_BATTLE_OPENING_START(...) diff --git a/frames/window_debug.lua b/frames/window_debug.lua index 2d25ed2a..d2f9eef6 100644 --- a/frames/window_debug.lua +++ b/frames/window_debug.lua @@ -6,19 +6,21 @@ local detailsFramework = DetailsFramework local _ --frame options -local windowWidth = 800 +local windowWidth = 1024 local windowHeight = 670 -local scrollWidth = 790 +local scrollWidth = 990 local scrollHeightBuff = 400 local scrollHeightDebuff = 200 local scrollLineAmountBuff = 20 local scrollLineAmountDebuff = 10 local scrollLineHeight = 20 +local amountOfLines = 26 +local lineHeight = 19 local createDebugOptionsFrame = function() --create a panel --parent, width, height, title, frameName, panelOptions - local debugOptionsPanel = DetailsFramework:CreateSimplePanel(UIParent, windowWidth, windowHeight, "Details! Debug Options", "DetailsDebugOptionsPanel", {}) + local debugOptionsPanel = DetailsFramework:CreateSimplePanel(UIParent, windowWidth/2, windowHeight, "Details! Debug Options", "DetailsDebugOptionsPanel", {}) detailsFramework:ApplyStandardBackdrop(debugOptionsPanel) @@ -142,6 +144,54 @@ local createDebugOptionsFrame = function() name = "Encounter Storage Debug", desc = "Internal tests of the storage feature.", }, + + {type = "blank"}, + + {--pet debug + type = "toggle", + get = function() + return Details222.Debug.DebugPets + end, + set = function(self, fixedparam, value) + Details222.Debug.DebugPets = value + if (Details222.Debug.DebugPets) then + Details:Msg("Pet Debug is ON.") + Details:ShowCleuDebugWindow(function(token, who_serial, who_name, who_flags, target_serial, target_name, target_flags, A1, A2, A3) + if (token == "SPELL_SUMMON") then + return true + end + end) + else + Details:Msg("Pet Debug is OFF.") + end + end, + name = "General Pet Debug", + desc = "General Pet Debug", + }, + + {--pet debug + type = "toggle", + get = function() + return Details222.Debug.DebugPlayerPets + end, + set = function(self, fixedparam, value) + Details222.Debug.DebugPlayerPets = value + if (Details222.Debug.DebugPlayerPets) then + Details:Msg("Player Pet Debug is ON.") + Details:ShowCleuDebugWindow(function(token, who_serial, sourceName, who_flags, target_serial, target_name, target_flags, A1, A2, A3) + if (token == "SPELL_SUMMON") then + if (sourceName == Details.playername) then + return true + end + end + end) + else + Details:Msg("Player Pet Debug is OFF.") + end + end, + name = "Player Pets Debug", + desc = "Player Pets Debug", + }, } options.always_boxfirst = true @@ -164,4 +214,219 @@ function Details.ShowDebugOptionsPanel() else createDebugOptionsFrame() end +end + + +function Details:ShowCleuDebugWindow(filterFunction) + if (not DetailsCleuDebugWindow) then + --create a simple panel from the framework with size of 400 x 800 + --this panel will have a scrollbox with 20 lines, these lines will show data + --each line will have an icon, 6 text entries and 3 labels + --the scrollbox is attached to a header frame from the framework for organization + + --create a panel + --parent, width, height, title, frameName, panelOptions + local cleuDebugPanel = detailsFramework:CreateSimplePanel(UIParent, windowWidth, windowHeight, "Details! Cleu Debug", "DetailsCleuDebugWindow", {}) + detailsFramework:ApplyStandardBackdrop(cleuDebugPanel) + + cleuDebugPanel:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + + cleuDebugPanel:SetScript("OnShow", function() + cleuDebugPanel:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + end) + + cleuDebugPanel:SetScript("OnHide", function() + cleuDebugPanel:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + end) + + --disable the buil-in mouse integration of the simple panel, doing this to use LibWindow-1.1 as the window management + cleuDebugPanel:SetScript("OnMouseDown", nil) + cleuDebugPanel:SetScript("OnMouseUp", nil) + + --need to create a window frame button that only accepts right clicks and when clicked it'll hide the panel + + --register in the libWindow + local LibWindow = LibStub("LibWindow-1.1") + LibWindow.RegisterConfig(cleuDebugPanel, Details.cleu_debug_panel.position) + LibWindow.MakeDraggable(cleuDebugPanel) + LibWindow.RestorePosition(cleuDebugPanel) + + --scale bar + local scaleBar = detailsFramework:CreateScaleBar(cleuDebugPanel, Details.cleu_debug_panel.scaletable) + cleuDebugPanel:SetScale(Details.cleu_debug_panel.scaletable.scale) + + --status bar + local statusBar = detailsFramework:CreateStatusBar(cleuDebugPanel) + statusBar.text = statusBar:CreateFontString(nil, "overlay", "GameFontNormal") + statusBar.text:SetPoint("left", statusBar, "left", 5, 0) + statusBar.text:SetText("By Terciob | Part of Details! Damage Meter") + detailsFramework:SetFontSize(statusBar.text, 11) + detailsFramework:SetFontColor(statusBar.text, "gray") + + ---@type df_headercolumndata[] + local headerTable = { + {text = "", width = 20}, + {text = "Source Name", width = 150}, + {text = "Spell Name", width = 150}, + {text = "Pet Name", width = 150}, + {text = "Spell ID", width = 50}, + {text = "Data 1", width = 150}, + {text = "Data 2", width = 150}, + {text = "Data 3", width = 150}, + } + + local headerOptions = { + padding = 2, + } + + ---@type df_headerframe + local headerFrame = detailsFramework:CreateHeader(cleuDebugPanel, headerTable, headerOptions) + cleuDebugPanel.Header = headerFrame + + local onRefreshScroll = function(self, data, offSet, totalLines) + for i = 1, totalLines do + local index = i + offSet + local spellData = data[index] + if (spellData) then + local time, token, sourceGUID, sourceName, sourceFlags, targetGUID, targetName, targetFlags, A1, A2, A3 = unpack(spellData) + + local line = self:GetLine(i) + if (line) then + line.Icon:SetTexture(select(3, Details222.GetSpellInfo(A1))) + line.casterNameText:SetText(sourceName) + line.spellNameText:SetText(A2) + line.targetNameText:SetText(targetName) + line.spellIdText:SetText(A1) + + if (Details222.Debug.DebugPets or Details222.Debug.DebugPlayerPets) then + local petContainer = Details222.PetContainer + ---@type petdata? + local petData = petContainer.GetPetInfo(targetGUID) + if (petData) then + --print(targetGUID, petData.ownerName, petData.petName, petData.petFlags) + line.data1Text:SetText(petData.ownerName) + line.data2Text:SetText(petData.petName) + line.data3Text:SetText(petData.petFlags) + else + line.data1Text:SetText("Pet not found") + line.data2Text:SetText("") + line.data3Text:SetText("") + end + else + line.data1Text:SetText("") + line.data2Text:SetText("") + line.data3Text:SetText("") + end + end + end + end + end + + local dropdownTemplate = DetailsFramework:GetTemplate("dropdown", "OPTIONS_DROPDOWNDARK_TEMPLATE") + + local createLineFunc = function(self, index) + --create the line for a scrollbox + local line = CreateFrame("frame", "$parentLine" .. index, self, "BackdropTemplate") + --set the point using the line index, line height and scrollbox width + line:SetPoint("topleft", self, "topleft", 1, -((index-1)*(lineHeight+1)) - 1) + line:SetSize(scrollWidth - 2, lineHeight) + + --import functions from the header feature + detailsFramework:Mixin(line, detailsFramework.HeaderFunctions) + + --create the spell icon texture + local icon = line:CreateTexture(nil, "overlay") + icon:SetSize(lineHeight-2, lineHeight-2) + + --create the caster name text entry + local casterNameText = DetailsFramework:CreateTextEntry(line, function()end, headerTable[2].width, lineHeight, _, _, _, dropdownTemplate) + + --create the spell name text entry + local spellNameText = DetailsFramework:CreateTextEntry(line, function()end, headerTable[3].width, lineHeight, _, _, _, dropdownTemplate) + + --create the target name text entry + local targetNameText = DetailsFramework:CreateTextEntry(line, function()end, headerTable[4].width, lineHeight, _, _, _, dropdownTemplate) + + --create the spell id text entry + local spellIdText = DetailsFramework:CreateTextEntry(line, function()end, headerTable[5].width, lineHeight, _, _, _, dropdownTemplate) + + --create a negeric text entry + local data1Text = DetailsFramework:CreateTextEntry(line, function()end, headerTable[6].width, lineHeight, _, _, _, dropdownTemplate) + --create a negeric text entry + local data2Text = DetailsFramework:CreateTextEntry(line, function()end, headerTable[7].width, lineHeight, _, _, _, dropdownTemplate) + --create a negeric text entry + local data3Text = DetailsFramework:CreateTextEntry(line, function()end, headerTable[8].width, lineHeight, _, _, _, dropdownTemplate) + + line:AddFrameToHeaderAlignment(icon) + line:AddFrameToHeaderAlignment(casterNameText) + line:AddFrameToHeaderAlignment(spellNameText) + line:AddFrameToHeaderAlignment(targetNameText) + line:AddFrameToHeaderAlignment(spellIdText) + line:AddFrameToHeaderAlignment(data1Text) + line:AddFrameToHeaderAlignment(data2Text) + line:AddFrameToHeaderAlignment(data3Text) + + line:AlignWithHeader(headerFrame, "left") + + line.Icon = icon + line.casterNameText = casterNameText + line.spellNameText = spellNameText + line.targetNameText = targetNameText + line.spellIdText = spellIdText + line.data1Text = data1Text + line.data2Text = data2Text + line.data3Text = data3Text + + return line + end + + cleuDebugPanel.ScrollBoxData = {} + --create a scrollbox + ---@type df_scrollbox + local scrollBox = detailsFramework:CreateScrollBox(cleuDebugPanel, "$parentScrollBox", onRefreshScroll, cleuDebugPanel.ScrollBoxData, scrollWidth, windowHeight - 60, amountOfLines, lineHeight) + scrollBox:SetPoint("topleft", cleuDebugPanel, "topleft", 5, -46) + cleuDebugPanel.ScrollBox = scrollBox + + cleuDebugPanel.Header:SetPoint("bottomleft", scrollBox, "topleft", 0, 2) + + for i = 1, amountOfLines do + --just call the line creation function with the scrollbox as the parent argument and the line index + scrollBox:CreateLine(createLineFunc) + end + + local bHasScheduled = false + + cleuDebugPanel:SetScript("OnEvent", function() + local time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12 = CombatLogGetCurrentEventInfo() + local addLine = filterFunction(token, who_serial, who_name, who_flags, target_serial, target_name, target_flags, A1, A2, A3) + if (addLine) then + table.insert(cleuDebugPanel.ScrollBoxData, { + GetTime() - cleuDebugPanel.Time, + token, + who_serial, + who_name, + who_flags, + target_serial, + target_name, + target_flags, + A1, + A2, + A3 + }) + + if (not bHasScheduled) then + bHasScheduled = true + C_Timer.After(0.1, function() + bHasScheduled = false + scrollBox:Refresh() + end) + end + end + end) + end + + DetailsCleuDebugWindow:Show() + table.wipe(DetailsCleuDebugWindow.ScrollBoxData) --clear the data + DetailsCleuDebugWindow.ScrollBox:Refresh() + DetailsCleuDebugWindow.Time = GetTime() end \ No newline at end of file diff --git a/functions/profiles.lua b/functions/profiles.lua index b656c13d..ebf9c0c9 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -1185,6 +1185,10 @@ local default_global_data = { damage_scroll_position = { scale = 1, }, + cleu_debug_panel = { + position = {}, + scaletable = {scale = 1}, + }, data_wipes_exp = { ["9"] = false, ["10"] = false, diff --git a/functions/slash.lua b/functions/slash.lua index 691805b7..3a22c4b8 100644 --- a/functions/slash.lua +++ b/functions/slash.lua @@ -389,6 +389,9 @@ function SlashCmdList.DETAILS (msg, editbox) elseif (msg == "pets") then Details.DebugPets() + elseif (msg == "mypets") then + Details.DebugMyPets() + elseif (msg == "model") then local frame = CreateFrame("PlayerModel"); frame:SetPoint("center",UIParent,"center"); diff --git a/startup.lua b/startup.lua index edabed1f..e60144a8 100644 --- a/startup.lua +++ b/startup.lua @@ -1,15 +1,11 @@ ---[=[ - Details startup file - The function Details:StartMeUp() is called when the addon is fully loaded with saved variables and profiles ---]=] - local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details") local _ local tocName, Details222 = ... +local detailsFramework = DetailsFramework --start funtion -function Details:StartMeUp() +function Details222.StartUp.StartMeUp() if (Details.AndIWillNeverStop) then return end @@ -351,6 +347,12 @@ function Details:StartMeUp() Details:AddDefaultCustomDisplays() end Details:FillUserCustomSpells() + + if (C_CVar) then + if (not InCombatLockdown() and DetailsFramework.IsDragonflightAndBeyond()) then + C_CVar.SetCVar("cameraDistanceMaxZoomFactor", 2.6) + end + end end --check is this is the first run of this version