diff --git a/Modules/Quest/QuestieQuest.lua b/Modules/Quest/QuestieQuest.lua index 34d070d..4dae6a8 100644 --- a/Modules/Quest/QuestieQuest.lua +++ b/Modules/Quest/QuestieQuest.lua @@ -1,5 +1,6 @@ --- COMPATIBILITY --- local IsQuestFlaggedCompleted = QuestieCompat.IsQuestFlaggedCompleted or C_QuestLog.IsQuestFlaggedCompleted +local GetQuestLogTitle = QuestieCompat.GetQuestLogTitle ---@class QuestieQuest local QuestieQuest = QuestieLoader:CreateModule("QuestieQuest") @@ -2305,6 +2306,24 @@ function QuestieQuest:PopulateQuestLogInfo(quest) end end + -- Sync level with the live quest log. QuestieDB.GetQuest permanently caches quest + -- objects (Database/QuestieDB.lua:1752 `if _QuestieDB.questCache[questId] then return + -- ... end`), so quest.level is otherwise frozen at whatever value was computed the + -- first time this quest was cached. QuestLogCache.questLog_DO_NOT_MODIFY doesn't carry + -- a level field at all, so read it straight from GetQuestLogTitle. On servers with + -- dynamic quest level scaling (e.g. Ascension), the effective level can change after + -- caching (player level-up, scaling option toggled), so re-sync it here every time. + if GetQuestLogTitle then + local questIndex = GetQuestLogIndexByID and GetQuestLogIndexByID(quest.Id) + if questIndex and questIndex > 0 then + local _, liveLevel = GetQuestLogTitle(questIndex) + if liveLevel and liveLevel > 0 and liveLevel ~= quest.level then + quest.level = liveLevel + quest.questLevel = liveLevel + end + end + end + -- Live fallback quests (no static DB entry) manage their own Objectives. -- Their per-objective Update() functions read directly from QuestLogCache. if quest._isLogFallback then diff --git a/Modules/Tracker/QuestieTracker.lua b/Modules/Tracker/QuestieTracker.lua index 3e9cd19..f9adc69 100644 --- a/Modules/Tracker/QuestieTracker.lua +++ b/Modules/Tracker/QuestieTracker.lua @@ -1030,6 +1030,13 @@ function QuestieTracker:Update() questName = questName .. " (" .. quest.Id .. ")" end coloredQuestName = "|cFFFFFF00" .. questName .. "|r" + -- Fallback quests (e.g. custom server quests not in QuestieDB) skip + -- GetColoredQuestName entirely since it needs a DB name lookup, so they + -- never got the (Complete) suffix DB quests get under the same setting. + if Questie.db.profile.collapseCompletedQuests and isMinimizable then + coloredQuestName = coloredQuestName .. " " .. + Questie:Colorize("(" .. l10n("Complete") .. ")", "green") + end elseif timedQuest then coloredQuestName = QuestieLib:GetColoredQuestName(quest.Id, Questie.db.profile.trackerShowQuestLevel, false, false) @@ -1044,18 +1051,25 @@ function QuestieTracker:Update() -- server quest not yet in the static DB), so GetColoredQuestName -- returned nil -- fall back instead of SetText(nil) blanking the -- title line while its objectives still render normally below it. - -- Level/tag lookups don't require a DB "name" entry, so reuse the - -- same formatting helper as the normal path to keep the "[level]" - -- prefix consistent with quests that do have a DB name. + -- Use the live quest object's own level (kept in sync by + -- QuestieQuest:PopulateQuestLogInfo) instead of QuestieLib.GetTbcLevel, + -- which queries the static DB only: for a quest with no DB entry it + -- silently defaults to level 1, and Ascension's scaling then scales + -- that wrong base instead of the quest's real level. local fallbackName = quest.name or tostring(quest.Id) - if Questie.db.profile.trackerShowQuestLevel then - local level = QuestieLib.GetTbcLevel(quest.Id) - fallbackName = QuestieLib:GetQuestString(quest.Id, fallbackName, level, false) + if Questie.db.profile.trackerShowQuestLevel and quest.level and quest.level > 0 then + fallbackName = QuestieLib:GetQuestString(quest.Id, fallbackName, quest.level, false) end if Questie.db.profile.enableTooltipsQuestID then fallbackName = fallbackName .. " (" .. quest.Id .. ")" end coloredQuestName = "|cFFFFFF00" .. fallbackName .. "|r" + -- Same suffix rule as the normal (DB) branch -- GetColoredQuestName + -- never got a chance to run since it bailed out on the missing name. + if Questie.db.profile.collapseCompletedQuests and isMinimizable then + coloredQuestName = coloredQuestName .. " " .. + Questie:Colorize("(" .. l10n("Complete") .. ")", "green") + end end line.label:SetText(coloredQuestName) diff --git a/Modules/Tracker/TrackerUtils.lua b/Modules/Tracker/TrackerUtils.lua index 433c944..dc03bea 100644 --- a/Modules/Tracker/TrackerUtils.lua +++ b/Modules/Tracker/TrackerUtils.lua @@ -379,8 +379,14 @@ function TrackerUtils:GetCompletionText(quest) if completionText then return completionText - else + elseif quest.Description and quest.Description[1] then return quest.Description[1]:gsub("%.", "") + else + -- Fallback/custom quests (e.g. server quests not in QuestieDB) have no + -- top-level Description array. Without this, indexing quest.Description[1] + -- throws and aborts the whole tracker render for that quest via the + -- caller's pcall, freezing its line on the last successful render. + return nil end end