Details
Expansion
Categories
Developers
Having issues?
LibQuestDB — Offline Quest Rewards, Text and Routes for WoW Classic
A standalone, offline quest database for World of Warcraft Classic, built for addon authors. It answers the questions Questie does not: what a quest pays, how much experience it gives a character of a given level, what its text says, and which route a character can actually take across the world — plus the quest's whole shape, the creatures and objects it points at and where they stand, what drops the items it wants, and the zones and dungeons it happens in — all without the quest being in your log or the game's cache. The quest counterpart to LibItemDB and LibProfessionDB.
This is a developer library. Install it if another addon lists it as a dependency, or depend on it if you are an addon author.
Core Features
- Rewards for every quest that has any: items always given, items you choose one of, money, reputation, spells, and the item you are handed when you accept
- Quest experience, derived the way the server derives it, scaled to any character level, and aware that a character at the level cap earns none
- Money a quest costs and reputation a quest loses are kept as negatives, so nothing ever shows a charge as a reward
- Every quest's text: the title, what the quest giver says, the objectives, and what you hear at turn-in — in English, plus quest titles in all eight of TBC's other languages. A client reads its own language where there is one and English for the rest, so nothing is ever left blank
- The reward data serves every client language, because it stores ids and numbers; the text is a separate file per language
- A route graph per continent for direction-giving addons: named places, the paths between them that a character can actually walk, and the boats, zeppelins and flight paths that join them, because from some places those are the only way. Flights and ships carry the curve they really travel, and each says which faction can take it, so a Horde character is never sent to an Alliance boat. Inside the capital cities a route keeps to the streets
- Walking routes off the road and into caves, mines and buildings, so a direction-giving addon can lead a character to a quest target through the cave mouth instead of drawing a line over the hill
- The whole shape of a quest: who gives it, who finishes it, what it asks for — creatures to kill, items to collect, places to reach, spells to cast, reputation to earn — what must be done first, what follows it, and which optional lead-in quests point to it
- Which quests reward a given item, asked the other way round, so an addon can tell you a piece of gear is a quest reward and which quest to do for it
- Which quests are not obtainable at all: the ones nothing in the world starts, the ones the game has retired, and the ones that only exist during a holiday, flagged so a list does not show a player something they can never take
- The creatures and objects behind those ids — names, level ranges, rank, faction, trainer role — and where each one stands in the world, ready to place on a zone map. Where killing one creature counts for another, that is recorded too, so a kill is credited to the right objective
- Which creature, chest or container drops a quest item, and how often it really drops
- Zones, dungeons and the outdoor spot where each dungeon is entered
- An answer for a quest it has no data on: the library can tell a quest the game knows about but nothing offline describes from an id nothing knows at all, so an addon can say why a quest is missing instead of leaving a blank that looks like a bug
- On WoW Forever, the quests Forever added itself: their name, level and what to do, taken from the Forever game
- Uses Questie's hand-corrected data when the player has Questie installed, and its own when they do not, with nothing to configure either way
- No dependencies of its own
How It Works
Setup (One-Time)
- Install through the CurseForge app, or drop the
QuestDBfolder into yourInterfaceAddOnsdirectory - There is nothing to configure. The library loads with the game and waits to be asked
For Addon Authors
Two names, and they differ: list QuestDB (the folder) under ## Dependencies: in your TOC so the client loads it first, and questdb (the slug) under required-dependencies: in your .pkgmeta so the CurseForge app installs it for your users.
Then resolve the library through LibStub. Every call is nil-safe and takes the quest id as a number or a numeric string:
local QuestDB = LibStub("LibQuestDB-1.0")
-- Rewards: a fresh table, or nil when the quest has none
local r = QuestDB:GetRewards(questId)
-- r.items { {id=, count=}, ... } always given
-- r.choices { {id=, count=}, ... } the player picks one
-- r.money copper, SIGNED: negative means the player pays; nil = none below the cap
-- r.moneyMaxLevel copper paid instead of XP at the level cap, or nil
-- r.rep { {faction=, value=}, ... } value may be negative
-- r.spell / r.spellCast / r.srcItem / r.xp / r.questLevel
-- Experience for THIS character; nil at the level cap or when the quest gives none
local xp = QuestDB:GetQuestXP(questId, UnitLevel("player"))
-- Text in the loaded locale; expand $N / $C / $R / $B / $G yourself
local t = QuestDB:GetQuestText(questId)
-- t.title, t.details, t.objectives, t.offerReward, t.requestItems, t.endText, t.objectiveTexts
-- Route graph for one continent (0 Eastern Kingdoms, 1 Kalimdor, 530 Outland); cached
local g = QuestDB:GetPathGraph(continent)
-- g.nodes[id] = {x, y, z, name, continent} server yards; a foreign continent marks the far end of a crossing
-- g.links = { {from, to, type, object, distance, swim, side} } directed; side "A", "H" or nil (either)
-- g.path(from, to) -> the walked route of a walk, the gryphon's route of a flight, the ship's
-- route of a transport; a crossing is split, each continent's graph holding its own half
-- QuestDB.PATH_TYPE names the types; QuestDB:GetPathContinents() lists what is loaded
-- Off the road: the walking route from a graph node to a spawn in a cave or building
local a = QuestDB:GetSpawnApproach("npc", npcId, areaId, x, y) -- x, y as GetNPCSpawns gives them
-- a.fromNode, a.continent, a.points = { {x, y, z}, ... } from that node to the spawn
-- nil = nothing better than a straight line is known. Join it at the point nearest the player
-- The quest's shape, the things it points at, and where they are
local q = QuestDB:GetQuest(questId) -- startedBy / finishedBy / objectives / prerequisites / chain
local n = QuestDB:GetNPC(npcId) -- name, level range, rank, faction, trainer role, zone
local s = QuestDB:GetNPCSpawns(npcId) -- { [areaId] = { {x, y}, ... } }, 0-100 on that zone's map
local d = QuestDB:GetItemDrops(itemId)-- who drops it, and how often
local dn = QuestDB:GetDungeon(areaId) -- the instance map and where it is entered from outside
-- The other way round: which quests give, offer or start with this item
local list = QuestDB:GetQuestsRewarding(itemId) -- { {questId=, kind="reward"|"choice"|"source", count=}, ... }
local badge = QuestDB:IsQuestReward(itemId) -- true / false, no list built
-- Quests a player cannot take today, and why
local why = QuestDB:IsQuestHidden(questId) -- "unobtainable" | "retired" | "seasonal" | nil
-- Why a quest is missing, rather than a bare nil the player cannot tell from a bug
local c = QuestDB:GetCoverage(questId) -- "shipped" | "uncovered" | "unknown"
-- "uncovered" = the client lists this id and nothing offline describes it
-- "unknown" = nothing here knows the id. NOT proof it is not a real quest
-- Say it only for a quest the player is actually holding; never show a total
-- Housekeeping
QuestDB:IsReady() QuestDB:GetLevelCap() QuestDB:GetTextLocale()
QuestDB:HasRewards(id) QuestDB:HasText(id) QuestDB:GetDataSource()
-- Questie's data only becomes usable after login, so answers can change mid-session.
-- This fires once at once and again on every change: rebuild anything cached here.
QuestDB:RegisterSourceChanged(function(source) --[[ "questie" or "questdb" ]] end)
-- Feature-gate BY NAME, not by version number
if QuestDB.HasCapability and QuestDB:HasCapability("trainer-fields") then ... endSix things a consumer must respect: keep the sign on money and reputation; show moneyMaxLevel only to a character at the cap and XP only below it; expand the text markup ($N name, $C class, $R race, $B line break, $G male:female;) for the character you draw for; skip a route link whose side is the other faction's; treat a requiredLevel of nil as "not known", never as 0 (WoW Forever's own quests answer it); and rebuild anything cached from GetQuest when RegisterSourceChanged fires. Flights and transports carry no travel time, so weight them yourself. The full field tables, the XP formula, the locale framework and the path graph are documented in the project README on GitHub.
Dependencies & Compatibility
Required
None. The library loads on its own.
Compatibility
- World of Warcraft Classic Era (Interface 11509): 4,140 quests with rewards and structure for all 4,245, text for all 4,245, 10,384 creatures and 10,744 objects with their placements, drop chances for 1,744 quest items, 1,212 areas and 26 dungeons, and a route graph of 1,245 places on two continents
- World of Warcraft Classic Anniversary / TBC (Interface 20506): 6,270 quests with rewards and structure for all 6,599, English text plus titles in eight more languages, 18,799 creatures and 14,216 objects with their placements, drop chances for 2,384 quest items, 1,643 areas and 51 dungeons, and a route graph of 1,972 places on three continents
- World of Warcraft Forever (Interface 16001): the Classic quests it shares with Era — 4,140 with rewards, structure and text for all 4,245, 10,384 creatures and 10,744 objects with their placements, drop chances for 1,744 quest items, 1,372 areas and 26 dungeons, and a route graph of 1,245 places. Its map coordinates are built from Forever's own client, not copied from Era's, because several zone maps differ between them. Plus 775 of Forever's own new quests, with their name, level and what to do, taken from the Forever game itself. Who gives them, where they are and what they reward are not known yet, so they have no map pin
Works With the Rest of the TOG Addons
Shared Foundations
The TOG addons are built on a common set of libraries rather than each reinventing the same plumbing:
- DeltaSync — the guild-sync engine that keeps data current across members
- LibGuildRoster — guild roster and online/offline tracking
- AceCommQueue — keeps addon traffic orderly so nothing arrives garbled
- ItemDB — an offline item database, so item names and details work without waiting on the game to load them
- ProfessionDB — an offline profession and recipe database
- QuestDB — this library, the offline quest database: rewards, text, quest chains, where things stand and how to get there
- LibAceGUIWidgets — the search box, date picker, pulsing highlights and window-position memory the TOG windows share, so they all look and behave alike
- VersionCheck — tells you when a newer version is out
In practice that means a fix to one shared library benefits every TOG addon at once. Each is published separately and installs automatically through the CurseForge app.
Recent Updates
v0.1.0
New
- WoW Forever's own new quests. 775 of the quests Forever added now have their name, level and what to do, taken from the Forever game itself. Who gives them, where they are, what they reward and the level needed to take them are not known yet, so they have no map pin.
- Routes into caves, mines and buildings. Addons that give directions can now lead you to a quest target by the way you can actually walk: to the cave mouth and through the tunnels, rather than in a straight line over the mountain. This covers every flavour. It was built and tested against the troll cave in Coldridge Valley, and has not yet been walked in game.
Changed
- Quests the game has retired are now flagged, even when something in the world still offers them, so a quest list stops showing them as ready to take. On Classic Era that is seven old mount-exchange quests; on WoW Forever it also catches a duplicate holiday gift quest whose reward the game has withdrawn.
- Works with Questie 12, which moved its quest data into a separate QuestieDB addon, in offline tests against Questie 12's own data. Not yet tried in game with Questie 12.
- With Questie installed, the full lists of creatures and objects now include the ones only Questie knows about, so every creature an addon can look up also appears in its lists.
Fixed
- Routes inside the capital cities now follow the streets much more closely, so a route drawn through Ironforge no longer cuts across buildings between the Commons and the Great Forge.
- Wolves Across the Border no longer says you must first do Eagan Peltskinner. That quest is an optional lead-in, and taking Wolves Across the Border now correctly counts as closing it. Other lead-in quests stored the same way will be corrected as they are confirmed in game.
v0.0.3
New
- The shape of every quest: who gives it, who you hand it back to, what it asks you to do, and what has to be finished first — so an addon can show a whole quest chain offline.
- The creatures and objects a quest points at, with their names, level ranges and which faction they leave alone, and where in the world each one stands, ready to be placed on a zone map.
- Drop chances for quest items: which creature, chest or container drops the thing you need, and how often it really drops.
- Zone and dungeon information, including the outdoor spot where each dungeon is entered, so a marker can be put on the door rather than somewhere inside the mountain.
- Trainers are identified by what the game records rather than by reading their title, so a trainer list no longer misses anyone whose title is worded unusually.
- Which quests reward a given item, asked the other way round — so an addon can tell you a piece of gear is a quest reward, and which quest to do for it, before you ever pick the quest up.
- Quests nothing in the world starts, and quests that only run during a holiday, are flagged as such, so a list does not offer a player something they can never take. Where killing one creature counts towards another, that is recorded too, and places you simply have to walk to are carried as objectives like any other.
- Quest titles in all eight of TBC's languages. A German, French, Spanish, Russian, Korean or Chinese client now reads quest names in its own language, with the descriptions still in English.
- WoW Forever is supported. The Classic quests Forever shares with Era work there, and their map positions are built from Forever's own client rather than copied from Era's, because several zone maps are not in the same place on both. Forever's own new quests are not covered — nothing offline describes them yet.
- A quest with no offline information can now say so. Addons using this library can tell the difference between a quest it has never heard of and one the game knows about but nobody has offline data for — so instead of a quest simply not appearing, which looks like something broken, they can tell you there is no data for it. This matters most on WoW Forever, where the quests added for it are not covered.
Changed
- Questie is used when you have it installed. Where Questie carries a hand-corrected answer it is the one you get, and this library's own data answers for players who do not have Questie. Nothing needs configuring either way.
- A translation is now laid over the English text one field at a time, so a language that has been only partly translated shows what it has and English for the rest, instead of leaving the description blank.
Fixed
- The money a quest pays a max-level character was a tenth of the real amount. Anything showing it was wrong by a factor of ten on every quest that pays money instead of experience at the cap. Checked against real level-60 quest windows in game.
- Quest experience now matches the game's own numbers exactly, on every quest, rather than being close. It also correctly shows none at all for a character at the level cap.
- Some quests were listed as needing a higher level than they really do, which hid them from characters who could already take them — one by six levels and another by ten. Levels are now checked against the game's own record of what the server said.
- Boat, zeppelin and lift routes that ran backwards, which sent a route to the far end of the ride and back again.
- Routes that cut a corner where the real path turns sharply, so a drawn route no longer crosses ground you cannot walk.
v0.0.2
New
- A route graph for each continent, so an addon can lead you along paths a character can actually walk rather than in a straight line, and can send you to the boat, the zeppelin or the flight master when that is the way.
- Flights, boats and zeppelins carry the curve they actually travel, so a route drawn on the map follows the gryphon or the ship instead of a straight line between its two ends, and a sea crossing is drawn on each continent's map up to the edge.
- Every flight and ship says which faction can take it, so a Horde character is never sent to the Alliance boat or an Alliance flight master, and the other way round. Lifts inside a faction's town belong to it; the Great Lift into Thousand Needles and the goblin ship are open to both.
v0.0.1
New
- The library ships with the rewards of every Classic Era and TBC quest: items, choices, money, reputation, spells and the item you are handed on accept.
- Quest experience is available too, scaled to your level, and a character at the level cap is told what they get instead of it.
- Quests that cost money or lose reputation are reported as such, never as a reward.
- The full text of every quest, in English, with the framework in place for other languages to be added as separate files.
Credits
Developed by:
- Pimptasty
Quest reward and text data is derived from the CMaNGOS world databases (classic-db and tbc-db, GPL-3.0), which reverse-engineered and tested it. The facts are re-expressed in this library's own format; no CMaNGOS file is redistributed. WoW Forever's own quests are what the Forever game itself reports, collected in game with TOG Tools.
Special Thanks:
- The Old Gods guild community for testing
- WoW Classic community for feedback and support
License
LibQuestDB is open-source software under the MIT license. See LICENSE file for details.
Bug Reports & Feature Requests
Discord is the only place bug reports and feature requests are tracked. Reports left as CurseForge comments or elsewhere are likely to be missed.
Join the Discord — for bugs, feature requests, questions, or anything else.
Before reporting a bug, this makes it far easier to fix:
- Mention which game version you are on.
- Name the addon that depends on this library, if the problem showed up there.
- Quote the wording from the patch notes above, if one of them describes what you are seeing.
You must be logged in to leave a comment.