79 KiB
Changelog
v1.5.5 (2026-03-29)
Performance — Profiler-Driven Optimizations
Addressed micro-stutters and FPS drops (190 → sub-100) reported during high-frequency NPC/player mouseover interactions. Five targeted fixes based on profiler data.
-
[Perf — Position Caching] Cached
HBD:GetPlayerWorldPosition()andHBD:GetPlayerZonePosition()at a 50ms interval (20 Hz). Previously these calledQuestieCompat.GetCurrentPlayerPosition()— a C API round-trip — on every minimapOnUpdateframe (60–144 times/sec), accounting for 1,171ms / 45,570 calls over 10 minutes in profiler data. Cache is invalidated immediately onPLAYER_ENTERING_WORLDandZONE_CHANGED_*events. Expected call reduction: ~97%. -
[Perf — ZoneDB O(1) Lookup] Replaced the O(n) linear scan in
ZoneDB:GetAreaIdByUiMapIdwith an O(1) pre-built reverse lookup cache (uiMapIdToAreaIdCache). The old implementation iterated the entireuiMapIdToAreaIdtable on every call, accounting for 6.92ms / 375 calls in the profiler (called byQuestieArrowandQuestiePlayer). The cache is built once atZoneDB:Initialize()via a new_ZoneDB:BuildUiMapIdToAreaIdCache()function and kept in sync byApplyCustomZones(). The name-match fallback remains available for unmapped IDs and now caches its results on first use. -
[Perf — Tooltip OnUpdate Throttle] Throttled the
GameTooltip:HookScript("OnUpdate", ...)callback to a maximum of 10 checks per second (100ms interval). This hook was previously firing every frame (60–144 Hz) and callingGetText(),CountTooltip(), and potentiallyAddObjectDataToTooltip()on every frame regardless of whether the tooltip changed. Added a_tooltipLastTextcache so expensive work is skipped when the hovered object hasn't changed. -
[Perf — Arrow Closure Hoisting] Hoisted four inner
local functiondeclarations out of_CollectQuestTargets(called at 1 Hz byQuestieArrow:UpdateNearestTargets):_HasMissingCompletedFlag,_GetCompleteIconType,_CollectFinisherSpawns, and_CollectObjective. These were re-allocated as closures on every call, producing GC pressure. They are now module-level functions that read per-cycle context from shared_arrow_*upvalue variables set at the start of eachUpdateNearestTargetscall. -
[Perf — LearnerComms Micro-Optimizations] Four targeted fixes in
QuestieLearnerComms:- Ticker rate:
ProcessQueuesticker reduced from 0.2s to 0.5s (still 7× faster than the 3.5sminChatIntervalrate limit, so no messages are delayed). - Channel ID caching: Hidden channel ID is now cached at
Initialize()and lazily refreshed on disconnect, instead of callingGetChannelNameon every queue tick. - Compression level:
LibDeflate:CompressDeflatelevel reduced from 9 (slowest/max) to 1 (fastest). For small addon message payloads the size difference is negligible but the CPU cost is substantially lower. - Dedup counter:
IsDuplicateMessagenow uses an O(1) integer counter (messageCacheCount) to track cache size instead of an O(n)for _ in pairs(messageCache)scan on every incoming message.
- Ticker rate:
-
[Fix — Profiler UI] Resolved an issue where the
QuestieProfilerUI text was overlapping horizontally when function names were too long, rendering the time and call counts illegible. Lines are now appropriately spaced and function names are clamped and left-aligned. -
[Perf — Math Inlining] Removed
QuestieLib:Euclidfunction call overhead from the minimap iconFadeLogichot loop in favor of an inline Pythagorean distance check, reducing micro-stutters during movement. -
[Perf — Quest Tracker Bag Scans] Removed O(N) nested loops iterating over the entire character inventory in
TrackerLinePool:SetItemandQuestieQuest:CheckQuestSourceItem, replacing them with native O(1)GetItemCount(itemId)queries. Completely eliminated thousands ofGetContainerItemInfocalls. -
[Perf — Tracker Cooldown Throttling] Added a 5Hz (0.2s) execution throttle to the tracker quest item button
btn.OnUpdateframe handler, dropping baselineGetItemCooldownAPI polls from ~6000+ checks every few minutes down to a fraction of that load. -
[Fix — Tooltip Duplicates] Added aggressive regex filtering to automatically strip Ascension's duplicate native custom quest text lines from appearing twice in unit and item tooltips (Before Questie seamlessly injects its own higher-fidelity formatted data).
v1.5.4 (2026-03-29)
Ascension Custom Zone Support
-
[Fix — PrintDifficultyColor Nil Text] Fixed crash in
PrintDifficultyColorwhen quest name is nil. Added defensive nil check inGetColoredQuestNameto return early ifQuestieDB.QueryQuestSinglereturns nil for a quest, preventing "attempt to concatenate local 'text' (a nil value)" errors. -
[Fix — Townsfolk POI Map IDs] Fixed some Townsfolk POIs not appearing in custom zones. Removed the
uiMapId > 1000restriction inZoneDB:ApplyCustomZones()that was preventing custom zone IDs below 1000 from being registered as self-mappings. This caused some Townsfolk NPCs with zone IDs < 1000 to fail UiMapId lookups and not display on the map. -
[Fix — Townsfolk DataOverrides Lookup] Fixed Townsfolk initialization to properly check both
QuestieDB.npcDataandQuestieDB.npcDataOverrides/QuestieDB.objectDataOverrides. On custom servers (Ebonhold, Ascension), the database is loaded via plugins into overrides tables, butTownsfolk.Initialize()was only checking the base database tables which are empty until Stage 3 compilation. This affected Flight Masters, Auctioneers, Innkeepers, Repair Vendors, Class Trainers, and Mailboxes. -
[Fix — Custom Zone Map Pins] Fixed map icons not appearing in Ascension custom zones (e.g., Valley of Trials, Northshire Valley). The issue was that custom zone UiMapData was not properly injected into
QuestieCompat.UiMapDatabefore HBD initialized its map cache. AddedApplyCustomZones()function inZoneDBthat hooksZoneDB.Initializeto inject custom zones BEFORE the original initialization runs, ensuring HBD'smapDatatable contains custom zone entries like 1244 (Valley of Trials). -
[Fix — Zone Name Fallback] Fixed "Unknown Zone" display for custom zones in the tracker. When
GetZoneNameByIDfails for custom zone IDs, the system now falls back toGetQuestLogZoneNamewhich reads the zone header directly from the quest log where custom zone names are properly displayed. -
[Fix — GetCurrentUiMapID] Updated
QuestieCompat.GetCurrentUiMapIDto checkQuestieCompat.UiMapDatadirectly for custom zone IDs. Previously, onlymapIdToUiMapIdwas checked, which doesn't contain custom zones. -
[Fix — Arrow Waypoint Zone Filter] Fixed waypoint arrow not showing targets in custom zones. The arrow's auto-tracking logic was filtering out objectives by zone comparison, but custom zones use different IDs (e.g., 1244 for Valley of Trials) than their parent zones (e.g., 14 for Durotar). Added
QuestiePlayer:GetCurrentUiMapId()function and updated arrow zone filtering to compare bothplayerZoneIdANDplayerUiMapIdagainst objective zone IDs. -
[Fix — Tracker Objective Nil Check] Added defensive nil check for
objective.Descriptionwhen rendering quest objectives. Custom server quests may have objectives without a Description field, which would previously cause a crash. -
[Fix — InjectUiMapData Registration] Fixed
QuestiePluginAPI:InjectUiMapDatato callZoneDB:ApplyCustomZones()after injecting custom zone data, ensuring the zone mappings are properly registered with bothZoneDBandQuestieCompat.UiMapData.
Realm Detection
- [Fix — Realm Name Matching] Fixed Ascension realm detection in
AscensionUiMapData.luato usestring.find()instead of exact string comparison. Realms like "Bronzebeard - Warcraft Reborn" now properly match the "Bronzebeard" pattern, allowing custom zone data to load on all Ascension server variants.
Database
- [Feature — Use Quest Item Keybind] Added configurable keyboard hotkey to automatically use the quest item for the nearest incomplete quest objective. When pressed, Questie scans active quests for usable quest items (items with spells), checks which ones are in the player's bags, calculates proximity to quest objectives, and uses the nearest one. Configurable via Tracker options tab under "Use Quest Item (Nearest)".
Keybinds
- [Feature — Dedicated Keybinds Tab] Added a new Keybinds options tab with configurable keybinds for:
- Use Nearest Quest Item — Press to automatically use the quest item for the nearest incomplete quest objective
- Toggle Options — Open/close the Questie Options window
- Toggle Tracker — Show/hide the Questie Tracker
- Toggle My Journey — Open/close the Journey window
v1.5.2 (2026-03-29)
Ascension Custom Zone Support
-
[Fix — Custom Zone Map Pins] Fixed map icons not appearing in Ascension custom zones (e.g., Valley of Trials, Northshire Valley). The issue was that custom zone UiMapData was not properly injected into
QuestieCompat.UiMapDatabefore HBD initialized its map cache. AddedApplyCustomZones()function inZoneDBthat hooksZoneDB.Initializeto inject custom zones BEFORE the original initialization runs, ensuring HBD'smapDatatable contains custom zone entries like 1244 (Valley of Trials). -
[Fix — Zone Name Fallback] Fixed "Unknown Zone" display for custom zones in the tracker. When
GetZoneNameByIDfails for custom zone IDs, the system now falls back toGetQuestLogZoneNamewhich reads the zone header directly from the quest log where custom zone names are properly displayed. -
[Fix — GetCurrentUiMapID] Updated
QuestieCompat.GetCurrentUiMapIDto checkQuestieCompat.UiMapDatadirectly for custom zone IDs. Previously, onlymapIdToUiMapIdwas checked, which doesn't contain custom zones. -
[Fix — Arrow Waypoint Zone Filter] Fixed waypoint arrow not showing targets in custom zones. The arrow's auto-tracking logic was filtering out objectives by zone comparison, but custom zones use different IDs (e.g., 1244 for Valley of Trials) than their parent zones (e.g., 14 for Durotar). Added
QuestiePlayer:GetCurrentUiMapId()function and updated arrow zone filtering to compare bothplayerZoneIdANDplayerUiMapIdagainst objective zone IDs. -
[Fix — Tracker Objective Nil Check] Added defensive nil check for
objective.Descriptionwhen rendering quest objectives. Custom server quests may have objectives without a Description field, which would previously cause a crash. -
[Fix — InjectUiMapData Registration] Fixed
QuestiePluginAPI:InjectUiMapDatato callZoneDB:ApplyCustomZones()after injecting custom zone data, ensuring the zone mappings are properly registered with bothZoneDBandQuestieCompat.UiMapData.
Realm Detection
- [Fix — Realm Name Matching] Fixed Ascension realm detection in
AscensionUiMapData.luato usestring.find()instead of exact string comparison. Realms like "Bronzebeard - Warcraft Reborn" now properly match the "Bronzebeard" pattern, allowing custom zone data to load on all Ascension server variants.
Database
- [Feature — Use Quest Item Keybind] Added configurable keyboard hotkey to automatically use the quest item for the nearest incomplete quest objective. When pressed, Questie scans active quests for usable quest items (items with spells), checks which ones are in the player's bags, calculates proximity to quest objectives, and uses the nearest one. Configurable via Tracker options tab under "Use Quest Item (Nearest)".
v1.5.1 (2026-03-28)
- [Fix — Minimap Icons] Prevented external "minimap button grabber" addons (e.g., Leatrix Plus, MBB) from incorrectly hiding Questie-X quest pins. Minimap icons now use a protected
QuestieFrameGroupcontainer that is ignored by these addons while maintaining correct spatial anchoring viaHereBeDragons. - [Fix — Tracker Crash] Fixed "attempt to index field 'Description' (a nil value)" crash in
QuestieTrackerwhen iterating overquest.Objectivesthat contain nil entries. Added nil check before accessingobjective.Descriptionto prevent crashes on custom server quest data. - [Fix — Killcredit NPC Linking] Enhanced
killcreditobjective handling to properly link NPCs when database entries have missing or invalid IDs. Added two-pass approach: first tries ID-based lookup, then falls back to name-based search using the objective description text. Also fixedmonsterfunction to gracefully handlenpcId <= 0instead of erroring. - [Feature — Existing Quest Scanning] Added
ScanExistingQuestLogfunction to proactively map objectives for quests already in the quest log on addon initialization. Previously, objective mapping only occurred for newly accepted quests. - [Fix — AceComm-3.0] Added nil check for
RegisterAddonMessagePrefixon private servers where this API may not be available.
v1.5.0 (2026-03-28)
- [Fix — Database Robustness] Added strict guards against invalid or zero IDs in
QuestieDBlookup functions (GetNPC,GetObject,GetItem). This prevents the "rawdata is nil" debug spam that occurred when custom plugins attempted to access uninitialized or malformed entity data. - [Refactor — Lookup Logic] Refactored
QuestieDBoverride handling to support both numeric and string keys simultaneously. This ensures that custom server data (e.g., Ascension, Ebonhold) is correctly resolved regardless of how the third-party plugin formats its internal IDs. - [Refactor — Data Injection] Updated
QuestieLearner:InjectLearnedDatato enforce numeric key normalization. All dynamically learned spawn data is now strictly indexed by numeric IDs, preventing type-mismatch collisions during database merging. - [Feature — Enhanced Logging] Improved Stage 3 initialization logging to provide detailed reporting on custom data injection. Developers can now verify the exact number of NPCs, Objects, and Items injected by plugins directly from the
DEVELOPlog. - [Fix — Ascension Zone Mapping] Fixed a regression in
QuestieCompatwhereuiMapDatafor Ascension-specific zones was not correctly propagating to the global mapping table, restoring map pin functionality for seasonal and custom zones. - [Fix — QuestieLearner] Centralized zone/area ID lookup in
l10nmodule to preventGetAreaIdByLocalNamenil errors (Fixes Project Ebonhold runtime crash). - [Fix — Custom Server Compilation] Fixed database compilation not running on custom servers (Ascension, Ebonhold, Turtle WoW, etc.) where plugins inject data after initial load.
- Modified
Modules/QuestieInit.luaStage1 to defer compilation to Stage3 for custom servers, ensuring plugins finish injecting data before compilation runs. - Added
l10n:Initialize()andQuestieCorrections:MinimalInit()calls when deferring to Stage3, as Stage2 (QuestieJourney:Initialize()) requireshiddenQueststo be populated. - Added "Bronzebeard" and "Warcraft Reborn" to Ascension realm detection patterns in
Modules/QuestieServer.lua.
- Modified
- [Fix — Zone Mapping Bug] Fixed incorrect key assignment in
QuestiePluginAPI:InjectZoneTables(). ChangedareaIdToUiMapId[uiMapId] = uiMapIdtoareaIdToUiMapId[areaId] = uiMapIdat line 138. This caused zone lookups to fail, resulting in "No UiMapID or fitting parentAreaId" errors for custom zone IDs.
Known Issues (v1.5.0)
- [Ebonhold Detection] The
Questie.IsEbonholdflag detection remains brittle. It currently relies on a substring match againstGetRealmName(). Variations like "Test Ebonhold" or localized names may cause the flag to fail, resulting in missing Questie-X-Ebonhold features. A more robust detection pattern usingGetCVar("realmName")or server-pushed flags is planned for a future update.
v1.4.9 (2026-03-26)
- [Fix — Quest Cache] Resolved the "GetQuest: The quest doesn't exist in QuestLogCache" fatal error occurring during initialization on the Ascension WoW client.
- Implemented a robust retry mechanism in
_QuestEventHandler:InitQuestLogto wait for the game's quest log data to become fully available before populating the local cache. - Refactored
QuestLogCache.GetQuestandGetQuestObjectivesto fail gracefully (returningnilor{}, respectively) instead of throwing a fatal error when data is accessed prematurely during the initialization handshake.
- Implemented a robust retry mechanism in
- [Robustness] Improved cache-miss handling for
questId == 0and early-access calls from third-party addons during the login process. - [Fix — Validation Crash] Fixed crash in
DecodePointerMapwhen compiled database pointer map was empty or corrupted. Added defensive check to return empty table instead of crashing. - [Fix — Database Compiler] Added skip logic in
ValidateObjectsandValidateQuestswhen compiled binary data is missing, preventing validation failures on cached databases from incomplete previous sessions. - [Fix — Initialization] Modified
QuestieInitto skip validation in Stage 1 when plugins are pending, since plugins inject data after compilation and validation would compare stale pre-plugin data against post-plugin data. - [Fix — Quest Links] Fixed duplicate quest links when shift-clicking quests in the quest log (e.g., "[A Boar's Vitality] [A Boar's Vitality]"). Removed redundant
ChatEdit_InsertLinkcall fromQuestLogTitleButton_OnClickhook; Blizzard's native function now handles link insertion. - [Fix — Profiler] Fixed "memory allocation error: block too big" crash in
QuestieProfiler. Added early-exit logic inHookTableto skip large pure-data tables (e.g.,npcDataOverridesspawn coordinates) that don't benefit from profiling. - [Fix — Zone Mapping] Added UiMapId overrides for 1415 (Eastern Kingdoms) and 947 (Azeroth) in
zoneDB.luato resolve "No AreaId found" warnings on Ascension servers. - [Fix — Quest Validation] Fixed
QuestieValidateGameCacheto silently skip "ghost quests" (removed from database but still in quest log) instead of failing validation, resolving infinite retry loops on servers with custom quest content. - [Fix — AscensionDB] Fixed syntax error in
AscensionNpcDB_2.lua(missing closing}at end of NPC entry for ID 3287). - [Map Pin Gating] Learned map pins (sword icons) now only appear after reaching a configurable confidence threshold (default: 2).
- [Confidence in Tooltips] NPC and Object tooltips now display their confidence level (e.g.,
(Learned - Confidence: 2)). - [Timestamp Tracking] Added
lastSeen(ls) timestamps to all learned entries to track data freshness.
QuestieLearnerComms.lua — Global Data Sharing
- [Community Reinforcement] Expanded data sharing from Party/Guild to a global hidden channel. Confidence values (
mc) now increment when identical data is received from other Questie users, allowing the community to verify spawns collectively. - [Network Freshness] Receiving data over the network now refreshes the
lastSeentimestamp, keeping active community spawns from being pruned.
QuestieLearnerExport.lua — Tiered Stale Data Cleanup
- [Tiered Pruning] Implemented a robust cleanup system that protects "Verified" (high-confidence) data from age-based deletion.
- [Age-Based Pruning] "Unconfirmed" data is now automatically pruned if it hasn't been seen within a configurable timeframe (default: 90 days).
- [Redundancy Pruning] Logic to remove data already present in the official Questie database now respects the
pruneVerifiedtoggle, allowing users to keep verified personal data even if it overlaps with the core DB.
QuestieOptionsDatabase.lua — Advanced Cleanup Controls
- [Stale Data Threshold] Added a slider to control the age-pruning threshold (1-180 days) for unconfirmed data.
- [Verified Data Protection] Added a toggle to include or exclude verified data from redundancy pruning.
- [UI Reorganization] Refactored the Database tab's cleanup section for better logical flow and clarity.
v1.2.9 — QuestieLearner Cross-Link Engine + Tracker Zone Fix + Untrack Fix
QuestieLearner.lua — Universal Cross-Link Engine
- [Cross-link engine — full rewrite] Replaced the narrow NPC↔Quest cross-link stubs with a comprehensive bidirectional relationship engine covering all four entity types. Three shared primitives underpin the whole system:
_AddToArray(tbl, key, value, ovrTable, ovrId)adds a value to an array field and mirrors it to the live*DataOverridestable in the same call;_AddToNestedArraydoes the same for two-level nested arrays (used for quest starters/finishers sub-slots);_AddToQuestObjectiveinserts{entityId, text}pairs intoquest[10][slot](the objectives array) with the same dual-write pattern. Every write is idempotent (no-op if value already present). - [CrossLinkAfterNPC] Called whenever a new NPC ID is first committed to
learnedData.npcs. Iterates all learned quests: (a) if quest[2][1]contains this npcId → adds questId tonpc[10](questStarts); (b) if quest[3][1]contains this npcId → adds questId tonpc[11](questEnds); (c) walks quest[10][3](item objectives) — for each item whoseitem[2](npcDrops) already references this NPC, the NPC is injected intoquest[10][1]as a creature objective so it can receive map pins and tooltip text. - [CrossLinkAfterQuest] Called when a new quest is first committed to
learnedData.quests. Links all referenced entities: starter NPCs (quest[2][1]) → each known NPC'snpc[10]; starter objects (quest[2][2]) → each known object'sobj[2]; finisher NPCs (quest[3][1]) →npc[11]; finisher objects (quest[3][2]) →obj[3]; source item (quest[11]) →item[5](startQuest key per itemDB schema); item drop chain (quest[10][3]items whoseitem[2]lists known NPCs) → those NPCs are injected intoquest[10][1]as a creature objective. This means: learn a quest that needs Wolf Fur → later kill a wolf that drops it → the wolf NPC immediately becomes a tracked creature objective for that quest. - [CrossLinkAfterObject] Called when a new object is first committed to
learnedData.objects. Scans all learned quests: if quest[2][2]references this objectId → adds questId toobj[2](questStarts); if quest[3][2]references it → adds questId toobj[3](questEnds). - [CrossLinkAfterItem] Called when a new item is first committed to
learnedData.itemsAND whenever a new drop-NPC relationship is added viaLearnItemDrop. Two passes: (1) scan all learned quests forquest[11] == itemId→ setitem[5] = questId(item starts this quest); (2) scan all learned quests forquest[10][3]entries matching itemId — for each such quest, every NPC initem[2](drop sources) is injected intoquest[10][1]as a creature objective. This means: learn a quest that needs Wolf Fur → later kill a wolf that drops it → the wolf NPC immediately becomes a tracked creature objective for that quest. - [CrossLinkAfterQuestGiver] Now handles all three entity type slots (1=NPC, 2=Object, 3=Item) instead of only NPCs. For typeSlot=1: stitches
npc[10/11]↔quest[2/3][1]bidirectionally. For typeSlot=2: stitchesobj[2/3]↔quest[2/3][2]. For typeSlot=3: adds itemId toquest[2][3](item starters slot). All writes go to bothlearnedData(SavedVariables) and live*DataOverridestables simultaneously. - [LearnItemDrop hook] Now calls
CrossLinkAfterItem(itemId)every time a new NPC is added to an item's drop list, not just on initial item creation. This propagates the drop→quest objective chain retroactively. - [LearnQuest hook] Calls
CrossLinkAfterQuest(questId)on first creation of a quest record. - [LearnObject hook] Calls
CrossLinkAfterObject(objectId)on first creation of an object record. - [LearnItem hook] Calls
CrossLinkAfterItem(itemId)on first creation of an item record. - [Item schema correction] Fixed incorrect use of key
[9](itemLevel) for quest-source storage. Now correctly uses[5](startQuest) perQuestieDB.itemKeysschema. - [Mouseover — all NPCs now learned] Removed the
UnitReaction < 4early-return guard that blocked hostile/neutral NPC learning via mouseover. All NPCs are now learned on hover. The existingQUESTGIVERNPC-flag check remains as the primary filter for quest-relevant NPCs during mouseover. Hostile quest objective NPCs are now captured on any interaction (mouseover, targeting, or kill) and are correctly cross-linked to relevant quests.
TrackerUtils.lua — Zone Resolution Rewrite
- [GetQuestLogZoneName — canonical 3.3.5 zone lookup] Added new local function
GetQuestLogZoneName(questId). Implements the canonical 3.3.5a zone resolution method: iterates the quest log from index 1 toGetNumQuestLogEntries()to locate the quest's log index, then walks backwards from that index checkingisHeaderuntil the nearest zone header title is found. This is the only fully reliable zone name source in 3.3.5a — the client places zone header entries (whereisHeader=true) immediately above the quests belonging to that zone in the quest log flat list.GetRealZoneText()andGetCurrentMapAreaID()are unreliable because they depend on the currently viewed map, not the quest's actual zone. - [BuildFallbackQuest — zone via log walk] Replaced the previous
GetRealZoneText()call with the quest log header walk. The existing loop that iterates the quest log to find the quest entry now continues backwards from that index to find the header title.GetAreaIdByZoneName()is still called to convert the string to an area ID forzoneOrSort, but the string itself is always the ground truth used for display. - [_isLogFallback patch block — zone fix] The block that patches QuestLogCache fallback objects (those with
_isLogFallback=truebut noIsCompletemethod) now callsGetQuestLogZoneName(capturedId)immediately after patchingObjectives/SpecialObjectives/ExtraObjectives. If a zone name is returned, bothquest.zoneNameandquest.zoneOrSortare set on the object. Previously this block leftzoneOrSort=0andzoneName=nil, causing every fallback quest to group under "Unknown Zone". - [Fallback cache invalidation]
_fallbackQuests[qid]is now evicted and rebuilt if the cached entry has nozoneName. This handles the case whereBuildFallbackQuestwas called during addon init (before the quest log was fully populated) and cached a zoneless entry. - [GetAreaIdByZoneName preserved] Still available for converting zone header strings to numeric area IDs for
zoneOrSort. The area ID is used by the proximity sort and zone grouping logic; the string is used for display labels.
QuestieTracker.lua — Untrack Fix
- [UntrackQuestId — logic was inverted]
UntrackQuestIdwas settingAutoUntrackedQuests[questId] = nilwhen untracking. The tracker filter readsnot Questie.db.char.AutoUntrackedQuests[questId]—nilevaluates as "show this quest", so clearing the entry on untrack immediately re-showed the quest on the next update tick. Fix: whenautoTrackQuests = true, untrack now setsAutoUntrackedQuests[questId] = true(hide); whenautoTrackQuests = false, it clearsTrackedQuests[questId](manual mode). The two modes are now cleanly separated. - [AQW_Insert — removed QuestLogFrame gate] The
IsShiftKeyDown() and QuestLogFrame:IsShown()guard that was blocking re-tracking quests from outside the quest log frame has been removed. Re-tracking (clearingAutoUntrackedQuests[questId]) now works from any context. The shift-click-to-untrack path was already handled byRemoveQuestWatch→UntrackQuestId; this gate was only blocking the re-track flow. - [Quest completion cleanup]
_RemoveQuestIdFromCharTablesalready clearsAutoUntrackedQuestswhen a quest leaves the log (completed or abandoned), preventing stale hidden-quest entries in SavedVariables.
v1.2.7 — WotLKDB Plugin Stats Fix + Kill Tracking Refinement
QuestieInit.lua — LoadBaseDB Count Tracking
- [WotLKDB stats fix]
LoadBaseDB()now counts all four data tables (questData,npcData,objectData,itemData) before clearing theQuestieX_WotLKDB_*globals. Counts are stored in_G.QuestieX_WotLKDB_CountsforLoader.luato read atPLAYER_LOGIN. This resolves WotLKDB showingQuests:0 NPCs:0 Objects:0 Items:0in the Advanced options plugin panel.
QuestieLearner.lua — Kill Coordinate Filtering
- [Kill tracking scoped to quest NPCs]
OnCombatLogEvent(UNIT_DIED)now only records kill coordinates when the killed NPC is either: (a) already present inQuestieDB(known quest objective mob), or (b) explicitly present in_Learner.guidNpcCache(was targeted or moused over as a known quest giver before the kill). Random mob kills that match neither condition are silently ignored. This prevents the learner from accumulating useless entries for every creature killed while questing. - [Removed dead hex-prefix fallback branch] The "hex prefix scan for untargeted creatures not in cache" comment block was removed — it was a no-op that could never produce an NPC ID.
Questie-X-WotLKDB Loader.lua — Plugin Stats Population
- [Read counts from QuestieX_WotLKDB_Counts] After
RegisterPlugin("WotLKDB"), Loader.lua reads the counts global set byLoadBaseDB()and assigns them toplugin.stats.QUEST/NPC/OBJECT/ITEM. Frees the global after reading. Plugin panel now displays correct totals (e.g.,Quests: 9086).
Research Folder
- Added
Research/QuestieLearner-Verification.md— step-by-step in-game test guide covering all 12 QuestieLearner subsystems (mouseover filter, quest accept/turn-in, kill coords, item loot async retry, object detection, export/import round-trip, plugin panel stats, peer sharing). - Added
Research/SessionSummary-2026-03-16.md— full developer session log covering all architectural decisions, errors, and fixes from the plugin architecture overhaul through the QuestieLearner rewrite.
v1.2.6 — QuestieLearner Comprehensive Overhaul
Rewrote QuestieLearner from scratch to fix all known data-capture deficiencies. Adds full quest field coverage, grid-based coordinate clustering, quest-giver-only mouseover filtering, async item-info retry, object loot detection, and live inject-on-import so imported data takes effect without a reload.
QuestieLearner.lua — Full Rewrite
- [Quest capture completeness]
LearnQuestnow accepts a genericdatatable keyed by Questie wiki array indices rather than individual positional arguments.OnQuestDetailcaptures title, objectives text block, quest description body, and current zone aszoneOrSort[8].OnQuestAcceptedfills quest level fromGetQuestLogTitle, per-objective text fromGetQuestLogLeaderBoard, and required money fromGetQuestLogRequiredMoney.OnQuestCompletecaptures finish/reward text viaGetRewardText. - [Mouseover filter]
OnMouseoverUnitnow only learns an NPC if itsUnitNPCFlagsbitmask includes theQUESTGIVERbit (0x02), OR if the NPC already exists inQuestieDBas a known quest starter/finisher. All other NPCs are silently ignored — this eliminates the flood of irrelevant NPC entries the learner previously accumulated. - [Target changed]
OnTargetChangedno longer callsLearnNPCon every target switch. It now only populates theguidNpcCachefor kill-tracking purposes, avoiding recording non-quest NPCs. - [Coordinate clustering — grid bucketing] Replaced the naive "within 1 unit radius" deduplication with a 2×2 grid bucket scheme (
COORD_GRID = 2.0). A new point is inserted only when no existing point shares the same grid cell. This prevents coordinate scatter across a kill area while still preserving distinct spawn clusters. TheInsertIfNewBuckethelper is shared across NPC, Object, and all merge paths (includingInjectLearnedDataandHandleNetworkData). - [Object recording]
OnLootOpenednow checks whether the loot source GUID is aGameObject(not just a creature). If so,LearnObjectis called with the object's ID and name.OnGossipShowrecords both objects and NPCs viaGetIdAndTypeFromGUID.OnQuestDetailandOnQuestCompletealso record the interacting object when the quest giver/finisher is aGameObject. - [Item loot — async GetItemInfo retry]
OnLootOpenedqueues unresolved item links (whereGetItemInforeturns nil because the item is not yet in the client cache) into_Learner.pendingItemLinks. A newOnGetItemInfoReceived(itemId)handler fires on theGET_ITEM_INFO_RECEIVEDevent, resolves queued links for that item ID, and callsLearnItem/LearnItemDroponce the data is available. This fixes silent data loss on first-encounter loots. - [Quest giver entity type]
LearnQuestGivernow accepts anentityTypeargument (1=NPC, 2=GameObject, 3=item) and stores starters/finishers in the correct sub-array slot matching the Questie wiki spec{ [1]={npcIds}, [2]={objIds}, [3]={itemIds} }. - [Kill tracking fallback]
OnCombatLogEventretains all three GUID-resolution paths (dash-split, GUID cache, hex-prefix) with a 10-minute TTL cache cleanup. UsesCombatLogGetCurrentEventInfo()with fallback to varargs for cross-client compatibility. - [GET_ITEM_INFO_RECEIVED event] Registered in
RegisterEventsso the async item retry path fires correctly. - [InjectLearnedData — grid clustering] All coordinate merge loops in
InjectLearnedDatanow useInsertIfNewBucketinstead of the old radius check.
QuestieLearnerExport.lua — Import Live-Inject Fix
- [MergeImport → InjectLearnedData] After
MergeTypecompletes for all four categories,MergeImportnow immediately callsQuestieLearner:InjectLearnedData(). Imported data is pushed intoQuestieDB.*DataOverridesin the same frame — override-driven map pins update without a/reload. A full reload is still needed to pick up newly imported quest starters/finishers for quests already tracked in the player's quest log.
README — Import Clarification
- Corrected the "no reload required" claim. The import flow now accurately describes when an immediate effect is visible versus when a
/reloadis beneficial.
v1.2.5 — Ebonhold DB Plugin Load Fix
Fixed a fatal load-time crash in all four Ebonhold DB files caused by calling
GetRealmName()andQuestieLoader:CreateModule()at file scope (before WoW's API is fully available). Switched to plain global table population; realm-gating and injection remain safely deferred toEbonholdLoader.lua'sPLAYER_LOGINhandler.
Questie-X-EbonholdDB — DB File Refactor
- [Root cause]
EbonholdNpcDB.lua,EbonholdObjectDB.lua,EbonholdItemDB.lua, andEbonholdQuestDB.luaeach started withif GetRealmName() ~= "Rogue-Lite (Live)" then return endfollowed immediately byQuestieLoader:CreateModule("EbonholdDB"). Both calls execute at file-load time (duringLoadAddOn()), beforePLAYER_LOGINhas fired and beforeQuestieLoaderis guaranteed to be populated. This producedattempt to index global 'QuestieLoader' (a nil value)on every load. - [Ebonhold/EbonholdNpcDB.lua] Removed file-level realm guard and
QuestieLoader:CreateModulecall. Replaced with_G.EbonholdDB = _G.EbonholdDB or {}and a local alias. Data is now populated unconditionally into the global at load time. - [Ebonhold/EbonholdObjectDB.lua] Same fix as NpcDB.
- [Ebonhold/EbonholdItemDB.lua] Same fix as NpcDB.
- [Ebonhold/EbonholdQuestDB.lua] Same fix as NpcDB.
- [EbonholdLoader.lua] Replaced
QuestieLoader:ImportModule("EbonholdDB")with_G.EbonholdDB or {}. The loader's existingPLAYER_LOGINhandler with realm check remains intact as the sole gate for injection into Questie-X.
v1.2.2 — DB Plugin Pull Architecture & Compiler Hardening
Overhauled the DB plugin loading pipeline from a fragile push/bridge pattern to a direct pull at init time. Fixed a long-standing compiler bug that silently dropped
extraobjectivecondition data. Removed allDevTools_Dumpcalls that were printing raw Lua table syntax to chat during validation.
DB Plugin Architecture — Pull Pattern
- [QuestieInit:LoadBaseDB] Replaced the broken
QuestieX_CoreDBbridge mechanism with a direct pull of DB plugin globals at init time.LoadBaseDB()now checks forQuestieX_WotLKDB_quest,QuestieX_WotLKDB_npc,QuestieX_WotLKDB_object, andQuestieX_WotLKDB_itemglobals and assigns them directly toQuestieDB.*Databefore callingLoadDatabase()on each key. Globals are cleared (= nil) after transfer to free memory. This approach is unconditionally reliable — it runs inside Questie-X's own init coroutine at a known point in the load sequence, with no dependency on cross-addon module references. - [QuestieInit:LoadBaseDB — diagnostics] Replaced the old "WotLKDB addon loaded / SplitLoaded flag / quest global" diagnostic lines with new pull-result lines:
WotLKDB pull: quest=true/false npc=true/false obj=true/false item=true/falseand per-key type/length lines, making it immediately obvious whether the DB plugin data was absorbed. - [QuestieDB.lua] Removed
_G.QuestieX_CoreDB = QuestieDBexport. The CoreDB bridge global is no longer needed and was never reliably accessible from DB plugin Loader.lua files due to module-registry timing.
DB Plugin — Loader.lua Simplification
- [Questie-X-WotLKDB/Loader.lua] Stripped the entire data-transfer block (the
if not QuestieX_CoreDB then return endguard and subsequentQuestieX_CoreDB.*Data = ...assignments). The file is now purely aPLAYER_LOGINhandler that: registers the plugin withQuestiePluginAPI, counts and logs the absorbed quest/NPC/object/item table sizes viaQuestieDBmodule reference, and emits aDEBUG_CRITICALwarning ifquestDatais still empty after init (indicating a load-order or split-file failure). This makes Loader.lua a diagnostic and registration stub rather than a critical data pathway.
Compiler — extraobjectives Conditions Field
- [compiler.lua — writer
extraobjectives] Added serialization ofdata[6](conditions table). After writing the 5 existing fields per entry (spawnlist, icon, description, objectiveIndex, reflist), the writer now writes aWriteByte(n)count followed byWriteShortString(key)+WriteInt24(value)for each condition entry. Ifdata[6]is nil or not a table, writes0(no conditions). - [compiler.lua — reader
extraobjectives] Added deserialization of the conditions field. After reading the 5 fields per entry, reads aReadByte()condition count; if non-zero, reconstructs the conditions table as{[key]=value}and assigns it toentry[6]. If count is 0,entry[6]is left nil (no allocation). - [compiler.lua — skipper
extraobjectives] Updated to skip condition bytes: reads the condition count byte, then for each condition skips aShortString(ReadShort() + _pointer) and anInt24(_pointer + 3). - [Root cause]
QuestieDB.lua:1443readsHideCondition = o[6]from each extraobjective at quest-object build time. Before this fix, compiled data always producedo[6] = nil, soShouldHideObjective()never activated. ThehideIfQuestActive/hideIfQuestCompleteconditions defined in corrections (e.g. quest 12924 — "Pick up 'You Can't Miss Him'") were silently ignored post-compilation. Validation also flagged the mismatch on every load, which triggeredDevTools_Dumpto flood chat with raw Lua table syntax.
Compiler — DevTools_Dump Removal
- [compiler.lua — ValidateNPCs / ValidateObjects / ValidateItems / ValidateQuests] Removed all four
DevTools_Dump({["Compiled Table:"]=a, ["Base Table:"]=b})calls from the table-mismatch branches in each validator. These calls serialized full Lua tables to the chat frame as raw source code, which appeared to users as a syntax error or data corruption. The precedingQuestie:Warning(...)line in each branch already captures the mismatch identity (key, field id, entry ID).DevTools_Dumpis a retail WoW debugging API unavailable or unreliable on private/custom servers and should not be called in production validation paths.
v1.2.4 — Retail/SoD Corrections Removed
Deleted all Season of Discovery, Season of Mastery, and Hardcore correction files. These were retail-specific and never referenced by the TOC. Cleaned up all dead imports, constants, and code branches they left behind in
QuestieCorrections.lua.
Files Deleted
Database/Corrections/SeasonOfDiscovery.lua— SoD base quest/NPC/object/item overridesDatabase/Corrections/sodQuestFixes.lua— SoD quest correctionsDatabase/Corrections/sodNPCFixes.lua— SoD NPC correctionsDatabase/Corrections/sodItemFixes.lua— SoD item correctionsDatabase/Corrections/sodObjectFixes.lua— SoD object correctionsDatabase/Corrections/Automatic/sodBaseQuests.lua— SoD auto-generated base questsDatabase/Corrections/Automatic/sodBaseNPCs.lua— SoD auto-generated base NPCsDatabase/Corrections/Automatic/sodBaseItems.lua— SoD auto-generated base itemsDatabase/Corrections/Automatic/sodBaseObjects.lua— SoD auto-generated base objectsDatabase/Corrections/HardcoreBlacklist.lua— Hardcore mode quest blacklistDatabase/Corrections/SoMPhases.lua— Season of Mastery phase data (was already commented out in TOC)
QuestieCorrections.lua Cleanup
- Imports removed:
HardcoreBlacklistandSeasonOfDiscoveryImportModulecalls deleted. - Constants removed:
SOD_ONLY = 5andHIDE_SOD = 6deleted from the expansion filter enum. Remaining constants (TBC_ONLY,CLASSIC_ONLY,WOTLK_ONLY,TBC_AND_WOTLK,CLASSIC_AND_TBC) are unchanged. filterExpansion: removed theisSoDlocal and the twoSOD_ONLY/HIDE_SODbranches.MinimalInit: removed theif Questie.IsSoD then addOverride(...SeasonOfDiscovery:LoadFactionQuestFixes()...) endblock.MinimalInit: removed theif Questie.IsHardcore then HardcoreBlacklist:Load() endblock.Initialize: removed the 8-callif Questie.IsSoD then SeasonOfDiscovery:LoadBase*/Load*() endblock covering quest/NPC/item/object base data and fixes.- TOC: removed the commented-out
#Database\Corrections\SoMPhases.lualine.
v1.2.3 — Diagnostics Refactor & Monolithic DB Removal
Moved all DB init diagnostics out of chat and into the Develop debug level. Replaced hardcoded quest-ID spot-checks with generic per-table stats. Removed the stale monolithic database folders that have been fully superseded by the DB plugin architecture.
DB Init Diagnostics — DEVELOP Level
- [QuestieInit — _dbStats helper] Added a local
_dbStats(t)function that returnscount=N minID=X maxID=Yfor any table. Used at every checkpoint so diagnostic output is meaningful for any server's dataset without hardcoding expansion-specific IDs. - [QuestieInit — _dbDiag table removed] Eliminated the
local _dbDiag = {}accumulator table and the deferredC_Timer.After(6, ...)print block. Diagnostics are now emitted inline asQuestie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] ...")calls at the exact point each stage completes, making them visible in real time when Develop logging is enabled rather than appearing as a delayed flood 6 seconds after load. - [QuestieInit:LoadBaseDB] Pull result line (
WotLKDB pull: quest=... npc=... obj=... item=...) converted toDEBUG_DEVELOP. - [QuestieInit:loadFullDatabase] Four diagnostic checkpoints converted to
DEBUG_DEVELOPwith generic_dbStatsoutput: After LoadBaseDB (quest + npc on one line, obj + item on the next), After Corrections (quest + npc), Before Compile (quest + npc), After Compile (type= of each key, confirming binary serialization completed). - [QuestieInit:LoadDatabase — error paths] Two
_dbDiagpush lines forloadstringparse errors andpcallexecution errors converted toDEBUG_DEVELOP. - [QuestieInit.Stages[1] — cached path]
DB was CACHED (no recompile)line converted toDEBUG_DEVELOP.
DB Plugin — Loader.lua Premature Count Check Removed
- [Questie-X-WotLKDB/Loader.lua] Removed the
countTable/ quest+npc+obj+item count block and theDEBUG_CRITICAL"questData is empty" warning that fired atPLAYER_LOGIN. This check always reported zero counts because it ran beforeQuestieInit's loading coroutine had started. The[DBDiag]lines (now atDEBUG_DEVELOP) are the correct place to verify data absorption. Loader.lua is now a minimal registration stub: registers the plugin withQuestiePluginAPI, prints the confirmed registration line, and callsplugin:FinishLoading.
Monolithic Database Folders Removed
- [Database/Classic/] Deleted
classicQuestDB.lua(1.0 MB),classicNpcDB.lua(2.0 MB),classicObjectDB.lua(1.0 MB),classicItemDB.lua(2.1 MB). These monolithic files were never listed inQuestie-X.tocand would have been silently skipped by WoW 3.3.5 anyway due to the ~1 MB per-file parse limit. Classic data is now provided exclusively by the ClassicDB plugin. - [Database/TBC/] Deleted
tbcQuestDB.lua(1.6 MB),tbcNpcDB.lua(3.5 MB),tbcObjectDB.lua(1.6 MB),tbcItemDB.lua(3.3 MB). TBC data is now provided exclusively by the TBCDB plugin. - [Database/Wotlk/] Deleted
wotlkQuestDB.lua(2.3 MB),wotlkNpcDB.lua(5.2 MB),wotlkObjectDB.lua(2.0 MB),wotlkItemDB.lua(4.4 MB). WotLK data is now provided exclusively by the WotLKDB plugin via the split-file mechanism. Combined removal: ~30 MB of dead weight from the core repository.
v1.1.7 - v1.2.1 — DB Loading Diagnostics & Fallback Tracker
Ongoing stability pass. Hardened the entire database loading pipeline, wired up the live quest-log fallback for quests missing from the DB, and fixed a chain of nil-guard crashes across corrections, map, and tracker modules.
Database Loading
- [LoadDatabase] Replaced bare
loadstring()/fn()calls with proper error capture (local fn, err = loadstring(...)+pcall(fn)). Errors now print to chat with the failing key and string length instead of silently falling back to{}. - [Compiler] Fixed
hasDataguard inQuestieDBCompiler:Compile()— now acceptstype == "table"in addition to"string", preventing the compiler from silently aborting whenLoadDatabasehas already decoded the string to a table before compilation. - [DB Architecture] Identified and documented that loading multiple DB plugins simultaneously (e.g. WotLKDB + ClassicDB) causes
questDataoverwrites. On WotLK servers onlyQuestie-X-WotLKDBshould be enabled alongside the server-specific plugin.
Live Fallback for Missing Quests
- [QuestieDB.GetQuest] When
rawdatais nil, a minimal quest object is now built fromQuestLogCacheinstead of returning nil. The fallback populatesname,level,isComplete, and an emptyObjectivestable with_isLogFallback = true. - [QuestieQuest.PopulateQuestLogInfo] Fallback quests now seed their
Objectivestable fromQuestLogCache.GetQuestObjectiveson first call, then callobj:Update()on each to refresh progress from the live quest log. - [QuestieQuest.UpdateObjectiveNotes] Fallback quests now early-return to skip the static DB spawn-list path (
objectiveSpawnListCallTable), preventing "Corrupted objective data" errors caused by nil NPC IDs.
Crash Fixes
- [QuestieLib.GetQuestString] Guard against nil
name— returns quest ID string as fallback (tracker error for quest 10482). - [QuestieDB spawn loop] Nil-guard on
objectData[id]before clearing spawn keys in prune loop (attempt to index nil at QuestieDB:1715). - [QuestieDB.GetSpawnList] Wrapped
objectiveSpawnListCallTableresult in nil-guard before iterating — preventspairs(nil)when a referenced NPC/object is missing from the loaded DB. - [QuestieQuestPrivates killcredit]
monster(killCreditNpcId)result nil-guarded before indexing — prevents crash for kill-credit NPCs absent from npcData. - [Townsfolk]
flagsnil-guard added beforebitband(flags, VENDOR)call (bad argument #1 to bitband). - [QuestieQuest.UpdateObjectiveNotes]
quest.SpecialObjectivesnil-guard beforenext()call. - [QuestieQuest.PopulateQuestLogInfo]
quest.SpecialObjectivesnil-guard beforenext()call.
Junctions & Dev Environment
- Created
mklink /Jjunctions forQuestie-X-TBCDBandQuestie-X-ClassicDBinto Ebonhold AddOns folder for live in-game testing.
v1.1.6 — Minimap Icon & P2 Stability
Minimap button overhaul and second pass of P2 bug fixes.
Minimap
- [MinimapIcon] Replaced default minimap icon with custom
mmapIcon.tga. AppliedSetMaskfor circular clip on WotLK+ clients withSetTexCoordfallback for 1.12 vanilla clients.
Bug Fixes (P2)
- [QuestieServer] Restored plugin status UI,
C_QuestLog/C_Mapshims, andQuestieServerinit sequence. - [QuestieLoader] Corrected
select()polyfill to not useargtable. - [TOC] Added XXH load to TBC toc and guarded
plugin.statsnil access.
v1.1.5 — QuestieLearner Expansion & Database Options
Major expansion of the data-learning system and a new Database options tab.
QuestieLearner
- [QuestieLearner] Expanded hook coverage: quest accept, objective kill, object interaction, and item loot all feed learned data back to the appropriate DB table.
- [QuestieLearnerComms] Broadcast/receive learned entries to nearby Questie-X users via addon messages.
- [Custom Server Detection] Learned data for unrecognised quest IDs is stored under a per-realm key in
QuestieLearnerDBto separate retail/private/custom content. - [DEVELOP logging] Debug messages emitted on every successful learn and every failed-to-learn event.
Options — Database Tab
- [QuestieOptionsDatabase] New "Database" tab with Import / Export (LibDeflate base64 encoded strings) and Cleanup (prune stale learned entries) functionality.
v1.0 - v1.1.4 — Questie-X: Plugin Architecture & Maintenance Update
This release marks the official rebranding from Questie-335 / PE-Questie to Questie-X and introduces the new plugin architecture. Additionally, this version includes significant UI enhancements, core compatibility refinements for legacy clients, and critical database corrections.
Architecture Changes
- [Repo] Repository renamed and re-homed to
Xurkon/Questie-X. Remote updated fromPE-QuestietoQuestie-X. - [Plugin API] Introduced
QuestiePluginAPI(Modules/Libs/QuestiePluginAPI.lua). Plugins register themselves and inject quest, NPC, object, item, and zone data without modifying core files. - [Server Detection] Added
QuestieServermodule (Modules/QuestieServer.lua) for improved runtime server environment detection. - [Network] Added
QuestieLearnerCommsmodule (Modules/Network/QuestieLearnerComms.lua) for cross-client quest data sharing. - [Database] Removed embedded
Database/Ascension/andDatabase/Ebonhold/folders. All custom server data is now distributed via separate plugin addons.
UI Enhancements
- [Options] Resizable Options window! The Questie options UI can now be resized with corner drag functionality. Size and position persist between sessions.
- [Options] New Credits Tab! A dedicated tab in the options menu to acknowledge contributors and community partners.
- [Tutorial] Improved tutorial flows for objective type selection.
Core & Stability (v1.3.5)
- [Lua 5.0] Globally polyfilled
string.matchandstring.gmatchusingstring.findandstring.gfindto ensure universal compatibility with legacy WoW clients (e.g., Turtle WoW). - [AceTimer] Patched embedded
AceTimer-3.0instances in ElvUI and OG-RaidHelper to resolvemath.moderrors on Lua 5.0 clients. - [Colors] Updated
CreateColorpolyfill withSetRGB,SetRGBA,SetColor, andGetColormethods. - [Comm] Improved cross-client data sharing stability.
Map & Tooltips
- [Tooltips] NPC names and objective text now populate reliably on map pins and world unit tooltips.
- [Tooltips] Resolved
[QuestieTooltips:GetTooltip] m_20509debug log spam.
Quest Data
- [Database] Scraped and injected missing spawn coordinates for Bonechewer Mutant, Raider, Evoker, and Scavenger (NPC IDs 16876, 16925, 19701, 18952) from Wowhead.
- [Quest 10482] Correctly mapped Bonechewer NPCs to quest objectives in both WotLK and TBC database correction files.
New Plugins
- Questie-Ascension — Project Ascension server database.
- Questie-Ebonhold — Ebonhold server database. Questie-X-EbonholdDB
TOC / Addon Identity
- [TOC] Core addon
.tocfiles updated toQuestie-Xtitle andv1.3.8 - [Libs] Added
LibDeflate,XXH_Lua_Lib,LibDBIcon-1.0, andLibDataBroker-1.1to the Libs directory.
Bug Fixes
- [QuestieDB] Overhauled
QuestieDB.IsCompleteto accurately verify all objectives are finished usingnumFulfilled == numRequiredinstead of the unreliable server-sidefinishedflag.- Resolves completion state bugs for quests using consumable items (e.g. Cold Iron Key for quest 12843).
- Fixed Quest Arrow priority logic to properly transition to finishers once objectives are complete.
- [QuestieQuest] Implemented
HideConditionmechanism for objectives, allowing specific spawns to be hidden based on quest log status (hideIfQuestActive/hideIfQuestComplete). - [Cache] Demoted Cache Validation "0/15 Error" to Debug level to reduce user confusion during login and reloads.
- [Network] Fixed sender trust validation in
QuestieLearnerComms.
v9.9.2 — Final Pre-Refactor Release
⚠️ This is the final stable release before a major architectural refactoring. All active features and quest data from previous releases are preserved. Future versions will introduce breaking changes to improve multi-server support, the database plugin system, and the zone registration API.
Fixes
- [Map] Resolved an issue where NPC names and objective text were inconsistently missing from map tooltips.
- Added support for
killcreditandspellobjective types inMapIconTooltip.lua. - Implemented proactive creature name prepending in
QuestieTooltips:GetTooltipto ensure data visibility for rare/custom objectives.
- Added support for
New Ebonhold Quests
🗺️ Azeroth
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50187 | Western Plaguelands Trophy | Western Plaguelands | Kill 1 Rare (tracked rares) |
NPC Data
- classicNpcDB.lua / EbonholdNpcDB.lua: Injected spawn coordinates for Western Plaguelands rare NPCs to support quest 50187.
Documentation
- Completed a full deep-dive code audit of the entire addon codebase.
- Identified areas for improvement including server-agnostic design, version detection improvements, a plugin architecture for custom server databases, configurable level caps, and several code quality issues.
- Audit findings exported to the project research folder.
v9.9.1
New Ebonhold Quests
🗺️ Azeroth
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50057 | Brood of the Black Flight | Burning Steppes | Kill 30 Dragonkin (10 NPCs tracked) |
NPC Data
- EbonholdNpcDB.lua: Injected spawn coordinates for 10 Dragonkin NPCs in Burning Steppes (IDs 7040-7049) to support quest 50057.
v9.9.0
New Ebonhold Quests
🗺️ Azeroth
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50128 | Southern Jungle | Stranglethorn Vale | Complete 6 quests |
🌿 Kalimdor
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50006 | Sandstone Giants | Tanaris | Kill Sandstone Giants |
| 50130 | Felwood Restoration | Felwood | Complete 6 quests |
Fixes
- [Quest] Fixed
QuestieDBinitialization error caused by missing table depth for custom creature objectives inEbonholdQuestDB. - [System] Adjusted
Questie:Erroroutput logic so that critical addon-breaking errors always print regardless of theEnable Debug-PRINTsetting. - [Map] Fixed missing map pins for "Sandstone Giants" quest — changed objective type from
creatureObjectivetokillCreditObjectiveso Questie correctly resolves spawn locations from the NPC database. - [Tracking] Fixed collection quest counters showing stale counts when the Ebonhold scav bot loots items — implemented a 3-stage
BAG_UPDATE_DELAYEDstrategy: immediate scan, 0.3s debounce scan, and a 2s follow-up scan to allow the server's quest-objective cache to flush batch loot counts.
v9.8.9
New Ebonhold Quests
🗺️ Azeroth
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50178 | Badlands Trophy | Badlands | Kill 1 Rare (10 rares tracked) |
| 50176 | Arathi Trophy | Arathi Highlands | Kill 1 Rare (10 rares tracked) |
| 50175 | Alterac Trophy | Alterac Mountains | Kill 1 Rare (8 rares tracked) |
| 50162 | Wetlands Trophy | Wetlands | Kill 1 Rare (8 rares tracked) |
| 50160 | Redridge Trophy | Redridge Mountains | Kill 1 Rare (8 rares tracked) |
| 50157 | Modan Trophy | Loch Modan | Kill 1 Rare (7 rares tracked) |
| 50156 | Westfall Trophy | Westfall | Kill 1 Rare (9 rares tracked) |
| 50173 | Northern Jungle Trophy | Stranglethorn Vale | Kill 1 Rare (9 rares tracked) |
| 50183 | Southern Jungle Trophy | Stranglethorn Vale | Kill 1 Rare (9 rares tracked) |
| 50164 | Tirisfal Trophy | Tirisfal Glades | Kill 1 Rare (9 rares tracked) |
| 50153 | Morogh Trophy | Dun Morogh | Kill 1 Rare (6 rares tracked) |
| 50097 | Elwynn Errands | Elwynn Forest | Complete 6 quests |
| 50098 | Morogh Missions | Dun Morogh | Complete 6 quests |
| 50105 | Redridge Resolve | Redridge Mountains | Complete 6 quests |
🌿 Kalimdor
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50154 | Teldrassil Trophy | Teldrassil | Kill 1 Rare (6 rares tracked) |
| 50034 | Ashen Corruption | Ashenvale | Kill 40 Demons (23 NPCs tracked) |
| 50020 | Spires of Chaos | Thousand Needles | Kill 30 Elementals (5 NPCs tracked) |
| 50099 | Shadow of Teldrassil | Teldrassil | Complete 6 quests |
| 50103 | Darkshore Defense | Darkshore | Complete 6 quests |
| 50104 | Bloodmyst Recovery | Bloodmyst Isle | Complete 6 quests |
| 50100 | Azuremyst Aid | Azuremyst Isle | Complete 6 quests |
| 50108 | Trials of Durotar | Durotar | Complete 6 quests |
🌋 Outland
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50197 | Shadowmoon Trophy | Shadowmoon Valley | Kill 1 Rare (3 rares tracked) |
| 50195 | Blade's Edge Trophy | Blade's Edge Mountains | Kill 1 Rare (3 rares tracked) |
| 50196 | Netherstorm Trophy | Netherstorm | Kill 1 Rare (3 rares tracked) |
| 50192 | Zangarmarsh Trophy | Zangarmarsh | Kill 1 Rare (3 rares tracked) |
| 50045 | Demon's at the Edge | Blade's Edge Mountains | Kill 40 Demons (37 NPCs tracked) |
| 50044 | Fel Scars of Nagrand | Nagrand | Kill 40 Demons (14 NPCs tracked) |
| 50026 | Elemental Balance | Nagrand | Kill 30 Elementals (12 NPCs tracked) |
| 50060 | Skies of Blade's Edge | Blade's Edge Mountains | Kill 30 Dragonkin (17 NPCs tracked) |
| 50083 | Forest Stalkers | Terokkar Forest | Kill 75 Beasts (53 NPCs tracked) |
| 50082 | Marsh Predators | Zangarmarsh | Kill 75 Beasts (34 NPCs tracked) |
| 50085 | Savage Heights | Blade's Edge Mountains | Kill 75 Beasts (47 NPCs tracked) |
| 50086 | Unstable Fauna | Netherstorm | Kill 75 Beasts (18 NPCs tracked) |
| 50087 | Shadowed Beasts | Shadowmoon Valley | Kill 75 Beasts (25 NPCs tracked) |
| 50111 | Song of the Woods | Eversong Woods | Complete 6 quests |
❄️ Northrend
| ID | Quest | Zone | Type |
|---|---|---|---|
| 50200 | Fjord Trophy | Howling Fjord | Kill 1 Rare (3 rares tracked) |
| 50201 | Dragonblight Trophy | Dragonblight | Kill 1 Rare (3 rares tracked) |
| 50202 | Grizzly Trophy | Grizzly Hills | Kill 1 Rare (4 rares tracked) |
| 50203 | Zul'Drak Trophy | Zul'Drak | Kill 1 Rare (4 rares tracked) |
| 50199 | Borean Trophy | Borean Tundra | Kill 1 Rare (3 rares tracked) |
| 50205 | Storm Peaks Trophy | The Storm Peaks | Kill 1 Rare (4 rares tracked) |
| 50063 | Frostbound Brood | Borean Tundra | Kill 30 Dragonkin (16 NPCs tracked) |
| 50064 | Heart of the Dragonflights | Dragonblight | Kill 30 Dragonkin (49 NPCs tracked) |
| 50066 | Stormforged Scales | The Storm Peaks | Kill 30 Dragonkin (7 NPCs tracked) |
| 50030 | Tundra Turbulence | Borean Tundra | Kill 30+ Elementals (14 NPCs tracked) |
| 50031 | Stormbound | The Storm Peaks | Kill 30 Elementals (11 NPCs tracked) |
| 50089 | Tundra Hunters | Borean Tundra | Kill 75 Beasts (43 NPCs tracked) |
| 50094 | Wild Basin | Sholazar Basin | Kill 75 Beasts (29 NPCs tracked) |
| 50095 | Peak Predators | The Storm Peaks | Kill 75 Beasts (24 NPCs tracked) |
| 50096 | Peak Predators | Icecrown | Kill 75 Beasts (12 NPCs tracked) |
| 50145 | Fjord Front | Howling Fjord | Complete 6 quests |
| 50149 | Basin Expeditions | Sholazar Basin | Complete 6 quests |
| 50150 | Storm Peak Orders | The Storm Peaks | Complete 6 quests |
| 50151 | Icecrown Advance | Icecrown | Complete 6 quests |
NPC Data
- classicNPCFixes.lua: Injected spawn coordinates for NPC 14224 (7:XT <Long Distance Recovery Unit>, Badlands). The native
wotlkNpcDBentry for ID 14224 is a different NPC (Gnomeregan's Instance Recovery Unit) andclassicNpcDBhad no entry — all 74 Wowhead patrol coordinates for zone 3 (Badlands) were injected.
Bug Fixes
- [UI] Fixed spammy
[CRITICAL] No AreaId found for UiMapIderrors appearing in chat when entering Ascension hub cities (Stormwind, Darnassus, Shattrath, etc.). On Ascension,C_Map.GetBestMapForUnit("player")returns a continent-level UiMapId for these cities — Questie logged a CRITICAL error since continent maps have no AreaId mapping, even though thenilreturn was already handled gracefully by callers. Downgraded fromDEBUG_CRITICALtoDEBUG_DEVELOPinzoneDB.lua.
v9.8.8
New Ebonhold Quests
- Azeroth: Alterac Trophy (includes missing Alterac Mountains spawn tracking data for Narillasanz, Cranky Benj, Gravis Slipknot, Araga, Lo'Grosh, Stone Fury, Jimmy the Bleeder, Skhowl). Northern Jungle Trophy (verified Stranglethorn Vale spawn tracking data). Southern Jungle Trophy (verified Stranglethorn Vale spawn tracking data for 4 rares).
- Kalimdor: Ashen Corruption (includes missing Ashenvale spawn tracking data for Demon NPCs), Spires of Chaos (includes missing Thousand Needles spawn tracking data for Elemental NPCs).
- Outland: Shadowmoon Trophy (verified Shadowmoon Valley spawn tracking data for Collidus the Warp-Watcher, Ambassador Jerrikar, Kraator). Demon's at the Edge (verified Blade's Edge Mountains spawn tracking data for 37 demons).
- Northrend: Fjord Trophy (includes missing Howling Fjord spawn tracking data for King Ping, Perobas the Bloodthirster, Vigdis the War Maiden). Frostbound Brood (verified Borean Tundra spawn tracking data for 16 dragonkin).
v9.8.7
Fixes
- [Quest] Corrected
GetQuestLogTitlereturn value indices across multiple modules to match the WoW 3.3.5 client API. The 3.3.5 client returnssuggestedGroupat index 4, shiftingisHeaderto index 5 andquestIdto index 9. Affected modules previously used indices 4 and 8 (orselect(8, ...)) and would misidentify quest headers as regular quests and incorrectly assignisDailyasquestId. - [Quest] Removed premature
breakon niltitlein quest log iteration loops. On this server, quest log slots can be non-contiguous, causing early loop termination to silently skip valid quests. Loops now use aif title and (not isHeader) thenguard to safely skip empty slots without aborting iteration. - Affected modules:
QuestieValidateGameCache,QuestEventHandler,QuestLogCache,TooltipHandler,TrackerUtils,QuestieTracker,QuestieLearner.
v9.8.6
New Ebonhold Quests
- Outland: Blade's Edge Trophy (includes missing Blade's Edge Mountains spawn tracking data for Morcrush, Hemathion, Speaker Mar'grom). Fel Scars of Nagrand (includes missing Nagrand spawn tracking data for Voidwalker Minions, etc). Netherstorm Trophy (includes missing Netherstorm spawn tracking data for Nuramoc, Ever-Core the Punisher, Chief Engineer Lorthander).
- Northrend: Borean Trophy (includes missing Borean Tundra spawn tracking data for Fumblub Gearwind, Icehorn, Old Crystalbark).
- Kalimdor: Teldrassil Trophy (includes missing Teldrassil spawn tracking data for Threggil, Blackmoss the Fetid, Duskstalker, Uruson, Fury Shelda, Grimmaw). Darkshore Defense (complete 6 quests in Darkshore). Bloodmyst Recovery (complete 6 quests in Bloodmyst Isle).
- Azeroth: Arathi Trophy (includes missing Arathi Highlands spawn tracking data for Darbel Montrose, Singer, Foulbelly, Ruul Onestone, Kovork, Molok the Crusher, Zalas Witherbark, Nimar the Slayer, Geomancer Flintdagger, Prince Nazjak). Elwynn Errands (complete 6 quests in Elwynn Forest). Modan Trophy (includes missing Loch Modan spawn tracking data for Grizlak, Magosh, Large Loch Crocolisk, Shanda the Spinner, Lord Condar, Emogg the Crusher, Boss Galgosh). Redridge Resolve (complete 6 quests in Redridge Mountains). Westfall Trophy (includes missing Westfall spawn tracking data for Foe Reaper 4000, Marisa du'Paige, Vultros, Brack, Brainwashed Noble, Leprithus, Master Digger, Sergeant Brashclaw, Slark). Wetlands Trophy (includes missing Wetlands spawn tracking data for Dragonmaw Battlemaster, Razormaw Matriarch, Garneg Charskull, Gnawbone, Sludginn, Ma'ruk Wyrmscale, Leech Widow, Mirelow).
v9.8.4
Fixes
- [Quest] Fixed a Lua crash ("attempt to index global 'QuestiePlayer'") occurring during chat message processing for auto-completing quests, by explicitly requiring the
QuestiePlayermodule inQuestEventHandler.
v9.8.3
Fixes
- [Quest] Extended
HideConditionsupport to regular monster, object, and item objectives in the database. - [Quest] Added
hideIfQuestActiveconditions to quest 13010 objectives to resolve icon overlap at King Jokkum. - [Database] Corrected the finisher for "You Can't Miss Him" (12966) to NPC 30127, properly moving the arrow to Fjorn's Anvil.
- [Arrow] Implemented immediate arrow refreshing upon quest acceptance to provide seamless transitions between objective phases.
v9.8.2
Fixes
- [Quest] Updated the objective tooltip for "Forging an Alliance" (12924) at King Jokkum to explicitly instruct players to pick up the breadcrumb quest "You Can't Miss Him" (12966).
v9.8.1
Fixes
- [Quest] Fixed QuestieArrow direction for "Forging an Alliance" (12924). Added an extra objective to speak with King Jokkum, ensuring the arrow points toward the breadcrumb quest start at the beginning of the quest.
v9.8.0
Fixes
- [Quest] Modified
BAG_UPDATE_DELAYEDto trigger a quest log update and instantly refresh the tracker when items are deposited directly into bags by autoloot bots that bypass standard item events. - [Map] Fixed an issue where "Special Objectives" (e.g., source item drops) failed to check player bag contents upon completion, causing their map icons to linger indefinitely until the main quest was turned in.
v9.7.12
Fixes
-
[Quest] Fixed an issue where tracking icons for dynamically updated custom quests like Peak Predators would prematurely disappear due to sync delays on WotLK servers.
-
[Map] Resolved a frame pool leak that prevented the yellow Finisher icon from appearing immediately on the map after turning in or completing a quest.
-
[Database] Corrected an error that improperly identified Item Finishers as GameObject Finishers on custom servers, causing map pinpointing errors (e.g.
[QuestieDB:GetObject] rawdata is nil for objectID:). -
[Database] Appended correct fallback spawn data for the "Thorim" listen bunny (
NPC 30514) so Sibling Rivalry's turn in/listen point functions correctly on WotLK clients.
v9.7.11
Fixes
- [Quest] Fixed an issue where quest objective icons and waypoints failed to clear from the map after a quest was completed or abandoned.
- [Tracker] Prevented quests from falsely flagging as complete and wiping tracking data when the World of Warcraft server drops its objective arrays. Fixes "Peak Predators" icons disappearing randomly.
- [Database] Corrected an error that improperly identified Item Finishers as GameObject Finishers on custom servers, causing map pinpointing errors (e.g.
[QuestieDB:GetObject] rawdata is nil for objectID:). - [Database] Appended correct fallback spawn data for the "Thorim" listen bunny (
NPC 30514) so Sibling Rivalry's turn in/listen point functions correctly on WotLK clients.
v9.7.10
Fixes
- [Arrow] Refactored Arrow logic to drastically improve target distance calculations and prioritize targets correctly based on the player's current zone.
- [Arrow] Fixed a bug where the Arrow would mistakenly point to previously completed objective locations instead of the Quest Finisher's exact location.
- [Tracker] Fixed
QuestieDB.IsCompleteedge case returning incomplete incorrectly; now verifiesnumFulfilled == numRequiredto immediately acknowledge completed quests while awaiting the server flag. - [Tracker] Resolved false-positive "broken quest log" errors spamming chat on WotLK servers by correctly handling API responses for trackable objectives.
- [Tracker] Demoted harmless WotLK objective cache count mismatches from Error to Debug visibility level to eliminate chat spam on login.
- [Quest] Fixed quest arrow pointing to the key-drop NPC after using all consumable quest keys (e.g. Cold Iron Key for "They Took Our Men!" quest 12843). When a quest uses a key item that is consumed on interaction, it leaves the bag and
CheckQuestSourceItemreturns false, incorrectly triggering a quest reset that re-drew the key source NPC on the map. Now checks if all tracked objectives are alreadyCompleted=truebefore applying the reset, preventing the spurious icon.
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_DELAYEDevent to force a full quest log scan on bag changes, catching progress updates thatQUEST_WATCH_UPDATEwould normally fire for manual looting.
v9.7.8
Fixes
- [Quest] Fixed "There was an error populating objectives" error in chat for
triggerEndquests with no map coordinates (e.g., "complete N quests in zone")._RegisterObjectiveTooltipsnow silently returns forevent-type objectives with nospawnList— these have nothing to register a tooltip for.
v9.7.7
Fixes
- [Quest] Fixed "Missing event data for Objective" error appearing in chat for all
triggerEndquests with no map coordinates (e.g., "complete N quests in zone" types). Nil coordinates are valid for server-tracked objectives with no pin — the handler now returns silently instead of logging a visible error.
v9.7.6
Fixes
- [Database] Fixed "Missing objective data" error for all "complete N quests in zone" quest types (IDs 50151, 50145, 50098, 50100, 50149, 50099, 50108, 50111, 50150). Added
triggerEnd([9]) field so Questie correctly registers the server-tracked objective without drawing map pins.
v9.7.5
Fixes
- [Quest] Fixed objective pins/icons persisting on the map after a quest is completed or abandoned. Added
CleanupRemovedQuestsFallbackwhich diffs Questie's quest log against the game's actual quest log on everyQUEST_LOG_UPDATEand correctly callsCompleteQuestorAbandonedQuestfor any quest that silently disappeared, ensuring map icons are removed. - [Quest] Fixed re-accepted repeatable custom quests (e.g., Stormforged Scales) not showing objective icons on the map after being accepted a second time.
New Quests
- [Database] Added Storm Peak Orders (ID 50150) - The Storm Peaks
- Objective: Complete any 6 quests in The Storm Peaks.
- [Database] Added Wild Basin (ID 50094) - Sholazar Basin
- Objective: Kill 75 Beasts. Includes 29 Beast NPC types with full spawn coordinates.
- NPCs: King Krush, Shardhorn Rhino, Aotona, Pitch, Serfex the Reaver, Dreadsaber, Hardknuckle Matriarch, Shango, Venomtip, Bushwhacker, Hardknuckle Charger, Ravenous Mangal Crocolisk, Farunn, Zeptek the Destroyer, Goretalon Matriarch, Sapphire Hive Wasp, Emperor Cobra, Sapphire Hive Drone, Shattertusk Bull, Siltslither Eel, Spirit of Atha, Stranded Thresher, Mangal Crocolisk, Spirit of Koosu, Longneck Grazer, Goretalon Roc, Sapphire Hive Queen, Spirit of Ha-Khalan, Bittertide Hydra
v9.7.4
Fixes
- [Tooltips] Fixed "attempt to concatenate local 'name' (a nil value)" error when quest starters/finishers have missing names in the database.
- [Database] Added missing spawn coordinates for Quest 50031 "Stormbound" elementals in Storm Peaks (zone 67).
- [Database] Fixed "Unknown Zone" issue for custom quests by correcting Zone ID index usage (swapped
[6]RequiredRaces for[17]ZoneID). - [Database] Corrected Dragonblight Zone ID in custom quest definitions.
New Quests
- [Database] Added Morogh Missions (ID 50098) - Dun Morogh
- Objective: Complete any 6 quests in Dun Morogh. Auto-completes upon reaching the objective.
- [Database] Added Azuremyst Aid (ID 50100) - Azuremyst Isle
- Objective: Complete any 6 quests in Azuremyst Isle. Auto-completes upon reaching the objective.
- [Database] Added Stormforged Scales (ID 50066) - The Storm Peaks
- Objective: Kill 30 Dragonkin. Includes 8 Dragonkin NPC types with full spawn coordinates.
- [Database] Added Peak Predators (ID 50095) - The Storm Peaks
- Objective: Kill 75 Beasts. Includes 24 Beast NPC types with full spawn coordinates.
- [Database] Added Peak Predators (ID 50096) - Icecrown
- Objective: Kill 75 Beasts. Includes 12 Beast NPC types with full spawn coordinates.
- [Database] Added Icecrown Advance (ID 50151) - Icecrown
- Objective: Complete any 6 quests in Icecrown. Auto-completes upon reaching the objective.
- [Database] Added Storm Peaks Trophy (ID 50205) - The Storm Peaks
- Objective: Kill 1 Rare in The Storm Peaks. Includes 4 Rare NPC types (Skoll, Time-Lost Proto-Drake, Vyragosa, Dirkee) with full spawn coordinates.
v9.7.3
New Features
- [Database] Implemented Ebonhold Database Module.
- Created dedicated
Database/Ebonhold/structure for custom server data. - Added
EbonholdLoaderto inject custom Quests, NPCs, Objects, and Items as overrides. - Note: This structure preserves custom data during upstream Questie updates.
- Created dedicated
- [Objectives] Implemented Automated Text Retrieval.
- Questie now attempts to fetch quest text from the server at runtime for custom quests that are missing from the database.
- Added "Objectives Board" (ID 600600) as a global quest starter.
Quests (Custom Content)
- [New] Added Heart of the Dragonflights (ID 50064) - Dragonblight
- Objective: Kill 30 Dragonkin. Includes 49 Dragonkin NPC types.
- [New] Added Skies of Blade's Edge (ID 50060) - Blade's Edge Mountains
- Objective: Kill 75 Dragonkin. Includes 17 Dragonkin NPC types.
- [New] Added Shadowed Beasts (ID 50087) - Shadowmoon Valley
- Objective: Kill 75 Beasts. Includes 25 Beast NPC types.
- [New] Added Forest Stalkers (ID 50083) - Terokkar Forest
- Objective: Kill 75 Beasts. Includes 53 Beast NPC types.
- [New] Added Savage Heights (ID 50085) - Blade's Edge Mountains
- Objective: Kill 75 Beasts. Includes 47 Beast NPC types.
- [New] Added Unstable Fauna (ID 50086) - Netherstorm
- Objective: Kill 75 Beasts. Includes 18 Beast NPC types.
- [New] Added Elemental Balance (ID 50026) - Nagrand
- Objective: Kill 30 Elementals. Includes 12 Elemental NPC types.
- [New] Added Redridge Trophy (ID 50160) and Zangarmarsh Trophy (ID 50192).
New Ascension Quests
- Westfall: Agria's Medicine, Seven Years of Bad Luck, Worm-Eaten Apple, Goldshire's Generosity, Bookworm, Knowledge Corrupts, The Ruins of Northshire, Accursed Sisterhood, Words That Shepherd Madness, Oracular Idol, A Betrayal Within, The Maid I Left Behind, The Saddest Among Us, The Threat Swept Downstream, Stay a While, Defias Disruption.
- Dun Morogh: A Small Mistake, We Found Her!, The Scout's Favor, Old Mirsinth, Smoke on the Wind, A Promising Path, A Fitting Disguise, His Radiant Majesty, Deciphering Radiation, Soaking the Masses, Sever the Right Hand, A Growing Business, Thunderbrew's Hop, Stay a While, Live-Fire Demo, Bots on Strike, A Brother's Betrayal, The True Story, Timber for the Coldhewn, Icehide the Unbroken.
- Teldrassil: The Carrion Road, The Sister Who Never Returned, Finding the Good Meat, Transsubstantiating the Flesh, Communion Banquet, A Trail of Petals, Restless entrails, A Dark Warning, The Aid of Theren-Dion, No Place for Scavengers, Termites in Teldrassil, Stay a While, Elydna's Heirloom.
- Durotar: To Find a Cure, A Dangerous Sample, Knowledge of the Centaurs, Those Who Fell, The Way is Shut, The Sinister Triad, So That He May Hear Again, A Sinister Ritual, Innocents for Sinners, Unease Makes Tongues Wag, A Door Left Ajar, Esgramor's Master, Shinies!, Echoes of Hirsutta, Auction the Past, Stay a While, Durotar's Dire Drought, The Queen's Decree, Avianna's Rose, The Last Piece, Reversion.
- Tirisfal Glades: Rude Awakening, Marla's Last Wish, Monsters With Noble Intentions, Restless Family Members, An Unspeakable Secret, A Noble Heritage, The True Heir of the Cains, The Friends We Make Along the Way, I'm Home, Apothecary Flemer, The Nature of Freedom, Spotless Standing, Stay a While, More Than the Sum of its Parts, Scarlet Correspondence, A Humble Duty, The Balnirs' Rest, Brewing Disarray, This Is Justice.
- Mulgore: Death and Tribute, Death and Exile, Death and Dishonor, Death and Justice, Death by Laughter, To Whom I Devote, Fighting Over Carrion, Smoke on the Horizon, Amphora of Sacred Water, Stay a While, Exile of Embers, The Smoke that Remembers, The Circle’s Rite.
New Ebonhold Quests
- Outland: Elemental Balance, Savage Heights, Unstable Fauna, Forest Stalkers, Marsh Predators, Skies of Blade's Edge, Shadowed Beasts, Zangarmarsh Trophy.
- Northrend: Tundra Turbulence, Stormbound, Dragonblight Trophy, Heart of the Dragonflights, Peak Predators, Icecrown Advance, Storm Peaks Trophy, Stormforged Scales, Fjord Front, Wild Basin, Grizzly Trophy, Zul'Drak Trophy, Basin Expeditions.
- Azeroth: Redridge Trophy, Morogh Missions, Azuremyst Aid, Shadow of Teldrassil, Trials of Durotar, Song of the Woods, Morogh Trophy, Tirisfal Trophy.
Fixes
- [Tracker] Combat Update Fix: Tracker now updates objectives immediately during combat without causing Lua errors or taint.
- [Tracker] Bag Update Fix: Quest progress now updates immediately when looting items (fixes delay with loot bots).
- [Arrow] Refined Visibility Logic:
- Auto Nearby: Arrow correctly defaults to showing the nearest quest when no quests are tracked.
- Zone Filter: In "Auto Mode", the arrow hides if the nearest quest is in a different zone.
- Instance Filter: Arrow explicitly hides if the target is in a different instance.
- [Map] Fixed an issue where completed quest icons would persist on the map (
RequestMapUpdatelogic). - [Database] Updated
wotlkNpcDB.luawith scraped spawn data for 12 key beast NPCs in Terokkar Forest to ensure accuracy. - [Arrow] Fixed a nil function error for
_CollectObjectivewhen processing incomplete quests. - [Arrow] Fixed syntax issues that prevented
QuestieArrowmodule from initializing correctly. - [Database] Fixed a runtime crash in
ZoneDBwhen encountering maps with no AreaId mapping (e.g., Kalimdor).