-- ------------------------------------------------------------------------------ -- -- 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.factionrealm.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