162 lines
5.1 KiB
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
|