chore: stage all pending changes (DB cleanup, corrections, compiler, init, plugin API)

This commit is contained in:
Xurkon
2026-03-16 19:41:52 -05:00
parent aad7972814
commit 4db9737a35
43 changed files with 350 additions and 226573 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-211
View File
@@ -1,211 +0,0 @@
---@class HardcoreBlacklist
local HardcoreBlacklist = QuestieLoader:CreateModule("HardcoreBlacklist")
---@return table<QuestId, boolean>
function HardcoreBlacklist:Load()
return {
[5892] = true, -- Irondeep Supplies
[5893] = true, -- Coldtooth Supplies
[6741] = true, -- More Booty!
[6781] = true, -- More Armor Scraps
[6801] = true, -- Lokholar the Ice Lord
[6825] = true, -- Call of Air - Guse's Fleet
[6826] = true, -- Call of Air - Jeztor's Fleet
[6827] = true, -- Call of Air - Mulverick's Fleet
[6846] = true, -- Begin the Attack!
[6847] = true, -- Master Ryson's All Seeing Eye
[6848] = true, -- Master Ryson's All Seeing Eye
[6861] = true, -- Zinfizzlex's Portable Shredder Unit
[6862] = true, -- Zinfizzlex's Portable Shredder Unit
[6881] = true, -- Ivus the Forest Lord
[6901] = true, -- Launch the Attack!
[6941] = true, -- Call of Air - Vipore's Fleet
[6942] = true, -- Call of Air - Slidore's Fleet
[6943] = true, -- Call of Air - Ichman's Fleet
[6982] = true, -- Coldtooth Supplies
[6985] = true, -- Irondeep Supplies
[7001] = true, -- Empty Stables
[7002] = true, -- Ram Hide Harnesses
[7026] = true, -- Ram Riding Harnesses
[7027] = true, -- Empty Stables
[7081] = true, -- Alterac Valley Graveyards
[7082] = true, -- The Graveyards of Alterac
[7101] = true, -- Towers and Bunkers
[7102] = true, -- Towers and Bunkers
[7121] = true, -- The Quartermaster
[7122] = true, -- Capture a Mine
[7123] = true, -- Speak with our Quartermaster
[7124] = true, -- Capture a Mine
[7141] = true, -- The Battle of Alterac
[7142] = true, -- The Battle for Alterac
[7161] = true, -- Proving Grounds
[7162] = true, -- Proving Grounds
[7163] = true, -- Rise and Be Recognized
[7164] = true, -- Honored Amongst the Clan
[7165] = true, -- Earned Reverence
[7166] = true, -- Legendary Heroes
[7167] = true, -- The Eye of Command
[7168] = true, -- Rise and Be Recognized
[7169] = true, -- Honored Amongst the Guard
[7170] = true, -- Earned Reverence
[7171] = true, -- Legendary Heroes
[7172] = true, -- The Eye of Command
[7181] = true, -- The Legend of Korrak
[7202] = true, -- Korrak the Bloodrager
[7221] = true, -- Speak with Prospector Stonehewer
[7222] = true, -- Speak with Voggah Deathgrip
[7223] = true, -- Armor Scraps
[7224] = true, -- Enemy Booty
[7241] = true, -- In Defense of Frostwolf
[7261] = true, -- The Sovereign Imperative
[7281] = true, -- Brotherly Love
[7282] = true, -- Brotherly Love
[7301] = true, -- Fallen Sky Lords
[7302] = true, -- Fallen Sky Lords
[7361] = true, -- Favor Amongst the Darkspear
[7362] = true, -- Ally of the Tauren
[7363] = true, -- The Human Condition
[7364] = true, -- Gnomeregan Bounty
[7365] = true, -- Staghelm's Requiem
[7366] = true, -- The Archbishop's Mercy
[7367] = true, -- Defusing the Threat
[7368] = true, -- Defusing the Threat
[7381] = true, -- The Return of Korrak
[7382] = true, -- Korrak the Everliving
[7385] = true, -- A Gallon of Blood
[7386] = true, -- Crystal Cluster
[7401] = true, -- WANTED: Dwarves!
[7402] = true, -- WANTED: Orcs!
[7421] = true, -- Darkspear Defense
[7422] = true, -- Tuft it Out
[7423] = true, -- I've Got A Fever For More Bone Chips
[7424] = true, -- What the Hoof?
[7425] = true, -- Staghelm's Mojo Jamboree
[7426] = true, -- One Man's Love
[7427] = true, -- Wanted: MORE DWARVES!
[7428] = true, -- Wanted: MORE ORCS!
[7788] = true, -- Vanquish the Invaders!
[7789] = true, -- Quell the Silverwing Usurpers
[7871] = true, -- Vanquish the Invaders!
[7872] = true, -- Vanquish the Invaders!
[7873] = true, -- Vanquish the Invaders!
[7874] = true, -- Quell the Silverwing Usurpers
[7875] = true, -- Quell the Silverwing Usurpers
[7876] = true, -- Quell the Silverwing Usurpers
[7886] = true, -- Talismans of Merit
[7887] = true, -- Talismans of Merit
[7888] = true, -- Talismans of Merit
[7921] = true, -- Talismans of Merit
[7922] = true, -- Mark of Honor
[7923] = true, -- Mark of Honor
[7924] = true, -- Mark of Honor
[7925] = true, -- Mark of Honor
[8001] = true, -- Warsong Outriders <NYI> <TXT>
[8002] = true, -- Silverwing Sentinels <NYI> <TXT>
[8080] = true, -- Arathi Basin Resources!
[8081] = true, -- More Resource Crates
[8105] = true, -- The Battle for Arathi Basin!
[8114] = true, -- Control Four Bases
[8115] = true, -- Control Five Bases
[8120] = true, -- The Battle for Arathi Basin!
[8121] = true, -- Take Four Bases
[8122] = true, -- Take Five Bases
[8123] = true, -- Cut Arathor Supply Lines
[8124] = true, -- More Resource Crates
[8154] = true, -- Arathi Basin Resources!
[8155] = true, -- Arathi Basin Resources!
[8156] = true, -- Arathi Basin Resources!
[8157] = true, -- More Resource Crates
[8158] = true, -- More Resource Crates
[8159] = true, -- More Resource Crates
[8160] = true, -- Cut Arathor Supply Lines
[8161] = true, -- Cut Arathor Supply Lines
[8162] = true, -- Cut Arathor Supply Lines
[8163] = true, -- More Resource Crates
[8164] = true, -- More Resource Crates
[8165] = true, -- More Resource Crates
[8166] = true, -- The Battle for Arathi Basin!
[8167] = true, -- The Battle for Arathi Basin!
[8168] = true, -- The Battle for Arathi Basin!
[8169] = true, -- The Battle for Arathi Basin!
[8170] = true, -- The Battle for Arathi Basin!
[8171] = true, -- The Battle for Arathi Basin!
[8260] = true, -- Arathor Basic Care Package
[8261] = true, -- Arathor Standard Care Package
[8262] = true, -- Arathor Advanced Care Package
[8263] = true, -- Defiler's Basic Care Package
[8264] = true, -- Defiler's Standard Care Package
[8265] = true, -- Defiler's Advanced Care Package
[8266] = true, -- Ribbons of Sacrifice
[8267] = true, -- Ribbons of Sacrifice
[8268] = true, -- Ribbons of Sacrifice
[8269] = true, -- Ribbons of Sacrifice
[8271] = true, -- Hero of the Stormpike
[8272] = true, -- Hero of the Frostwolf
[8289] = true, -- Talismans of Merit
[8290] = true, -- Vanquish the Invaders
[8291] = true, -- Vanquish the Invaders!
[8292] = true, -- Talismans of Merit
[8293] = true, -- Mark of Honor
[8294] = true, -- Quell the Silverwing Usurpers
[8295] = true, -- Quell the Silverwing Usurpers
[8296] = true, -- Mark of Honor
[8297] = true, -- Arathi Basin Resources!
[8298] = true, -- More Resource Crates
[8299] = true, -- Cut Arathor Supply Lines
[8300] = true, -- More Resource Crates
[8368] = true, -- Battle of Warsong Gulch
[8367] = true, -- For Great Honor
[8369] = true, -- Invaders of Alterac Valley
[8370] = true, -- Conquering Arathi Basin
[8371] = true, -- Concerted Efforts
[8372] = true, -- Fight for Warsong Gulch
[8374] = true, -- Claiming Arathi Basin
[8375] = true, -- Remember Alterac Valley
[8383] = true, -- Remember Alterac Valley
[8384] = true, -- Claiming Arathi Basin
[8385] = true, -- Concerted Efforts
[8386] = true, -- Fight for Warsong Gulch
[8387] = true, -- Invaders of Alterac Valley
[8388] = true, -- For Great Honor
[8389] = true, -- Battle of Warsong Gulch
[8390] = true, -- Conquering Arathi Basin
[8391] = true, -- Claiming Arathi Basin
[8392] = true, -- Claiming Arathi Basin
[8393] = true, -- Claiming Arathi Basin
[8394] = true, -- Claiming Arathi Basin
[8395] = true, -- Claiming Arathi Basin
[8396] = true, -- Claiming Arathi Basin
[8397] = true, -- Claiming Arathi Basin
[8398] = true, -- Claiming Arathi Basin
[8399] = true, -- Fight for Warsong Gulch
[8400] = true, -- Fight for Warsong Gulch
[8401] = true, -- Fight for Warsong Gulch
[8402] = true, -- Fight for Warsong Gulch
[8403] = true, -- Fight for Warsong Gulch
[8404] = true, -- Fight for Warsong Gulch
[8405] = true, -- Fight for Warsong Gulch
[8406] = true, -- Fight for Warsong Gulch
[8407] = true, -- Fight for Warsong Gulch
[8408] = true, -- Fight for Warsong Gulch
[8426] = true, -- Battle of Warsong Gulch
[8427] = true, -- Battle of Warsong Gulch
[8428] = true, -- Battle of Warsong Gulch
[8429] = true, -- Battle of Warsong Gulch
[8430] = true, -- Battle of Warsong Gulch
[8431] = true, -- Battle of Warsong Gulch
[8432] = true, -- Battle of Warsong Gulch
[8433] = true, -- Battle of Warsong Gulch
[8434] = true, -- Battle of Warsong Gulch
[8435] = true, -- Battle of Warsong Gulch
[8436] = true, -- Conquering Arathi Basin
[8437] = true, -- Conquering Arathi Basin
[8438] = true, -- Conquering Arathi Basin
[8439] = true, -- Conquering Arathi Basin
[8440] = true, -- Conquering Arathi Basin
[8441] = true, -- Conquering Arathi Basin
[8442] = true, -- Conquering Arathi Basin
[8443] = true, -- Conquering Arathi Basin
}
end
+22 -59
View File
@@ -17,10 +17,6 @@ local QuestieQuestBlacklist = QuestieLoader:ImportModule("QuestieQuestBlacklist"
local QuestieNPCBlacklist = QuestieLoader:ImportModule("QuestieNPCBlacklist")
---@type QuestieItemBlacklist
local QuestieItemBlacklist = QuestieLoader:ImportModule("QuestieItemBlacklist")
---@type HardcoreBlacklist
local HardcoreBlacklist = QuestieLoader:ImportModule("HardcoreBlacklist")
---@type SeasonOfDiscovery
local SeasonOfDiscovery = QuestieLoader:ImportModule("SeasonOfDiscovery")
---@type QuestieQuestFixes
local QuestieQuestFixes = QuestieLoader:ImportModule("QuestieQuestFixes")
@@ -79,8 +75,6 @@ QuestieCorrections.TBC_ONLY = 1 -- Hide only in TBC
QuestieCorrections.CLASSIC_ONLY = 2 -- Hide only in Classic
QuestieCorrections.WOTLK_ONLY = 3 -- Hide only in Wotlk
QuestieCorrections.TBC_AND_WOTLK = 4 -- Hide in TBC and Wotlk
QuestieCorrections.SOD_ONLY = 5 -- Hide when *not* Season of Discovery; use for SoD-only quests
QuestieCorrections.HIDE_SOD = 6 -- Hide when Season of Discovery; use to hide quests that are not available in SoD
QuestieCorrections.CLASSIC_AND_TBC = 7 -- Hide in both Classic and TBC
QuestieCorrections.killCreditObjectiveFirst = {} -- Only used for TBC quests
@@ -93,7 +87,6 @@ local function filterExpansion(values)
local isClassic = Questie.IsClassic
local isTBC = Questie.IsTBC
local isWotlk = Questie.IsWotlk
local isSoD = Questie.IsSoD
for k, v in pairs(values) do
if v == QuestieCorrections.WOTLK_ONLY then
if isWotlk then
@@ -119,18 +112,6 @@ local function filterExpansion(values)
else
values[k] = nil
end
elseif v == QuestieCorrections.SOD_ONLY then
if not isSoD then
values[k] = true
else
values[k] = nil
end
elseif v == QuestieCorrections.HIDE_SOD then
if isSoD then
values[k] = true
else
values[k] = nil
end
elseif v == QuestieCorrections.CLASSIC_AND_TBC then
if isClassic or isTBC then
values[k] = true
@@ -188,11 +169,6 @@ do
addOverride(QuestieDB.objectDataOverrides, QuestieWotlkObjectFixes:LoadFactionFixes())
end
-- Season of Discovery Corrections
if Questie.IsSoD then
addOverride(QuestieDB.questDataOverrides, SeasonOfDiscovery:LoadFactionQuestFixes())
end
QuestieCorrections.questItemBlacklist = filterExpansion(QuestieItemBlacklist:Load())
QuestieCorrections.questNPCBlacklist = filterExpansion(QuestieNPCBlacklist:Load())
QuestieCorrections.hiddenQuests = filterExpansion(QuestieQuestBlacklist:Load())
@@ -218,13 +194,6 @@ do
end
end
-- Hardcore Blacklist
if (Questie.IsHardcore) then
for id, _ in pairs(HardcoreBlacklist:Load()) do
QuestieCorrections.hiddenQuests[id] = true
end
end
if QuestieCompat.Is335 then QuestieCompat.LoadBlacklists() end
if Questie.db.profile.showEventQuests then
@@ -245,6 +214,7 @@ end
---@param noOverwrites true? Do not overwrite existing values
---@param noNewEntries true? Do not create new entries in the database
local _LoadCorrections = function(databaseTableName, corrections, reversedKeys, validationTables, noOverwrites, noNewEntries)
if not QuestieDB[databaseTableName] then return end
for id, data in pairs(corrections) do
for key, value in pairs(data) do
-- Create the id if missing unless noNewEntries is set
@@ -271,39 +241,30 @@ end
---@param validationTables table? Only used by the CI validation scripts to validate the corrections against the original database values and find irrelevant corrections
function QuestieCorrections:Initialize(validationTables)
QuestieQuestFixes:LoadMissingQuests()
if QuestieQuestFixes and QuestieQuestFixes.LoadMissingQuests then
QuestieQuestFixes:LoadMissingQuests()
end
-- Classic Corrections
_LoadCorrections("questData", QuestieClassicQuestReputationFixes:Load(), QuestieDB.questKeysReversed, validationTables)
_LoadCorrections("questData", QuestieQuestFixes:Load(), QuestieDB.questKeysReversed, validationTables)
_LoadCorrections("npcData", QuestieNPCFixes:Load(), QuestieDB.npcKeysReversed, validationTables)
_LoadCorrections("itemData", QuestieItemFixes:Load(), QuestieDB.itemKeysReversed, validationTables)
_LoadCorrections("objectData", QuestieObjectFixes:Load(), QuestieDB.objectKeysReversed, validationTables)
if QuestieClassicQuestReputationFixes then _LoadCorrections("questData", QuestieClassicQuestReputationFixes:Load(), QuestieDB.questKeysReversed, validationTables) end
if QuestieQuestFixes then _LoadCorrections("questData", QuestieQuestFixes:Load(), QuestieDB.questKeysReversed, validationTables) end
if QuestieNPCFixes then _LoadCorrections("npcData", QuestieNPCFixes:Load(), QuestieDB.npcKeysReversed, validationTables) end
if QuestieItemFixes then _LoadCorrections("itemData", QuestieItemFixes:Load(), QuestieDB.itemKeysReversed, validationTables) end
if QuestieObjectFixes then _LoadCorrections("objectData", QuestieObjectFixes:Load(), QuestieDB.objectKeysReversed, validationTables) end
if Questie.IsTBC or Questie.IsWotlk then
_LoadCorrections("questData", QuestieTBCQuestFixes:Load(), QuestieDB.questKeysReversed, validationTables)
_LoadCorrections("npcData", QuestieTBCNpcFixes:Load(), QuestieDB.npcKeysReversed, validationTables)
_LoadCorrections("itemData", QuestieTBCItemFixes:Load(), QuestieDB.itemKeysReversed, validationTables)
_LoadCorrections("objectData", QuestieTBCObjectFixes:Load(), QuestieDB.objectKeysReversed, validationTables)
if Questie.IsTBC or Questie.IsWotlk or QuestieCompat.Is335 then
if QuestieTBCQuestFixes then _LoadCorrections("questData", QuestieTBCQuestFixes:Load(), QuestieDB.questKeysReversed, validationTables) end
if QuestieTBCNpcFixes then _LoadCorrections("npcData", QuestieTBCNpcFixes:Load(), QuestieDB.npcKeysReversed, validationTables) end
if QuestieTBCItemFixes then _LoadCorrections("itemData", QuestieTBCItemFixes:Load(), QuestieDB.itemKeysReversed, validationTables) end
if QuestieTBCObjectFixes then _LoadCorrections("objectData", QuestieTBCObjectFixes:Load(), QuestieDB.objectKeysReversed, validationTables) end
end
if Questie.IsWotlk then
_LoadCorrections("questData", QuestieWotlkQuestFixes:Load(), QuestieDB.questKeysReversed, validationTables)
_LoadCorrections("npcData", QuestieWotlkNpcFixes:LoadAutomatics(), QuestieDB.npcKeysReversed, validationTables)
_LoadCorrections("npcData", QuestieWotlkNpcFixes:Load(), QuestieDB.npcKeysReversed, validationTables)
_LoadCorrections("itemData", QuestieWotlkItemFixes:Load(), QuestieDB.itemKeysReversed, validationTables)
_LoadCorrections("objectData", QuestieWotlkObjectFixes:Load(), QuestieDB.objectKeysReversed, validationTables)
end
if Questie.IsSoD then
_LoadCorrections("questData", SeasonOfDiscovery:LoadBaseQuests(), QuestieDB.questKeysReversed, validationTables)
_LoadCorrections("questData", SeasonOfDiscovery:LoadQuests(), QuestieDB.questKeysReversed, validationTables)
_LoadCorrections("npcData", SeasonOfDiscovery:LoadBaseNPCs(), QuestieDB.npcKeysReversed, validationTables)
_LoadCorrections("npcData", SeasonOfDiscovery:LoadNPCs(), QuestieDB.npcKeysReversed, validationTables)
_LoadCorrections("itemData", SeasonOfDiscovery:LoadBaseItems(), QuestieDB.itemKeysReversed, validationTables)
_LoadCorrections("itemData", SeasonOfDiscovery:LoadItems(), QuestieDB.itemKeysReversed, validationTables)
_LoadCorrections("objectData", SeasonOfDiscovery:LoadBaseObjects(), QuestieDB.objectKeysReversed, validationTables)
_LoadCorrections("objectData", SeasonOfDiscovery:LoadObjects(), QuestieDB.objectKeysReversed, validationTables)
if Questie.IsWotlk or QuestieCompat.Is335 then
if QuestieWotlkQuestFixes then _LoadCorrections("questData", QuestieWotlkQuestFixes:Load(), QuestieDB.questKeysReversed, validationTables) end
if QuestieWotlkNpcFixes then _LoadCorrections("npcData", QuestieWotlkNpcFixes:LoadAutomatics(), QuestieDB.npcKeysReversed, validationTables) end
if QuestieWotlkNpcFixes then _LoadCorrections("npcData", QuestieWotlkNpcFixes:Load(), QuestieDB.npcKeysReversed, validationTables) end
if QuestieWotlkItemFixes then _LoadCorrections("itemData", QuestieWotlkItemFixes:Load(), QuestieDB.itemKeysReversed, validationTables) end
if QuestieWotlkObjectFixes then _LoadCorrections("objectData", QuestieWotlkObjectFixes:Load(), QuestieDB.objectKeysReversed, validationTables) end
end
--- Corrections that apply to all versions
@@ -312,6 +273,7 @@ function QuestieCorrections:Initialize(validationTables)
if QuestieCompat.Is335 then QuestieCompat.LoadCorrections(_LoadCorrections, validationTables) end
local patchCount = 0
if type(QuestieDB.questData) == "table" then
for _, quest in pairs(QuestieDB.questData) do
if (not quest[QuestieDB.questKeys.requiredRaces]) or quest[QuestieDB.questKeys.requiredRaces] == 0 then
-- check against questgiver
@@ -349,6 +311,7 @@ function QuestieCorrections:Initialize(validationTables)
end
end
end
end -- type(questData) == "table"
QuestieCorrections:MinimalInit()
File diff suppressed because it is too large Load Diff
-532
View File
@@ -1,532 +0,0 @@
---@type QuestieQuestBlacklist
local QuestieQuestBlacklist = QuestieLoader:ImportModule("QuestieQuestBlacklist")
local currentPhase = 5 -- TODO: Use API function which hopefully will come in the future
-- This function blacklists any quests in phases LATER than the currentPhase value
-- so in Phase 1, quests in phases 2+ are blacklisted, in phase 2, phases 3+ are blacklisted, etc
-- Phase 1 is omitted, because everything not in this list is supposed to be available in Phase 1
local questsToBlacklistBySoMPhase = {
[1] = {}, -- Phase 1 - Regular Phase 1 + Dire Maul + Tier 0.5 quests (this is required for counting, but should stay empty)
[2] = { -- Phase 2 - World Bosses
},
[3] = { -- Phase 3 - BWL + Darkmoon Faire
[7761] = true, -- Blackhand's Command BWL pre quest
[7787] = true,
-- Darkmoon Faire quests
[7902] = true,
[7903] = true,
[8222] = true,
[7901] = true,
[7899] = true,
[7940] = true,
[7900] = true,
[7907] = true,
[7927] = true,
[7929] = true,
[7928] = true,
[7946] = true,
[8223] = true,
[7934] = true,
[7981] = true,
[7943] = true,
[7894] = true,
[7933] = true,
[7898] = true,
[7885] = true,
[7942] = true,
[7883] = true,
[7892] = true,
[7937] = true,
[7939] = true,
[7893] = true,
[7891] = true,
[7896] = true,
[7884] = true,
[7882] = true,
[7897] = true,
[7895] = true,
[7941] = true,
[7881] = true,
[7890] = true,
[7889] = true,
[7945] = true,
[7935] = true,
[7938] = true,
[7944] = true,
[7932] = true,
[7930] = true,
[7931] = true,
[7936] = true,
[9249] = true,
[10939] = true,
[10940] = true,
[10941] = true,
-----------------
},
[4] = { -- Phase 4 - Zul'Gurub
[8411] = true,
[8056] = true,
[8057] = true,
[8064] = true,
[8065] = true,
[8074] = true,
[8075] = true,
[8110] = true,
[8111] = true,
[8112] = true,
[8113] = true,
[8116] = true,
[8117] = true,
[8118] = true,
[8119] = true,
[8041] = true,
[8042] = true,
[8043] = true,
[8044] = true,
[8045] = true,
[8046] = true,
[8047] = true,
[8048] = true,
[8049] = true,
[8050] = true,
[8051] = true,
[8052] = true,
[8053] = true,
[8054] = true,
[8055] = true,
[8058] = true,
[8059] = true,
[8060] = true,
[8061] = true,
[8062] = true,
[8063] = true,
[8066] = true,
[8067] = true,
[8068] = true,
[8069] = true,
[8070] = true,
[8071] = true,
[8072] = true,
[8073] = true,
[8076] = true,
[8077] = true,
[8078] = true,
[8079] = true,
[8101] = true,
[8102] = true,
[8103] = true,
[8104] = true,
[8106] = true,
[8107] = true,
[8108] = true,
[8109] = true,
[8141] = true,
[8142] = true,
[8143] = true,
[8144] = true,
[8145] = true,
[8146] = true,
[8147] = true,
[8148] = true,
[8184] = true,
[8185] = true,
[8186] = true,
[8187] = true,
[8188] = true,
[8189] = true,
[8190] = true,
[8191] = true,
[8192] = true,
[8195] = true,
[8196] = true,
[8201] = true,
[8227] = true,
[8238] = true,
[8239] = true,
[8240] = true,
[8243] = true,
[8246] = true,
[8446] = true,
[8447] = true,
[9208] = true,
[9209] = true,
[9210] = true,
[8307] = true,
[8313] = true,
[8317] = true,
[8282] = true,
[8278] = true,
[8323] = true,
[8324] = true,
[8275] = true,
[8309] = true,
[8310] = true,
[8315] = true,
[8319] = true,
[8341] = true,
[8342] = true,
[8343] = true,
[8331] = true,
[8332] = true,
[8333] = true,
[8306] = true,
[8321] = true,
[8362] = true,
[8364] = true,
[9248] = true,
[8281] = true,
[8285] = true,
[8279] = true,
[8287] = true,
[8314] = true,
},
[5] = { -- Phase 5 - AQ
[8277] = true,
[8280] = true,
[8283] = true,
[8284] = true,
[8304] = true,
[8318] = true,
[8320] = true,
[8361] = true,
[8276] = true,
[8747] = true,
[8748] = true,
[8749] = true,
[8750] = true,
[8752] = true,
[8753] = true,
[8754] = true,
[8755] = true,
[8757] = true,
[8758] = true,
[8759] = true,
[8760] = true,
[8800] = true,
[8751] = true,
[8756] = true,
[8761] = true,
[8801] = true,
[8802] = true,
[8764] = true,
[8765] = true,
[8766] = true,
[8620] = true,
[8621] = true,
[8622] = true,
[8623] = true,
[8624] = true,
[8625] = true,
[8626] = true,
[8627] = true,
[8628] = true,
[8629] = true,
[8630] = true,
[8631] = true,
[8632] = true,
[8633] = true,
[8634] = true,
[8637] = true,
[8638] = true,
[8639] = true,
[8640] = true,
[8641] = true,
[8655] = true,
[8656] = true,
[8657] = true,
[8658] = true,
[8659] = true,
[8660] = true,
[8661] = true,
[8662] = true,
[8663] = true,
[8664] = true,
[8665] = true,
[8666] = true,
[8667] = true,
[8668] = true,
[8669] = true,
[8689] = true,
[8690] = true,
[8691] = true,
[8692] = true,
[8693] = true,
[8694] = true,
[8695] = true,
[8696] = true,
[8697] = true,
[8698] = true,
[8699] = true,
[8700] = true,
[8701] = true,
[8702] = true,
[8703] = true,
[8704] = true,
[8705] = true,
[8706] = true,
[8707] = true,
[8708] = true,
[8709] = true,
[8710] = true,
[8711] = true,
[8712] = true,
[8728] = true,
[8729] = true,
[8730] = true,
[8733] = true,
[8734] = true,
[8735] = true,
[8736] = true,
[8741] = true,
[8742] = true,
[8743] = true,
[8745] = true,
[8783] = true,
[8784] = true,
[8789] = true,
[8790] = true,
[8791] = true,
[8602] = true,
[8603] = true,
[8606] = true,
[8592] = true,
[8593] = true,
[8594] = true,
[8595] = true,
[8596] = true,
[8597] = true,
[8598] = true,
[8599] = true,
[8584] = true,
[8585] = true,
[8586] = true,
[8587] = true,
[8555] = true,
[8556] = true,
[8557] = true,
[8558] = true,
[8559] = true,
[8560] = true,
[8561] = true,
[8562] = true,
[8572] = true,
[8573] = true,
[8574] = true,
[8575] = true,
[8576] = true,
[8577] = true,
[8578] = true,
[8496] = true,
[8579] = true,
[8544] = true,
[8519] = true,
[8856] = true,
[8829] = true,
[8497] = true,
[8804] = true,
[8805] = true,
[8536] = true,
[8857] = true,
[8498] = true,
[8806] = true,
[8308] = true,
[8858] = true,
[8859] = true,
[8807] = true,
[8771] = true,
[8773] = true,
[8775] = true,
[8777] = true,
[8809] = true,
[8787] = true,
[8785] = true,
[8538] = true,
[8534] = true,
[8738] = true,
[8502] = true,
[8537] = true,
[8539] = true,
[8786] = true,
[8737] = true,
[8687] = true,
[8739] = true,
[8501] = true,
[8535] = true,
[8808] = true,
[8810] = true,
[8740] = true,
[8381] = true,
[8779] = true,
[8540] = true,
[8541] = true,
[8778] = true,
[8780] = true,
[8781] = true,
[8782] = true,
[8770] = true,
[8772] = true,
[8774] = true,
[8776] = true,
[8316] = true,
[9023] = true,
[8382] = true,
[8286] = true,
[8288] = true,
[8301] = true,
[8302] = true,
[8303] = true,
[8305] = true,
[8548] = true,
[8818] = true,
[8817] = true,
[8816] = true,
[8815] = true,
[8814] = true,
[8820] = true,
[8826] = true,
[8825] = true,
[8824] = true,
[8823] = true,
[8822] = true,
[8821] = true,
[8819] = true,
},
[6] = { --Phase 6 - Naxxramas
[9085] = true,
[9142] = true,
[9165] = true,
[9141] = true,
[9033] = true,
[9034] = true,
[9036] = true,
[9037] = true,
[9038] = true,
[9039] = true,
[9040] = true,
[9041] = true,
[9042] = true,
[9043] = true,
[9044] = true,
[9045] = true,
[9046] = true,
[9047] = true,
[9048] = true,
[9049] = true,
[9050] = true,
[9054] = true,
[9055] = true,
[9056] = true,
[9057] = true,
[9058] = true,
[9059] = true,
[9060] = true,
[9061] = true,
[9068] = true,
[9069] = true,
[9070] = true,
[9071] = true,
[9072] = true,
[9073] = true,
[9074] = true,
[9075] = true,
[9077] = true,
[9078] = true,
[9079] = true,
[9080] = true,
[9081] = true,
[9082] = true,
[9083] = true,
[9084] = true,
[9086] = true,
[9087] = true,
[9088] = true,
[9089] = true,
[9090] = true,
[9091] = true,
[9092] = true,
[9093] = true,
[9095] = true,
[9096] = true,
[9097] = true,
[9098] = true,
[9099] = true,
[9100] = true,
[9101] = true,
[9102] = true,
[9103] = true,
[9104] = true,
[9105] = true,
[9106] = true,
[9107] = true,
[9108] = true,
[9109] = true,
[9110] = true,
[9111] = true,
[9112] = true,
[9113] = true,
[9114] = true,
[9115] = true,
[9116] = true,
[9117] = true,
[9118] = true,
[9120] = true,
[9121] = true,
[9122] = true,
[9123] = true,
[9124] = true,
[9125] = true,
[9126] = true,
[9127] = true,
[9128] = true,
[9129] = true,
[9131] = true,
[9132] = true,
[9136] = true,
[9137] = true,
[9153] = true,
[9211] = true,
[9213] = true,
[9221] = true,
[9222] = true,
[9223] = true,
[9224] = true,
[9225] = true,
[9226] = true,
[9227] = true,
[9228] = true,
[9229] = true,
[9230] = true,
[9232] = true,
[9233] = true,
[9234] = true,
[9235] = true,
[9236] = true,
[9237] = true,
[9238] = true,
[9239] = true,
[9240] = true,
[9241] = true,
[9242] = true,
[9243] = true,
[9244] = true,
[9245] = true,
[9246] = true,
[9250] = true,
[9251] = true,
-- Silithus/EPL PvP
[9248] = true,
[9422] = true,
[9415] = true,
[9419] = true,
[9416] = true,
},
}
---@return table<number, table<number, boolean>> @All quests that should be blacklisted separated by phase
function QuestieQuestBlacklist:GetSoMQuestsToBlacklist()
for phase = 1, currentPhase do
questsToBlacklistBySoMPhase[phase] = {} -- empty table instead of nil to keep table size
end
return questsToBlacklistBySoMPhase
end
@@ -16,6 +16,7 @@ local l10n = QuestieLoader:ImportModule("l10n")
-- https://github.com/Questie/Questie/wiki/Corrections
function QuestieQuestFixes:LoadMissingQuests()
if not QuestieDB.questData then return end
QuestieDB.questData[5640] = {} -- Desperate Prayer
QuestieDB.questData[5678] = {} -- Arcane Feedback
-174
View File
@@ -1,174 +0,0 @@
---@type SeasonOfDiscovery
local SeasonOfDiscovery = QuestieLoader:ImportModule("SeasonOfDiscovery")
---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
function SeasonOfDiscovery:LoadItems()
local itemKeys = QuestieDB.itemKeys
local itemClasses = QuestieDB.itemClasses
return {
[5359] = { -- Lorgalis Manuscript
[itemKeys.relatedQuests] = {78923}, -- SoD Knowledge in the Deeps
},
[5881] = { -- Head of Kelris
[itemKeys.relatedQuests] = {78921,78922}, -- SoD Blackfathom Villainy A,H
[itemKeys.npcDrops] = {209678}, -- now drops from raid version of npc
},
[5952] = { -- Corrupted Brain Stem
[itemKeys.relatedQuests] = {78926}, -- SoD Researching the Corruption
[itemKeys.npcDrops] = {216660, 4788, 4789, 4803, 4802, 4805, 4807, 4799, 4798, 204645, 216662, 4831, 216659, 216661, 204068}, -- now drops from raid version of npc
},
[204806] = { -- Rune of Victory Rush
[itemKeys.npcDrops] = {706,946,1986},
},
[205944] = { -- Reciprocal Epiphany
[itemKeys.npcDrops] = {204937},
},
[206157] = { -- Seaforium Mining Charge
[itemKeys.objectDrops] = {403041},
},
[206170] = { -- Windfury Cone
[itemKeys.objectDrops] = {403105},
},
[206264] = { -- Rune of Inspiration
[itemKeys.npcDrops] = {204937},
},
[206469] = { -- Prairie Flower
[itemKeys.objectDrops] = {403718},
},
[208085] = { -- Scarlet Lieutenant Signet Ring
[itemKeys.npcDrops] = {1662,1664,1665},
},
[208609] = { -- Glade Flower
[itemKeys.objectDrops] = {407247},
},
[208612] = { -- Severed Spider Head
[itemKeys.npcDrops] = {1998,1999,2000,2001},
},
[208689] = { -- Ferocious Idol
[itemKeys.npcDrops] = {98,117,500,1972,6788},
},
[208771] = { -- Rune of Blade Dance
[itemKeys.objectDrops] = {407453,408718,414532},
},
[208772] = { -- Rune of Saber Slash
[itemKeys.objectDrops] = {407457,407731,409131,414624},
},
[209693] = { -- Alliance Blackfathom Pearl
[itemKeys.relatedQuests] = {78916},
[itemKeys.startQuest] = 78916,
},
[209846] = { -- Secrets of the Dreamers
[itemKeys.objectDrops] = {409692},
},
[210026] = { -- Symbol of the Third Owl
[itemKeys.objectDrops] = {409942,409949},
},
[210044] = { -- Symbol of the First Owl
[itemKeys.objectDrops] = {410220},
},
[210055] = { -- Hillsbrad Human Bones
[itemKeys.npcDrops] = {2265,2266,2267,2268,2360,2387},
},
[210195] = { -- Unbalanced Idol
[itemKeys.npcDrops] = {1769,1770,1779},
},
[210589] = { -- Echo of the Ancestors
[itemKeys.npcDrops] = {204937},
},
[210955] = { -- Scarlet Initiate's Uniform
[itemKeys.objectDrops] = {412147},
},
[211452] = { -- Horde Blackfathom Pearl
[itemKeys.relatedQuests] = {78917},
[itemKeys.startQuest] = 78917,
},
[211454] = { -- Horde Strange Water Globe (starts Baron Aquanis)
[itemKeys.relatedQuests] = {78920},
[itemKeys.startQuest] = 78920,
},
[211818] = { -- Alliance Strange Water Globe (required for but does not start Baron Aquanis)
[itemKeys.relatedQuests] = {79099},
[itemKeys.startQuest] = nil,
},
[212347] = { -- Illari's Key
[itemKeys.npcDrops] = {215655},
},
[213446] = { -- Tarnished Prayer Bead III
[itemKeys.npcDrops] = {2552,2553,2554,2555,2556,2557,2562,2564,2566,2569,2570,2572,2573,2574,2575,2586,2587,2588,2589,2590,2618,2619,4062},
},
[215376] = { -- Crusader's Mace
[itemKeys.npcDrops] = {4281,4283,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299,4300,4301,4302,4303,4306,4540},
},
[216635] = { -- Spent Voidcore
[itemKeys.npcDrops] = {5335,5336,5337},
},
[216946] = { -- Glittering Dalaran Relic
[itemKeys.npcDrops] = {900000},
},
[216947] = { -- Whirring Dalaran Relic
[itemKeys.npcDrops] = {900001},
},
[216948] = { -- Odd Dalaran Relic
[itemKeys.npcDrops] = {900002},
},
[216949] = { -- Heavy Dalaran Relic
[itemKeys.npcDrops] = {900003},
},
[216950] = { -- Creepy Dalaran Relic
[itemKeys.npcDrops] = {900004},
},
[216951] = { -- Slippery Dalaran Relic
[itemKeys.npcDrops] = {900005},
},
[219759] = { -- Charla's Field Report
[itemKeys.npcDrops] = {221472},
},
[219770] = { -- Gemeron's Field Report
[itemKeys.npcDrops] = {221482},
},
[219771] = { -- Thandros' Field Report
[itemKeys.npcDrops] = {221484},
},
[219772] = { -- Fallia's Field Report
[itemKeys.npcDrops] = {221483},
},
[219776] = { -- Intelligence Report: Vul'gol Ogre Mound
[itemKeys.npcDrops] = {221222},
},
[219778] = { -- Intelligence Report: Rotting Orchard
[itemKeys.npcDrops] = {221221},
},
[219803] = { -- Intelligence Report: Yorgen Farmstead
[itemKeys.npcDrops] = {221220},
},
[219924] = { -- Intelligence Report: Forest Song
[itemKeys.npcDrops] = {221271},
},
[219925] = { -- Intelligence Report: Satyrnaar
[itemKeys.npcDrops] = {221272},
},
[219926] = { -- Intelligence Report: Warsong Lumber Camp
[itemKeys.npcDrops] = {221273},
},
[219928] = { -- Intelligence Report: Agol'watha
[itemKeys.npcDrops] = {221353},
},
[219937] = { -- Intelligence Report: Shaol'watha
[itemKeys.npcDrops] = {221352},
},
[219938] = { -- Intelligence Report: Skulk Rock
[itemKeys.npcDrops] = {221351},
},
[219957] = { -- Intelligence Report: Oneiros
[itemKeys.npcDrops] = {221401},
},
[219958] = { -- Intelligence Report: Twin Colossals
[itemKeys.npcDrops] = {221402},
},
[219959] = { -- Intelligence Report: Ruins of Ravenwind
[itemKeys.npcDrops] = {221404},
},
}
end
-714
View File
@@ -1,714 +0,0 @@
---@type SeasonOfDiscovery
local SeasonOfDiscovery = QuestieLoader:ImportModule("SeasonOfDiscovery")
---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
---@type ZoneDB
local ZoneDB = QuestieLoader:ImportModule("ZoneDB")
function SeasonOfDiscovery:LoadNPCs()
local npcKeys = QuestieDB.npcKeys
local zoneIDs = ZoneDB.zoneIDs
local npcFlags = QuestieDB.npcFlags
local waypointPresets = QuestieDB.waypointPresets
return {
[15076] = { -- Zandalarian Emissary
[npcKeys.spawns] = {
[zoneIDs.STRANGLETHORN_VALE] = {{27.2, 77.0},{39.5, 5.0}},
},
},
[202060] = { -- Frozen Murloc
[npcKeys.spawns] = {
[zoneIDs.ELWYNN_FOREST] = {{76.8, 51.4}},
[zoneIDs.TIRISFAL_GLADES] = {{66.4, 40.2}},
},
},
[202699] = { -- Baron Aquanis
[npcKeys.spawns] = {
[zoneIDs.BLACKFATHOM_DEEPS] = {{-1, -1}},
},
[npcKeys.zoneID] = zoneIDs.BLACKFATHOM_DEEPS,
},
[203079] = { -- Wandering Swordsman
[npcKeys.spawns] = {
[1] = {{53.5, 47.5}},
[12] = {{24.6, 75.2},{38.6, 75.2}},
[14] = {{36, 47.4},{41, 49.4},{55.8, 38.4},{56.6, 26.6}},
[141] = {{39.6, 37.6},{39.8, 69.4},{43.8, 77},{54.8, 66},{62.6, 71.8}},
[215] = {{40.4, 53.2},{45.6, 36.4},{60.2, 67.4}},
},
},
[203226] = { -- Viktoria Woods
[npcKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{69.6, 50.6}},
},
},
[203475] = { -- Liv Bradford
[npcKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{22.4, 64.4}},
},
},
[203478] = { -- Stuart
[npcKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{22.6, 54.2}},
},
},
[204068] = { -- Lady Sarevess
[npcKeys.spawns] = {
[zoneIDs.BLACKFATHOM_DEEPS] = {{-1, -1}},
},
[npcKeys.zoneID] = zoneIDs.BLACKFATHOM_DEEPS,
},
[204070] = { -- Soboz
[npcKeys.spawns] = {
[1] = {{42, 36.6}},
[14] = {{67.4, 89.2}},
[1497] = {{24.6, 40.6}},
[1519] = {{25, 77.6}},
},
},
[204827] = { -- Adventurer's Remains
[npcKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{43, 49.4}},
[zoneIDs.ELWYNN_FOREST] = {{52.2, 84.4}},
[zoneIDs.DUROTAR] = {{48, 79.4}},
[zoneIDs.TELDRASSIL] = {{33.6, 35.4}},
[zoneIDs.MULGORE] = {{60.4, 33.4}},
},
},
[204989] = { -- Wounded Adventurer
[npcKeys.spawns] = {
[zoneIDs.ELWYNN_FOREST] = {{61.8, 47.6}},
},
},
[204503] = { -- Dead Acolyte
[npcKeys.spawns] = {
[zoneIDs.ELWYNN_FOREST] = {{56.4, 57.8}},
},
},
[205153] = { -- Ada Gelhardt
[npcKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{4.4, 28.2}},
},
},
[205278] = { -- Brother Romulus
[npcKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{38.4, 27.4}},
},
},
[205382] = { -- Mokwa
[npcKeys.spawns] = {
[zoneIDs.MULGORE] = {{35.8, 57.2}},
},
},
[206248] = { -- Wooden Effigy
[npcKeys.spawns] = {
[zoneIDs.TELDRASSIL] = {{66.8, 58}},
[zoneIDs.MULGORE] = {{37.4, 49.6}},
},
},
[207515] = { -- Lurkmane
[npcKeys.spawns] = {
[zoneIDs.MULGORE] = {{30.6, 61.2}},
},
},
[207577] = { -- Lunar Stone
[npcKeys.spawns] = {
[zoneIDs.TELDRASSIL] = {{52.8, 79.8}},
[zoneIDs.MULGORE] = {{35.2, 69.6}},
},
},
[207743] = { -- Netali Proudwind
[npcKeys.spawns] = {
[zoneIDs.THUNDER_BLUFF] = {{28.6, 18.2}},
},
},
[207754] = { -- Mooart
[npcKeys.spawns] = {
[zoneIDs.THUNDER_BLUFF] = {{26.6,19.8}},
},
},
[207957] = { -- Vahi Bonesplitter
[npcKeys.spawns] = {
[zoneIDs.DUROTAR] = {{53, 43.4}},
},
},
[208023] = { -- Gru'ark
[npcKeys.spawns] = {
[zoneIDs.ORGRIMMAR] = {{58.8, 53.6}},
},
},
[208124] = { -- Raluk
[npcKeys.spawns] = {
[zoneIDs.DUROTAR] = {{68.6, 71.6}},
},
},
[208196] = { -- Gillgar
[npcKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{28.4, 46.8}},
},
},
[208275] = { -- Frozen Makrura
[npcKeys.spawns] = {
[zoneIDs.DUROTAR] = {{58.6, 45.6}},
},
},
[208619] = { -- Dorac Graves
[npcKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{47.2, 71.2}},
},
},
[208638] = { -- Fyodi
[npcKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{35.4,37.4},{30.4,41.2}},
},
},
[208652] = { -- Junni Steelpass
[npcKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{46.4, 53.2}},
},
},
[208711] = { -- Toby
[npcKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{63.6, 50.2}},
},
},
[208752] = { -- Frozen Trogg
[npcKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{69.2, 58.2}},
},
},
[208802] = { -- Wounded Adventurer
[npcKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{25.4, 43.6}},
},
},
[208812] = { -- Jorul
[npcKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{37.8, 42.4}},
},
},
[208919] = { -- Blueheart
[npcKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{61.6, 51.4}},
},
},
[208927] = { -- Dead Acolyte
[npcKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{76.4, 44.8}},
},
},
[209004] = { -- Bruart
[npcKeys.spawns] = {
[zoneIDs.IRONFORGE] = {{71.2, 73.2}},
},
},
[209524] = { -- Patrolling Cheetah
[npcKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{44.4, 55.4}},
},
},
[209607] = { -- Lieutenant Stonebrew
[npcKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {},
},
},
[209608] = { -- Delwynna
[npcKeys.spawns] = {
[zoneIDs.DARNASSUS] = {{63.4, 22}},
},
},
[209678] = { -- Twilight Lord Kelris
[npcKeys.spawns] = {
[zoneIDs.BLACKFATHOM_DEEPS] = {{-1, -1}},
},
[npcKeys.zoneID] = zoneIDs.BLACKFATHOM_DEEPS,
},
[209742] = { -- Desert Mirage
[npcKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{57.6, 35.8}},
},
},
[209797] = { -- Bruuz
[npcKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{64.8, 39.8}},
},
},
[209872] = { -- Syllart
[npcKeys.spawns] = {
[zoneIDs.TELDRASSIL] = {{56.6, 57.8}},
},
},
[209908] = { -- Heretic Idol
[npcKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{71.8, 27.0}},
},
},
[209928] = { -- Mowgh
[npcKeys.spawns] = {
[zoneIDs.TELDRASSIL] = {{48.0, 31.6}},
},
},
[209948] = { -- Relaeron
[npcKeys.spawns] = {
[zoneIDs.DARNASSUS] = {{39.2, 9.0}},
},
},
[209954] = { -- Demonic Remains
[npcKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{72.6, 68.8}},
},
},
[209958] = { -- Graix
[npcKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{72.6, 68.8}},
},
},
[210107] = { -- Kackle
[npcKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{55.0, 55.4}},
},
},
[210451] = { -- Lady Sedorax
[npcKeys.spawns] = {
[zoneIDs.DARKSHORE] = {{55.4, 36.6}},
},
},
[210482] = { -- Paxnozz
[npcKeys.spawns] = {
[zoneIDs.DARKSHORE] = {{47.8, 16.0}},
},
},
[210483] = { -- Aggressive Squashling
[npcKeys.spawns] = {
[zoneIDs.WESTFALL] = {{51.2, 22.3},{54, 31.8},{44.6, 35.2},{38.4, 52.5},{62.5, 61.1}},
},
},
[210533] = { -- Silverspur
[npcKeys.spawns] = {
[zoneIDs.WESTFALL] = {{35.6, 38.4}},
},
},
[210537] = { -- Undying Laborer
[npcKeys.spawns] = {
[zoneIDs.WESTFALL] = {{44.9, 24},{31.5, 45}},
},
},
[210549] = { -- Defias Scout
[npcKeys.spawns] = {
[zoneIDs.WESTFALL] = {{51.2, 46.8},{51.6, 55.6}},
},
},
[210845] = { -- Jixo Madrocket
[npcKeys.spawns] = {
[zoneIDs.STONETALON_MOUNTAINS] = {{59.2, 62.4}},
},
},
[210995] = { -- Alonso
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{43.4, 70.4}},
},
},
[211022] = { -- Owen Thadd
[npcKeys.spawns] = {
[zoneIDs.UNDERCITY] = {{73.4, 33}},
},
[npcKeys.friendlyToFaction] = "H",
},
[211033] = { -- Garion Wendell
[npcKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{37.8, 80.2}},
},
[npcKeys.friendlyToFaction] = "A",
},
[211146] = { -- Lost Adventurer
[npcKeys.spawns] = {
[zoneIDs.SILVERPINE_FOREST] = {},
},
},
[211736] = { -- Grizzled Protector
[npcKeys.spawns] = {
[zoneIDs.SILVERPINE_FOREST] = {},
},
},
[211951] = { -- Koartul
[npcKeys.spawns] = {
[zoneIDs.HILLSBRAD_FOOTHILLS] = {{60.8, 31.8}},
},
},
[211965] = { -- Carrodin
[npcKeys.spawns] = {
[zoneIDs.WETLANDS] = {{46.6, 65.6}},
},
},
[211200] = { -- Agon
[npcKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{65.1, 23.7}},
},
},
[212261] = { -- Awakened Lich
[npcKeys.spawns] = {},
},
[212694] = { -- Hirzek
[npcKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{43.2, 78.6}},
},
},
[212699] = { -- Silverwing Archer
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{28.6, 27.4},{51.2, 55.6},{59, 72.4},{73.6, 74.4}},
},
},
[212703] = { -- Silverwing Dryad
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{28.6, 27.4},{51.2, 55.6},{59, 72.4},{73.6, 74.4}},
},
},
[212706] = { -- Silverwing Druid
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{28.6, 27.4},{51.2, 55.6},{59, 72.4},{73.6, 74.4}},
},
},
[212707] = { -- Larodar
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{51.6, 54.6}},
},
},
[212727] = { -- Warsong Grunt
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{21.8, 38.6},{40.2, 65.2},{54, 54.6},{69.4, 62.4}},
},
},
[212728] = { -- Warsong Raider
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{21.8, 38.6},{40.2, 65.2},{54, 54.6},{69.4, 62.4}},
},
},
[212729] = { -- Warsong Shaman
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{21.8, 38.6},{40.2, 65.2},{54, 54.6},{69.4, 62.4}},
},
},
[212730] = { -- Tojara
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{53.6, 54.2}},
},
},
[212801] = { -- Jubei
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{21.6, 36.4}},
},
},
[212802] = { -- Moogul the Sly
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{70.2, 62.8}},
},
},
[212803] = { -- Ceredwyn
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{73.4, 73.4}},
},
},
[212804] = { -- Centrius
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{28.6, 27.8}},
},
},
[212809] = { -- Wailing Spirit
[npcKeys.spawns] = {
[zoneIDs.SILVERPINE_FOREST] = {{59.6, 71.4}},
},
},
[212837] = { -- Primordial Anomaly
[npcKeys.spawns] = {
[zoneIDs.STONETALON_MOUNTAINS] = {{32.6, 67.6}},
},
},
[212969] = { -- Kazragore
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{39.4, 67.2}},
},
},
[212970] = { -- Felore Moonray
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{59.8, 72.4}},
},
},
[213077] = { -- Elaine Compton
[npcKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{54.4, 61.2}},
},
[npcKeys.friendlyToFaction] = "A",
},
[214070] = { -- Jornah
[npcKeys.spawns] = {
[zoneIDs.ORGRIMMAR] = {{51.4, 63.8}},
},
[npcKeys.friendlyToFaction] = "H",
},
[214096] = { -- Dokimi
[npcKeys.spawns] = {
[zoneIDs.THUNDER_BLUFF] = {{39.2, 53.4}},
},
[npcKeys.friendlyToFaction] = "H",
},
[214098] = { -- Gishah
[npcKeys.spawns] = {
[zoneIDs.UNDERCITY] = {{64, 39.2}},
},
[npcKeys.friendlyToFaction] = "H",
},
[214099] = { -- Tamelyn Aldridge
[npcKeys.spawns] = {
[zoneIDs.IRONFORGE] = {{24.4, 67.6}},
},
[npcKeys.friendlyToFaction] = "A",
},
[214101] = { -- Marcy Baker
[npcKeys.spawns] = {
[zoneIDs.DARNASSUS] = {{59.8, 56.4}},
},
[npcKeys.friendlyToFaction] = "A",
},
[214456] = { -- Dro'zem the Blasphemous
[npcKeys.spawns] = {
[zoneIDs.REDRIDGE_MOUNTAINS] = {{35.4, 8.6},{64.2, 45.8},{77.4, 69.4}},
},
},
[214519] = { -- Incinerator Gar'im
[npcKeys.spawns] = {
[zoneIDs.REDRIDGE_MOUNTAINS] = {{77.6, 85.8}},
},
},
[215850] = { -- Raszel Ander
[npcKeys.friendlyToFaction] = "AH",
},
[216289] = { -- Orokai
[npcKeys.spawns] = {
[zoneIDs.MOONGLADE] = {{41.2, 43.6}},
},
},
[216902] = { -- Wulmort Jinglepocket
[npcKeys.spawns] = {
[zoneIDs.IRONFORGE] = {{33.7, 67.23}},
},
[npcKeys.friendlyToFaction] = "AH",
},
[216915] = { -- Strange Snowman
[npcKeys.spawns] = {
[zoneIDs.ALTERAC_MOUNTAINS]={{35.43, 72.45}},
},
},
[216924] = { -- Kaymard Copperpinch
[npcKeys.spawns] = {
[zoneIDs.ORGRIMMAR] = {{53.3, 66.47}},
},
[npcKeys.friendlyToFaction] = "AH",
},
[217392] = {
[npcKeys.spawns] = {
[zoneIDs.DESOLACE]={{56.4, 21.8}},
},
},
[217669] = { -- Scorched Screeching Roguefeather
[npcKeys.spawns] = {
[zoneIDs.THOUSAND_NEEDLES] = {{26.4, 46.4}},
},
},
[217683] = {
[npcKeys.zoneID] = zoneIDs.THOUSAND_NEEDLES,
[npcKeys.spawns] = {
[zoneIDs.THOUSAND_NEEDLES] = {{39.4,42}},
},
},
[217703] = { -- Singed Highperch Consort
[npcKeys.friendlyToFaction] = "H",
[npcKeys.spawns] = {
[zoneIDs.THOUSAND_NEEDLES] = {{10.4, 40.2}},
},
},
[217706] = { -- Kazragore
[npcKeys.friendlyToFaction] = "H",
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{74.0, 60.6}},
},
},
[217707] = { -- Felore Moonray
[npcKeys.friendlyToFaction] = "A",
},
[217711] = { -- Seared Needles Cougar
[npcKeys.spawns] = {
[zoneIDs.THOUSAND_NEEDLES] = {{23.4, 23.4}},
},
},
[217412] = { -- Amaryllis Webb
[npcKeys.spawns] = {
[zoneIDs.SWAMP_OF_SORROWS] = {{25.2, 54.6}},
},
},
[217588] = { -- Arbor Tarantula
[npcKeys.spawns] = {
[zoneIDs.STRANGLETHORN_VALE] = {{45.2, 19.6}},
},
},
[217589] = { -- Hay Weevil
[npcKeys.spawns] = {
[zoneIDs.ARATHI_HIGHLANDS] = {{30.8, 28.6},{54.2, 38.6},{61.2, 55.4}},
},
},
[217590] = { -- Flesh Picker
[npcKeys.spawns] = {
[zoneIDs.DESOLACE] = {{51.4, 59.8}},
},
},
[218115] = { -- Mai'zin
[npcKeys.spawns] = {
[zoneIDs.STRANGLETHORN_VALE] = {{31.2, 48.4}},
},
},
[218160] = { -- Aeonas the Vindicated
[npcKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{37.4, 31.8}},
},
},
[218237] = { -- Wirdal Wondergear
[npcKeys.friendlyToFaction] = "AH",
[npcKeys.zoneID] = zoneIDs.FERALAS,
[npcKeys.spawns] = {
[zoneIDs.FERALAS] = {{84.2,43.8}},
},
},
[218931] = { -- Dark Rider Deadwind Pass
[npcKeys.zoneID] = zoneIDs.DEADWIND_PASS,
[npcKeys.spawns] = {
[zoneIDs.DEADWIND_PASS] = {{43,29}},
},
},
[221210] = { -- Kroll Mountainshade
[npcKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{66.11, 69.28}},
},
},
[221215] = { -- Alara Grovemender
[npcKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{49.15, 77.55}},
},
},
[221216] = { -- Elenora Marshwalker
[npcKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{32.39, 69.48}},
},
},
[221268] = { -- Doran Dreambough
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{87.23, 43.56}},
},
},
[221269] = { -- Maseara Autumnmoon
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{81.2, 50.5}},
},
},
[221270] = { -- Alyssian Windcaller
[npcKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{92, 54.0}},
},
},
[221335] = { -- Elianar Shadowdrinker
[npcKeys.spawns] = {
[zoneIDs.THE_HINTERLANDS] = {{53.47, 39.05}},
},
},
[221336] = { -- Serlina Starbright
[npcKeys.spawns] = {
[zoneIDs.THE_HINTERLANDS] = {{71.11, 47.98}},
},
},
[221337] = { -- Veanna Cloudsleeper
[npcKeys.spawns] = {
[zoneIDs.THE_HINTERLANDS] = {{57.29, 42.80}},
},
},
[221395] = { -- Mellias Earthtender
[npcKeys.spawns] = {
[zoneIDs.FERALAS] = {{49.65, 15.35}},
},
},
[221398] = { -- Nerene Brooksinger
[npcKeys.spawns] = {
[zoneIDs.FERALAS] = {{46.00, 16.50}},
},
},
[221399] = { -- Jamniss Treemender
[npcKeys.spawns] = {
[zoneIDs.FERALAS] = {{40.62, 8.08}},
},
},
[221484] = { -- Scout Thandros
[npcKeys.spawns] = {
[zoneIDs.FERALAS] = {{51.06,10.54}},
},
},
[222188] = { -- Shadowy Figure
[npcKeys.spawns] = {
[zoneIDs.MOONGLADE] = {{52.12,40.89}},
},
},
-- fake NPCs
[900000] = {
[npcKeys.name] = "Dark Rider",
[npcKeys.minLevel] = 41,
[npcKeys.maxLevel] = 41,
[npcKeys.zoneID] = zoneIDs.DUSKWOOD,
[npcKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{23,47}},
},
},
[900001] = {
[npcKeys.name] = "Dark Rider",
[npcKeys.minLevel] = 41,
[npcKeys.maxLevel] = 41,
[npcKeys.zoneID] = zoneIDs.ARATHI_HIGHLANDS,
[npcKeys.spawns] = {
[zoneIDs.ARATHI_HIGHLANDS] = {{60,40}},
},
},
[900002] = {
[npcKeys.name] = "Dark Rider",
[npcKeys.minLevel] = 41,
[npcKeys.maxLevel] = 41,
[npcKeys.zoneID] = zoneIDs.SWAMP_OF_SORROWS,
[npcKeys.spawns] = {
[zoneIDs.SWAMP_OF_SORROWS] = {{69,28}},
},
},
[900003] = {
[npcKeys.name] = "Dark Rider",
[npcKeys.minLevel] = 41,
[npcKeys.maxLevel] = 41,
[npcKeys.zoneID] = zoneIDs.THE_BARRENS,
[npcKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{52,36}},
},
},
[900004] = {
[npcKeys.name] = "Dark Rider",
[npcKeys.minLevel] = 41,
[npcKeys.maxLevel] = 41,
[npcKeys.zoneID] = zoneIDs.DESOLACE,
[npcKeys.spawns] = {
[zoneIDs.DESOLACE] = {{65,25}},
},
},
[900005] = {
[npcKeys.name] = "Dark Rider",
[npcKeys.minLevel] = 41,
[npcKeys.maxLevel] = 41,
[npcKeys.zoneID] = zoneIDs.BADLANDS,
[npcKeys.spawns] = {
[zoneIDs.BADLANDS] = {{58,54}},
},
},
}
end
-474
View File
@@ -1,474 +0,0 @@
---@type SeasonOfDiscovery
local SeasonOfDiscovery = QuestieLoader:ImportModule("SeasonOfDiscovery")
---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
---@type ZoneDB
local ZoneDB = QuestieLoader:ImportModule("ZoneDB")
function SeasonOfDiscovery:LoadObjects()
local objectKeys = QuestieDB.objectKeys
local zoneIDs = ZoneDB.zoneIDs
return {
[386675] = { -- Buried Treasure
[objectKeys.zoneID] = zoneIDs.DUN_MOROGH,
[objectKeys.spawns] = {
[zoneIDs.DUN_MOROGH] = {{46.96,43.73}},
},
},
[386691] = { -- Library Book
[objectKeys.spawns] = {
[zoneIDs.IRONFORGE] = {{76, 10.4}},
},
},
[386777] = { -- Dusty Chest Stormwind
[objectKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{61.9, 29.3}},
},
},
[402215] = { -- Charred Note
[objectKeys.zoneID] = zoneIDs.STORMWIND_CITY,
[objectKeys.spawns] = {
[zoneIDs.STORMWIND_CITY] = {{33,24.7}},
},
},
[403041] = { -- Blasting Supplies
[objectKeys.zoneID] = zoneIDs.MULGORE,
[objectKeys.spawns] = {
[zoneIDs.MULGORE] = {{63.8,44.1}},
},
},
[403105] = { -- Windfury Cone
[objectKeys.zoneID] = zoneIDs.MULGORE,
[objectKeys.spawns] = {
[zoneIDs.MULGORE] = {{31.2,22.8},{31,26.4},{32.4,27.6},{35,13.6},{38.2,9},{39.6,7},{51,7.2},{55.2,12},{55.8,16}},
},
},
[403718] = { -- Prairie Flower
[objectKeys.zoneID] = zoneIDs.MULGORE,
[objectKeys.spawns] = {
[zoneIDs.MULGORE] = {{37.81, 65.45},{38.17, 57.14},{39.85, 51.63},{41.39, 63.2},{45.01, 46.77},{50.97, 46.03},{51.77, 67.3},{53.29, 63.13},{54.31, 58.05},{58.41, 66.64},{58.85, 51.32}},
},
},
[404352] = { -- Artifact Storage Mulgore
[objectKeys.zoneID] = zoneIDs.MULGORE,
[objectKeys.spawns] = {
[zoneIDs.MULGORE] = {{31.6, 49.4}},
},
},
[405201] = { -- Shipwreck Cache Tirisfal Glades
[objectKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{66.7, 24.6}},
},
},
[405946] = { -- Dusty Chest
[objectKeys.zoneID] = zoneIDs.IRONFORGE,
[objectKeys.spawns] = {
[zoneIDs.IRONFORGE] = {{52.0, 13.6}},
},
},
[406736] = { -- Lost Stash
[objectKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{24.7, 59.4}},
},
},
[407117] = { -- Abandoned Snapjaw Nest
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{44,22}},
},
},
[407120] = { -- Empty Snapjaw Nest
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{48,40}},
},
},
[407247] = { -- Glade Flower
[objectKeys.zoneID] = zoneIDs.TELDRASSIL,
[objectKeys.spawns] = {
[zoneIDs.TELDRASSIL] = {{57.06, 65.57},{58.05, 73.19},{59.63, 60.05},{61.09, 54.02},{63.88, 64.90},{64.89, 54.77},{65.64, 59.22},{66.56, 51.55},{67.36, 64.15},{69.56, 55.75}},
},
},
[407289] = { -- Horde Warbanner
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{52.2,31.1}},
},
},
[407291] = { -- Alliance Warbanner
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{62.55,56.31}},
},
},
[407453] = { -- Southsea Loot Stash
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{61.81,45.84}},
},
},
[407454] = { -- Gunpowder Keg
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{61.78,45.8}},
},
},
[407457] = { -- Stable Hand's Trunk
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{61.3, 54.1}},
},
},
[407505] = { -- Etched Carving
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{45,79}},
},
},
[407731] = { -- Stonemason's Toolbox
[objectKeys.zoneID] = zoneIDs.LOCH_MODAN,
[objectKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{46.5, 12.7}},
},
},
[407734] = { -- Gnarlpine Cache
[objectKeys.spawns] = {
[zoneIDs.TELDRASSIL] = {{44.1, 61.2}},
},
},
[407844] = { -- Libram of Blessings
[objectKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{35.8, 49.5}},
},
},
[407850] = { -- Sunken Reliquary
[objectKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{36.8, 91.4}},
},
},
[407918] = { -- Empty Trophy Display
[objectKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{83.6, 65.5}},
},
},
[408004] = { -- Tangled Blight Pile
[objectKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{71.7, 21.4}},
},
},
[408718] = { -- Equipment Stash
[objectKeys.zoneID] = zoneIDs.WESTFALL,
[objectKeys.spawns] = {
[zoneIDs.WESTFALL] = {{40.8,80.24}},
},
},
[408799] = { -- Idol of the Deep
[objectKeys.zoneID] = zoneIDs.WESTFALL,
[objectKeys.spawns] = {
[zoneIDs.WESTFALL] = {{26,69.5}},
},
},
[409289] = { -- Strange Orb
[objectKeys.spawns] = {
[zoneIDs.DARKSHORE] = {{56.2, 26.4},},
},
},
[409311] = {
[objectKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{89.4, 77.1}},
},
},
[409562] = { -- Spellbook
[objectKeys.spawns] = {
[zoneIDs.WESTFALL] = {{45.4, 70.4}},
},
},
[409692] = { -- Scrolls
[objectKeys.zoneID] = zoneIDs.THE_BARRENS,
[objectKeys.spawns] = {
[zoneIDs.THE_BARRENS] = {{49.3,33.5}},
},
},
[409731] = { -- Scrolls
[objectKeys.spawns] = {
[zoneIDs.LOCH_MODAN] = {{77.4, 14}},
},
},
[409735] = { -- Spellbook
[objectKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{16.7, 28.4}},
},
},
[409942] = { -- Twin Owl Statue
[objectKeys.spawns] = {
[zoneIDs.HILLSBRAD_FOOTHILLS] = {{36.9, 76.1}},
},
},
[409949] = { -- Twin Owl Statue
[objectKeys.spawns] = {
[zoneIDs.HILLSBRAD_FOOTHILLS] = {{54.0, 83.0}},
},
},
[410020] = { -- Owl Statue
[objectKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{87.0, 43.2}},
},
},
[410089] = { -- Owl Statue
[objectKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{49.5, 33.8}},
},
},
[410847] = { -- Rusty Safe Western Plaguelands
[objectKeys.zoneID] = zoneIDs.WESTERN_PLAGUELANDS,
[objectKeys.spawns] = {
[zoneIDs.WESTERN_PLAGUELANDS] = {{59.5, 84.5}},
},
},
[411328] = { -- Slumbering Bones
[objectKeys.zoneID] = zoneIDs.DUSKWOOD,
[objectKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{17,37.6}},
},
},
[411674] = { -- Prophecy of a King's Demise
[objectKeys.spawns] = {
[130] = {{65.8, 23.4}},
},
},
[412147] = { -- Supply Locker
[objectKeys.zoneID] = zoneIDs.TIRISFAL_GLADES,
[objectKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{81.18,32.12}},
},
},
[414658] = { -- Rubble
[objectKeys.zoneID] = zoneIDs.HILLSBRAD_FOOTHILLS,
[objectKeys.spawns] = {
[zoneIDs.HILLSBRAD_FOOTHILLS] = {{79.7, 40.9}},
},
},
[415107] = {
[objectKeys.spawns] = {
[zoneIDs.WESTFALL] = {{37.4, 50.7}},
},
},
[419741] = { -- Sacrificial Altar
[objectKeys.zoneID] = zoneIDs.DESOLACE,
[objectKeys.spawns] = {
[zoneIDs.DESOLACE] = {{81.4,79.8}},
},
},
[420055] = { -- Rowboat
[objectKeys.zoneID] = zoneIDs.ARATHI_HIGHLANDS,
[objectKeys.spawns] = {
[zoneIDs.ARATHI_HIGHLANDS] = {{53.7,91.9}},
[zoneIDs.WETLANDS] = {{58.31,6.94}},
},
},
[422895] = {
[objectKeys.zoneID] = zoneIDs.DESOLACE,
[objectKeys.spawns] = {
[zoneIDs.DESOLACE] = {{39,57}},
},
},
[423898] = { -- Mysterious Book
[objectKeys.zoneID] = zoneIDs.DESOLACE,
[objectKeys.spawns] = {
[zoneIDs.DESOLACE] = {{55,26.2}},
},
},
[424074] = { -- Quadrangulation Beacon 001
[objectKeys.zoneID] = zoneIDs.DUSTWALLOW_MARSH,
[objectKeys.spawns] = {
[zoneIDs.DUSTWALLOW_MARSH] = {{58.6, 13.0}},
},
},
[424075] = { -- Quadrangulation Beacon 002
[objectKeys.zoneID] = zoneIDs.DESOLACE,
[objectKeys.spawns] = {
[zoneIDs.DESOLACE] = {{32.0, 72.7}},
},
},
[424076] = { -- Quadrangulation Beacon 003
[objectKeys.zoneID] = zoneIDs.TANARIS,
[objectKeys.spawns] = {
[zoneIDs.TANARIS] = {{37.8, 27.3}},
},
},
[424077] = { -- Quadrangulation Beacon 004
[objectKeys.zoneID] = zoneIDs.FERALAS,
[objectKeys.spawns] = {
[zoneIDs.FERALAS] = {{29.3, 93.8}},
},
},
[424082] = {
[objectKeys.spawns] = {},
},
[424264] = { -- Grave
[objectKeys.spawns] = {
[zoneIDs.DUSTWALLOW_MARSH] = {{63.7, 42.4}},
},
},
[424265] = { -- Grave
[objectKeys.zoneID] = zoneIDs.SWAMP_OF_SORROWS,
[objectKeys.spawns] = {
[zoneIDs.SWAMP_OF_SORROWS] = {{16.8,53.8}},
},
},
[424266] = { -- Grave
[objectKeys.zoneID] = zoneIDs.SCARLET_MONASTERY,
[objectKeys.spawns] = {
[zoneIDs.SCARLET_MONASTERY] = {{-1,-1}},
},
},
[424267] = { -- Grave
[objectKeys.zoneID] = zoneIDs.ARATHI_HIGHLANDS,
[objectKeys.spawns] = {
[zoneIDs.ARATHI_HIGHLANDS] = {{62,54}},
},
},
[441848] = { -- Small Burrow
[objectKeys.zoneID] = zoneIDs.STRANGLETHORN_VALE,
[objectKeys.spawns] = {
[zoneIDs.STRANGLETHORN_VALE] = {{40.75,85.72}},
},
},
-- fake ID - no clue yet what the correct ones are
[450000] = {
[objectKeys.name] = "Arcane Shard",
[objectKeys.zoneID] = zoneIDs.ASHENVALE,
[objectKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{13.1,24.8},{13,15},{14,19}},
},
},
[450001] = {
[objectKeys.name] = "The Lessons of Ta'zo",
[objectKeys.zoneID] = zoneIDs.ORGRIMMAR,
[objectKeys.spawns] = {
[zoneIDs.ORGRIMMAR] = {{38.7,78.4}},
},
},
[450002] = {
[objectKeys.name] = "Medusa Statue",
[objectKeys.zoneID] = zoneIDs.WESTFALL,
[objectKeys.spawns] = {
[zoneIDs.WESTFALL] = {{26,70}},
},
},
[450003] = {
[objectKeys.name] = "Thistlefur Dreamcatcher",
[objectKeys.zoneID] = zoneIDs.ASHENVALE,
[objectKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{38,26}},
},
},
[450004] = {
[objectKeys.name] = "Wishing Well",
[objectKeys.zoneID] = zoneIDs.LOCH_MODAN,
[objectKeys.spawns] = {
[zoneIDs.ASHENVALE] = {{36.4,19.6}},
},
},
[450005] = {
[objectKeys.name] = "Buried Treasure",
[objectKeys.zoneID] = zoneIDs.ELWYNN_FOREST,
[objectKeys.spawns] = {
[zoneIDs.ELWYNN_FOREST] = {{80.3, 79.1}},
},
},
[450006] = {
[objectKeys.name] = "Buried Treasure",
[objectKeys.zoneID] = zoneIDs.DUROTAR,
[objectKeys.spawns] = {
[zoneIDs.DUROTAR] = {{62.1, 94.8}},
},
},
[450007] = {
[objectKeys.name] = "Buried Treasure",
[objectKeys.zoneID] = zoneIDs.TIRISFAL_GLADES,
[objectKeys.spawns] = {
[zoneIDs.TIRISFAL_GLADES] = {{52.9, 54}},
},
},
[450008] = {
[objectKeys.name] = "Buried Treasure",
[objectKeys.zoneID] = zoneIDs.TELDRASSIL,
[objectKeys.spawns] = {
[zoneIDs.TELDRASSIL] = {{55.3, 90.8}},
},
},
[450009] = {
[objectKeys.name] = "Secluded Grave",
[objectKeys.zoneID] = zoneIDs.DUSKWOOD,
[objectKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{90.9,30.5}},
},
},
[450010] = {
[objectKeys.name] = "Raven Hill Statue",
[objectKeys.zoneID] = zoneIDs.DUSKWOOD,
[objectKeys.spawns] = {
[zoneIDs.DUSKWOOD] = {{19.9,45.5}},
},
},
[450011] = {
[objectKeys.name] = "Galvanic Icon",
[objectKeys.zoneID] = zoneIDs.DUROTAR,
[objectKeys.spawns] = {
[zoneIDs.DUROTAR] = {{38.01, 35.53},{53.36, 50.48},{51.78, 56.39},{36.95, 45.53},{56.53, 28.37},{39.43, 50.06}},
},
},
[450012] = {
[objectKeys.name] = "Galvanic Icon",
[objectKeys.zoneID] = zoneIDs.MULGORE,
[objectKeys.spawns] = {
[zoneIDs.MULGORE] = {{54.07, 55.82},{36.3, 9.8},{37.5, 52.5},{41.65, 55.98},{37.99, 60.04}},
},
},
[450013] = {
[objectKeys.name] = "Beastly Effigy",
[objectKeys.zoneID] = zoneIDs.THOUSAND_NEEDLES,
[objectKeys.spawns] = {
[zoneIDs.THOUSAND_NEEDLES] = {{69.0, 55.0}},
},
},
[450014] = {
[objectKeys.name] = "Witherbark Gong",
[objectKeys.zoneID] = zoneIDs.ARATHI_HIGHLANDS,
[objectKeys.spawns] = {
[zoneIDs.ARATHI_HIGHLANDS] = {{69.33, 81.50}},
},
},
[450015] = {
[objectKeys.name] = "Satyrweed Bulb Location",
[objectKeys.zoneID] = zoneIDs.DESOLACE,
[objectKeys.spawns] = {
[zoneIDs.DESOLACE] = {{70.0, 70.0}},
},
},
[450016] = {
[objectKeys.name] = "Strahnbrad Bellows",
[objectKeys.zoneID] = zoneIDs.ALTERAC_MOUNTAINS,
[objectKeys.spawns] = {
[zoneIDs.ALTERAC_MOUNTAINS] = {{60.0, 46.4}},
},
},
[450017] = {
[objectKeys.name] = "Crate",
[objectKeys.zoneID] = zoneIDs.MOONGLADE,
[objectKeys.spawns] = {
[zoneIDs.MOONGLADE] = {{55.6,66.5}},
},
},
[450018] = {
[objectKeys.name] = "Soft Soil",
[objectKeys.zoneID] = zoneIDs.ARATHI_HIGHLANDS,
[objectKeys.spawns] = {
[zoneIDs.ARATHI_HIGHLANDS] = {{34,44}},
},
},
}
end
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -1,4 +1,4 @@
---@class QuestieTBCQuestFixes
---@class QuestieTBCQuestFixes
local QuestieTBCQuestFixes = QuestieLoader:CreateModule("QuestieTBCQuestFixes")
local _QuestieTBCQuestFixes = {}
@@ -5295,6 +5295,7 @@ function QuestieTBCQuestFixes:Load()
end
function _QuestieTBCQuestFixes:InsertMissingQuestIds()
if not QuestieDB.questData then return end
QuestieDB.questData[12192] = {} -- This One Time, When I Was Drunk... (Horde)
QuestieDB.questData[12420] = {} -- Brew of the Month Club (Alliance)
QuestieDB.questData[12421] = {} -- Brew of the Month Club (Horde)
+2 -1
View File
@@ -1,4 +1,4 @@
---@class QuestieWotlkItemFixes
---@class QuestieWotlkItemFixes
local QuestieWotlkItemFixes = QuestieLoader:CreateModule("QuestieWotlkItemFixes")
local _QuestieWotlkItemFixes = {}
@@ -734,6 +734,7 @@ function QuestieWotlkItemFixes:Load()
end
function _QuestieWotlkItemFixes:InsertMissingItemIds()
if not QuestieDB.itemData then return end
-- Boost quest items
QuestieDB.itemData[199335] = {} -- Teleport Scroll: Menethil Harbor
QuestieDB.itemData[199336] = {} -- Teleport Scroll: Stormwind Harbor
+2 -1
View File
@@ -1,4 +1,4 @@
---@class QuestieWotlkQuestFixes
---@class QuestieWotlkQuestFixes
local QuestieWotlkQuestFixes = QuestieLoader:CreateModule("QuestieWotlkQuestFixes")
local _QuestieWotlkQuestFixes = {}
@@ -7049,6 +7049,7 @@ function QuestieWotlkQuestFixes:Load()
end
function _QuestieWotlkQuestFixes:InsertMissingQuestIds()
if not QuestieDB.questData then return end
-- Alliance boosted quests
QuestieDB.questData[70395] = {} -- A New Beginning
+34 -6
View File
@@ -1166,8 +1166,30 @@ function QuestieDB.GetQuest(questId) -- /dump QuestieDB.GetQuest(867)
if questId == 0 then
Questie:Error("[QuestieDB.GetQuest] rawdata is nil for questID:", questId)
print(debugstack())
return nil
end
return nil
-- Build a minimal live-fallback quest from the quest log so the tracker still works
local logEntry = QuestLogCache.GetQuest(questId)
if not logEntry then return nil end
local fallback = {
Id = questId,
name = logEntry.title or tostring(questId),
level = logEntry.level or 0,
questLevel = logEntry.level or 0,
requiredLevel = 0,
zoneOrSort = 0,
questFlags = 0,
specialFlags = 0,
Starts = { CreatureStarts = {}, ObjectStarts = {}, ItemStarts = {} },
Finisher = { Type = "monster", Id = 0, Name = "" },
Objectives = {},
ObjectiveData = {},
ExtraObjectives= {},
_isLogFallback = true,
isComplete = (logEntry.isComplete == 1),
}
_QuestieDB.questCache[questId] = fallback
return fallback
end
---@class Quest
@@ -1435,10 +1457,14 @@ function QuestieDB.GetQuest(questId) -- /dump QuestieDB.GetQuest(867)
local spawnList = {}
for _, ref in pairs(o[5]) do
for k, v in pairs(_QuestieQuest.objectiveSpawnListCallTable[ref[1]](ref[2], specialObjective)) do
-- we want to be able to override the icon in the corrections (e.g. Questie.ICON_TYPE_OBJECT on objects instead of Questie.ICON_TYPE_LOOT)
v.Icon = o[2]
spawnList[k] = v
local callFn = _QuestieQuest.objectiveSpawnListCallTable[ref[1]]
local spawnResult = callFn and callFn(ref[2], specialObjective)
if spawnResult then
for k, v in pairs(spawnResult) do
-- we want to be able to override the icon in the corrections (e.g. Questie.ICON_TYPE_OBJECT on objects instead of Questie.ICON_TYPE_LOOT)
v.Icon = o[2]
spawnList[k] = v
end
end
end
@@ -1712,7 +1738,9 @@ function _QuestieDB:DeleteGatheringNodes()
local objectSpawnsKey = QuestieDB.objectKeys.spawns
for i=1, #prune do
local id = prune[i]
QuestieDB.objectData[id][objectSpawnsKey] = nil
if QuestieDB.objectData[id] then
QuestieDB.objectData[id][objectSpawnsKey] = nil
end
end
end
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+37 -18
View File
@@ -345,13 +345,23 @@ readers["extraobjectives"] = function(stream)
if count > 0 then
local ret = {}
for i=1,count do
ret[i] = {
local entry = {
readers["spawnlist"](stream),
stream:ReadInt24(),
stream:ReadShortString(),
stream:ReadInt24(),
readers["reflist"](stream)
}
local condCount = stream:ReadByte()
if condCount > 0 then
local conds = {}
for _=1,condCount do
local k = stream:ReadShortString()
conds[k] = stream:ReadInt24()
end
entry[6] = conds
end
ret[i] = entry
end
return ret
end
@@ -663,6 +673,18 @@ QuestieDBCompiler.writers = {
stream:WriteShortString(data[3]) -- description
stream:WriteInt24(data[4] or 0) -- objective index (or 0)
QuestieDBCompiler.writers["reflist"](stream, data[5] or {})
local conds = data[6]
if type(conds) == "table" then
local n = 0
for _ in pairs(conds) do n = n + 1 end
stream:WriteByte(n)
for k, v in pairs(conds) do
stream:WriteShortString(k)
stream:WriteInt24(v)
end
else
stream:WriteByte(0)
end
end
else
stream:WriteByte(0)
@@ -792,6 +814,11 @@ skippers["extraobjectives"] = function(stream)
stream._pointer = stream:ReadShort() + stream._pointer
stream._pointer = stream._pointer + 3
reflistSkipper(stream)
local condCount = stream:ReadByte()
for _=1,condCount do
stream._pointer = stream:ReadShort() + stream._pointer -- skip ShortString key
stream._pointer = stream._pointer + 3 -- skip Int24 value
end
end
end
@@ -1029,6 +1056,14 @@ function QuestieDBCompiler:Compile()
return
end
local hasData = type(QuestieDB.questData) == "string"
or type(QuestieDB.questData) == "table"
or (type(QuestieDB.questDataOverrides) == "table" and next(QuestieDB.questDataOverrides) ~= nil)
if not hasData then
Questie:Print("|cFFFF4444[Questie-X]|r No database plugin loaded. Install a DB plugin for your server — see Options \226\134\146 Database.")
return
end
QuestieDBCompiler._isCompiling = true -- some unknown addon that is popular in china causes player_logged_in event to fire many times which triggers db compile multiple times
QuestieDBCompiler.startTime = GetTime()
@@ -1087,10 +1122,6 @@ function QuestieDBCompiler:ValidateNPCs()
elseif type(a) == "table" then
if not equals(a, (b or {})) then
Questie:Warning("Nonmatching table at " .. key .. " " .. id .. " for ID: ".. npcId)
DevTools_Dump({
["Compiled Table:"] = a,
["Base Table:"] = b
})
return
end
end
@@ -1135,10 +1166,6 @@ function QuestieDBCompiler:ValidateObjects()
elseif type(a) == "table" then
if not equals(a, (b or {})) then
Questie:Warning("Nonmatching table at " .. key .. " " .. id .. " for ID: ".. objectId)
DevTools_Dump({
["Compiled Table:"] = a,
["Base Table:"] = b
})
return
end
end
@@ -1252,10 +1279,6 @@ function QuestieDBCompiler:ValidateItems()
elseif type(a) == "table" then
if not equals(a, (b or {})) then
Questie:Warning("Nonmatching table at " .. key .. " " .. id .. " for ID: ".. itemId)
DevTools_Dump({
["Compiled Table:"] = a,
["Base Table:"] = b
})
return
end
end
@@ -1291,7 +1314,7 @@ function QuestieDBCompiler:ValidateQuests()
local function getTbcLevel(questLevel, requiredLevel, playerLevel)
if (questLevel == -1) then
local level = playerLevel
if (requiredLevel > level) then
if (requiredLevel and requiredLevel > level) then
questLevel = requiredLevel;
else
questLevel = level;
@@ -1349,10 +1372,6 @@ function QuestieDBCompiler:ValidateQuests()
if not equals(a, (b or {})) then
Questie:Warning("Nonmatching table at " .. key .. " " .. id .. " for ID: ".. questId)
DevTools_Dump({
["Compiled Table:"] = a,
["Base Table:"] = b
})
return
end
end
+2
View File
@@ -122,3 +122,5 @@ QuestieDB._itemAdapterQueryOrder = {}
for key, id in pairs(QuestieDB.itemKeys) do
QuestieDB._itemAdapterQueryOrder[id] = key
end
-- itemData is nil until a DB plugin sets it
+2
View File
@@ -95,3 +95,5 @@ QuestieDB._npcAdapterQueryOrder = {}
for key, id in pairs(QuestieDB.npcKeys) do
QuestieDB._npcAdapterQueryOrder[id] = key
end
-- npcData is nil until a DB plugin sets it
+2
View File
@@ -38,3 +38,5 @@ QuestieDB._objectAdapterQueryOrder = {}
for key, id in pairs(QuestieDB.objectKeys) do
QuestieDB._objectAdapterQueryOrder[id] = key
end
-- objectData is nil until a DB plugin sets it
+3
View File
@@ -126,3 +126,6 @@ QuestieDB._questAdapterQueryOrder = {}
for key, id in pairs(QuestieDB.questKeys) do
QuestieDB._questAdapterQueryOrder[id] = key
end
-- questData is nil until a DB plugin sets it (e.g. Questie-X-WotLKDB)
-- LoadDatabase checks truthiness before calling loadstring; {} would be truthy and crash it
+1
View File
@@ -253,6 +253,7 @@ end
---@param level number @The quest level
---@param blizzLike boolean @True = [40+], false/nil = [40D/R]
function QuestieLib:GetQuestString(questId, name, level, blizzLike)
if not name then return tostring(questId) end
local questType, questTag = QuestieDB.GetQuestTagInfo(questId)
if questType and questTag then
+2 -2
View File
@@ -106,10 +106,10 @@ end
-- The only public class except for Questie
---@class QuestieLoader
QuestieLoader = {}
QuestieLoader = QuestieLoader or {}
local modules = {}
local modules = (QuestieLoader._modules) or {}
QuestieLoader._modules = modules -- store reference so modules can be iterated for profiling
+51 -1
View File
@@ -2,6 +2,20 @@
local QuestiePluginAPI = QuestieLoader:CreateModule("QuestiePluginAPI")
QuestiePluginAPI.registeredPlugins = {}
QuestiePluginAPI.loadedDBFlavor = nil -- set by the first DB plugin that calls FinishLoading
--- Returns true if at least one DB plugin has fully loaded.
---@return boolean
function QuestiePluginAPI:IsAnyPluginLoaded()
for _ in pairs(self.registeredPlugins) do return true end
return false
end
--- Returns the flavor key of the loaded DB plugin ("WotLK", "Classic", "TBC", "Turtle", "Ascension", etc.)
---@return string|nil
function QuestiePluginAPI:GetLoadedFlavor()
return self.loadedDBFlavor
end
---@class QuestiePlugin
local QuestiePlugin = {}
@@ -181,7 +195,8 @@ function QuestiePlugin:InjectUiMapData(customUiMapData)
end
--- Signals that the plugin has finished loading. This automatically cleans up necessary caches.
function QuestiePlugin:FinishLoading()
---@param flavorKey string|nil Optional flavor label e.g. "WotLK", "Classic", "Turtle"
function QuestiePlugin:FinishLoading(flavorKey)
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
if not QuestieDB then
Questie:Debug(Questie.DEBUG_CRITICAL, "[QuestiePluginAPI] Plugin '" .. self.name .. "' FinishLoading failed: QuestieDB module not found.")
@@ -195,5 +210,40 @@ function QuestiePlugin:FinishLoading()
if QuestieDB.autoBlacklist then
QuestieDB.autoBlacklist = {}
end
if flavorKey then
QuestiePluginAPI.loadedDBFlavor = flavorKey
elseif not QuestiePluginAPI.loadedDBFlavor then
QuestiePluginAPI.loadedDBFlavor = self.name
end
Questie:Debug(Questie.DEBUG_INFO, "[QuestiePluginAPI] Plugin '" .. self.name .. "' finished loading successfully.")
end
--- Injects XP-per-level data used by QuestieXP. The table must be keyed by level number.
---@param xpTable table { [level] = xp_required, ... }
function QuestiePlugin:InjectXpData(xpTable)
if type(xpTable) ~= "table" then return end
local QuestXP = QuestieLoader:ImportModule("QuestieXP")
if not QuestXP then
Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestiePluginAPI] Plugin '" .. self.name .. "': InjectXpData — QuestieXP module not loaded, skipping.")
return
end
QuestXP.db = xpTable
Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestiePluginAPI] Plugin '" .. self.name .. "' injected XP data (" .. tostring(#xpTable) .. " levels).")
end
--- Applies expansion-specific correction tables that are stored in QuestieDB
--- correction globals (set by correction files loaded by the plugin TOC).
--- Call this AFTER InjectDatabase calls and BEFORE FinishLoading.
function QuestiePlugin:InjectCorrections()
local QuestieCorrections = QuestieLoader:ImportModule("QuestieCorrections")
if not QuestieCorrections then
Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestiePluginAPI] Plugin '" .. self.name .. "': InjectCorrections — QuestieCorrections module not loaded, skipping.")
return
end
if QuestieCorrections.ApplyAll then
QuestieCorrections:ApplyAll()
end
Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestiePluginAPI] Plugin '" .. self.name .. "' applied corrections.")
end
+26 -1
View File
@@ -978,6 +978,11 @@ function QuestieQuest:UpdateObjectiveNotes(quest)
return
end
-- Fallback quests have no static DB data; their objectives are managed in PopulateQuestLogInfo
if quest._isLogFallback then
return
end
Questie:Debug(Questie.DEBUG_INFO, "[QuestieQuest] UpdateObjectiveNotes:", quest.Id)
for objectiveIndex, objective in pairs(quest.Objectives) do
local result, err = xpcall(QuestieQuest.PopulateObjective, ERR_FUNCTION, QuestieQuest, quest, objectiveIndex,
@@ -988,7 +993,7 @@ function QuestieQuest:UpdateObjectiveNotes(quest)
end
end
if next(quest.SpecialObjectives) then
if quest.SpecialObjectives and next(quest.SpecialObjectives) then
for _, objective in pairs(quest.SpecialObjectives) do
local result, err = xpcall(QuestieQuest.PopulateObjective, ERR_FUNCTION, QuestieQuest, quest, 0, objective,
true)
@@ -1639,7 +1644,27 @@ function QuestieQuest:PopulateQuestLogInfo(quest)
-- Live fallback quests (no static DB entry) manage their own Objectives.
-- Their per-objective Update() functions read directly from QuestLogCache.
if quest._isLogFallback then
-- Seed objectives from QuestLogCache on first call
if not next(quest.Objectives) then
local cachedObjectives = QuestLogCache.GetQuestObjectives(quest.Id)
if cachedObjectives then
for index, obj in pairs(cachedObjectives) do
quest.Objectives[index] = {
questId = quest.Id,
Index = index,
Description = obj.text or "",
Type = obj.type or "monster",
Collected = obj.numFulfilled or 0,
Needed = obj.numRequired or 0,
Completed = obj.finished or false,
isUpdated = false,
Update = _QuestieQuest.ObjectiveUpdate,
}
end
end
end
for _, obj in pairs(quest.Objectives) do
obj.isUpdated = false
obj:Update()
end
return true
+4 -1
View File
@@ -67,7 +67,10 @@ killcredit = function(npcId, objective, objectiveData)
local ret = {}
for npcIdIndex = 1, #objectiveData.IdList do
local killCreditNpcId = objectiveData.IdList[npcIdIndex]
ret[killCreditNpcId] = monster(killCreditNpcId, objective)[killCreditNpcId]
local monsterResult = monster(killCreditNpcId, objective)
if monsterResult then
ret[killCreditNpcId] = monsterResult[killCreditNpcId]
end
end
return ret
end
+53 -3
View File
@@ -94,15 +94,31 @@ local C_Timer = QuestieCompat.C_Timer
local coYield = coroutine.yield
local function _dbStats(t)
if type(t) ~= "table" then return "type=" .. type(t) end
local n, minK, maxK = 0, math.huge, 0
for k in pairs(t) do
n = n + 1
if type(k) == "number" then
if k < minK then minK = k end
if k > maxK then maxK = k end
end
end
return "count=" .. n .. " minID=" .. (minK == math.huge and 0 or minK) .. " maxID=" .. maxK
end
local function loadFullDatabase()
print("\124cFF4DDBFF [1/9] " .. l10n("Loading database") .. "...")
QuestieInit:LoadBaseDB()
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] After LoadBaseDB - quest:" .. _dbStats(QuestieDB.questData) .. " npc:" .. _dbStats(QuestieDB.npcData))
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] obj:" .. _dbStats(QuestieDB.objectData) .. " item:" .. _dbStats(QuestieDB.itemData))
print("\124cFF4DDBFF [2/9] " .. l10n("Applying database corrections") .. "...")
coYield()
QuestieCorrections:Initialize()
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] After Corrections - quest:" .. _dbStats(QuestieDB.questData) .. " npc:" .. _dbStats(QuestieDB.npcData))
print("\124cFF4DDBFF [3/9] " .. l10n("Initializing townfolks") .. "...")
coYield()
@@ -221,9 +237,12 @@ QuestieInit.Stages[1] = function() -- run as a coroutine
l10n("Questie DB has updated!") ..
"\124r\124cFFFF6F22 " .. l10n("Data is being processed, this may take a few moments and cause some lag..."))
loadFullDatabase()
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] Before Compile - quest:" .. _dbStats(QuestieDB.questData) .. " npc:" .. _dbStats(QuestieDB.npcData))
QuestieDBCompiler:Compile()
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] After Compile - quest:type=" .. type(QuestieDB.questData) .. " npc:type=" .. type(QuestieDB.npcData))
dbCompiled = true
else
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] DB was CACHED (no recompile)")
l10n:Initialize()
coYield()
QuestieCorrections:MinimalInit()
@@ -388,17 +407,48 @@ end
function QuestieInit:LoadDatabase(key)
if QuestieDB[key] then
if type(QuestieDB[key]) == "string" then
coYield()
QuestieDB[key] = loadstring(QuestieDB[key]) -- load the table from string (returns a function)
local fn, loadErr = loadstring(QuestieDB[key])
coYield()
QuestieDB[key] = QuestieDB[key]() -- execute the function (returns the table)
if fn then
local ok, result = pcall(fn)
if ok then
QuestieDB[key] = result
else
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] ERROR executing('" .. key .. "'): " .. tostring(result))
QuestieDB[key] = nil
end
else
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] ERROR loadstring('" .. key .. "'): " .. tostring(loadErr) .. " | len=" .. string.len(QuestieDB[key] or ""))
QuestieDB[key] = nil
end
elseif type(QuestieDB[key]) == "table" then
Questie:Debug(Questie.DEBUG_DEVELOP, "[LoadDatabase] '" .. key .. "' already a table (split-file format), skipping loadstring")
else
Questie:Debug(Questie.DEBUG_DEVELOP, "Database is missing, this is likely do to era vs tbc: ", key)
end
if not QuestieDB[key] then
QuestieDB[key] = {}
end
end
function QuestieInit:LoadBaseDB()
local function _pullGlobal(dbKey, globalName)
if type(_G[globalName]) == "table" then
QuestieDB[dbKey] = _G[globalName]
_G[globalName] = nil
return true
end
return false
end
local _pulled = {
quest = _pullGlobal("questData", "QuestieX_WotLKDB_quest"),
npc = _pullGlobal("npcData", "QuestieX_WotLKDB_npc"),
object = _pullGlobal("objectData", "QuestieX_WotLKDB_object"),
item = _pullGlobal("itemData", "QuestieX_WotLKDB_item"),
}
Questie:Debug(Questie.DEBUG_DEVELOP, "[DBDiag] WotLKDB pull: quest=" .. tostring(_pulled.quest) .. " npc=" .. tostring(_pulled.npc) .. " obj=" .. tostring(_pulled.object) .. " item=" .. tostring(_pulled.item))
QuestieInit:LoadDatabase("npcData")
QuestieInit:LoadDatabase("objectData")
QuestieInit:LoadDatabase("questData")
+1 -1
View File
@@ -402,7 +402,7 @@ function Townsfolk:PopulateVendors(itemList, existingTable, restrictLevel)
if not flagCache[vendorId] then
flagCache[vendorId] = flags
end
if bitband(flags, QuestieDB.npcFlags.VENDOR) == QuestieDB.npcFlags.VENDOR then
if flags and bitband(flags, QuestieDB.npcFlags.VENDOR) == QuestieDB.npcFlags.VENDOR then
tbl[vendorId] = true
end
end
+91 -34
View File
@@ -1,17 +1,34 @@
---@class QuestieServer
local QuestieServer = QuestieLoader:CreateModule("QuestieServer")
-- Check for runtime server globals or profile matches early in the initialization phase.
-- We do this BEFORE any database tables evaluate so their memory isn't allocated if unused.
---@type string
local realmName = GetRealmName() or ""
Questie.IsEbonhold = false
Questie.IsAscension = false
Questie.IsValanior = false
-- Client flavor detection from WoW globals
local WOW_PROJECT_ID = WOW_PROJECT_ID or -1
local WOW_PROJECT_CLASSIC = WOW_PROJECT_CLASSIC or 2
local WOW_PROJECT_BURNING_CRUSADE_CLASSIC = WOW_PROJECT_BURNING_CRUSADE_CLASSIC or 5
local WOW_PROJECT_WRATH_CLASSIC = WOW_PROJECT_WRATH_CLASSIC or 11
local WOW_PROJECT_MAINLINE = WOW_PROJECT_MAINLINE or 1
if _G.IsAscensionServer or realmName == "Ascension" or realmName:find("Area 52") or realmName:find("Al'ar") or realmName:find("Thrall") then
-- Expansion detection
Questie.IsRetail = (WOW_PROJECT_ID == WOW_PROJECT_MAINLINE)
Questie.IsWotLK = (WOW_PROJECT_ID == WOW_PROJECT_WRATH_CLASSIC)
Questie.IsTBC = (WOW_PROJECT_ID == WOW_PROJECT_BURNING_CRUSADE_CLASSIC)
Questie.IsClassicEra = (WOW_PROJECT_ID == WOW_PROJECT_CLASSIC)
-- Try GetBuildInfo for Turtle WoW (Interface: 11200, no WOW_PROJECT globals)
local _, _, _, tocVersion = GetBuildInfo()
Questie.IsTurtle = (not Questie.IsRetail and not Questie.IsWotLK and not Questie.IsTBC and
not Questie.IsClassicEra and tocVersion and tocVersion < 20000)
-- Custom server detection
Questie.IsEbonhold = false
Questie.IsAscension = false
Questie.IsValanior = false
if _G.IsAscensionServer or realmName:find("Ascension") or realmName:find("Area 52") or
realmName:find("Al'ar") or realmName:find("Thrall") then
Questie.IsAscension = true
elseif realmName == "Ebonhold" or realmName == "Test Ebonhold" then
Questie.IsEbonhold = true
@@ -19,23 +36,69 @@ elseif realmName == "Valanior" then
Questie.IsValanior = true
end
-- Also check QuestieConfig if it was loaded (fallback for forcing a profile)
if QuestieConfig and QuestieConfig.profileKeys then
-- It's theoretically possible a player has explicitly overridden the profile in Ace3 Options
-- but usually we trust the dynamic realm name detection over saved profiles for the core loader.
-- Derive expected DB plugin name for this client
local function GetExpectedPluginFlavor()
if Questie.IsAscension then return "AscensionDB", "Questie-X-AscensionDB" end
if Questie.IsEbonhold then return "EbonholdDB", "Questie-X-EbonholdDB" end
if Questie.IsValanior then return "ValaniorDB", "Questie-X-ValaniorDB" end
if Questie.IsTurtle then return "TurtleDB", "Questie-X-TurtleDB" end
if Questie.IsWotLK then return "WotLKDB", "Questie-X-WotLKDB" end
if Questie.IsTBC then return "TBCDB", "Questie-X-TBCDB" end
if Questie.IsClassicEra then return "ClassicDB", "Questie-X-ClassicDB" end
if Questie.IsRetail then return "RetailDB", "Questie-X-RetailDB" end
return nil, nil
end
function QuestieServer:Init()
-- This handles any universal server logic before Database Init
Questie:Debug(Questie.DEBUG_INFO, "[QuestieServer] Detected Realm:", realmName)
Questie:Debug(Questie.DEBUG_INFO, "[QuestieServer] IsAscension:", Questie.IsAscension)
Questie:Debug(Questie.DEBUG_INFO, "[QuestieServer] IsEbonhold:", Questie.IsEbonhold)
Questie:Debug(Questie.DEBUG_INFO, "[QuestieServer] IsValanior:", Questie.IsValanior)
Questie:Debug(Questie.DEBUG_INFO, "[QuestieServer] Realm:", realmName)
Questie:Debug(Questie.DEBUG_INFO, "[QuestieServer] WOW_PROJECT_ID:", tostring(WOW_PROJECT_ID))
Questie:Debug(Questie.DEBUG_INFO, "[QuestieServer] IsWotLK:", tostring(Questie.IsWotLK), "IsTBC:", tostring(Questie.IsTBC),
"IsClassicEra:", tostring(Questie.IsClassicEra), "IsTurtle:", tostring(Questie.IsTurtle),
"IsAscension:", tostring(Questie.IsAscension), "IsEbonhold:", tostring(Questie.IsEbonhold))
end
--- Checks if the correct DB plugin is loaded for the detected client/server.
--- Prints a friendly actionable warning to the chat frame if none is found.
function QuestieServer:WarnIfMissingPlugin()
local QuestiePluginAPI = QuestieLoader:ImportModule("QuestiePluginAPI")
if not QuestiePluginAPI then return end
if QuestiePluginAPI:IsAnyPluginLoaded() then
local flavor, addonName = GetExpectedPluginFlavor()
local loadedFlavor = QuestiePluginAPI:GetLoadedFlavor()
if flavor and loadedFlavor and loadedFlavor ~= flavor then
Questie:Print(string.format(
"|cFFFF8800[Questie-X]|r Warning: loaded database is |cFFFFFFFF%s|r but this client expects |cFFFFFFFF%s|r. " ..
"Quest data may be incorrect. Install |cFF5EBAF3%s|r for best results.",
loadedFlavor, flavor, addonName or flavor
))
end
return
end
-- No plugin at all
local flavor, addonName = GetExpectedPluginFlavor()
local msg
if addonName then
msg = string.format(
"|cFFFF4444[Questie-X]|r No database plugin loaded. " ..
"Download and install |cFF5EBAF3%s|r into your |cFFFFFFFFInterface/AddOns/|r folder, then reload. " ..
"Questie-X will show no quest data until a database is installed.",
addonName
)
else
msg = "|cFFFF4444[Questie-X]|r No database plugin loaded and server type is unknown. " ..
"Install the appropriate Questie-X database plugin for your server."
end
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage(msg)
end
Questie:Debug(Questie.DEBUG_CRITICAL, msg)
end
function QuestieServer:GetCustomQuest(questId)
-- This provides a formal API for fetching quests injected by custom server DBs
-- that bypasses the binary stream without using function monkeypatching.
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
if not QuestieDB.questDataOverrides or not QuestieDB.questDataOverrides[questId] then
return nil
@@ -44,30 +107,24 @@ function QuestieServer:GetCustomQuest(questId)
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 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")
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 {},
}
local desc = QuestieDB.QueryQuestSingle(questId, "objectiveText") or QuestieDB.QueryQuestSingle(questId, "description")
local startedBy = QuestieDB.QueryQuestSingle(questId, "startedBy")
local finishedBy = QuestieDB.QueryQuestSingle(questId, "finishedBy")
local specialFlags = QuestieDB.QueryQuestSingle(questId, "specialFlags")
local isRepeatable = specialFlags and (bit.band(specialFlags, 1) ~= 0) or false
return {
Id = questId,
id = questId,
name = name,
level = level or reqLevel or 0,
Id = questId,
id = questId,
name = name,
level = level or reqLevel or 0,
requiredLevel = reqLevel or 0,
Description = desc,
Starts = starts,
finishedBy = finishedBy,
Description = desc,
Starts = { NPC = startedBy and startedBy[1] or {}, GameObject = startedBy and startedBy[2] or {}, Item = startedBy and startedBy[3] or {} },
finishedBy = finishedBy,
IsRepeatable = isRepeatable,
}
end
+12 -27
View File
@@ -11,9 +11,9 @@
## Notes-esES: Ayundante de misión
## Notes-ptBR: Ajudante de missão
## Notes-frFR: Assistant de quête
## Version: 1.1.4
## Version: 1.2.2
## RequiredDeps:
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu, Questie-X-WotLKDB, Questie-X-ClassicDB, Questie-X-TBCDB, Questie-X-TurtleDB, Questie-X-AscensionDB, Questie-X-EbonholdDB
## SavedVariables: QuestieConfig, QuestieLearnerDB
## SavedVariablesPerCharacter: QuestieConfigCharacter
## X-Curse-Project-ID: 334372
@@ -28,6 +28,7 @@ Modules\Libs\QuestiePluginAPI.lua
# COMPATIBILITY
Modules\QuestieCompat.lua
Libs\LibStub\LibStub.lua
Compat\embeds.xml
Libs\XXH_Lua_Lib\XXH_Lua_Lib.lua
@@ -43,22 +44,15 @@ Modules\Libs\MessageHandler.lua
#Quest XP
Database\QuestXP\QuestieXP.lua
Database\QuestXP\DB\xpDB-wotlk.lua
# stream module (used by DB)
Modules\QuestieStream.lua
# Zones
Database\Zones\zoneTables.lua
Database\Zones\zoneDB.lua
# Databases
Database\Wotlk\wotlkItemDB.lua
Database\Wotlk\wotlkNpcDB.lua
Database\Wotlk\wotlkObjectDB.lua
Database\Wotlk\wotlkQuestDB.lua
# Core Database schema (data injected by DB plugins)
Database\QuestieDB.lua
Database\questDB.lua
Database\objectDB.lua
@@ -67,39 +61,36 @@ Database\itemDB.lua
Database\Constants.lua
Database\MeetingStones.lua
# Corrections
# Corrections framework (expansion-specific fixes loaded by DB plugins)
Database\Corrections\AutoTableUpdates.lua
Database\Corrections\QuestieCorrections.lua
Database\Corrections\QuestieItemBlacklist.lua
Database\Corrections\QuestieNPCBlacklist.lua
Database\Corrections\QuestieQuestBlacklist.lua
#Database\Corrections\SoMPhases.lua
Database\Corrections\QuestieEvent.lua
# Automatic General Corrections
Database\Corrections\Automatic\itemStartFixes.lua
Database\Corrections\Automatic\classicQuestReputationFixes.lua
# Classic Corrections
# Classic corrections (always loaded; _LoadCorrections skips missing IDs gracefully)
Database\Corrections\classicQuestFixes.lua
Database\Corrections\classicNPCFixes.lua
Database\Corrections\classicItemFixes.lua
Database\Corrections\classicObjectFixes.lua
# TBC Corrections
# TBC corrections (gated by Questie.IsTBC / Questie.IsWotLK inside QuestieCorrections)
Database\Corrections\tbcQuestFixes.lua
Database\Corrections\tbcNPCFixes.lua
Database\Corrections\tbcItemFixes.lua
Database\Corrections\tbcObjectFixes.lua
# Wotlk Corrections
# WotLK corrections (gated by Questie.IsWotLK inside QuestieCorrections)
Database\Corrections\wotlkQuestFixes.lua
Database\Corrections\wotlkNPCFixes.lua
Database\Corrections\wotlkItemFixes.lua
Database\Corrections\wotlkObjectFixes.lua
# Automatic General Corrections
Database\Corrections\Automatic\itemStartFixes.lua
Database\Corrections\Automatic\classicQuestReputationFixes.lua
# Compiler
Database\compiler.lua
@@ -109,10 +100,6 @@ Localization\Translations\Translations.xml
Localization\lookups\lookupQuestCategories.lua
Localization\lookups\lookupZones.lua
Localization\lookups\Wotlk\lookupItems\lookupItems.xml
Localization\lookups\Wotlk\lookupNpcs\lookupNpcs.xml
Localization\lookups\Wotlk\lookupObjects\lookupObjects.xml
Localization\lookups\Wotlk\lookupQuests\lookupQuests.xml
# Libs
Modules\Libs\QuestieLib.lua
@@ -170,7 +157,6 @@ Modules\Map\QuestieMapUtils.lua
Modules\Map\HBDHooks.lua
Modules\Map\WeaponMasterSkills.lua
# Quest
Modules\Quest\AvailableQuests.lua
Modules\Quest\QuestLogCache.lua
@@ -247,4 +233,3 @@ Modules\QuestieProfiler.lua
# Main
Questie.lua