You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
5.4 KiB

local Addon = LibStub('AceAddon-3.0'):GetAddon('WoWthing_Collector')
local Module = Addon:NewModule('WorldQuests')
Module.db = {}
local C_TaskQuest_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID
local C_TaskQuest_GetQuestTimeLeftSeconds = C_TaskQuest.GetQuestTimeLeftSeconds
function Module:OnEnable()
Addon.charData.worldQuests = Addon.charData.worldQuests or {}
self:RegisterBucketEvent({ 'QUEST_LOG_UPDATE' }, 5, 'UpdateWorldQuests')
end
-- function Module:OnEnteringWorld()
-- C_Timer.After(5, function() self:UpdateWorldQuests() end)
-- end
function Module:UpdateWorldQuests()
local now = time()
Addon.charData.scanTimes['worldQuests'] = now
local workload = {}
for _, expansion in pairs(self.db.expansions) do
if Addon.charData.level >= expansion.minimumLevel then
Addon.charData.worldQuests[expansion.id] = Addon.charData.worldQuests[expansion.id] or {}
for _, zoneId in ipairs(expansion.zones) do
table.insert(workload, function()
Addon.charData.worldQuests[expansion.id][zoneId] = Addon.charData.worldQuests[expansion.id][zoneId] or {}
local questMap = {}
for _, quest in pairs(Addon.charData.worldQuests[expansion.id][zoneId]) do
local questId, expires = strsplit(':', quest)
if tonumber(expires) > now then
questMap[tonumber(questId)] = quest
end
end
local quests = C_TaskQuest_GetQuestsForPlayerByMapID(zoneId)
if quests ~= nil then
for _, quest in pairs(quests) do
if quest.mapID == zoneId then
local timeRemaining = C_TaskQuest_GetQuestTimeLeftSeconds(quest.questId)
if timeRemaining ~= nil and timeRemaining > 0 then
WWTCSaved.worldQuestIds[quest.questId] = true
local expires = now + timeRemaining
-- Clamp to the nearest 30 minutes
local mod = expires % 1800
if mod > 900 then
expires = expires + (1800 - mod)
else
expires = expires - mod
end
local rewardCurrencyCount = GetNumQuestLogRewardCurrencies(quest.questId)
local rewardItemCount = GetNumQuestLogRewards(quest.questId)
local rewardMoney = GetQuestLogRewardMoney(quest.questId)
if rewardCurrencyCount > 0 or rewardItemCount > 0 or rewardMoney > 0 then
local rewards = {}
for i = 1, rewardCurrencyCount do
local _, _, quantity, currencyId = GetQuestLogRewardCurrencyInfo(i, quest.questId)
tinsert(rewards, table.concat({
11, -- Currency
currencyId,
quantity,
}, '-'))
end
for i = 1, rewardItemCount do
local _, _, quantity, _, _, itemId, _ = GetQuestLogRewardInfo(i, quest.questId)
tinsert(rewards, table.concat({
9, -- Item
itemId,
quantity,
}, '-'))
end
if rewardMoney > 0 then
tinsert(rewards, table.concat({
11, -- Currency
0,
rewardMoney
}, '-'))
end
questMap[quest.questId] = table.concat({
quest.questId,
expires,
string.format('%.1f', quest.x * 100),
string.format('%.1f', quest.y * 100),
table.concat(rewards, '|')
}, ':')
end
end
end
end
local zoneQuests = {}
for _, quest in pairs(questMap) do
tinsert(zoneQuests, quest)
end
Addon.charData.worldQuests[expansion.id][zoneId] = zoneQuests
end
end)
end
end
end
Addon:BatchWork(workload)
end