TradeSkillMaster/Core/Service/Banking/Auctioning.lua

124 lines
4.9 KiB
Lua
Raw Normal View History

2020-11-13 14:13:12 -05:00
-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Auctioning = TSM.Banking:NewPackage("Auctioning")
local TempTable = TSM.Include("Util.TempTable")
local BagTracking = TSM.Include("Service.BagTracking")
local Inventory = TSM.Include("Service.Inventory")
local private = {}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Auctioning.MoveGroupsToBank(callback, groups)
local items = TempTable.Acquire()
TSM.Banking.Util.PopulateGroupItemsFromBags(items, groups, private.GroupsGetNumToMoveToBank)
TSM.Banking.MoveToBank(items, callback)
TempTable.Release(items)
end
function Auctioning.PostCapToBags(callback, groups)
local items = TempTable.Acquire()
TSM.Banking.Util.PopulateGroupItemsFromOpenBank(items, groups, private.GetNumToMoveToBags)
TSM.Banking.MoveToBag(items, callback)
TempTable.Release(items)
end
function Auctioning.ShortfallToBags(callback, groups)
local items = TempTable.Acquire()
TSM.Banking.Util.PopulateGroupItemsFromOpenBank(items, groups, private.GetNumToMoveToBags, true)
TSM.Banking.MoveToBag(items, callback)
TempTable.Release(items)
end
function Auctioning.MaxExpiresToBank(callback, groups)
local items = TempTable.Acquire()
TSM.Banking.Util.PopulateGroupItemsFromBags(items, groups, private.MaxExpiresGetNumToMoveToBank)
TSM.Banking.MoveToBank(items, callback)
TempTable.Release(items)
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.GroupsGetNumToMoveToBank(itemString, numHave)
-- move everything
return numHave
end
function private.GetNumToMoveToBags(itemString, numHave, includeAH)
local totalNumToMove = 0
local numAvailable = numHave
local numInBags = BagTracking.CreateQueryBagsItem(itemString)
:VirtualField("autoBaseItemString", "string", TSM.Groups.TranslateItemString, "itemString")
:Equal("autoBaseItemString", itemString)
:SumAndRelease("quantity") or 0
if includeAH then
numInBags = numInBags + select(3, Inventory.GetPlayerTotals(itemString)) + Inventory.GetMailQuantity(itemString)
end
for _, _, operationSettings in TSM.Operations.GroupOperationIterator("Auctioning", TSM.Groups.GetPathByItem(itemString)) do
local maxExpires = TSM.Auctioning.Util.GetPrice("maxExpires", operationSettings, itemString)
local operationHasExpired = false
if maxExpires and maxExpires > 0 then
local numExpires = TSM.Accounting.Auctions.GetNumExpiresSinceSale(itemString)
if numExpires and numExpires > maxExpires then
operationHasExpired = true
end
end
local postCap = TSM.Auctioning.Util.GetPrice("postCap", operationSettings, itemString)
local stackSize = (TSM.IsWowClassic() and TSM.Auctioning.Util.GetPrice("stackSize", operationSettings, itemString)) or (not TSM.IsWowClassic() and 1)
if not operationHasExpired and postCap and stackSize then
local numNeeded = stackSize * postCap
if numInBags > numNeeded then
-- we can satisfy this operation from the bags
numInBags = numInBags - numNeeded
numNeeded = 0
elseif numInBags > 0 then
-- we can partially satisfy this operation from the bags
numNeeded = numNeeded - numInBags
numInBags = 0
end
local numToMove = min(numAvailable, numNeeded)
if numToMove > 0 then
numAvailable = numAvailable - numToMove
totalNumToMove = totalNumToMove + numToMove
end
end
end
return totalNumToMove
end
function private.MaxExpiresGetNumToMoveToBank(itemString, numHave)
local numToKeepInBags = 0
for _, _, operationSettings in TSM.Operations.GroupOperationIterator("Auctioning", TSM.Groups.GetPathByItem(itemString)) do
local maxExpires = TSM.Auctioning.Util.GetPrice("maxExpires", operationSettings, itemString)
local operationHasExpired = false
if maxExpires and maxExpires > 0 then
local numExpires = TSM.Accounting.Auctions.GetNumExpiresSinceSale(itemString)
if numExpires and numExpires > maxExpires then
operationHasExpired = true
end
end
local postCap = TSM.Auctioning.Util.GetPrice("postCap", operationSettings, itemString)
local stackSize = (TSM.IsWowClassic() and TSM.Auctioning.Util.GetPrice("stackSize", operationSettings, itemString)) or (not TSM.IsWowClassic() and 1)
if not operationHasExpired and postCap and stackSize then
numToKeepInBags = numToKeepInBags + stackSize * postCap
end
end
return max(numHave - numToKeepInBags, 0)
end