fix(tracker): show (Complete) and correct level for DB-less custom quests

Quests with no static DB entry (e.g. Ascension custom quest 175206) made
GetColoredQuestName bail out early on a nil name lookup, before it ever
reached the (Complete)/(Failed) suffix logic. The tracker's existing
fallback for that case never added the suffix either, and it computed
level via QuestieLib.GetTbcLevel (static-DB-only), which silently defaults
to level 1 and then gets scaled from that wrong base by Ascension's level
scaling. Since these quests also auto-collapse once complete (hiding the
tracker's other "Quest Complete!" indicator line), the title was the only
place that could show completion status, and it was silently swallowing it.

- QuestieTracker.lua: the "no DB name" fallback branch now appends
  (Complete) under the same collapseCompletedQuests/isMinimizable rule as
  the normal path, and uses the live quest object's own level instead of
  the static-only lookup.
- QuestieQuest.lua (PopulateQuestLogInfo): re-syncs quest.level from a live
  GetQuestLogTitle scan every update, since QuestieDB.GetQuest caches quest
  objects permanently and QuestLogCache never tracked level at all.
- TrackerUtils.lua (GetCompletionText): guards the Description[1] fallback
  against quests that have no top-level Description array, which was
  throwing and aborting that quest's tracker render entirely.
This commit is contained in:
2026-07-15 17:20:42 +02:00
parent 75bebafaa9
commit 8089b5f08c
3 changed files with 46 additions and 7 deletions
+19
View File
@@ -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