v1.6.1: Fix map icon completion persistence after objective fulfillment

- SetObjectivesDirty: Add missing loop to reset isUpdated on SpecialObjectives
- PopulateObjective: Add completion guard for objectives without Update fn
- Bump version to 1.6.1 across TOC and changelogs
This commit is contained in:
Xurkon
2026-05-04 19:57:43 -05:00
parent 7d658de3b1
commit a0f3a1e020
4 changed files with 39 additions and 3 deletions
+8
View File
@@ -1,5 +1,13 @@
# Changelog
## v1.6.1 (2026-05-04)
### Bug Fixes
- **[Fix — Map Icon Completion]** Resolved a bug where quest objective icons (map pins and minimap markers) persisted on the world map and minimap after objectives were fulfilled, only disappearing after speaking to the quest giver to complete the quest.
- **SpecialObjectives Dirty Flag**: Added a missing loop in `SetObjectivesDirty` to reset `isUpdated = false` on `quest.SpecialObjectives` alongside the existing `quest.Objectives` loop. Previously, special objectives (e.g. demonic runestones, portal-closing mechanics) would skip the `ObjectiveUpdate` early-exit guard because their `isUpdated` flag was never cleared, preventing `objective.Completed` from being set to `true` and leaving map icons on-screen indefinitely.
- **Completion Guard in PopulateObjective**: Added a defensive check in `PopulateObjective` so that objectives without an `Update` function still unload their spawned icons if `objective.Completed` or `quest.isComplete` is already `true` from a prior update cycle.
## Session 34 (2026-05-02)
### Maintenance
+17 -1
View File
@@ -802,6 +802,15 @@ function QuestieQuest:SetObjectivesDirty(questId)
objective.isUpdated = false
objKey, objective = next(quest.Objectives, objKey)
end
-- Also dirty SpecialObjectives (e.g. demonic runestones, portal-closing mechanics).
-- Without this, ObjectiveUpdate's isUpdated early-exit prevents objective.Completed
-- from being set to true, so _UnloadAlreadySpawnedIcons is never reached and icons
-- linger on the map/minimap after the objectives are fulfilled.
local soKey, sObjective = next(quest.SpecialObjectives or {})
while soKey do
sObjective.isUpdated = false
soKey, sObjective = next(quest.SpecialObjectives, soKey)
end
end
end
@@ -1336,7 +1345,14 @@ function QuestieQuest:PopulateObjective(quest, objectiveIndex, objective, blockI
Questie:Debug(Questie.DEBUG_INFO, "[QuestieQuest:PopulateObjective]", objective.Description)
if (not objective.Update) then
Questie:Debug(Questie.DEBUG_INFO, "[QuestieQuest:PopulateObjective] - Quest is already updated. --> Exiting!")
-- No Update function means static/pre-populated objective.
-- Still check completion state so icons are removed if this objective was
-- already marked complete from a previous update cycle.
if objective.Completed or quest.isComplete then
Questie:Debug(Questie.DEBUG_INFO,
"[QuestieQuest:PopulateObjective] - No Update fn but objective is complete, unloading icons.")
_UnloadAlreadySpawnedIcons(objective)
end
return
end
+1 -1
View File
@@ -11,7 +11,7 @@
## Notes-esES: Ayundante de misión
## Notes-ptBR: Ajudante de missão
## Notes-frFR: Assistant de quête
## Version: 1.6.0
## Version: 1.6.1
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu, Questie-X-WotLKDB, Questie-X-ClassicDB, Questie-X-TBCDB, Questie-X-TurtleDB, Questie-X-AscensionDB, Questie-X-EbonholdDB
## SavedVariables: QuestieConfig, QuestieLearnerDB, QuestieCacheDB, QuestieJourneyDB
## SavedVariablesPerCharacter: QuestieConfigCharacter
+13 -1
View File
@@ -169,13 +169,25 @@
<h1>Questie-X Documentation</h1>
<p class="subtitle">Complete history of changes, fixes, and additions.</p>
<div style="display: flex; justify-content: center; gap: 10px;">
<code>Version: v1.6.0</code>
<code>Version: v1.6.1</code>
<a href="index.html"
style="background: var(--bg-tertiary); color: var(--accent-blue); text-decoration: none; padding: 2px 6px; border-radius: 4px; font-size: 0.9em; border: 1px solid var(--border-color);">&larr; Back to Documentation</a>
</div>
</div>
<div class="container">
<h2 id="v161">v1.6.1 &mdash; Map Icon Completion Fix</h2>
<ul>
<li><strong>[Fix &mdash; Map Icon Completion]</strong> Resolved a bug where quest objective icons (map pins and minimap markers) persisted on the world map and minimap after objectives were fulfilled, only disappearing after speaking to the quest giver to complete the quest.
<ul>
<li><strong>SpecialObjectives Dirty Flag</strong>: Added a missing loop in <code>SetObjectivesDirty</code> to reset <code>isUpdated = false</code> on <code>quest.SpecialObjectives</code> alongside the existing <code>quest.Objectives</code> loop. Previously, special objectives (e.g. demonic runestones, portal-closing mechanics) would skip the <code>ObjectiveUpdate</code> early-exit guard because their <code>isUpdated</code> flag was never cleared, preventing <code>objective.Completed</code> from being set to <code>true</code> and leaving map icons on-screen indefinitely.</li>
<li><strong>Completion Guard in PopulateObjective</strong>: Added a defensive check in <code>PopulateObjective</code> so that objectives without an <code>Update</code> function still unload their spawned icons if <code>objective.Completed</code> or <code>quest.isComplete</code> is already <code>true</code> from a prior update cycle.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="v160">v1.6.0 &mdash; Map Search &amp; Data Integrity</h2>
<ul>
<li><strong>[Fix &mdash; Map Search DB]</strong> Resolved a critical database issue where objects and NPCs searched via Advanced Search failed to display all available spawn locations.