initial commit
This commit is contained in:
161
Core/Service/TaskList/Gathering.lua
Normal file
161
Core/Service/TaskList/Gathering.lua
Normal file
@@ -0,0 +1,161 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- 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
|
||||
Reference in New Issue
Block a user