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.
LearnQuest now accepts a generic data table keyed by Questie wiki array indices rather than individual positional arguments. OnQuestDetail captures title, objectives text block, quest description body, and current zone as zoneOrSort[8]. OnQuestAccepted fills quest level from GetQuestLogTitle, per-objective text from GetQuestLogLeaderBoard, and required money from GetQuestLogRequiredMoney. OnQuestComplete captures finish/reward text via GetRewardText.OnMouseoverUnit now only learns an NPC if its UnitNPCFlags bitmask includes the QUESTGIVER bit (0x02), OR if the NPC already exists in QuestieDB as a known quest starter/finisher. All other NPCs are silently ignored — this eliminates the flood of irrelevant NPC entries the learner previously accumulated.OnTargetChanged no longer calls LearnNPC on every target switch. It now only populates the guidNpcCache for kill-tracking purposes, avoiding recording non-quest NPCs.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. The InsertIfNewBucket helper is shared across NPC, Object, and all merge paths (including InjectLearnedData and HandleNetworkData).OnLootOpened now checks whether the loot source GUID is a GameObject. If so, LearnObject is called with the object's ID and name. OnGossipShow records both objects and NPCs via GetIdAndTypeFromGUID. OnQuestDetail and OnQuestComplete also record the interacting object when the quest giver/finisher is a GameObject.OnLootOpened queues unresolved item links (where GetItemInfo returns nil because the item is not yet in the client cache) into _Learner.pendingItemLinks. A new OnGetItemInfoReceived(itemId) handler fires on the GET_ITEM_INFO_RECEIVED event, resolves queued links for that item ID, and calls LearnItem/LearnItemDrop once the data is available. This fixes silent data loss on first-encounter loots.LearnQuestGiver now accepts an entityType argument (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} }.OnCombatLogEvent retains all three GUID-resolution paths (dash-split, GUID cache, hex-prefix) with a 10-minute TTL cache cleanup. Uses CombatLogGetCurrentEventInfo() with fallback to varargs for cross-client compatibility.InsertIfNewBucket instead of the old radius check.MergeImport immediately calls QuestieLearner:InjectLearnedData(). Imported data is pushed into QuestieDB.*DataOverrides in 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 in the player's quest log./reload is beneficial.Fixed a fatal load-time crash in all four Ebonhold DB files (and identically in the Ascension DB files) caused by calling GetRealmName() and QuestieLoader:CreateModule() at file scope — before WoW's API is fully available. Switched to plain global table population; realm-gating and injection remain safely deferred to the loader's PLAYER_LOGIN handler.
EbonholdNpcDB.lua, EbonholdObjectDB.lua, EbonholdItemDB.lua, and EbonholdQuestDB.lua each began with if GetRealmName() ~= "Rogue-Lite (Live)" then return end followed immediately by QuestieLoader:CreateModule("EbonholdDB"). Both calls execute at file-load time (during LoadAddOn()), before PLAYER_LOGIN has fired and before QuestieLoader is guaranteed to be populated. This produced attempt to index global 'QuestieLoader' (a nil value) on every load.Bronzebeard/AscensionXxxDB.lua files had the same pattern with a different realm guard. Same crash, same fix applied.QuestieLoader:CreateModule call. Replaced with _G.EbonholdDB = _G.EbonholdDB or {} and a local alias. Data is now populated unconditionally into the global at load time.QuestieLoader:ImportModule("EbonholdDB") with _G.EbonholdDB or {}. The loader's existing PLAYER_LOGIN handler with realm check remains intact as the sole gate for injection into Questie-X.QuestieLoader:CreateModule call. Replaced with _G.AscensionDB = _G.AscensionDB or {}.QuestieLoader:ImportModule("AscensionDB") with _G.AscensionDB or {}.Questie-Ascension to Questie-X-AscensionDB to match the folder name and plugin naming convention.table.getn(str), which expects a table — passing a string (e.g. a player name like "MooeshaLC@Asc.BB25") caused a crash: bad argument #1 to 'getn' (table expected, got string). Fixed by replacing all string-length calls with string.len(str) (universal across Lua 5.0 and 5.1). Table-length calls restored to table.getn(t) for the same universal coverage — the # length operator is only available in Lua 5.1+ and would break on WoW 1.12 vanilla clients..gitattributes to all five repos with export-ignore for dev-only files (.gitattributes, .gitignore, Tools/, docs/, .git_disabled/). Release archives are now generated from tags — named RepoName-vX.Y.Z.zip rather than RepoName-main.zip.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.
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)HardcoreBlacklist and SeasonOfDiscovery ImportModule calls deleted.SOD_ONLY = 5 and HIDE_SOD = 6 deleted from the expansion filter enum. Remaining constants (TBC_ONLY, CLASSIC_ONLY, WOTLK_ONLY, TBC_AND_WOTLK, CLASSIC_AND_TBC) are unchanged.filterExpansion: Removed the isSoD local and the two SOD_ONLY / HIDE_SOD branches.MinimalInit: Removed the if Questie.IsSoD then addOverride(...SeasonOfDiscovery...) end block and the if Questie.IsHardcore then HardcoreBlacklist:Load() end block.Initialize: Removed the 8-call if Questie.IsSoD then SeasonOfDiscovery:LoadBase*/Load*() end block covering quest/NPC/item/object base data and fixes.#Database\Corrections\SoMPhases.lua line.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 fully superseded by the DB plugin architecture (~30 MB removed).
_dbStats helper] Added a local _dbStats(t) function returning count=N minID=X maxID=Y for any table. Used at every checkpoint so diagnostic output is meaningful for any server's dataset without hardcoding expansion-specific IDs._dbDiag removed] Eliminated the local _dbDiag = {} accumulator and the deferred C_Timer.After(6, ...) print block. Diagnostics are now emitted inline as Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] ...") calls at the exact point each stage completes — visible in real time when Develop logging is enabled, not as a delayed flood 6 seconds post-load.DEBUG_DEVELOP.DEBUG_DEVELOP with generic _dbStats output: After LoadBaseDB, After Corrections, Before Compile, After Compile.loadstring parse errors and pcall execution errors converted to DEBUG_DEVELOP.DB was CACHED (no recompile) line converted to DEBUG_DEVELOP.countTable / quest+npc+obj+item count block and the DEBUG_CRITICAL "questData is empty" warning that fired at PLAYER_LOGIN. This check always reported zero counts because it ran before QuestieInit's loading coroutine had started. Loader.lua is now a minimal registration stub.classicQuestDB.lua (1.0 MB), classicNpcDB.lua (2.0 MB), classicObjectDB.lua (1.0 MB), classicItemDB.lua (2.1 MB). Never listed in Questie-X.toc. Classic data is now provided exclusively by the ClassicDB plugin.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.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. Combined removal: ~30 MB of dead weight from the core repository.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 extraobjective condition data. Removed all DevTools_Dump calls that were printing raw Lua table syntax to chat during validation.
QuestieX_CoreDB bridge mechanism with a direct pull of DB plugin globals at init time. LoadBaseDB() now checks for QuestieX_WotLKDB_quest, QuestieX_WotLKDB_npc, QuestieX_WotLKDB_object, and QuestieX_WotLKDB_item globals and assigns them directly to QuestieDB.*Data. Globals are cleared (= nil) after transfer to free memory. This runs inside Questie-X's own init coroutine at a known point in the load sequence, with no dependency on cross-addon module references._G.QuestieX_CoreDB = QuestieDB export. The CoreDB bridge global is no longer needed and was never reliably accessible from DB plugin Loader.lua files due to module-registry timing.if not QuestieX_CoreDB then return end guard and subsequent QuestieX_CoreDB.*Data = ... assignments). The file is now a PLAYER_LOGIN handler that registers the plugin with QuestiePluginAPI, logs absorbed table sizes, and emits a DEBUG_CRITICAL warning if questData is still empty after init.data[6] (conditions table). After writing the 5 existing fields per entry, the writer now writes a WriteByte(n) count followed by WriteShortString(key) + WriteInt24(value) for each condition entry. If data[6] is nil, writes 0.ReadByte() condition count; if non-zero, reconstructs the conditions table as {[key]=value} and assigns it to entry[6].ShortString + Int24 per condition.QuestieDB.lua:1443 reads HideCondition = o[6] from each extraobjective. Before this fix, compiled data always produced o[6] = nil, so ShouldHideObjective() never activated. The hideIfQuestActive / hideIfQuestComplete conditions were silently ignored post-compilation. Validation also flagged the mismatch every load, which triggered DevTools_Dump to flood chat with raw Lua table syntax.DevTools_Dump({["Compiled Table:"]=a, ["Base Table:"]=b}) calls from table-mismatch branches. These calls serialized full Lua tables to the chat frame as raw source code, appearing to users as a syntax error or data corruption. The preceding Questie:Warning(...) line already captures the mismatch identity. DevTools_Dump is a retail WoW debugging API unavailable or unreliable on private/custom servers and should never be called in production validation paths.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.
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 {}.hasData guard in QuestieDBCompiler:Compile() — now accepts type == "table" in addition to "string", preventing the compiler from silently aborting when LoadDatabase has already decoded the string to a table before compilation.questData overwrites. On WotLK servers only Questie-X-WotLKDB should be enabled alongside the server-specific plugin.rawdata is nil, a minimal quest object is now built from QuestLogCache instead of returning nil. The fallback populates name, level, isComplete, and an empty Objectives table with _isLogFallback = true.Objectives table from QuestLogCache.GetQuestObjectives on first call, then call obj:Update() on each to refresh progress from the live quest log.objectiveSpawnListCallTable), preventing "Corrupted objective data" errors caused by nil NPC IDs.name — returns quest ID string as fallback.objectData[id] before clearing spawn keys in prune loop (attempt to index nil at QuestieDB:1715).objectiveSpawnListCallTable result in nil-guard before iterating — prevents pairs(nil) when a referenced NPC/object is missing from the loaded DB.monster(killCreditNpcId) result nil-guarded before indexing — prevents crash for kill-credit NPCs absent from npcData.flags nil-guard added before bitband(flags, VENDOR) call.quest.SpecialObjectives nil-guard before next() call.quest.SpecialObjectives nil-guard before next() call.Minimap button overhaul and second pass of P2 bug fixes.
mmapIcon.tga. Applied SetMask for circular clip on WotLK+ clients with SetTexCoord fallback for 1.12 vanilla clients.C_QuestLog/C_Map shims, and QuestieServer init sequence.select() polyfill to not use arg table.plugin.stats nil access.Major expansion of the data-learning system and a new Database options tab.
QuestieLearnerDB to separate retail/private/custom content.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.
Xurkon/Questie-X. Remote updated from PE-Questie to Questie-X.QuestiePluginAPI (Modules/Libs/QuestiePluginAPI.lua). Plugins register themselves and inject quest, NPC, object, item, and zone data without modifying core files.QuestieServer module (Modules/QuestieServer.lua) for improved runtime server environment detection.QuestieLearnerComms module (Modules/Network/QuestieLearnerComms.lua) for cross-client quest data sharing.Database/Ascension/ and Database/Ebonhold/ folders. All custom server data is now distributed via separate plugin addons.string.match and string.gmatch using string.find and string.gfind to ensure universal compatibility with legacy WoW clients (e.g., Turtle WoW).AceTimer-3.0 instances in ElvUI and OG-RaidHelper to resolve math.mod errors on Lua 5.0 clients.CreateColor polyfill with SetRGB, SetRGBA, SetColor, and GetColor methods.[QuestieTooltips:GetTooltip] m_20509 debug log spam..toc files updated to Questie-X title and v1.1.4 version.LibDeflate, XXH_Lua_Lib, LibDBIcon-1.0, and LibDataBroker-1.1 to the Libs directory.QuestieDB.IsComplete to accurately verify all objectives are finished using numFulfilled == numRequired instead of the unreliable server-side finished flag.HideCondition mechanism for objectives, allowing specific spawns to be hidden based on quest log status (hideIfQuestActive / hideIfQuestComplete).⚠️ This is the final stable release before a major architectural refactoring. All active features and quest data from previous releases are preserved.
creatureObjective to killCreditObjective, allowing Questie to correctly
resolve Dune Smasher spawn locations from the NPC database.
BAG_UPDATE_DELAYED strategy: 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.