From fdcd816235213a62fdf98be562a8a67051f4a142 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Mon, 27 Jan 2025 00:01:14 +0100 Subject: [PATCH] Give up on the frames --- Heimdall.lua | 14 ++- Modules/AchievementSniffer.lua | 197 +++++++++++++++++++++++---------- Modules/Config.lua | 81 ++++++++------ 3 files changed, 190 insertions(+), 102 deletions(-) diff --git a/Heimdall.lua b/Heimdall.lua index b681aaf..0919295 100644 --- a/Heimdall.lua +++ b/Heimdall.lua @@ -260,11 +260,12 @@ local function init() ---@class HeimdallAchievementSnifferConfig ---@field enabled boolean ---@field debug boolean - ---@field texture string - ---@field offsetX number - ---@field offsetY number + -----@field texture string + -----@field offsetX number + -----@field offsetY number ---@field rescan boolean ---@field scanInterval number + -----@field iconScale number --- Data --- ---@class HeimdallMessengerData @@ -519,11 +520,12 @@ local function init() achievementSniffer = { enabled = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "enabled" }, false), debug = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "debug" }, false), - texture = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "texture" }, "Aura53.tga"), - offsetX = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "offsetX" }, 0), - offsetY = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "offsetY" }, 0), + --texture = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "texture" }, "Aura53.tga"), + --offsetX = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "offsetX" }, 0), + --offsetY = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "offsetY" }, 0), rescan = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "rescan" }, false), scanInterval = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "scanInterval" }, 1), + --iconScale = shared.GetOrDefault(Heimdall_Data, { "config", "achievementSniffer", "iconScale" }, 1), }, addonPrefix = shared.GetOrDefault(Heimdall_Data, { "config", "addonPrefix" }, "HEIMDALL"), channelLocale = shared.GetOrDefault(Heimdall_Data, { "config", "channelLocale" }, {}), diff --git a/Modules/AchievementSniffer.lua b/Modules/AchievementSniffer.lua index 7573b7e..709832f 100644 --- a/Modules/AchievementSniffer.lua +++ b/Modules/AchievementSniffer.lua @@ -196,14 +196,117 @@ function shared.AchievementSniffer.Init() if not Heimdall_Achievements.players then Heimdall_Achievements.players = {} end if not Heimdall_Achievements.alreadySeen then Heimdall_Achievements.alreadySeen = {} end - local framePool = {} - for i = 1, 40 do - local frame = CreateFrame("Frame") - frame.custom = { busy = false } - local texture = frame:CreateTexture(nil, "ARTWORK") - texture:SetAllPoints(frame) - texture:SetTexture(TextureRoot .. Heimdall_Data.config.achievementSniffer.texture) - table.insert(framePool, frame) + --local framePool = {} + --for i = 1, 40 do + -- local frame = CreateFrame("Frame", "HeimdallAchievementSnifferNameplate" .. i, UIParent) + -- local texture = frame:CreateTexture(nil, "ARTWORK") + -- texture:SetAllPoints(frame) + -- texture:SetTexture(TextureRoot .. Heimdall_Data.config.achievementSniffer.texture) + -- frame.texture = texture + -- frame:Hide() + -- table.insert(framePool, frame) + --end + + ---@param name string + ---@return boolean + local function ShouldInspect(name) + local should = false + if not Heimdall_Achievements.players[name] then + if Heimdall_Data.config.achievementSniffer.debug then + print(string.format("[%s] Player %s does not have prior achievement data", ModuleName, name)) + end + should = true + end + if Heimdall_Achievements.alreadySeen[name] then + if Heimdall_Data.config.achievementSniffer.debug then + print(string.format("[%s] Player %s has already been seen", ModuleName, name)) + end + should = false + end + if Heimdall_Data.config.achievementSniffer.rescan then + if Heimdall_Data.config.achievementSniffer.debug then + print(string.format("[%s] Rescan is enabled", ModuleName)) + end + should = true + end + return should + end + + -- It's not working well AT ALL + -- I don't know how to do it better + -- It simply just does not work... + --local function UpdateFrames() + -- for i, frame in ipairs(framePool) do + -- local unit = "nameplate" .. i + -- if not UnitExists(unit) then + -- --if Heimdall_Data.config.achievementSniffer.debug then + -- -- print(string.format("[%s] Unit %s does not exist, hiding frame", ModuleName, unit)) + -- --end + -- frame:Hide() + -- else + -- --local unitFrame = _G[string.format("ElvUI_NamePlate%dHealthBar", i)] + -- local unitFrame = _G[string.format("NamePlate%d", i)] + -- if unitFrame == nil then + -- if Heimdall_Data.config.achievementSniffer.debug then + -- print(string.format("[%s] Unit frame for %s not found", ModuleName, unit)) + -- end + -- frame:Hide() + -- else + -- local unitName = UnitName(unit) + -- if Heimdall_Data.config.achievementSniffer.debug then + -- print(string.format("[%s] Unit frame found for %s (%s)", ModuleName, unit, unitName)) + -- end + -- frame:Show() + -- frame:SetSize(32, 32) + -- frame:SetFrameStrata("HIGH") + -- frame:SetFrameLevel(100) + -- frame:SetScale(Heimdall_Data.config.achievementSniffer.iconScale) + -- frame.texture:SetTexture(TextureRoot .. Heimdall_Data.config.achievementSniffer.texture) + -- frame:SetPoint("CENTER", unitFrame, "CENTER", + -- Heimdall_Data.config.achievementSniffer.offsetX, + -- Heimdall_Data.config.achievementSniffer.offsetY) + -- frame:SetParent(unitFrame) + -- frame:SetAlpha(1) + -- local exists = ShouldInspect(unitName) + -- if exists then + -- frame.texture:SetVertexColor(1, 0, 0, 1) + -- else + -- frame.texture:SetVertexColor(0, 1, 0, 1) + -- end + -- if Heimdall_Data.config.achievementSniffer.debug then + -- print(string.format("[%s] Frame updated for %s", ModuleName, unitName)) + -- end + -- end + -- end + -- end + --end + + ---@param unit string + local function TryInspect(unit) + local targetPlayer = UnitIsPlayer(unit) + if not targetPlayer then return end + local targetName = UnitName(unit) + local targetGuid = UnitGUID(unit) + guidMap[targetGuid] = targetName + + if not ShouldInspect(targetName) then + if Heimdall_Data.config.achievementSniffer.debug then + print(string.format("[%s] Not inspecting player: %s", ModuleName, targetName)) + end + return + end + + local canInspect = CheckInteractDistance(unit, 1) + if canInspect then + if Heimdall_Data.config.achievementSniffer.debug then + print(string.format("[%s] Inspecting player: %s", ModuleName, targetName)) + end + SetAchievementComparisonUnit(unit) + else + if Heimdall_Data.config.achievementSniffer.debug then + print(string.format("[%s] Cannot inspect player (too far?): %s", ModuleName, targetName)) + end + end end ---@param name string @@ -232,73 +335,27 @@ function shared.AchievementSniffer.Init() Heimdall_Achievements.players[name][aid] = data end end - end - - ---@param unit string - local function TryInspect(unit) - local targetPlayer = UnitIsPlayer(unit) - if not targetPlayer then return end - local targetName = UnitName(unit) - local targetGuid = UnitGUID(unit) - guidMap[targetGuid] = targetName - - local should = false - if not Heimdall_Achievements.players[targetName] then - if Heimdall_Data.config.achievementSniffer.debug then - print(string.format("[%s] Player %s does not have prior achievement data", ModuleName, targetName)) - end - should = true - end - if Heimdall_Achievements.alreadySeen[targetName] then - if Heimdall_Data.config.achievementSniffer.debug then - print(string.format("[%s] Player %s has already been seen", ModuleName, targetName)) - end - should = false - end - if Heimdall_Data.config.achievementSniffer.rescan then - if Heimdall_Data.config.achievementSniffer.debug then - print(string.format("[%s] Rescan is enabled", ModuleName)) - end - should = true - end - - if not should then - if Heimdall_Data.config.achievementSniffer.debug then - print(string.format("[%s] Not inspecting player: %s", ModuleName, targetName)) - end - return - end - - local canInspect = CheckInteractDistance(unit, 1) - if canInspect then - if Heimdall_Data.config.achievementSniffer.debug then - print(string.format("[%s] Inspecting player: %s", ModuleName, targetName)) - end - SetAchievementComparisonUnit(unit) - else - if Heimdall_Data.config.achievementSniffer.debug then - print(string.format("[%s] Cannot inspect player (too far?): %s", ModuleName, targetName)) - end - end + --UpdateFrames() end local nameplateFrame = CreateFrame("Frame") nameplateFrame:RegisterEvent("NAME_PLATE_UNIT_ADDED") nameplateFrame:RegisterEvent("NAME_PLATE_UNIT_REMOVED") nameplateFrame:SetScript("OnEvent", function(self, event, unit) + if not Heimdall_Data.config.achievementSniffer.enabled then return end if Heimdall_Data.config.achievementSniffer.debug then print(string.format("[%s] Event triggered: %s for unit: %s", ModuleName, event, unit)) end if event == "NAME_PLATE_UNIT_ADDED" then TryInspect(unit) - elseif event == "NAME_PLATE_UNIT_REMOVED" then - print("NAME_PLATE_UNIT_REMOVED", unit) end + --UpdateFrames() end) local inspectFrame = CreateFrame("Frame") inspectFrame:RegisterEvent("INSPECT_ACHIEVEMENT_READY") inspectFrame:SetScript("OnEvent", function(self, event, guid) + if not Heimdall_Data.config.achievementSniffer.enabled then return end local name = guidMap[guid] if not name then if Heimdall_Data.config.achievementSniffer.debug then @@ -311,8 +368,28 @@ function shared.AchievementSniffer.Init() end Scan(name) end) - - --local timer = + + + local function Tick() + C_Timer.NewTimer(Heimdall_Data.config.achievementSniffer.scanInterval, Tick) + if not Heimdall_Data.config.achievementSniffer.enabled then return end + + if Heimdall_Data.config.achievementSniffer.debug then + print(string.format("[%s] Scanning achievements for everyone on screen", ModuleName)) + end + for i = 1, 40 do + local unit = "nameplate" .. i + if UnitExists(unit) then + TryInspect(unit) + --else + -- if Heimdall_Data.config.achievementSniffer.debug then + -- print(string.format("[%s] Unit %s does not exist, nothing to inspect", ModuleName, unit)) + -- end + end + end + --UpdateFrames() + end + Tick() print("[Heimdall] AchievementSniffer loaded") end diff --git a/Modules/Config.lua b/Modules/Config.lua index 10e2d82..a57d5ca 100644 --- a/Modules/Config.lua +++ b/Modules/Config.lua @@ -2021,44 +2021,44 @@ function shared.Config.Init() enableButton:UpdateColor(Heimdall_Data.config.achievementSniffer.enabled) achievementSnifferConfigFrame:Add(enableButton, 2, 3) - local texture = CreateBasicSmallEditBox("HeimdallAchievementSnifferConfigTexture", - achievementSnifferConfigFrame.frame, shared._L("texture", Heimdall_Data.config.locale), - Heimdall_Data.config.achievementSniffer.texture, - function(self) - local text = self:GetText() - Heimdall_Data.config.achievementSniffer.texture = text - end) - achievementSnifferConfigFrame:Add(texture, 2, 3) + --local texture = CreateBasicSmallEditBox("HeimdallAchievementSnifferConfigTexture", + -- achievementSnifferConfigFrame.frame, shared._L("texture", Heimdall_Data.config.locale), + -- Heimdall_Data.config.achievementSniffer.texture, + -- function(self) + -- local text = self:GetText() + -- Heimdall_Data.config.achievementSniffer.texture = text + -- end) + --achievementSnifferConfigFrame:Add(texture, 2, 3) - local offsetX = CreateBasicSmallEditBox("HeimdallAchievementSnifferConfigOffsetX", - achievementSnifferConfigFrame.frame, shared._L("offsetX", Heimdall_Data.config.locale), - tostring(Heimdall_Data.config.achievementSniffer.offsetX), - function(self) - local text = self:GetText() - if string.match(text, "%d+") then - Heimdall_Data.config.achievementSniffer.offsetX = tonumber(text) - print("Offset X set to", tostring(text)) - else - print("Invalid offset X", text) - self:SetText(tostring(Heimdall_Data.config.achievementSniffer.offsetX)) - end - end) - achievementSnifferConfigFrame:Add(offsetX, 2, 3) + --local offsetX = CreateBasicSmallEditBox("HeimdallAchievementSnifferConfigOffsetX", + -- achievementSnifferConfigFrame.frame, shared._L("offsetX", Heimdall_Data.config.locale), + -- tostring(Heimdall_Data.config.achievementSniffer.offsetX), + -- function(self) + -- local text = self:GetText() + -- if string.match(text, "%d+") then + -- Heimdall_Data.config.achievementSniffer.offsetX = tonumber(text) + -- print("Offset X set to", tostring(text)) + -- else + -- print("Invalid offset X", text) + -- self:SetText(tostring(Heimdall_Data.config.achievementSniffer.offsetX)) + -- end + -- end) + --achievementSnifferConfigFrame:Add(offsetX, 2, 3) - local offsetY = CreateBasicSmallEditBox("HeimdallAchievementSnifferConfigOffsetY", - achievementSnifferConfigFrame.frame, shared._L("offsetY", Heimdall_Data.config.locale), - tostring(Heimdall_Data.config.achievementSniffer.offsetY), - function(self) - local text = self:GetText() - if string.match(text, "%d+") then - Heimdall_Data.config.achievementSniffer.offsetY = tonumber(text) - print("Offset Y set to", tostring(text)) - else - print("Invalid offset Y", text) - self:SetText(tostring(Heimdall_Data.config.achievementSniffer.offsetY)) - end - end) - achievementSnifferConfigFrame:Add(offsetY, 2, 3) + --local offsetY = CreateBasicSmallEditBox("HeimdallAchievementSnifferConfigOffsetY", + -- achievementSnifferConfigFrame.frame, shared._L("offsetY", Heimdall_Data.config.locale), + -- tostring(Heimdall_Data.config.achievementSniffer.offsetY), + -- function(self) + -- local text = self:GetText() + -- if string.match(text, "%d+") then + -- Heimdall_Data.config.achievementSniffer.offsetY = tonumber(text) + -- print("Offset Y set to", tostring(text)) + -- else + -- print("Invalid offset Y", text) + -- self:SetText(tostring(Heimdall_Data.config.achievementSniffer.offsetY)) + -- end + -- end) + --achievementSnifferConfigFrame:Add(offsetY, 2, 3) local rescan = CreateBasicButton("HeimdallAchievementSnifferConfigRescanButton", achievementSnifferConfigFrame.frame, shared._L("rescan", Heimdall_Data.config.locale), function() @@ -2076,6 +2076,15 @@ function shared.Config.Init() Heimdall_Data.config.achievementSniffer.scanInterval = tonumber(text) end) achievementSnifferConfigFrame:Add(scanInterval, 2, 3) + + --local iconScale = CreateBasicSmallEditBox("HeimdallAchievementSnifferConfigIconScale", + -- achievementSnifferConfigFrame.frame, shared._L("iconScale", Heimdall_Data.config.locale), + -- tostring(Heimdall_Data.config.achievementSniffer.iconScale), + -- function(self) + -- local text = self:GetText() + -- Heimdall_Data.config.achievementSniffer.iconScale = tonumber(text) + -- end) + --achievementSnifferConfigFrame:Add(iconScale, 2, 3) end -- Addon prefix