From c4d003e58ff0fca3ba8cfc417a95e1a60244363f Mon Sep 17 00:00:00 2001 From: Xurkon Date: Sat, 14 Mar 2026 06:10:17 -0500 Subject: [PATCH] feat: Questie-X v1.1.4 - plugin architecture, monorepo, rebranding - Repoint remote to Xurkon/Questie-X - Add QuestiePluginAPI, QuestieServer, QuestieLearnerComms modules - Add Questie-X.toc, Questie-X-Classic.toc, Questie-X-TBC.toc, Questie-X-Turtle.toc - Remove embedded Database/Ascension and Database/Ebonhold (migrated to plugins) - Add Plugins/ directory with NTFS junctions for Questie-X-AscensionDB and Questie-X-EbonholdDB - Add LibDeflate, XXH_Lua_Lib, LibDBIcon-1.0, LibDataBroker-1.1 - Update README: Questie-X branding, logo, plugin install guide, plugin API docs - Update CHANGELOG: v1.1.4 entry documenting all architectural changes - Update .gitignore: exclude plugin junctions, __pycache__, .agents, debug files - Various module updates: corrections, map, tracker, tooltips, quest, options --- .gitignore | 13 + CHANGELOG.md | 43 + Compat/Compat.lua | 141 +- Compat/HBD.lua | 2 +- Database/Ascension/AscensionLoader.lua | 347 -- .../Ascension/Bronzebeard/AscensionItemDB.lua | 109 - .../Ascension/Bronzebeard/AscensionNpcDB.lua | 229 -- .../Bronzebeard/AscensionObjectDB.lua | 129 - .../Bronzebeard/AscensionQuestDB.lua | 154 - .../Ascension/Zones/AscensionUiMapData.lua | 326 -- .../Ascension/Zones/AscensionZoneTables.lua | 60 - Database/Corrections/tbcNPCFixes.lua | 12 + Database/Corrections/tbcQuestFixes.lua | 9 + Database/Corrections/wotlkNPCFixes.lua | 21 + Database/Corrections/wotlkQuestFixes.lua | 9 + Database/Ebonhold/Ebonhold/EbonholdItemDB.lua | 10 - Database/Ebonhold/Ebonhold/EbonholdNpcDB.lua | 21 - .../Ebonhold/Ebonhold/EbonholdObjectDB.lua | 17 - .../Ebonhold/Ebonhold/EbonholdQuestDB.lua | 1725 -------- Database/Ebonhold/EbonholdLoader.lua | 323 -- Database/Ebonhold/Zones/EbonholdUiMapData.lua | 36 - .../Ebonhold/Zones/EbonholdZoneTables.lua | 17 - Database/QuestieDB.lua | 13 + Libs/Ace3.lua | 110 - Libs/Ace3.toc | 28 - Libs/Ace3_TBC.toc | 28 - Libs/Ace3_Vanilla.toc | 28 - Libs/Ace3_Wrath.toc | 28 - Libs/AceHook-3.0/AceHook-3.0.lua | 510 --- Libs/AceSerializer-3.0/AceSerializer-3.0.lua | 287 -- Libs/AceSerializer-3.0/AceSerializer-3.0.xml | 4 - Libs/AceTab-3.0/AceTab-3.0.lua | 441 -- Libs/CHANGES.txt | 135 - Libs/LICENSE.txt | 29 - Libs/LibDBIcon-1.0/LibDBIcon-1.0.xml | 3 + Libs/LibDataBroker-1.1/LibDataBroker-1.1.xml | 3 + Libs/LibDeflate/LibDeflate.lua | 3604 +++++++++++++++++ Libs/LibDeflate/LibDeflate/LibDeflate.lua | 3604 +++++++++++++++++ .../LibDeflate/lib.xml} | 4 +- .../AceHook-3.0.xml => LibDeflate/lib.xml} | 4 +- Libs/LibUIDropDownMenu/LibEasyMenu.lua | 44 - Libs/LibUIDropDownMenu/LibUIDropDownMenu.lua | 2306 ----------- Libs/LibUIDropDownMenu/LibUIDropDownMenu.xml | 24 - Libs/XXH_Lua_Lib/XXH_Lua_Lib.lua | 626 +++ Libs/XXH_Lua_Lib/XXH_Lua_Lib/XXH_Lua_Lib.lua | 626 +++ Libs/changelog.txt | 458 --- Modules/FramePool/QuestieFramePool.lua | 6 +- Modules/Libs/QuestieLib.lua | 14 +- Modules/Libs/QuestiePluginAPI.lua | 199 + Modules/Map/HBDHooks.lua | 19 +- Modules/Map/QuestieMap.lua | 4 +- Modules/Network/QuestieLearnerComms.lua | 280 ++ Modules/Options/QuestieOptions.lua | 9 +- Modules/Options/QuestieOptionsDefaults.lua | 2 + Modules/Quest/QuestLogCache.lua | 24 +- Modules/Quest/QuestieQuest.lua | 64 +- Modules/QuestieDBMIntegration.lua | 2 +- Modules/QuestieLearner.lua | 154 +- Modules/QuestieServer.lua | 75 + Modules/QuestieStream.lua | 52 +- Modules/Tooltips/MapIconTooltip.lua | 256 +- Modules/Tooltips/Tooltip.lua | 23 +- Modules/Tracker/QuestieTracker.lua | 74 +- Modules/Tracker/TrackerHeaderFrame.lua | 6 +- Questie-335-Classic.toc | 2 +- Questie-335-TBC.toc | 2 +- Questie-335.toc | 21 +- Questie-X-Classic.toc | 230 ++ Questie-X-TBC.toc | 221 + Questie-X-Turtle.toc | 235 ++ Questie-X.toc | 244 ++ Questie.toc | 2 +- README.md | 108 +- docs/QuestieXlogo.png | Bin 0 -> 548553 bytes remote_url.txt | 1 - status.txt | 5 - workflow/questie.md | 113 +- 77 files changed, 10883 insertions(+), 8264 deletions(-) delete mode 100644 Database/Ascension/AscensionLoader.lua delete mode 100644 Database/Ascension/Bronzebeard/AscensionItemDB.lua delete mode 100644 Database/Ascension/Bronzebeard/AscensionNpcDB.lua delete mode 100644 Database/Ascension/Bronzebeard/AscensionObjectDB.lua delete mode 100644 Database/Ascension/Bronzebeard/AscensionQuestDB.lua delete mode 100644 Database/Ascension/Zones/AscensionUiMapData.lua delete mode 100644 Database/Ascension/Zones/AscensionZoneTables.lua delete mode 100644 Database/Ebonhold/Ebonhold/EbonholdItemDB.lua delete mode 100644 Database/Ebonhold/Ebonhold/EbonholdNpcDB.lua delete mode 100644 Database/Ebonhold/Ebonhold/EbonholdObjectDB.lua delete mode 100644 Database/Ebonhold/Ebonhold/EbonholdQuestDB.lua delete mode 100644 Database/Ebonhold/EbonholdLoader.lua delete mode 100644 Database/Ebonhold/Zones/EbonholdUiMapData.lua delete mode 100644 Database/Ebonhold/Zones/EbonholdZoneTables.lua delete mode 100644 Libs/Ace3.lua delete mode 100644 Libs/Ace3.toc delete mode 100644 Libs/Ace3_TBC.toc delete mode 100644 Libs/Ace3_Vanilla.toc delete mode 100644 Libs/Ace3_Wrath.toc delete mode 100644 Libs/AceHook-3.0/AceHook-3.0.lua delete mode 100644 Libs/AceSerializer-3.0/AceSerializer-3.0.lua delete mode 100644 Libs/AceSerializer-3.0/AceSerializer-3.0.xml delete mode 100644 Libs/AceTab-3.0/AceTab-3.0.lua delete mode 100644 Libs/CHANGES.txt delete mode 100644 Libs/LICENSE.txt create mode 100644 Libs/LibDBIcon-1.0/LibDBIcon-1.0.xml create mode 100644 Libs/LibDataBroker-1.1/LibDataBroker-1.1.xml create mode 100644 Libs/LibDeflate/LibDeflate.lua create mode 100644 Libs/LibDeflate/LibDeflate/LibDeflate.lua rename Libs/{AceTab-3.0/AceTab-3.0.xml => LibDeflate/LibDeflate/lib.xml} (81%) rename Libs/{AceHook-3.0/AceHook-3.0.xml => LibDeflate/lib.xml} (81%) delete mode 100644 Libs/LibUIDropDownMenu/LibEasyMenu.lua delete mode 100644 Libs/LibUIDropDownMenu/LibUIDropDownMenu.lua delete mode 100644 Libs/LibUIDropDownMenu/LibUIDropDownMenu.xml create mode 100644 Libs/XXH_Lua_Lib/XXH_Lua_Lib.lua create mode 100644 Libs/XXH_Lua_Lib/XXH_Lua_Lib/XXH_Lua_Lib.lua delete mode 100644 Libs/changelog.txt create mode 100644 Modules/Libs/QuestiePluginAPI.lua create mode 100644 Modules/Network/QuestieLearnerComms.lua create mode 100644 Modules/QuestieServer.lua create mode 100644 Questie-X-Classic.toc create mode 100644 Questie-X-TBC.toc create mode 100644 Questie-X-Turtle.toc create mode 100644 Questie-X.toc create mode 100644 docs/QuestieXlogo.png delete mode 100644 remote_url.txt delete mode 100644 status.txt diff --git a/.gitignore b/.gitignore index 888beb1..d74baab 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,16 @@ workflow/ .vscode/ .DS_Store *.zip + +# Plugin junctions (separate repos, linked locally) +Plugins/Questie-Ascension/ +Plugins/Questie-Ebonhold/ + +# Build/tool artifacts +__pycache__/ +.agents/ + +# Local dev files +coords.lua +debug.lua +debug_tooltip.lua diff --git a/CHANGELOG.md b/CHANGELOG.md index 68c32c6..c865014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,52 @@ # Changelog +## v1.1.4 — Questie-X: Plugin Architecture & Monorepo Launch + +> This release marks the official rebranding from **Questie-335** / **PE-Questie** to **Questie-X** and introduces the new plugin architecture. Custom server databases are now distributed as standalone addons rather than embedded folders, allowing each server community to maintain and release its own database independently. + +### Architecture Changes + +- **[Repo]** Repository renamed and re-homed to `Xurkon/Questie-X`. Remote updated from `PE-Questie` to `Questie-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 `QuestieServer` module (`Modules/QuestieServer.lua`) for improved runtime server environment detection. +- **[Network]** Added `QuestieLearnerComms` module (`Modules/Network/QuestieLearnerComms.lua`) for cross-client quest data sharing. +- **[Database]** Removed embedded `Database/Ascension/` and `Database/Ebonhold/` folders. All custom server data is now distributed via separate plugin addons. +- **[Monorepo]** `Plugins/` directory added to the repo. `Questie-Ascension` and `Questie-Ebonhold` are linked here via NTFS junctions pointing to their own repositories (`Questie-X-AscensionDB`, `Questie-X-EbonholdDB`), keeping plugin development in sync. + +### New Plugins + +- **Questie-Ascension** — Project Ascension server database. Repository: [Questie-X-AscensionDB](https://github.com/Xurkon/Questie-X-AscensionDB) +- **Questie-Ebonhold** — Ebonhold server database. Repository: [Questie-X-EbonholdDB](https://github.com/Xurkon/Questie-X-EbonholdDB) + +### TOC / Addon Identity + +- **[TOC]** Core addon `.toc` files updated to `Questie-X` title and `v1.1.4` version. New `.toc` variants added: `Questie-X.toc`, `Questie-X-Classic.toc`, `Questie-X-TBC.toc`, `Questie-X-Turtle.toc`. +- **[TOC]** Legacy `Questie-335` `.toc` files are retained so users who already have the addon installed under that folder name continue to work without renaming. +- **[Libs]** Added `LibDeflate`, `XXH_Lua_Lib`, `LibDBIcon-1.0`, and `LibDataBroker-1.1` to the Libs directory. + +### Fixes + +- **[Compat]** Updated `Compat.lua` and `HBD.lua` compatibility shims. +- **[Database]** Updated `QuestieDB.lua`, `tbcNPCFixes`, `tbcQuestFixes`, `wotlkNPCFixes`, `wotlkQuestFixes` with latest corrections. +- **[Map]** Updated `HBDHooks.lua` and `QuestieMap.lua`. +- **[Options]** Updated `QuestieOptions.lua` and `QuestieOptionsDefaults.lua`. +- **[Tracker]** Updated `QuestieTracker.lua` and `TrackerHeaderFrame.lua`. +- **[Tooltips]** Updated `MapIconTooltip.lua` and `Tooltip.lua`. +- **[Quest]** Updated `QuestLogCache.lua`, `QuestieQuest.lua`, `QuestieDBMIntegration.lua`, `QuestieLearner.lua`, `QuestieStream.lua`. +- **[Libs]** Updated `QuestieLib.lua` and `QuestieFramePool.lua`. + +--- + ## 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 `killcredit` and `spell` objective types in `MapIconTooltip.lua`. + - Implemented proactive creature name prepending in `QuestieTooltips:GetTooltip` to ensure data visibility for rare/custom objectives. + ### New Ebonhold Quests #### 🗺️ Azeroth diff --git a/Compat/Compat.lua b/Compat/Compat.lua index f2d921f..a28da10 100644 --- a/Compat/Compat.lua +++ b/Compat/Compat.lua @@ -38,7 +38,38 @@ local QuestieNameplate = QuestieLoader:ImportModule("QuestieNameplate") local QuestieCorrections = QuestieLoader:ImportModule("QuestieCorrections") -- addon/folder name -QuestieCompat.addonName = ... +local addonName, _ = ... +QuestieCompat.addonName = addonName or "Questie" + +-- polyfill hooksecurefunc for 1.12 +if not hooksecurefunc then + hooksecurefunc = function(t, k, f) + if type(t) == "string" then + f = k + k = t + t = _G + end + local old = t[k] + if old then + t[k] = function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, + a21, a22, a23, a24, a25) + local r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 = old(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, + a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25) + f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, + a23, a24, a25) + return r1, r2, r3, r4, r5, r6, r7, r8, r9, r10 + end + else + end + end +end + +-- polyfill math.mod for 3.3.5 / Retail (Lua 5.1+) +if not math.mod then + math.mod = math.fmod or function(a, b) + return a - math.floor(a/b)*b + end +end QuestieCompat.NOOP = function() end QuestieCompat.NOOP_MT = { __index = function() return QuestieCompat.NOOP end } @@ -48,9 +79,12 @@ QuestieCompat.frame = CreateFrame("Frame") QuestieCompat.frame:RegisterEvent("ADDON_LOADED") QuestieCompat.frame:RegisterEvent("PLAYER_LOGIN") QuestieCompat.frame:RegisterEvent("PLAYER_LOGOUT") -QuestieCompat.frame:SetScript("OnEvent", function(self, event, ...) - QuestieCompat[event](self, event, ...) -end) +QuestieCompat.frame:SetScript("OnEvent", + function(self, event, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, + a22, a23, a24, a25) + QuestieCompat[event](self, event, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20, a21, a22, a23, a24, a25) + end) -- current expansion level (https://wowpedia.fandom.com/wiki/WOW_PROJECT_ID) QuestieCompat.WOW_PROJECT_CLASSIC = 2 @@ -193,7 +227,7 @@ local mapIdToUiMapId = {} -- convert current mapAreaID and mapLevel to UiMapId -- https://wowpedia.fandom.com/wiki/API_GetCurrentMapAreaID -- https://wowwiki-archive.fandom.com/wiki/API_GetCurrentMapDungeonLevel --- https://wowpedia.fandom.com/wiki/UiMapID#Classic +-- https://wowpedia.fandom.com/wiki/UiMapIDtable.getn(Classic) function QuestieCompat.GetCurrentUiMapID() local mapID = GetCurrentMapAreaID() if mapID == 0 then -- both the "Cosmic" and "Azeroth" maps return a mapID of 0 @@ -217,7 +251,7 @@ end function QuestieCompat.TomTom_AddWaypoint(title, zone, x, y) local CZ = mapIdToCZ[QuestieCompat.UiMapData[zone].mapID] - return TomTom:AddZWaypoint(QuestieCompat.Round(CZ % 1 * 10), math.floor(CZ), x, y, title) + return TomTom:AddZWaypoint(QuestieCompat.Round(math.mod(CZ, 1) * 10), math.floor(CZ), x, y, title) end -- This function will do its utmost to retrieve some sort of valid position @@ -260,6 +294,9 @@ function QuestieCompat.GetPlayerMapPosition() end QuestieCompat.C_Map = { + GetPlayerMapPosition = function(uiMapID, unitToken) + return QuestieCompat.GetPlayerMapPosition() + end, -- Returns map information. -- https://wowpedia.fandom.com/wiki/API_C_Map.GetMapInfo GetMapInfo = function(uiMapID) @@ -285,6 +322,10 @@ QuestieCompat.C_Map = { local x, y, instanceID = QuestieCompat.HBD:GetWorldCoordinatesFromZone(mapPos.x, mapPos.y, uiMapID) return instanceID or 0, { x = x or 0, y = y or 0 } end, + -- Stub for GetMapChildrenInfo to prevent crashes on unsupported clients + GetMapChildrenInfo = function(mapID, mapType, allDescendants) + return {} + end, } -- https://www.townlong-yak.com/framexml/classic/Blizzard_MapCanvas/Blizzard_MapCanvas.lua @@ -299,12 +340,12 @@ QuestieCompat.WorldMapFrame = { ShowUIPanel(WorldMapFrame) end, GetCanvas = function(self) - return WorldMapButton + return WorldMapDetailFrame or WorldMapButton or WorldMapFrame end, GetMapID = QuestieCompat.GetCurrentUiMapID, SetMapID = function(self, UiMapID) local mapID = QuestieCompat.UiMapData[UiMapID].mapID - local mapLevel = QuestieCompat.Round(mapID % 1 * 10) + local mapLevel = QuestieCompat.Round(math.mod(mapID, 1) * 10) SetMapByID(math.floor(mapID) - 1) if mapLevel > 0 then @@ -520,7 +561,7 @@ function QuestieCompat.CalculateNextResetTime() Questie.db.profile.weeklyResetHour = Questie.db.profile.weeklyResetHour or tonumber(date("%H", Questie.db.profile.dailyResetTime + 300)) - local dayOffset = (Questie.db.profile.weeklyResetDay - currentDate.weekday + 7) % 7 + local dayOffset = math.mod(Questie.db.profile.weeklyResetDay - currentDate.weekday + 7, 7) if dayOffset == 0 and currentDate.hour >= Questie.db.profile.weeklyResetHour then dayOffset = 7 end @@ -727,9 +768,16 @@ local GUIDType = { function QuestieCompat.UnitGUID(unit) local guid = UnitGUID(unit) if guid then - local type = tonumber(guid:sub(5, 5), 16) % 8 + local math_mod = math.mod or math.fmod + local type + if math_mod then + type = math_mod(tonumber(string.sub(guid, 5, 5), 16), 8) + else + local val = tonumber(string.sub(guid, 5, 5), 16) + type = val - math.floor(val / 8) * 8 + end if type and (type == 1 or type == 3 or type == 5) then - local id = tonumber(guid:sub(6, 12), 16) + local id = tonumber(string.sub(guid, 6, 12), 16) -- Creature-0-[serverID]-[instanceID]-[zoneUID]-[npcID]-[spawnUID] return string.format("%s-0-4170-0-41-%d-00000F4B37", GUIDType[type], id) end @@ -858,13 +906,13 @@ local LARGE_NUMBER_SEPERATOR = "."; function QuestieCompat.FormatLargeNumber(amount) amount = tostring(amount); local newDisplay = ""; - local strlen = amount:len(); + local strlen = string.len(amount); --Add each thing behind a comma for i = 4, strlen, 3 do - newDisplay = LARGE_NUMBER_SEPERATOR .. amount:sub(-(i - 1), -(i - 3)) .. newDisplay; + newDisplay = LARGE_NUMBER_SEPERATOR .. string.sub(amount, -(i - 1), -(i - 3)) .. newDisplay; end --Add everything before the first comma - newDisplay = amount:sub(1, (strlen % 3 == 0) and 3 or (strlen % 3)) .. newDisplay; + newDisplay = string.sub(amount, 1, (math.mod(strlen, 3) == 0) and 3 or (math.mod(strlen, 3))) .. newDisplay; return newDisplay; end @@ -877,7 +925,7 @@ end QuestieCompat.Round = Round local function GenerateHexColor(r, g, b, a) - return ("ff%.2x%.2x%.2x"):format(Round(r * 255), Round(g * 255), Round(b * 255), Round((a or 1) * 255)); + return string.format(("ff%.2x%.2x%.2x"), Round(r * 255), Round(g * 255), Round(b * 255), Round((a or 1) * 255)); end -- Returns the color value associated with a given class. @@ -1107,43 +1155,16 @@ local function errorhandler(err) return geterrorhandler()(err) end -local function CreateDispatcher(argCount) - local code = [[ - local xpcall, errorhandler = ... - local method, ARGS - local function call() return method(ARGS) end - - local function dispatch(func, eh, ...) - method = func - if not method then return end - ARGS = ... - return xpcall(call, eh or errorhandler) - end - - return dispatch - ]] - - local ARGS = {} - for i = 1, argCount do ARGS[i] = "arg" .. i end - code = code:gsub("ARGS", table.concat(ARGS, ", ")) - return assert(loadstring(code, "safecall Dispatcher[" .. argCount .. "]"))(xpcall, errorhandler) +local method, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25 +local function call() + return method(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25) end -local Dispatchers = setmetatable({}, { - __index = function(self, argCount) - local dispatcher = CreateDispatcher(argCount) - rawset(self, argCount, dispatcher) - return dispatcher - end -}) - -Dispatchers[0] = function(func, eh) - return xpcall(func, eh or errorhandler) -end - -function QuestieCompat.xpcall(func, eh, ...) +function QuestieCompat.xpcall(func, eh, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25) if type(func) == "function" then - return Dispatchers[select('#', ...)](func, eh, ...) + method = func + a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25 = p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25 + return xpcall(call, eh or errorhandler) end end @@ -1183,7 +1204,7 @@ end function QuestieCompat.Save(self) local result = "" - for i = 1, #self._bin do + for i = 1, table.getn(self._bin) do result = result .. table.concat(self._bin[i]) end return result @@ -1211,7 +1232,8 @@ local function isNamePlate(frame) return false end -local function scanWorldFrameChildren(frame, ...) +local function scanWorldFrameChildren(frame, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, + a18, a19, a20, a21, a22, a23, a24, a25) if not frame then return end if not npFrames[frame] and isNamePlate(frame) then @@ -1224,7 +1246,8 @@ local function scanWorldFrameChildren(frame, ...) QuestieCompat.NameplateCreated(frame) end end - return scanWorldFrameChildren(...) + return scanWorldFrameChildren(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, + a20, a21, a22, a23, a24, a25) end function QuestieCompat.NameplateCreated(frame) @@ -1267,8 +1290,8 @@ function QuestieCompat.UpdateNameplate() end function QuestieCompat:QuestieTooltips_RegisterObjectiveTooltip(questId, key, objective) - if key:find("m_") then - local name = QuestieDB.QueryNPCSingle(tonumber(key:sub(3)), "name") + if string.find(key, "m_") then + local name = QuestieDB.QueryNPCSingle(tonumber(string.sub(key, 3)), "name") npActiveQuestNPCs[name] = key end end @@ -1393,10 +1416,10 @@ local _QuestEventHandler = QuestEventHandler.private local QUEST_COMPLETE_MSG = string.gsub(ERR_QUEST_COMPLETE_S, "(%%s)", "(.+)") local completeQuestCache = {} -local DAILY_QUESTS_MSG = DAILY_QUESTS_REMAINING:gsub("%%d", "(%%d+)"):gsub("|4(.-)$", "") +local DAILY_QUESTS_MSG = string.gsub(DAILY_QUESTS_REMAINING, "%%d", "(%%d+)"):gsub("|4(.-)$", "") function QuestieCompat:CHAT_MSG_SYSTEM(event, message) - local questName = message:match(QUEST_COMPLETE_MSG) + local questName = string.match(message, QUEST_COMPLETE_MSG) if questName then local questId = completeQuestCache[questName] or QuestieCompat.GetQuestIDFromName(questName) @@ -1417,7 +1440,7 @@ function QuestieCompat:CHAT_MSG_SYSTEM(event, message) end if Questie.db.profile.resetDailyQuests then - local dailyQuestCount = tonumber(message:match(DAILY_QUESTS_MSG)) + local dailyQuestCount = tonumber(string.match(message, DAILY_QUESTS_MSG)) if dailyQuestCount and (dailyQuestCount == GetMaxDailyQuests()) then QuestieCompat.C_Timer.After(1, function() QuestieCompat.ResetDailyQuests(true) @@ -1507,7 +1530,7 @@ end -- disable builtin quest progress tooltips, re-enable on logout function QuestieCompat:ToggleQuestTrackingTooltips(event) - local value = tostring(event:find("LOGOUT") and 1 or 0) + local value = tostring(string.find(event, "LOGOUT") and 1 or 0) SetCVar("showQuestTrackingTooltips", value) end @@ -1644,7 +1667,7 @@ end function QuestieCompat.LoadCorrections(_LoadCorrections, validationTables) for dbName in pairs(correctionsRegistry) do - local dbKeysReversed = QuestieDB[dbName:sub(1, -5) .. "KeysReversed"] + local dbKeysReversed = QuestieDB[string.sub(dbName, 1, -5) .. "KeysReversed"] for i, corrections in ipairs(correctionsRegistry[dbName]) do _LoadCorrections(dbName, corrections(), dbKeysReversed, validationTables) end diff --git a/Compat/HBD.lua b/Compat/HBD.lua index 911fa6c..8c38d94 100644 --- a/Compat/HBD.lua +++ b/Compat/HBD.lua @@ -835,7 +835,7 @@ function pins:AddWorldMapIconMap(ref, icon, uiMapID, x, y, showFlag, frameLevel) worldmapPins[icon] = t icon.icon = icon --LOL! - icon:SetParent(WorldMapButton) + icon:SetParent(WorldMapDetailFrame or WorldMapButton or WorldMapFrame) HandleWorldMapPin(icon, t) end diff --git a/Database/Ascension/AscensionLoader.lua b/Database/Ascension/AscensionLoader.lua deleted file mode 100644 index 8d32488..0000000 --- a/Database/Ascension/AscensionLoader.lua +++ /dev/null @@ -1,347 +0,0 @@ ----@class AscensionLoader ----@type table -local AscensionLoader = QuestieLoader:CreateModule("AscensionLoader") - ----@type QuestieDB -local QuestieDB = QuestieLoader:ImportModule("QuestieDB") - ----@type table -local AscensionDB = QuestieLoader:ImportModule("AscensionDB") -_G.AscensionDB = _G.AscensionDB or AscensionDB - -local _overridesInjected = false -local _zonesApplied = false - -local function _LoadIfString(data, label) - if not data then return nil end - if type(data) == "string" then - local fn, err = loadstring(data) - if not fn then - if Questie and Questie.Debug then - Questie:Debug(Questie.DEBUG_CRITICAL, "[AscensionLoader] loadstring failed for " .. tostring(label) .. ": " .. tostring(err)) - end - return nil - end - local ok, tbl = pcall(fn) - if not ok then - if Questie and Questie.Debug then - Questie:Debug(Questie.DEBUG_CRITICAL, "[AscensionLoader] executing chunk failed for " .. tostring(label) .. ": " .. tostring(tbl)) - end - return nil - end - return tbl - end - return data -end - -local function _MergeInto(dst, src) - if type(dst) ~= "table" or type(src) ~= "table" then return end - for id, entry in pairs(src) do - dst[id] = entry - end -end - --- Apply Ascension custom uiMapId->areaId mappings into ZoneDB (used by map/Journey) -function AscensionLoader:ApplyZoneTables() - if _zonesApplied then return end - - -- Skip if not on Ascension server (check if we should even be here) - if _G.IsAscensionServer == nil and (not Questie or not Questie.db or not Questie.db.profile or not Questie.db.profile.ascensionMode) then - -- Check if there's actual Ascension data - if quest IDs >= 100000, it's likely Ascension - local hasAscensionQuests = false - if AscensionDB and AscensionDB.questData then - for questId, _ in pairs(AscensionDB.questData or {}) do - if type(questId) == "number" and questId >= 100000 then - hasAscensionQuests = true - break - end - end - end - if not hasAscensionQuests then - _zonesApplied = true -- Mark as done to prevent rechecking - return - end - end - - if not AscensionZoneTables or not AscensionZoneTables.uiMapIdToAreaId then return end - - local ZoneDB = QuestieLoader:ImportModule("ZoneDB") - if not ZoneDB then return end - - ZoneDB.private = ZoneDB.private or {} - ZoneDB.private.uiMapIdToAreaId = ZoneDB.private.uiMapIdToAreaId or {} - ZoneDB.private.areaIdToUiMapId = ZoneDB.private.areaIdToUiMapId or {} - ZoneDB.private.subZoneToParentZone = ZoneDB.private.subZoneToParentZone or {} - - for uiMapId, areaId in pairs(AscensionZoneTables.uiMapIdToAreaId) do - if uiMapId and areaId then - -- Always set these mappings (remove the nil check to ensure they're set) - ZoneDB.private.uiMapIdToAreaId[uiMapId] = areaId - - -- Ascension uses custom map ids for spawns/waypoints (e.g. 1238 for Northshire Valley). - -- QuestieMap draws by converting AreaId->UiMapId, so register these ids as self-mapping. - ZoneDB.private.areaIdToUiMapId[uiMapId] = uiMapId - - -- Register subzone to parent zone mapping so GetParentZoneId works with Ascension zones - if uiMapId ~= areaId then - ZoneDB.private.subZoneToParentZone[uiMapId] = areaId - end - end - end - - -- Also map parentMapIDs (e.g. 10138) to a usable uiMapId to avoid fallback errors. - if AscensionUiMapData and AscensionUiMapData.uiMapData then - for uiMapId, data in pairs(AscensionUiMapData.uiMapData) do - if uiMapId and ZoneDB.private.areaIdToUiMapId[uiMapId] == nil then - ZoneDB.private.areaIdToUiMapId[uiMapId] = uiMapId - end - if data and type(data.parentMapID) == "number" and ZoneDB.private.areaIdToUiMapId[data.parentMapID] == nil then - ZoneDB.private.areaIdToUiMapId[data.parentMapID] = uiMapId - end - end - end - - -- Register zone sort names for custom zones - if AscensionZoneTables.zoneSort then - ZoneDB.private.zoneSort = ZoneDB.private.zoneSort or {} - for zoneId, zoneName in pairs(AscensionZoneTables.zoneSort) do - ZoneDB.private.zoneSort[zoneId] = zoneName - end - end - -- Clear cached zone lookups after adding custom zones - if QuestieDB and QuestieDB.private and QuestieDB.private.zoneCache then - QuestieDB.private.zoneCache = {} - end - - -- Clear auto-blacklist since zone validation might have changed - if QuestieDB and QuestieDB.autoBlacklist then - QuestieDB.autoBlacklist = {} - end - _zonesApplied = true -end - --- Inject Ascension tables into QuestieDB *Overrides* so QueryQuestSingle/QueryNPCSingle can see them -function AscensionLoader:InjectOverrides() - if _overridesInjected then return end - - -- Ascension data should only load on Ascension servers - -- Check if this is an Ascension server by looking for a global or profile setting - local isAscension = false - - -- Method 1: Check for Ascension-specific global (servers may set this) - if _G.IsAscensionServer then - isAscension = true - end - - -- Method 2: Check profile setting - if Questie and Questie.db and Questie.db.profile and Questie.db.profile.ascensionMode then - isAscension = true - end - - -- Method 3: Check if there's actually Ascension quest data loaded - -- (this is a fallback - if AscensionDB has real data, use it) - if not isAscension and AscensionDB and AscensionDB.questData then - local questDataType = type(AscensionDB.questData) - -- If it's a table with entries, it's likely real Ascension data - if questDataType == "table" then - local hasData = false - for _ in pairs(AscensionDB.questData) do - hasData = true - break - end - if hasData then - -- Only use Ascension data if quest ID ranges suggest it's not standard WoW - -- Standard WoW quest IDs are typically < 100000 - for questId, _ in pairs(AscensionDB.questData) do - if type(questId) == "number" and questId >= 100000 then - isAscension = true - break - end - end - end - end - end - - if not isAscension then - -- Not an Ascension server, skip loading Ascension data - _overridesInjected = true -- Mark as done to prevent rechecking - return - end - - _overridesInjected = true - - -- Apply zone tables FIRST, before any ZoneDB functions use the local variables - AscensionLoader:ApplyZoneTables() - - QuestieDB.npcDataOverrides = QuestieDB.npcDataOverrides or {} - QuestieDB.objectDataOverrides = QuestieDB.objectDataOverrides or {} - QuestieDB.itemDataOverrides = QuestieDB.itemDataOverrides or {} - QuestieDB.questDataOverrides = QuestieDB.questDataOverrides or {} - - local npcData = _LoadIfString(AscensionDB and AscensionDB.npcData, "AscensionDB.npcData") - local objectData = _LoadIfString(AscensionDB and AscensionDB.objectData, "AscensionDB.objectData") - local itemData = _LoadIfString(AscensionDB and AscensionDB.itemData, "AscensionDB.itemData") - local questData = _LoadIfString(AscensionDB and AscensionDB.questData, "AscensionDB.questData") - - _MergeInto(QuestieDB.npcDataOverrides, npcData) - _MergeInto(QuestieDB.objectDataOverrides, objectData) - _MergeInto(QuestieDB.itemDataOverrides, itemData) - _MergeInto(QuestieDB.questDataOverrides, questData) - - -- Keep a lightweight list of custom quest ids for search/UI (DO NOT touch QuestPointers; those are numeric stream pointers) - if type(questData) == "table" then - QuestieDB.ascensionQuestIds = QuestieDB.ascensionQuestIds or {} - for questId, _ in pairs(questData) do - if type(questId) == "number" then - QuestieDB.ascensionQuestIds[questId] = true - end - end - end - - -- Keep a lightweight list of custom NPC ids for search/UI - if type(npcData) == "table" then - QuestieDB.ascensionNpcIds = QuestieDB.ascensionNpcIds or {} - for npcId, _ in pairs(npcData) do - if type(npcId) == "number" then - QuestieDB.ascensionNpcIds[npcId] = true - end - end - end - - -- Keep a lightweight list of custom object ids for search/UI - if type(objectData) == "table" then - QuestieDB.ascensionObjectIds = QuestieDB.ascensionObjectIds or {} - for objectId, _ in pairs(objectData) do - if type(objectId) == "number" then - QuestieDB.ascensionObjectIds[objectId] = true - end - end - end - - -- Keep a lightweight list of custom item ids for search/UI - if type(itemData) == "table" then - QuestieDB.ascensionItemIds = QuestieDB.ascensionItemIds or {} - for itemId, _ in pairs(itemData) do - if type(itemId) == "number" then - QuestieDB.ascensionItemIds[itemId] = true - end - end - end -end - --- Hook ZoneDB.Initialize to inject custom zones BEFORE standard zones are processed -do - local ZoneDB = QuestieLoader:ImportModule("ZoneDB") - if ZoneDB then - local originalZoneInitialize = ZoneDB.Initialize - if type(originalZoneInitialize) == "function" then - function ZoneDB:Initialize(...) - -- Apply custom zones FIRST, before standard zone processing - AscensionLoader:ApplyZoneTables() - - -- Then initialize standard zones - return originalZoneInitialize(self, ...) - end - end - end -end - --- Hook QuestieDB.Initialize to guarantee timing for overrides -do - local originalInitialize = QuestieDB and QuestieDB.Initialize - if type(originalInitialize) == "function" then - function QuestieDB:Initialize(...) - -- 1) Inject overrides before the DB handles are created - AscensionLoader:InjectOverrides() - - local ret = originalInitialize(self, ...) - - -- 2) Refresh Journey caches (zoneMap/zones) so "Quests by Zone" sees the new data - local ZoneDB = QuestieLoader:ImportModule("ZoneDB") - local QuestieJourney = QuestieLoader:ImportModule("QuestieJourney") - if ZoneDB and QuestieJourney then - QuestieJourney.zoneMap = ZoneDB:GetZonesWithQuests(true) - QuestieJourney.zones = ZoneDB:GetRelevantZones() - - -- Clear the UI cache so the tree gets rebuilt - if QuestieJourney.private then - QuestieJourney.private.treeCache = nil - QuestieJourney.private.lastZoneSelection = {} - end - - -- If the Journey window is open, rebuild the current tab - if QuestieJourneyFrame and QuestieJourneyFrame:IsShown() and QuestieJourney.tabGroup then - local p = QuestieJourney.private - if p and p.containerCache and p.lastOpenWindow then - p:HandleTabChange(p.containerCache, p.lastOpenWindow) - end - end - end - - return ret - end - end -end - --- >>> NEW: Make QuestieDB.GetQuest work for Ascension override quests (Journey needs this) -do - local originalGetQuest = QuestieDB.GetQuest - if type(originalGetQuest) == "function" then - function QuestieDB.GetQuest(questId) - local q = originalGetQuest(questId) - if q then return q end - - -- Fallback: build a minimal quest object from QueryQuestSingle (works with overrides) - local name = QuestieDB.QueryQuestSingle(questId, "name") - if not name then return nil end - - local level = QuestieDB.QueryQuestSingle(questId, "level") or QuestieDB.QueryQuestSingle(questId, "questLevel") - local reqLevel = QuestieDB.QueryQuestSingle(questId, "requiredLevel") or QuestieDB.QueryQuestSingle(questId, "minLevel") - local desc = QuestieDB.QueryQuestSingle(questId, "objectiveText") or QuestieDB.QueryQuestSingle(questId, "description") or QuestieDB.QueryQuestSingle(questId, "details") - - -- Build the Starts field from startedBy (CRITICAL for available quests to show icons!) - local startedBy = QuestieDB.QueryQuestSingle(questId, "startedBy") - - local starts = { - NPC = startedBy and startedBy[1] or {}, - GameObject = startedBy and startedBy[2] or {}, - Item = startedBy and startedBy[3] or {}, - } - - -- Also get other fields needed for quest display - local finishedBy = QuestieDB.QueryQuestSingle(questId, "finishedBy") - local specialFlags = QuestieDB.QueryQuestSingle(questId, "specialFlags") - local isRepeatable = specialFlags and (bit.band(specialFlags, 1) ~= 0) or false - - -- Questie modules expect these common fields - return { - Id = questId, - id = questId, - name = name, - level = level or reqLevel or 0, - requiredLevel = reqLevel or 0, - Description = desc, -- Journey tooltip reads quest.Description - Starts = starts, -- CRITICAL: AvailableQuests needs this! - finishedBy = finishedBy, - IsRepeatable = isRepeatable, - } - end - end -end - - --- Ensure zones also get applied when Questie finishes loading (covers edge cases) -do - local f = CreateFrame("Frame") - f:RegisterEvent("ADDON_LOADED") - f:SetScript("OnEvent", function(_, _, name) - if name ~= "Questie-335" then return end - if C_Timer and C_Timer.After then - C_Timer.After(0, function() AscensionLoader:ApplyZoneTables() end) - else - AscensionLoader:ApplyZoneTables() - end - end) -end - -return AscensionLoader diff --git a/Database/Ascension/Bronzebeard/AscensionItemDB.lua b/Database/Ascension/Bronzebeard/AscensionItemDB.lua deleted file mode 100644 index e447293..0000000 --- a/Database/Ascension/Bronzebeard/AscensionItemDB.lua +++ /dev/null @@ -1,109 +0,0 @@ ----@type table -local AscensionDB = QuestieLoader:CreateModule("AscensionDB") - -AscensionDB.itemData = AscensionDB.itemData or { - - --Elwynn Forest - - [559159]={[1]="Oracular Idol",[2]={161717},[3]=nil,[4]=nil,[5]=1660036,[6]=nil,[7]=nil,[8]=nil,[9]=1,[10]=1,[11]=nil,[12]=nil,[13]=0}, - [5055565]={[1]="Tattered Orders",[2]={991516},[3]=nil,[4]=nil,[5]=100074,[6]=nil,[7]=nil,[8]=nil,[9]=1,[10]=1,[11]=nil,[12]=nil,[13]=0}, - [558956]={[1]="Elgris Blossom Petals",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=0,[10]=0,[11]=nil,[12]=12,[13]=0,[14]={162814},[15]={1660056}}, - [558957]={[1]="Dun Kazad Liquor Concentrate",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=0,[10]=0,[11]=nil,[12]=12,[13]=0,[14]={162811},[15]={1660056}}, - [558958]={[1]="Pumpkin Juice",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=0,[10]=0,[11]=nil,[12]=12,[13]=0,[14]={162809},[15]={1660056}}, - [558959]={[1]="Murloc Eyeball",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=0,[10]=0,[11]=nil,[12]=12,[13]=0,[14]={162826},[15]={1660056}}, - [558960]={[1]="Agria's Incomplete Potion",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=1,[10]=1,[11]=nil,[12]=15,[13]=0,[14]=nil,[15]={1660056}}, - [558961]={[1]="Pumpkin",[2]=nil,[3]={999014},[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=0,[10]=0,[11]=nil,[12]=0,[13]=5}, - [558962]={[1]="Melon",[2]=nil,[3]={999013},[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=0,[10]=0,[11]=nil,[12]=0,[13]=5}, - [558963]={[1]="Apple",[2]=nil,[3]={999015},[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=0,[10]=0,[11]=nil,[12]=0,[13]=5}, - [157001]={[1]="Gem Encrusted Spider Silk",[2]={43},[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=2048,[8]=nil,[9]=1,[10]=0,[11]=0,[12]=12,[13]=0,[14]=nil,[15]={17001}}, - [157006]={[1]="Simple Crystal Vial",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=0,[8]=nil,[9]=5,[10]=0,[11]=nil,[12]=12,[13]=0,[14]=nil,[15]={17003},[16]=157006}, - [157002]={[1]="Depleted Mana Gem",[2]={474},[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=1,[10]=1,[11]=nil,[12]=15,[13]=0,[14]=nil,[15]={17002}}, - [157007]={[1]="Gnoll Sword",[2]={97},[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=1,[10]=6,[11]=nil,[12]=15,[13]=0,[14]=nil,[15]={17004}}, - [157008]={[1]="Gnoll Axe",[2]={478},[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=1,[10]=10,[11]=nil,[12]=15,[13]=0,[14]=nil,[15]={17004}}, - [157012]={[1]="Smudged Note",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil,[7]=0,[8]=nil,[9]=1,[10]=1,[11]=nil,[12]=15,[13]=0,[14]=nil,[15]={17005}}, - [157014]={[1]="Mirror Lake Apple",[2]=nil,[3]={9017008},[4]=nil,[5]=nil,[6]=nil,[7]=nil,[8]=nil,[9]=1,[10]=8,[11]=nil,[12]=15,[13]=0,[14]=nil,[15]={17008}}, - [559130] = {[1]="Lost Page I",[3]={900001},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660001}}, - [559131] = {[1]="Lost Page II",[3]={900002},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660001}}, - [559132] = {[1]="Lost Page III",[3]={900003},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660001}}, - [559133] = {[1]="Lost Page IV",[3]={900004},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660001}}, - - --Dan Morogh - - [254000] = {[1]="Security Bot AN-29",[2]={254004},[9]=1,[10]=0,[12]=12,[13]=0,[15]={254000}}, - [254001] = {[1]="Security Bot AN-32",[2]={254005},[9]=1,[10]=0,[12]=12,[13]=0,[15]={254001}}, - [559142] = {[1]="Radiant Armor Piece",[2]={161772},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660008}}, - [559161] = {[1]="Contamination Extractor",[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660010}}, - [559162] = {[1]="Radioactive Slime Mutagen",[2]={161776},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660010}}, - [559163] = {[1]="Radiation Sprayer",[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660011}}, - [558964] = {[1]="Thunderbrew Hop",[3]={2300550},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660077}}, - [558950] = {[1]="Gornarn Blunderbuss",[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660079}}, - [558965] = {[1]="Reusable Mechanical Parts",[2]={162888,162889,162890},[9]=0,[10]=0,[12]=12,[13]=0,[15]={1660078}}, - [254002] = {[1]="Mirsinth's Totem",[2]={254006},[9]=1,[10]=0,[12]=12,[13]=0,[15]={254004}}, - [662336] = {[1]="Frostpine Log",[3]={244620},[9]=1,[10]=0,[12]=12,[13]=0,[15]={500005}}, - - --Teldrassil - - [559143] = {[1]="Cut of Good Meat",[3]={2300512},[9]=1,[10]=0,[12]=0,[13]=0,[15]={1660014}}, - [559144] = {[1]="Good Flesh Amalgam",[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660015}}, - [559145] = {[1]="Blessed Good Flesh Amalgam",[15]={1660015}}, - - --Durotar - - [11584] = {'Cactus Apple Surprise',nil,nil,nil,nil,nil,nil,nil,5,0,0,4,0,nil,{254010}}, - [254005] = {'Strange Flower',nil,{254001},nil,nil,nil,nil,nil,1,0,0,12,0,nil,{254008}}, - [254006] = {'Xaitoth\'s Blood',{254015},nil,nil,nil,nil,nil,nil,1,0,0,12,0,nil,nil}, - [559146] = {'Witch’s Amulet',nil,nil,nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660019}}, - [559148] = {'Bat Spiritual Essence',{161793},nil,nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660020}}, - [559149] = {'Spider Spiritual Essence',{161795},nil,nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660020}}, - [559150] = {'Serpent Spiritual Essence',{161794},nil,nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660020}}, - [559155] = {'Spiritual Unrest',{30719},nil,nil,nil,nil,nil,nil,0,0,0,4,0,nil,nil}, - [559158] = {'Unremarkable Stone',nil,nil,nil,nil,nil,nil,1,1,0,0,12,0,nil,nil}, - [559172] = {'Fire Elemental Shackles',nil,{1064805},nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660021}}, - [559173] = {'Earth Elemental Shackles',nil,{2392807},nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660021}}, - [559174] = {'Air Elemental Shackles',nil,{3478505},nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660021}}, - [559175] = {'Water Elemental Shackles',nil,{4541078},nil,nil,nil,nil,nil,1,0,0,4,0,nil,{1660021}}, - [558973] = {[1]="Empty Dirgran's Pitcher",[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660064}}, - [558974] = {[1]="Full Dirgran's Pitcher",[3]={5954415},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660064}}, - [254007] = {[1]="Metallic Debris",[3]={254003},[9]=1,[10]=0,[12]=12,[13]=0,[15]={254011}}, - [558966] = {[1]="Elven Relic of Old",[3]={2300551,2300558,2300556,2300555,2300553,2300554,2300557},[10]=0,[12]=0,[13]=0,[15]={1660063}}, - [254008] = {[1]="Ouru'Gai Crystal",[3]={254002},[9]=1,[10]=0,[12]=12,[13]=0,[15]={254014}}, - - --Tirisfal Glades - - [16333] = {[1]="Samuel's Remains",[2]={1919},[9]=1,[10]=0,[12]=12,[13]=0,[15]={6395}}, - [559164] = {[1]="Gaudy Painting",[3]={2300528},[9]=1,[10]=0,[12]=0,[13]=0,[15]={1660028}}, - [559165] = {[1]="Shimmering Jewel",[3]={2300529},[9]=1,[10]=0,[12]=0,[13]=0,[15]={1660028}}, - [559166] = {[1]="Crystal Ball",[2]={108586},[3]={2300530},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660028}}, - [559167] = {[1]="Family Signet",[2]={108586},[3]={2300531},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660028}}, - [559138] = {[1]="Majordomo’s Key Fragment",[2]={161753},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660026}}, - [559139] = {[1]="Maid’s Key Fragment",[2]={161754},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660026}}, - [559140] = {[1]="Stablemaster’s Key Fragment",[2]={161755},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660026}}, - [354655] = {[1]="Rod Toxicstrike's Concoction",[9]=1,[10]=0,[12]=12,[13]=0,[15]={254064}}, - [558953] = {[1]="Encapsulated Necrotic Spores",[3]={2300545},[9]=0,[10]=0,[12]=12,[13]=0,[15]={1660051}}, - [558954] = {[1]="Clinging Necrotic Spores",[2]={162842},[9]=0,[10]=0,[12]=12,[13]=0,[15]={1660051}}, - [558955] = {'Scarlet Letter',{162857},nil,nil,{1660053},nil,nil,nil,1,0,0,12,0,nil,nil}, - [354678] = {[1]="Lieutenant Sanders's Head",[2]={13158},[9]=1,[10]=1,[12]=12,[13]=0,[15]={254056}}, - [354654] = {[1]="Ralden's Transformation Elixir",[9]=1,[10]=0,[12]=12,[13]=0,[15]={254057}}, - - --Mulgore - - [559156] = {[1]="Grimtotem Marauder Mane",[2]={161809},[9]=0,[10]=0,[12]=12,[13]=0,[15]={1660030}}, - [559168] = {[1]="Offering Bone",[2]={161810},[3]={2300532},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660035}}, - [559151] = {[1]="Grimtotem Armor Piece",[3]={2300514},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660032}}, - [559152] = {[1]="Exalted Pendant",[3]={2300515},[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660032}}, - [558972] = {[1]="Full Sanctuary Amphora",[3]={5195711},[15]={1660067}}, - [558971] = {[1]="Empty Sanctuary Amphora",[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660067}}, - [558967] = {[1]="Holy Water Blessing",[9]=1,[10]=0,[12]=12,[13]=0,[15]={1660068}}, - [558968] = {[1]="Prairie Sap",[3]={2300552},[9]=0,[10]=0,[12]=0,[13]=0,[15]={1660069}}, - [558969] = {[1]="Kodo Tallow",[2]={162909,2972,2973,2974},[9]=0,[10]=0,[12]=12,[13]=0,[15]={1660069}}, - [662335] = {[1]="Ritual Totem",[2]={2965,2964},[9]=1,[10]=0,[12]=12,[13]=0,[15]={500004}}, - - - - - - -} - -AscensionItemDB=AscensionItemDB or {} -AscensionItemDB.itemData=AscensionDB.itemData diff --git a/Database/Ascension/Bronzebeard/AscensionNpcDB.lua b/Database/Ascension/Bronzebeard/AscensionNpcDB.lua deleted file mode 100644 index 981d488..0000000 --- a/Database/Ascension/Bronzebeard/AscensionNpcDB.lua +++ /dev/null @@ -1,229 +0,0 @@ ----@type table -local AscensionDB = QuestieLoader:CreateModule("AscensionDB") - -AscensionDB.npcData = AscensionDB.npcData or { - - - --Beginner's Book of Ascension - - [75118]={"Beginner's Book of Ascension",89,89,1,1,1,{[14]={{42.4,68.7},{52.2,43.2},{56.2,74.7}},[17]={{28.4,67.0},{63.2,37.0},{52.1,30.2}},[3430]={{44.2,70.9},{38.3,21.4},{47.0,46.1}},[12]={{48.1,41.9},{43.1,66.6}},[1]={{30.1,71.7},{46.9,52.4}},[141]={{58.7,44.3},{57.5,57.5}},[85]={{31.5,65.9},{61.4,53.0}},[3524]={{49.1,51.3},{80.7,46.3}},[215]={{47.1,60.9}},[148]={{37.3,44.0}},[130]={{43.4,41.8}},[38]={{34.9,47.7}},[3433]={{47.6,31.6}},[3525]={{55.1,59.6}},[44]={{28.2,47.7}},[331]={{36.3,49.3}},[10]={{73.9,48.0}},[40]={{56.9,54.7}}},nil,nil,{1903520},{1903520},31,"AH",nil,3}, - - --Elwynn Forest - - [97921]={[1]='Garion Hunter',[2]=327,[3]=327,[4]=10,[5]=10,[6]=0,[7]={[12]={{43.97,64.16}}},[8]=nil,[9]=12,[10]={4420430,1903556},[11]={4420430},[12]=72,[13]="AH",[14]="",[15]=3}, - [161700]={[1]='Bianca Spada',[2]=158,[3]=158,[4]=8,[5]=8,[6]=0,[7]={[12]={{48.1,42.4}}},[8]=nil,[9]=12,[10]={1660000},[11]=nil,[12]=12,[13]="A",[14]=nil,[15]=3}, - [161701]={[1]='Moroi Spada',[2]=293,[3]=293,[4]=11,[5]=11,[6]=0,[7]={[1238]={{39.89,51.29}}},[8]=nil,[9]=12,[10]={1660001,1660002},[11]={1660000},[12]=12,[13]="A",[14]="Seminarian of Northshire Abbey",[15]=3}, - [161702]={[1]='Sister Alma',[2]=4058,[3]=4058,[4]=55,[5]=55,[6]=0,[7]={[12]={{52.4,35}}},[8]=nil,[9]=12,[10]={},[11]={},[12]=72,[13]="AH",[14]="Ancient Priestess of Northshire",[15]=3}, - [161705]={[1]='Injured Northshire Guard',[2]=510,[3]=510,[4]=17,[5]=17,[6]=0,[7]={[12]={{54.9,39.5}}},[8]=nil,[9]=12,[10]={1660005},[11]={1660005},[12]=72,[13]="AH",[14]="Injured Northshire Guard",[15]=3}, - [161712]={[1]='Accursed Censor',[2]=341,[3]=341,[4]=4,[5]=4,[6]=0,[7]={[12]={{51.7,27.6}}},[8]=nil,[9]=12,[10]=nil,[11]={1660038},[12]=25,[13]=nil,[14]="",[15]=0}, - [161713]={[1]='Wayward Theologian',[2]=341,[3]=341,[4]=7,[5]=7,[6]=0,[7]={[12]={{60.5,28.7}}},[8]=nil,[9]=12,[10]=nil,[11]={1660004},[12]=25,[13]=nil,[14]="",[15]=0}, - [161716]={[1]='Shadewell Murloc',[2]=100,[3]=134,[4]=3,[5]=3,[6]=0,[7]={[12]={{58.11,31.87},{57.92,32.08},{57.29,32.93},{57.24,32.18},{57.74,31.54},{58.57,31.1},{58.33,30.11},{58.18,29.24},{58.36,28.44},{58.65,28.72},{58.79,29.02},{58.73,28.03},{59.24,26.92},{59.36,26.22},{58.98,25.92},{58.31,25.83},{58.31,25.15},{57.68,25.61},{57.82,26.2}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=25,[13]=nil,[14]="",[15]=0}, - [161717]={[1]='Shadewell Murloc Oracle',[2]=100,[3]=134,[4]=3,[5]=3,[6]=0,[7]={[12]={{58.25,31.47},{58.63,30.72},{58.54,29.36},{56.56,33.84},{59.02,25.53},{59.29,26.58}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=72,[13]="AH",[14]="",[15]=3}, - [161736]={[1]='Defias Plunderer',[2]=100,[3]=134,[4]=3,[5]=3,[6]=0,[7]={[12]={{55.62,38.74},{55.28,38.61},{54.83,38.23},{55.43,36.8},{56.1,37.49},{55.22,37.71},{55.52,37.63},{55.66,38.2},{55.67,37.51},{55.59,37.54},{55.66,38.05},{56.03,36.58}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=25,[13]=nil,[14]="",[15]=0}, - [161844]={[1]='Father Harnos',[2]=205,[3]=205,[4]=8,[5]=8,[6]=0,[7]={[12]={{49.16,41.71}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=72,[13]="AH",[14]="",[15]=3}, - [162800]={[1]='Dulcinea',[2]=510,[3]=510,[4]=17,[5]=17,[6]=0,[7]={[12]={{43.11,65.90}}},[8]=nil,[9]=12,[10]={},[11]={},[12]=72,[13]="AH",[14]="Maid of House Spada",[15]=3}, - [162802]={[1]='Aldia Crayon',[2]=1394,[3]=1394,[4]=30,[5]=30,[6]=0,[7]={[12]={{30.72,57.72}}},[8]=nil,[9]=12,[10]={1660057},[11]={1660056,1660057},[12]=72,[13]="AH",[14]="",[15]=3}, - [162805]={[1]="Clara the Mad",[2]=120,[3]=120,[4]=8,[5]=8,[6]=0,[7]={[12]={{43.22,70.87}}},[8]=nil,[9]=12,[10]={1660058},[11]={1660058},[12]=12,[13]="A",[14]=nil,[15]=2}, - [162806]={[1]='Aliscar Lend',[2]=1593,[3]=1593,[4]=32,[5]=32,[6]=0,[7]={[12]={{44.59,62.99}}},[8]=nil,[9]=12,[10]={},[11]={},[12]=72,[13]="AH",[14]="",[15]=3}, - [162943]={[1]='Arcane Projection of Aliscar',[2]=1593,[3]=1593,[4]=32,[5]=32,[6]=0,[7]={[12]={{44.44,63.39}}},[8]=nil,[9]=12,[10]={},[11]={},[12]=72,[13]="AH",[14]="",[15]=3}, - [162809]={[1]="Rowena",[2]=120,[3]=120,[4]=8,[5]=8,[6]=0,[7]={[12]={{43.2,66.9}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=12,[13]="A",[14]=nil,[15]=2}, - [162811]={[1]="Darron",[2]=120,[3]=120,[4]=8,[5]=8,[6]=0,[7]={[12]={{42.5,65.9}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=12,[13]="A",[14]=nil,[15]=2}, - [162814]={[1]="Ainora",[2]=120,[3]=120,[4]=8,[5]=8,[6]=0,[7]={[12]={{43.6,62.6}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=12,[13]="A",[14]=nil,[15]=2}, - [162815]={[1]="Aldia",[2]=120,[3]=120,[4]=20,[5]=20,[6]=0,[7]={[12]={{34.4,82.9}}},[8]=nil,[9]=12,[10]={1660056},[11]={1660056},[12]=12,[13]="A",[14]=nil,[15]=2}, - [162807]={[1]='Harvend Thorm',[2]=1923,[3]=1923,[4]=35,[5]=35,[6]=0,[7]={[12]={{42.42,70.12}}},[8]=nil,[9]=12,[10]={1660059},[11]={},[12]=72,[13]="AH",[14]="",[15]=3}, - [162801]={[1]='Eldor Hammer',[2]=688,[3]=688,[4]=21,[5]=21,[6]=0,[7]={[12]={{43.96,70.25}}},[8]=nil,[9]=12,[10]={},[11]={1660059},[12]=72,[13]="AH",[14]="",[15]=3}, - [162826]={[1]="Joaquin",[2]=120,[3]=120,[4]=8,[5]=8,[6]=0,[7]={[12]={{46.6,65.3}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=12,[13]="A",[14]=nil,[15]=2}, - [991516]={[1]='Suspicious Guard',[2]=309,[3]=309,[4]=8,[5]=8,[6]=0,[7]={[12]={{58.12,80.04}}},[8]=nil,[9]=12,[10]={},[11]={},[12]=72,[13]="AH",[14]="",[15]=3}, - [9000017]={[1]='Esyra',[2]=211,[3]=211,[4]=9,[5]=9,[6]=0,[7]={[12]={{64.90,69.80}}},[8]=nil,[9]=12,[10]={17003,17002},[11]={17003,17002},[12]=72,[13]="AH",[14]="",[15]=3}, - [197]={[1]="Marshal McBride",[2]=484,[3]=484,[4]=20,[5]=20,[6]=0,[7]={[12]={{48.0,41.9}}},[8]=nil,[9]=12,[10]={7,15,21,54,3100,3101,3102,3103,3104,3105},[11]={7,15,21,783},[12]=12,[13]="A",[14]=nil,[15]=3}, - [240]={[1]="Marshal Dughan",[2]=713,[3]=713,[4]=25,[5]=25,[6]=0,[7]={[12]={{42.96,65.78}}},[8]=nil,[9]=12,[10]={35,59,62,76,109,147,239},[11]={39,40,54,62,76,123,147,176},[12]=12,[13]="A",[14]=nil,[15]=3}, - [250]={[1]="Pa Maclure",[2]=120,[3]=120,[4]=6,[5]=6,[6]=0,[7]={[12]={{42.7,89.3}}},[8]=nil,[9]=12,[10]={17000},[11]={17000},[12]=12,[13]="A",[14]=nil,[15]=2}, - [253]={[1]="William Pestle",[2]=120,[3]=120,[4]=6,[5]=6,[6]=0,[7]={[12]={{44.29,66.56}}},[8]=nil,[9]=12,[10]={60,61,112,114},[11]={60,107,112},[12]=12,[13]="A",[14]=nil,[15]=2}, - [261]={[1]="Guard Thomas",[2]=1003,[3]=1003,[4]=30,[5]=30,[6]=0,[7]={[12]={{73.97,72.18}}},[8]=nil,[9]=12,[10]={37,39,46,52,109,17004},[11]={35,46,52,71,17004},[12]=12,[13]="A",[14]=nil,[15]=2}, - [295]={[1]="Innkeeper Farley",[2]=1003,[3]=1003,[4]=30,[5]=30,[6]=0,[7]={[12]={{44.77,66.8}}},[8]=nil,[9]=12,[10]={70},[11]={69,2158},[12]=12,[13]="A",[14]="Innkeeper",[15]=66179}, - [658]={[1]="Sten Stoutarm",[2]=102,[3]=102,[4]=5,[5]=5,[6]=0,[7]={[1]={{29.87,71.88}}},[8]=nil,[9]=1,[10]={179,233,3106,3107,3108,3109,3110,3112,3113,3114,3115},[11]={179},[12]=55,[13]="A",[14]=nil,[15]=3}, - [713]={[1]="Balir Frosthammer",[2]=102,[3]=102,[4]=5,[5]=5,[6]=0,[7]={[1]={{29.92,71.16}}},[8]=nil,[9]=1,[10]={170},[11]={170},[12]=55,[13]="A",[14]=nil,[15]=2}, - [823]={[1]="Deputy Willem",[2]=417,[3]=417,[4]=18,[5]=18,[6]=0,[7]={[12]={{48.0,43.6}}},[8]=nil,[9]=12,[10]={6,18,783,3903,5261},[11]={6,18},[12]=12,[13]="A",[14]=nil,[15]=2}, - [917]={[1]="Keryn Sylvius",[2]=222,[3]=222,[4]=11,[5]=11,[6]=0,[7]={[12]={{44.89,66.70}}},[8]=nil,[9]=12,[10]={2205,2300},[11]=nil,[12]=12,[13]="A",[14]="Rogue Trainer",[15]=51}, - [955]={[1]="Sergeant De Vries",[2]=198,[3]=198,[4]=10,[5]=10,[6]=0,[7]={[12]={{24.08,73.2}}},[8]=nil,[9]=12,[10]={17008},[11]={17008},[12]=12,[13]="A",[14]="Morale Officer",[15]=640}, - [6778]={[1]="Melika Isenstrider",[2]=222,[3]=222,[4]=11,[5]=11,[6]=0,[7]={[12]={{44.47,67.03}}},[8]=nil,[9]=12,[10]=nil,[11]=nil,[12]=12,[13]="A",[14]="Assistant Innkeeper",[15]=2}, - [11916]={[1]="Imelda",[2]=713,[3]=713,[4]=25,[5]=25,[6]=0,[7]={[1519]={{33.71,62.6}}},[8]=nil,[9]=1519,[10]=nil,[11]={17005},[12]=12,[13]="A",[14]=nil,[15]=1}, - [466] = {'General Marcus Jonathan',42780,42780,72,72,1,{[1519]={{69.17,82.72}}},nil,1519,{100466,121},{120},12,"A","High Commander of Stormwind Defense",2}, - - --Dun Morogh - --NPCs - [254000] = {[1]="Efry Cogspark",[2]=299,[3]=299,[4]=10,[5]=10,[6]=0,[7]={[1239]={{65.49,45.96}},[38]={{35.20,48.60}}},[9]=1239,[10]={254000,254001,254002},[11]={254000,254001,254005},[12]=12,[13]="A"}, - [161718] = {[1]="Groldha",[2]=187,[3]=187,[4]=8,[5]=8,[6]=0,[7]={[1239]={{62.70,43.90}}},[9]=1239,[10]={1660006,1660009},[12]=12,[13]="A"}, - [161720] = {[1]="Arathror",[2]=584,[3]=584,[4]=20,[5]=20,[6]=0,[7]={[1239]={{41,33.96}}},[9]=1239,[10]={1660008,1660009,1660039},[11]={1660007,1660008},[12]=12,[13]="A"}, - [161719] = {'Dead Crewman',212,212,9,9,0,{[1239]={{33.80,52.80}}},nil,1239,{1660007},{1660006},72,"AH","",0}, - [161820] = {[1]="Redna",[2]=187,[3]=187,[4]=8,[5]=8,[6]=0,[7]={[1239]={{35.34,32.31}}},[9]=1239,[10]={1660010},[11]={1660010,1660039},[12]=72,[13]="AH"}, - [161839] = {[1]="Lahud",[2]=91,[3]=91,[4]=3,[5]=3,[6]=0,[7]={[1239]={{55.23,21.02}}},[9]=1239,[10]={1660011},[11]={1660011},[12]=72,[13]="AH"}, - [162882] = {[1]="Norhi Thunderbrew",[2]=329,[3]=329,[4]=13,[5]=13,[6]=0,[7]={[1239]={{63.04,45.22}}},[9]=1239,[10]={1660076},[12]=12,[13]="A"}, - [254002] = {'Mountaineer Tagnur',22690,22690,57,57,0,{[1]={{36.20,62.40}}},nil,1,{254003}, {254002},72,"A","",3}, - [162883] = {'Eyma Thunderbrew',395,395,15,15,0,{[1]={{47.30,52.70}}},nil,1,{1660077}, {1660076,1660077},72,"A","",3}, - [7954] = {'Binjy Featherwhistle',2769,2769,50,50,0,{[1]={{49.15,48.13}}},nil,1,{4420432,1903556},{14084,4420432,1903556},875,"A","Mechanostrider Pilot",83}, - [162901] = {[1]="Gravedigger Nonuid",[2]=503,[3]=503,[4]=18,[5]=18,[6]=0,[7]={[1]={{48.87,52.65}}},[9]=1,[10]={1660080},[11]={1660080},[12]=12,[13]="A"}, - [162891] = {[1]="Gornarn",[2]=239,[3]=239,[4]=10,[5]=10,[6]=0,[7]={[1]={{49.23,53.74}}},[9]=1,[10]={1660079},[11]={1660079},[12]=12,[13]="A"}, - [162917] = {'Target',122,122,5,5,0,{[1]={{49.00,53.70}}},nil,1,{}, {},72,"A","",3}, - [162884] = {[1]="Ikoras",[2]=212,[3]=212,[4]=9,[5]=9,[6]=0,[7]={[1]={{48.90,55.90}}},[8]=nil,[9]=1,[10]={1660078},[11]={1660078},[12]=12,[13]="A",[14]=nil,[15]=0}, - [254003] = {'Mirsinth the Exile',478,478,10,10,0,{[1]={{36.80,52.00}}},nil,1,{}, {254003},12,"A","",3}, - [765556] = {[1]="Brunna Ironhew",[2]=267,[3]=267,[4]=11,[5]=11,[6]=0,[7]={[1]={{62.5,57.49}}},[9]=1,[10]={500005},[11]={500005},[12]=12,[13]="A"}, - [764536] = {[1]="Old Kargan Stouthew",[2]=239,[3]=239,[4]=10,[5]=10,[6]=0,[7]={[1]={{61.9,57.74}}},[9]=1,[10]={500006},[11]={500006},[12]=12,[13]="A"}, - --Creatures - [254004] = {'Damaged Security Bot',161,161,1,1,0,{[1239]={{31.41,73.19}}},nil,1239,nil,nil,72,nil,nil,0}, - [254005] = {'Security Bot AN-32',161,161,1,1,0,{[1239]={{59.16,82.95}}},nil,1239,nil,nil,72,nil,nil,0}, - [161772] = {[1]="Radiant Fanatic",[2]=78,[3]=78,[4]=3,[5]=3,[6]=0,[7]={[1239]={{43.84,25.51},{43.04,26.69},{41.49,26.36},{40.51,24.75},{42.05,24.54},{38.7,22.71},{38.94,20.46},{39.17,17.75},{38.54,17.54},{42.34,17.51},{41.7,19.44},{42.55,20.73},{45.74,21.15}}},[9]=1239}, - [161776] = {'Radiant Slime',91,122,3,3,0,{[1239]={{49.80,20.31},{50.18,19.95},{49.47,23.21},{50.80,21.77},{51.38,22.23},{51.73,22.81},{52.99,23.20},{53.56,24.08},{55.20,22.80},{55.16,24.53},{54.90,25.98},{57.82,23.08},{58.30,22.87},{55.12,27.21},{58.59,29.38},{57.96,29.33},{58.37,30.84},{60.31,23.03},{60.99,23.35},{61.24,21.61}}},nil,1239,nil,nil,72,nil,nil,0}, - [161835] = {'Right Hand of His Majesty',311,311,4,4,1,{[1239]={{56.04,24.44}}},nil,1239,nil,nil,72,nil,nil,0}, - [161775] = {'His Radiant Majesty',414,414,7,7,1,{[1239]={{59.81,26.35}}},nil,1239,nil,nil,72,nil,nil,0}, - [161786] = {'Radiant Devotee',91,122,3,3,0,{[1239]={{50.89,19.79},{53.29,22.45},{54.28,21.74},{50.47,22.60},{50.08,23.43},{49.82,23.66},{49.45,19.25},{51.25,20.38},{50.74,18.11},{51.15,17.81},{51.78,20.05},{52.48,20.85},{53.84,19.47},{53.95,19.13},{53.19,18.76},{54.40,24.45},{54.00,24.39},{55.64,24.86},{56.32,27.38},{56.94,27.45},{57.22,25.45},{57.42,25.12},{53.40,21.65},{53.08,24.47},{52.38,23.56},{52.15,24.75},{55.46,19.19},{56.89,19.36}}},nil,1239,nil,nil,72,nil,nil,0}, - [162888] = {'Out-of-Control Automaton v1.1',122,122,6,6,0,{[1]={{49.84,55.71},{51.03,54.78},{51.86,56.41},{52.63,56.26},{53.65,55.68}}},nil,1,nil,nil,72,"AH",nil,0}, - [162889] = {'Out-of-Control Automaton v1.2',144,144,6,6,0,{[1]={{50.4,56.03},{50.45,55.24},{50.72,54.47},{51.43,56.29},{52.1,55.31},{52.59,56.14}}},nil,1,nil,nil,72,"AH",nil,0}, - [162890] = {'Out-of-Control Automaton v1.3',165,165,7,7,0,{[1]={{50.41,55.61},{51.37,55.85},{52.52,55.87},{53.69,55.47}}},nil,1,nil,nil,72,"AH",nil,0}, - [254006] = {[1]="Jun'Kon",[2]=161,[3]=161,[4]=8,[5]=8,[6]=0,[7]={[1]={{21.59,51.64}}},[9]=1}, - [76555] = {[1]="Icehide",[2]=563,[3]=563,[4]=14,[5]=14,[6]=1,[7]={[1]={{64.85,58.42}}},[9]=1}, - - --Teldrassil - --NPCs - [2083] = {'Syral Bladeleaf',247,247,12,12,0,{[141]={{57.2,56.83}}},nil,141,{489,997,1581},{1581},80,"A",nil,2}, - [2078] = {'Athridas Bearmantle',222,222,11,11,0,{[141]={{57.34,56.11}}},nil,141,{475,483,486},{476,483,486},80,"A",nil,2}, - [2151] = {'Moon Priestess Amara',713,713,25,25,0,{[141]={{55.30,58.40}}},nil,141,{487,489},{487},79,"A",nil,2}, - [3567] = {'Tallonkai Swiftroot',222,222,11,11,0,{[141]={{57.36,55.35}}},nil,141,{932,2438,2459},{932,2438,2459},80,"A",nil,2}, - [6736] = {'Innkeeper Keldamyr',1003,1003,30,30,0,{[141]={{57.26, 60.00}}},nil,141,nil,{2159},80,"A","Innkeeper",66179}, - [6780] = {'Porthannius',137,137,7,7,0,{[141]={{54.58,84.52}}},nil,141,{2159},nil,80,"A",nil,2}, - [449169] = {[1]="Sylindra Starweave",[2]=299,[3]=327,[4]=10,[5]=10,[6]=0,[7]={[141]={{56.26,57.01}}},[9]=141,[10]={1903556,449169,},[11]={1903556,449169},[12]=12,[13]="A"}, - [161725] = {[1]="Thariel Wingstroke",[2]=293,[3]=293,[4]=11,[5]=11,[6]=0,[7]={[1243]={{51.34,67.86},{51.44,67.98}}},[9]=1243,[10]={1660012,1660071},[11]={1660085},[12]=12,[13]="A"}, - [161726] = {[1]="Aryandel",[2]=361,[3]=361,[4]=13,[5]=13,[6]=0,[7]={[1243]={{62.03,35.03}}},[9]=1243,[10]={1660013},[11]={1660012},[12]=12,[13]="A"}, - [161727] = {[1]="Lady Aegya",[2]=433,[3]=433,[4]=-1,[5]=-1,[6]=3,[7]={[1243]={{69.64,24.5}}},[9]=1243,[10]={1660014,1660015,1660085},[11]={1660013,1660014,1660016},[12]=12,[13]="A"}, - [161728] = {[1]="Gilgaen",[2]=640,[3]=640,[4]=20,[5]=20,[6]=0,[7]={[1243]={{68.87,21.74}}},[9]=1243,[10]={1660016},[11]={1660015},[12]=12,[13]="A"}, - [161848] = {[1]="Eldya",[2]=181,[3]=181,[4]=7,[5]=7,[6]=0,[7]={[1243]={{66.32,35.46},{66.32,35.46}}},[9]=1243,[10]={1660017},[11]={1660017},[12]=12,[13]="A"}, - [161916] = {[1]="Sheelem",[2]=181,[3]=181,[4]=7,[5]=7,[6]=0,[7]={[1243]={{72.08,32.99}}},[9]=1243,[10]={1660040},[11]={1660040},[12]=12,[13]="A"}, - [162879] = {[1]="Kaladir",[2]=232,[3]=232,[4]=9,[5]=9,[6]=0,[7]={[141]={{56.48,59.67}}},[9]=141,[10]={1660074},[11]={1660074},[12]=12,[13]="A"}, - [162880] = {[1]="Adrilia Soultemper",[2]=1113,[3]=1113,[4]=27,[5]=27,[6]=0,[7]={[141]={{57.03,52.30}}},[9]=141,[10]={1660073},[11]={1660072,1660073},[12]=12,[13]="A"}, - [162881] = {[1]="Alenna Whisperbough",[2]=940,[3]=940,[4]=25,[5]=25,[6]=0,[7]={[141]={{59.35,58.93}}},[9]=141,[10]={1660075},[11]={1660075},[12]=12,[13]="A"}, - [162870] = {[1]="Theren-Dion Sentinel",[2]=144,[3]=158,[4]=6,[5]=7,[6]=0,[7]={[141]={{58.20,52.00},{57.70,50.50}}},[9]=141}, - [162871] = {[1]="Theren-Dion Sentinel",[2]=144,[3]=158,[4]=6,[5]=7,[6]=0,[7]={[141]={{58.10,51.90},{57.10,50.30}}},[9]=141}, - [162872] = {[1]="Theren-Dion Sentinel",[2]=144,[3]=158,[4]=6,[5]=7,[6]=0,[7]={[141]={{58.50,51.50},{58.30,48.80}}},[9]=141}, - [162873] = {[1]="Theren-Dion Sentinel",[2]=144,[3]=158,[4]=6,[5]=7,[6]=0,[7]={[141]={{58.20,48.70},{57.80,49.60}}},[9]=141}, - [162856] = {[1]="Theren-Dion Sentinel",[2]=144,[3]=158,[4]=6,[5]=7,[6]=0,[7]={[141]={{58.60,50.90},{57.30,50.00}}},[9]=141}, - --Creatures - [161735] = {[1]="Rotworm",[2]=29,[3]=35,[4]=1,[5]=2,[6]=0,[7]={[2031]={{53.97,33.06},{53.33,28.5},{51.23,56.05},{36.2,54.26},{36.66,55.04},{39.02,51.87},{64.99,68.22},{65.8,66.49},{65.6,65.18},{52.47,63.9},{51.88,66.98},{54.03,63.64},{53.36,63.55},{51.11,68.3},{53.05,77.85},{52.37,80.54}},[1243]={{71.45,30.52}}},[9]=2031}, - [161782] = {[1]="Fallen Aspirant",[2]=79,[3]=112,[4]=3,[5]=3,[6]=0,[7]={[2031]={{47.65,38.09},{48.3,38.18},{51.23,56.05},{52.08,59.8},{52.87,64.32},{40.42,74.45},{47.95,61.11}}},[9]=2031}, - [161783] = {[1]="Aberrant Flesh Remnant",[2]=100,[3]=100,[4]=3,[5]=3,[6]=0,[7]={[1243]={{65.35,20.54}}},[9]=1243}, - [161784] = {[1]="Elydna Wingstroke",[2]=945,[3]=945,[4]=7,[5]=7,[6]=1,[7]={[1243]={{71.73,21.17}}},[9]=1243}, - [161787] = {[1]="Fretful Withered Treant",[2]=100,[3]=134,[4]=3,[5]=3,[6]=0,[7]={[1243]={{54.16,42.06},{58.8,49.23},{58.46,43.54},{58.95,44.98},{59.71,46.38},{57.67,45.94},{57.01,42.63},{56.49,40.05},{54.87,43.18},{55.27,44.46},{55.59,45.04},{60.5,44.16},{61.3,40.07},{60.35,38.47},{59.11,39.23},{58.78,39.82},{53.92,43.47}}},[9]=1243}, - [161832] = {[1]="Rotting Flesh Spawn",[2]=403,[3]=403,[4]=4,[5]=4,[6]=1,[7]={[2031]={{50.51,61.86}}},[9]=2031}, - [162874] = {[1]="Frenzied Vulture",[2]=158,[3]=158,[4]=7,[5]=7,[6]=0,[7]={[141]={{59.88,48.94},{59.52,49.65}}},[9]=141}, - [162876] = {[1]="Barkshredder Termite",[2]=158,[3]=158,[4]=6,[5]=6,[6]=0,[7]={[141]={{54.86,61.82},{55.06,60.88},{55.3,60.28},{54.89,59.49},{54.74,62.82}}},[9]=141}, - [162877] = {[1]="Barkshredder Queen",[2]=205,[3]=205,[4]=8,[5]=8,[6]=0,[7]={[141]={{54.96,59.31}}},[9]=141}, - [162925] = {[1]="Vulture Egg",[2]=27,[3]=27,[4]=7,[5]=7,[6]=0,[7]={[141]={{59.32,49.26},{59.88,48.91}}},[9]=141,[12]=72,[13]="AH"}, - - --Durotar - --NPCs - [3287] = {'Hana\'zua',55,55,2,2,0,{[1244]={{34.24,46.61}}},nil,1244,{790,804},{790},126,"H",nil,2}, - [161732] = {'Esgramor',326,326,12,12,0,{[1244]={{44.75,66.92}}},nil,1244,{1660018,1660022,1660023,1660061},{1660021,1660022,1660023},29,"H","",0}, - [161733] = {'Swa’li',361,361,13,13,0,{[1244]={{35.57,41.53}}},nil,1244,{1660037,1660019},{1660018,1660037},29,"H","",0}, - [161734] = {'Anjali',232,232,9,9,0,{[2030]={{14.74,50.80}}},nil,2030,{1660020,1660041,1660021},{1660019,1660041,1660020},29,"H","",0}, - [254011] = {'Sakari',801,801,20,20,0,{[1244]={{42.58,61.97}}},nil,1244,{254008,254009,254010},{254008,254009},29,"H","",0}, - [7953] = {'Xar\'Ti',2769,2769,50,50,0,{[14]={{55.28,75.49}}},nil,14,{4420437,1903557},{14088,4420437,1903557},126,"H","Riding Trainer",83}, - [162839] = {[1]="Karagar",[2]=678,[3]=678,[4]=22,[5]=22,[6]=0,[7]={[14]={{53,40.92},{53,40.92},{53,40.92}}},[9]=14,[10]={1660062,1660087,1660089},[11]={1660061},[12]=29,[13]="H"}, - [162840] = {[1]="Rilly",[2]=329,[3]=329,[4]=13,[5]=13,[6]=0,[7]={[14]={{57.19,41.85}}},[9]=14,[10]={1660063},[11]={1660063},[12]=29,[13]="H"}, - [162838] = {'Foreman Dirgran',239,239,10,10,0,{[14]={{51.15,40.67}}},nil,5,{1660064},{1660064},29,"H","",0}, - [162836] = {'Thirsty Peon',144,144,8,8,0,{[14]={{50.80,39.90},{50.60,39.90},{50.70,39.40},{50.60,39.30},{50.70,39.10},{50.50,39.00},{50.40,38.70},{50.50,38.60},{50.30,38.60},{50.40,38.30},{50.30,38.10},{50.20,38.10},{50.00,38.50},{49.90,38.60},{50.10,38.70}}},nil,14,nil,nil,29,"H",nil,0}, - [254012] = {[1]="Queen Erethina",[2]=731,[3]=731,[4]=20,[5]=20,[6]=0,[7]={[14]={{48.92,34.82}}},[9]=14,[10]={254012},[11]={254011,254012},[12]=72,[13]="AH"}, - [254013] = {'Sakari',731,731,20,20,0,{[1637]={{56.30,32.50}}},nil,1637,{254014}, {254013},126,"H",nil,2}, - [254014] = {'Sakari',731,731,20,20,0,{[17]={{62.40,10.20}}},nil,17,{254015}, {254014,254015},126,"H",nil,2}, - --Creatures - [30719] = {'Uneasy Citizen',nil,nil,nil,nil,nil,{[1244]={{44.54,63.16},{45.80,63.18},{43.80,62.37},{40.61,62.07},{40.29,65.35},{38.91,66.86},{37.62,67.10},{34.40,64.39},{34.13,65.10},{34.86,66.58},{42.11,71.20},{43.17,71.49}}},nil,1244,{559155}}, - [161790] = {'Hirsutta the Witch',1000,1000,7,7,1,{[1244]={{27.50,33.58},{28.14,33.95}}},nil,1244,nil}, - [161792] = {'Elder Guardian Spirit',100,134,3,3,0,{[1244]={{36.05,24.76},{36.02,24.86},{36.15,24.85},{36.11,24.92}},[2030]={{15.24,54.18},{44.30,66.59},{49.86,82.31},{49.73,81.90},{49.39,82.65},{73.27,58.79},{68.42,35.12},{69.04,35.12},{14.99,57.19},{14.91,57.05},{14.69,56.15},{14.92,51.82},{14.86,53.20},{14.68,56.62},{15.38,56.79},{16.40,56.70},{15.72,57.06},{14.95,54.90},{15.02,54.64},{14.79,56.29},{14.97,56.39},{14.75,56.26},{14.71,55.93},{16.01,57.57},{14.97,57.08},{15.25,56.50}}},nil,2030,{559175}}, - [161793] = {'Sinister Bat',100,134,3,3,0,{[2030]={{47.39,40.03},{44.41,56.04},{42.71,58.67},{43.98,67.17},{45.49,73.12},{46.82,77.89},{47.26,76.27},{50.41,78.72},{71.26,42.00},{65.52,35.27}}},nil,2030,nil}, - [161794] = {'Sinister Snake',100,134,3,3,0,{[2030]={{16.87,41.78},{18.68,37.45},{20.41,36.96},{22.27,39.15},{25.81,36.57},{28.02,36.25},{28.95,38.23},{34.84,41.81},{39.14,46.66},{44.51,49.30},{75.08,61.00}}},nil,2030,nil}, - [161795] = {'Sinister Spider',100,134,3,3,0,{[2030]={{49.41,76.57},{54.99,83.38},{70.19,76.11},{72.83,72.78},{73.23,58.00},{77.18,58.24},{79.99,60.88},{74.75,50.15},{73.86,42.19},{67.59,37.73},{66.51,34.42}}},nil,2030,nil}, - [161807] = {'Voodoo Devotee',94,125,4,4,0,{[1244]={{32.20,51.26},{30.76,50.13},{29.95,50.76},{29.99,52.77},{31.88,49.68},{32.26,47.30},{30.44,49.24},{31.39,41.65},{32.36,37.75},{31.12,36.71},{32.31,55.94},{33.37,53.37},{32.20,51.32},{30.91,52.63},{30.96,51.11},{31.29,46.45},{31.02,36.65}}},nil,1244,nil}, - [161833] = {'Techla\'Tu, The Gatekeeper',403,403,4,4,1,{[2030]={{53.19,66.45}}},nil,2030,nil}, - [161854] = {'Enchanted Tiki Mask',134,134,3,3,0,{[1244]={{34.60,38.13}}},nil,1244,nil}, - [161855] = {'Chattering Tiki Mask',100,100,3,3,0,{[1244]={{31.19,44.56}}},nil,1244,nil}, - [161856] = {'Possessed Tiki Mask',134,134,3,3,0,{[1244]={{36.98,41.30}}},nil,1244,nil}, - [254015] = {'Xaitoth',225,225,3,3,0,{[1217]={{50.31,60.68}}},nil,1217,{254006}}, - [162834] = {'Rivenruin Myrmidon',144,144,6,7,0,{[14]={{58.09,41.23},{57.90,40.96},{58.07,39.50},{58.26,39.18},{58.18,38.86},{57.99,37.85},{57.66,37.84},{56.54,38.47},{57.44,38.77},{58.31,36.91},{57.92,36.80},{58.16,37.21},{57.37,37.59},{57.45,38.47},{57.77,38.37},{57.72,39.44},{57.62,39.18}}},nil,14,nil,nil,72,nil,nil,0}, - [162835] = {'Rivenruin Sorceress',134,134,6,7,0,{[14]={{58.31,40.96},{57.63,37.39},{57.72,38.79},{58.30,36.21},{57.91,36.25},{57.94,35.76},{57.84,35.53},{57.21,39.23},{56.32,39.68},{55.57,39.12}}},nil,14,nil,nil,72,nil,nil,0}, - [162916] = {[1]="Rivenruin Brute",[2]=165,[3]=165,[4]=8,[5]=8,[6]=0,[7]={[14]={{59.06,39.29}}},[9]=14}, - [162841] = {'Bagamul Skyfang',2484,2484,41,41,0,{[14]={{51.77,44.36}}},nil,14,{1660065},{1660065},29,"H","",0}, - [254016] = {[1]="Queen Erethina",[2]=1323,[3]=1323,[4]=12,[5]=12,[6]=0,[7]={[17]={{62.4,10.2}}},[9]=17}, - - --Tirisfal Glades - --NPCs - [161739] = {'Anthon',165,165,7,7,0,{[1240]={{50.53,58.18}}},nil,1240,{1660024},{},29,"H","",0}, - [161740] = {'Riscell Cain',329,329,13,13,0,{[1240]={{28.40,55.10}}},nil,1240,{1660025}, {1660024,1660050},72,"H","",3}, - [161742] = {[1]="Deathguard Eric",[2]=395,[3]=395,[4]=15,[5]=15,[6]=0,[7]={[1240]={{27.66,55.67}}},[9]=1240,[10]={1660029,1660050},[11]={1660029},[12]=29,[13]="H",3}, - [161746] = {[1]="Kalis",[2]=298,[3]=298,[4]=12,[5]=12,[6]=0,[7]={[1240]={{27.93,55.11}}},[9]=1240,[10]={1660042},[11]={1660042},[12]=29,[13]="H",3}, - [161747] = {[1]="Thris",[2]=362,[3]=362,[4]=14,[5]=14,[6]=0,[7]={[1240]={{27.87,54.59}}},[9]=1240,[10]={1660028},[11]={1660028},[12]=29,[13]="H",3}, - [161741] = {'Exsangue',584,584,20,20,0,{[1240]={{15.90,46.00}}},nil,1240,{}, {1660026},29,"H","",3}, - [4773] = {'Velma Warnam',1003,1003,30,30,0,{[85]={{59.40,51.30}}},nil,85,{4420434,1903557},{14089,4420434,1903557},68,"H","Riding Trainer",83}, - [162843] = {'Apothecary Flemer',267,267,11,11,0,{[85]={{58.10,52.40}}},nil,1420,{}, {1660050},29,"H","",3}, - [1518] = {'Apothecary Johaan',484,484,20,20,0,{[85]={{58.40,52.80}}},nil,85,{367,368,369,407,445,492},{365,367,368,369},68,"H","Royal Apothecary Society",2}, - [1519] = {'Deathguard Simmer',1210,1210,23,23,0,{[85]={{38.80,55.80}}},nil,85,{365},nil,68,"H",nil,2}, - [749136] = {[1]="Rod Toxicstrike",[2]=366,[3]=366,[4]=10,[5]=10,[6]=0,[7]={[85]={{43.97,39.21}}},[9]=85,[10]={254064},[11]={254064},[12]=29,[13]="H"}, - [162844] = {[1]="Delcard Sading",[2]=466,[3]=466,[4]=17,[5]=17,[6]=0,[7]={[85]={{59.9,52.76}}},[9]=85,[10]={1660052},[11]={1660052},[12]=29,[13]="H"}, - [162847] = {[1]="Dark Priestess Ashara",[2]=1188,[3]=1188,[4]=29,[5]=29,[6]=0,[7]={[85]={{59.76,54.57}}},[9]=85,[10]={1660054},[11]={1660054},[12]=29,[13]="H"}, - [991483] = {[1]="Father Alastor",[2]=348,[3]=348,[4]=15,[5]=15,[6]=0,[7]={[85]={{70.54,63.73},{70.53,63.75}}},[9]=85,[10]={254053,254054},[11]={254053,254054},[12]=29,[13]="H"}, - [764555] = {[1]="Warden Kaelthar Graveborn",[2]=584,[3]=584,[4]=15,[5]=15,[6]=0,[7]={[85]={{76.08,45.05}}},[9]=85,[10]={254056},[12]=29,[13]="H"}, - [764554] = {'Apothecary Ralden',584,584,15,15,0,{[85]={{75.80,44.70}}},nil,85,{}, {254056},29,"H","Royal Apothecary Society",3}, - --Creatures - [161762] = {[1]="Mother",[2]=122,[3]=122,[4]=3,[5]=3,[6]=0,[7]={[1240]={{15.97,69.18}}},[9]=1240}, - [161763] = {[1]="Father",[2]=91,[3]=91,[4]=3,[5]=3,[6]=0,[7]={[1240]={{16.02,65.36}}},[9]=1240}, - [161764] = {[1]="Cousin Salem",[2]=122,[3]=122,[4]=3,[5]=3,[6]=0,[7]={[1240]={{18.46,71.3}}},[9]=1240}, - [161765] = {[1]="Uncle Abel",[2]=103,[3]=103,[4]=3,[5]=3,[6]=0,[7]={[1240]={{20.08,66.61}}},[9]=1240}, - [161836] = {[1]="Hound of House Cain",[2]=311,[3]=311,[4]=4,[5]=4,[6]=1,[7]={[1240]={{14.52,45.35}}},[9]=1240}, - [161752] = {[1]="Ghoul",[2]=91,[3]=122,[4]=3,[5]=3,[6]=0,[7]={[1240]={{17.58,47.57},{17.49,45.07},{19.17,47.16},{18.7,46.25},{21.21,47.45},{20.54,46.05},{19.86,42.33},{14.52,47.64},{15.4,50.51}}},[9]=1240}, - [161743] = {[1]="Necrotic Bear",[2]=91,[3]=122,[4]=3,[5]=3,[6]=0,[7]={[1240]={{17.12,64.35},{19.18,41.61},{17.97,40.44}}},[9]=1240}, - [161749] = {[1]="Zombie",[2]=91,[3]=122,[4]=3,[5]=3,[6]=0,[7]={[1240]={{23.89,57.08},{23.19,55.84},{22.55,55.46},{23.35,54.84},{22.54,53.83},{21.57,53.79},{21.7,52.63},{25.33,53.73},{25.52,52.49},{26.27,52.61},{19.68,56.24},{19.44,56.82},{19.57,57.86},{18.59,57.18},{19.07,59.82},{19.27,60.74},{21.12,62.22},{21.13,58.48},{22.37,59.22},{21.2,50.87},{20.61,50.48},{16.81,55.72},{17.18,56.47},{17.4,55.7}}},[9]=1240}, - [161753] = {[1]="Brainless Majordomo",[2]=97,[3]=115,[4]=3,[5]=3,[6]=0,[7]={[1240]={{19.99,47.87}}},[9]=1240}, - [161754] = {[1]="Brainless Maid",[2]=97,[3]=97,[4]=3,[5]=3,[6]=0,[7]={[1240]={{14.32,46.3},{12.95,48.68}}},[9]=1240}, - [161755] = {[1]="Brainless Stablemaster",[2]=87,[3]=87,[4]=3,[5]=3,[6]=0,[7]={[1240]={{18.5,52.72}}},[9]=1240}, - [161757] = {[1]="Aberrant Progeny",[2]=913,[3]=913,[4]=7,[5]=7,[6]=1,[7]={[1240]={{17.28,46.49}}},[9]=1240}, - [254584] = {'Mallek the Tormented',289,289,9,9,0,{[85]={{51.40,35.30}}},nil,1420}, - [162842] = {'Sporephase Guardian',144,144,8,8,0,{[85]={{56.43,54.70},{56.72,55.75},{56.09,56.09},{57.95,57.73},{58.18,55.41},{57.56,54.83},{57.12,54.84},{56.47,54.91},{56.36,56.53},{57.31,56.98},{57.43,56.69},{57.85,56.49},{58.33,56.28},{57.64,55.29},{57.44,55.95},{57.66,54.14},{56.97,54.39}}},nil,85,nil,nil,72,nil,nil,0}, - [162853] = {[1]="Brightwater Rebel",[2]=144,[3]=144,[4]=8,[5]=8,[6]=0,[7]={[85]={{67.01,50.35},{68.3,51},{67.34,51.06},{67.39,52.15}}},[9]=85}, - [162854] = {[1]="Brightwater Rebel",[2]=144,[3]=144,[4]=8,[5]=8,[6]=0,[7]={[85]={{67.21,50.76},{67.11,50.01},{66.51,50.17},{67.06,51.94}}},[9]=85}, - [162857] = {[1]="Alric Sading",[2]=144,[3]=144,[4]=8,[5]=8,[6]=0,[7]={[85]={{67.33,51.87}}},[9]=85}, - [162859] = {[1]="Scarlet Soldier",[2]=144,[3]=144,[4]=8,[5]=8,[6]=0,[7]={[85]={{63.74,46.02},{63.74,45.52},{63.2,46.72},{62.63,47.04},{63.34,47.44}}},[9]=85}, - [162860] = {[1]="Scarlet Mage",[2]=134,[3]=134,[4]=8,[5]=8,[6]=0,[7]={[85]={{64.51,46.79},{63.51,46.49},{63.72,45.06},{62.66,47.23},{63.6,47.79}}},[9]=85}, - [162861] = {[1]="Scarlet Battler",[2]=122,[3]=165,[4]=8,[5]=8,[6]=0,[7]={[85]={{65,46.98},{64.45,46.62},{63.5,44.7},{63.35,45.82},{63.31,47.09}}},[9]=85}, - [254936] = {[1]="Jorum Balnir",[2]=656,[3]=656,[4]=12,[5]=12,[6]=1,[7]={[85]={{77.1,59.94}}},[9]=85}, - [254937] = {[1]="Vara Balnir",[2]=656,[3]=656,[4]=12,[5]=12,[6]=1,[7]={[85]={{77.5,62}}},[9]=85}, - [254938] = {[1]="Jarim Balnir",[2]=656,[3]=656,[4]=12,[5]=12,[6]=1,[7]={[85]={{74.84,61.01},{74.7,61.74}}},[9]=85}, - [13158] = {'Lieutenant Sanders',276,276,12,12,0,{[85]={{86.82,42.40}}},nil,85,nil,nil,72,nil,nil,0}, - - --Mulgore - --NPCs - [161817] = {'Redhorn',239,239,10,10,0,{[1245]={{30.83,28.37}}},nil,1245,{1660030},{},29,"H","",0}, - [161818] = {'Morriga Hollowhoof',348,348,15,15,0,{[1245]={{64.84,66.09}}},nil,1245,{1660031,1660035},{1660030,1660033},29,"H","",0}, - [161819] = {'Sage Nauchol',301,301,13,13,0,{[1245]={{72.33,88.30}}},nil,1245,{1660032,1660033},{1660031,1660032},29,"H","",0}, - [161840] = {'Hyena Spirit',239,239,10,10,0,{[1245]={{68.71,89.81}}},nil,1245,{1660043,1660034},{1660035,1660043,1660034},72,"AH","",0}, - [162902] = {'Handros',187,187,8,8,0,{[1245]={{28.86,32.82}}},nil,1245,{1660066},{},29,"H","",0}, - [162903] = {'Ammus Grey-Eye',429,429,16,16,0,{[1245]={{14.42,28.93}}},nil,1245,{1660067,1660070},{1660066,1660070},29,"H","",0}, - [162904] = {'Arkan Fairwind',212,212,9,9,0,{[1245]={{14.60,29.50}}},nil,1245,{}, {},29,"H","",0}, - [162906] = {'Sage Muudren',584,584,20,20,0,{[215]={{44.22,59.08}}},nil,215,{1660068},{1660067},29,"H","",0}, - [162908] = {'Ancestress Emnil',1756,1756,35,35,0,{[215]={{39.93,60.78}}},nil,215,{1660069},{1660069},29,"H","",0}, - [991485] = {'Tharok Windhoof',499,499,20,20,0,{[215]={{46.76,49.48}}},nil,215,{500004},{500004},29,"H","",0}, - [3690] = {'Kar Stormsinger',2138,2138,44,44,0,{[215]={{47.65,58.47}}},nil,215,{4420435,1903557},{14087,4420435,1903557},104,"H","Riding Trainer",83}, - --Creatures - [161809] = {'Grimtotem Marauder',91,122,3,3,0,{[1245]={{46.69,53.15},{47.52,52.49},{47.90,56.97},{49.80,56.32},{49.55,59.98},{49.88,61.54},{52.64,62.10},{52.37,60.74},{52.47,57.32},{54.38,54.50},{55.30,58.82},{54.49,59.65},{50.84,64.79},{52.70,64.85},{54.13,64.67},{55.40,66.38},{56.91,64.29},{56.99,62.19},{57.21,59.75},{58.72,57.71},{61.06,59.71},{59.46,63.35},{57.84,69.81},{59.60,69.59},{60.85,70.88},{62.33,72.02},{60.04,73.13},{61.51,74.79}}},nil,1245,{559156}}, - [161810] = {'Grimtotem Patrol',91,122,3,3,0,{[1245]={{61.84,68.48},{62.43,74.60},{64.72,76.08},{61.10,73.88},{57.66,78.70},{58.01,80.26},{59.62,81.12},{62.04,83.40},{66.10,84.68},{70.24,85.86},{71.83,88.29},{66.38,84.65}}},nil,1245,{559168}}, - [161834] = {'Cruel Carrion Spirit',311,311,4,4,1,{[1245]={{71.02,86.27}}},nil,1245,nil}, - [161850] = {[1]="Aquiline Totem",[2]=122,[3]=122,[4]=3,[5]=3,[6]=0,[7]={[1245]={{82.03,81.96}}},[9]=1245}, - [161851] = {[1]="Owlish Totem",[2]=103,[3]=103,[4]=3,[5]=3,[6]=0,[7]={[1245]={{77.22,84.66}}},[9]=1245}, - [161852] = {[1]="Taurine Totem",[2]=103,[3]=103,[4]=3,[5]=3,[6]=0,[7]={[1245]={{81.84,77.56}}},[9]=1245}, - [161816] = {'Malgorm Hollowhoof',663,663,7,7,1,{[1245]={{79.07,74.63}}},nil,1245,nil}, - [162907] = {[1]="Devouring Fire",[2]=144,[3]=144,[4]=6,[5]=6,[6]=0,[7]={[215]={{42.41,58.84},{41.83,59.47},{41.33,58.85},{41.49,58.01},{42.58,59.83},{42.52,60.66},{41.73,60.46},{40.99,59.53},{40.43,58.67},{39.86,58.04},{40.72,57.42}}},[9]=215}, - [162909] = {'Thick Kodo',144,144,6,6,0,{[215]={{38.25,63.41},{41.26,62.62},{41.67,62.98},{41.12,63.15},{39.95,62.79}}},nil,215,nil,nil,72,nil,nil,0}, - - - -} - --- Backward compatibility (if any code still references AscensionNpcDB.npcData) -AscensionNpcDB = AscensionNpcDB or {} -AscensionNpcDB.npcData = AscensionDB.npcData diff --git a/Database/Ascension/Bronzebeard/AscensionObjectDB.lua b/Database/Ascension/Bronzebeard/AscensionObjectDB.lua deleted file mode 100644 index 8cda0a5..0000000 --- a/Database/Ascension/Bronzebeard/AscensionObjectDB.lua +++ /dev/null @@ -1,129 +0,0 @@ ----@type table -local AscensionDB = QuestieLoader:CreateModule("AscensionDB") - -AscensionDB.objectData = AscensionDB.objectData or { - - -- Path of Ascension - - [9908168]={[1]="Resurrect in Closest Town or Capital",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil}, - [9942043]={[1]="Learn Novice Riding from the Riding Trainer",[2]=nil,[3]=nil,[4]={[12]={{43.97,64.16}},[141]={{56.29,57.01}},[215]={{47.69,58.52}},[14]={{55.28,75.49}},[1]={{49.15,48.13}},[85]={{59.40,51.30}}},[5]=12,[6]=nil}, - [9903556]={[1]="Pets Tab (Shift+P), Mounts Tab, Summon Mount",[2]=nil,[3]=nil,[4]={[12]={{43.97,64.16}},[141]={{56.29,57.01}},[215]={{47.69,58.52}},[14]={{55.28,75.49}},[1]={{49.15,48.13}},[85]={{59.40,51.30}}},[5]=12,[6]=nil}, - [9903553]={[1]="Open the Dungeon Finder (I) / Green Eye",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil}, - [9903554]={[1]="Select dungeon(s) then click Find Group",[2]=nil,[3]=nil,[4]=nil,[5]=nil,[6]=nil}, - [9905201]={[1]="Talk to the Beginner's Book of Ascension",[2]=nil,[3]=nil,[4]={[14]={{42.4,68.7},{52.2,43.2},{56.2,74.7}},[17]={{28.4,67.0},{63.2,37.0},{52.1,30.2}},[3430]={{44.2,70.9},{38.3,21.4},{47.0,46.1}},[12]={{48.1,41.9},{43.1,66.6}},[1]={{30.1,71.7},{46.9,52.4}},[141]={{58.7,44.3},{57.5,57.5}},[85]={{31.5,65.9},{61.4,53.0}},[3524]={{49.1,51.3},{80.7,46.3}},[215]={{47.1,60.9}},[148]={{37.3,44.0}},[130]={{43.4,41.8}},[38]={{34.9,47.7}},[3433]={{47.6,31.6}},[3525]={{55.1,59.6}},[44]={{28.2,47.7}},[331]={{36.3,49.3}},[10]={{73.9,48.0}},[40]={{56.9,54.7}}},[5]=12,[6]=nil}, - [9905202]={[1]="Select Train Me and rank up your spells",[2]=nil,[3]=nil,[4]={[14]={{42.4,68.7},{52.2,43.2},{56.2,74.7}},[17]={{28.4,67.0},{63.2,37.0},{52.1,30.2}},[3430]={{44.2,70.9},{38.3,21.4},{47.0,46.1}},[12]={{48.1,41.9},{43.1,66.6}},[1]={{30.1,71.7},{46.9,52.4}},[141]={{58.7,44.3},{57.5,57.5}},[85]={{31.5,65.9},{61.4,53.0}},[3524]={{49.1,51.3},{80.7,46.3}},[215]={{47.1,60.9}},[148]={{37.3,44.0}},[130]={{43.4,41.8}},[38]={{34.9,47.7}},[3433]={{47.6,31.6}},[3525]={{55.1,59.6}},[44]={{28.2,47.7}},[331]={{36.3,49.3}},[10]={{73.9,48.0}},[40]={{56.9,54.7}}},[5]=12,[6]=nil}, - [9903540]={[1]="Visit an Innkeeper and select \"Make this inn your home\"",[2]=nil,[3]=nil,[4]={[12]={{44.77,66.8},{43.45,66.2}},[1]={{47.38,52.52},{47.22,52.19}},[11]={{10.7,60.95}},[267]={{51.17,58.93},{62.78,19.03}},[17]={{51.99,29.89},{62.05,39.41},{45.58,59.04}},[1537]={{18.15,51.45}},[85]={{61.71,52.05}},[33]={{31.49,29.75},{27.04,77.31}},[15]={{66.59,45.22},{41.93,74.17},{36.89,32.35}},[44]={{27.01,44.82}},[38]={{35.53,48.4}},[1657]={{67.42,15.65}},[141]={{57.26, 60.00}},[148]={{37.04,44.13}},[331]={{36.99,49.22},{73.99,60.65}},[130]={{43.18,41.28}},[1519]={{60.39,75.28}},[1497]={{67.74,37.89}},[1638]={{45.81,64.71}},[215]={{46.62,61.09}},[10]={{73.87,44.41}},[14]={{51.51,41.64}},[1637]={{54.1,68.41},{51.14,72.6}},[8]={{45.16,56.66}},[406]={{47.47,62.13},{35.79,5.74}},[440]={{52.51,27.91}},[357]={{30.97,43.49},{74.8,45.18}},[47]={{14.15,41.57},{78.14,81.38}},[40]={{52.86,53.72}},[3]={{2.81,45.85}},[45]={{73.84,32.46}},[405]={{66.27,6.55},{24.09,68.21}},[400]={{46.07,51.52}},[618]={{61.36,38.83}},[1377]={{51.89,39.16}},[3430]={{43.67,71.31},{48.16,47.66}},[139]={{75.85,52.21}},[3433]={{48.91,32.42}},[3524]={{48.37,49.2}},[3483]={{56.71,37.47},{54.22,63.6},{26.88,59.53},{23.35,36.36}},[3487]={{79.48,58.21},{67.86,72.89}},[3557]={{59.59,19.4}},[3525]={{55.85,59.81}},[3521]={{30.66,50.93},{67.17,49.32},{78.49,62.94},{41.85,26.22}},[2367]={{-1,-1}},[3518]={{56.73,34.51},{54.22,76.1}},[3519]={{48.76,45.05},{56.7,53.27}},[3703]={{28.29,49.36},{56.32,81.54}},[3520]={{30.24,27.74},{37.06,58.27},{56.32,59.84},{61.12,28.24},{66.25,87.13}},[3522]={{53.37,55.42},{35.8,63.88},{76.09,60.31},{60.98,68.11},{62.86,38.31}},[3523]={{43.36,36.14},{31.96,64.42}},[495]={{58.39,62.45},{30.86,41.45},{49.51,10.78},{60.48,15.86},{52.15,66.41},{79.73,30.84},{25.39,59.85}},[4080]={{51.18,33.88}},[3537]={{58.29,68.05},{41.92,54.48},{57.12,18.72},{76.26,37.18},{49.67,10.19},{78.39,49.28}},[394]={{59.56,26.3},{65.42,46.89},{31.97,60.28},{20.79,64.58}},[65]={{38.19,46.65},{76.87,63.13},{77.41,51.77},{28.89,56.09},{48.14,74.76},{59.8,54.24}},[3711]={{26.75,59.27}},[4395]={{39.52,71.43},{50.25,39.52},{40.53,55.57},{65.61,32.16},{50.41,41.46},{44.66,63.34},{67.38,35.35}},[66]={{40.83,66.26},{59.33,57.3}},[67]={{41.09,85.91},{28.71,74.38},{37.13,49.52},{30.89,37.36},{67.61,50.61},{48.86,65.04}},[210]={{43.99,22.18},{76.19,19.66},{76.1,23.96}}},[5]=12,[6]=nil}, - - --Elwynn Forest - - [900001]={[1]="Lost Page I",[4]={[12]={{50.29,42.06}}},[5]=12,[6]=nil}, - [900002]={[1]="Lost Page II",[4]={[12]={{49.60,39.60}}},[5]=12,[6]=nil}, - [900003]={[1]="Lost Page III",[4]={[12]={{49.50,40.80}}},[5]=12,[6]=nil}, - [900004]={[1]="Lost Page IV",[4]={[12]={{49.60,39.70}}},[5]=12,[6]=nil}, - [999005]={[1]="Abbess’ Journal Purified",[2]=nil,[3]=nil,[4]={[12]={{51.5,27.5}}},[5]=12,[6]=nil}, - [999006]={[1]="Abbess’s Staff Purified",[2]=nil,[3]=nil,[4]={[12]={{55.9,30.2}}},[5]=12,[6]=nil}, - [999007]={[1]="Heretical Idol Purified",[2]=nil,[3]=nil,[4]={[12]={{52.3,29.4}}},[5]=12,[6]=nil}, - [999008]={[1]="Jeweled Relic Purified",[2]=nil,[3]=nil,[4]={[12]={{53.4,31.1}}},[5]=12,[6]=nil}, - [999010]={[1]="Hidden Path",[2]=nil,[3]=nil,[4]={[12]={{55.3,37.9}}},[5]=12,[6]=nil}, - [999011]={[1]="Ruined Estate",[2]=nil,[3]=nil,[4]={[12]={{58.7,33.3}}},[5]=12,[6]=nil}, - [999012]={[1]="Wayward Theologian",[2]=nil,[3]=nil,[4]={[12]={{60.5,28.7}}},[5]=12,[6]=nil}, - [999013]={[1]="Melon",[2]=nil,[3]=nil,[4]={[12]={{41.54,67.68},{41.58,67.31},{41.59,67.55},{41.48,67.36},{41.36,67.49},{41.29,67.57},{41.29,67.42},{41.40,67.28},{41.31,67.25},{41.11,67.52}}},[5]=12,[6]=0}, - [999014]={[1]="Pumpkin",[2]=nil,[3]=nil,[4]={[12]={{42.05,67.64},{42.22,67.53},{42.25,67.66}}},[5]=12,[6]=0}, - [999015]={[1]="apple",[2]=nil,[3]=nil,[4]={[12]={{45.07,64.83},{45.09,64.96},{45.03,64.98},{45.04,65.22},{45.11,65.17},{45.21,65.02},{45.19,64.93},{45.26,64.91},{45.46,64.92},{45.51,65.02},{45.55,64.92},{45.57,65.08},{45.51,65.14},{45.55,65.19},{45.39,65.20},{45.36,65.18},{45.32,65.13}}},[5]=12,[6]=0}, - [96000]={[1]="Maclure Supplies",[2]=nil,[3]=nil,[4]={[12]={{48.0,86.9},{48.0,86.9}}},[5]=12,[6]=0}, - [2300579]={[1]="Kobold Warren",[2]=nil,[3]=nil,[4]={[12]={{40.4,73.2},{38.2,76.6},{39.3,77.1},{45.6,77.0},{44.6,77.4},{44.7,78.8},{43.3,79.2},{42.3,73.4},{42.3,78.0},{40.5,78.2},{42.3,78.8},{40.5,80.3},{41.2,74.4},{43.5,76.7},{39.5,76.0},{38.4,73.8},{41.0,76.7},{42.4,76.0}}},[5]=12,[6]=0}, - [9000057]={[1]="Mirror Shard",[2]=nil,[3]=nil,[4]={[12]={{30.92,58.76},{30.80,58.09},{31.08,57.76},{31.05,57.52},{31.45,58.88},{31.22,58.97},{31.87,59.18},{30.35,59.43},{29.78,59.24},{30.44,58.11},{30.06,57.97},{31.20,57.50}}},[5]=12,[6]=nil}, - [9017008]={[1]="Mirror Lake Harvest",[2]=nil,[3]=nil,[4]={[12]={{30.15,66.70},{30.24,66.40},{30.37,66.87},{30.52,66.35},{30.59,67.24},{30.71,66.86},{30.80,66.50},{31.02,66.95},{31.19,66.74},{31.24,66.35},{31.49,66.67}}},[5]=12,[6]=nil}, - [9900730]={[1]="Stolen Supply Crate",[2]=nil,[3]=nil,[4]={[12]={{56.75,80.60},{56.90,79.96},{56.88,81.37},{57.11,81.04},{57.55,79.73},{57.78,80.52},{57.39,80.87},{56.90,79.94},{57.02,79.06},{56.98,78.56}}},[5]=12,[6]=nil}, - [99017005]={[1]="Smudged Note",[2]={17005},[3]=nil,[4]={[12]={{64.57,41.80}}},[5]=12,[6]=nil}, - [4673875] = {"Explore Stormwind to your heart's content, then visit Flightmaster Dungar Longdrink to fly to Westfall to continue your adventure",nil,nil,{[1519]={{71.00,72.66}}},1519,0}, - - --Dun Morogh - - [2300507] = {[1]="Plating examined",[4]={[1239]={{37.8,58.23}}},[5]=1239}, - [2300508] = {[1]="Crate examined",[4]={[1239]={{36.66,56.12}}},[5]=1239}, - [2300509] = {[1]="Crystal shards examined",[4]={[1239]={{35.98,53.44}}},[5]=1239}, - [2300510] = {[1]="Banner examined",[4]={[1239]={{35.31,51.84}}},[5]=1239}, - [5401381] = {[1]="Hidden path tread",[4]={[1239]={{39.38,36.91}}},[5]=1239}, - [5883992] = {[1]="Ask Arathror to help you put on the disguise",[4]={[1239]={{40.99,33.93}}},[5]=1239}, - [5888887] = {[1]="Radiant Devotees doused",[4]={[1239]={{50.89,19.79},{53.29,22.45},{54.28,21.74},{50.47,22.60},{50.08,23.43},{49.82,23.66},{49.45,19.25},{51.25,20.38},{50.74,18.11},{51.15,17.81},{51.78,20.05},{52.48,20.85},{53.84,19.47},{53.95,19.13},{53.19,18.76},{54.40,24.45},{54.00,24.39},{55.64,24.86},{56.32,27.38},{56.94,27.45},{57.22,25.45},{57.42,25.12},{53.40,21.65},{53.08,24.47},{52.38,23.56},{52.15,24.75},{55.46,19.19},{56.89,19.36}}},[5]=1239}, - [2300550] = {"Thunderbrew Hop",nil,nil,{[1]={{47.80,56.07},{47.87,55.58},{48.05,55.99},{47.91,56.32},{47.86,56.57},{48.15,56.66},{48.37,56.65}}},1,0}, - [5855933] = {[1]="Listen to Gravedigger Nonuid",[4]={[1]={{48.87,52.65}}},[5]=1}, - [244620] = {"Dun Morogh Tree",nil,nil,{[1]={{62.93,57.82},{46.76,52.29},{58.25,53.55},{58.38,54.34},{59.23,54.10},{58.42,57.43},{59.80,58.73},{60.68,58.27},{60.81,56.51},{60.33,55.39},{62.01,55.44},{63.67,55.44},{64.25,55.74},{64.09,54.75},{64.69,55.49},{62.81,57.06},{63.51,57.04},{64.34,59.66},{63.94,60.69},{63.14,60.37},{63.40,61.16},{62.21,60.30},{61.76,60.21},{61.58,59.79},{61.14,60.81},{60.77,61.21},{60.54,61.47}}},1,0}, - - --Teldrassil - - [2300512] = {[1]="Cut of Good Meat",[4]={[2031]={{47.9,38.62},{47.83,38.14},{51.23,56.05},{52.08,59.8},{52.87,64.32}}},[5]=2031}, - [2300513] = {[1]="Sanctified flesh offered",[4]={[1243]={{72.55,20.55}}},[5]=1243}, - [2300526] = {[1]="Newborns saved",[4]={[1243]={{71.96,21.98}}},[5]=1243}, - [5943833] = {[1]="Butterflies delivered",[4]={[1243]={{65.9,35.18}}},[5]=1243}, - [5166357] = {[1]="Carrion Path traversed",[4]={[1243]={{61.66,36.17}}},[5]=1243}, - [5911478] = {[1]="Communion completed",[4]={[1243]={{71.95,21.56}}},[5]=1243}, - [5005829] = {[1]="Flesh sanctified at the Moonwell",[4]={[1243]={{65.35,20.54}}},[5]=1243}, - [5861249] = {[1]="Speak with Lady Aegya",[4]={[1243]={{69.64,24.5}}},[5]=1243}, - [5405229] = {[1]="Speak with Thariel Wingstroke",[4]={[1243]={{51.44,67.98}}},[5]=1243}, - [5388202] = {[1]="Vulture Egg destroyed",[4]={[141]={{59.44,49.3},{57.91,50.7}}},[5]=141}, - [5399902] = {[1]="Listen to Aleena Whisperbough",[4]={[141]={{59.35,58.93}}},[5]=141}, - - --Durotar - - [1064805] = {"Elemental Fire",nil,nil,{[1244]={{35.31,24.22}}},1244,0}, - [2392807] = {"Elemental Earth",nil,nil,{[1244]={{35.71,23.16}}},1244,0}, - [3478505] = {"Elemental Air",nil,nil,{[1244]={{36.38,23.63}}},1244,0}, - [4541078] = {"Elemental Water",nil,nil,{[1244]={{36.11,24.92}}},1244,0}, - [254001] = {"Strange Flower",nil,nil,{[1244]={{35.64,35.81}}},1244,0}, - [6649507] = {"Report delivered to Esgramor",nil,nil,{[1244]={{44.77,67.11}}},1244,0}, - [9070546] = {"Speak with Karagar in Razor Hill.",nil,nil,{[1244]={{44.80,67.09}}},1244,0}, - [2036820] = {"Magical barrier crossed",nil,nil,{[2030]={{16.15,59.24}}},2030,0}, - [254004] = {"Crude Centaur Drawing",{254011},{254010},{[14]={{46.55,78.75}}},14,0}, - [254003] = {[1]="Metallic Debris",[4]={[14]={{53.04,63.63},{52.79,65.08},{53.69,64.74},{54.05,62.31},{53.29,59.17},{53.96,57.62},{52.66,55.41},{52.81,53.54},{52.9,51.52}}},[5]=14}, - [2300551] = {[1]="Elven Relic of Old",[4]={[14]={{58.26,39.18},{57.57,39.15}}},[5]=14}, - [2300553] = {[1]="Elven Relic of Old",[4]={[14]={{57.54,37.43},{58.55,39.36}}},[5]=14}, - [2300554] = {[1]="Elven Relic of Old",[4]={[14]={{57.51,37.37},{58.81,38.5},{58.16,37.21}}},[5]=14}, - [2300555] = {[1]="Elven Relic of Old",[4]={[14]={{57.78,40.33},{59.04,39.44},{57.99,36.24}}},[5]=14}, - [2300556] = {[1]="Elven Relic of Old",[4]={[14]={{57.78,38.4},{57.84,35.53}}},[5]=14}, - [2300557] = {[1]="Elven Relic of Old",[4]={[14]={{57.83,38.81},{58.14,35.53}}},[5]=14}, - [2300558] = {[1]="Elven Relic of Old",[4]={[14]={{58.06,38.53},{59.65,39.47},{58.81,38.16}}},[5]=14}, - [5954015] = {[1]="Listen to Bagamul Skyfang",[4]={[14]={{51.77,44.36}}},[5]=14}, - [5954415] = {[1]="Full Dirgran's Pitcher",[4]={[14]={{52.10,41.80}}},[5]=14}, - [254002] = {[1]="Ouru'Gai Crystal",[4]={[17]={{56.79,20.1}}},[5]=1413}, - [5777365] = {[1]="Reversion process observed",[4]={[17]={{62.36,10.25}}},[5]=17}, - - --Tirisfal Glades - - [2300528] = {[1]="Gaudy Painting",[4]={[1240]={{15.83,47.58}}},[5]=1240}, - [2300529] = {[1]="Shimmering Jewel",[4]={[1240]={{19.83,48.08}}},[5]=1240}, - [2300530] = {[1]="Crystal Ball",[4]={[1240]={{17.67,47.52}}},[5]=1240}, - [2300531] = {[1]="Family Signet",[4]={[1240]={{18.62,45.61}}},[5]=1240}, - [2306601] = {[1]="Concoction Tested on Skeletons",[4]={[85]={{47.75,37.51},{42.39,33.63},{47.74,29.22},{47.88,34.06},{51.01,34.0},{43.32,32.55},{46.17,29.41},{46.6,31.97},{48.27,37.54},{44.88,35.97},{47.72,30.75},{48.21,30.36},{47.11,32.3},{50.45,31.51},{42.83,34.22},{47.33,30.18},{49.16,27.88},{43.59,28.6},{42.68,35.15},{43.87,30.53},{43.93,34.96},{45.63,30.43},{46.99,42.0},{45.27,42.87},{45.39,41.47},{47.44,38.28},{46.75,37.54},{44.39,38.28},{45.36,39.61},{48.33,39.46},{47.41,40.68},{46.77,39.86},{45.42,40.52},{45.15,37.54},{44.42,37.6},{45.26,32.42},{46.19,31.68},{45.27,34.88},{44.59,40.5},{48.91,42.83},{50.22,42.99},{49.88,36.82},{48.3,41.65},{47.58,42.83},{49.59,36.02},{49.22,33.88},{48.73,34.09},{49.02,34.13},{47.67,31.24},{49.02,35.26},{49.21,33.54},{46.87,33.38},{46.91,34.88},{49.24,36.25},{47.48,36.08},{42.69,32.27},{49.82,36.21}}},[5]=85}, - [2306602] = {[1]="Concoction Tested on Zombies",[4]={[85]={{51.31,28.1},{54.72,31.34},{53.41,30.39},{52.1,32.85},{49.76,30.26},{53.26,31.03},{49.73,28.59},{54.36,29.2},{52.67,26.02},{51.58,33.43},{50.58,29.08},{48.6,31.98},{52.53,26.32},{52.4,26.48},{51.28,31.46},{52.64,26.31},{52.55,26.88},{52.02,30.57},{52.24,26.36},{51.97,26.8},{52.63,27.0},{51.78,27.0},{51.9,25.84}}},[5]=85}, - [2306603] = {[1]="Concoction Tested on Banshees",[4]={[85]={{52.68,29.32},{55.16,29.96},{52.87,27.04},{54.74,29.53},{53.96,29.82},{51.87,31.48},{53.52,28.0},{52.01,26.7},{52.04,26.35},{50.98,30.53},{51.42,29.26},{52.23,27.45},{51.87,28.76},{52.61,25.83},{51.97,26.02},{52.03,25.63}}},[5]=85}, - [2306604] = {[1]="Unusal Subject Tested",[4]={[85]={{51.40,35.30}}},[5]=85}, - [5093560] = {[1]="Listen to Dark Priestess Ashara",[4]={[85]={{59.76,54.57}}},[5]=85}, - [192380] = {[1]="Gravestone",[4]={[85]={{70.1,63.1},{70,63.3},{70,63.4},{70,63.6},{69.9,63.5},{69.8,63.7},{69.9,63.8},{70,63.8},{70,63.9},{70.1,63.9},{70.2,64},{70.2,63.8},{70.1,63.7},{70.2,63.6},{70.3,63.6},{70.3,63.4},{70.4,63.3}}},[5]=85}, - [2300545] = {"Necrotic Spore",nil,nil,{[85]={{57.50,55.75},{57.70,55.74},{57.57,55.50},{57.40,55.30},{57.60,55.12},{57.81,55.01},{57.05,55.80},{57.03,55.51},{56.75,55.14},{56.72,54.76},{56.65,54.32},{57.68,54.42},{57.65,54.03},{57.12,53.67}}},85,0}, - [254678] = {[1]="Invincible's Gravestone Polished",[4]={[85]={{78.64,59.52}}},[5]=85}, - [254679] = {[1]="Scarlet Supplies Infected",[4]={[85]={{85.79,34.76},{86.42,34.59},{82.27,33.25},{81.36,31.72},{83.85,30.91}}},[5]=85}, - - --Mulgore - - [5976414] = {[1]="Hard Basin discovered",[4]={[1245]={{66.53,84.56}}},[5]=1245}, - [2300532] = {[1]="Offering Bone",[4]={[1245]={{61.38,76.42},{58.01,80.26},{62.04,83.4}}},[5]=1245}, - [2300514] = {[1]="Grimtotem Armor Piece",[4]={[1245]={{72.63,81.8},{73.04,81.7},{73.78,81.66},{73.69,81.08},{73.31,81.12},{73.21,80.82},{72.88,80},{73.12,79.38},{73.35,79.77},{74.33,81.02},{74.57,80.03},{74.03,79.58},{73.57,78.94},{73.56,78.25}}},[5]=1245}, - [2300515] = {[1]="Exalted Pendant",[4]={[1245]={{75.66,75.24}}},[5]=1245}, - [2300527] = {"Aquiline Totem",nil,nil,{[1245]={{82.03,81.96}}},1245,0}, - [2300533] = {"Owlish Totem",nil,nil,{[1245]={{77.22,84.87}}},1245,0}, - [2300534] = {"Taurine Totem",nil,nil,{[1245]={{81.84,77.56}}},1245,0}, - [5299566] = {[1]="Listen to Ammus Grey-Eye",[4]={[1245]={{14.39,28.95}}},[5]=1245}, - [1942447] = {"Ask Nauchol to dress you in the disguise",nil,nil,{[1245]={{72.39,88.46}}},1245,0}, - [5195713] = {[1]="Parachute Used",[4]={[1245]={{14.63,29.54}}},[5]=1245}, - [5195711] = {[1]="Full Sanctuary Amphora",[4]={[1245]={{14.30,35.30}}},[5]=1245}, - [2300552] = {[1]="Prairie Sap",[4]={[215]={{39.84,61.47},{39.42,60.23},{38.88,59.72},{38.78,59.32},{38.57,59.96},{37.27,59.58},{38.06,60.83},{37.65,61.39},{38.21,62.16},{38.59,62.23},{39.21,62.32},{38.95,63.63},{38.5,63.88},{38.62,64.23}}},[5]=215}, - - - -} - --- Backward compatibility (if any code still references AscensionObjectDB.objectData/objectDat) -AscensionObjectDB = AscensionObjectDB or {} -AscensionObjectDB.objectData = AscensionDB.objectData diff --git a/Database/Ascension/Bronzebeard/AscensionQuestDB.lua b/Database/Ascension/Bronzebeard/AscensionQuestDB.lua deleted file mode 100644 index 41da41c..0000000 --- a/Database/Ascension/Bronzebeard/AscensionQuestDB.lua +++ /dev/null @@ -1,154 +0,0 @@ ----@type table -local AscensionDB = QuestieLoader:CreateModule("AscensionDB") - -AscensionDB.questData = AscensionDB.questData or { - - --Path of Ascension Quests - - [1903520]={[1]="Path to Ascension: Rank Up Your Spells",[2]={{75118}},[3]={{75118}},[4]=7,[5]=8,[6]=0,[8]={"Talk to the Beginner's Book of Ascension: 0/1","Select Train Me and rank up your spells: 0/1"},[10]={nil,{{9905201,"Talk to the Beginner's Book of Ascension: 0/1"},{9905202,"Select Train Me and rank up your spells: 0/1"}}},[17]=nil,[30]=60}, - [1903540]={[1]="Path to Ascension: Visit an Innkeeper",[2]={{75118}},[3]={{75118}},[4]=7,[5]=8,[6]=0,[8]={"Visit an Innkeeper and select Make this inn your home."},[10]={nil,{{9903540,'Visit an Innkeeper and select "Make this inn your home": 0/1'}}},[17]=nil,[30]=60}, - [580168]={[1]="Path to Ascension: Less Running, More Ressing",[2]={{75118}},[3]={{75118}},[4]=8,[5]=8,[6]=0,[8]={"Cast Resurrect in Closest Town or Capital City next time you die.","Resurrect in Closest Town or Capital: 0/1"},[10]={nil,{{9908168,"Resurrect in Closest Town or Capital: 0/1"}}},[17]=nil,[30]=60}, - [4420430]={[1]="Path to Ascension: Novice Rider",[2]={{97921}},[3]={{97921}},[4]=6,[5]=8,[6]=0,[8]={"Learn how to ride and claim your first mount.","Learn Novice Riding from the Riding Trainer: 0/1"},[10]={nil,{{9942043,"Learn Novice Riding from the Riding Trainer: 0/1"}}},[17]=nil,[30]=60}, - [4420439] = {[1]="Path to Ascension: Novice Rider",[2]={{449169}},[4]=4,[5]=8,[6]=1101,[8]="Learn how to ride and claim your first mount.",[10]={nil,{{9942043,"Learn Novice Riding from the Riding Trainer: 0/1"}}},[17]=141,}, - [1903556]={[1]="Path to Ascension: Mount Up!",[2]={{97921,449169,7954}},[3]={{97921,449169,7954}},[4]=6,[5]=8,[6]=0,[8]={"Learn how to mount up!","Pets Tab (Shift+P), Mounts Tab, Summon Mount: 0/1"},[10]={nil,{{9903556,"Pets Tab (Shift+P), Mounts Tab, Summon Mount: 0/1"}}},[13]={4420430,4420432},[17]=nil,[30]=60}, - [1903553]={[1]="Path to Ascension: Dungeon Finder",[2]={{75118}},[3]={{75118}},[4]=15,[5]=15,[6]=0,[8]={"Open the Dungeon Finder and queue for a dungeon!","Open the Dungeon Finder (I) / Green Eye: 0/1","Select dungeon(s) then click Find Group: 0/1"},[10]={nil,{{9903553,"Open the Dungeon Finder (I) / Green Eye: 0/1"},{9903554,"Select dungeon(s) then click Find Group: 0/1"}}},[17]=12}, - [4420435]={[1]="Path to Ascension: Novice Rider",[2]={{3690}},[4]=7,[5]=9,[6]=690,[7]=0,[8]={"Learn how to ride and claim your first mount."},[10]={nil,{{9942043,"Learn Novice Riding from the Riding Trainer: 0/1"}}},[17]=215}, - [1903557]={[1]="Path to Ascension: Mount Up!",[2]={{3690,7953,4773}},[3]={{3690,7953,4773}},[4]=7,[5]=9,[6]=0,[7]=0,[8]={"Learn how to mount up!"},[10]={nil,{{9903556,"Pets Tab (Shift+P), Mounts Tab, Summon Mount: 0/1"}}},[13]={4420434,4420435,4420437},[17]=nil}, - [4420437]={[1]="Path to Ascension: Novice Rider",[2]={{7953}},[4]=6,[5]=8,[6]=690,[7]=0,[8]={"Learn how to ride and claim your first mount."},[10]={nil,{{9942043,"Learn Novice Riding from the Riding Trainer: 0/1"}}},[17]=14}, - [4420432] = {[1]="Path to Ascension: Novice Rider",[2]={{7954}},[3]={{7954}},[4]=5,[5]=9,[6]=1101,[8]="Learn how to ride and claim your first mount.",[10]={nil,{{9942043,"Learn Novice Riding from the Riding Trainer: 0/1"}}},[17]=1}, - [4420434]={[1]="Path to Ascension: Novice Rider",[2]={{4773}},[3]={{4773}},[4]=6,[5]=8,[6]=690,[7]=0,[8]={"Learn how to ride and claim your first mount."},[10]={nil,{{9942043,"Learn Novice Riding from the Riding Trainer: 0/1"}}},[17]=85}, - [100466]={[1]="Path to Ascension: Westfall",[2]={{466}},[4]=10,[5]=12,[6]=0,[7]=0,[8]={"Explore Stormwind to your heart's content, then visit Flightmaster Dungar Longdrink to fly to Westfall to continue your adventure."},[10]={nil,{{4673875}}},[17]=1519}, - - --Elwynn Forest - - [17000]={[1]="Stolen Supplies",[2]={{250}},[3]={{250}},[4]=5,[5]=9,[6]=1101,[7]=nil,[8]={"Return the Stolen Supplies to Pa Maclure."},[9]=nil,[10]={nil,{{96000,"Retrieve the Stolen Supplies"}}},[11]=nil,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=12,[18]=nil,[19]=nil,[20]=nil,[21]=nil,[22]=nil,[23]=nil,[24]=nil,[25]=nil,[26]={{72,25}}}, - [100073]={[1]="Supply Run",[2]={{241}},[3]={{241}},[4]=6,[5]=8,[6]=1101,[7]=nil,[8]={"","Recover 4 Stolen Supply Crates from the Bandit Bastion, east of Goldshire.","","- Stolen Goods x 4"},[9]=nil,[10]={nil,{{9900730,"Stolen Supply Crate"}}},[11]=nil,[12]=nil,[13]={47},[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [17001]={[1]="Extravagant Order",[2]={{241}},[3]={{241}},[4]=6,[5]=8,[6]=1101,[7]=nil,[8]={"","Return 4 Gem Encrusted Spider Silk to Tharynn Bouden.","","- Gem Encrusted Spider Silk x 4"},[9]=nil,[10]={nil,nil,{{157001,"Gem Encrusted Spider Silk"}}},[11]=nil,[12]=nil,[13]={47},[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [17002]={[1]="The Master's Orders",[2]={{9000017}},[3]={{9000017}},[4]=8,[5]=10,[6]=1101,[7]=nil,[8]={"","Recover 10 Depleted Mana Gems and return to the Tower of Azora.","","- Depleted Mana Gem x 10"},[9]=nil,[10]={nil,nil,{{157002,"Depleted Mana Gem"}}},[11]=nil,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=12,[18]=nil,[19]=nil,[20]=nil,[21]=nil,[22]=nil,[23]=nil,[24]=nil,[25]=nil,[26]=nil,[27]=nil,[28]=nil,[29]=nil,[30]=nil}, - [17003]={[1]="Slimy Solution",[2]={{9000017}},[3]={{9000017}},[4]=8,[5]=10,[6]=1101,[7]=0,[8]={"Retrieve 10 Slimy Murloc Spittle Samples and return to the Tower of Azora."},[9]=nil,[10]={[5]={{{46,732},46,"Slimy Murloc Spittle Collected"}}},[11]=157006,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [17004]={[1]="Disarming the Gnolls",[2]={{261}},[3]={{261}},[4]=8,[5]=10,[6]=1101,[7]=0,[8]={"","Retrieve 6 Gnoll Blades and 10 Gnoll Axes and return to Guard Thomas at the east Elwynn bridge.","","- Gnoll Sword x 6","- Gnoll Axe x 10"},[9]=nil,[10]={nil,nil,{{157007,"Gnoll Sword"},{157008,"Gnoll Axe"}}},[11]=nil,[12]=nil,[13]={35},[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [17005]={[1]="Last Memento",[2]={nil,{99017005},nil},[3]={{11916}},[4]=8,[5]=10,[6]=1101,[7]=0,[8]={"","Return the Smudged Note to Imelda in Stormwind."},[11]=157012,[17]=12}, - [17008]={[1]="Reclaim the Harvest",[2]={{955}},[3]={{955}},[4]=8,[5]=10,[6]=1101,[7]=nil,[8]={"","Retrieve 8 Mirror Lake Apples and return them to Sergeant De Vries in Westbrook Garrison.","","- Mirror Lake Apple x 8"},[9]=nil,[10]={nil,nil,{{157014,"Mirror Lake Apple"}}},[11]=nil,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=12,[18]=nil,[19]=nil,[20]=nil,[21]=nil,[22]=nil,[23]=nil,[24]=nil,[25]=nil,[26]=nil,[27]=nil,[28]=nil,[29]=nil,[30]=nil,[31]={{nil,4,"Mirror Lake Harvest",1,{{"object",9017008}}}},[32]=nil}, - [1660056]={[1]="Agria's Medicine",[2]={{162815}},[3]={{162802}},[4]=5,[5]=8,[6]=1101,[7]=nil,[8]={"Buy the potion's ingredients at the Goldshire market: Elgris Blossom Petals, Dun Kazad Liquor Concentrate, Pumpkin Juice, and a Murloc Eyeball."},[9]=nil,[10]={[3]={{558956,"Collect Elgris Blossom Petals"},{558957,"Collect Dun Kazad Liquor Concentrate"},{558958,"Collect Pumpkin Juice"},{558959,"Collect Murloc Eyeball"}}},[11]=558960,[12]=nil,[13]={1660055},[14]=nil,[15]=nil,[16]=nil,[17]=12,[18]=nil,[19]=nil,[20]=nil,[21]={558956,558957,558958,558959},[22]=nil,[23]=nil,[24]=nil,[25]=nil,[26]={{72,250}}}, - [1660057]={[1]="Seven Years of Bad Luck",[2]={{162802}},[3]={{162802}},[4]=8,[5]=10,[6]=1101,[7]=nil,[8]={"Inspect the broken mirror shards that Aldia Crayon blames for the curse afflicting Lady Agria Spada."},[9]=nil,[10]={nil,{{9000057,"Mirror Shard Inspected"}}},[11]=nil,[12]=nil,[13]={1660056},[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [1660058]={[1]="Worm-Eaten Apple",[2]={{162805}},[3]={{162805}},[4]=5,[5]=8,[6]=1101,[7]=nil,[8]={"Find and destroy the kobold warrens around Goldshire."},[9]=nil,[10]={nil,{{2300579,"Destroy Kobold Warrens"}}},[11]=nil,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=12,[18]=nil,[19]=nil,[20]=nil,[21]=nil,[22]=nil,[23]=nil,[24]=nil,[25]=nil,[26]={{72,250}}}, - [1660059]={[1]="Goldshire's Generosity",[2]={{162807}},[3]={{162801}},[4]=6,[5]=8,[6]=1101,[8]={"","Gather Melons, Pumpkins, and Apples from the farms around Goldshire. Then deliver them to Eldor Hammer, leader of the refugees.","","- Pumpkin x 3","- Melon x 3","- Apple x 10"},[10]={nil,nil,{{558961},{558962},{558963}}},[13]={1660055},[17]=12,[23]=0,[24]=0}, - [1660000]={[1]="Bookworm",[2]={{161700}},[3]={{161701}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Speak with Seminarian Moroi, brother of Bianca Spada."},[9]=nil,[10]=nil,[11]=nil,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [1660001]={[1]="Knowledge Corrupts",[2]={{161701}},[3]={{161701}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Recover the missing pages from Moroi’s unclassified manuscript, scattered throughout the abbey."},[9]=nil,[10]={nil,nil,{{559130},{559131},{559132},{559133}}},[11]=nil,[12]=nil,[13]={1660000},[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [1660002]={[1]="The Ruins of Northshire",[2]={{161701}},[3]={{161702}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Locate the cellar entrance to the Secret Inquisitorial Dungeon."},[9]={"Secret Inquisitorial Dungeon entrance found: 0/1",{[12]={{52.30,36.30}}}},[10]=nil,[11]=nil,[12]={1660001},[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [1660003]={[1]="Accursed Sisterhood",[2]={{161702}},[3]={{161702}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Purify the belongings of the former abbess, scattered throughout the Secret Inquisitorial Dungeon."},[9]=nil,[10]={nil,{{999005,"Abbess’ Journal purified"},{999006,"Abbess’s Staff purified"},{999007,"Heretical Idol purified"},{999008,"Jeweled Relic purified"}}},[11]=nil,[12]=nil,[13]={1660002},[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [1660004]={[1]="Words That Shepherd Madness",[2]={{161702}},[3]={{161701}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Find the hidden path leading to the top of the waterfall and confront the sins of the former abbess of Northshire."},[9]=nil,[10]={[2]={{999010,"Hidden Path found"},{999011,"Ruined Estate discovered"},{999012,"Wayward Theologian confronted"}}},[11]=nil,[12]=nil,[13]={1660003},[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [1660036]={[1]="Oracular Idol",[2]={nil,nil,{559159}},[3]={{161844}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Collect three Prophet's Oracular Orbs from the murloc oracles roaming the Shadewell Spring."},[9]=nil,[10]={nil,nil,{{559159,"Prophet's Oracular Orb"}}},[11]=559159,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [100074]={[1]="A Betrayal Within",[2]={nil,{5055565}},[3]={{240}},[4]=4,[5]=8,[6]=1101,[7]=nil,[8]={"","Return to Marshal Dughan."},[9]=nil,[10]=nil,[11]=nil,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [1660055]={[1]="The Maid I Left Behind",[2]={{161700}},[3]={{162800}},[4]=6,[5]=8,[6]=1101,[7]=nil,[8]=nil,[9]=nil,[10]=nil,[11]=nil,[12]=nil,[13]={1660004},[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [1660038]={[1]="The Saddest Among Us",[2]={{161702}},[3]={{161702}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Defeat the Cursed Censor in the Secret Inquisitorial Dungeon."},[9]=nil,[10]={[1]={{161712,"Accursed Censor slain"}}},[11]=nil,[12]=nil,[13]={1660002},[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [1660005]={[1]="The Threat Swept Downstream",[2]={{161705}},[3]={{161705}},[4]=3,[5]=6,[6]=1101,[7]=nil,[8]={"Defeat the Defias lurking in the ruined tower and thin the ranks of the Shadewell murlocs atop the waterfall, across the rope bridge."},[9]=nil,[10]={[1]={{161736,"Defias Plunderer slain"},{161716,"Shadewell Murloc slain"}}},[11]=nil,[12]=nil,[13]={1660003},[14]=nil,[15]=nil,[16]=nil,[17]=9}, - [1660060]={[1]="Stay a While",[2]={{162806}},[3]={{162806}},[4]=6,[5]=8,[6]=1101,[7]=nil,[8]={"","Take a moment from the noise and haste and stay a while to listen to Aliscar Lend.","","- Listen to Aliscar Lend x 1"},[9]=nil,[10]={[1]={{162943,"Listen to Aliscar Lend"}}},[11]=nil,[12]=nil,[13]=nil,[14]=nil,[15]=nil,[16]=nil,[17]=12}, - [100071]={[1]="Defias Disruption",[2]={{6778}},[3]={{6778}},[4]=6,[5]=8,[6]=1101,[7]=nil,[8]={"","Thin the ranks of the Defias at the Bandit Bastion, east of Goldshire.","","- Defias Bandit x 6","- Defias Rogue Wizard x 4"},[9]=nil,[10]={[1]={{116,"Defias Bandit slain"},{474,"Defias Rogue Wizard slain"}}},[11]=nil,[12]=nil,[13]={47},[14]=nil,[15]=nil,[16]=nil,[17]=12}, - - --Dun Morogh - - [254000] = {[1]="A Small Mistake",[2]={{254000}},[3]={{254000}},[4]=2,[5]=2,[6]=1101,[8]="Search the Frostmane Encampment for Clues.",[10]={nil,nil,{{254000}}},[17]=1239}, - [254001] = {[1]="We Found Her!",[2]={{254000}},[3]={{254000}},[4]=2,[5]=2,[6]=1101,[8]="Search for Nylrisa to the south-west of Brewnall Village.",[10]={nil,nil,{{254001}}},[13]={254000},[17]=1239}, - [254002] = {[1]="The Scout's Favor",[2]={{254000}},[3]={{254002}},[4]=1,[5]=2,[6]=1101,[8]="Slay 4 Rockjaw Raiders and meet with Mountaineer Tagnur on the other end of the tunnel.",[10]={{{1718}},nil,nil},[13]={57393},[17]=1239}, - [254003] = {[1]="Old Mirsinth",[2]={{254002}},[3]={{254003}},[4]=1,[5]=4,[6]=1101,[8]="Find the exiled Frostmane troll.",[13]={254002},[17]=1}, - [1660006] = {[1]="Smoke on the Wind",[2]={{161718}},[3]={{161719}},[4]=2,[5]=6,[6]=1101,[8]="Follow in the footsteps of Grelbin, son of Groldha, and investigate the source of the smoke.",[10]={{{2300507},{2300508},{2300509},{2300510}}},[17]=1239}, - [1660007] = {[1]="A Promising Path",[2]={{161719}},[3]={{161720}},[4]=2,[5]=6,[6]=1101,[8]="Follow the mountain path to uncover the location of the mysterious group.",[10]={nil,{{5401381}},nil},[13]={1660006},[17]=1239}, - [1660008] = {[1]="A Fitting Disguise",[2]={{161720}},[3]={{161720}},[4]=2,[5]=6,[6]=1101,[8]="Slay Radiant fanatics and collect their armor pieces. Deliver them to Arathror so he can craft a disguise.",[10]={nil,nil,{{559142}}},[13]={1660007},[17]=1239}, - [1660009] = {[1]="His Radiant Majesty",[2]={{161720}},[3]={{161718}},[4]=2,[5]=6,[6]=1101,[8]="Tell Arathror when you’re ready to don the disguise. Then infiltrate Radiance Town and slay the cult leader, His Radiant Majesty.",[10]={{{161775}},{{5883992}},nil},[13]={1660008},[17]=1239}, - [1660010] = {[1]="Deciphering Radiation",[2]={{161820}},[3]={{161820}},[4]=2,[5]=6,[6]=1101,[8]="Slay radioactive slimes in Radiance Town and use the Contamination Extractor on their corpses to harvest mutagen.",[10]={nil,nil,{{559162}}},[11]=559161,[17]=1239}, - [1660011] = {[1]="Soaking the Masses",[2]={{161839}},[3]={{161839}},[4]=2,[5]=6,[6]=1101,[8]="Use the Radiation Sprayer to douse Radiaville’s townsfolk with radiation.",[10]={nil,{{5888887}},nil},[11]=559163,[17]=1239}, - [1660039] = {[1]="Sever the Right Hand",[2]={{161720}},[3]={{161820}},[4]=2,[5]=6,[6]=1101,[8]="Defeat Right Hand of His Majesty in Radiance Town.",[10]={{{161835}},nil,nil},[13]={1660008},[17]=1239}, - [1660076] = {[1]="A Growing Business",[2]={{162882}},[3]={{162883}},[4]=4,[5]=8,[6]=1101,[8]="Speak with Eyma Thunderbrew at the Thunderbrew Distillery in Kharanos.",[17]=1239}, - [1660077] = {[1]="Thunderbrew's Hop",[2]={{162883}},[3]={{162883}},[4]=6,[5]=10,[6]=1101,[8]="Harvest seven Thunderbrew Hops from the Thunderbrew Distillery grounds in Kharanos.",[10]={nil,nil,{{558964}}},[13]={1660076},[17]=28}, - [1660080] = {[1]="Stay a While",[2]={{162901}},[3]={{162901}},[4]=6,[5]=10,[6]=1101,[8]="Take a moment from the noise and haste and stay a while to listen to Gravedigger Nonuid.",[10]={nil,{{5855933}},nil},[17]=1}, - [1660079] = {[1]="Live-Fire Demo",[2]={{162891}},[3]={{162891}},[4]=6,[5]=10,[6]=1101,[8]="Test Gornarn's Blunderbuss and ammo on the practice targets up on the ridge above Kharanos.",[10]={{{162917}},nil,nil},[11]=558950,[17]=1}, - [1660078] = {[1]="Bots on Strike",[2]={{162884}},[3]={{162884}},[4]=6,[5]=10,[6]=1101,[8]="Defeat Out-of-Control Automata clogging the Kharanos tunnel and recover Reusable Mechanical Parts from their remains.",[10]={{{162888},{162889},{162890}},nil,{{558965}}},[17]=1}, - [254004] = {[1]="A Brother's Betrayal",[2]={{254003}},[3]={{254003}},[4]=3,[5]=7,[6]=1101,[8]="Get Mirsinth the Exile’s totem from Jun’Kon at Frostmane Hold.",[10]={nil,nil,{{254002}}},[13]={254003},[17]=1}, - [254005] = {[1]="The True Story",[2]={{254003}},[3]={{254000}},[4]=6,[5]=10,[6]=1101,[8]="Find Efry Cogspark at the Stoutlager Inn in Thelsamar.",[13]={254004},[17]=1}, - [500005] = {[1]="Timber for the Coldhewn",[2]={{765556}},[3]={{765556}},[4]=6,[5]=10,[6]=1101,[8]="Chop down Dun Morogh trees near Coldhewn Camp and return with 12 Frostpine Logs.",[10]={nil,nil,{{662336}}},[17]=1}, - [500006] = {[1]="Icehide the Unbroken",[2]={{764536}},[3]={{764536}},[4]=7,[5]=11,[6]=1101,[8]="You’ve been asked to track and slay Icehide, the elite Frostsaber haunting Coldhewn Ridge above the camp.",[10]={{{76555}},nil,nil},[17]=1}, - - --Teldrassil - - [1660012] = {[1]="The Carrion Road",[2]={{161725}},[3]={{161726}},[4]=2,[5]=6,[6]=1101,[8]="Walk the Carrion Path and defeat its guardians.",[10]={{{161787}},{{5166357}}},[17]=1243}, - [1660013] = {[1]="The Sister Who Never Returned",[2]={{161726}},[3]={{161727}},[4]=2,[5]=6,[6]=1101,[8]="Speak with Lady Aegya, leader of the Vulture’s Cult, and ask what became of Thariel’s sister, Elydna.",[10]={nil,{{5861249}}},[13]={1660012},[17]=1243}, - [1660014] = {[1]="Finding the Good Meat",[2]={{161727}},[3]={{161727}},[4]=2,[5]=6,[6]=1101,[8]="Gather five cuts of good meat from the Moonlit Ossuary within the Vulture Cult Eyrie.",[10]={nil,nil,{{559143}}},[13]={1660013},[17]=1243}, - [1660015] = {[1]="Transsubstantiating the Flesh",[2]={{161727}},[3]={{161728}},[4]=2,[5]=6,[6]=1101,[8]="Carry the gathered flesh to the Moonwell and sanctify it in the waters.",[10]={nil,{{5005829}},{{559145}}},[11]=559144,[13]={1660014},[17]=1243}, - [1660016] = {[1]="Communion Banquet",[2]={{161728}},[3]={{161727}},[4]=2,[5]=6,[6]=1101,[8]="Place the sanctified flesh upon the bowl in the Great Vulture’s nest. Then, aid Elydna in completing her communion.",[10]={nil,{{2300513},{5911478}}},[13]={1660015},[17]=1243}, - [1660017] = {[1]="A Trail of Petals",[2]={{161848}},[3]={{161848}},[4]=2,[5]=6,[6]=1101,[8]="Channel Eldya’s power over the newborns in the Great Nest to transform them into butterflies. Then guide the butterflies back to Eldya.",[10]={nil,{{2300526},{5943833}}},[13]={1660016},[17]=1243}, - [1660040] = {[1]="Restless entrails",[2]={{161916}},[3]={{161916}},[4]=2,[5]=6,[6]=1101,[8]="Defeat the Rotting Flesh Spawn in the Lunar Ossuary.",[10]={{{161832}},nil,nil},[17]=1243}, - [1660071] = {[1]="A Dark Warning",[2]={{161725}},[3]={{3567}},[4]=4,[5]=8,[6]=1101,[8]="Speak with Tallonkai Swiftroot in Dolanaar.",[13]={1660085},[17]=141}, - [1660072] = {[1]="The Aid of Theren-Dion",[2]={{3567}},[3]={{162880}},[4]=4,[5]=8,[6]=1101,[8]="Speak with the Sentinels at Theren-Dion Sanctuary and challenge them to duels to aid their training.",[10]={[5]={{{162856,162870,162871,162872,162873},"Theren-Dion Sentinel"}}},[13]={1660071},[17]=141}, - [1660073] = {[1]="No Place for Scavengers",[2]={{162880}},[3]={{162880}},[4]=4,[5]=8,[6]=1101,[8]="Destroy Vulture Eggs around the Theren-Dion Sanctuary near Dolanaar.",[10]={{{162925}},{{5388202}}},[13]={1660072},[17]=141}, - [1660074] = {[1]="Termites in Teldrassil",[2]={{162879}},[3]={{162879}},[4]=5,[5]=9,[6]=1101,[8]="Enter the bark of Teldrassil near Dolanaar and defeat the termites infesting its depths.",[10]={{{162876},{162877}}},[13]={1660071},[17]=141}, - [1660075] = {[1]="Stay a While",[2]={{162881}},[3]={{162881}},[4]=4,[5]=8,[6]=1101,[8]="Take a moment from the noise and haste and stay a while to listen to Alenna Whisperbough.",[10]={nil,{{5399902}}},[17]=141}, - [1660085] = {[1]="Elydna's Heirloom",[2]={{161727}},[3]={{161725}},[4]=3,[5]=7,[6]=1101,[8]="Speak with Thariel Wingstroke and deliver to him the pendant of his sister, Elydna.",[10]={nil,{{5405229}}},[13]={1660016},[17]=141}, - - --Durotar - - [254008]={[1]="To Find a Cure",[2]={{254011}},[3]={{254011}},[4]=1,[5]=2,[6]=690,[7]=0,[8]={"Find the strange flower."},[10]={nil,nil,{{254005}}},[17]=1244}, - [254009]={[1]="A Dangerous Sample",[2]={{254011}},[3]={{254011}},[4]=1,[5]=2,[6]=690,[7]=0,[8]={"Collect demon blood from a strong demon."},[10]={nil,nil,{{254006}}},[13]={254008},[17]=1244}, - [254010]={[1]="Knowledge of the Centaurs",[2]={{254011}},[3]={{254004}},[4]=2,[5]=4,[6]=690,[7]=0,[8]={"Search the centaur camp for clues to the flower's properties."},[11]=11584,[13]={254009},[17]=1244}, - [1660018]={[1]="Those Who Fell",[2]={{161732}},[3]={{161733}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Use the Unremarkable Stone to extract samples of spiritual unrest from the restless orcs and trolls, and present your findings to the witch of Zeb'Goro."},[10]={nil,nil,{{559155}}},[11]=559158,[17]=1244}, - [1660019]={[1]="The Way is Shut",[2]={{161733}},[3]={{161734}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Use the amulet given to you by Swa'li to break through the magical barrier guarding the entrance to the Sinister Lair."},[10]={nil,{{2036820}},nil},[11]=559146,[13]={1660018},[17]=1244}, - [1660020]={[1]="The Sinister Triad",[2]={{161734}},[3]={{161734}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Gather the spiritual essences of the beasts haunting the Sinister Lair. You will need one from a spider, one from a bat, and one from a serpent."},[10]={nil,nil,{{559148},{559149},{559150}}},[13]={1660019},[17]=2030}, - [1660021]={[1]="So That He May Hear Again",[2]={{161734}},[3]={{161732}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Free the elementals next to the cave. Then, speak with Esgramor and tell him of Hirsutta's true intentions."},[10]={nil,{{6649507}},{{559172},{559173},{559174},{559175}}},[13]={1660020},[17]=2030}, - [1660022]={[1]="A Sinister Ritual",[2]={{161732}},[3]={{161732}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Confront Hirsutta the Witch and put an end to her dark ritual."},[10]={{{161790}},nil,nil},[13]={1660021},[17]=1244}, - [1660023]={[1]="Innocents for Sinners",[2]={{161732}},[3]={{161732}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Defeat the voodoo devotees guarding the path that leads to Hirsutta."},[10]={{{161807}},nil,nil},[13]={1660021},[17]=1244}, - [1660037]={[1]="Unease Makes Tongues Wag",[2]={{161733}},[3]={{161733}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Destroy the talking Tiki Masks around Zeb'Goro."},[10]={{{161854},{161855},{161856}},nil,nil},[11]=559146,[13]={1660018},[17]=1244}, - [1660041]={[1]="A Door Left Ajar",[2]={{161734}},[3]={{161734}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Defeat Techla'tu, Gatekeeper, in the Sinister Lair."},[10]={{{161833},{161793},{161792}},nil,nil},[13]={1660019},[17]=2030}, - [1660061]={[1]="Esgramor's Master",[2]={{161732}},[3]={{162839}},[4]=4,[5]=8,[6]=690,[7]=0,[8]={"Speak with Karagar in Razor Hill."},[10]={nil,{{9070546}},nil},[13]={1660022},[17]=1244}, - [254011]={[1]="Shinies!",[2]={{254004}},[4]=2,[5]=4,[6]=690,[7]=0,[8]={"Collect metallic debris."},[10]={nil,nil,{{254007}}},[13]={254010},[17]=14}, - [1660062] = {[1]="Echoes of Hirsutta",[2]={{162839}},[3]={{162839}},[4]=4,[5]=8,[6]=690,[8]="Defeat naga in Rivenruin Cave on the Durotar coast.",[10]={{{162834},{162835},{162916}}},[13]={1660061},[17]=14}, - [1660063] = {[1]="Auction the Past",[2]={{162840}},[3]={{162840}},[4]=4,[5]=8,[6]=690,[8]="Recover Elven Relics of Old from the ruins in Rivenruin Cave, Durotar.",[10]={nil,nil,{{558966}}},[17]=14}, - [1660065]={[1]="Stay a While",[2]={{162841}},[3]={{162841}},[4]=6,[5]=8,[6]=690,[7]=0,[8]={"Take a moment from the noise and haste and stay a while to listen to Bagamul Skyfang."},[10]={nil,{{5954015}}},[17]=14}, - [1660064] = {[1]="Durotar's Dire Drought",[2]={{162838}},[3]={{162838}},[4]=6,[5]=8,[6]=690,[8]="Fill the pitcher with water from one of the pools outside Razor Hill, then give the mine peons a drink.",[10]={{{162836,"Thirsty peons served"}},nil,{{558974,"Full Dirgran's Pitcher"}}},[11]=558973,[17]=14}, - [254012] = {[1]="The Queen's Decree",[2]={{254012}},[3]={{254012}},[4]=5,[5]=7,[6]=690,[8]="Slay harpies for Queen Erethina.",[10]={{{3115},{3116}}},[13]={254011},[17]=14}, - [254013] = {[1]="Avianna's Rose",[2]={{254012}},[3]={{254013}},[4]=6,[5]=10,[6]=690,[8]="Bring the information you learned to Sakari in Orgrimmar.",[13]={254012},[17]=14}, - [254014] = {[1]="The Last Piece",[2]={{254013}},[3]={{254014}},[4]=6,[5]=10,[6]=690,[8]="Find Ouru’gai Crystal in the Barrens.",[10]={nil,nil,{{254008}}},[13]={254014},[17]=1413}, - [254015] = {[1]="Reversion",[2]={{254014}},[3]={{254014}},[4]=6,[5]=10,[6]=690,[8]="Watch Sakari create the cure.",[10]={{{254016}},{{5777365}}},[13]={254014},[17]=1413}, - - --Tirisfal Glades - - [363] = {"Rude Awakening",{{1568}},{{1569}},1,1,16,nil,{"Speak with Shadow Priest Sarvis."},nil,{{{1512}},nil,nil},nil,nil,nil,nil,nil,nil,154,nil,nil,nil,nil,364,524296,nil,nil,{{68,75}}}, - [6395] = {[1]="Marla's Last Wish",[2]={{1661}},[3]={{1661}},[4]=3,[5]=5,[6]=690,[8]="Bring Samuel Fipps' Remains to Marla's Grave, then return to Novice Elreth.",[10]={{{1919}},{{178090,"Samuel's Remains Buried"}},{{16333}}},[13]={364},[17]=1240,[21]={16333},[27]={{nil,4,"Samuel's Remains Buried",0,{{"object",178090}}}}}, - [1660024]={[1]="Monsters With Noble Intentions",[2]={{161739}},[3]={{161740}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Speak with Riscell Cain at the Heritage League camp."},[17]=1240}, - [1660025] = {[1]="Restless Family Members",[2]={{161740}},[3]={{161740}},[4]=3,[5]=6,[6]=690,[8]="Purify the remains of Riscell’s deceased relatives in the Cain Family Crypt, and send their spirits back to the Afterlife.",[10]={{{161762},{161763},{161764},{161765}},nil,nil},[13]={1660024},[17]=1240}, - [1660026] = {[1]="An Unspeakable Secret",[2]={{161740}},[3]={{161741}},[4]=3,[5]=6,[6]=690,[8]="Retrieve the key fragments held by the manor’s majordomo, maid, and stablemaster.",[10]={nil,nil,{{559138},{559139},{559140}}},[13]={1660025},[17]=1240}, - [1660028] = {[1]="A Noble Heritage",[2]={{161747}},[3]={{161747}},[4]=3,[5]=6,[6]=690,[8]="Explore Cain Family Manor and recover whatever valuables remain. Then bring them to Thris.",[10]={nil,nil,{{559164},{559165},{559166},{559167}}},[13]={1660025},[17]=1240}, - [1660027] = {[1]="The True Heir of the Cains",[2]={{161741}},[4]=3,[5]=6,[6]=690,[8]="Use the key to access the basement and defeat the creature within.",[10]={{{161757}}},[13]={1660026},[17]=1240}, - [1660029] = {[1]="The Friends We Make Along the Way",[2]={{161742}},[3]={{161742}},[4]=3,[5]=6,[6]=690,[8]="Slay the creatures prowling Cain Manor: zombies, ghouls, and bears.",[10]={{{161743},{161752},{161749}},nil,nil},[13]={1660025},[17]=1240}, - [1660042] = {[1]="I'm Home",[2]={{161746}},[3]={{161746}},[4]=3,[5]=6,[6]=690,[8]="Defeat the Hound of House Cain behind the manor.",[10]={{{161836}},nil,nil},[13]={1660025},[17]=1240}, - [1660050] = {[1]="Apothecary Flemer",[2]={{161742}},[3]={{162843}},[4]=4,[5]=8,[6]=690,[8]="Speak with Apothecary Flemer in Brill.",[10]={nil,nil,nil},[13]={1660029},[17]=1240}, - [254064] = {[1]="The Nature of Freedom",[2]={{749136}},[3]={{749136}},[4]=4,[5]=8,[6]=690,[8]="Test Rod Toxicstrike's concoction on 3 zombies, 3 skeletons, 3 banshees, and Mallek the Tormented",[10]={{{1522},{1530},{1534},{254584}},{{2306601},{2306602},{2306603},{2306604}},nil},[11]=354655,[17]=85}, - [1660052] = {[1]="Spotless Standing",[2]={{162844}},[3]={{162844}},[4]=5,[5]=9,[6]=690,[8]="Find the Forsaken Rebels entrenched along the shores of Brightwater Lake and put them down.",[10]={{{162857},{162853},{162854}},nil,nil},[17]=85}, - [1660054] = {[1]="Stay a While",[2]={{162847}},[3]={{162847}},[4]=4,[5]=8,[6]=690,[8]="Take a moment from the noise and haste and stay a while to listen to Dark Priestess Ashara.",[10]={nil,{{5093560}},nil},[17]=85}, - [1660051] = {[1]="More Than the Sum of its Parts",[2]={{162843}},[3]={{162843}},[4]=4,[5]=8,[6]=690,[8]="Collect Necrotic Spores from the fungus in the abandoned tower overlooking Brill. They come in two forms: clinging to creatures and encapsulated in mucous globules on the ground.",[10]={nil,nil,{{558953},{558954}}},[13]={1660050},[17]=85}, - [1660053] = {[1]="Scarlet Correspondence",[2]={nil,nil,{{558955}}},[3]={{162844}},[4]=4,[5]=8,[8]="Find the Scarlet Crusade camp and put down their agents.",[10]={{{162859},{162860},{162861}},nil,nil},[17]=85}, - [254053] = {[1]="A Humble Duty",[2]={{991483}},[3]={{991483}},[4]=7,[5]=11,[6]=690,[8]="Polish 6 gravestones at Father Alastor's cemetary and Invincible's grave at Balnir Farmstead.",[10]={nil,{{192380},{254678}},nil},[17]=85}, - [254054] = {[1]="The Balnirs' Rest",[2]={{991483}},[3]={{991483}},[4]=8,[5]=12,[6]=690,[8]="Put the spirits of the Balnir family, Jorum Balnir, Vara Balnir, and Jarim Balnir to rest.",[10]={{{254936},{254937},{254938}},nil,nil},[17]=85}, - [254056] = {[1]="Brewing Disarray",[2]={{764555}},[3]={{764554}},[4]=8,[5]=12,[6]=690,[8]="Slay Lieutenant Sanders in Venomweb Vale and bring his head to Apothecary Ralden",[10]={nil,nil,{{354678}}},[17]=85}, - [254057] = {[1]="This Is Justice",[2]={{764554}},[3]={{764554}},[4]=8,[5]=12,[6]=690,[8]="Use Ralden's Transformation Elixir to infiltrate the Scarlet Monastery's courtyard and infect their supplies.",[10]={nil,{{254679}},nil},[11]=354654,[13]={254056},[17]=85}, - - --Mulgore - - [1660030] = {[1]="Death and Tribute",[2]={{161817}},[3]={{161818}},[4]=3,[5]=4,[6]=690,[8]="Slay seven Grimtotem Marauders in Red Cloud Mesa, take their manes as proof, and deliver them to Lady Redhorn’s mistress.",[10]={nil,nil,{{559156}}},[17]=1245}, - [1660031]={[1]="Death and Exile",[2]={{161818}},[3]={{161819}},[4]=3,[5]=6,[5]=0,[7]=0,[8]={"Follow the Grimtotem Mountain Path to Hard Basin and show Morriga Hollowhoof’s ring to Sage Nauchol."},[10]={nil,{{5976414}},nil},[11]=559157,[13]={1660030},[17]=1245}, - [1660032]={[1]="Death and Dishonor",[2]={{161819}},[3]={{161819}},[4]=3,[5]=5,[6]=690,[7]=0,[8]={"Gather pieces of armor and the identifying pendant of Three Totems warriors to complete your disguise."},[10]={nil,nil,{{559151},{559152}}},[11]=559151,[13]={1660031},[17]=1245}, - [1660033]={[1]="Death and Justice",[2]={{161819}},[3]={{161818}},[4]=3,[5]=5,[6]=690,[7]=0,[8]={"Speak with Nauchol when you are ready for the disguise, then infiltrate Three Totems and slay Malgorm Hollowhoof."},[10]={{{161816}},{{1942447}}},[13]={1660032},[17]=1245,[27]={{nil,4,"Ask Nauchol to dress you in the disguise",0,{{"object",1942447}}},{nil,1,"Malgorm Hollowhoof",0,{{"monster",161816}}}}}, - [1660034]={[1]="Death by Laughter",[2]={{161840}},[3]={{161840}},[4]=3,[5]=5,[6]=690,[7]=0,[8]={"Channel the Great Hyena’s blessing into the village totems and defeat the guardian spirits that protect them."},[10]={{{161850},{161851},{161852}},{{2300527},{2300533},{2300534}},nil},[13]={1660032},[17]=1245}, - [1660035]={[1]="To Whom I Devote",[2]={{161818}},[3]={{161840}},[4]=3,[5]=5,[6]=690,[7]=0,[8]={"Gather bones along the mountain path and offer them at the Great Hyena’s altar in Hard Basin."},[10]={nil,nil,{{559168}}},[11]=559168,[13]={1660030},[17]=1245}, - [1660043]={[1]="Fighting Over Carrion",[2]={{161840}},[3]={{161840}},[4]=3,[5]=5,[6]=690,[7]=0,[8]={"Defeat the Cruel Carrion Spirit in Hard Basin."},[10]={{{161834}},nil,nil},[13]={1660035},[17]=1245}, - [1660066]={[1]="Smoke on the Horizon",[2]={{162902}},[3]={{162903}},[4]=3,[5]=6,[6]=690,[7]=0,[8]={"Speak with Ammus Grey-Eye at the summit of the Iris Sanctuary."},[13]={1660033},[17]=1245}, - [1660067] = {[1]="Amphora of Sacred Water",[2]={{162903}},[3]={{162906}},[4]=4,[5]=8,[6]=690,[8]="Fill the amphora with the blessed water of the Iris Sanctuary, and bring it to Sage Muudren in Bloodhoof Village.",[10]={nil,{{5195713},{5195711}},{{558972}}},[11]=558971,[13]={1660066},[17]=1245}, - [1660070] = {[1]="Stay a While",[2]={{162903}},[3]={{162903}},[4]=4,[5]=8,[6]=690,[8]="Take a moment from the noise and haste and stay a while to listen to Ammus Grey-Eye.",[10]={nil,{{5299566}}},[13]={1660066},[17]=1245}, - [1660068]={[1]="Exile of Embers",[2]={{162906}},[3]={{162906}},[4]=6,[5]=8,[6]=690,[7]=0,[8]={"Channel the blessing to weaken the fire elementals prowling around Ardunno's hut and banish them back to their elemental plane."},[10]={{{162907}},nil,nil},[11]=558967,[13]={1660067},[17]=1412}, - [1660069] = {[1]="The Smoke that Remembers",[2]={{162908}},[3]={{162908}},[4]=4,[5]=8,[6]=690,[8]="Obtain incense for Ancestor Emnil's altar. You will need Prairie Sage and Kodo Tallow.",[10]={nil,nil,{{558968},{558969}}},[13]={1660067},[17]=1412}, - [500004] = {[1]="The Circle’s Rite",[2]={{991485}},[3]={{991485}},[4]=6,[5]=10,[6]=690,[8]="Collect 8 Ritual Totems and bring them to Maur Tharok Windhoof at Stonefather's Circle.",[10]={nil,nil,{{662335}}},[17]=1412}, - - -} - -AscensionQuestDB = AscensionQuestDB or {} -AscensionQuestDB.questData = AscensionDB.questData diff --git a/Database/Ascension/Zones/AscensionUiMapData.lua b/Database/Ascension/Zones/AscensionUiMapData.lua deleted file mode 100644 index 10d7eb1..0000000 --- a/Database/Ascension/Zones/AscensionUiMapData.lua +++ /dev/null @@ -1,326 +0,0 @@ ----@class AscensionUiMapData -AscensionUiMapData = AscensionUiMapData or {} - -AscensionUiMapData.uiMapData = { - -- Alliance Starting Zone - [2031] = { - [1] = 302.51, - [2] = 200.0, - [3] = 581.66, - [4] = 10745.9, - instance = 1, - mapID = 2031, - name = "Moonlit Ossuary", - mapType = 3, - parentMapID = 10207, - }, - [1230] = { - [1] = 230.01, - [2] = 153.34000000000015, - [3] = 1685.0, - [4] = 9881.67, - instance = 1, - mapID = 1230, - name = "Upper Ban'ethil Barrow Den", - mapType = 3, - parentMapID = 262, - }, - [1231] = { - [1] = 380.01, - [2] = 253.34000000000015, - [3] = 1735.0, - [4] = 9931.67, - instance = 1, - mapID = 1231, - name = "Lower Ban'ethil Barrow Den", - mapType = 3, - parentMapID = 10133, - }, - [1232] = { - [1] = 279.5999999999999, - [2] = 186.40000000000146, - [3] = 1249.8, - [4] = 10211.7, - instance = 1, - mapID = 1232, - name = "Fel Rock", - mapType = 3, - parentMapID = 258, - }, - [1243] = { - [1] = 1450.0040000000001, - [2] = 966.5999999999985, - [3] = 1491.67, - [4] = 11033.3, - instance = 1, - mapID = 1243, - name = "Shadowglen", - mapType = 3, - parentMapID = 10143, - }, - [1233] = { - [1] = 480.0, - [2] = 320.0, - [3] = 1140.0, - [4] = 11035.0, - instance = 1, - mapID = 1233, - name = "Shadowthread Cave", - mapType = 3, - parentMapID = 257, - }, - [1222] = { - [1] = 323.25, - [2] = 215.5, - [3] = -445.875, - [4] = -8985.0, - instance = 0, - mapID = 1222, - name = "Jasperlode mine", - mapType = 3, - parentMapID = 10126, - }, - [1220] = { - [1] = 240.0, - [2] = 160.0, - [3] = 281.75, - [4] = -9700.0, - instance = 0, - mapID = 1220, - name = "Upper Fargodeep Mine", - mapType = 3, - parentMapID = 10124, - }, - [1221] = { - [1] = 255.0, - [2] = 170.0, - [3] = 289.25, - [4] = -9710.0, - instance = 0, - mapID = 1221, - name = "Lower Fargodeep Mine", - mapType = 3, - parentMapID = 10125, - }, - [1238] = { - [1] = 968.75, - [2] = 645.8400000000001, - [3] = 187.5, - [4] = -8570.83, - ["mapType"] = 3, - ["parentMapID"] = 10138, - ["mapID"] = 1238, - ["instance"] = 0, - ["name"] = "Northshire Valley", - }, - [1226] = { - [1] = 279.0, - [2] = 186.0, - [3] = -27.0, - [4] = -8500.0, - ["mapType"] = 3, - ["parentMapID"] = 10130, - ["mapID"] = 1226, - ["instance"] = 0, - ["name"] = "Echo Ridge Mine", - }, - [2028] = { - [1] = 1300.008, - [2] = 866.67, - [3] = 266.658, - [4] = -7933.33, - mapType = 3, - parentMapID = 10196, - mapID = 2028, - instance = 0, - name = "Shadewell Spring", - }, - [1202] = { - [1] = 204.99, - [2] = 136.67, - [3] = -660.0, - [4] = 2948.83, - mapType = 3, - parentMapID = 796, - mapID = 1202, - instance = 0, - name = "Scarlet Monastery Entrance", - }, - - [2029] = { - [1] = 499.9961, - [2] = 333.33, - [3] = -66.6719, - [4] = -8500.0, - mapType = 3, - parentMapID = 10197, - mapID = 2029, - instance = 0, - name = "Secret Inquisitorial Dungeon", - }, - - [1239] = { - [1] = 1266.8, - [2] = 842.0, - [3] = 1200.0, - [4] = -5724.66, - mapType = 3, - parentMapID = 10139, - mapID = 1239, - instance = 0, - name = "Coldridge Valley", - }, - - [1215] = { - [1] = 330.0, - [2] = 220.0, - [3] = 245.0, - [4] = -6020.0, - instance = 0, - mapID = 1215, - name = "Coldridge Pass", - mapType = 3, - parentMapID = 10120, - }, - [1216] = { - [1] = 505.5, - [2] = 337.0, - [3] = 32.75, - [4] = -5313.0, - instance = 0, - mapID = 1216, - name = "The Grizzled Den", - mapType = 3, - parentMapID = 10121, - }, - [1214] = { - [1] = 374.01, - [2] = 249.34000000000015, - [3] = -1542.99, - [4] = -5486.83, - instance = 0, - mapID = 1214, - name = "Gol'bolar Quarry", - mapType = 3, - parentMapID = 10119, - }, - - -- Horde Starting Zone - [1219] = { - [1] = 270.0, - [2] = 180.0, - [3] = -4629.0, - [4] = 1580.5, - instance = 1, - mapID = 1219, - name = "Skull Rock", - mapType = 3, - parentMapID = 10123, - }, - [2030] = { - [1] = 550.29, - [2] = 366.6328125, - [3] = -4100.0, - [4] = 0.0078125, - instance = 1, - mapID = 2030, - name = "Sinister Lair", - mapType = 3, - parentMapID = 10205, - }, - [1217] = { - [1] = 266.0, - [2] = 177.33, - [3] = -4166.5, - [4] = 5.5, - instance = 1, - mapID = 1217, - name = "Burning Blade Coven", - mapType = 3, - parentMapID = 365, - }, - [1244] = { - [1] = 1350.0, - [2] = 900.0, - [3] = -3641.67, - [4] = 0.0, - instance = 1, - mapID = 1244, - name = "Valley of Trials", - mapType = 3, - parentMapID = 10144, - }, - [1240] = { - [1] = 1089.5900000000001, - [2] = 727.0799999999999, - [3] = 2147.92, - [4] = 2270.83, - instance = 0, - mapID = 1240, - name = "Deathknell", - mapType = 3, - parentMapID = 10140, - }, - [1213] = { - [1] = 220.0, - [2] = 146.66999999999985, - [3] = 2020.0, - [4] = 2123.33, - instance = 0, - mapID = 1213, - name = "Night Web's Hollow", - mapType = 3, - parentMapID = 10118, - }, - [1245] = { - [1] = 1799.8799999999999, - [2] = 1200.0400000000004, - [3] = 266.54, - [4] = -2566.74, - instance = 1, - mapID = 1245, - name = "Camp Narache", - mapType = 3, - parentMapID = 10146, - }, - [1225] = { - [1] = 741.0, - [2] = 494.0, - [3] = -818.0, - [4] = -1436.0, - instance = 1, - mapID = 1225, - name = "The Venture Co. Mine", - mapType = 3, - parentMapID = 10129, - }, - [1224] = { - [1] = 350.01, - [2] = 233.32999999999993, - [3] = 580.0, - [4] = -2263.33, - instance = 1, - mapID = 1224, - name = "Palemane Rock", - mapType = 3, - parentMapID = 10128, - }, -} - -local function ApplyUiMapData() - if not QuestieCompat then return end - if not AscensionUiMapData or not AscensionUiMapData.uiMapData then return end - - QuestieCompat.UiMapData = QuestieCompat.UiMapData or {} - - for uiMapId, data in pairs(AscensionUiMapData.uiMapData) do - if QuestieCompat.UiMapData[uiMapId] == nil then - QuestieCompat.UiMapData[uiMapId] = data - end - end -end - -if QuestieCompat and QuestieCompat.LoadUiMapData then - hooksecurefunc(QuestieCompat, "LoadUiMapData", ApplyUiMapData) -end - ApplyUiMapData() \ No newline at end of file diff --git a/Database/Ascension/Zones/AscensionZoneTables.lua b/Database/Ascension/Zones/AscensionZoneTables.lua deleted file mode 100644 index 58b3125..0000000 --- a/Database/Ascension/Zones/AscensionZoneTables.lua +++ /dev/null @@ -1,60 +0,0 @@ ----@class AscensionZoneTables -AscensionZoneTables = AscensionZoneTables or {} - -AscensionZoneTables.uiMapIdToAreaId = AscensionZoneTables.uiMapIdToAreaId or { - --Alliance - [1238] = 12, -- Northshire Valley -> Elwynn Forest - [2029] = 12, -- Secret Inquisitorial Dungeon -> Elwynn Forest - [2028] = 12, -- Shadewell Spring -> Elwynn Forest - [1226] = 12, -- Echo Ridge Mine -> Elwynn Forest - [1222] = 12, -- Jasperlode mine -> Elwynn Forest - [1239] = 1, -- Coldridge Valley -> Dun Morogh - [1215] = 1, -- Coldridge Pass -> Dun Morogh - [1216] = 1, -- The Grizzled Den -> Dun Morogh - [1214] = 1, -- Gol'bolar Quarry -> Dun Morogh - [1243] = 141, -- Shadowglen -> Teldrassil - [1233] = 141, -- Shadowthread Cave -> Teldrassil - [1232] = 141, -- Fel Rock -> Teldrassil - [2031] = 141, -- Moonlit Ossuary -> Teldrassil - [1230] = 141, -- Upper Ban'ethil Barrow Den -> Teldrassil - [1231] = 141, -- Lower Ban'ethil Barrow Den -> Teldrassil - --Horde - [1244] = 14, -- Valley of Trials -> Durotar - [1217] = 14, -- Burning Blade Coven -> Durotar - [2030] = 14, -- Sinister Lair -> Durotar - [1219] = 14, -- Skull Rock -> Durotar - [1240] = 85, -- Deathknell -> Tirisfal Glades - [1213] = 85, -- Night Web's Hollow -> Tirisfal Glades - [1245] = 215, -- Camp Narache -> Mulgore - [1225] = 215, -- The Venture Co. Mine -> Mulgore - [1224] = 215, -- Palemane Rock -> Mulgore - -} - --- Register zone sort names for custom zones so they can be used in quest zoneOrSort field -AscensionZoneTables.zoneSort = AscensionZoneTables.zoneSort or { - [1238] = "Northshire Valley", - [2029] = "Secret Inquisitorial Dungeon", - [2028] = "Shadewell Spring", - [1226] = "Echo Ridge Mine", - [1222] = "Jasperlode Mine", - [1239] = "Coldridge Valley", - [1215] = "Coldridge Pass", - [1243] = "Shadowglen", - [1233] = "Shadowthread Cave", - [1244] = "Valley of Trials", - [1217] = "Burning Blade Coven", - [2030] = "Sinister Lair", - [1240] = "Deathknell", - [1213] = "Night Web's Hollow", - [1245] = "Camp Narache", - [1232] = "Fel Rock", - [2031] = "Moonlit Ossuary", - [1230] = "Upper Ban'ethil Barrow Den", - [1231] = "Lower Ban'ethil Barrow Den", - [1225] = "The Venture Co. Mine", - [1224] = "Palemane Rock", - [1219] = "Skull Rock", - [1216] = "The Grizzled Den", - [1214] = "Gol'bolar Quarry", -} diff --git a/Database/Corrections/tbcNPCFixes.lua b/Database/Corrections/tbcNPCFixes.lua index fb41b1d..d55539d 100644 --- a/Database/Corrections/tbcNPCFixes.lua +++ b/Database/Corrections/tbcNPCFixes.lua @@ -13,6 +13,18 @@ function QuestieTBCNpcFixes:Load() local waypointPresets = QuestieDB.waypointPresets return { + [16876] = { + [npcKeys.spawns] = { [3483] = {{51.2,57.6},{51.4,41.8},{51.4,56.4},{51.4,57.2},{51.6,41.8},{51.6,57.2},{51.6,57.8},{52.2,47.4},{52.2,48.2},{53,48.6},{53.2,47.2},{53.2,47.8},{57.4,52.4},{57.4,52.6},{57.6,51.8},{57.6,52.8},{58,47.8},{58.2,46.4},{58.2,47.2},{58.2,51.4},{58.8,47.4},{58.8,47.6},{59.4,46.2},{59.8,46.2},{59.8,46.6},{60.6,46.4},{60.8,47.4},{61,48},{61.6,47.8},{62.2,53.4},{62.4,53.8},{62.6,53.4},{62.6,53.8}} }, + }, + [16925] = { + [npcKeys.spawns] = { [3483] = {{49.8,55.8},{50,56.6},{50.8,55.6},{50.8,56.6},{51,54.4},{51,55.4},{52.2,47.4},{52.2,47.6},{52.4,53.6},{52.6,53.8},{52.8,53.4},{53,48.4},{53,48.6},{53.4,46.4},{53.4,47},{53.6,46.4},{53.6,47.2},{53.8,47.8},{54.2,53.6},{54.4,52.4},{54.4,52.6},{54.6,52.4},{54.6,52.6},{55.2,47.4},{55.2,48},{55.2,53.6},{55.6,53.4},{55.8,53.6},{56,46.4},{56,47.2},{56.2,48},{56.4,52.4},{56.6,52.6},{57,47.4},{57,47.6},{57,52.2},{57.6,51.8},{58.2,51.4},{59.4,51.4},{59.4,51.6},{60,52.6},{60.2,51.8},{60.4,47.4},{60.4,47.8},{60.4,51.2},{60.6,48},{61,47.4},{61,51},{61.4,51.8},{61.6,47.4},{61.6,47.8},{61.6,51.4}} }, + }, + [19701] = { + [npcKeys.spawns] = { [3483] = {{49.8,55.8},{51,54.4},{51,54.6},{51.6,41.8},{52.4,47.4},{52.4,47.6},{52.4,53.6},{52.6,53.6},{52.8,53},{53,48.4},{53.2,48.6},{53.4,47.2},{53.6,47.2},{54.2,52.2},{54.4,52.6},{54.6,52.6},{55,52.2},{55,53.8},{55.2,47},{55.2,48.2},{56.2,48},{56.4,46.4},{56.4,46.6},{56.6,46.4},{56.6,46.6},{56.6,52},{57,48},{58,47.8},{58,53.2},{58.2,47.4},{58.2,51.4},{58.2,51.6},{58.8,47.4},{58.8,47.8},{59.4,51.4},{59.6,47},{60.4,51.2},{60.4,52.2},{60.6,48},{60.6,52.2},{61.4,50.6},{61.6,47.4},{61.6,48},{62,50.6},{62.2,50.4},{62.4,53.2},{62.4,53.6},{62.6,53.4},{62.6,53.6},{63.6,51},{67.2,46.2}} }, + }, + [18952] = { + [npcKeys.spawns] = { [3483] = {{49.8,55.8},{50.2,56.6},{50.8,56},{51,54.4},{51,55},{51.2,42},{51.4,42.8},{51.4,57},{51.4,57.6},{51.6,57},{51.8,43},{52.2,45.4},{52.2,47.6},{52.4,46.4},{52.4,47.2},{52.6,46.4},{53,47.8},{53,54.4},{53,54.6},{53.2,48.6},{53.4,47},{53.6,46.4},{53.6,47.2},{53.8,47.8},{54.2,53.2},{54.4,52.4},{54.4,53.6},{55.2,46.4},{55.2,47.6},{55.2,52.2},{55.2,53},{55.2,53.6},{55.4,47},{55.8,46.4},{56,46.8},{56.2,48},{56.4,53.4},{56.4,53.6},{56.6,46.4},{56.8,53.6},{57,47.2},{57,47.6},{57.4,52.4},{57.4,52.6},{58,47.4},{58,47.8},{58.2,51.4},{58.4,46.4},{58.4,52.4},{58.4,52.6},{58.6,52.4},{58.6,52.6},{58.8,47},{58.8,47.6},{59,46.4},{59.4,51.2},{59.8,51.6},{60.2,46.4},{60.4,46.6},{60.4,47.6},{60.4,51.2},{60.4,52.6},{60.6,46.4},{60.6,46.6},{60.8,51},{60.8,52.6},{61,47.6},{61,52.2},{61.4,50.4},{61.6,47.4},{61.6,47.8},{61.8,51.4},{61.8,51.6},{62,53.4},{62,53.6},{62.2,50.4},{62.6,51.2},{62.6,53.2},{62.6,53.6},{65.4,46.6},{65.8,46.4},{65.8,46.6},{67,45.2},{67,46.2},{67.6,45.8},{67.8,45.4}} }, + }, [331] = { [npcKeys.questStarts] = { 8250, 64038 }, }, diff --git a/Database/Corrections/tbcQuestFixes.lua b/Database/Corrections/tbcQuestFixes.lua index 2ac2b55..3e819a2 100644 --- a/Database/Corrections/tbcQuestFixes.lua +++ b/Database/Corrections/tbcQuestFixes.lua @@ -32,6 +32,15 @@ function QuestieTBCQuestFixes:Load() local specKeys = QuestieProfessions.specializationKeys return { + [10482] = { + [questKeys.objectives] = { + nil, + nil, + nil, + nil, + { { { 16876, 16925, 18952, 19701 }, 16876, "Bonechewer Orcs slain" } }, + }, + }, [62] = { [questKeys.triggerEnd] = {"Scout through the Fargodeep Mine", {[zoneIDs.ELWYNN_FOREST]={{40.01,81.42}}}}, }, diff --git a/Database/Corrections/wotlkNPCFixes.lua b/Database/Corrections/wotlkNPCFixes.lua index 962595e..9499c8e 100644 --- a/Database/Corrections/wotlkNPCFixes.lua +++ b/Database/Corrections/wotlkNPCFixes.lua @@ -15,6 +15,27 @@ function QuestieWotlkNpcFixes:Load() local waypointPresets = QuestieDB.waypointPresets return { + [16876] = { + [npcKeys.spawns] = { [3483] = {{51.2,57.6},{51.4,41.8},{51.4,56.4},{51.4,57.2},{51.6,41.8},{51.6,57.2},{51.6,57.8},{52.2,47.4},{52.2,48.2},{53,48.6},{53.2,47.2},{53.2,47.8},{57.4,52.4},{57.4,52.6},{57.6,51.8},{57.6,52.8},{58,47.8},{58.2,46.4},{58.2,47.2},{58.2,51.4},{58.8,47.4},{58.8,47.6},{59.4,46.2},{59.8,46.2},{59.8,46.6},{60.6,46.4},{60.8,47.4},{61,48},{61.6,47.8},{62.2,53.4},{62.4,53.8},{62.6,53.4},{62.6,53.8}} }, + }, + [18694] = { + [npcKeys.spawns] = { [3520] = {{70.04,66.27},{70.58,29.14},{45.98,53.33}} }, + }, + [18695] = { + [npcKeys.spawns] = { [3520] = {{29.9,58.03},{45.15,68.66},{67.43,60.6},{55.07,38.55},{48.06,29.46}} }, + }, + [18696] = { + [npcKeys.spawns] = { [3520] = {{42.64,67.66},{60.4,49.18},{45.41,12.26},{41.07,40.53}} }, + }, + [16925] = { + [npcKeys.spawns] = { [3483] = {{49.8,55.8},{50,56.6},{50.8,55.6},{50.8,56.6},{51,54.4},{51,55.4},{52.2,47.4},{52.2,47.6},{52.4,53.6},{52.6,53.8},{52.8,53.4},{53,48.4},{53,48.6},{53.4,46.4},{53.4,47},{53.6,46.4},{53.6,47.2},{53.8,47.8},{54.2,53.6},{54.4,52.4},{54.4,52.6},{54.6,52.4},{54.6,52.6},{55.2,47.4},{55.2,48},{55.2,53.6},{55.6,53.4},{55.8,53.6},{56,46.4},{56,47.2},{56.2,48},{56.4,52.4},{56.6,52.6},{57,47.4},{57,47.6},{57,52.2},{57.6,51.8},{58.2,51.4},{59.4,51.4},{59.4,51.6},{60,52.6},{60.2,51.8},{60.4,47.4},{60.4,47.8},{60.4,51.2},{60.6,48},{61,47.4},{61,51},{61.4,51.8},{61.6,47.4},{61.6,47.8},{61.6,51.4}} }, + }, + [19701] = { + [npcKeys.spawns] = { [3483] = {{49.8,55.8},{51,54.4},{51,54.6},{51.6,41.8},{52.4,47.4},{52.4,47.6},{52.4,53.6},{52.6,53.6},{52.8,53},{53,48.4},{53.2,48.6},{53.4,47.2},{53.6,47.2},{54.2,52.2},{54.4,52.6},{54.6,52.6},{55,52.2},{55,53.8},{55.2,47},{55.2,48.2},{56.2,48},{56.4,46.4},{56.4,46.6},{56.6,46.4},{56.6,46.6},{56.6,52},{57,48},{58,47.8},{58,53.2},{58.2,47.4},{58.2,51.4},{58.2,51.6},{58.8,47.4},{58.8,47.8},{59.4,51.4},{59.6,47},{60.4,51.2},{60.4,52.2},{60.6,48},{60.6,52.2},{61.4,50.6},{61.6,47.4},{61.6,48},{62,50.6},{62.2,50.4},{62.4,53.2},{62.4,53.6},{62.6,53.4},{62.6,53.6},{63.6,51},{67.2,46.2}} }, + }, + [18952] = { + [npcKeys.spawns] = { [3483] = {{49.8,55.8},{50.2,56.6},{50.8,56},{51,54.4},{51,55},{51.2,42},{51.4,42.8},{51.4,57},{51.4,57.6},{51.6,57},{51.8,43},{52.2,45.4},{52.2,47.6},{52.4,46.4},{52.4,47.2},{52.6,46.4},{53,47.8},{53,54.4},{53,54.6},{53.2,48.6},{53.4,47},{53.6,46.4},{53.6,47.2},{53.8,47.8},{54.2,53.2},{54.4,52.4},{54.4,53.6},{55.2,46.4},{55.2,47.6},{55.2,52.2},{55.2,53},{55.2,53.6},{55.4,47},{55.8,46.4},{56,46.8},{56.2,48},{56.4,53.4},{56.4,53.6},{56.6,46.4},{56.8,53.6},{57,47.2},{57,47.6},{57.4,52.4},{57.4,52.6},{58,47.4},{58,47.8},{58.2,51.4},{58.4,46.4},{58.4,52.4},{58.4,52.6},{58.6,52.4},{58.6,52.6},{58.8,47},{58.8,47.6},{59,46.4},{59.4,51.2},{59.8,51.6},{60.2,46.4},{60.4,46.6},{60.4,47.6},{60.4,51.2},{60.4,52.6},{60.6,46.4},{60.6,46.6},{60.8,51},{60.8,52.6},{61,47.6},{61,52.2},{61.4,50.4},{61.6,47.4},{61.6,47.8},{61.8,51.4},{61.8,51.6},{62,53.4},{62,53.6},{62.2,50.4},{62.6,51.2},{62.6,53.2},{62.6,53.6},{65.4,46.6},{65.8,46.4},{65.8,46.6},{67,45.2},{67,46.2},{67.6,45.8},{67.8,45.4}} }, + }, [23728] = { [npcKeys.spawns] = { [495] = { { 60.1, 62.4 } } }, }, diff --git a/Database/Corrections/wotlkQuestFixes.lua b/Database/Corrections/wotlkQuestFixes.lua index 4faec00..510c0c7 100644 --- a/Database/Corrections/wotlkQuestFixes.lua +++ b/Database/Corrections/wotlkQuestFixes.lua @@ -43,6 +43,15 @@ function QuestieWotlkQuestFixes:Load() local specKeys = QuestieProfessions.specializationKeys return { + [10482] = { + [questKeys.objectives] = { + nil, + nil, + nil, + nil, + { { { 16876, 16925, 18952, 19701 }, 16876, "Bonechewer Orcs slain" } }, + }, + }, [55] = { [questKeys.objectives] = {{{1200}}}, }, diff --git a/Database/Ebonhold/Ebonhold/EbonholdItemDB.lua b/Database/Ebonhold/Ebonhold/EbonholdItemDB.lua deleted file mode 100644 index 09925a0..0000000 --- a/Database/Ebonhold/Ebonhold/EbonholdItemDB.lua +++ /dev/null @@ -1,10 +0,0 @@ ----@type table -local EbonholdDB = QuestieLoader:CreateModule("EbonholdDB") - -EbonholdDB.itemData = EbonholdDB.itemData or { - -- Ebonhold Custom Items would go here - -- [ItemID] = {Name, ...} -} - -EbonholdItemDB = EbonholdItemDB or {} -EbonholdItemDB.itemData = EbonholdDB.itemData diff --git a/Database/Ebonhold/Ebonhold/EbonholdNpcDB.lua b/Database/Ebonhold/Ebonhold/EbonholdNpcDB.lua deleted file mode 100644 index cee4572..0000000 --- a/Database/Ebonhold/Ebonhold/EbonholdNpcDB.lua +++ /dev/null @@ -1,21 +0,0 @@ --- Generated by Ebonhold -EbonholdDB = EbonholdDB or {} -EbonholdDB.npcData = EbonholdDB.npcData or { - [32398] = { "King Ping", nil, nil, 71, 71, 2, { [495] = { { 25.6, 69.2 }, { 26.0, 63.8 }, { 26.6, 63.2 }, { 30.4, 71.4 }, { 30.8, 56.4 }, { 30.8, 70.8 }, { 31.0, 71.6 }, { 31.2, 56.6 }, { 31.2, 57.6 }, { 31.6, 77.4 }, { 31.8, 75.4 }, { 32.2, 75.8 }, { 32.6, 78.8 }, { 33.0, 80.2 }, { 33.4, 80.6 }, { 33.6, 80.2 }, { 33.6, 81.0 } } }, nil, 495, nil, nil, 12 }, - [32377] = { "Perobas the Bloodthirster", nil, nil, 71, 71, 2, { [495] = { { 47.8, 5.8 }, { 50.0, 4.6 }, { 50.4, 4.4 }, { 50.6, 4.2 }, { 52.4, 10.8 }, { 53.0, 11.8 }, { 53.2, 12.6 }, { 53.8, 11.8 }, { 60.0, 19.8 }, { 60.6, 21.0 }, { 60.8, 22.0 }, { 61.0, 19.8 }, { 68.2, 17.8 }, { 68.4, 17.2 }, { 68.6, 16.8 }, { 69.4, 14.2 }, { 71.2, 13.2 }, { 71.2, 14.6 }, { 71.4, 14.0 }, { 71.6, 14.4 }, { 72.2, 13.4 } } }, nil, 495, nil, nil, 12 }, - [32386] = { "Vigdis the War Maiden", nil, nil, 71, 71, 2, { [495] = { { 68.4, 46.0 }, { 68.4, 58.4 }, { 68.6, 48.6 }, { 68.8, 47.8 }, { 68.8, 59.0 }, { 70.0, 50.4 }, { 70.0, 56.8 }, { 70.0, 57.6 }, { 70.4, 49.2 }, { 70.6, 50.2 }, { 71.0, 52.2 }, { 71.0, 56.8 }, { 71.2, 55.4 }, { 71.2, 55.6 }, { 71.6, 44.4 }, { 71.6, 45.6 }, { 71.8, 47.0 }, { 72.2, 42.8 }, { 72.2, 48.6 }, { 72.2, 52.6 }, { 72.4, 44.8 }, { 72.4, 50.6 }, { 72.6, 46.0 }, { 72.6, 52.4 }, { 72.6, 61.2 }, { 72.8, 39.2 }, { 72.8, 41.0 }, { 72.8, 44.4 }, { 72.8, 49.0 }, { 72.8, 51.4 }, { 72.8, 61.8 }, { 73.0, 40.2 }, { 73.0, 48.0 }, { 73.2, 44.6 }, { 73.2, 53.2 }, { 73.6, 45.4 }, { 73.8, 49.6 }, { 73.8, 61.4 }, { 74.0, 52.6 }, { 74.2, 45.8 }, { 74.2, 47.8 }, { 74.2, 59.2 }, { 74.4, 54.6 }, { 74.4, 60.2 }, { 74.6, 50.0 }, { 74.6, 51.4 }, { 74.6, 54.8 }, { 74.8, 45.2 }, { 74.8, 56.6 }, { 74.8, 58.4 }, { 75.0, 48.2 }, { 75.0, 52.6 }, { 75.6, 45.2 }, { 76.2, 42.8 } } }, nil, 495, nil, nil, 12 }, - [7040] = { "Black Dragonspawn", nil, nil, 52, 53, 1, { [46] = { { 85.41, 27.2 }, { 83.57, 28.6 }, { 56.96, 61.45 }, { 87.21, 39.79 }, { 90.47, 37.34 }, { 82.35, 26.62 }, { 58.26, 64.5 }, { 87.2, 35.15 }, { 90.44, 38.44 }, { 75.54, 62.52 }, { 86.97, 28.34 }, { 88.48, 36.45 }, { 56.1, 64.35 }, { 92.19, 54.61 }, { 93.86, 55.37 }, { 92.78, 57.53 }, { 90.5, 54.29 }, { 56.33, 60.61 }, { 90.47, 52.28 }, { 86.82, 26.3 } } }, nil, 46, nil, nil, 103 }, - [7041] = { "Black Wyrmkin", nil, nil, 53, 54, 1, { [46] = { { 88.37, 39.97 }, { 77.87, 62.23 }, { 58.44, 60.82 }, { 88.93, 37.64 }, { 77.32, 61.9 }, { 76.7, 62.5 }, { 89.19, 35.49 }, { 57.51, 62.19 }, { 84.67, 28.67 }, { 84.71, 26.89 }, { 83.99, 26.9 }, { 91.38, 55.93 }, { 91.8, 53.16 }, { 92.77, 53.76 }, { 91.6, 50.35 }, { 88.29, 37.47 }, { 57.59, 60.56 }, { 77.14, 61.57 } } }, nil, 46, nil, nil, 103 }, - [7042] = { "Flamescale Dragonspawn", nil, nil, 56, 57, 1, { [46] = { { 20.84, 45.04 }, { 30.68, 61.44 }, { 22.3, 45.17 }, { 20.17, 48.79 }, { 33.8, 71.2 }, { 32.92, 66.48 }, { 34.68, 48.65 }, { 31.69, 66.49 }, { 32.59, 71.06 }, { 23.41, 47.57 }, { 31.19, 59.11 }, { 34.47, 68.92 } } }, nil, 46, nil, nil, 103 }, - [7043] = { "Flamescale Wyrmkin", nil, nil, 57, 58, 1, { [46] = { { 29.98, 60.53 }, { 37.2, 49.1 }, { 32.54, 62.37 }, { 32.36, 60.6 }, { 30.03, 62.81 }, { 21.44, 46.43 }, { 19.91, 45.36 }, { 33.7, 69.84 }, { 32.3, 69.47 }, { 30.91, 62.33 }, { 31.44, 61.33 }, { 36.9, 47.25 }, { 21.65, 47.41 }, { 35.75, 49.08 }, { 36.09, 48.57 } } }, nil, 46, nil, nil, 103 }, - [7044] = { "Black Drake", nil, nil, 50, 52, 1, { [46] = { { 89.94, 43.86 }, { 84.9, 28.47 }, { 89.5, 56.96 } } }, { [46] = { { { 89.96, 43.86 }, { 89.99, 44.74 }, { 90.07, 46.4 }, { 89.95, 48.47 }, { 90.54, 49.75 }, { 90.66, 50.69 }, { 90.68, 51.68 }, { 90.65, 52.73 }, { 90.02, 53.21 }, { 88.83, 53.58 }, { 89.03, 50.61 }, { 89.19, 49.39 }, { 89.45, 47.86 }, { 89.26, 46.76 }, { 89.02, 45.61 }, { 89.53, 44.81 }, { 89.83, 44.1 } }, { { 84.91, 28.51 }, { 85.56, 29.06 }, { 86.35, 29.73 }, { 87.56, 30.77 }, { 88.9, 31.47 }, { 89.65, 32.07 }, { 90.27, 33.21 }, { 90.62, 34.25 }, { 90.31, 35.58 }, { 89.95, 35.87 }, { 89.56, 35.54 }, { 88.91, 34.27 }, { 87.76, 32.12 }, { 86.74, 30.92 }, { 86.02, 30.68 }, { 85.66, 29.86 }, { 85.12, 28.91 } }, { { 89.02, 57.48 }, { 87.82, 58.51 }, { 87.0, 58.89 }, { 85.76, 59.23 }, { 85.0, 59.12 }, { 84.04, 58.85 }, { 83.4, 58.53 }, { 82.87, 58.41 }, { 82.43, 58.81 }, { 81.98, 59.75 }, { 81.96, 60.38 }, { 82.31, 61.04 }, { 82.66, 61.33 }, { 83.13, 61.42 }, { 83.8, 61.26 }, { 84.5, 61.08 }, { 85.1, 60.93 }, { 85.52, 60.7 }, { 86.17, 60.03 }, { 87.45, 59.17 }, { 89.49, 58.05 }, { 90.89, 58.15 }, { 91.89, 58.36 }, { 93.16, 57.98 }, { 93.75, 57.24 }, { 93.85, 56.88 }, { 93.89, 56.36 }, { 93.71, 55.73 }, { 93.32, 55.0 }, { 93.0, 54.44 }, { 92.27, 53.6 }, { 91.95, 53.03 }, { 91.74, 52.69 }, { 91.23, 52.48 }, { 90.74, 52.76 }, { 89.89, 54.41 }, { 89.78, 55.27 }, { 89.49, 56.53 } } } }, 46, nil, nil, 103 }, - [7045] = { "Scalding Drake", nil, nil, 53, 55, 1, { [46] = { { 60.28, 59.02 }, { 63.73, 58.42 } } }, { [46] = { { { 60.18, 59.02 }, { 60.13, 59.32 }, { 60.02, 59.68 }, { 59.67, 60.38 }, { 58.9, 61.33 }, { 57.97, 62.36 }, { 57.46, 63.02 }, { 56.95, 64.35 }, { 55.79, 63.79 }, { 55.23, 63.83 }, { 54.46, 63.8 }, { 53.51, 63.66 }, { 51.91, 63.62 }, { 51.46, 63.79 }, { 50.95, 63.56 }, { 50.49, 62.87 }, { 50.29, 62.6 }, { 50.09, 62.27 }, { 49.99, 62.04 }, { 49.74, 61.59 }, { 48.89, 60.43 }, { 49.46, 59.95 }, { 49.9, 59.25 }, { 50.05, 58.81 }, { 50.42, 58.39 }, { 50.87, 58.31 }, { 51.05, 58.04 }, { 51.72, 57.47 }, { 52.35, 57.39 }, { 52.58, 57.43 }, { 53.53, 57.55 }, { 54.36, 58.41 }, { 54.63, 58.96 }, { 55.16, 59.32 }, { 55.74, 59.18 }, { 56.21, 58.98 }, { 56.72, 58.49 }, { 57.95, 58.86 }, { 58.45, 59.35 }, { 59.09, 59.64 }, { 59.95, 59.65 } }, { { 63.77, 58.53 }, { 64.46, 59.11 }, { 65.35, 59.82 }, { 65.8, 60.29 }, { 66.53, 60.57 }, { 66.87, 60.26 }, { 67.46, 59.59 }, { 68.03, 59.47 }, { 68.4, 59.38 }, { 68.77, 59.3 }, { 69.26, 59.24 }, { 69.86, 58.96 }, { 71.01, 58.59 }, { 71.65, 58.59 }, { 72.37, 59.25 }, { 72.45, 58.33 }, { 71.98, 57.62 }, { 71.52, 57.81 }, { 70.81, 58.33 }, { 69.99, 58.71 }, { 68.45, 59.34 }, { 68.08, 59.45 }, { 67.54, 59.46 }, { 66.7, 59.47 }, { 65.85, 59.48 }, { 65.27, 59.42 }, { 64.78, 59.23 }, { 64.3, 58.88 } } } }, 46, nil, nil, 103 }, - [7046] = { "Searscale Drake", nil, nil, 56, 58, 1, { [46] = { { 17.44, 52.46 }, { 32.02, 61.97 }, { 24.54, 67.17 } } }, { [46] = { { { 17.32, 52.66 }, { 17.01, 53.57 }, { 17.04, 55.22 }, { 17.38, 56.98 }, { 17.5, 57.64 }, { 18.0, 58.4 }, { 18.72, 58.97 }, { 19.33, 59.4 }, { 19.75, 59.56 }, { 19.06, 59.25 }, { 17.83, 58.1 }, { 17.43, 57.24 }, { 17.38, 56.3 }, { 17.32, 54.62 }, { 17.72, 53.02 }, { 18.02, 51.2 }, { 17.46, 49.27 }, { 17.71, 48.01 }, { 18.11, 47.13 }, { 18.58, 46.92 }, { 18.74, 47.4 }, { 18.85, 48.27 }, { 18.87, 48.73 }, { 18.89, 49.72 }, { 18.44, 50.69 }, { 17.62, 52.07 } } } }, 46, nil, nil, 103 }, - [7047] = { "Black Broodling", nil, nil, 51, 52, 0, { [46] = { { 86.92, 30.55 }, { 84.87, 31.86 }, { 91.86, 38.48 }, { 81.01, 28.2 }, { 91.67, 35.54 }, { 81.37, 26.48 }, { 88.32, 29.78 }, { 87.8, 33.45 }, { 91.59, 33.36 }, { 89.47, 43.89 }, { 90.53, 45.22 }, { 90.48, 50.92 }, { 90.57, 47.39 }, { 84.59, 62.1 } } }, nil, 46, nil, nil, 103 }, - [7048] = { "Scalding Broodling", nil, nil, 53, 54, 0, { [46] = { { 57.59, 31.63 }, { 38.74, 46.15 }, { 61.13, 31.24 }, { 55.73, 64.44 }, { 63.78, 57.27 }, { 73.18, 27.12 }, { 70.94, 62.13 }, { 59.86, 63.91 }, { 37.81, 62.51 }, { 72.4, 28.17 }, { 34.62, 55.43 }, { 78.39, 27.5 }, { 40.92, 48.81 }, { 52.67, 26.04 }, { 59.19, 32.29 }, { 64.36, 60.61 } } }, nil, 46, nil, nil, 103 }, - [7049] = { "Flamescale Broodling", nil, nil, 55, 56, 0, { [46] = { { 24.82, 47.18 }, { 24.33, 67.37 }, { 28.66, 57.82 }, { 22.48, 68.9 }, { 23.35, 70.57 }, { 22.32, 58.87 }, { 25.37, 45.74 }, { 16.96, 55.36 } } }, nil, 46, nil, nil, 103 }, -} - --- Backward compatibility -EbonholdNpcDB = EbonholdNpcDB or {} -EbonholdNpcDB.npcData = EbonholdDB.npcData diff --git a/Database/Ebonhold/Ebonhold/EbonholdObjectDB.lua b/Database/Ebonhold/Ebonhold/EbonholdObjectDB.lua deleted file mode 100644 index f1e900e..0000000 --- a/Database/Ebonhold/Ebonhold/EbonholdObjectDB.lua +++ /dev/null @@ -1,17 +0,0 @@ ----@type table -local EbonholdDB = QuestieLoader:CreateModule("EbonholdDB") - -EbonholdDB.objectData = EbonholdDB.objectData or { - -- Object 600600: Elemental Shrine (starts quest 50026) - [600600] = { - [1] = "Elemental Shrine", -- Name - [2] = nil, -- Type - [3] = nil, -- Zones - [4] = { [3703] = { { 54.29, 45.69 } } }, -- Spawns: Shattrath City - [5] = 12, -- Faction - [6] = nil, -- Unknown - }, -} - -EbonholdObjectDB = EbonholdObjectDB or {} -EbonholdObjectDB.objectData = EbonholdDB.objectData diff --git a/Database/Ebonhold/Ebonhold/EbonholdQuestDB.lua b/Database/Ebonhold/Ebonhold/EbonholdQuestDB.lua deleted file mode 100644 index 19fe253..0000000 --- a/Database/Ebonhold/Ebonhold/EbonholdQuestDB.lua +++ /dev/null @@ -1,1725 +0,0 @@ ----@type table -local EbonholdDB = QuestieLoader:CreateModule("EbonholdDB") - -EbonholdDB.questData = EbonholdDB.questData or { - -- Quest 50023: Elemental Frostfall - -- Kill 30 elementals in Winterspring - [50023] = { - [1] = "Elemental Frostfall", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 55, -- Min level - [5] = 60, -- Quest level - [17] = 618, -- Zone (Winterspring) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Elementals in Winterspring" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 2 elemental NPCs in Winterspring - { 14457, 14458 }, - 14457, -- RootId: Princess Tempestria - "Elemental slain" - } - } - }, - - [30] = 30, -- Kill count - }, - -- Quest 50057: Brood of the Black Flight - -- Started by object 600600 - [50057] = { - [1] = "Brood of the Black Flight", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 55, -- Quest level - [5] = 48, -- Min level - [17] = 46, -- Zone (Burning Steppes) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill Dragonkin in the Burning Steppes." - }, - [10] = { - nil, -- [1] creatureObjective - nil, -- [2] objectObjective - nil, -- [3] itemObjective - nil, -- [4] reputationObjective - { -- [5] killCreditObjective - { - { 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, 7048, 7049 }, -- IdList - 7040, -- RootId (Black Dragonspawn) - "Dragonkin slain" -- Text - } - } - }, - [30] = 30, -- Kill count - }, - - -- Quest 50026: Elemental Balance - -- Started by object 600600, kills of NPCs 17156 or 17157 count (both are elementals) - [50026] = { - [1] = "Elemental Balance", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 67, -- Quest level - [5] = 64, -- Min level - [17] = 3518, -- Zone (Nagrand) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Elementals in Nagrand" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - { 17153, 17154, 17155, 17156, 17157, 17159, 17160, 18062, 22309, 22310, 22311, 22313 }, -- IdList: all elemental types - 17157, -- RootId: representative NPC - "Shattered Rumbler slain" -- Text - } - } - }, - - [30] = 60, -- Group size - }, - - -- Quest 50085: Savage Heights - -- Kill 75 beasts in Blade's Edge Mountains - [50085] = { - [1] = "Savage Heights", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 70, -- Quest level - [5] = 67, -- Min level - [17] = 3522, -- Zone (Blade's Edge Mountains) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 75 Beasts in Blade's Edge Mountains" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 47 beast-type NPCs in Blade's Edge Mountains - { 10204, 20058, 20109, 20327, 20330, 20714, 20728, 20729, 20747, 20748, 20749, 20751, 20924, 20925, 20987, 20998, 21022, 21033, 21042, 21123, 21124, 21373, 21423, 21470, 21796, 21839, 21952, 21956, 22044, 22052, 22110, 22114, 22123, 22132, 22135, 22136, 22141, 22142, 22181, 22268, 22490, 22492, 22498, 22987, 23036, 23343, 23380 }, - 20728, -- RootId: Bladespire Raptor (representative beast) - "Beast slain" - } - } - }, - - [30] = 75, -- Kill count - }, - - -- Quest 50086: Unstable Fauna - -- Kill 75 beasts in Netherstorm - [50086] = { - [1] = "Unstable Fauna", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 70, -- Quest level - [5] = 67, -- Min level - [17] = 3523, -- Zone (Netherstorm) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 75 Beasts in Netherstorm" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 18 beast-type NPCs in Netherstorm - { 18879, 18880, 18883, 18884, 20415, 20607, 20610, 20611, 20618, 20634, 20671, 20673, 20773, 20775, 20777, 20931, 20932, 21005 }, - 18879, -- RootId: Phase Hunter (representative beast) - "Beast slain" - } - } - }, - - [30] = 75, -- Kill count - }, - - -- Quest 50201: Dragonblight Trophy - -- Kill 1 rare in Dragonblight - [50201] = { - [1] = "Dragonblight Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 75, -- Quest level - [5] = 71, -- Min level - [17] = 65, -- Zone (Dragonblight) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Dragonblight" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 3 rare NPCs in Dragonblight (already in WotLK DB with spawns) - { 32417, 32409, 32400 }, -- Scarlet Highlord Daion, Crazed Indu'le Survivor, Tukemuth - 32417, -- RootId: Scarlet Highlord Daion (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - - -- Quest 50187: Western Plaguelands Trophy - -- Kill 1 rare in Western Plaguelands - [50187] = { - [1] = "Western Plaguelands Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 50, -- Min level - [5] = 55, -- Quest level - [17] = 28, -- Zone (Western Plaguelands) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Western Plaguelands" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 11 rare NPCs in Western Plaguelands - { 1837, 1838, 1839, 1841, 1843, 1844, 1847, 1848, 1850, 1851, 1885 }, - 1848, -- RootId: Lord Maldazzar (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - - -- Quest 50160: Redridge Trophy - -- Kill 1 rare in Redridge Mountains - [50160] = { - [1] = "Redridge Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 17, -- Required level (Min level) - [5] = 25, -- Quest level - [17] = 44, -- Zone (Redridge Mountains) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Redridge Mountains" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- Redridge Rares - { 14271, 616, 14270, 584, 14272, 14273, 947, 14269 }, - 14271, -- RootId: Ribchaser (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50192: Zangarmarsh Trophy - -- Kill 1 rare in Zangarmarsh - [50192] = { - [1] = "Zangarmarsh Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 60, -- Required level (Min level) - [5] = 63, -- Quest level - [17] = 3521, -- Zone (Zangarmarsh) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Zangarmarsh" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- Zangarmarsh Rares - { 18682, 18680, 18681 }, -- Bog Lurker, Marticar, Coilfang Emissary - 18682, -- RootId: Bog Lurker (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50083: Forest Stalkers - -- Kill 75 beasts in Terokkar Forest - [50083] = { - [1] = "Forest Stalkers", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 65, -- Quest level - [5] = 62, -- Min level - [17] = 3519, -- Zone (Terokkar Forest) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 75 Beasts in Terokkar Forest" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 53 beast-type NPCs in Terokkar Forest - { 16932, 16933, 18467, 18464, 18466, 18670, 18465, 21723, 18461, 18648, 18750, 23219, 23051, 18463, 22424, 20682, 21515, 21854, 23163, 21816, 18476, 18477, 32956, 18437, 21634, 22337, 24922, 21804, 18470, 18438, 18647, 19607, 18468, 23338, 14866, 14868, 22100, 23206, 22972, 22105, 19659, 22326, 18707, 22807, 18469, 23167, 21635, 18492, 19616, 23162, 14869, 22339, 22987 }, - 16932, -- RootId: Razorfang Hatchling (representative beast) - "Beast slain" - } - } - }, - - [30] = 75, -- Kill count - }, - - -- Quest 50082: Marsh Predators - -- Kill 75 beasts in Zangarmarsh - [50082] = { - [1] = "Marsh Predators", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 64, -- Quest level - [5] = 62, -- Min level - [17] = 3521, -- Zone (Zangarmarsh) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 75 Beasts in Zangarmarsh" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All beasts in Zangarmarsh - { 19349, 19730, 18285, 18281, 18135, 18286, 18283, 18680, 18280, 18132, 20197, 18133, 18212, 18214, 19706, 20196, 18129, 18213, 18128, 20279, 20198, 18130, 20283, 18134, 19729, 20290, 20324, 20280, 18138, 17953, 18332, 18201, 18131, 20387 }, - 19349, -- RootId: Thornfang Ravager (representative beast) - "Beast slain" - } - } - }, - - [30] = 75, -- Kill count - }, - - -- Quest 50060: Skies of Blade's Edge - -- Kill Dragonkin in Blade's Edge Mountains - [50060] = { - [1] = "Skies of Blade's Edge", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 67, -- Required level (Min level) - [5] = 70, -- Quest level - [17] = 3522, -- Zone (Blade's Edge Mountains) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Slay Dragonkin in Blade's Edge Mountains" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 17 dragonkin-type NPCs in Blade's Edge Mountains - { 18692, 21032, 20021, 20713, 21004, 23281, 23261, 21387, 22108, 21492, 23061, 21811, 21497, 23282, 21389, 22130, 23364 }, - 18692, -- RootId: Hemathion (representative dragonkin) - "Dragonkin slain" - } - } - }, - }, - - -- Quest 50030: Tundra Turbulence - -- Kill Elementals in Borean Tundra - [50030] = { - [1] = "Tundra Turbulence", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Required level (Min level) - [5] = 71, -- Quest level - [17] = 3537, -- Zone (Borean Tundra) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill Elementals in Borean Tundra" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 15 elemental-type NPCs in Borean Tundra - { 25417, 32357, 25715, 25514, 25419, 24601, 25415, 25226, 25707, 25709, 26045, 25376, 25418, 25416 }, - 25417, -- RootId: Raging Boiler (representative elemental) - "Elementals slain" - } - } - }, - - [30] = 75, -- Kill count (Assumed generic high count for zone farming quests, user said "amount varies", so we don't hardcode it in logic but usually DB needs a number. 75 puts it in line with others.) - }, - - -- Quest 50031: Stormbound - -- Kill 30 Elementals in Storm Peaks - [50031] = { - [1] = "Stormbound", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Required level (Min level) - [5] = 73, -- Quest level - [17] = 67, -- Zone (Storm Peaks) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill Elementals in Storm Peaks" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All Storm Peaks elementals scraped from filter page - { 29504, 30450, 30184, 29844, 30387, 30160, 29624, 30001, 30474, 30120, 30053 }, - 30120, -- RootId: Seething Revenant (representative elemental) - "Elementals slain" - } - } - }, - - [30] = 30, -- Kill count (30 elementals as per quest name) - }, - - -- Quest 50087: Shadowed Beasts - -- Kill 75 beasts in Shadowmoon Valley - [50087] = { - [1] = "Shadowed Beasts", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 67, -- Quest level - [5] = 65, -- Min level - [17] = 3520, -- Zone (Shadowmoon Valley) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 75 Beasts in Shadowmoon Valley" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 25 beast-type NPCs in Shadowmoon Valley (excluding mounts) - { 19379, 19784, 20502, 20503, 21102, 21108, 21307, 21340, 21408, 21462, 21627, 21723, 21802, 21864, 21879, 21897, 21901, 22265, 23020, 23169, 23264, 23267, 23269, 23326, 23501 }, - 21723, -- RootId: Blackwind Sabercat (representative beast) - "Beast slain" - } - } - }, - - [30] = 75, -- Kill count - }, - - -- Quest 50064: Heart of the Dragonflights - -- Kill 30 dragonkin in Dragonblight - [50064] = { - [1] = "Heart of the Dragonflights", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 73, -- Quest level - [5] = 71, -- Min level - [17] = 3524, -- Zone (Dragonblight) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Dragonkin in Dragonblight" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 49 dragonkin NPCs in Dragonblight (excluding 32572 which is an object) - { 26276, 26277, 26322, 26349, 26443, 26593, 26917, 26925, 26933, 26949, 26983, 27255, 27506, 27530, 27542, 27575, 27608, 27629, 27682, 27725, 27763, 27765, 27785, 27789, 27856, 27896, 27897, 27898, 27900, 27925, 27935, 27938, 27940, 27943, 27948, 27950, 27953, 27990, 27996, 30058, 31333, 31334, 31393, 32180, 32185, 32186, 32352, 32533, 38017 }, - 26322, -- RootId: Arcane Wyrm (representative dragonkin) - "Dragonkin slain" - } - } - }, - - [30] = 30, -- Kill count - }, - - -- Quest 50095: Peak Predators - -- Kill 75 beasts in The Storm Peaks - [50095] = { - [1] = "Peak Predators", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Required level (Min level) - [5] = 73, -- Quest level - [17] = 67, -- Zone (The Storm Peaks) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill Beasts in The Storm Peaks" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 24 beast NPCs in Storm Peaks (hostile to both factions) - { 29411, 29590, 30148, 32475, 29958, 30164, 29358, 29469, 30422, 30445, 30291, 29412, 30448, 29461, 29605, 30447, 29319, 29390, 29562, 30340, 30292, 29808, 30174, 34920 }, - 29319, -- RootId: Icepaw Bear (representative beast) - "Beasts slain" - } - } - }, - - [30] = 75, -- Kill count (75 beasts as per quest name) - }, - - -- Quest 50096: Peak Predators - -- Kill 75 beasts in Icecrown - [50096] = { - [1] = "Peak Predators", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 73, -- Required level (Min level) - [5] = 77, -- Quest level - [17] = 210, -- Zone (Icecrown) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill Beasts in Icecrown" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 12 beast NPCs in Icecrown (hostile to both factions) - { 29392, 30206, 30330, 30430, 31265, 31747, 32484, 35060, 35061, 35071, 35470, 35482 }, - 29392, -- RootId: Ravenous Jaws (representative beast) - "Beasts slain" - } - } - }, - - [30] = 75, -- Kill count (75 beasts as per quest name) - }, - - -- Quest 50151: Icecrown Advance - -- Requires completing any 6 quests in Icecrown - -- Auto-complete, no turn-in location - [50151] = { - [1] = "Icecrown Advance", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 80, -- Quest level - [5] = 73, -- Min level - [17] = 210, -- Zone (Icecrown) - [8] = { - "This quest requires completing any 6 quests in Icecrown. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Icecrown" - }, - [9] = { "Complete 6 quests in Icecrown", nil }, - }, - - -- Quest 50205: Storm Peaks Trophy - -- Kill 1 rare in The Storm Peaks - [50205] = { - [1] = "Storm Peaks Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Min level - [5] = 80, -- Quest level - [17] = 67, -- Zone (The Storm Peaks) - [8] = { - "Kill a rare NPC in The Storm Peaks to complete this quest.", - "Kill a rare in The Storm Peaks" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 4 rare NPCs in The Storm Peaks - { 35189, 32491, 32630, 32500 }, - 35189, -- RootId: Skoll (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (1 rare) - }, - - -- Quest 50066: Stormforged Scales - -- Kill 30 dragonkin in The Storm Peaks - [50066] = { - [1] = "Stormforged Scales", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Min level - [5] = 80, -- Quest level - [17] = 67, -- Zone (The Storm Peaks) - [8] = { - "The dragons of the Storm Peaks must be dealt with before we can proceed with our plans. Destroy 30 dragonkin in the Storm Peaks to show the Storm Peaks dragons that they are not welcome here.", - "Slain: 0/30" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 8 dragonkin NPCs in The Storm Peaks (zone 67) with valid spawn data - { 32491, 32630, 29753, 29755, 29460, 30275, 30461 }, - 32491, -- RootId: Time-Lost Proto-Drake (representative dragonkin) - "Dragonkin slain" - } - } - }, - - [30] = 30, -- Kill count (30 dragonkin) - }, - - -- Quest 50145: Fjord Front - -- Requires completing any 6 quests in Howling Fjord - -- Auto-complete, no turn-in location - [50145] = { - [1] = "Fjord Front", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 74, -- Quest level - [5] = 68, -- Min level - [17] = 495, -- Zone (Howling Fjord) - [8] = { - "This quest requires completing any 6 quests in Howling Fjord. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Howling Fjord" - }, - [9] = { "Complete 6 quests in Howling Fjord", nil }, - }, - - -- Quest 50098: Morogh Missions - -- Requires completing any 6 quests in Dun Morogh - -- Auto-complete, no turn-in location - [50098] = { - [1] = "Morogh Missions", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 1, -- Min level - [5] = 60, -- Quest level - [17] = 1, -- Zone (Dun Morogh) - [8] = { - "This quest requires completing any 6 quests in Dun Morogh. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Dun Morogh" - }, - [9] = { "Complete 6 quests in Dun Morogh", nil }, - }, - - -- Quest 50100: Azuremyst Aid - -- Requires completing any 6 quests in Azuremyst Isle - -- Auto-complete, no turn-in location - [50100] = { - [1] = "Azuremyst Aid", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 1, -- Min level - [5] = 60, -- Quest level - [17] = 3524, -- Zone (Azuremyst Isle) - [8] = { - "This quest requires completing any 6 quests in Azuremyst Isle. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Azuremyst Isle" - }, - [9] = { "Complete 6 quests in Azuremyst Isle", nil }, - }, - - -- Quest 50094: Wild Basin - -- Kill 75 beasts in Sholazar Basin - [50094] = { - [1] = "Wild Basin", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Required level (Min level) - [5] = 73, -- Quest level - [17] = 3711, -- Zone (Sholazar Basin) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill Beasts in Sholazar Basin" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- All 29 beast NPCs in Sholazar Basin (hostile to both factions) - { 32485, 28009, 32481, 28097, 28083, 28001, 28213, 28297, 28358, 28317, 28096, 28325, 28288, 28399, 29044, 28086, 28011, 28085, 28380, 28847, 29033, 28010, 28002, 29034, 28129, 28004, 28087, 29018, 28003 }, - 28001, -- RootId: Dreadsaber (representative beast) - "Beasts slain" - } - } - }, - - [30] = 75, -- Kill count (75 beasts as per quest name) - }, - - -- Quest 50202: Grizzly Trophy - -- Kill 1 rare in Grizzly Hills - [50202] = { - [1] = "Grizzly Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 74, -- Quest level - [5] = 71, -- Min level - [17] = 394, -- Zone (Grizzly Hills) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Grizzly Hills" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 4 rare NPCs in Grizzly Hills - { 38453, 32429, 32422, 32438 }, -- Arcturis, Seething Hate, Grocklar, Syreian the Bonecarver - 38453, -- RootId: Arcturis (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - - -- Quest 50203: Zul'Drak Trophy - -- Kill 1 rare in Zul'Drak - [50203] = { - [1] = "Zul'Drak Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 77, -- Quest level - [5] = 74, -- Min level - [17] = 66, -- Zone (Zul'Drak) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Zul'Drak" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 4 rare NPCs in Zul'Drak - { 33776, 32471, 32475, 32447 }, -- Gondria, Griegen, Terror Spinner, Zul'drak Sentinel - 33776, -- RootId: Gondria (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - - -- Quest 50149: Basin Expeditions - -- Complete 6 quests in Sholazar Basin (Any Quest) - [50149] = { - [1] = "Basin Expeditions", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 76, -- Quest level - [5] = 74, -- Min level - [17] = 3711, -- Zone (Sholazar Basin) - [8] = { - "This quest requires completing any 6 quests in Sholazar Basin. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Complete 6 quests in Sholazar Basin" - }, - [9] = { "Complete 6 quests in Sholazar Basin", nil }, - }, - -- Quest 50154: Teldrassil Trophy - -- Kill 1 rare in Teldrassil - [50154] = { - [1] = "Teldrassil Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 1, -- Min level - [5] = 10, -- Quest level - [17] = 141, -- Zone (Teldrassil) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Teldrassil" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 6 rare NPCs in Teldrassil - { 14432, 3535, 14430, 14428, 14431, 14429 }, - 3535, -- RootId: Blackmoss the Fetid (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50099: Shadow of Teldrassil - -- Complete 6 quests in Teldrassil (Any Quest) - [50099] = { - [1] = "Shadow of Teldrassil", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 1, -- Min level - [5] = 60, -- Quest level - [17] = 141, -- Zone (Teldrassil) - [8] = { - "This quest requires completing any 6 quests in Teldrassil. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Teldrassil" - }, - [9] = { "Complete 6 quests in Teldrassil", nil }, - }, - - -- Quest 50103: Darkshore Defense - -- Complete 6 quests in Darkshore (Any Quest) - [50103] = { - [1] = "Darkshore Defense", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Min level - [5] = 1, -- Quest level - [17] = 331, -- Zone (Darkshore) - [8] = { - "This quest requires completing any 6 quests in Darkshore. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Darkshore" - }, - [9] = { "Complete 6 quests in Darkshore", nil }, - }, - - -- Quest 50104: Bloodmyst Recovery - -- Complete 6 quests in Bloodmyst Isle (Any Quest) - [50104] = { - [1] = "Bloodmyst Recovery", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Min level - [5] = 1, -- Quest level - [17] = 3525, -- Zone (Bloodmyst Isle) - [8] = { - "This quest requires completing any 6 quests in Bloodmyst Isle. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Bloodmyst Isle" - }, - [9] = { "Complete 6 quests in Bloodmyst Isle", nil }, - }, - - -- Quest 50108: Trials of Durotar - -- Complete 6 quests in Durotar (Any Quest) - [50108] = { - [1] = "Trials of Durotar", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 1, -- Min level - [5] = 60, -- Quest level - [17] = 14, -- Zone (Durotar) - [8] = { - "This quest requires completing any 6 quests in Durotar. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Durotar" - }, - [9] = { "Complete 6 quests in Durotar", nil }, - }, - -- Quest 50097: Elwynn Errands - -- Complete 6 quests in Elwynn Forest (Any Quest) - [50097] = { - [1] = "Elwynn Errands", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 1, -- Min level - [5] = 1, -- Quest level - [17] = 12, -- Zone (Elwynn Forest) - [8] = { - "This quest requires completing any 6 quests in Elwynn Forest. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Elwynn Forest" - }, - [9] = { "Complete 6 quests in Elwynn Forest", nil }, - }, - - -- Quest 50105: Redridge Resolve - -- Complete 6 quests in Redridge Mountains (Any Quest) - [50105] = { - [1] = "Redridge Resolve", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Min level - [5] = 1, -- Quest level - [17] = 44, -- Zone (Redridge Mountains) - [8] = { - "This quest requires completing any 6 quests in Redridge Mountains. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Redridge Mountains" - }, - [9] = { "Complete 6 quests in Redridge Mountains", nil }, - }, - - -- Quest 50111: Song of the Woods - -- Complete 6 quests in Eversong Woods (Any Quest) - [50111] = { - [1] = "Song of the Woods", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 1, -- Min level - [5] = 60, -- Quest level - [17] = 3430, -- Zone (Eversong Woods) - [8] = { - "This quest requires completing any 6 quests in Eversong Woods. The quest will automatically complete once the objective is met.", - "Complete 6 quests in Eversong Woods" - }, - [9] = { "Complete 6 quests in Eversong Woods", nil }, - }, - - -- Quest 50157: Modan Trophy - -- Kill 1 rare in Loch Modan - [50157] = { - [1] = "Modan Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Min level - [5] = 10, -- Quest level - [17] = 38, -- Zone (Loch Modan) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Loch Modan" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 7 rare NPCs in Loch Modan - { 1425, 1399, 2476, 14266, 14268, 14267, 1398 }, - 1425, -- RootId: Grizlak (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50156: Westfall Trophy - -- Kill 1 rare in Westfall - [50156] = { - [1] = "Westfall Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Min level - [5] = 10, -- Quest level - [17] = 40, -- Zone (Westfall) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Westfall" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 9 rare NPCs in Westfall - { 573, 599, 462, 520, 596, 572, 1424, 506, 519 }, - 573, -- RootId: Foe Reaper 4000 (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50162: Wetlands Trophy - -- Kill 1 rare in Wetlands - [50162] = { - [1] = "Wetlands Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Min level - [5] = 10, -- Quest level - [17] = 11, -- Zone (Wetlands) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Wetlands" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 8 rare NPCs in Wetlands - { 1037, 1140, 2108, 14425, 14433, 2090, 1112, 14424 }, - 1037, -- RootId: Dragonmaw Battlemaster (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50153: Morogh Trophy - -- Kill 1 rare in Dun Morogh - [50153] = { - [1] = "Morogh Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Quest level - [5] = 1, -- Min level - [17] = 1, -- Zone (Dun Morogh) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Dun Morogh" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 6 rare NPCs in Dun Morogh - { 1132, 1130, 8503, 1260, 1137, 1119 }, -- Timber, Bjarn, Gibblewilt, Great Father Arctikus, Edan the Howler, Hammerspine - 1132, -- RootId: Timber (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - - -- Quest 50164: Tirisfal Trophy - -- Kill 1 rare in Tirisfal Glades - [50164] = { - [1] = "Tirisfal Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 10, -- Quest level - [5] = 1, -- Min level - [17] = 85, -- Zone (Tirisfal Glades) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Tirisfal Glades" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 9 rare NPCs in Tirisfal Glades - { 10357, 10359, 10356, 1936, 1531, 1911, 1910, 10358, 1533 }, -- Ressan the Needler, Sri'skulk, Bayne, Farmer Solliden, Lost Soul, Deeb, Muad, Fellicent's Shade, Tormented Spirit - 10357, -- RootId: Ressan the Needler (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - - -- Quest 50176: Arathi Trophy - -- Kill 1 rare in Arathi Highlands - [50176] = { - [1] = "Arathi Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 25, -- Quest level - [5] = 20, -- Min level - [17] = 45, -- Zone (Arathi Highlands) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Arathi Highlands" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 10 rare NPCs in Arathi Highlands - { 2598, 2603, 2600, 2604, 2606, 2779, 2605, 2609, 2602, 2601 }, - 2606, -- RootId: Nimar the Slayer (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - [50150] = { - [1] = "Storm Peak Orders", - [2] = { nil, { 600600 } }, - [4] = 80, - [5] = 77, - [17] = 67, - [8] = { - "Complete any 6 quests in The Storm Peaks.", - "Complete 6 Quests" - }, - [9] = { "Complete 6 Quests", nil }, - }, - - -- Quest 50195: Blade's Edge Trophy - -- Kill 1 rare in Blade's Edge Mountains - [50195] = { - [1] = "Blade's Edge Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 70, -- Quest level - [5] = 67, -- Min level - [17] = 3522, -- Zone (Blade's Edge Mountains) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Blade's Edge Mountains" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 3 rare NPCs in Blade's Edge Mountains - { 18690, 18692, 18693 }, - 18692, -- RootId: Hemathion (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count (only 1 rare needed) - }, - - -- Quest 50044: Fel Scars of Nagrand - -- Kill 40 demons in Nagrand - [50044] = { - [1] = "Fel Scars of Nagrand", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 64, -- Min level - [5] = 67, -- Quest level - [17] = 3518, -- Zone (Nagrand) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 40 Demons in Nagrand" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 14 demon NPCs in Nagrand - { 18683, 17151, 17981, 22357, 18567, 17152, 18535, 18661, 22362, 22394, 18536, 18401, 18660, 16945 }, - 18683, -- RootId: Voidwalker Minion (representative demon) - "Demon slain" - } - } - }, - - [30] = 40, -- Kill count - }, - - -- Quest 50196: Netherstorm Trophy - -- Kill 1 rare in Netherstorm - [50196] = { - [1] = "Netherstorm Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 67, -- Min level - [5] = 70, -- Quest level - [17] = 3523, -- Zone (Netherstorm) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Netherstorm" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 3 rare NPCs in Netherstorm - { 20932, 18698, 18697 }, - 20932, -- RootId: Nuramoc (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50199: Borean Trophy - -- Kill 1 rare in Borean Tundra - [50199] = { - [1] = "Borean Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Min level - [5] = 71, -- Quest level - [17] = 3537, -- Zone (Borean Tundra) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Borean Tundra" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 3 rare NPCs in Borean Tundra - { 32358, 32361, 32357 }, - 32358, -- RootId: Fumblub Gearwind (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50034: Ashen Corruption - -- Kill 40 demons in Ashenvale - [50034] = { - [1] = "Ashen Corruption", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 20, -- Min level - [5] = 25, -- Quest level - [17] = 331, -- Zone (Ashenvale) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 40 Demons in Ashenvale" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 23 demon NPCs in Ashenvale - { 6072, 3772, 3758, 17300, 6073, 3762, 3774, 11697, 3765, 3771, 3767, 3763, 4619, 6071, 3757, 3770, 3755, 3752, 6115, 3759, 10928, 3754, 10647 }, - 6072, -- RootId: Diathorus the Seeker (representative demon) - "Demon slain" - } - } - }, - - [30] = 40, -- Kill count - }, - -- Quest 50197: Shadowmoon Trophy - -- Kill 1 rare in Shadowmoon Valley - [50197] = { - [1] = "Shadowmoon Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 67, -- Min level - [5] = 70, -- Quest level - [17] = 3520, -- Zone (Shadowmoon Valley) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Shadowmoon Valley" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 3 rare NPCs in Shadowmoon Valley - { 18694, 18695, 18696 }, -- Collidus the Warp-Watcher, Ambassador Jerrikar, Kraator - 18694, -- RootId: Collidus the Warp-Watcher (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50020: Spires of Chaos - -- Kill 30 elementals in Thousand Needles - [50020] = { - [1] = "Spires of Chaos", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 25, -- Min level - [5] = 30, -- Quest level - [17] = 400, -- Zone (Thousand Needles) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Elementals in Thousand Needles" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 5 elemental NPCs in Thousand Needles - { 4499, 4120, 10756, 9377, 10757 }, - 4120, -- RootId: Thundering Boulderkin (representative elemental) - "Elemental slain" - } - } - }, - - [30] = 30, -- Kill count - }, - - -- Quest 50173: Northern Jungle Trophy - -- Kill 1 rare in Stranglethorn Vale (Northern) - [50173] = { - [1] = "Northern Jungle Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 25, -- Min level - [5] = 45, -- Quest level - [17] = 33, -- Zone (Stranglethorn Vale) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Stranglethorn Vale" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 9 rare NPCs in Stranglethorn Vale - { 1552, 14488, 9046, 14492, 14487, 14491, 14490, 11383, 2541 }, - 1552, -- RootId: Scale Belly (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50175: Alterac Trophy - -- Kill 1 rare in Alterac Mountains - [50175] = { - [1] = "Alterac Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 25, -- Min level - [5] = 40, -- Quest level - [17] = 36, -- Zone (Alterac Mountains) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Alterac Mountains" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 8 rare NPCs in Alterac Mountains - { 2447, 14223, 14221, 14222, 2453, 2258, 14281, 2452 }, - 2447, -- RootId: Narillasanz (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50089: Tundra Hunters - -- Kill 75 beasts in Borean Tundra - [50089] = { - [1] = "Tundra Hunters", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Min level - [5] = 73, -- Quest level - [17] = 68, -- Zone (Borean Tundra) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 75 Beasts in Borean Tundra" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 43 Beasts in Borean Tundra - { 25454, 32361, 25488, 25968, 25675, 25487, 25203, 25829, 25680, 25489, 25481, 25791, 25482, 24614, 25295, 25774, 25743, 18375, 26174, 25498, 26160, 24637, 24613, 18379, 25862, 25850, 25204, 25596, 25750, 18378, 25464, 27074, 25881, 25817, 24765, 27365, 26047, 25606, 25988, 18376, 18380, 25362, 25990 }, - 25454, -- RootId: Tundra Crawler (representative) - "Beast slain" - } - } - }, - - [30] = 75, -- Kill count - }, - - -- Quest 50183: Southern Jungle Trophy - -- Kill 1 rare in Stranglethorn Vale (Southern) - [50183] = { - [1] = "Southern Jungle Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 25, -- Min level - [5] = 45, -- Quest level - [17] = 33, -- Zone (Stranglethorn Vale) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Stranglethorn Vale" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 9 rare NPCs in Stranglethorn Vale - { 1552, 14488, 9046, 14487, 14492, 14490, 14491, 2541, 11383 }, - 1552, -- RootId: Scale Belly (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50200: Fjord Trophy - -- Kill 1 rare in Howling Fjord - [50200] = { - [1] = "Fjord Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 68, -- Min level - [5] = 72, -- Quest level - [17] = 495, -- Zone (Howling Fjord) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Howling Fjord" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 3 rare NPCs in Howling Fjord - { 32398, 32377, 32386 }, - 32398, -- RootId: King Ping (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50045: Demon's at the Edge - -- Kill 40 demons in Blade's Edge Mountains - [50045] = { - [1] = "Demon's at the Edge", - [2] = { nil, { 600600 } }, - [4] = 65, -- Min level - [5] = 68, -- Quest level - [17] = 3522, -- Zone (Blade's Edge Mountains) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 40 Demons in Blade's Edge Mountains" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 37 Demons in Blade's Edge Mountains - { 20557, 22180, 19973, 22195, 23355, 19960, 19979, 19963, 22291, 22304, 16952, 23353, 23174, 23173, 21021, 19747, 19978, 23078, 23055, 23212, 21837, 22500, 19980, 23199, 12922, 21519, 19961, 22204, 22499, 23220, 23113, 21516, 22281, 23230, 23354, 22474, 23275 }, - 20557, -- RootId: Wrath Hound (representative demon) - "Demon slain" - } - } - }, - - [30] = 40, -- Kill count - }, - - -- Quest 50063: Frostbound Brood - -- Kill 30 dragonkin in Borean Tundra - [50063] = { - [1] = "Frostbound Brood", - [2] = { nil, { 600600 } }, - [4] = 68, - [5] = 71, - [17] = 3537, -- Zone (Borean Tundra) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Dragonkin in Borean Tundra" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 16 Dragonkin in Borean Tundra - { 25728, 26127, 25711, 25721, 25448, 32534, 25585, 26232, 25712, 25717, 25722, 24770, 25716, 26231, 25713, 26310 }, - 25728, -- RootId: Coldarra Wyrmkin (representative dragonkin) - "Dragonkin slain" - } - } - }, - - [30] = 30, -- Kill count - }, - - -- Quest 50019: Marshborn Menace - -- Kill 30 elementals in Dustwallow Marsh - [50019] = { - [1] = "Marshborn Menace", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 35, -- Min level - [5] = 40, -- Quest level - [17] = 15, -- Zone (Dustwallow Marsh) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Elementals in Dustwallow Marsh" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 5 elemental NPCs in Dustwallow Marsh - { 4382, 4385, 4386, 4387, 14231 }, - 4382, -- RootId: Withervine Creeper (representative elemental) - "Elemental slain" - } - } - }, - - [30] = 30, -- Kill count - }, - - - -- Quest 50052: Black Dragonflight Remnants - -- Kill 30 dragonkin in Badlands - [50052] = { - [1] = "Black Dragonflight Remnants", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 35, -- Min level - [5] = 40, -- Quest level - [17] = 3, -- Zone (Badlands) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Dragonkin in Badlands" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 4 dragonkin NPCs in Badlands - { 2757, 2725, 2759, 2726 }, - 2725, -- RootId: Scalding Whelp - "Dragonkin slain" - } - } - }, - - [30] = 30, -- Kill count - }, - - -- Quest 50068: Savage Badlands - -- Kill 75 beasts in Badlands - [50068] = { - [1] = "Savage Badlands", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 35, -- Min level - [5] = 40, -- Quest level - [17] = 3, -- Zone (Badlands) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 75 Beasts in Badlands" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 15 beast NPCs in Badlands - { 2850, 2931, 2753, 2831, 2731, 2729, 2727, 2830, 2732, 2728, 2734, 2730, 2829, 6013, 9297 }, - 2727, -- RootId: Crag Coyote - "Beast slain" - } - } - }, - - [30] = 75, -- Kill count - }, - - -- Quest 50051: Marshscale Menace - -- Kill 30 dragonkin in Dustwallow Marsh - [50051] = { - [1] = "Marshscale Menace", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 35, -- Min level - [5] = 40, -- Quest level - [17] = 15, -- Zone (Dustwallow Marsh) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 30 Dragonkin in Dustwallow Marsh" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 11 hostile dragonkin NPCs in Dustwallow Marsh - { 4324, 10321, 4334, 4328, 4323, 23789, 4339, 4331, 4329, 23969, 23687 }, - 4324, -- RootId: Searing Whelp - "Dragonkin slain" - } - } - }, - - [30] = 30, -- Kill count - }, - - -- Quest 50178: Badlands Trophy - -- Kill 1 rare in Badlands - [50178] = { - [1] = "Badlands Trophy", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 35, -- Min level - [5] = 40, -- Quest level - [17] = 3, -- Zone (Badlands) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Kill 1 Rare in Badlands" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - -- 10 rare NPCs in the Badlands - { 2850, 2931, 14224, 2754, 2753, 2752, 2749, 7057, 2744, 2751 }, - 2850, -- RootId: Broken Tooth (representative rare) - "Rare slain" - } - } - }, - - [30] = 1, -- Kill count - }, - - -- Quest 50128: Southern Jungle - -- Complete 6 quests in Stranglethorn Vale (Southern) - [50128] = { - [1] = "Southern Jungle", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 45, -- Quest level - [5] = 25, -- Min level - [17] = 33, -- Zone (Stranglethorn Vale) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward. If you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.", - "Complete 6 quests in Stranglethorn Vale (Southern)" - }, - [9] = { "Complete 6 quests in Stranglethorn Vale (Southern)", nil }, - }, - - -- Quest 50130: Felwood Restoration - -- Complete 6 quests in Felwood - [50130] = { - [1] = "Felwood Restoration", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 55, -- Quest level - [5] = 48, -- Min level - [17] = 361, -- Zone (Felwood) - [8] = { - "This is a custom objective. Upon completion, you will automatically receive the assigned reward.\n\nIf you die, the quest will be removed from your quest log. This quest is automatically rewarded upon completion.\n\nThis quest cannot be completed inside starting area.", - "Complete 6 quests in Felwood" - }, - [9] = { "Complete 6 quests in Felwood", nil }, - }, - - -- Quest 50006: Sandstone Giants - -- Kill Giants in Tanaris - [50006] = { - [1] = "Sandstone Giants", -- Quest name - [2] = { nil, { 600600 } }, -- startedBy: {{npcIds}, {objectIds}, {itemIds}} - [4] = 45, -- Quest level - [5] = 40, -- Min level - [17] = 440, -- Zone (Tanaris) - [8] = { - "Kill Giants in Tanaris.", - "Kill Sandstone Giants" - }, - [10] = { - nil, -- [1] creatureObjective (not used) - nil, -- [2] objectObjective (not used) - nil, -- [3] itemObjective (not used) - nil, -- [4] reputationObjective (not used) - { -- [5] killCreditObjective - { - { 5466, 5467, 5469, 5470 }, -- All giant NPC IDs: Coast Strider, Deep Dweller, Dune Smasher, Raging Dune Smasher - 5469, -- Root ID (Icon/Text) - "Sandstone Giants slain" - } - } - }, - [30] = 30, -- Objective Count - - }, -} - --- Backward compatibility -EbonholdQuestDB = EbonholdQuestDB or {} -EbonholdQuestDB.questData = EbonholdDB.questData diff --git a/Database/Ebonhold/EbonholdLoader.lua b/Database/Ebonhold/EbonholdLoader.lua deleted file mode 100644 index 557a34d..0000000 --- a/Database/Ebonhold/EbonholdLoader.lua +++ /dev/null @@ -1,323 +0,0 @@ ----@class EbonholdLoader ----@type table -local EbonholdLoader = QuestieLoader:CreateModule("EbonholdLoader") - ----@type QuestieDB -local QuestieDB = QuestieLoader:ImportModule("QuestieDB") - ----@type table -local EbonholdDB = QuestieLoader:ImportModule("EbonholdDB") -_G.EbonholdDB = _G.EbonholdDB or EbonholdDB - -local _overridesInjected = false -local _zonesApplied = false - -local function _LoadIfString(data, label) - if not data then return nil end - if type(data) == "string" then - local fn, err = loadstring(data) - if not fn then - if Questie and Questie.Debug then - Questie:Debug(Questie.DEBUG_CRITICAL, - "[EbonholdLoader] loadstring failed for " .. tostring(label) .. ": " .. tostring(err)) - end - return nil - end - local ok, tbl = pcall(fn) - if not ok then - if Questie and Questie.Debug then - Questie:Debug(Questie.DEBUG_CRITICAL, - "[EbonholdLoader] executing chunk failed for " .. tostring(label) .. ": " .. tostring(tbl)) - end - return nil - end - return tbl - end - return data -end - -local function _MergeInto(dst, src) - if type(dst) ~= "table" or type(src) ~= "table" then return end - for id, entry in pairs(src) do - dst[id] = entry - end -end - --- Apply Ebonhold custom uiMapId->areaId mappings into ZoneDB (used by map/Journey) -function EbonholdLoader:ApplyZoneTables() - if _zonesApplied then return end - if not EbonholdZoneTables or not EbonholdZoneTables.uiMapIdToAreaId then return end - - local ZoneDB = QuestieLoader:ImportModule("ZoneDB") - if not ZoneDB then return end - - ZoneDB.private = ZoneDB.private or {} - ZoneDB.private.uiMapIdToAreaId = ZoneDB.private.uiMapIdToAreaId or {} - ZoneDB.private.areaIdToUiMapId = ZoneDB.private.areaIdToUiMapId or {} - ZoneDB.private.subZoneToParentZone = ZoneDB.private.subZoneToParentZone or {} - ZoneDB.private.dungeons = ZoneDB.private.dungeons or {} - ZoneDB.private.dungeonLocations = ZoneDB.private.dungeonLocations or {} - ZoneDB.private.dungeonParentZones = ZoneDB.private.dungeonParentZones or {} - - for uiMapId, areaId in pairs(EbonholdZoneTables.uiMapIdToAreaId) do - if uiMapId and areaId then - -- Always set these mappings (remove the nil check to ensure they're set) - ZoneDB.private.uiMapIdToAreaId[uiMapId] = areaId - - -- Ebonhold uses custom map ids for spawns/waypoints (e.g. 1238 for Northshire Valley). - -- QuestieMap draws by converting AreaId->UiMapId, so register these ids as self-mapping. - ZoneDB.private.areaIdToUiMapId[uiMapId] = uiMapId - - -- If this uiMapId represents a *dungeon* map, prefer it for that dungeon's AreaId. - -- This keeps normal zones intact (e.g. Elwynn stays 1429), while letting Ebonhold - -- provide real instance maps (e.g. mapID 691 for The Stockade). - if type(ZoneDB.private.dungeons) == "table" and ZoneDB.private.dungeons[areaId] then - ZoneDB.private.areaIdToUiMapId[areaId] = uiMapId - end - - -- Register subzone to parent zone mapping so GetParentZoneId works with Ebonhold zones - if uiMapId ~= areaId then - ZoneDB.private.subZoneToParentZone[uiMapId] = areaId - end - end - end - - -- Optional: allow Ebonhold to define custom dungeon zones/entrances without touching core tables. - if type(EbonholdZoneTables.dungeons) == "table" then - for areaId, data in pairs(EbonholdZoneTables.dungeons) do - if areaId and data then - ZoneDB.private.dungeons[areaId] = data - end - end - end - - if type(EbonholdZoneTables.dungeonLocations) == "table" then - for areaId, data in pairs(EbonholdZoneTables.dungeonLocations) do - if areaId and data then - ZoneDB.private.dungeonLocations[areaId] = data - end - end - end - - if type(EbonholdZoneTables.dungeonParentZones) == "table" then - for subZoneId, parentZoneId in pairs(EbonholdZoneTables.dungeonParentZones) do - if subZoneId and parentZoneId then - ZoneDB.private.dungeonParentZones[subZoneId] = parentZoneId - end - end - end - - -- Also map parentMapIDs (e.g. 10138) to a usable uiMapId to avoid fallback errors. - if EbonholdUiMapData and EbonholdUiMapData.uiMapData then - for uiMapId, data in pairs(EbonholdUiMapData.uiMapData) do - if uiMapId and ZoneDB.private.areaIdToUiMapId[uiMapId] == nil then - ZoneDB.private.areaIdToUiMapId[uiMapId] = uiMapId - end - if data and type(data.parentMapID) == "number" and ZoneDB.private.areaIdToUiMapId[data.parentMapID] == nil then - ZoneDB.private.areaIdToUiMapId[data.parentMapID] = uiMapId - end - end - end - - -- Register zone sort names for custom zones - if EbonholdZoneTables.zoneSort then - ZoneDB.private.zoneSort = ZoneDB.private.zoneSort or {} - for zoneId, zoneName in pairs(EbonholdZoneTables.zoneSort) do - ZoneDB.private.zoneSort[zoneId] = zoneName - end - end - -- Clear cached zone lookups after adding custom zones - if QuestieDB and QuestieDB.private and QuestieDB.private.zoneCache then - QuestieDB.private.zoneCache = {} - end - - -- Clear auto-blacklist since zone validation might have changed - if QuestieDB and QuestieDB.autoBlacklist then - QuestieDB.autoBlacklist = {} - end - _zonesApplied = true -end - --- Inject Ebonhold tables into QuestieDB *Overrides* so QueryQuestSingle/QueryNPCSingle can see them -function EbonholdLoader:InjectOverrides() - if _overridesInjected then return end - _overridesInjected = true - - -- Apply zone tables FIRST, before any ZoneDB functions use the local variables - EbonholdLoader:ApplyZoneTables() - - QuestieDB.npcDataOverrides = QuestieDB.npcDataOverrides or {} - QuestieDB.objectDataOverrides = QuestieDB.objectDataOverrides or {} - QuestieDB.itemDataOverrides = QuestieDB.itemDataOverrides or {} - QuestieDB.questDataOverrides = QuestieDB.questDataOverrides or {} - - local npcData = _LoadIfString(EbonholdDB and EbonholdDB.npcData, "EbonholdDB.npcData") - local objectData = _LoadIfString(EbonholdDB and EbonholdDB.objectData, "EbonholdDB.objectData") - local itemData = _LoadIfString(EbonholdDB and EbonholdDB.itemData, "EbonholdDB.itemData") - local questData = _LoadIfString(EbonholdDB and EbonholdDB.questData, "EbonholdDB.questData") - - _MergeInto(QuestieDB.npcDataOverrides, npcData) - _MergeInto(QuestieDB.objectDataOverrides, objectData) - _MergeInto(QuestieDB.itemDataOverrides, itemData) - _MergeInto(QuestieDB.questDataOverrides, questData) - - -- Keep a lightweight list of custom quest ids for search/UI (DO NOT touch QuestPointers; those are numeric stream pointers) - if type(questData) == "table" then - QuestieDB.ebonholdQuestIds = QuestieDB.ebonholdQuestIds or {} - for questId, _ in pairs(questData) do - if type(questId) == "number" then - QuestieDB.ebonholdQuestIds[questId] = true - end - end - end - - -- Keep a lightweight list of custom NPC ids for search/UI - if type(npcData) == "table" then - QuestieDB.ebonholdNpcIds = QuestieDB.ebonholdNpcIds or {} - for npcId, _ in pairs(npcData) do - if type(npcId) == "number" then - QuestieDB.ebonholdNpcIds[npcId] = true - end - end - end - - -- Keep a lightweight list of custom object ids for search/UI - if type(objectData) == "table" then - QuestieDB.ebonholdObjectIds = QuestieDB.ebonholdObjectIds or {} - for objectId, _ in pairs(objectData) do - if type(objectId) == "number" then - QuestieDB.ebonholdObjectIds[objectId] = true - end - end - end - - -- Keep a lightweight list of custom item ids for search/UI - if type(itemData) == "table" then - QuestieDB.ebonholdItemIds = QuestieDB.ebonholdItemIds or {} - for itemId, _ in pairs(itemData) do - if type(itemId) == "number" then - QuestieDB.ebonholdItemIds[itemId] = true - end - end - end -end - --- Hook ZoneDB.Initialize to inject custom zones BEFORE standard zones are processed -do - local ZoneDB = QuestieLoader:ImportModule("ZoneDB") - if ZoneDB then - local originalZoneInitialize = ZoneDB.Initialize - if type(originalZoneInitialize) == "function" then - function ZoneDB:Initialize(...) - -- Apply custom zones FIRST, before standard zone processing - EbonholdLoader:ApplyZoneTables() - - -- Then initialize standard zones - return originalZoneInitialize(self, ...) - end - end - end -end - --- Hook QuestieDB.Initialize to guarantee timing for overrides -do - local originalInitialize = QuestieDB and QuestieDB.Initialize - if type(originalInitialize) == "function" then - function QuestieDB:Initialize(...) - -- 1) Inject overrides before the DB handles are created - EbonholdLoader:InjectOverrides() - - local ret = originalInitialize(self, ...) - - -- 2) Refresh Journey caches (zoneMap/zones) so "Quests by Zone" sees the new data - local ZoneDB = QuestieLoader:ImportModule("ZoneDB") - local QuestieJourney = QuestieLoader:ImportModule("QuestieJourney") - if ZoneDB and QuestieJourney then - QuestieJourney.zoneMap = ZoneDB:GetZonesWithQuests(true) - QuestieJourney.zones = ZoneDB:GetRelevantZones() - - -- Clear the UI cache so the tree gets rebuilt - if QuestieJourney.private then - QuestieJourney.private.treeCache = nil - QuestieJourney.private.lastZoneSelection = {} - end - - -- If the Journey window is open, rebuild the current tab - if QuestieJourneyFrame and QuestieJourneyFrame:IsShown() and QuestieJourney.tabGroup then - local p = QuestieJourney.private - if p and p.containerCache and p.lastOpenWindow then - p:HandleTabChange(p.containerCache, p.lastOpenWindow) - end - end - end - - return ret - end - end -end - --- >>> NEW: Make QuestieDB.GetQuest work for Ebonhold override quests (Journey needs this) -do - local originalGetQuest = QuestieDB.GetQuest - if type(originalGetQuest) == "function" then - function QuestieDB.GetQuest(questId) - local q = originalGetQuest(questId) - if q then return q end - - -- Fallback: build a minimal quest object from QueryQuestSingle (works with overrides) - local name = QuestieDB.QueryQuestSingle(questId, "name") - if not name then return nil end - - local level = QuestieDB.QueryQuestSingle(questId, "level") or - QuestieDB.QueryQuestSingle(questId, "questLevel") - local reqLevel = QuestieDB.QueryQuestSingle(questId, "requiredLevel") or - QuestieDB.QueryQuestSingle(questId, "minLevel") - local desc = QuestieDB.QueryQuestSingle(questId, "objectiveText") or - QuestieDB.QueryQuestSingle(questId, "description") or QuestieDB.QueryQuestSingle(questId, "details") - - -- Build the Starts field from startedBy (CRITICAL for available quests to show icons!) - local startedBy = QuestieDB.QueryQuestSingle(questId, "startedBy") - - local starts = { - NPC = startedBy and startedBy[1] or {}, - GameObject = startedBy and startedBy[2] or {}, - Item = startedBy and startedBy[3] or {}, - } - - -- Also get other fields needed for quest display - local finishedBy = QuestieDB.QueryQuestSingle(questId, "finishedBy") - local specialFlags = QuestieDB.QueryQuestSingle(questId, "specialFlags") - local isRepeatable = specialFlags and (bit.band(specialFlags, 1) ~= 0) or false - - -- Questie modules expect these common fields - return { - Id = questId, - id = questId, - name = name, - level = level or reqLevel or 0, - requiredLevel = reqLevel or 0, - Description = desc, -- Journey tooltip reads quest.Description - Starts = starts, -- CRITICAL: AvailableQuests needs this! - finishedBy = finishedBy, - IsRepeatable = isRepeatable, - } - end - end -end - - --- Ensure zones also get applied when Questie finishes loading (covers edge cases) -do - local f = CreateFrame("Frame") - f:RegisterEvent("ADDON_LOADED") - f:SetScript("OnEvent", function(_, _, name) - if name ~= "Questie-335" then return end - if C_Timer and C_Timer.After then - C_Timer.After(0, function() EbonholdLoader:ApplyZoneTables() end) - else - EbonholdLoader:ApplyZoneTables() - end - end) -end - -return EbonholdLoader diff --git a/Database/Ebonhold/Zones/EbonholdUiMapData.lua b/Database/Ebonhold/Zones/EbonholdUiMapData.lua deleted file mode 100644 index 5991bbc..0000000 --- a/Database/Ebonhold/Zones/EbonholdUiMapData.lua +++ /dev/null @@ -1,36 +0,0 @@ ----@class EbonholdUiMapData -EbonholdUiMapData = EbonholdUiMapData or {} - -EbonholdUiMapData.uiMapData = { - -- Ebonhold custom dungeon maps - -- Example from Ascension (Reference only for structure): - -- [691] = { - -- [1] = 375.0, - -- [2] = 251.0, - -- [3] = 189.0, - -- [4] = 220.0, - -- instance = 34, - -- mapID = 691.1, - -- name = "The Stockade", - -- mapType = 3, - -- parentMapID = 717, - -- }, -} - -local function ApplyUiMapData() - if not QuestieCompat then return end - if not EbonholdUiMapData or not EbonholdUiMapData.uiMapData then return end - - QuestieCompat.UiMapData = QuestieCompat.UiMapData or {} - - for uiMapId, data in pairs(EbonholdUiMapData.uiMapData) do - if QuestieCompat.UiMapData[uiMapId] == nil then - QuestieCompat.UiMapData[uiMapId] = data - end - end -end - -if QuestieCompat and QuestieCompat.LoadUiMapData then - hooksecurefunc(QuestieCompat, "LoadUiMapData", ApplyUiMapData) -end -ApplyUiMapData() diff --git a/Database/Ebonhold/Zones/EbonholdZoneTables.lua b/Database/Ebonhold/Zones/EbonholdZoneTables.lua deleted file mode 100644 index 0f266c2..0000000 --- a/Database/Ebonhold/Zones/EbonholdZoneTables.lua +++ /dev/null @@ -1,17 +0,0 @@ ----@class EbonholdZoneTables -EbonholdZoneTables = EbonholdZoneTables or {} - -EbonholdZoneTables.uiMapIdToAreaId = EbonholdZoneTables.uiMapIdToAreaId or { - -- Example mappings: - -- [1238] = 12, -- Custom Northshire Valley Map -> Elwynn Forest AreaID -} - --- Register zone sort names for custom zones so they can be used in quest zoneOrSort field -EbonholdZoneTables.zoneSort = EbonholdZoneTables.zoneSort or { - -- [1238] = "Northshire Valley", -} - --- Optional: custom dungeon registration (merged into ZoneDB by EbonholdLoader). -EbonholdZoneTables.dungeons = EbonholdZoneTables.dungeons or {} -EbonholdZoneTables.dungeonLocations = EbonholdZoneTables.dungeonLocations or {} -EbonholdZoneTables.dungeonParentZones = EbonholdZoneTables.dungeonParentZones or {} diff --git a/Database/QuestieDB.lua b/Database/QuestieDB.lua index 8ab350b..5f10b0a 100644 --- a/Database/QuestieDB.lua +++ b/Database/QuestieDB.lua @@ -1163,6 +1163,10 @@ function QuestieDB.GetQuest(questId) -- /dump QuestieDB.GetQuest(867) if (not rawdata) then Questie:Debug(Questie.DEBUG_CRITICAL, "[QuestieDB.GetQuest] rawdata is nil for questID:", questId) + if questId == 0 then + Questie:Error("[QuestieDB.GetQuest] rawdata is nil for questID:", questId) + print(debugstack()) + end return nil end @@ -1322,6 +1326,7 @@ function QuestieDB.GetQuest(questId) -- /dump QuestieDB.GetQuest(867) Type = "killcredit", IdList = creditObjective[1], RootId = creditObjective[2], + Id = creditObjective[2] or (creditObjective[1] and creditObjective[1][1]) or 0, Text = creditObjective[3] } @@ -1481,6 +1486,14 @@ function QuestieDB:GetCreatureLevels(quest) end end end + if quest.objectives[5] then -- Kill credit objectives + for _, creditObjective in pairs(quest.objectives[5]) do + local npcIds = creditObjective[1] + if npcIds then + _CollectCreatureLevels(npcIds) + end + end + end end if quest.Id then QuestieDB._CreatureLevelCache[quest.Id] = creatureLevels diff --git a/Libs/Ace3.lua b/Libs/Ace3.lua deleted file mode 100644 index 3461a23..0000000 --- a/Libs/Ace3.lua +++ /dev/null @@ -1,110 +0,0 @@ - --- This file is only there in standalone Ace3 and provides handy dev tool stuff I guess --- for now only /rl to reload your UI :) --- note the complete overkill use of AceAddon and console, ain't it cool? - --- GLOBALS: next, loadstring, ReloadUI, geterrorhandler --- GLOBALS: BINDING_HEADER_ACE3, BINDING_NAME_RELOADUI, Ace3, LibStub - --- BINDINGs labels -BINDING_HEADER_ACE3 = "Ace3" -BINDING_NAME_RELOADUI = "ReloadUI" --- - -local gui = LibStub("AceGUI-3.0") -local reg = LibStub("AceConfigRegistry-3.0") -local dialog = LibStub("AceConfigDialog-3.0") - -Ace3 = LibStub("AceAddon-3.0"):NewAddon("Ace3", "AceConsole-3.0") -local Ace3 = Ace3 - -local selectedgroup -local frame -local select -local status = {} -local configs = {} - -local function frameOnClose() - gui:Release(frame) - frame = nil -end - -local function RefreshConfigs() - for name in reg:IterateOptionsTables() do - configs[name] = name - end -end - -local function ConfigSelected(widget, event, value) - selectedgroup = value - dialog:Open(value, widget) -end - -local old_CloseSpecialWindows - --- GLOBALS: CloseSpecialWindows, next -function Ace3:Open() - if not old_CloseSpecialWindows then - old_CloseSpecialWindows = CloseSpecialWindows - CloseSpecialWindows = function() - local found = old_CloseSpecialWindows() - if frame then - frame:Hide() - return true - end - return found - end - end - RefreshConfigs() - if next(configs) == nil then - self:Print("No Configs are Registered") - return - end - - if not frame then - frame = gui:Create("Frame") - frame:ReleaseChildren() - frame:SetTitle("Ace3 Options") - frame:SetLayout("FILL") - frame:SetCallback("OnClose", frameOnClose) - - select = gui:Create("DropdownGroup") - select:SetGroupList(configs) - select:SetCallback("OnGroupSelected", ConfigSelected) - frame:AddChild(select) - end - if not selectedgroup then - selectedgroup = next(configs) - end - select:SetGroup(selectedgroup) - frame:Show() -end - -local function RefreshOnUpdate(this) - select:SetGroup(selectedgroup) - this:SetScript("OnUpdate", nil) -end - -function Ace3:ConfigTableChanged(event, appName) - if selectedgroup == appName and frame then - frame.frame:SetScript("OnUpdate", RefreshOnUpdate) - end -end - -reg.RegisterCallback(Ace3, "ConfigTableChange", "ConfigTableChanged") - -function Ace3:PrintCmd(input) - input = input:trim():match("^(.-);*$") - local func, err = loadstring("LibStub(\"AceConsole-3.0\"):Print(" .. input .. ")") - if not func then - LibStub("AceConsole-3.0"):Print("Error: " .. err) - else - func() - end -end - -function Ace3:OnInitialize() - self:RegisterChatCommand("ace3", function() self:Open() end) - self:RegisterChatCommand("rl", function() ReloadUI() end) - self:RegisterChatCommand("print", "PrintCmd") -end diff --git a/Libs/Ace3.toc b/Libs/Ace3.toc deleted file mode 100644 index 31668e7..0000000 --- a/Libs/Ace3.toc +++ /dev/null @@ -1,28 +0,0 @@ -## Interface: 90207 - -## Title: Lib: Ace3 -## Notes: AddOn development framework -## Author: Ace3 Development Team -## X-Website: http://www.wowace.com -## X-Category: Library -## X-License: Limited BSD -## Version: Release-r1294 - -LibStub\LibStub.lua -CallbackHandler-1.0\CallbackHandler-1.0.xml -AceAddon-3.0\AceAddon-3.0.xml -AceEvent-3.0\AceEvent-3.0.xml -AceTimer-3.0\AceTimer-3.0.xml -AceBucket-3.0\AceBucket-3.0.xml -AceHook-3.0\AceHook-3.0.xml -AceDB-3.0\AceDB-3.0.xml -AceDBOptions-3.0\AceDBOptions-3.0.xml -AceLocale-3.0\AceLocale-3.0.xml -AceConsole-3.0\AceConsole-3.0.xml -AceGUI-3.0\AceGUI-3.0.xml -AceConfig-3.0\AceConfig-3.0.xml -AceComm-3.0\AceComm-3.0.xml -AceTab-3.0\AceTab-3.0.xml -AceSerializer-3.0\AceSerializer-3.0.xml - -Ace3.lua diff --git a/Libs/Ace3_TBC.toc b/Libs/Ace3_TBC.toc deleted file mode 100644 index adf8b21..0000000 --- a/Libs/Ace3_TBC.toc +++ /dev/null @@ -1,28 +0,0 @@ -## Interface: 20504 - -## Title: Lib: Ace3 -## Notes: AddOn development framework -## Author: Ace3 Development Team -## X-Website: http://www.wowace.com -## X-Category: Library -## X-License: Limited BSD -## Version: Release-r1294 - -LibStub\LibStub.lua -CallbackHandler-1.0\CallbackHandler-1.0.xml -AceAddon-3.0\AceAddon-3.0.xml -AceEvent-3.0\AceEvent-3.0.xml -AceTimer-3.0\AceTimer-3.0.xml -AceBucket-3.0\AceBucket-3.0.xml -AceHook-3.0\AceHook-3.0.xml -AceDB-3.0\AceDB-3.0.xml -AceDBOptions-3.0\AceDBOptions-3.0.xml -AceLocale-3.0\AceLocale-3.0.xml -AceConsole-3.0\AceConsole-3.0.xml -AceGUI-3.0\AceGUI-3.0.xml -AceConfig-3.0\AceConfig-3.0.xml -AceComm-3.0\AceComm-3.0.xml -AceTab-3.0\AceTab-3.0.xml -AceSerializer-3.0\AceSerializer-3.0.xml - -Ace3.lua diff --git a/Libs/Ace3_Vanilla.toc b/Libs/Ace3_Vanilla.toc deleted file mode 100644 index 79929b3..0000000 --- a/Libs/Ace3_Vanilla.toc +++ /dev/null @@ -1,28 +0,0 @@ -## Interface: 11403 - -## Title: Lib: Ace3 -## Notes: AddOn development framework -## Author: Ace3 Development Team -## X-Website: http://www.wowace.com -## X-Category: Library -## X-License: Limited BSD -## Version: Release-r1294 - -LibStub\LibStub.lua -CallbackHandler-1.0\CallbackHandler-1.0.xml -AceAddon-3.0\AceAddon-3.0.xml -AceEvent-3.0\AceEvent-3.0.xml -AceTimer-3.0\AceTimer-3.0.xml -AceBucket-3.0\AceBucket-3.0.xml -AceHook-3.0\AceHook-3.0.xml -AceDB-3.0\AceDB-3.0.xml -AceDBOptions-3.0\AceDBOptions-3.0.xml -AceLocale-3.0\AceLocale-3.0.xml -AceConsole-3.0\AceConsole-3.0.xml -AceGUI-3.0\AceGUI-3.0.xml -AceConfig-3.0\AceConfig-3.0.xml -AceComm-3.0\AceComm-3.0.xml -AceTab-3.0\AceTab-3.0.xml -AceSerializer-3.0\AceSerializer-3.0.xml - -Ace3.lua diff --git a/Libs/Ace3_Wrath.toc b/Libs/Ace3_Wrath.toc deleted file mode 100644 index cba091d..0000000 --- a/Libs/Ace3_Wrath.toc +++ /dev/null @@ -1,28 +0,0 @@ -## Interface: 30400 - -## Title: Lib: Ace3 -## Notes: AddOn development framework -## Author: Ace3 Development Team -## X-Website: http://www.wowace.com -## X-Category: Library -## X-License: Limited BSD -## Version: Release-r1294 - -LibStub\LibStub.lua -CallbackHandler-1.0\CallbackHandler-1.0.xml -AceAddon-3.0\AceAddon-3.0.xml -AceEvent-3.0\AceEvent-3.0.xml -AceTimer-3.0\AceTimer-3.0.xml -AceBucket-3.0\AceBucket-3.0.xml -AceHook-3.0\AceHook-3.0.xml -AceDB-3.0\AceDB-3.0.xml -AceDBOptions-3.0\AceDBOptions-3.0.xml -AceLocale-3.0\AceLocale-3.0.xml -AceConsole-3.0\AceConsole-3.0.xml -AceGUI-3.0\AceGUI-3.0.xml -AceConfig-3.0\AceConfig-3.0.xml -AceComm-3.0\AceComm-3.0.xml -AceTab-3.0\AceTab-3.0.xml -AceSerializer-3.0\AceSerializer-3.0.xml - -Ace3.lua diff --git a/Libs/AceHook-3.0/AceHook-3.0.lua b/Libs/AceHook-3.0/AceHook-3.0.lua deleted file mode 100644 index 7d26d91..0000000 --- a/Libs/AceHook-3.0/AceHook-3.0.lua +++ /dev/null @@ -1,510 +0,0 @@ ---- **AceHook-3.0** offers safe Hooking/Unhooking of functions, methods and frame scripts. --- Using AceHook-3.0 is recommended when you need to unhook your hooks again, so the hook chain isn't broken --- when you manually restore the original function. --- --- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by --- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object --- and can be accessed directly, without having to explicitly call AceHook itself.\\ --- It is recommended to embed AceHook, otherwise you'll have to specify a custom `self` on all calls you --- make into AceHook. --- @class file --- @name AceHook-3.0 --- @release $Id: AceHook-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ -local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9 -local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) - -if not AceHook then return end -- No upgrade needed - -AceHook.embeded = AceHook.embeded or {} -AceHook.registry = AceHook.registry or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end }) -AceHook.handlers = AceHook.handlers or {} -AceHook.actives = AceHook.actives or {} -AceHook.scripts = AceHook.scripts or {} -AceHook.onceSecure = AceHook.onceSecure or {} -AceHook.hooks = AceHook.hooks or {} - --- local upvalues -local registry = AceHook.registry -local handlers = AceHook.handlers -local actives = AceHook.actives -local scripts = AceHook.scripts -local onceSecure = AceHook.onceSecure - --- Lua APIs -local pairs, next, type = pairs, next, type -local format = string.format -local assert, error = assert, error - --- WoW APIs -local issecurevariable, hooksecurefunc = issecurevariable, hooksecurefunc -local _G = _G - --- functions for later definition -local donothing, createHook, hook - -local protectedScripts = { - OnClick = true, -} - --- upgrading of embeded is done at the bottom of the file - -local mixins = { - "Hook", "SecureHook", - "HookScript", "SecureHookScript", - "Unhook", "UnhookAll", - "IsHooked", - "RawHook", "RawHookScript" -} - --- AceHook:Embed( target ) --- target (object) - target object to embed AceHook in --- --- Embeds AceEevent into the target object making the functions from the mixins list available on target:.. -function AceHook:Embed( target ) - for k, v in pairs( mixins ) do - target[v] = self[v] - end - self.embeded[target] = true - -- inject the hooks table safely - target.hooks = target.hooks or {} - return target -end - --- AceHook:OnEmbedDisable( target ) --- target (object) - target object that is being disabled --- --- Unhooks all hooks when the target disables. --- this method should be called by the target manually or by an addon framework -function AceHook:OnEmbedDisable( target ) - target:UnhookAll() -end - -function createHook(self, handler, orig, secure, failsafe) - local uid - local method = type(handler) == "string" - if failsafe and not secure then - -- failsafe hook creation - uid = function(...) - if actives[uid] then - if method then - self[handler](self, ...) - else - handler(...) - end - end - return orig(...) - end - -- /failsafe hook - else - -- all other hooks - uid = function(...) - if actives[uid] then - if method then - return self[handler](self, ...) - else - return handler(...) - end - elseif not secure then -- backup on non secure - return orig(...) - end - end - -- /hook - end - return uid -end - -function donothing() end - -function hook(self, obj, method, handler, script, secure, raw, forceSecure, usage) - if not handler then handler = method end - - -- These asserts make sure AceHooks's devs play by the rules. - assert(not script or type(script) == "boolean") - assert(not secure or type(secure) == "boolean") - assert(not raw or type(raw) == "boolean") - assert(not forceSecure or type(forceSecure) == "boolean") - assert(usage) - - -- Error checking Battery! - if obj and type(obj) ~= "table" then - error(format("%s: 'object' - nil or table expected got %s", usage, type(obj)), 3) - end - if type(method) ~= "string" then - error(format("%s: 'method' - string expected got %s", usage, type(method)), 3) - end - if type(handler) ~= "string" and type(handler) ~= "function" then - error(format("%s: 'handler' - nil, string, or function expected got %s", usage, type(handler)), 3) - end - if type(handler) == "string" and type(self[handler]) ~= "function" then - error(format("%s: 'handler' - Handler specified does not exist at self[handler]", usage), 3) - end - if script then - if not obj or not obj.GetScript or not obj:HasScript(method) then - error(format("%s: You can only hook a script on a frame object", usage), 3) - end - if not secure and obj.IsProtected and obj:IsProtected() and protectedScripts[method] then - error(format("Cannot hook secure script %q; Use SecureHookScript(obj, method, [handler]) instead.", method), 3) - end - else - local issecure - if obj then - issecure = onceSecure[obj] and onceSecure[obj][method] or issecurevariable(obj, method) - else - issecure = onceSecure[method] or issecurevariable(method) - end - if issecure then - if forceSecure then - if obj then - onceSecure[obj] = onceSecure[obj] or {} - onceSecure[obj][method] = true - else - onceSecure[method] = true - end - elseif not secure then - error(format("%s: Attempt to hook secure function %s. Use `SecureHook' or add `true' to the argument list to override.", usage, method), 3) - end - end - end - - local uid - if obj then - uid = registry[self][obj] and registry[self][obj][method] - else - uid = registry[self][method] - end - - if uid then - if actives[uid] then - -- Only two sane choices exist here. We either a) error 100% of the time or b) always unhook and then hook - -- choice b would likely lead to odd debuging conditions or other mysteries so we're going with a. - error(format("Attempting to rehook already active hook %s.", method)) - end - - if handlers[uid] == handler then -- turn on a decative hook, note enclosures break this ability, small memory leak - actives[uid] = true - return - elseif obj then -- is there any reason not to call unhook instead of doing the following several lines? - if self.hooks and self.hooks[obj] then - self.hooks[obj][method] = nil - end - registry[self][obj][method] = nil - else - if self.hooks then - self.hooks[method] = nil - end - registry[self][method] = nil - end - handlers[uid], actives[uid], scripts[uid] = nil, nil, nil - end - - local orig - if script then - orig = obj:GetScript(method) or donothing - elseif obj then - orig = obj[method] - else - orig = _G[method] - end - - if not orig then - error(format("%s: Attempting to hook a non existing target", usage), 3) - end - - uid = createHook(self, handler, orig, secure, not (raw or secure)) - - if obj then - self.hooks[obj] = self.hooks[obj] or {} - registry[self][obj] = registry[self][obj] or {} - registry[self][obj][method] = uid - - if not secure then - self.hooks[obj][method] = orig - end - - if script then - if not secure then - obj:SetScript(method, uid) - else - obj:HookScript(method, uid) - end - else - if not secure then - obj[method] = uid - else - hooksecurefunc(obj, method, uid) - end - end - else - registry[self][method] = uid - - if not secure then - _G[method] = uid - self.hooks[method] = orig - else - hooksecurefunc(method, uid) - end - end - - actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil -end - ---- Hook a function or a method on an object. --- The hook created will be a "safe hook", that means that your handler will be called --- before the hooked function ("Pre-Hook"), and you don't have to call the original function yourself, --- however you cannot stop the execution of the function, or modify any of the arguments/return values.\\ --- This type of hook is typically used if you need to know if some function got called, and don't want to modify it. --- @paramsig [object], method, [handler], [hookSecure] --- @param object The object to hook a method from --- @param method If object was specified, the name of the method, or the name of the function to hook. --- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked function) --- @param hookSecure If true, AceHook will allow hooking of secure functions. --- @usage --- -- create an addon with AceHook embeded --- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- --- function MyAddon:OnEnable() --- -- Hook ActionButton_UpdateHotkeys, overwriting the secure status --- self:Hook("ActionButton_UpdateHotkeys", true) --- end --- --- function MyAddon:ActionButton_UpdateHotkeys(button, type) --- print(button:GetName() .. " is updating its HotKey") --- end -function AceHook:Hook(object, method, handler, hookSecure) - if type(object) == "string" then - method, handler, hookSecure, object = object, method, handler, nil - end - - if handler == true then - handler, hookSecure = nil, true - end - - hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])") -end - ---- RawHook a function or a method on an object. --- The hook created will be a "raw hook", that means that your handler will completly replace --- the original function, and your handler has to call the original function (or not, depending on your intentions).\\ --- The original function will be stored in `self.hooks[object][method]` or `self.hooks[functionName]` respectively.\\ --- This type of hook can be used for all purposes, and is usually the most common case when you need to modify arguments --- or want to control execution of the original function. --- @paramsig [object], method, [handler], [hookSecure] --- @param object The object to hook a method from --- @param method If object was specified, the name of the method, or the name of the function to hook. --- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked function) --- @param hookSecure If true, AceHook will allow hooking of secure functions. --- @usage --- -- create an addon with AceHook embeded --- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- --- function MyAddon:OnEnable() --- -- Hook ActionButton_UpdateHotkeys, overwriting the secure status --- self:RawHook("ActionButton_UpdateHotkeys", true) --- end --- --- function MyAddon:ActionButton_UpdateHotkeys(button, type) --- if button:GetName() == "MyButton" then --- -- do stuff here --- else --- self.hooks.ActionButton_UpdateHotkeys(button, type) --- end --- end -function AceHook:RawHook(object, method, handler, hookSecure) - if type(object) == "string" then - method, handler, hookSecure, object = object, method, handler, nil - end - - if handler == true then - handler, hookSecure = nil, true - end - - hook(self, object, method, handler, false, false, true, hookSecure or false, "Usage: RawHook([object], method, [handler], [hookSecure])") -end - ---- SecureHook a function or a method on an object. --- This function is a wrapper around the `hooksecurefunc` function in the WoW API. Using AceHook --- extends the functionality of secure hooks, and adds the ability to unhook once the hook isn't --- required anymore, or the addon is being disabled.\\ --- Secure Hooks should be used if the secure-status of the function is vital to its function, --- and taint would block execution. Secure Hooks are always called after the original function was called --- ("Post Hook"), and you cannot modify the arguments, return values or control the execution. --- @paramsig [object], method, [handler] --- @param object The object to hook a method from --- @param method If object was specified, the name of the method, or the name of the function to hook. --- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked function) -function AceHook:SecureHook(object, method, handler) - if type(object) == "string" then - method, handler, object = object, method, nil - end - - hook(self, object, method, handler, false, true, false, false, "Usage: SecureHook([object], method, [handler])") -end - ---- Hook a script handler on a frame. --- The hook created will be a "safe hook", that means that your handler will be called --- before the hooked script ("Pre-Hook"), and you don't have to call the original function yourself, --- however you cannot stop the execution of the function, or modify any of the arguments/return values.\\ --- This is the frame script equivalent of the :Hook safe-hook. It would typically be used to be notified --- when a certain event happens to a frame. --- @paramsig frame, script, [handler] --- @param frame The Frame to hook the script on --- @param script The script to hook --- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked script) --- @usage --- -- create an addon with AceHook embeded --- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- --- function MyAddon:OnEnable() --- -- Hook the OnShow of FriendsFrame --- self:HookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow") --- end --- --- function MyAddon:FriendsFrameOnShow(frame) --- print("The FriendsFrame was shown!") --- end -function AceHook:HookScript(frame, script, handler) - hook(self, frame, script, handler, true, false, false, false, "Usage: HookScript(object, method, [handler])") -end - ---- RawHook a script handler on a frame. --- The hook created will be a "raw hook", that means that your handler will completly replace --- the original script, and your handler has to call the original script (or not, depending on your intentions).\\ --- The original script will be stored in `self.hooks[frame][script]`.\\ --- This type of hook can be used for all purposes, and is usually the most common case when you need to modify arguments --- or want to control execution of the original script. --- @paramsig frame, script, [handler] --- @param frame The Frame to hook the script on --- @param script The script to hook --- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked script) --- @usage --- -- create an addon with AceHook embeded --- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- --- function MyAddon:OnEnable() --- -- Hook the OnShow of FriendsFrame --- self:RawHookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow") --- end --- --- function MyAddon:FriendsFrameOnShow(frame) --- -- Call the original function --- self.hooks[frame].OnShow(frame) --- -- Do our processing --- -- .. stuff --- end -function AceHook:RawHookScript(frame, script, handler) - hook(self, frame, script, handler, true, false, true, false, "Usage: RawHookScript(object, method, [handler])") -end - ---- SecureHook a script handler on a frame. --- This function is a wrapper around the `frame:HookScript` function in the WoW API. Using AceHook --- extends the functionality of secure hooks, and adds the ability to unhook once the hook isn't --- required anymore, or the addon is being disabled.\\ --- Secure Hooks should be used if the secure-status of the function is vital to its function, --- and taint would block execution. Secure Hooks are always called after the original function was called --- ("Post Hook"), and you cannot modify the arguments, return values or control the execution. --- @paramsig frame, script, [handler] --- @param frame The Frame to hook the script on --- @param script The script to hook --- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked script) -function AceHook:SecureHookScript(frame, script, handler) - hook(self, frame, script, handler, true, true, false, false, "Usage: SecureHookScript(object, method, [handler])") -end - ---- Unhook from the specified function, method or script. --- @paramsig [obj], method --- @param obj The object or frame to unhook from --- @param method The name of the method, function or script to unhook from. -function AceHook:Unhook(obj, method) - local usage = "Usage: Unhook([obj], method)" - if type(obj) == "string" then - method, obj = obj, nil - end - - if obj and type(obj) ~= "table" then - error(format("%s: 'obj' - expecting nil or table got %s", usage, type(obj)), 2) - end - if type(method) ~= "string" then - error(format("%s: 'method' - expeting string got %s", usage, type(method)), 2) - end - - local uid - if obj then - uid = registry[self][obj] and registry[self][obj][method] - else - uid = registry[self][method] - end - - if not uid or not actives[uid] then - -- Declining to error on an unneeded unhook since the end effect is the same and this would just be annoying. - return false - end - - actives[uid], handlers[uid] = nil, nil - - if obj then - registry[self][obj][method] = nil - registry[self][obj] = next(registry[self][obj]) and registry[self][obj] or nil - - -- if the hook reference doesnt exist, then its a secure hook, just bail out and dont do any unhooking - if not self.hooks[obj] or not self.hooks[obj][method] then return true end - - if scripts[uid] and obj:GetScript(method) == uid then -- unhooks scripts - obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil) - scripts[uid] = nil - elseif obj and self.hooks[obj] and self.hooks[obj][method] and obj[method] == uid then -- unhooks methods - obj[method] = self.hooks[obj][method] - end - - self.hooks[obj][method] = nil - self.hooks[obj] = next(self.hooks[obj]) and self.hooks[obj] or nil - else - registry[self][method] = nil - - -- if self.hooks[method] doesn't exist, then this is a SecureHook, just bail out - if not self.hooks[method] then return true end - - if self.hooks[method] and _G[method] == uid then -- unhooks functions - _G[method] = self.hooks[method] - end - - self.hooks[method] = nil - end - return true -end - ---- Unhook all existing hooks for this addon. -function AceHook:UnhookAll() - for key, value in pairs(registry[self]) do - if type(key) == "table" then - for method in pairs(value) do - AceHook.Unhook(self, key, method) - end - else - AceHook.Unhook(self, key) - end - end -end - ---- Check if the specific function, method or script is already hooked. --- @paramsig [obj], method --- @param obj The object or frame to unhook from --- @param method The name of the method, function or script to unhook from. -function AceHook:IsHooked(obj, method) - -- we don't check if registry[self] exists, this is done by evil magicks in the metatable - if type(obj) == "string" then - if registry[self][obj] and actives[registry[self][obj]] then - return true, handlers[registry[self][obj]] - end - else - if registry[self][obj] and registry[self][obj][method] and actives[registry[self][obj][method]] then - return true, handlers[registry[self][obj][method]] - end - end - - return false, nil -end - ---- Upgrade our old embeded -for target, v in pairs( AceHook.embeded ) do - AceHook:Embed( target ) -end diff --git a/Libs/AceSerializer-3.0/AceSerializer-3.0.lua b/Libs/AceSerializer-3.0/AceSerializer-3.0.lua deleted file mode 100644 index 25b3fb1..0000000 --- a/Libs/AceSerializer-3.0/AceSerializer-3.0.lua +++ /dev/null @@ -1,287 +0,0 @@ ---- **AceSerializer-3.0** can serialize any variable (except functions or userdata) into a string format, --- that can be send over the addon comm channel. AceSerializer was designed to keep all data intact, especially --- very large numbers or floating point numbers, and table structures. The only caveat currently is, that multiple --- references to the same table will be send individually. --- --- **AceSerializer-3.0** can be embeded into your addon, either explicitly by calling AceSerializer:Embed(MyAddon) or by --- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object --- and can be accessed directly, without having to explicitly call AceSerializer itself.\\ --- It is recommended to embed AceSerializer, otherwise you'll have to specify a custom `self` on all calls you --- make into AceSerializer. --- @class file --- @name AceSerializer-3.0 --- @release $Id: AceSerializer-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $ -local MAJOR,MINOR = "AceSerializer-3.0", 5 -local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR) - -if not AceSerializer then return end - --- Lua APIs -local strbyte, strchar, gsub, gmatch, format = string.byte, string.char, string.gsub, string.gmatch, string.format -local assert, error, pcall = assert, error, pcall -local type, tostring, tonumber = type, tostring, tonumber -local pairs, select, frexp = pairs, select, math.frexp -local tconcat = table.concat - --- quick copies of string representations of wonky numbers -local inf = math.huge - -local serNaN -- can't do this in 4.3, see ace3 ticket 268 -local serInf, serInfMac = "1.#INF", "inf" -local serNegInf, serNegInfMac = "-1.#INF", "-inf" - - --- Serialization functions - -local function SerializeStringHelper(ch) -- Used by SerializeValue for strings - -- We use \126 ("~") as an escape character for all nonprints plus a few more - local n = strbyte(ch) - if n==30 then -- v3 / ticket 115: catch a nonprint that ends up being "~^" when encoded... DOH - return "\126\122" - elseif n<=32 then -- nonprint + space - return "\126"..strchar(n+64) - elseif n==94 then -- value separator - return "\126\125" - elseif n==126 then -- our own escape character - return "\126\124" - elseif n==127 then -- nonprint (DEL) - return "\126\123" - else - assert(false) -- can't be reached if caller uses a sane regex - end -end - -local function SerializeValue(v, res, nres) - -- We use "^" as a value separator, followed by one byte for type indicator - local t=type(v) - - if t=="string" then -- ^S = string (escaped to remove nonprints, "^"s, etc) - res[nres+1] = "^S" - res[nres+2] = gsub(v,"[%c \94\126\127]", SerializeStringHelper) - nres=nres+2 - - elseif t=="number" then -- ^N = number (just tostring()ed) or ^F (float components) - local str = tostring(v) - if tonumber(str)==v --[[not in 4.3 or str==serNaN]] then - -- translates just fine, transmit as-is - res[nres+1] = "^N" - res[nres+2] = str - nres=nres+2 - elseif v == inf or v == -inf then - res[nres+1] = "^N" - res[nres+2] = v == inf and serInf or serNegInf - nres=nres+2 - else - local m,e = frexp(v) - res[nres+1] = "^F" - res[nres+2] = format("%.0f",m*2^53) -- force mantissa to become integer (it's originally 0.5--0.9999) - res[nres+3] = "^f" - res[nres+4] = tostring(e-53) -- adjust exponent to counteract mantissa manipulation - nres=nres+4 - end - - elseif t=="table" then -- ^T...^t = table (list of key,value pairs) - nres=nres+1 - res[nres] = "^T" - for key,value in pairs(v) do - nres = SerializeValue(key, res, nres) - nres = SerializeValue(value, res, nres) - end - nres=nres+1 - res[nres] = "^t" - - elseif t=="boolean" then -- ^B = true, ^b = false - nres=nres+1 - if v then - res[nres] = "^B" -- true - else - res[nres] = "^b" -- false - end - - elseif t=="nil" then -- ^Z = nil (zero, "N" was taken :P) - nres=nres+1 - res[nres] = "^Z" - - else - error(MAJOR..": Cannot serialize a value of type '"..t.."'") -- can't produce error on right level, this is wildly recursive - end - - return nres -end - - - -local serializeTbl = { "^1" } -- "^1" = Hi, I'm data serialized by AceSerializer protocol rev 1 - ---- Serialize the data passed into the function. --- Takes a list of values (strings, numbers, booleans, nils, tables) --- and returns it in serialized form (a string).\\ --- May throw errors on invalid data types. --- @param ... List of values to serialize --- @return The data in its serialized form (string) -function AceSerializer:Serialize(...) - local nres = 1 - - for i=1,select("#", ...) do - local v = select(i, ...) - nres = SerializeValue(v, serializeTbl, nres) - end - - serializeTbl[nres+1] = "^^" -- "^^" = End of serialized data - - return tconcat(serializeTbl, "", 1, nres+1) -end - --- Deserialization functions -local function DeserializeStringHelper(escape) - if escape<"~\122" then - return strchar(strbyte(escape,2,2)-64) - elseif escape=="~\122" then -- v3 / ticket 115: special case encode since 30+64=94 ("^") - OOPS. - return "\030" - elseif escape=="~\123" then - return "\127" - elseif escape=="~\124" then - return "\126" - elseif escape=="~\125" then - return "\94" - end - error("DeserializeStringHelper got called for '"..escape.."'?!?") -- can't be reached unless regex is screwed up -end - -local function DeserializeNumberHelper(number) - --[[ not in 4.3 if number == serNaN then - return 0/0 - else]]if number == serNegInf or number == serNegInfMac then - return -inf - elseif number == serInf or number == serInfMac then - return inf - else - return tonumber(number) - end -end - --- DeserializeValue: worker function for :Deserialize() --- It works in two modes: --- Main (top-level) mode: Deserialize a list of values and return them all --- Recursive (table) mode: Deserialize only a single value (_may_ of course be another table with lots of subvalues in it) --- --- The function _always_ works recursively due to having to build a list of values to return --- --- Callers are expected to pcall(DeserializeValue) to trap errors - -local function DeserializeValue(iter,single,ctl,data) - - if not single then - ctl,data = iter() - end - - if not ctl then - error("Supplied data misses AceSerializer terminator ('^^')") - end - - if ctl=="^^" then - -- ignore extraneous data - return - end - - local res - - if ctl=="^S" then - res = gsub(data, "~.", DeserializeStringHelper) - elseif ctl=="^N" then - res = DeserializeNumberHelper(data) - if not res then - error("Invalid serialized number: '"..tostring(data).."'") - end - elseif ctl=="^F" then -- ^F^f - local ctl2,e = iter() - if ctl2~="^f" then - error("Invalid serialized floating-point number, expected '^f', not '"..tostring(ctl2).."'") - end - local m=tonumber(data) - e=tonumber(e) - if not (m and e) then - error("Invalid serialized floating-point number, expected mantissa and exponent, got '"..tostring(m).."' and '"..tostring(e).."'") - end - res = m*(2^e) - elseif ctl=="^B" then -- yeah yeah ignore data portion - res = true - elseif ctl=="^b" then -- yeah yeah ignore data portion - res = false - elseif ctl=="^Z" then -- yeah yeah ignore data portion - res = nil - elseif ctl=="^T" then - -- ignore ^T's data, future extensibility? - res = {} - local k,v - while true do - ctl,data = iter() - if ctl=="^t" then break end -- ignore ^t's data - k = DeserializeValue(iter,true,ctl,data) - if k==nil then - error("Invalid AceSerializer table format (no table end marker)") - end - ctl,data = iter() - v = DeserializeValue(iter,true,ctl,data) - if v==nil then - error("Invalid AceSerializer table format (no table end marker)") - end - res[k]=v - end - else - error("Invalid AceSerializer control code '"..ctl.."'") - end - - if not single then - return res,DeserializeValue(iter) - else - return res - end -end - ---- Deserializes the data into its original values. --- Accepts serialized data, ignoring all control characters and whitespace. --- @param str The serialized data (from :Serialize) --- @return true followed by a list of values, OR false followed by an error message -function AceSerializer:Deserialize(str) - str = gsub(str, "[%c ]", "") -- ignore all control characters; nice for embedding in email and stuff - - local iter = gmatch(str, "(^.)([^^]*)") -- Any ^x followed by string of non-^ - local ctl,data = iter() - if not ctl or ctl~="^1" then - -- we purposefully ignore the data portion of the start code, it can be used as an extension mechanism - return false, "Supplied data is not AceSerializer data (rev 1)" - end - - return pcall(DeserializeValue, iter) -end - - ----------------------------------------- --- Base library stuff ----------------------------------------- - -AceSerializer.internals = { -- for test scripts - SerializeValue = SerializeValue, - SerializeStringHelper = SerializeStringHelper, -} - -local mixins = { - "Serialize", - "Deserialize", -} - -AceSerializer.embeds = AceSerializer.embeds or {} - -function AceSerializer:Embed(target) - for k, v in pairs(mixins) do - target[v] = self[v] - end - self.embeds[target] = true - return target -end - --- Update embeds -for target, v in pairs(AceSerializer.embeds) do - AceSerializer:Embed(target) -end diff --git a/Libs/AceSerializer-3.0/AceSerializer-3.0.xml b/Libs/AceSerializer-3.0/AceSerializer-3.0.xml deleted file mode 100644 index 677d08e..0000000 --- a/Libs/AceSerializer-3.0/AceSerializer-3.0.xml +++ /dev/null @@ -1,4 +0,0 @@ - -