feat: release v1.3.0 - QuestieLearner Confidence & Tiered Pruning Engine

This commit is contained in:
Xurkon
2026-03-17 22:33:01 -05:00
parent 7f16d31294
commit b0f8ba22e7
20 changed files with 1540 additions and 199 deletions
+21 -9
View File
@@ -914,7 +914,17 @@ function QuestieTracker:Update()
-- Set Quest Title - This handles the "Auto Minimize Completed Quests" option but we don't auto-minimize timed quests.
local coloredQuestName
if timedQuest then
if quest.isFallback or quest._isLogFallback then
-- Quest not in DB: use the name stored on the fallback object
local questName = quest.name or tostring(quest.Id)
if Questie.db.profile.trackerShowQuestLevel and quest.level and quest.level > 0 then
questName = "[" .. quest.level .. "] " .. questName
end
if Questie.db.profile.enableTooltipsQuestID then
questName = questName .. " (" .. quest.Id .. ")"
end
coloredQuestName = "|cFFFFFF00" .. questName .. "|r"
elseif timedQuest then
coloredQuestName = QuestieLib:GetColoredQuestName(quest.Id,
Questie.db.profile.trackerShowQuestLevel, false, false)
else
@@ -2290,10 +2300,15 @@ end
function QuestieTracker:UntrackQuestId(questId)
Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestieTracker:UntrackQuestId] - ", questId)
-- Always remove from tracked quests when manually untracking
Questie.db.char.TrackedQuests[questId] = nil
-- Also remove from auto-untracked so it doesn't get re-tracked
Questie.db.char.AutoUntrackedQuests[questId] = nil
if Questie.db.profile.autoTrackQuests then
-- In auto-track mode, mark the quest as explicitly hidden
Questie.db.char.AutoUntrackedQuests[questId] = true
Questie.db.char.TrackedQuests[questId] = nil
else
-- In manual-track mode, remove from tracked list
Questie.db.char.TrackedQuests[questId] = nil
Questie.db.char.AutoUntrackedQuests[questId] = nil
end
if Questie.db.profile.hideUntrackedQuestsMapIcons then
-- Hides objective icons for untracked quests.
@@ -2346,11 +2361,8 @@ function QuestieTracker:AQW_Insert(index, expire)
end
else
if Questie.db.char.AutoUntrackedQuests[questId] then
-- Quest was manually hidden — shift-click re-tracks it
Questie.db.char.AutoUntrackedQuests[questId] = nil
-- Add quest to the tracker
elseif IsShiftKeyDown() and QuestLogFrame:IsShown() then
Questie.db.char.AutoUntrackedQuests[questId] = true
end
end
+62 -3
View File
@@ -698,6 +698,41 @@ end
-- Intentionally NOT stored in QuestiePlayer.currentQuestlog so arrow/map/other modules
-- don't try to call DB-only methods on them.
TrackerUtils._fallbackQuests = TrackerUtils._fallbackQuests or {}
-- Reverse-lookup: given a localized zone name string, find the area ID from l10n.zoneLookup.
local function GetAreaIdByZoneName(zoneName)
if not zoneName or zoneName == "" then return 0 end
for _, zoneTable in pairs(l10n.zoneLookup) do
for areaId, name in pairs(zoneTable) do
if name == zoneName then return areaId end
end
end
return 0
end
-- Walk the quest log to find the zone header for a given questId.
-- In 3.3.5, zone names appear as isHeader=true entries above their quests.
-- Returns the header title string, or nil if not found.
local function GetQuestLogZoneName(questId)
local targetIndex = nil
local total = GetNumQuestLogEntries and GetNumQuestLogEntries() or 0
for i = 1, total do
local _, _, _, isHeader, _, _, _, logId = GetQuestLogTitle(i)
if not isHeader and logId == questId then
targetIndex = i
break
end
end
if not targetIndex then return nil end
for i = targetIndex, 1, -1 do
local title, _, _, isHeader = GetQuestLogTitle(i)
if isHeader and title and title ~= "" then
return title
end
end
return nil
end
-- Returns nil if the quest is not currently in the quest log.
function TrackerUtils:BuildFallbackQuest(questId)
for i = 1, GetNumQuestLogEntries() do
@@ -723,13 +758,24 @@ function TrackerUtils:BuildFallbackQuest(questId)
end
end
local zoneId = GetCurrentMapAreaID and GetCurrentMapAreaID() or 0
-- Walk backwards from i in the quest log to find the zone header.
-- This is the canonical 3.3.5 method: zone headers sit above their quests.
local zoneText = nil
for h = i, 1, -1 do
local hTitle, _, _, hIsHeader = GetQuestLogTitle(h)
if hIsHeader and hTitle and hTitle ~= "" then
zoneText = hTitle
break
end
end
local zoneId = (zoneText and GetAreaIdByZoneName(zoneText)) or 0
local quest = {
Id = questId,
name = title or ("Quest " .. questId),
level = level or 0,
zoneOrSort = zoneId,
zoneName = zoneText,
Objectives = objectives,
SpecialObjectives = {},
isFallback = true,
@@ -774,7 +820,7 @@ function TrackerUtils:GetSortedQuestIds()
local capturedId = qid
quest.IsComplete = function(self)
for i = 1, GetNumQuestLogEntries() do
local _, _, _, _, isHeader, _, isCompleteFlag, _, logId = GetQuestLogTitle(i)
local _, _, _, isHeader, _, isCompleteFlag, _, logId = GetQuestLogTitle(i)
if not isHeader and logId == capturedId then
return (isCompleteFlag == 1 or isCompleteFlag == true) and 1 or 0
end
@@ -784,10 +830,23 @@ function TrackerUtils:GetSortedQuestIds()
if not quest.Objectives then quest.Objectives = {} end
if not quest.SpecialObjectives then quest.SpecialObjectives = {} end
if not quest.ExtraObjectives then quest.ExtraObjectives = {} end
-- Use the quest log header walk (canonical 3.3.5 zone resolution)
if not quest.zoneName or quest.zoneName == "" then
local logZone = GetQuestLogZoneName(capturedId)
if logZone then
quest.zoneName = logZone
quest.zoneOrSort = GetAreaIdByZoneName(logZone) or 0
end
end
QuestiePlayer.currentQuestlog[qid] = quest
else
-- No object at all — build one from the log
local fallback = TrackerUtils._fallbackQuests[qid]
-- Re-build if cached without zone info (e.g. was built before log was ready)
if fallback and not fallback.zoneName then
TrackerUtils._fallbackQuests[qid] = nil
fallback = nil
end
if not fallback then
fallback = TrackerUtils:BuildFallbackQuest(qid)
if fallback then
@@ -807,7 +866,7 @@ function TrackerUtils:GetSortedQuestIds()
-- Create questDetails table keys and insert values
questDetails[qid] = {}
questDetails[qid].quest = quest
questDetails[qid].zoneName = _GetZoneName(quest.zoneOrSort, qid)
questDetails[qid].zoneName = quest.zoneName or _GetZoneName(quest.zoneOrSort, qid)
if quest:IsComplete() == 1 or (not next(quest.Objectives)) then
questDetails[qid].questCompletePercent = 1