TradeSkillMaster/Core/Service/TaskList/Gathering.lua

162 lines
5.1 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Gathering = TSM.TaskList:NewPackage("Gathering")
local L = TSM.Include("Locale").GetTable()
local TempTable = TSM.Include("Util.TempTable")
local ObjectPool = TSM.Include("Util.ObjectPool")
local private = {
activeTasks = {},
query = nil,
sourceTasks = {},
altTaskPool = ObjectPool.New("GATHERING_ALT_TASK", TSM.TaskList.AltTask, 0),
professionTasks = {},
prevHash = nil,
}
local ITEM_SOURCES = {
"auction",
"auctionDE",
"auctionCrafting",
"vendor",
"bank",
"guildBank",
"sendMail",
"openMail",
}
local SOURCE_CLASS_CONSTRUCTORS = {
auction = function() return TSM.TaskList.ShoppingTask("NORMAL") end,
auctionDE = function() return TSM.TaskList.ShoppingTask("DISENCHANT") end,
auctionCrafting = function() return TSM.TaskList.ShoppingTask("CRAFTING") end,
vendor = TSM.TaskList.VendoringTask,
bank = function() return TSM.TaskList.BankingTask(false) end,
guildBank = function() return TSM.TaskList.BankingTask(true) end,
sendMail = TSM.TaskList.SendMailTask,
openMail = TSM.TaskList.OpenMailTask,
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Gathering.OnInitialize()
for _, source in ipairs(ITEM_SOURCES) do
private.sourceTasks[source] = SOURCE_CLASS_CONSTRUCTORS[source]()
private.sourceTasks[source]:Acquire(private.SourceProfessionTaskDone, L["Gathering"])
end
end
function Gathering.OnEnable()
TSM.TaskList.RegisterTaskPool(private.ActiveTaskIterator)
private.query = TSM.Crafting.Gathering.CreateQuery()
:Select("itemString", "sourcesStr")
:GreaterThan("numNeed", 0)
:SetUpdateCallback(private.PopulateTasks)
private.PopulateTasks()
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.PopulateTasks()
local hash = private.query:Hash()
if hash == private.prevHash then
-- nothing changed
return
end
private.prevHash = hash
for task in pairs(private.activeTasks) do
if task:__isa(TSM.TaskList.AltTask) then
private.RemoveAltTask(task)
end
end
wipe(private.activeTasks)
for _, task in pairs(private.sourceTasks) do
task:WipeItems()
end
for _, task in pairs(private.professionTasks) do
task:WipeSpellIds()
end
local alts = TempTable.Acquire()
local sourceInfo = TempTable.Acquire()
for _, itemString, sourcesStr in private.query:Iterator() do
TSM.Crafting.Gathering.SourcesStrToTable(sourcesStr, sourceInfo, alts)
sourceInfo.alt = nil
sourceInfo.altGuildBank = nil
for _, source in ipairs(ITEM_SOURCES) do
if sourceInfo[source] then
private.sourceTasks[source]:AddItem(itemString, sourceInfo[source])
sourceInfo[source] = nil
end
end
if sourceInfo.craftProfit or sourceInfo.craftNoProfit then
local spellId = TSM.Crafting.GetMostProfitableSpellIdByItem(itemString, TSM.db.factionrealm.gatheringContext.crafter)
assert(spellId)
local profession = TSM.Crafting.GetProfession(spellId)
if not private.professionTasks[profession] then
private.professionTasks[profession] = TSM.TaskList.CraftingTask()
private.professionTasks[profession]:Acquire(private.SourceProfessionTaskDone, L["Gathering"], profession)
end
private.professionTasks[profession]:AddSpellId(spellId, sourceInfo.craftProfit or sourceInfo.craftNoProfit)
sourceInfo.craftProfit = nil
sourceInfo.craftNoProfit = nil
end
-- make sure we processed everything from the sourceInfo table
assert(not next(sourceInfo))
end
TempTable.Release(sourceInfo)
for character in pairs(alts) do
local task = private.altTaskPool:Get()
task:Acquire(private.RemoveAltTask, L["Gathering"], character)
private.activeTasks[task] = task
task:Update()
end
TempTable.Release(alts)
if TSM.db.factionrealm.gatheringContext.crafter ~= "" then
private.sourceTasks.sendMail:SetTarget(TSM.db.factionrealm.gatheringContext.crafter)
end
for _, task in pairs(private.sourceTasks) do
if task:HasItems() then
private.activeTasks[task] = task
task:Update()
end
end
for _, task in pairs(private.professionTasks) do
if task:HasSpellIds() then
private.activeTasks[task] = task
task:Update()
end
end
TSM.TaskList.OnTaskUpdated()
end
function private.ActiveTaskIterator()
return pairs(private.activeTasks)
end
function private.RemoveAltTask(task)
assert(private.activeTasks[task])
private.activeTasks[task] = nil
task:Release()
private.altTaskPool:Recycle(task)
end
function private.SourceProfessionTaskDone(task)
assert(private.activeTasks[task])
private.activeTasks[task] = nil
TSM.TaskList.OnTaskUpdated()
end