Added personal and realm bank implementations (#27)
* added personal and realm bank implementations * fix gathering from personal and realm banks * faster gathering from personal and realm banks * Fix Profession Multiselect on Gathering window * cleaner GetAscensionBankType function * craft queue update
This commit is contained in:
@@ -14,9 +14,13 @@ local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_ItemTracker", "en
|
||||
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, %s personal)"] = true
|
||||
L["%s in guild bank"] = true
|
||||
L["%s in realm bank"] = 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, %s AH, %s personal, %s realm)"] = true
|
||||
L["Realm Bank"] = true
|
||||
L["AH"] = true
|
||||
L["Bags"] = true
|
||||
L["Bank"] = true
|
||||
|
||||
@@ -78,12 +78,32 @@ function Data:ThrottleEvent(event)
|
||||
throttleFrames[event]:Show()
|
||||
end
|
||||
|
||||
local BANK_TYPE_PERSONAL = "personal"
|
||||
local BANK_TYPE_REALM = "realm"
|
||||
local BANK_TYPE_GUILD = "guild"
|
||||
|
||||
local function GetCurrentBankType()
|
||||
if GuildBankFrame and GuildBankFrame.IsPersonalBank then
|
||||
return BANK_TYPE_PERSONAL
|
||||
elseif GuildBankFrame and GuildBankFrame.IsRealmBank 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)
|
||||
if isScanning then return end
|
||||
if fire ~= "FIRE" then
|
||||
Data:ThrottleEvent(event)
|
||||
else
|
||||
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.
|
||||
local initialTab = GetCurrentGuildBankTab()
|
||||
for tab = 1, GetNumGuildBankTabs() do
|
||||
@@ -93,7 +113,14 @@ function Data:EventHandler(event, fire)
|
||||
end
|
||||
QueryGuildBankTab(initialTab)
|
||||
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
|
||||
Data:ScanPlayerAuctions()
|
||||
end
|
||||
@@ -128,7 +155,32 @@ function Data:GetBankData(state)
|
||||
TSM.Sync:BroadcastUpdateRequest()
|
||||
end
|
||||
|
||||
-- scan the guild bank
|
||||
-- Helper function to scan all guild bank slots and return items table
|
||||
local function ScanGuildBankSlots()
|
||||
local items = {}
|
||||
local numTabs = GetNumGuildBankTabs()
|
||||
for tab = 1, numTabs do
|
||||
local name, icon, isViewable, canDeposit, numWithdrawals = GetGuildBankTabInfo(tab)
|
||||
-- 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")
|
||||
if canAccess then
|
||||
for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do
|
||||
local itemString = TSMAPI:GetItemString(GetGuildBankItemLink(tab, slot))
|
||||
local baseItemString = TSMAPI:GetBaseItemString(GetGuildBankItemLink(tab, slot))
|
||||
if itemString then
|
||||
local quantity = select(2, GetGuildBankItemInfo(tab, slot))
|
||||
items[itemString] = (items[itemString] or 0) + quantity
|
||||
if itemString ~= baseItemString then
|
||||
items[baseItemString] = (items[baseItemString] or 0) + quantity
|
||||
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)
|
||||
@@ -136,27 +188,53 @@ function Data:GetGuildBankData()
|
||||
end
|
||||
wipe(TSM.guilds[TSM.CURRENT_GUILD].items)
|
||||
|
||||
for tab = 1, GetNumGuildBankTabs() do
|
||||
if select(5, GetGuildBankTabInfo(tab)) > 0 or IsGuildLeader(UnitName("player")) then
|
||||
for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do
|
||||
local itemString = TSMAPI:GetItemString(GetGuildBankItemLink(tab, slot))
|
||||
local baseItemString = TSMAPI:GetBaseItemString(GetGuildBankItemLink(tab, slot))
|
||||
if itemString then
|
||||
local quantity = select(2, GetGuildBankItemInfo(tab, slot))
|
||||
TSM.guilds[TSM.CURRENT_GUILD].items[itemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[itemString] or 0) + quantity
|
||||
if itemString ~= baseItemString then
|
||||
TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] or 0) + quantity
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
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
|
||||
TSM.guilds[TSM.CURRENT_GUILD].lastUpdate = time()
|
||||
end
|
||||
TSM.Sync:BroadcastUpdateRequest()
|
||||
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()
|
||||
wipe(TSM.characters[TSM.CURRENT_PLAYER].auctions)
|
||||
TSM.characters[TSM.CURRENT_PLAYER].auctions.time = time()
|
||||
|
||||
@@ -13,7 +13,7 @@ local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_ItemTracker")
|
||||
|
||||
-- default values for the savedDB
|
||||
local savedDBDefaults = {
|
||||
-- any global
|
||||
-- any global
|
||||
global = {
|
||||
tooltip = "simple",
|
||||
},
|
||||
@@ -23,6 +23,10 @@ local savedDBDefaults = {
|
||||
characters = {},
|
||||
guilds = {},
|
||||
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
|
||||
@@ -47,6 +51,11 @@ local guildDefaults = {
|
||||
items = {},
|
||||
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
|
||||
-- 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
|
||||
TSM.db = LibStub:GetLibrary("AceDB-3.0"):New("AscensionTSM_ItemTrackerDB", savedDBDefaults, true)
|
||||
|
||||
|
||||
TSM.characters = TSM.db.realm.characters
|
||||
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
|
||||
local connectedRealms = TSMAPI.GetConnectedRealms and TSMAPI:GetConnectedRealms() or {}
|
||||
@@ -117,6 +129,11 @@ function TSM:OnInitialize()
|
||||
for _, guildData in pairs(TSM.guilds) do
|
||||
ClearItemIDs(guildData.items)
|
||||
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:UpdatePlayerLookup()
|
||||
@@ -151,6 +168,11 @@ function TSM:RegisterModule()
|
||||
{ key = "guildtotal", callback = "GetGuildTotal" },
|
||||
{ key = "playerguildtotal", callback = "GetPlayerGuildTotal" },
|
||||
{ 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.tooltipOptions = { callback = "Config:LoadTooltipOptions" }
|
||||
@@ -169,9 +191,18 @@ function TSM:GetTooltip(itemString)
|
||||
local player, alts = TSM:GetPlayerTotal(itemString)
|
||||
local guild = TSM:GetGuildTotal(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
|
||||
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
|
||||
elseif TSM.db.global.tooltip == "full" then
|
||||
for name, data in pairs(TSM.characters) do
|
||||
@@ -179,17 +210,26 @@ function TSM:GetTooltip(itemString)
|
||||
local bank = data.bank[itemString] or 0
|
||||
local auctions = data.auctions[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
|
||||
|
||||
local bagText = "|cffffffff" .. bags .. "|r"
|
||||
local bankText = "|cffffffff" .. bank .. "|r"
|
||||
local auctionText = "|cffffffff" .. auctions .. "|r"
|
||||
local mailText = "|cffffffff" .. mail .. "|r"
|
||||
local personalBankText = "|cffffffff" .. personalBank .. "|r"
|
||||
local totalText = "|cffffffff" .. total .. "|r"
|
||||
|
||||
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
|
||||
|
||||
@@ -205,6 +245,14 @@ function TSM:GetTooltip(itemString)
|
||||
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
|
||||
|
||||
if #text > 0 then
|
||||
@@ -343,4 +391,31 @@ function TSM:GetPlayerGuild(player)
|
||||
player = TSM.playerLookup[player] or player
|
||||
if not player or not TSM.characters[player] then return end
|
||||
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
|
||||
Reference in New Issue
Block a user