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.

235 lines
8.1 KiB

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster_Warehousing --
-- http://www.curse.com/addons/wow/tradeskillmaster_warehousing --
-- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
-- loads the localization table --
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Warehousing")
-- load the parent file (TSM) into a local variable and register this file as a module
local TSM = select(2, ...)
local data = TSM:NewModule("data", "AceEvent-3.0")
local AceGUI = LibStub("AceGUI-3.0") -- load the AceGUI librarie
----------------------------------
-- Generates the Bagstate table --
----------------------------------
function data:getEmptyRestoreGroup(container, isGuildBank)
TSM.util:setSrcBagFunctions("bags")
local tmp = {}
local grp = {}
local restore = {}
for i, bagid in ipairs(container) do
for slotid = 1, TSM.util.getContainerNumSlotsSrc(bagid) do
local id, quan = TSM.util.getContainerItemIDSrc(bagid, slotid)
if id then
if not isGuildBank or not TSMAPI:IsSoulbound(bagid, slotid) then
if not tmp[id] then tmp[id] = 0 end
tmp[id] = tmp[id] + quan
end --end if
end --end if id
end --end for slots
end --end for bags
for i, q in pairs(tmp) do
grp[i] = q * -1 -- convert to negative number for TSMAPI:MoveItems
restore[i] = q -- for the restore bagstate
end
TSM.db.realm.BagState = restore
return grp
end
function data:unIndexMoveGroupTree(grpInfo, src)
local newgrp = {}
local totalItems = data:getTotalItems(src)
for groupName, info in pairs(grpInfo) do
groupName = TSMAPI:FormatGroupPath(groupName, true)
for _, opName in ipairs(info.operations) do
TSMAPI:UpdateOperation("Warehousing", opName)
local opSettings = TSM.operations[opName]
if not opSettings then
-- operation doesn't exist anymore in Crafting
TSM:Printf(L["'%s' has a Warehousing operation of '%s' which no longer exists."], groupName, opName)
else
-- it's a valid operation
for itemString in pairs(info.items) do
itemString = TSMAPI:GetItemString(itemString)
local totalq = 0
if totalItems then
totalq = totalItems[itemString] or 0
end
if src == "bags" then -- if moving from bags to bank/gbank
if opSettings.moveQtyEnabled and opSettings.keepBagQtyEnabled then -- move specified quantity but keep x in bags
local q = (totalq - opSettings.keepBagQuantity)
if q > 0 then
--newgrp[itemString] = min(tonumber(q), tonumber(opSettings.moveQuantity))
newgrp[itemString] = max(tonumber(q * -1), tonumber(opSettings.moveQuantity * -1))
end
elseif opSettings.moveQtyEnabled then -- move specified quantity
newgrp[itemString] = tonumber(opSettings.moveQuantity * -1)
elseif opSettings.keepBagQtyEnabled then -- move all but keep x in bags
local q = totalq - opSettings.keepBagQuantity
if q > 0 then
newgrp[itemString] = tonumber(q * -1)
end
else -- move everything
if totalq > 0 then
newgrp[itemString] = tonumber(totalq * -1)
end
end
else -- move from bank/gbank to bags
local stacksize = 1
if opSettings.stackSizeEnabled and opSettings.stackSize then -- only move in multiples of the stack size set
stacksize = opSettings.stackSize
end
if opSettings.moveQtyEnabled and opSettings.keepBankQtyEnabled then -- move specified quantity but keep x in bank
local q = (totalq - opSettings.keepBankQuantity)
if q > 0 then
newgrp[itemString] = floor(min(tonumber(q), tonumber(opSettings.moveQuantity)) / tonumber(stacksize)) * tonumber(stacksize)
end
elseif opSettings.moveQtyEnabled then -- move specified quantity
newgrp[itemString] = floor(tonumber(opSettings.moveQuantity) / tonumber(stacksize)) * tonumber(stacksize)
elseif opSettings.keepBankQtyEnabled then -- move all but keep x in bank
local q = totalq - opSettings.keepBankQuantity
if q > 0 then
newgrp[itemString] = floor(tonumber(q) / tonumber(stacksize)) * tonumber(stacksize)
end
else -- move everything
if totalq > 0 then
newgrp[itemString] = floor(tonumber(totalq) / tonumber(stacksize)) * tonumber(stacksize)
end
end
end
end
end
end
end
return newgrp
end
function data:unIndexRestockGroupTree(grpInfo)
local newgrp = {}
local totalItems = data:getTotalItems("bags")
for groupName, info in pairs(grpInfo) do
groupName = TSMAPI:FormatGroupPath(groupName, true)
for _, opName in ipairs(info.operations) do
TSMAPI:UpdateOperation("Warehousing", opName)
local opSettings = TSM.operations[opName]
if not opSettings then
-- operation doesn't exist anymore in Crafting
TSM:Printf(L["'%s' has a Warehousing operation of '%s' which no longer exists."], groupName, opName)
else
-- it's a valid operation
for itemString in pairs(info.items) do
local totalq = 0
if totalItems then
totalq = totalItems[itemString] or 0
end
if opSettings.restockQtyEnabled then -- work out qty to add or remove from bags
local q = opSettings.restockQuantity - totalq
if q ~= 0 then
newgrp[itemString] = tonumber(q)
end
end
end
end
end
end
return newgrp
end
function data:unIndexItem(searchString, src, quantity)
local newgrp = {}
local totalItems = data:getTotalItems(src) -- table of itemstrings and total qty in source
if totalItems then
local matchedString = TSMAPI:GetBaseItemString(TSMAPI:GetItemString(searchString))
if matchedString then
for itemString, totalQty in pairs(totalItems) do
if TSMAPI:GetBaseItemString(itemString) == matchedString then
if quantity then
if src == "bags" then
newgrp[itemString] = tonumber(quantity * -1)
else
newgrp[itemString] = tonumber(quantity)
end
else
if src == "bags" then
newgrp[itemString] = tonumber(totalQty * -1)
else
newgrp[itemString] = tonumber(totalQty)
end
end
end
end
else
for itemString, totalQty in pairs(totalItems) do
local name = strlower(TSMAPI:GetSafeItemInfo(itemString))
if strfind(name, strlower(searchString)) then
if quantity then
if src == "bags" then
newgrp[itemString] = tonumber(quantity * -1)
else
newgrp[itemString] = tonumber(quantity)
end
else
if src == "bags" then
newgrp[itemString] = tonumber(totalQty * -1)
else
newgrp[itemString] = tonumber(totalQty)
end
end
end
end
end
end
return newgrp
end
function data:getTotalItems(src)
local results = {}
if src == "bank" then
local function ScanBankBag(bag)
for slot = 1, GetContainerNumSlots(bag) do
local itemString = TSMAPI:GetBaseItemString(GetContainerItemLink(bag, slot), true)
if itemString then
local quantity = select(2, GetContainerItemInfo(bag, slot))
if not results[itemString] then results[itemString] = 0 end
results[itemString] = results[itemString] + quantity
end
end
end
for bag = NUM_BAG_SLOTS + 1, NUM_BAG_SLOTS + NUM_BANKBAGSLOTS do
ScanBankBag(bag)
end
ScanBankBag(-1)
return results
elseif src == "guildbank" then
for bag = 1, GetNumGuildBankTabs() do
for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do
local link = GetGuildBankItemLink(bag, slot)
local itemString = TSMAPI:GetBaseItemString(link, true)
if itemString then
local quantity = select(2, GetGuildBankItemInfo(bag, slot))
if not results[itemString] then results[itemString] = 0 end
results[itemString] = results[itemString] + quantity
end
end
end
return results
elseif src == "bags" then
for _, _, itemString, quantity in TSMAPI:GetBagIterator(true) do
results[itemString] = (results[itemString] or 0) + quantity
end
return results
end
end