Release v9.7.9
Register BAG_UPDATE_DELAYED to catch autoloot objective updates. Autoloot bots that bypass the loot frame skip QUEST_WATCH_UPDATE, leaving the tracker stuck at a stale count. Setting doFullQuestLogScan=true on BAG_UPDATE_DELAYED forces a refresh on the next QUEST_LOG_UPDATE.
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v9.7.9
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- **[Quest]** Fixed tracker objective count staying stale (e.g. stuck at 14/16 when quest is complete) when an autoloot bot bypasses the standard loot frame. Registered `BAG_UPDATE_DELAYED` event to force a full quest log scan on bag changes, catching progress updates that `QUEST_WATCH_UPDATE` would normally fire for manual looting.
|
||||||
|
|
||||||
## v9.7.8
|
## v9.7.8
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ function QuestEventHandler:RegisterEvents()
|
|||||||
eventFrame:RegisterEvent("ZONE_CHANGED_NEW_AREA")
|
eventFrame:RegisterEvent("ZONE_CHANGED_NEW_AREA")
|
||||||
eventFrame:RegisterEvent("NEW_RECIPE_LEARNED") -- Spell objectives; Runes in SoD count as recipes because "Engraving" is a profession?
|
eventFrame:RegisterEvent("NEW_RECIPE_LEARNED") -- Spell objectives; Runes in SoD count as recipes because "Engraving" is a profession?
|
||||||
--eventFrame:RegisterEvent("SPELLS_CHANGED") -- Spell objectives
|
--eventFrame:RegisterEvent("SPELLS_CHANGED") -- Spell objectives
|
||||||
|
eventFrame:RegisterEvent("BAG_UPDATE_DELAYED") -- Catch quest item loots that bypass QUEST_WATCH_UPDATE (e.g. autoloot bots)
|
||||||
|
|
||||||
eventFrame:RegisterEvent("PLAYER_INTERACTION_MANAGER_FRAME_HIDE")
|
eventFrame:RegisterEvent("PLAYER_INTERACTION_MANAGER_FRAME_HIDE")
|
||||||
|
|
||||||
@@ -282,6 +283,9 @@ end
|
|||||||
function _QuestEventHandler:QuestTurnedIn(questId, xpReward, moneyReward)
|
function _QuestEventHandler:QuestTurnedIn(questId, xpReward, moneyReward)
|
||||||
Questie:Debug(Questie.DEBUG_DEVELOP, "[Quest Event] QUEST_TURNED_IN", xpReward, moneyReward, questId)
|
Questie:Debug(Questie.DEBUG_DEVELOP, "[Quest Event] QUEST_TURNED_IN", xpReward, moneyReward, questId)
|
||||||
|
|
||||||
|
-- Block UpdateQuest from redrawing objective pins while completion is in-flight
|
||||||
|
QuestiePlayer.pendingCompleteQuestIds[questId] = true
|
||||||
|
|
||||||
if questLog[questId] and questLog[questId].timer then
|
if questLog[questId] and questLog[questId].timer then
|
||||||
-- Cancel the timer so the quest is not marked as abandoned
|
-- Cancel the timer so the quest is not marked as abandoned
|
||||||
questLog[questId].timer:Cancel()
|
questLog[questId].timer:Cancel()
|
||||||
@@ -348,12 +352,15 @@ function _QuestEventHandler:QuestRemoved(questId)
|
|||||||
-- QUEST_TURNED_IN was called before QUEST_REMOVED --> quest was turned in
|
-- QUEST_TURNED_IN was called before QUEST_REMOVED --> quest was turned in
|
||||||
if questLog[questId].state == QUEST_LOG_STATES.QUEST_TURNED_IN then
|
if questLog[questId].state == QUEST_LOG_STATES.QUEST_TURNED_IN then
|
||||||
Questie:Debug(Questie.DEBUG_INFO, "Quest:", questId, "was turned in before. Completing quest.")
|
Questie:Debug(Questie.DEBUG_INFO, "Quest:", questId, "was turned in before. Completing quest.")
|
||||||
|
|
||||||
|
-- Ensure the guard is set in case QUEST_REMOVED fires before the combat queue drains
|
||||||
|
QuestiePlayer.pendingCompleteQuestIds[questId] = true
|
||||||
|
|
||||||
-- Now that we confirmed the quest was actually turned in (not abandoned), mark it as complete
|
-- Now that we confirmed the quest was actually turned in (not abandoned), mark it as complete
|
||||||
QuestieQuest:CompleteQuest(questId)
|
QuestieQuest:CompleteQuest(questId)
|
||||||
QuestieJourney:CompleteQuest(questId)
|
QuestieJourney:CompleteQuest(questId)
|
||||||
QuestieAnnounce:CompletedQuest(questId)
|
QuestieAnnounce:CompletedQuest(questId)
|
||||||
|
|
||||||
questLog[questId] = nil
|
questLog[questId] = nil
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -677,6 +684,10 @@ function _QuestEventHandler:OnEvent(event, ...)
|
|||||||
elseif event == "NEW_RECIPE_LEARNED" then
|
elseif event == "NEW_RECIPE_LEARNED" then
|
||||||
Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] NEW_RECIPE_LEARNED (QuestEventHandler)")
|
Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] NEW_RECIPE_LEARNED (QuestEventHandler)")
|
||||||
doFullQuestLogScan = true -- If this event is related to a spell objective, a QUEST_LOG_UPDATE will be fired afterwards
|
doFullQuestLogScan = true -- If this event is related to a spell objective, a QUEST_LOG_UPDATE will be fired afterwards
|
||||||
|
elseif event == "BAG_UPDATE_DELAYED" then
|
||||||
|
-- Autoloot bots can bypass the standard loot frame, skipping QUEST_WATCH_UPDATE for the last items looted.
|
||||||
|
-- Flag a full scan so the tracker refreshes on the next QUEST_LOG_UPDATE.
|
||||||
|
doFullQuestLogScan = true
|
||||||
elseif event == "PLAYER_INTERACTION_MANAGER_FRAME_HIDE" then
|
elseif event == "PLAYER_INTERACTION_MANAGER_FRAME_HIDE" then
|
||||||
local eventType = select(1, ...)
|
local eventType = select(1, ...)
|
||||||
if eventType == 1 then
|
if eventType == 1 then
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
## Notes-esES: Ayundante de misión
|
## Notes-esES: Ayundante de misión
|
||||||
## Notes-ptBR: Ajudante de missão
|
## Notes-ptBR: Ajudante de missão
|
||||||
## Notes-frFR: Assistant de quête
|
## Notes-frFR: Assistant de quête
|
||||||
## Version: 9.7.8
|
## Version: 9.7.9
|
||||||
## RequiredDeps:
|
## RequiredDeps:
|
||||||
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu
|
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu
|
||||||
## SavedVariables: QuestieConfig
|
## SavedVariables: QuestieConfig
|
||||||
|
|||||||
Reference in New Issue
Block a user