From 08eace3115d7bf6b32f49a4a5ccf86e6f2b6116f Mon Sep 17 00:00:00 2001 From: Xurkon Date: Sun, 12 Apr 2026 00:45:50 -0500 Subject: [PATCH] fix: Blood of Heroes object rendering and QuestieQuest runtime crash fixes --- CHANGELOG.md | 6 ++++++ Modules/Quest/QuestEventHandler.lua | 13 +++++++++++++ Modules/QuestLinks/ChatFilter.lua | 5 ++++- docs/changelog.html | 12 ++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1818ee..44e17f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,12 @@ - **[UI — Search Experience]** Improved the Advanced Search results interface. - **Dynamic Button States**: Fixed the "Show on Map" button state management to correctly toggle to "Remove from Map" when pins are active. - **Stability**: Removed experimental rendering logic that caused regressions with standard quest objective icons. +- **[Fix — ChatFilter Mythic Keystone Parsing]** Resolved a bug where mythic keystone IDs posted in chat were incorrectly parsed as quest links and converted to broken clickable quests. + - **Pattern Guard**: Added an early skip in `ChatFilter.Filter` to detect and skip entries where the extracted name starts with `"Keystone"`, preventing keystones from entering the quest-link conversion path. + - **Root Cause**: The regex `\[(.+) %((%d+)%)]` matched chat messages like `[Keystone 12345]` because the name portion "Keystone 12345" matched `.+` and the ID happened to correspond to a valid quest ID in `QuestPointers`, causing a false-positive hyperlink replacement. +- **[Fix — Ebonhold Call Board Repeatable Quests]** Resolved a bug where repeatable quests from the Ebonhold Call Board showed as permanently complete in the tracker after re-accepting them. + - **State Leak**: On Ebonhold, Call Board quests auto-complete and vanish from the quest log without firing a `QUEST_REMOVED` event. Questie was marking them as `QUEST_TURNED_IN` in the internal `questLog` table but never cleaning that state on re-accept, causing the tracker to render them as already-complete. + - **Re-Accept Guard**: Added a pre-check in the `QUEST_ACCEPTED` handler that detects quests already in `QUEST_TURNED_IN` state and performs full cleanup (`QuestLogCache.RemoveQuest`, `CompleteQuest`, `Journey:CompleteQuest`, `Announce:CompletedQuest`, `Tracker:RemoveQuest`, `questLog[questId] = nil`) before processing the fresh accept. ## v1.5.9 (2026-04-08) diff --git a/Modules/Quest/QuestEventHandler.lua b/Modules/Quest/QuestEventHandler.lua index 49dac47..114be32 100644 --- a/Modules/Quest/QuestEventHandler.lua +++ b/Modules/Quest/QuestEventHandler.lua @@ -241,6 +241,19 @@ function _QuestEventHandler:QuestAccepted(questLogIndex, questId) skipNextUQLCEvent = true end + -- If the quest was already in questLog as QUEST_TURNED_IN (e.g. Ebonhold Call Board repeatable + -- quests that vanish without a proper QUEST_REMOVED event), clean up before re-accepting so the + -- tracker doesn't show it as already complete. + if questLog[questId] and questLog[questId].state == QUEST_LOG_STATES.QUEST_TURNED_IN then + Questie:Debug(Questie.DEBUG_INFO, "Quest:", questId, "re-accepted after auto-complete, clearing stale state") + QuestLogCache.RemoveQuest(questId) + QuestieQuest:CompleteQuest(questId) -- clears per-quest data + QuestieJourney:CompleteQuest(questId) + QuestieAnnounce:CompletedQuest(questId) + QuestieTracker:RemoveQuest(questId) + questLog[questId] = nil + end + QuestieCombatQueue:Queue(function() QuestieLib:CacheItemNames(questId) _QuestEventHandler:HandleQuestAccepted(questId) diff --git a/Modules/QuestLinks/ChatFilter.lua b/Modules/QuestLinks/ChatFilter.lua index e4a1e30..76b05f3 100644 --- a/Modules/QuestLinks/ChatFilter.lua +++ b/Modules/QuestLinks/ChatFilter.lua @@ -31,7 +31,10 @@ ChatFilter.Filter = function(chatFrame, _, msg, playerName, languageName, channe end end - if questId and QuestieDB.QuestPointers[questId] then + -- Skip non-quest patterns like mythic keystones + if questName and string.match(questName, "^Keystone") then + -- skip keystone links + elseif questId and QuestieDB.QuestPointers[questId] then if (not senderGUID) then playerName = BNGetFriendInfoByID(bnSenderID) senderGUID = bnSenderID diff --git a/docs/changelog.html b/docs/changelog.html index 737f135..3f14f21 100644 --- a/docs/changelog.html +++ b/docs/changelog.html @@ -198,6 +198,18 @@
  • Stability: Removed experimental rendering logic that caused regressions with standard quest objective icons.
  • +
  • [Fix — ChatFilter Mythic Keystone Parsing] Resolved a bug where mythic keystone IDs posted in chat were incorrectly parsed as quest links and converted to broken clickable quests. + +
  • +
  • [Fix — Ebonhold Call Board Repeatable Quests] Resolved a bug where repeatable quests from the Ebonhold Call Board showed as permanently complete in the tracker after re-accepting them. + +