v9.7.2: Ebonhold Database integration and core logic refinements

This commit is contained in:
Xurkon
2026-02-14 21:13:44 -06:00
parent 0a2cc15641
commit 6ef85d4e2d
573 changed files with 1751730 additions and 2 deletions
+174
View File
@@ -0,0 +1,174 @@
---@class TrackerQuestTimers
local TrackerQuestTimers = QuestieLoader:CreateModule("TrackerQuestTimers")
-------------------------
--Import QuestieTracker modules.
-------------------------
---@type QuestieTracker
local QuestieTracker = QuestieLoader:ImportModule("QuestieTracker")
---@type TrackerLinePool
local TrackerLinePool = QuestieLoader:ImportModule("TrackerLinePool")
-------------------------
--Import Questie modules.
-------------------------
---@type QuestieCombatQueue
local QuestieCombatQueue = QuestieLoader:ImportModule("QuestieCombatQueue")
--- COMPATIBILITY ---
local GetQuestLogIndexByID = QuestieCompat.GetQuestLogIndexByID
local LSM30 = LibStub("LibSharedMedia-3.0")
local WatchFrame = QuestTimerFrame or WatchFrame
local blizzardTimerLocation = {}
local timer
-- Save the default location of the Blizzard QuestTimerFrame
if not (Questie.IsWotlk or QuestieCompat.Is335) then
blizzardTimerLocation = { QuestTimerFrame:GetPoint() }
end
function TrackerQuestTimers:Initialize()
Questie:Debug(Questie.DEBUG_DEVELOP, "[TrackerQuestTimers:Initialize]")
if QuestieTracker.started or (not Questie.db.profile.trackerEnabled) then
return
end
-- All Classic expansions
WatchFrame:HookScript("OnShow", function()
if Questie.db.profile.showBlizzardQuestTimer then
TrackerQuestTimers:ShowBlizzardTimer()
else
TrackerQuestTimers:HideBlizzardTimer()
end
end)
-- Pre-Classic WotLK
if not (Questie.IsWotlk or QuestieCompat.Is335) then
local timeElapsed = 0
WatchFrame:HookScript("OnUpdate", function(_, elapsed)
timeElapsed = timeElapsed + elapsed
if timeElapsed > 1 then
TrackerQuestTimers:UpdateTimerFrame()
timeElapsed = 0
end
end)
end
end
function TrackerQuestTimers:HideBlizzardTimer()
if Questie.IsWotlk or QuestieCompat.Is335 then
-- Classic WotLK
WatchFrame:Hide()
else
-- Classic WoW: This moves the QuestTimerFrame off screen. A faux Hide().
-- Otherwise, if the frame is hidden then the OnUpdate doesn't work.
WatchFrame:ClearAllPoints()
WatchFrame:SetPoint("TOP", "UIParent", -10000, -10000)
end
end
function TrackerQuestTimers:ShowBlizzardTimer()
if Questie.IsWotlk or QuestieCompat.Is335 then
-- Classic WotLK
WatchFrame:Show()
else
-- Classic WoW: This moves the QuestTimerFrame
-- back its default location. A faux Show()
if blizzardTimerLocation[1] then
WatchFrame:ClearAllPoints()
WatchFrame:SetPoint(unpack(blizzardTimerLocation))
end
end
end
---@param quest table
---@param frame frame
---@param clear boolean
---@return string|nil timeRemainingString, number|nil timeRemaining
function TrackerQuestTimers:GetRemainingTime(quest, frame, clear)
local timeRemainingString, timeRemaining = TrackerQuestTimers:GetRemainingTimeByQuestId(quest.Id)
if (timeRemainingString == nil) then
quest.timedBlizzardQuest = nil
quest.trackTimedQuest = false
return nil
end
if clear then
timer = nil
elseif frame then
timer = {
frame = frame,
questId = quest.Id
}
end
if timeRemaining then
if Questie.db.profile.showBlizzardQuestTimer then
TrackerQuestTimers:ShowBlizzardTimer()
quest.timedBlizzardQuest = true
quest.trackTimedQuest = false
else
TrackerQuestTimers:HideBlizzardTimer()
quest.timedBlizzardQuest = false
quest.trackTimedQuest = true
end
end
return timeRemainingString, timeRemaining
end
---@param questId number
---@return string timeRemainingString, number timeRemaining, nil
function TrackerQuestTimers:GetRemainingTimeByQuestId(questId)
local questLogIndex = GetQuestLogIndexByID(questId)
if (not questLogIndex) then
return nil
end
local questTimers = GetQuestTimers(questId)
if (not questTimers) then
return nil
end
if type(questTimers) == "number" then
local currentQuestLogSelection = GetQuestLogSelection()
SelectQuestLogEntry(questLogIndex)
-- We can't use GetQuestTimers because we don't know for which quest the timer is.
-- GetQuestLogTimeLeft returns the correct value though.
local timeRemaining = GetQuestLogTimeLeft(questLogIndex)
SelectQuestLogEntry(currentQuestLogSelection)
if timeRemaining ~= nil then
local timeRemainingString = SecondsToTime(timeRemaining, false, true)
if not strfind(timeRemainingString, "Seconds?") then
timeRemainingString = timeRemainingString .. " 0 Seconds"
end
return timeRemainingString, timeRemaining
else
return nil
end
else
Questie:Error("The return value of GetQuestTimers is not number, something is off. Please report this!")
end
return nil
end
function TrackerQuestTimers:UpdateTimerFrame()
if timer and (Questie.db.profile.trackerEnabled and Questie.db.char.isTrackerExpanded and (QuestieTracker.disableHooks ~= true)) then
local timeRemainingString, timeRemaining = TrackerQuestTimers:GetRemainingTimeByQuestId(timer.questId)
if timeRemainingString ~= nil then
Questie:Debug(Questie.DEBUG_SPAM, "[TrackerQuestTimers:UpdateTimerFrame] - ", timeRemainingString)
timer.frame.label:SetFont(LSM30:Fetch("font", Questie.db.profile.trackerFontObjective), Questie.db.profile.trackerFontSizeObjective, Questie.db.profile.trackerFontOutline)
timer.frame.label:SetText(Questie:Colorize(timeRemainingString, "blue"))
timer.frame:SetWidth(timer.frame.label:GetWidth() + ((34) - (18 - Questie.db.profile.trackerFontSizeQuest)) + Questie.db.profile.trackerFontSizeQuest)
else
Questie:Debug(Questie.DEBUG_SPAM, "[TrackerQuestTimers] Quest Timer Expired!")
return
end
end
end