Browse Source

added personal and realm bank implementations

pull/27/head
soltanikian 5 months ago
parent
commit
5c96064fa8
  1. 3
      TradeSkillMaster_Crafting/Locale/enUS.lua
  2. 738
      TradeSkillMaster_Crafting/Modules/Inventory.lua
  3. 4
      TradeSkillMaster_ItemTracker/Locale/enUS.lua
  4. 111
      TradeSkillMaster_ItemTracker/Modules/data.lua
  5. 87
      TradeSkillMaster_ItemTracker/TradeSkillMaster_ItemTracker.lua

3
TradeSkillMaster_Crafting/Locale/enUS.lua

@ -168,6 +168,9 @@ L["Total"] = true
L["Vendor"] = true L["Vendor"] = true
L["Visit Bank"] = true L["Visit Bank"] = true
L["Visit Guild Bank"] = true L["Visit Guild Bank"] = true
L["Visit Personal Bank"] = true
L["Visit Realm Bank"] = true
L["Realm Bank"] = true
L["Visit Vendor"] = true L["Visit Vendor"] = true
L["Warning: The min restock quantity must be lower than the max restock quantity."] = true L["Warning: The min restock quantity must be lower than the max restock quantity."] = true
L["When you click on the \"Restock Queue\" button enough of each craft will be queued so that you have this maximum number on hand. For example, if you have 2 of item X on hand and you set this to 4, 2 more will be added to the craft queue."] = true L["When you click on the \"Restock Queue\" button enough of each craft will be queued so that you have this maximum number on hand. For example, if you have 2 of item X on hand and you set this to 4, 2 more will be added to the craft queue."] = true

738
TradeSkillMaster_Crafting/Modules/Inventory.lua

@ -1,340 +1,400 @@
-- ------------------------------------------------------------------------------ -- -- ------------------------------------------------------------------------------ --
-- TradeSkillMaster_Crafting -- -- TradeSkillMaster_Crafting --
-- http://www.curse.com/addons/wow/tradeskillmaster_crafting -- -- http://www.curse.com/addons/wow/tradeskillmaster_crafting --
-- -- -- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) -- -- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. -- -- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ -- -- ------------------------------------------------------------------------------ --
-- load the parent file (TSM) into a local variable and register this file as a module -- load the parent file (TSM) into a local variable and register this file as a module
local TSM = select(2, ...) local TSM = select(2, ...)
local Inventory = TSM:NewModule("Inventory", "AceEvent-3.0") local Inventory = TSM:NewModule("Inventory", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Crafting") -- loads the localization table local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Crafting") -- loads the localization table
-- gets the number of an item in the current player's bags -- gets the number of an item in the current player's bags
function Inventory:GetPlayerBagNum(itemString) function Inventory:GetPlayerBagNum(itemString)
if not itemString then return end if not itemString then return end
if TSMAPI.SOULBOUND_MATS[itemString] then if TSMAPI.SOULBOUND_MATS[itemString] then
return GetItemCount(itemString) return GetItemCount(itemString)
else else
local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", UnitName("player")) or {} local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", UnitName("player")) or {}
return bags and bags[itemString] or 0 return bags and bags[itemString] or 0
end end
end end
function Inventory:GetTotals() function Inventory:GetTotals()
local bagTotal, auctionTotal, otherTotal, total = {}, {}, {}, {} local bagTotal, auctionTotal, otherTotal, total = {}, {}, {}, {}
for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do
if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then
local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {}
local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {}
local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {}
local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {} local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {}
for itemString, quantity in pairs(bags) do for itemString, quantity in pairs(bags) do
if player == UnitName("player") then if player == UnitName("player") then
bagTotal[itemString] = (bagTotal[itemString] or 0) + quantity bagTotal[itemString] = (bagTotal[itemString] or 0) + quantity
total[itemString] = (total[itemString] or 0) + quantity total[itemString] = (total[itemString] or 0) + quantity
else else
otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity
total[itemString] = (total[itemString] or 0) + quantity total[itemString] = (total[itemString] or 0) + quantity
end end
end end
for itemString, quantity in pairs(bank) do for itemString, quantity in pairs(bank) do
otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity
total[itemString] = (total[itemString] or 0) + quantity total[itemString] = (total[itemString] or 0) + quantity
end end
for itemString, quantity in pairs(mail) do for itemString, quantity in pairs(mail) do
otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity
total[itemString] = (total[itemString] or 0) + quantity total[itemString] = (total[itemString] or 0) + quantity
end end
for itemString, quantity in pairs(auctions) do for itemString, quantity in pairs(auctions) do
auctionTotal[itemString] = (auctionTotal[itemString] or 0) + quantity auctionTotal[itemString] = (auctionTotal[itemString] or 0) + quantity
total[itemString] = (total[itemString] or 0) + quantity total[itemString] = (total[itemString] or 0) + quantity
end end
end end
end end
for itemString in pairs(TSMAPI.SOULBOUND_MATS) do for itemString in pairs(TSMAPI.SOULBOUND_MATS) do
local bagNum = GetItemCount(itemString) local bagNum = GetItemCount(itemString)
local bankNum = GetItemCount(itemString, true) - GetItemCount(itemString) local bankNum = GetItemCount(itemString, true) - GetItemCount(itemString)
bagTotal[itemString] = (bagTotal[itemString] or 0) + bagNum bagTotal[itemString] = (bagTotal[itemString] or 0) + bagNum
otherTotal[itemString] = (otherTotal[itemString] or 0) + bankNum otherTotal[itemString] = (otherTotal[itemString] or 0) + bankNum
total[itemString] = (total[itemString] or 0) + bagNum + bankNum total[itemString] = (total[itemString] or 0) + bagNum + bankNum
end end
-- add gbank counts of all non-ignored guilds -- add gbank counts of all non-ignored guilds
for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do
if not TSM.db.global.ignoreGuilds[guild] then if not TSM.db.global.ignoreGuilds[guild] then
local gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} local gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {}
for itemString, quantity in pairs(gbank) do for itemString, quantity in pairs(gbank) do
otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity
total[itemString] = (total[itemString] or 0) + quantity total[itemString] = (total[itemString] or 0) + quantity
end end
end end
end end
return bagTotal, auctionTotal, otherTotal, total -- Ascension WoW: add personal bank counts for all non-ignored characters
end for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do
if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then
-- gets the total number of some item that they have local personalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", player) or {}
function Inventory:GetTotalQuantity(itemString) for itemString, quantity in pairs(personalBank) do
if not itemString then return 0 end otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity
local count = 0 total[itemString] = (total[itemString] or 0) + quantity
end
-- add bags/bank/mail/auction counts of all non-ignored characters (always including current character) end
for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do end
if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then
local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} -- Ascension WoW: add realm bank counts
local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} local realmBank = TSMAPI:ModuleAPI("ItemTracker", "realmbank") or {}
local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} for itemString, quantity in pairs(realmBank) do
local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {} otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity
count = count + (bags[itemString] or 0) total[itemString] = (total[itemString] or 0) + quantity
count = count + (bank[itemString] or 0) end
count = count + (mail[itemString] or 0)
count = count + (auctions[itemString] or 0) return bagTotal, auctionTotal, otherTotal, total
end end
end
-- add gbank counts of all non-ignored guilds -- gets the total number of some item that they have
for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do function Inventory:GetTotalQuantity(itemString)
if not TSM.db.global.ignoreGuilds[guild] then if not itemString then return 0 end
local bank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} local count = 0
count = count + (bank[itemString] or 0)
end -- add bags/bank/mail/auction counts of all non-ignored characters (always including current character)
end for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do
if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then
if TSMAPI.SOULBOUND_MATS[itemString] then local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {}
count = count + GetItemCount(itemString, true) local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {}
end local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {}
local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {}
return count count = count + (bags[itemString] or 0)
end count = count + (bank[itemString] or 0)
count = count + (mail[itemString] or 0)
function Inventory:GetItemSources(crafter, neededMats) count = count + (auctions[itemString] or 0)
if not neededMats then return end end
local sources = {} end
local gbank = {} -- add gbank counts of all non-ignored guilds
local next = next for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do
local crafterBags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", crafter) or {} if not TSM.db.global.ignoreGuilds[guild] then
local crafterMail = TSMAPI:ModuleAPI("ItemTracker", "playermail", crafter) or {} local bank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {}
local crafterBank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", crafter) or {} count = count + (bank[itemString] or 0)
end
-- add vendor items end
local task = {}
local items = {} -- Ascension WoW: add personal bank counts for all non-ignored characters
for itemString, quantity in pairs(neededMats) do for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do
if TSMAPI:GetVendorCost(itemString) then if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then
local vendorNeed = quantity - ((crafterBags[itemString] or 0) + (crafterMail[itemString] or 0) + (crafterBank[itemString] or 0)) local personalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", player) or {}
if vendorNeed > 0 then count = count + (personalBank[itemString] or 0)
items[itemString] = vendorNeed end
end end
elseif TSMAPI.Conversions[itemString] and TSMAPI.InkConversions[itemString] then
local tradeItem, data = next(TSMAPI.Conversions[itemString]) -- Ascension WoW: add realm bank count
if data.source == "vendortrade" then local realmBank = TSMAPI:ModuleAPI("ItemTracker", "realmbank") or {}
local num = floor(Inventory:GetTotalQuantity(tradeItem) * data.rate) count = count + (realmBank[itemString] or 0)
if quantity > Inventory:GetTotalQuantity(itemString) and num >= (quantity - Inventory:GetTotalQuantity(itemString)) then
items[itemString] = quantity - Inventory:GetTotalQuantity(itemString) if TSMAPI.SOULBOUND_MATS[itemString] then
neededMats[tradeItem] = (neededMats[tradeItem] or 0) + quantity / data.rate -- add the qty of IOD to needed mats count = count + GetItemCount(itemString, true)
end end
end
end return count
end end
if next(items) then
tinsert(task, { taskType = L["Visit Vendor"], items = items }) function Inventory:GetItemSources(crafter, neededMats)
tinsert(sources, { sourceName = L["Vendor"], isCrafter = false, isVendor = true, isAH = false, tasks = task }) if not neededMats then return end
end local sources = {}
local gbank = {}
-- double check if crafter already has all the items needed local next = next
local shortItems = {} local crafterBags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", crafter) or {}
for itemString, quantity in pairs(neededMats) do local crafterMail = TSMAPI:ModuleAPI("ItemTracker", "playermail", crafter) or {}
local soulboundBagCount local crafterBank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", crafter) or {}
if TSMAPI.SOULBOUND_MATS[itemString] then -- Ascension WoW: crafter's personal bank
soulboundBagCount = GetItemCount(itemString) local crafterPersonalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", crafter) or {}
end
local need = max(quantity - (crafterBags[itemString] or soulboundBagCount or 0), 0) -- add vendor items
if need > 0 then local task = {}
shortItems[itemString] = need local items = {}
end for itemString, quantity in pairs(neededMats) do
end if TSMAPI:GetVendorCost(itemString) then
if not next(shortItems) then return end local vendorNeed = quantity - ((crafterBags[itemString] or 0) + (crafterMail[itemString] or 0) + (crafterBank[itemString] or 0) + (crafterPersonalBank[itemString] or 0))
if vendorNeed > 0 then
-- add bags/bank/mail "tasks" for needed items of all non-ignored characters (always include crafter) items[itemString] = vendorNeed
for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do end
if player == crafter or not TSM.db.global.ignoreCharacters[player] then elseif TSMAPI.Conversions[itemString] and TSMAPI.InkConversions[itemString] then
local task = {} local tradeItem, data = next(TSMAPI.Conversions[itemString])
local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} if data.source == "vendortrade" then
local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} local num = floor(Inventory:GetTotalQuantity(tradeItem) * data.rate)
local guild = TSMAPI:ModuleAPI("ItemTracker", "playerguild", player) or {} if quantity > Inventory:GetTotalQuantity(itemString) and num >= (quantity - Inventory:GetTotalQuantity(itemString)) then
local gbank = {} items[itemString] = quantity - Inventory:GetTotalQuantity(itemString)
if guild and not TSM.db.global.ignoreGuilds[guild] then neededMats[tradeItem] = (neededMats[tradeItem] or 0) + quantity / data.rate -- add the qty of IOD to needed mats
gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} end
end end
local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} end
local bankItems = {} end
local gbankItems = {} if next(items) then
local mailItems = {} tinsert(task, { taskType = L["Visit Vendor"], items = items })
local bagItems = {} tinsert(sources, { sourceName = L["Vendor"], isCrafter = false, isVendor = true, isAH = false, tasks = task })
end
for itemString in pairs(neededMats) do
local soulboundBagCount, soulboundBankCount -- double check if crafter already has all the items needed
if TSMAPI.SOULBOUND_MATS[itemString] then local shortItems = {}
soulboundBagCount = GetItemCount(itemString) for itemString, quantity in pairs(neededMats) do
soulboundBankCount = GetItemCount(itemString, true) - soulboundBagCount local soulboundBagCount
end if TSMAPI.SOULBOUND_MATS[itemString] then
if (bank[itemString] or (soulboundBankCount and soulboundBankCount > 0)) and shortItems[itemString] then soulboundBagCount = GetItemCount(itemString)
if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then end
bankItems[itemString] = bank[itemString] or soulboundBankCount local need = max(quantity - (crafterBags[itemString] or soulboundBagCount or 0), 0)
end if need > 0 then
end shortItems[itemString] = need
if gbank[itemString] and shortItems[itemString] then end
if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then end
gbankItems[itemString] = gbank[itemString] if not next(shortItems) then return end
end
end -- add bags/bank/mail "tasks" for needed items of all non-ignored characters (always include crafter)
if mail[itemString] and shortItems[itemString] then for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do
mailItems[itemString] = mail[itemString] if player == crafter or not TSM.db.global.ignoreCharacters[player] then
end local task = {}
if bags[itemString] and shortItems[itemString] then local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {}
if player ~= crafter then local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {}
if shortItems[itemString] - (crafterMail[itemString] or 0) > 0 then local guild = TSMAPI:ModuleAPI("ItemTracker", "playerguild", player) or {}
bagItems[itemString] = bags[itemString] local gbank = {}
end if guild and not TSM.db.global.ignoreGuilds[guild] then
end gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {}
end end
end local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {}
-- add mail tasks for destroyable items bought through shopping search (exclude items already added to mail tasks) -- Ascension WoW: personal bank for this player
for itemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do local personalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", player) or {}
if mail[itemString] and not shortItems[itemString] then local bankItems = {}
mailItems[itemString] = quantity local gbankItems = {}
end local mailItems = {}
end local bagItems = {}
local personalBankItems = {}
if next(bankItems) then
tinsert(task, { taskType = L["Visit Bank"], items = bankItems }) for itemString in pairs(neededMats) do
end local soulboundBagCount, soulboundBankCount
if next(gbankItems) then if TSMAPI.SOULBOUND_MATS[itemString] then
tinsert(task, { taskType = L["Visit Guild Bank"], items = gbankItems }) soulboundBagCount = GetItemCount(itemString)
end soulboundBankCount = GetItemCount(itemString, true) - soulboundBagCount
if next(mailItems) then end
tinsert(task, { taskType = L["Collect Mail"], items = mailItems }) if (bank[itemString] or (soulboundBankCount and soulboundBankCount > 0)) and shortItems[itemString] then
end if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then
if next(bagItems) then bankItems[itemString] = bank[itemString] or soulboundBankCount
tinsert(task, { taskType = L["Mail Items"], items = bagItems }) end
end end
if next(task) then if gbank[itemString] and shortItems[itemString] then
tinsert(sources, { sourceName = player, isCrafter = player == crafter, isVendor = false, isAH = false, tasks = task, isCurrent = (player == UnitName("player")) }) if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then
end gbankItems[itemString] = gbank[itemString]
end end
end end
-- Ascension WoW: check personal bank
-- add auction house tasks if personalBank[itemString] and shortItems[itemString] then
local auctionTask = {} if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then
local auctionItems = {} personalBankItems[itemString] = personalBank[itemString]
for itemString, quantity in pairs(neededMats) do end
if not TSMAPI.SOULBOUND_MATS[itemString] and not TSMAPI:GetVendorCost(itemString) then end
local need if mail[itemString] and shortItems[itemString] then
if TSM.Inventory.gatherItem == itemString and TSM.Inventory.gatherQuantity then mailItems[itemString] = mail[itemString]
need = TSM.Inventory.gatherQuantity end
else if bags[itemString] and shortItems[itemString] then
need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0) if player ~= crafter then
end if shortItems[itemString] - (crafterMail[itemString] or 0) > 0 then
if need > 0 then bagItems[itemString] = bags[itemString]
auctionItems[itemString] = need end
end end
end end
end end
if next(auctionItems) then -- add mail tasks for destroyable items bought through shopping search (exclude items already added to mail tasks)
tinsert(auctionTask, { taskType = L["Search for Mats"], items = auctionItems }) for itemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do
tinsert(sources, { sourceName = L["Auction House"], isCrafter = false, isVendor = false, isAH = true, tasks = auctionTask }) if mail[itemString] and not shortItems[itemString] then
end mailItems[itemString] = quantity
end
-- add destroying tasks end
local destroyingTask, millItems, prospectItems, transformItems, deItems = {}, {}, {}, {}, {}
if next(bankItems) then
for itemString, quantity in pairs(neededMats) do tinsert(task, { taskType = L["Visit Bank"], items = bankItems })
local need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0) end
-- conversion items if next(gbankItems) then
for destroyItem, data in pairs(TSMAPI.Conversions[itemString] or {}) do tinsert(task, { taskType = L["Visit Guild Bank"], items = gbankItems })
if TSM.db.realm.gathering.destroyingMats[destroyItem] then end
if need > 0 then -- Ascension WoW: personal bank task
local destroyNeed if next(personalBankItems) then
if data.source == "mill" then tinsert(task, { taskType = L["Visit Personal Bank"], items = personalBankItems })
destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5) end
if destroyNeed > 0 then if next(mailItems) then
millItems[destroyItem] = (millItems[destroyItem] or 0) + destroyNeed tinsert(task, { taskType = L["Collect Mail"], items = mailItems })
end end
elseif data.source == "prospect" then if next(bagItems) then
destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5) tinsert(task, { taskType = L["Mail Items"], items = bagItems })
if destroyNeed > 0 then end
prospectItems[destroyItem] = (prospectItems[destroyItem] or 0) + destroyNeed if next(task) then
end tinsert(sources, { sourceName = player, isCrafter = player == crafter, isVendor = false, isAH = false, tasks = task, isCurrent = (player == UnitName("player")) })
elseif data.source == "transform" then end
if data.rate == 1 / 3 then end
destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 3) end
elseif data.rate == 1 / 10 then -- Ascension WoW: add realm bank as a separate source
destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 10) local realmBank = TSMAPI:ModuleAPI("ItemTracker", "realmbank") or {}
else local realmBankTask = {}
destroyNeed = TSM.db.realm.gathering.destroyingMats[destroyItem] local realmBankItems = {}
end for itemString in pairs(neededMats) do
if destroyNeed > 0 then if realmBank[itemString] and shortItems[itemString] then
transformItems[destroyItem] = (transformItems[destroyItem] or 0) + destroyNeed if shortItems[itemString] - (crafterMail[itemString] or 0) > 0 then
end realmBankItems[itemString] = realmBank[itemString]
end end
else end
TSM.db.realm.gathering.destroyingMats[destroyItem] = nil end
end if next(realmBankItems) then
end tinsert(realmBankTask, { taskType = L["Visit Realm Bank"], items = realmBankItems })
end tinsert(sources, { sourceName = L["Realm Bank"], isCrafter = false, isVendor = false, isAH = false, tasks = realmBankTask, isCurrent = true })
-- disenchantable items end
if next(TSM.db.realm.gathering.destroyingMats) then
for deItemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do -- add auction house tasks
if Inventory:IsDisenchantable(deItemString) then local auctionTask = {}
if need > 0 then local auctionItems = {}
deItems[deItemString] = quantity for itemString, quantity in pairs(neededMats) do
else if not TSMAPI.SOULBOUND_MATS[itemString] and not TSMAPI:GetVendorCost(itemString) then
TSM.db.realm.gathering.destroyingMats[deItemString] = nil local need
end if TSM.Inventory.gatherItem == itemString and TSM.Inventory.gatherQuantity then
end need = TSM.Inventory.gatherQuantity
end else
end need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0)
end end
if need > 0 then
if next(millItems) then auctionItems[itemString] = need
tinsert(destroyingTask, { taskType = L["Milling"], items = millItems }) end
end end
if next(prospectItems) then end
tinsert(destroyingTask, { taskType = L["Prospect"], items = prospectItems }) if next(auctionItems) then
end tinsert(auctionTask, { taskType = L["Search for Mats"], items = auctionItems })
if next(transformItems) then tinsert(sources, { sourceName = L["Auction House"], isCrafter = false, isVendor = false, isAH = true, tasks = auctionTask })
tinsert(destroyingTask, { taskType = L["Transform"], items = transformItems }) end
end
if next(deItems) then -- add destroying tasks
tinsert(destroyingTask, { taskType = L["Disenchant"], items = deItems }) local destroyingTask, millItems, prospectItems, transformItems, deItems = {}, {}, {}, {}, {}
end
if next(destroyingTask) then for itemString, quantity in pairs(neededMats) do
tinsert(sources, { sourceName = L["Destroying"], isCrafter = false, isVendor = false, isAH = true, tasks = destroyingTask }) local need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0)
end -- conversion items
for destroyItem, data in pairs(TSMAPI.Conversions[itemString] or {}) do
if TSM.db.realm.gathering.destroyingMats[destroyItem] then
sort(sources, function(a, b) if need > 0 then
if a.isCurrent then return true end local destroyNeed
if b.isCurrent then return false end if data.source == "mill" then
if a.isAH then return false end destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5)
if b.isAH then return true end if destroyNeed > 0 then
if a.isVendor then return false end millItems[destroyItem] = (millItems[destroyItem] or 0) + destroyNeed
if b.isVendor then return true end end
if a.isCrafter then return false end elseif data.source == "prospect" then
if b.isCrafter then return true end destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5)
return a.sourceName < b.sourceName if destroyNeed > 0 then
end) prospectItems[destroyItem] = (prospectItems[destroyItem] or 0) + destroyNeed
return sources end
end elseif data.source == "transform" then
if data.rate == 1 / 3 then
function Inventory:IsDisenchantable(itemString) destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 3)
local _, link, quality, _, _, iType = TSMAPI:GetSafeItemInfo(itemString) elseif data.rate == 1 / 10 then
local WEAPON, ARMOR = GetAuctionItemClasses() destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 10)
if itemString and not TSMAPI.DisenchantingData.notDisenchantable[itemString] and (iType == ARMOR or iType == WEAPON) then else
return true destroyNeed = TSM.db.realm.gathering.destroyingMats[destroyItem]
end end
if destroyNeed > 0 then
transformItems[destroyItem] = (transformItems[destroyItem] or 0) + destroyNeed
end
end
else
TSM.db.realm.gathering.destroyingMats[destroyItem] = nil
end
end
end
-- disenchantable items
if next(TSM.db.realm.gathering.destroyingMats) then
for deItemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do
if Inventory:IsDisenchantable(deItemString) then
if need > 0 then
deItems[deItemString] = quantity
else
TSM.db.realm.gathering.destroyingMats[deItemString] = nil
end
end
end
end
end
if next(millItems) then
tinsert(destroyingTask, { taskType = L["Milling"], items = millItems })
end
if next(prospectItems) then
tinsert(destroyingTask, { taskType = L["Prospect"], items = prospectItems })
end
if next(transformItems) then
tinsert(destroyingTask, { taskType = L["Transform"], items = transformItems })
end
if next(deItems) then
tinsert(destroyingTask, { taskType = L["Disenchant"], items = deItems })
end
if next(destroyingTask) then
tinsert(sources, { sourceName = L["Destroying"], isCrafter = false, isVendor = false, isAH = true, tasks = destroyingTask })
end
sort(sources, function(a, b)
if a.isCurrent then return true end
if b.isCurrent then return false end
if a.isAH then return false end
if b.isAH then return true end
if a.isVendor then return false end
if b.isVendor then return true end
if a.isCrafter then return false end
if b.isCrafter then return true end
return a.sourceName < b.sourceName
end)
return sources
end
function Inventory:IsDisenchantable(itemString)
local _, link, quality, _, _, iType = TSMAPI:GetSafeItemInfo(itemString)
local WEAPON, ARMOR = GetAuctionItemClasses()
if itemString and not TSMAPI.DisenchantingData.notDisenchantable[itemString] and (iType == ARMOR or iType == WEAPON) then
return true
end
end end

4
TradeSkillMaster_ItemTracker/Locale/enUS.lua

@ -14,9 +14,13 @@ local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_ItemTracker", "en
if not L then return end if not L then return end
L["%s (%s bags, %s bank, %s AH, %s mail)"] = true L["%s (%s bags, %s bank, %s AH, %s mail)"] = true
L["%s (%s bags, %s bank, %s AH, %s mail, %s personal)"] = true
L["%s in guild bank"] = true L["%s in guild bank"] = true
L["%s in realm bank"] = true
L["%s item(s) total"] = true L["%s item(s) total"] = true
L["(%s player, %s alts, %s guild banks, %s AH)"] = true L["(%s player, %s alts, %s guild banks, %s AH)"] = true
L["(%s player, %s alts, %s guild, %s AH, %s personal, %s realm)"] = true
L["Realm Bank"] = true
L["AH"] = true L["AH"] = true
L["Bags"] = true L["Bags"] = true
L["Bank"] = true L["Bank"] = true

111
TradeSkillMaster_ItemTracker/Modules/data.lua

@ -78,12 +78,39 @@ function Data:ThrottleEvent(event)
throttleFrames[event]:Show() throttleFrames[event]:Show()
end end
-- Ascension WoW bank type constants
local BANK_TYPE_PERSONAL = "personal"
local BANK_TYPE_REALM = "realm"
local BANK_TYPE_GUILD = "guild"
-- Detect the type of bank currently open based on tab names
-- Ascension uses "Personal Bank" and "Realm Bank" as tab names for custom banks
local function GetCurrentBankType()
local numTabs = GetNumGuildBankTabs()
if numTabs == 0 then return nil end
local firstTabName = GetGuildBankTabInfo(1)
if firstTabName == "Personal Bank" then
return BANK_TYPE_PERSONAL
elseif firstTabName == "Realm Bank" then
return BANK_TYPE_REALM
else
return BANK_TYPE_GUILD
end
end
-- Store the current bank type when opened (persists until next open)
local currentOpenBankType = nil
function Data:EventHandler(event, fire) function Data:EventHandler(event, fire)
if isScanning then return end if isScanning then return end
if fire ~= "FIRE" then if fire ~= "FIRE" then
Data:ThrottleEvent(event) Data:ThrottleEvent(event)
else else
if event == "GUILDBANKFRAME_OPENED" then if event == "GUILDBANKFRAME_OPENED" then
-- Detect and store the bank type
currentOpenBankType = GetCurrentBankType()
-- Query all tabs of the gbank to ensure all tabs will be scanned. -- Query all tabs of the gbank to ensure all tabs will be scanned.
local initialTab = GetCurrentGuildBankTab() local initialTab = GetCurrentGuildBankTab()
for tab = 1, GetNumGuildBankTabs() do for tab = 1, GetNumGuildBankTabs() do
@ -93,7 +120,14 @@ function Data:EventHandler(event, fire)
end end
QueryGuildBankTab(initialTab) QueryGuildBankTab(initialTab)
elseif event == "GUILDBANKBAGSLOTS_CHANGED" then elseif event == "GUILDBANKBAGSLOTS_CHANGED" then
Data:GetGuildBankData() -- Route to the appropriate handler based on bank type
if currentOpenBankType == BANK_TYPE_PERSONAL then
Data:GetPersonalBankData()
elseif currentOpenBankType == BANK_TYPE_REALM then
Data:GetRealmBankData()
else
Data:GetGuildBankData()
end
elseif event == "AUCTION_OWNED_LIST_UPDATE" then elseif event == "AUCTION_OWNED_LIST_UPDATE" then
Data:ScanPlayerAuctions() Data:ScanPlayerAuctions()
end end
@ -128,35 +162,86 @@ function Data:GetBankData(state)
TSM.Sync:BroadcastUpdateRequest() TSM.Sync:BroadcastUpdateRequest()
end end
-- scan the guild bank -- Helper function to scan all guild bank slots and return items table
function Data:GetGuildBankData() local function ScanGuildBankSlots()
if not TSM.CURRENT_GUILD then local items = {}
Data:StoreCurrentGuildInfo(true) local numTabs = GetNumGuildBankTabs()
if not TSM.CURRENT_GUILD then return end for tab = 1, numTabs do
end local name, icon, isViewable, canDeposit, numWithdrawals = GetGuildBankTabInfo(tab)
wipe(TSM.guilds[TSM.CURRENT_GUILD].items) -- Ascension WoW: For Personal/Realm banks, always scan (numWithdrawals check may not apply)
local canAccess = (numWithdrawals and numWithdrawals > 0) or IsGuildLeader(UnitName("player")) or (name == "Personal Bank") or (name == "Realm Bank")
for tab = 1, GetNumGuildBankTabs() do if canAccess then
if select(5, GetGuildBankTabInfo(tab)) > 0 or IsGuildLeader(UnitName("player")) then
for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do
local itemString = TSMAPI:GetItemString(GetGuildBankItemLink(tab, slot)) local itemString = TSMAPI:GetItemString(GetGuildBankItemLink(tab, slot))
local baseItemString = TSMAPI:GetBaseItemString(GetGuildBankItemLink(tab, slot)) local baseItemString = TSMAPI:GetBaseItemString(GetGuildBankItemLink(tab, slot))
if itemString then if itemString then
local quantity = select(2, GetGuildBankItemInfo(tab, slot)) local quantity = select(2, GetGuildBankItemInfo(tab, slot))
TSM.guilds[TSM.CURRENT_GUILD].items[itemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[itemString] or 0) + quantity items[itemString] = (items[itemString] or 0) + quantity
if itemString ~= baseItemString then if itemString ~= baseItemString then
TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] or 0) + quantity items[baseItemString] = (items[baseItemString] or 0) + quantity
end end
end end
end end
end end
end end
return items
end
-- scan the guild bank (real guild bank only)
function Data:GetGuildBankData()
if not TSM.CURRENT_GUILD then
Data:StoreCurrentGuildInfo(true)
if not TSM.CURRENT_GUILD then return end
end
wipe(TSM.guilds[TSM.CURRENT_GUILD].items)
local items = ScanGuildBankSlots()
for itemString, quantity in pairs(items) do
TSM.guilds[TSM.CURRENT_GUILD].items[itemString] = quantity
end
if GuildBankFrame and GuildBankFrame:IsVisible() then if GuildBankFrame and GuildBankFrame:IsVisible() then
TSM.guilds[TSM.CURRENT_GUILD].lastUpdate = time() TSM.guilds[TSM.CURRENT_GUILD].lastUpdate = time()
end end
TSM.Sync:BroadcastUpdateRequest() TSM.Sync:BroadcastUpdateRequest()
end end
-- Ascension WoW: scan the personal bank (per character)
function Data:GetPersonalBankData()
-- Initialize personal bank for current player if needed
if not TSM.personalBanks[TSM.CURRENT_PLAYER] then
TSM.personalBanks[TSM.CURRENT_PLAYER] = { items = {}, lastUpdate = 0 }
end
wipe(TSM.personalBanks[TSM.CURRENT_PLAYER].items)
local items = ScanGuildBankSlots()
for itemString, quantity in pairs(items) do
TSM.personalBanks[TSM.CURRENT_PLAYER].items[itemString] = quantity
end
TSM.personalBanks[TSM.CURRENT_PLAYER].lastUpdate = time()
TSM.Sync:BroadcastUpdateRequest()
end
-- Ascension WoW: scan the realm bank (shared across realm)
function Data:GetRealmBankData()
-- Initialize realm bank if needed
if not TSM.realmBank.items then
TSM.realmBank.items = {}
end
wipe(TSM.realmBank.items)
local items = ScanGuildBankSlots()
for itemString, quantity in pairs(items) do
TSM.realmBank.items[itemString] = quantity
end
if GuildBankFrame and GuildBankFrame:IsVisible() then
TSM.realmBank.lastUpdate = time()
end
TSM.Sync:BroadcastUpdateRequest()
end
function Data:ScanPlayerAuctions() function Data:ScanPlayerAuctions()
wipe(TSM.characters[TSM.CURRENT_PLAYER].auctions) wipe(TSM.characters[TSM.CURRENT_PLAYER].auctions)
TSM.characters[TSM.CURRENT_PLAYER].auctions.time = time() TSM.characters[TSM.CURRENT_PLAYER].auctions.time = time()

87
TradeSkillMaster_ItemTracker/TradeSkillMaster_ItemTracker.lua

@ -13,7 +13,7 @@ local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_ItemTracker")
-- default values for the savedDB -- default values for the savedDB
local savedDBDefaults = { local savedDBDefaults = {
-- any global -- any global
global = { global = {
tooltip = "simple", tooltip = "simple",
}, },
@ -23,6 +23,10 @@ local savedDBDefaults = {
characters = {}, characters = {},
guilds = {}, guilds = {},
ignoreGuilds = {}, ignoreGuilds = {},
-- Ascension WoW: Personal banks (per character, stored by character name)
personalBanks = {},
-- Ascension WoW: Realm bank (shared across all characters on realm)
realmBank = { items = {}, lastUpdate = 0 },
}, },
-- data that is stored per user profile -- data that is stored per user profile
@ -47,6 +51,11 @@ local guildDefaults = {
items = {}, items = {},
lastUpdate = 0, lastUpdate = 0,
} }
-- Ascension WoW: Personal bank defaults (same structure as guild)
local personalBankDefaults = {
items = {},
lastUpdate = 0,
}
-- Called once the player has loaded into the game -- Called once the player has loaded into the game
-- Anything that needs to be done in order to initialize the addon should go here -- Anything that needs to be done in order to initialize the addon should go here
@ -58,9 +67,12 @@ function TSM:OnInitialize()
-- load the saved variables table into TSM.db -- load the saved variables table into TSM.db
TSM.db = LibStub:GetLibrary("AceDB-3.0"):New("AscensionTSM_ItemTrackerDB", savedDBDefaults, true) TSM.db = LibStub:GetLibrary("AceDB-3.0"):New("AscensionTSM_ItemTrackerDB", savedDBDefaults, true)
TSM.characters = TSM.db.realm.characters TSM.characters = TSM.db.realm.characters
TSM.guilds = TSM.db.realm.guilds TSM.guilds = TSM.db.realm.guilds
-- Ascension WoW: Personal banks and realm bank
TSM.personalBanks = TSM.db.realm.personalBanks
TSM.realmBank = TSM.db.realm.realmBank
-- handle connected realms for characters -- handle connected realms for characters
local connectedRealms = TSMAPI.GetConnectedRealms and TSMAPI:GetConnectedRealms() or {} local connectedRealms = TSMAPI.GetConnectedRealms and TSMAPI:GetConnectedRealms() or {}
@ -117,6 +129,11 @@ function TSM:OnInitialize()
for _, guildData in pairs(TSM.guilds) do for _, guildData in pairs(TSM.guilds) do
ClearItemIDs(guildData.items) ClearItemIDs(guildData.items)
end end
-- Ascension WoW: Clean up personal banks and realm bank
for _, personalBankData in pairs(TSM.personalBanks) do
ClearItemIDs(personalBankData.items)
end
ClearItemIDs(TSM.realmBank.items)
TSM.Data:Initialize() TSM.Data:Initialize()
TSM:UpdatePlayerLookup() TSM:UpdatePlayerLookup()
@ -151,6 +168,11 @@ function TSM:RegisterModule()
{ key = "guildtotal", callback = "GetGuildTotal" }, { key = "guildtotal", callback = "GetGuildTotal" },
{ key = "playerguildtotal", callback = "GetPlayerGuildTotal" }, { key = "playerguildtotal", callback = "GetPlayerGuildTotal" },
{ key = "playerguild", callback = "GetPlayerGuild" }, { key = "playerguild", callback = "GetPlayerGuild" },
-- Ascension WoW: Personal banks and realm bank APIs
{ key = "personalbank", callback = "GetPersonalBank" },
{ key = "realmbank", callback = "GetRealmBank" },
{ key = "personalbankstotal", callback = "GetPersonalBanksTotal" },
{ key = "realmbanktotal", callback = "GetRealmBankTotal" },
} }
--TSM.sync = { callback = "Sync:Callback" } --TSM.sync = { callback = "Sync:Callback" }
TSM.tooltipOptions = { callback = "Config:LoadTooltipOptions" } TSM.tooltipOptions = { callback = "Config:LoadTooltipOptions" }
@ -169,9 +191,18 @@ function TSM:GetTooltip(itemString)
local player, alts = TSM:GetPlayerTotal(itemString) local player, alts = TSM:GetPlayerTotal(itemString)
local guild = TSM:GetGuildTotal(itemString) local guild = TSM:GetGuildTotal(itemString)
local auctions = TSM:GetAuctionsTotal(itemString) local auctions = TSM:GetAuctionsTotal(itemString)
grandTotal = grandTotal + player + alts + guild + auctions -- Ascension WoW: Add personal banks and realm bank
local personalBanks = TSM:GetPersonalBanksTotal(itemString)
local realmBank = TSM:GetRealmBankTotal(itemString)
grandTotal = grandTotal + player + alts + guild + auctions + personalBanks + realmBank
if grandTotal > 0 then if grandTotal > 0 then
tinsert(text, { left = " " .. "ItemTracker:", right = format(L["(%s player, %s alts, %s guild banks, %s AH)"], "|cffffffff" .. player .. "|r", "|cffffffff" .. alts .. "|r", "|cffffffff" .. guild .. "|r", "|cffffffff" .. auctions .. "|r") }) tinsert(text, { left = " " .. "ItemTracker:", right = format(L["(%s player, %s alts, %s guild, %s AH, %s personal, %s realm)"],
"|cffffffff" .. player .. "|r",
"|cffffffff" .. alts .. "|r",
"|cffffffff" .. guild .. "|r",
"|cffffffff" .. auctions .. "|r",
"|cffffffff" .. personalBanks .. "|r",
"|cffffffff" .. realmBank .. "|r") })
end end
elseif TSM.db.global.tooltip == "full" then elseif TSM.db.global.tooltip == "full" then
for name, data in pairs(TSM.characters) do for name, data in pairs(TSM.characters) do
@ -179,17 +210,26 @@ function TSM:GetTooltip(itemString)
local bank = data.bank[itemString] or 0 local bank = data.bank[itemString] or 0
local auctions = data.auctions[itemString] or 0 local auctions = data.auctions[itemString] or 0
local mail = data.mail[itemString] or 0 local mail = data.mail[itemString] or 0
local total = bags + bank + auctions + mail -- Ascension WoW: Add personal bank for this character
local personalBank = TSM.personalBanks[name] and TSM.personalBanks[name].items[itemString] or 0
local total = bags + bank + auctions + mail + personalBank
grandTotal = grandTotal + total grandTotal = grandTotal + total
local bagText = "|cffffffff" .. bags .. "|r" local bagText = "|cffffffff" .. bags .. "|r"
local bankText = "|cffffffff" .. bank .. "|r" local bankText = "|cffffffff" .. bank .. "|r"
local auctionText = "|cffffffff" .. auctions .. "|r" local auctionText = "|cffffffff" .. auctions .. "|r"
local mailText = "|cffffffff" .. mail .. "|r" local mailText = "|cffffffff" .. mail .. "|r"
local personalBankText = "|cffffffff" .. personalBank .. "|r"
local totalText = "|cffffffff" .. total .. "|r" local totalText = "|cffffffff" .. total .. "|r"
if total > 0 then if total > 0 then
tinsert(text, { left = format(" %s:", name), right = format(L["%s (%s bags, %s bank, %s AH, %s mail)"], "|cffffffff" .. totalText, "|cffffffff" .. bagText, "|cffffffff" .. bankText, "|cffffffff" .. auctionText, "|cffffffff" .. mailText) }) tinsert(text, { left = format(" %s:", name), right = format(L["%s (%s bags, %s bank, %s AH, %s mail, %s personal)"],
"|cffffffff" .. totalText,
"|cffffffff" .. bagText,
"|cffffffff" .. bankText,
"|cffffffff" .. auctionText,
"|cffffffff" .. mailText,
"|cffffffff" .. personalBankText) })
end end
end end
@ -205,6 +245,14 @@ function TSM:GetTooltip(itemString)
end end
end end
end end
-- Ascension WoW: Show realm bank
local realmBank = TSM:GetRealmBankTotal(itemString)
if realmBank > 0 then
grandTotal = grandTotal + realmBank
local realmBankText = "|cffffffff" .. realmBank .. "|r"
tinsert(text, { left = " " .. L["Realm Bank"] .. ":", right = format(L["%s in realm bank"], realmBankText) })
end
end end
if #text > 0 then if #text > 0 then
@ -343,4 +391,31 @@ function TSM:GetPlayerGuild(player)
player = TSM.playerLookup[player] or player player = TSM.playerLookup[player] or player
if not player or not TSM.characters[player] then return end if not player or not TSM.characters[player] then return end
return TSM.characters[player].guild return TSM.characters[player].guild
end
-- Ascension WoW: Get personal bank data for a player
function TSM:GetPersonalBank(player)
player = player or TSM.CURRENT_PLAYER
player = TSM.playerLookup[player] or player
if not player or not TSM.personalBanks[player] then return end
return TSM.personalBanks[player].items
end
-- Ascension WoW: Get realm bank data
function TSM:GetRealmBank()
return TSM.realmBank.items
end
-- Ascension WoW: Get total items across all personal banks
function TSM:GetPersonalBanksTotal(itemString)
local total = 0
for _, data in pairs(TSM.personalBanks) do
total = total + (data.items[itemString] or 0)
end
return total
end
-- Ascension WoW: Get realm bank total for an item
function TSM:GetRealmBankTotal(itemString)
return TSM.realmBank.items[itemString] or 0
end end
Loading…
Cancel
Save