Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cf67ceb474 | |||
| de270a0e8e | |||
| c6019ea823 | |||
| 706fc0b8ad | |||
| c2b1b82b2f |
@@ -553,6 +553,10 @@ function _QuestEventHandler:QuestLogUpdate()
|
||||
doFullQuestLogScan = false
|
||||
-- Function call updates doFullQuestLogScan. Order matters.
|
||||
_QuestEventHandler:UpdateAllQuests()
|
||||
-- Also on this path: UpdateAllQuests only looks at quests still in the log, so a removal
|
||||
-- that fired no event of its own would sit there unnoticed for as long as full scans keep
|
||||
-- being asked for.
|
||||
_QuestEventHandler:CleanupRemovedQuestsFallback()
|
||||
else
|
||||
_QuestEventHandler:CleanupRemovedQuestsFallback()
|
||||
QuestieCombatQueue:Queue(function()
|
||||
@@ -666,7 +670,9 @@ function _QuestEventHandler:CleanupRemovedQuestsFallback()
|
||||
if QuestiePlayer and QuestiePlayer.currentQuestlog then
|
||||
local removedQuestIds = {}
|
||||
for questId in pairs(QuestiePlayer.currentQuestlog) do
|
||||
if questId and questId > 0 and (not gameQuestIds[questId]) then
|
||||
-- Typed check: a stray string key (saved variables have produced them) would other-
|
||||
-- wise error on the comparison and take the whole pass down with it.
|
||||
if type(questId) == "number" and questId > 0 and (not gameQuestIds[questId]) then
|
||||
removedQuestIds[#removedQuestIds + 1] = questId
|
||||
end
|
||||
end
|
||||
@@ -679,7 +685,12 @@ function _QuestEventHandler:CleanupRemovedQuestsFallback()
|
||||
local wasTurnedIn = questLog[questId] and questLog[questId].state == QUEST_LOG_STATES.QUEST_TURNED_IN
|
||||
local wasAlreadyComplete = Questie.db.char.complete and Questie.db.char.complete[questId]
|
||||
local completeAtRemoval = QuestieDB.IsComplete(questId)
|
||||
local shouldComplete = wasTurnedIn or wasAlreadyComplete or completeAtRemoval == 1
|
||||
-- The server's own record, and the only one that knows anything about a quest the
|
||||
-- database has never heard of: QuestieDB.IsComplete cannot answer for those, so an
|
||||
-- Ascension quest the server finished by itself would otherwise be filed as abandoned.
|
||||
local serverFlaggedComplete = IsQuestFlaggedCompleted and IsQuestFlaggedCompleted(questId)
|
||||
local shouldComplete = wasTurnedIn or wasAlreadyComplete or completeAtRemoval == 1 or
|
||||
serverFlaggedComplete
|
||||
|
||||
QuestLogCache.RemoveQuest(questId)
|
||||
QuestieQuest:SetObjectivesDirty(questId)
|
||||
|
||||
@@ -845,11 +845,7 @@ function QuestieTracker:Update()
|
||||
-- Setup local QuestieTracker:Update vars
|
||||
local trackerFontSizeZone = Questie.db.profile.trackerFontSizeZone
|
||||
local trackerFontSizeQuest = Questie.db.profile.trackerFontSizeQuest
|
||||
-- The supertrack button sits at the very left of a quest line, so the whole quest list is
|
||||
-- indented past it: otherwise it is clipped by the tracker's left edge and collides with the
|
||||
-- quest item buttons, which share that gutter.
|
||||
local superTrackMarginLeft = TrackerLinePool.GetSuperTrackMarginReserve()
|
||||
local questMarginLeft = (trackerMarginLeft + trackerMarginRight) - (18 - trackerFontSizeQuest) + superTrackMarginLeft
|
||||
local questMarginLeft = (trackerMarginLeft + trackerMarginRight) - (18 - trackerFontSizeQuest)
|
||||
local objectiveMarginLeft = questMarginLeft + trackerFontSizeQuest
|
||||
local questItemButtonSize = 12 + trackerFontSizeQuest
|
||||
local objectiveColor = Questie.db.profile.trackerColorObjectives
|
||||
@@ -899,11 +895,9 @@ function QuestieTracker:Update()
|
||||
line.criteriaMark:Hide()
|
||||
line.playButton:Hide()
|
||||
|
||||
-- Setup Zone Label. Indented like the quest lines below it: the supertrack
|
||||
-- buttons overflow their own line at larger sizes, and the zone label is the
|
||||
-- only text that would otherwise share that gutter with them.
|
||||
-- Setup Zone Label
|
||||
line.label:ClearAllPoints()
|
||||
line.label:SetPoint("TOPLEFT", line, "TOPLEFT", superTrackMarginLeft, 0)
|
||||
line.label:SetPoint("TOPLEFT", line, "TOPLEFT", 0, 0)
|
||||
|
||||
-- Set Zone Title and default Min/Max states
|
||||
if Questie.db.char.collapsedZones[zoneName] then
|
||||
@@ -930,19 +924,19 @@ function QuestieTracker:Update()
|
||||
|
||||
-- Check and measure Zone Label text width and update tracker width
|
||||
QuestieTracker:UpdateWidth(line.label:GetStringWidth() + trackerMarginLeft +
|
||||
superTrackMarginLeft + trackerMarginRight)
|
||||
trackerMarginRight)
|
||||
|
||||
-- Set Zone Label and Line widths
|
||||
line.label:SetWidth(trackerBaseFrame:GetWidth() - trackerMarginLeft - superTrackMarginLeft - trackerMarginRight)
|
||||
line:SetWidth(line.label:GetWidth() + superTrackMarginLeft)
|
||||
line.label:SetWidth(trackerBaseFrame:GetWidth() - trackerMarginLeft - trackerMarginRight)
|
||||
line:SetWidth(line.label:GetWidth())
|
||||
|
||||
-- Compare largest text Label in the tracker with current Label, then save widest width
|
||||
trackerLineWidth = math.max(trackerLineWidth,
|
||||
line.label:GetStringWidth() + trackerMarginLeft + superTrackMarginLeft)
|
||||
line.label:GetStringWidth() + trackerMarginLeft)
|
||||
|
||||
-- Setup Min/Max Button
|
||||
line.expandZone:ClearAllPoints()
|
||||
line.expandZone:SetPoint("TOPLEFT", line, "TOPLEFT", superTrackMarginLeft, 0)
|
||||
line.expandZone:SetPoint("TOPLEFT", line, "TOPLEFT", 0, 0)
|
||||
line.expandZone:SetWidth(line.label:GetWidth())
|
||||
line.expandZone:SetHeight(line.label:GetHeight())
|
||||
line.expandZone:Show()
|
||||
@@ -967,6 +961,10 @@ function QuestieTracker:Update()
|
||||
-- Safety check - make sure we didn't run over our linePool limit.
|
||||
if not line then return "BREAK" end
|
||||
|
||||
-- Kept so the supertrack button, which lives on the title line, can be
|
||||
-- re-centred over the finished quest block further down.
|
||||
local questTitleLine = line
|
||||
|
||||
-- Set Line Mode, Types, Clickers
|
||||
line:SetMode("quest")
|
||||
line:SetOnClick("quest")
|
||||
@@ -976,7 +974,7 @@ function QuestieTracker:Update()
|
||||
line.criteriaMark:Hide()
|
||||
|
||||
-- Set Min/Max Button and default states
|
||||
line.expandQuest:SetPoint("TOPRIGHT", line, "TOPLEFT", questMarginLeft - 8, 1)
|
||||
line.expandQuest:SetPoint("TOPRIGHT", line, "TOPLEFT", questMarginLeft - 4, 1)
|
||||
line.expandQuest.zoneId = zoneName
|
||||
|
||||
|
||||
@@ -1181,7 +1179,8 @@ function QuestieTracker:Update()
|
||||
end
|
||||
|
||||
-- Attach button to Quest Title linePool
|
||||
button:SetPoint("TOPLEFT", button.line, "TOPLEFT", superTrackMarginLeft, 0)
|
||||
button:SetPoint("TOPLEFT", button.line, "TOPLEFT",
|
||||
TrackerLinePool.GetItemButtonOffset(), 0)
|
||||
button:SetParent(button.line)
|
||||
button:Show()
|
||||
|
||||
@@ -1195,6 +1194,10 @@ function QuestieTracker:Update()
|
||||
button:SetParent(UIParent)
|
||||
button:Hide()
|
||||
end
|
||||
|
||||
-- The quest item button owns this slot, so the marker steps out to
|
||||
-- the left of the line for as long as it is there.
|
||||
button.line.superTrackButton:SetItemButtonShown(button:IsShown())
|
||||
else
|
||||
-- Button failed to get setup for some reason or the quest item is now gone. Hide it and enable the Quest Min/Max button.
|
||||
-- See previous comment for details on why we're setting this button to UIParent.
|
||||
@@ -1289,7 +1292,7 @@ function QuestieTracker:Update()
|
||||
|
||||
-- Attach button to Quest Title linePool
|
||||
altButton:SetPoint("TOPLEFT", altButton.line, "TOPLEFT",
|
||||
superTrackMarginLeft + 2 + questItemButtonSize, 0)
|
||||
TrackerLinePool.GetItemButtonOffset() + 2 + questItemButtonSize, 0)
|
||||
altButton:SetParent(altButton.line)
|
||||
altButton:Show()
|
||||
|
||||
@@ -1590,6 +1593,16 @@ function QuestieTracker:Update()
|
||||
|
||||
-- Adds 2 pixels and "Padding Between Quests" setting in Tracker Options
|
||||
line:SetHeight(line.label:GetHeight() + (Questie.db.profile.trackerQuestPadding + 2))
|
||||
|
||||
-- Centre the supertrack button on the quest's whole text block now that its
|
||||
-- objective lines are drawn and their heights are final.
|
||||
if questTitleLine.superTrackButton.questId then
|
||||
local blockHeight = TrackerLinePool.GetQuestBlockHeight(questTitleLine, line)
|
||||
|
||||
if blockHeight then
|
||||
questTitleLine.superTrackButton:SetBlockHeight(blockHeight)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
primaryButton = false
|
||||
@@ -1648,9 +1661,9 @@ function QuestieTracker:Update()
|
||||
line.criteriaMark:Hide()
|
||||
line.playButton:Hide()
|
||||
|
||||
-- Setup Zone Label (indented past the supertrack button gutter, as above)
|
||||
-- Setup Zone Label
|
||||
line.label:ClearAllPoints()
|
||||
line.label:SetPoint("TOPLEFT", line, "TOPLEFT", superTrackMarginLeft, 0)
|
||||
line.label:SetPoint("TOPLEFT", line, "TOPLEFT", 0, 0)
|
||||
|
||||
-- Set Zone Title and Min/Max states
|
||||
if Questie.db.char.collapsedZones[zoneName] then
|
||||
@@ -1679,15 +1692,15 @@ function QuestieTracker:Update()
|
||||
|
||||
-- Check and measure Zone Label text width and update tracker width
|
||||
QuestieTracker:UpdateWidth(line.label:GetStringWidth() + trackerMarginLeft +
|
||||
superTrackMarginLeft + trackerMarginRight)
|
||||
trackerMarginRight)
|
||||
|
||||
-- Set Zone Label and Line widths
|
||||
line.label:SetWidth(trackerBaseFrame:GetWidth() - trackerMarginLeft - superTrackMarginLeft - trackerMarginRight)
|
||||
line:SetWidth(line.label:GetWidth() + superTrackMarginLeft)
|
||||
line.label:SetWidth(trackerBaseFrame:GetWidth() - trackerMarginLeft - trackerMarginRight)
|
||||
line:SetWidth(line.label:GetWidth())
|
||||
|
||||
-- Compare largest text Label in the tracker with current Label, then save widest width
|
||||
trackerLineWidth = math.max(trackerLineWidth,
|
||||
line.label:GetStringWidth() + trackerMarginLeft + superTrackMarginLeft)
|
||||
line.label:GetStringWidth() + trackerMarginLeft)
|
||||
|
||||
-- Setup Min/Max Button
|
||||
line.expandZone:ClearAllPoints()
|
||||
@@ -1727,7 +1740,7 @@ function QuestieTracker:Update()
|
||||
|
||||
-- Set Min/Max Button and default states
|
||||
line.expandQuest:Show()
|
||||
line.expandQuest:SetPoint("TOPRIGHT", line, "TOPLEFT", questMarginLeft - 8, 1)
|
||||
line.expandQuest:SetPoint("TOPRIGHT", line, "TOPLEFT", questMarginLeft - 4, 1)
|
||||
line.expandQuest.zoneId = zoneName
|
||||
|
||||
-- The minAllQuestsInZone table is always blank until a player Shift+Clicks the Zone header (MouseDown).
|
||||
|
||||
@@ -115,18 +115,20 @@ local linePool = {}
|
||||
local buttonPool = {}
|
||||
local lineMarginLeft = 10
|
||||
|
||||
-- Gutter given to the supertrack button, which sits flush with the left edge of a quest line. The
|
||||
-- collapse button, the quest item buttons and the labels are all shifted right by this much, so
|
||||
-- nothing lands on top of it and nothing hangs over the tracker's left edge. Fed into
|
||||
-- questMarginLeft, which every width calculation already builds on, so the tracker widens to match.
|
||||
function TrackerLinePool.GetSuperTrackMarginReserve()
|
||||
if (not Questie.db.profile.trackerShowSuperTrackButton) or (not TrackerUtils:IsSuperTrackAvailable()) then
|
||||
return 0
|
||||
end
|
||||
-- Gap kept between the supertrack button and whatever it is tucked in next to.
|
||||
local superTrackButtonGap = 1
|
||||
|
||||
-- Reserved even for quests whose button is hidden, so the list does not shift around as quests
|
||||
-- come in and out of the supertrackable set.
|
||||
return (Questie.db.profile.trackerSuperTrackButtonSize or 25) + 4
|
||||
-- Left edge of a quest line's collapse button. QuestieTracker anchors it at questMarginLeft - 4
|
||||
-- with a width of trackerFontSizeQuest, and questMarginLeft carries a matching + trackerFontSizeQuest,
|
||||
-- so it lands on a flat 22 whatever the font size is.
|
||||
local superTrackCollapseButtonLeft = 22
|
||||
|
||||
-- Left edge of the quest item buttons. QuestieTracker anchors them there and the marker tucks in
|
||||
-- to the left of them, so the two have to agree on it.
|
||||
local questItemButtonLeft = 6
|
||||
|
||||
function TrackerLinePool.GetItemButtonOffset()
|
||||
return questItemButtonLeft
|
||||
end
|
||||
|
||||
---@param questFrame Frame
|
||||
@@ -529,9 +531,62 @@ function TrackerLinePool.Initialize(questFrame)
|
||||
|
||||
superTrackButton.SetSuperTrackButton = function(self, questId)
|
||||
self.questId = questId
|
||||
-- Back to the title line on its own: the objective lines below have not been laid out
|
||||
-- yet, so the tracker measures the block and calls SetBlockHeight once they are. Same
|
||||
-- for the quest item button, which is set up further down and owns this slot.
|
||||
self.blockHeight = nil
|
||||
self.itemButtonShown = nil
|
||||
self:RefreshSuperTrackButton()
|
||||
end
|
||||
|
||||
-- Horizontally: tucked in to the left of whatever else owns the head of the line -- the
|
||||
-- quest item button where there is one, the collapse button where there is not. It hangs
|
||||
-- over the line's left edge, and off the tracker entirely at larger sizes; giving the
|
||||
-- marker a column of its own would mean indenting every quest in the tracker for it.
|
||||
-- Vertically: centred on the quest's whole text block, title plus objectives, the height
|
||||
-- the tracker hands us. Without one, centred on the quest title alone, which is all that
|
||||
-- exists at the point the button is first set up.
|
||||
superTrackButton.AnchorSuperTrackButton = function(self)
|
||||
local buttonSize = Questie.db.profile.trackerSuperTrackButtonSize or 25
|
||||
local blockHeight = self.blockHeight or Questie.db.profile.trackerFontSizeQuest
|
||||
local slotLeft = self.itemButtonShown and questItemButtonLeft or superTrackCollapseButtonLeft
|
||||
local offsetX = slotLeft - superTrackButtonGap - buttonSize
|
||||
|
||||
-- The lines live inside the tracker's scroll frame, which clips anything hanging over
|
||||
-- its edge, so a marker that reaches past it is reparented above the clip. It stays
|
||||
-- anchored to its line either way, and every redraw hides it by hand
|
||||
-- (ResetLinesForChange) before deciding whether to show it again.
|
||||
self:SetParent(((offsetX + lineMarginLeft) < 0) and trackerQuestFrame or line)
|
||||
|
||||
self:ClearAllPoints()
|
||||
self:SetPoint("TOPLEFT", line, "TOPLEFT", offsetX, (buttonSize - blockHeight) / 2 + 1)
|
||||
|
||||
-- Has to sit above the tracker backdrop, which is what swallows a frame left at level 0.
|
||||
-- Strata comes from the line rather than from whichever parent it ended up with, so the
|
||||
-- two cases draw the same.
|
||||
self:SetFrameStrata(line:GetFrameStrata())
|
||||
self:SetFrameLevel(line:GetFrameLevel() + 10)
|
||||
end
|
||||
|
||||
superTrackButton.SetBlockHeight = function(self, blockHeight)
|
||||
if self.blockHeight == blockHeight then
|
||||
return
|
||||
end
|
||||
|
||||
self.blockHeight = blockHeight
|
||||
self:AnchorSuperTrackButton()
|
||||
end
|
||||
|
||||
superTrackButton.SetItemButtonShown = function(self, shown)
|
||||
shown = shown and true or false
|
||||
if (self.itemButtonShown or false) == shown then
|
||||
return
|
||||
end
|
||||
|
||||
self.itemButtonShown = shown
|
||||
self:AnchorSuperTrackButton()
|
||||
end
|
||||
|
||||
superTrackButton.RefreshSuperTrackButton = function(self)
|
||||
-- No map pin means the client has nothing to point the marker at (quest in another zone,
|
||||
-- or a quest without map coordinates), so there is nothing to offer.
|
||||
@@ -581,12 +636,7 @@ function TrackerLinePool.Initialize(questFrame)
|
||||
-- while the mouse is still held down.
|
||||
self:SetPressedOffset(false)
|
||||
|
||||
-- Flush with the left edge of the line, in the gutter GetSuperTrackMarginReserve keeps
|
||||
-- clear. Anchored to the top rather than centred on the line so the button stays level
|
||||
-- with the first row of a quest title that wraps, matching the collapse button.
|
||||
local fontSizeQuest = Questie.db.profile.trackerFontSizeQuest
|
||||
self:ClearAllPoints()
|
||||
self:SetPoint("TOPLEFT", line, "TOPLEFT", 0, (buttonSize - fontSizeQuest) / 2 + 1)
|
||||
self:AnchorSuperTrackButton()
|
||||
|
||||
-- The icon carries the selected variant itself; the glow is the one part the pin draws
|
||||
-- as a separate texture.
|
||||
@@ -596,8 +646,6 @@ function TrackerLinePool.Initialize(questFrame)
|
||||
self.glow:Hide()
|
||||
end
|
||||
|
||||
-- Has to sit above the tracker backdrop, which is what swallows a frame left at level 0.
|
||||
self:SetFrameLevel(line:GetFrameLevel() + 10)
|
||||
self:Show()
|
||||
end
|
||||
|
||||
@@ -701,6 +749,9 @@ function TrackerLinePool.Initialize(questFrame)
|
||||
|
||||
line.expandQuest = expandQuest
|
||||
|
||||
-- Its own slot in the pool, so a run of lines drawn for one quest can be walked back over.
|
||||
line.lineIndex = i
|
||||
|
||||
linePool[i] = line
|
||||
nextFrame = line
|
||||
end
|
||||
@@ -1060,6 +1111,49 @@ function TrackerLinePool.GetCurrentButton()
|
||||
return buttonPool[buttonIndex]
|
||||
end
|
||||
|
||||
-- Height of the block of lines a single quest was drawn into, title line through last objective.
|
||||
-- Added up from the heights the tracker itself set rather than measured off the frames: on login
|
||||
-- the tracker has not been laid out yet, and GetTop/GetBottom then report positions from a
|
||||
-- half-built frame, which is enough to fling a marker centred on the result off the tracker.
|
||||
---@return number|nil blockHeight
|
||||
function TrackerLinePool.GetQuestBlockHeight(firstLine, lastLine)
|
||||
if (not firstLine) or (not lastLine) or (not firstLine.lineIndex) or (not lastLine.lineIndex) then
|
||||
return nil
|
||||
end
|
||||
|
||||
if lastLine.lineIndex < firstLine.lineIndex then
|
||||
return nil
|
||||
end
|
||||
|
||||
local blockHeight = 0
|
||||
for i = firstLine.lineIndex, lastLine.lineIndex do
|
||||
local line = linePool[i]
|
||||
if not line then
|
||||
return nil
|
||||
end
|
||||
|
||||
blockHeight = blockHeight + line:GetHeight()
|
||||
end
|
||||
|
||||
-- The last line of a quest carries the padding to the next one. That is empty space below the
|
||||
-- text, so it plays no part in where the block's centre is. A quest collapsed down to its title
|
||||
-- is the exception: that single line is the whole quest, and neither reference reads right on
|
||||
-- its own -- against the text alone the marker rides high over the row's empty half, against
|
||||
-- the whole row it sits low under the title it belongs to -- so it splits the difference.
|
||||
local trailingPadding = Questie.db.profile.trackerQuestPadding + 2
|
||||
if lastLine.lineIndex == firstLine.lineIndex then
|
||||
trailingPadding = trailingPadding / 2
|
||||
end
|
||||
|
||||
blockHeight = blockHeight - trailingPadding
|
||||
|
||||
if blockHeight <= 0 then
|
||||
return nil
|
||||
end
|
||||
|
||||
return blockHeight
|
||||
end
|
||||
|
||||
---@return table|nil lineIndex linePool[lineIndex - 1]
|
||||
function TrackerLinePool.GetPreviousLine()
|
||||
lineIndex = lineIndex - 1
|
||||
@@ -1109,6 +1203,10 @@ function TrackerLinePool.HideUnusedLines()
|
||||
line.expandZone.zoneId = nil
|
||||
line.criteriaMark.mode = nil
|
||||
line.playButton.mode = nil
|
||||
-- Hidden by hand: a marker that overflows to the left of its line is parented above the
|
||||
-- scroll frame's clip, so hiding the line no longer hides it.
|
||||
line.superTrackButton.questId = nil
|
||||
line.superTrackButton:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -676,27 +676,46 @@ local function GetAreaIdByZoneName(zoneName)
|
||||
return l10n:GetAreaIdByLocalName(zoneName)
|
||||
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.
|
||||
-- questId -> the header the client filed it under in the quest log. In 3.3.5 those headers are
|
||||
-- isHeader=true entries sitting above the quests they cover. Built in one pass and kept, because
|
||||
-- the tracker asks per quest and redraws often -- walking the log once per quest is quadratic.
|
||||
local questLogHeaders = {}
|
||||
|
||||
-- Every questId the log currently holds, headers aside. The tracker draws from currentQuestlog,
|
||||
-- and this is what says whether the player still has a given quest.
|
||||
local questLogQuestIds = {}
|
||||
|
||||
local function BuildQuestLogHeaders()
|
||||
local headers = {}
|
||||
local questIds = {}
|
||||
local header
|
||||
|
||||
for i = 1, (GetNumQuestLogEntries and GetNumQuestLogEntries() or 0) do
|
||||
local title, _, _, isHeader, _, _, _, logId = GetQuestLogTitle(i)
|
||||
if isHeader then
|
||||
if title and title ~= "" then
|
||||
header = title
|
||||
end
|
||||
elseif logId then
|
||||
questIds[logId] = true
|
||||
if header then
|
||||
headers[logId] = header
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
questLogHeaders = headers
|
||||
questLogQuestIds = questIds
|
||||
end
|
||||
|
||||
-- Returns the header title string, or nil if the quest is not in the log under one.
|
||||
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
|
||||
if not questLogQuestIds[questId] then
|
||||
-- Asked about a quest the last pass did not see, so the log has moved on since.
|
||||
BuildQuestLogHeaders()
|
||||
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
|
||||
|
||||
return questLogHeaders[questId]
|
||||
end
|
||||
|
||||
local function _GetZoneName(zoneOrSort, questId, zoneNameOverride)
|
||||
@@ -707,6 +726,19 @@ local function _GetZoneName(zoneOrSort, questId, zoneNameOverride)
|
||||
local zoneName
|
||||
local sortObj = Questie.db.profile.trackerSortObjectives
|
||||
if sortObj == "byZone" or sortObj == "byZoneComplete" or sortObj == "byZoneCompleteReversed" or sortObj == "byZonePlayerProximity" or sortObj == "byZonePlayerProximityReversed" then
|
||||
-- A server can file quests under categories of its own -- Ascension's "Ascension Main
|
||||
-- Quest" -- and those exist nowhere in the zone tables, so the quest data points at a zone
|
||||
-- instead: for anything the Learner recorded, whichever zone it was picked up in. A header
|
||||
-- that does not resolve to an area is one of those categories, and the client's own
|
||||
-- grouping is the only thing that knows about it.
|
||||
local logHeader = GetQuestLogZoneName(questId)
|
||||
if logHeader and logHeader ~= "" then
|
||||
local headerAreaId = GetAreaIdByZoneName(logHeader)
|
||||
if (not headerAreaId) or headerAreaId == 0 then
|
||||
return logHeader
|
||||
end
|
||||
end
|
||||
|
||||
if (zoneOrSort) > 0 then
|
||||
zoneName = TrackerUtils:GetZoneNameByID(zoneOrSort)
|
||||
if not zoneName or zoneName == "Unknown Zone" then
|
||||
@@ -813,6 +845,17 @@ function TrackerUtils:GetSortedQuestIds()
|
||||
local sortedQuestIds = {}
|
||||
local questDetails = {}
|
||||
local sortObj = Questie.db.profile.trackerSortObjectives
|
||||
|
||||
-- One walk of the quest log for the whole draw, so the per-quest lookups below are reads.
|
||||
BuildQuestLogHeaders()
|
||||
|
||||
-- currentQuestlog is only as good as the removal events that maintain it, and a quest the
|
||||
-- server finishes on its own -- Ascension's auto-complete quests -- can leave the log without
|
||||
-- any of them landing, which strands the quest in the tracker for the rest of the session. The
|
||||
-- log is the authority on what the player still has, so anything missing from it is skipped.
|
||||
-- Skipped rather than pruned: a redraw that catches the log mid-refresh would otherwise throw
|
||||
-- away state Questie is about to want back.
|
||||
local questLogIsReadable = next(questLogQuestIds) ~= nil
|
||||
-- Update quest objectives
|
||||
|
||||
for questId, quest in pairs(QuestiePlayer.currentQuestlog) do
|
||||
@@ -885,7 +928,14 @@ function TrackerUtils:GetSortedQuestIds()
|
||||
end
|
||||
end
|
||||
|
||||
if type(quest) == "table" and quest.IsComplete and quest.Objectives then
|
||||
local isInQuestLog = (not questLogIsReadable) or (questLogQuestIds[qid] == true)
|
||||
if not isInQuestLog then
|
||||
-- Left over from a removal nothing told the tracker about, so the object built for it
|
||||
-- goes too -- otherwise it would still be here to serve the next draw.
|
||||
TrackerUtils._fallbackQuests[qid] = nil
|
||||
end
|
||||
|
||||
if isInQuestLog and type(quest) == "table" and quest.IsComplete and quest.Objectives then
|
||||
-- Insert Quest Ids into sortedQuestIds table
|
||||
tinsert(sortedQuestIds, qid)
|
||||
|
||||
|
||||
@@ -11,10 +11,13 @@ Made for and tested on CoA, but it should also work on other 3.3.5 clients.
|
||||
- fixed custom quests having no name in the tracker.
|
||||
- fixed custom quests not showing (complete) in the tracker.
|
||||
- fixed custom quest items not showing.
|
||||
- fixed quest tags (group, elite, dungeon...) being wrong on quest ids Ascension reuses for its own content.
|
||||
- fixed Ascension "main quests" not having the correct category and not clearing on complete.
|
||||
|
||||
## Changes
|
||||
|
||||
- added "By Zone + %% Completed" and "By Zone + %% Completed (Reversed)" tracker sorting options.
|
||||
- implemented Ascension's backported supertracker buttons to the tracker.
|
||||
- added "By Zone + % Completed" and "By Zone + % Completed (Reversed)" tracker sorting options.
|
||||
|
||||
## Credits
|
||||
|
||||
|
||||
Reference in New Issue
Block a user