From daca27ca5c39cf362dbfefda637baf86c3df9956 Mon Sep 17 00:00:00 2001 From: Vati Date: Mon, 6 Apr 2026 15:30:26 +0400 Subject: [PATCH] feat: cross acount, cross realm character tracking --- Core/Database.lua | 2 + Core/Main.lua | 5 + Core/SharedData.lua | 83 ++ Core/Tooltip.lua | 9 +- Guda.toc | 2 + GudaShared.lua | 3141 +++++++++++++++++++++++++++++++++++++++++++ UI/BagFrame.lua | 420 ++++-- UI/BankFrame.lua | 63 +- UI/FrameHelpers.lua | 12 +- UI/ItemButton.lua | 6 +- UI/MailboxFrame.lua | 64 +- 11 files changed, 3626 insertions(+), 181 deletions(-) create mode 100644 Core/SharedData.lua create mode 100644 GudaShared.lua diff --git a/Core/Database.lua b/Core/Database.lua index ac2699b..d7c56c9 100644 --- a/Core/Database.lua +++ b/Core/Database.lua @@ -328,6 +328,8 @@ function DB:GetAllCharacters(sameFactionOnly, currentRealmOnly) faction = data.faction, money = data.money, lastUpdate = data.lastUpdate, + account = data.account, + isShared = data.isShared, }) end end diff --git a/Core/Main.lua b/Core/Main.lua index 3b3ff38..053c8ef 100644 --- a/Core/Main.lua +++ b/Core/Main.lua @@ -15,6 +15,11 @@ function Main:Initialize() -- Initialize database addon.Modules.DB:Initialize() + -- Initialize cross-account sharing (optional, requires GudaIO DLL) + if addon.Modules.SharedData then + addon.Modules.SharedData:Initialize() + end + -- Initialize item detection (before scanners, as they may use it) if addon.Modules.ItemDetection then addon.Modules.ItemDetection:Initialize() diff --git a/Core/SharedData.lua b/Core/SharedData.lua new file mode 100644 index 0000000..6871d66 --- /dev/null +++ b/Core/SharedData.lua @@ -0,0 +1,83 @@ +-- Guda SharedData Module +-- Cross-account character data sharing via GudaIO DLL (optional) +-- The DLL merges all accounts' SavedVariables at startup into GudaShared.lua +-- which is loaded via .toc and sets Guda_SharedCharacters global. +-- No Lua hooking needed - pure file I/O at DLL load time. + +local addon = Guda + +local SharedData = {} +addon.Modules.SharedData = SharedData + +-- Import shared characters from other accounts +function SharedData:Initialize() + if not Guda_SharedCharacters or type(Guda_SharedCharacters) ~= "table" then + return + end + + -- Determine current account by checking which characters are ours + -- (characters in Guda_DB.characters that don't have isShared flag) + local myChars = {} + if Guda_DB and Guda_DB.characters then + for fullName, data in pairs(Guda_DB.characters) do + if not data.isShared then + myChars[fullName] = true + end + end + end + + -- Find which account name belongs to us by checking overlap + local myAccount = nil + local accountChars = {} -- account -> { fullName -> true } + for fullName, charData in pairs(Guda_SharedCharacters) do + local acct = charData.account + if acct then + if not accountChars[acct] then accountChars[acct] = {} end + accountChars[acct][fullName] = true + end + end + + for acct, chars in pairs(accountChars) do + for fullName in pairs(chars) do + if myChars[fullName] then + myAccount = acct + break + end + end + if myAccount then break end + end + + -- Import characters from other accounts + local importCount = 0 + for fullName, charData in pairs(Guda_SharedCharacters) do + if charData.account and charData.account ~= myAccount then + -- Don't overwrite our own characters + if not myChars[fullName] then + Guda_DB.characters[fullName] = { + name = charData.name, + realm = charData.realm, + faction = charData.faction, + class = charData.class, + classToken = charData.classToken, + level = charData.level, + money = charData.money, + bags = charData.bags, + bank = charData.bank, + mailbox = charData.mailbox, + equipped = charData.equipped, + lastUpdate = charData.lastUpdate, + account = charData.account, + isShared = true, + } + importCount = importCount + 1 + end + end + end + + if importCount > 0 then + addon:Print("Imported " .. importCount .. " character(s) from other accounts") + end + + -- Clean up the global to free memory + Guda_SharedCharacters = nil +end diff --git a/Core/Tooltip.lua b/Core/Tooltip.lua index 77f709c..4c34115 100644 --- a/Core/Tooltip.lua +++ b/Core/Tooltip.lua @@ -303,6 +303,7 @@ function Tooltip:AddInventoryInfo(tooltip, link) entry.mailCount = mailCount entry.equippedCount = equippedCount entry.isCurrent = isCurrentChar + entry.isShared = charData.isShared end end -- If charData is not a table (string, number, etc.), just skip it @@ -338,8 +339,9 @@ function Tooltip:AddInventoryInfo(tooltip, link) end tooltip:AddDoubleLine(totalText, breakdownText, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) - -- Sort with current character first + -- Sort: own chars first (current char at top), then shared table.sort(characterCounts, function(a, b) + if a.isShared ~= b.isShared then return not a.isShared end if a.isCurrent and not b.isCurrent then return true end if not a.isCurrent and b.isCurrent then return false end return a.name < b.name @@ -347,7 +349,12 @@ function Tooltip:AddInventoryInfo(tooltip, link) -- Reuse module-level parts table for per-character breakdown local parts = _charParts + local sharedSeparatorShown = false for _, charInfo in ipairs(characterCounts) do + if charInfo.isShared and not sharedSeparatorShown then + tooltip:AddLine("|cFF80C0FFOther Accounts|r") + sharedSeparatorShown = true + end local r, g, b = GetClassColor(charInfo.classToken) local pIndex = 0 diff --git a/Guda.toc b/Guda.toc index 1fdd211..88112a0 100644 --- a/Guda.toc +++ b/Guda.toc @@ -8,11 +8,13 @@ ## OptionalDeps: pfUI Localization.lua +GudaShared.lua Core\Init.lua Core\Theme.lua Core\Constants.lua Core\Database.lua +Core\SharedData.lua DB\QuestItems.lua Core\Events.lua Core\Utils.lua diff --git a/GudaShared.lua b/GudaShared.lua new file mode 100644 index 0000000..5f6550f --- /dev/null +++ b/GudaShared.lua @@ -0,0 +1,3141 @@ +-- Generated by GudaIO DLL +Guda_SharedCharacters = { + + ["Pally-Local Turtle (1,17,2)"] = { + ["classToken"] = "PALADIN", + ["money"] = 1100736, + ["class"] = "Paladin", + ["lastUpdate"] = 1775470491, + ["mailbox"] = { + }, + ["bags"] = { + [1] = { + ["bagType"] = "regular", + ["freeSlots"] = 0, + ["slots"] = { + [1] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 19, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [2] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Homemade Cherry Pie", + ["link"] = "|cffffffff|Hitem:8950:0:0:0|h[Homemade Cherry Pie]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_10", + }, + [3] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 7, + ["name"] = "Roasted Quail", + ["link"] = "|cffffffff|Hitem:8952:0:0:0|h[Roasted Quail]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_15", + }, + [4] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 3, + ["name"] = "Morning Glory Dew", + ["link"] = "|cffffffff|Hitem:8766:0:0:0|h[Morning Glory Dew]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_01", + }, + [5] = { + ["type"] = "Junk", + ["iLevel"] = 60, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["name"] = "Foror's Compendium of Dragon Slaying", + ["link"] = "|cffa335ee|Hitem:18401:0:0:0|h[Foror's Compendium of Dragon Slaying]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Book_11", + }, + [6] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["name"] = "Beasts Deck", + ["link"] = "|cffa335ee|Hitem:19228:0:0:0|h[Beasts Deck]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Ticket_Tarot_Stack_01", + }, + [7] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Argent Dawn Valor Token", + ["link"] = "|cff1eff00|Hitem:12844:0:0:0|h[Argent Dawn Valor Token]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_08", + }, + [8] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Stratholme Holy Water", + ["link"] = "|cffffffff|Hitem:13180:0:0:0|h[Stratholme Holy Water]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_75", + }, + [9] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Scepter of Celebras", + ["link"] = "|cff0070dd|Hitem:17191:0:0:0|h[Scepter of Celebras]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Staff_16", + }, + [10] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Mallet of Zul'Farrak", + ["link"] = "|cff1eff00|Hitem:9240:0:0:0|h[Mallet of Zul'Farrak]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Hammer_19", + }, + [11] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Blood of Heroes", + ["link"] = "|cffffffff|Hitem:12938:0:0:0|h[Blood of Heroes]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_33", + }, + [12] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Qiraji Martial Drape", + ["link"] = "|cff0070dd|Hitem:20885:0:0:0|h[Qiraji Martial Drape]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Qiraj_DrapeMartial", + }, + [13] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Primal Hakkari Kossack", + ["link"] = "|cffa335ee|Hitem:19723:0:0:0|h[Primal Hakkari Kossack]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Shirt_07", + }, + [14] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Neru Fragment", + ["link"] = "|cffffffff|Hitem:2661:0:0:0|h[Neru Fragment]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Stone_12", + }, + [15] = { + ["type"] = "Reagent", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 78, + ["name"] = "Symbol of Kings", + ["link"] = "|cffffffff|Hitem:21177:0:0:0|h[Symbol of Kings]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_SymbolofKings_01", + }, + [16] = { + ["type"] = "", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 2, + ["name"] = "Pure Moonstone", + ["link"] = "|cff1eff00|Hitem:55251:0:0:0|h[Pure Moonstone]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Crystal_03", + }, + }, + ["numSlots"] = 16, + }, + [2] = { + ["bagType"] = "regular", + ["freeSlots"] = 5, + ["slots"] = { + [1] = { + ["type"] = "", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Emberstone", + ["link"] = "|cff1eff00|Hitem:55250:0:0:0|h[Emberstone]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Ruby_01", + }, + [2] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [3] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [4] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 7, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [5] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Tender Wolf Meat", + ["link"] = "|cffffffff|Hitem:12208:0:0:0|h[Tender Wolf Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_14", + }, + [6] = { + ["type"] = "Tailoring", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Recipe", + ["count"] = 1, + ["name"] = "Pattern: Frostweave Gloves", + ["link"] = "|cff1eff00|Hitem:14474:0:0:0|h[Pattern: Frostweave Gloves]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Scroll_06", + }, + [7] = { + ["type"] = "Leatherworking", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Recipe", + ["count"] = 1, + ["name"] = "Pattern: Heavy Scorpid Leggings", + ["link"] = "|cff1eff00|Hitem:15748:0:0:0|h[Pattern: Heavy Scorpid Leggings]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Scroll_03", + }, + [8] = { + ["type"] = "Leatherworking", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Recipe", + ["count"] = 1, + ["name"] = "Pattern: Heavy Scorpid Leggings", + ["link"] = "|cff1eff00|Hitem:15748:0:0:0|h[Pattern: Heavy Scorpid Leggings]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Scroll_03", + }, + [9] = { + ["type"] = "Alchemy", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Recipe", + ["count"] = 1, + ["name"] = "Recipe: Mighty Rage Potion", + ["link"] = "|cff1eff00|Hitem:13476:0:0:0|h[Recipe: Mighty Rage Potion]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Scroll_06", + }, + [10] = { + ["type"] = "Bag", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_BAG", + ["class"] = "Container", + ["count"] = 1, + ["name"] = "Traveler's Backpack", + ["link"] = "|cff1eff00|Hitem:4500:0:0:0|h[Traveler's Backpack]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Misc_Bag_08", + }, + [11] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 16, + ["name"] = "Dark Iron Scraps", + ["link"] = "|cffffffff|Hitem:22528:0:0:0|h[Dark Iron Scraps]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_ArmorKit_20", + }, + }, + ["numSlots"] = 16, + }, + [3] = { + ["bagType"] = "regular", + ["freeSlots"] = 16, + ["slots"] = { + }, + ["numSlots"] = 16, + }, + [4] = { + ["bagType"] = "regular", + ["freeSlots"] = 16, + ["slots"] = { + }, + ["numSlots"] = 16, + }, + [0] = { + ["bagType"] = "regular", + ["freeSlots"] = 0, + ["slots"] = { + [1] = { + ["type"] = "One-Handed Maces", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_WEAPON", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "The End of Dreams", + ["link"] = "|cffa335ee|Hitem:22988:0:0:0|h[The End of Dreams]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Mace_1H_Stratholme_D_02", + }, + [2] = { + ["type"] = "Two-Handed Swords", + ["iLevel"] = 44, + ["subclass"] = "INVTYPE_2HWEAPON", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Tusker Sword", + ["link"] = "|cff1eff00|Hitem:15252:0:705:0|h[Tusker Sword of the Tiger]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Sword_45", + }, + [3] = { + ["type"] = "Cloth", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_HEAD", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Gamemaster Hood", + ["link"] = "|cffffffff|Hitem:12064:0:0:0|h[Gamemaster Hood]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Helmet_29TWOW", + }, + [4] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_NECK", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Drakefire Amulet", + ["link"] = "|cff0070dd|Hitem:16309:0:0:0|h[Drakefire Amulet]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_11", + }, + [5] = { + ["type"] = "Mail", + ["iLevel"] = 48, + ["subclass"] = "INVTYPE_SHOULDER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Crusader's Pauldrons", + ["link"] = "|cff1eff00|Hitem:10200:0:1620:0|h[Crusader's Pauldrons of Defense]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Shoulder_28", + }, + [6] = { + ["type"] = "Cloth", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_CLOAK", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Cryptfiend Silk Cloak", + ["link"] = "|cffa335ee|Hitem:22938:0:0:0|h[Cryptfiend Silk Cloak]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Misc_Cape_Naxxramas_02", + }, + [7] = { + ["type"] = "Plate", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_CHEST", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Avenger's Breastplate", + ["link"] = "|cffa335ee|Hitem:21389:0:0:0|h[Avenger's Breastplate]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Chest_Plate03", + }, + [8] = { + ["type"] = "Cloth", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_ROBE", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Gamemaster's Robe", + ["link"] = "|cffffffff|Hitem:2586:0:0:0|h[Gamemaster's Robe]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Chest_Cloth_23TWOW", + }, + [9] = { + ["type"] = "Mail", + ["iLevel"] = 50, + ["subclass"] = "INVTYPE_WRIST", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Rubicund Armguards", + ["link"] = "|cff0070dd|Hitem:11679:0:0:0|h[Rubicund Armguards]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Bracer_13", + }, + [10] = { + ["type"] = "Cloth", + ["iLevel"] = 59, + ["subclass"] = "INVTYPE_LEGS", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Master's Leggings", + ["link"] = "|cff1eff00|Hitem:10252:0:1063:0|h[Master's Leggings of the Whale]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Pants_09", + }, + [11] = { + ["type"] = "Cloth", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_FEET", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Gamemaster's Slippers", + ["link"] = "|cffffffff|Hitem:11508:0:0:0|h[Gamemaster's Slippers]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Boots_Fabric_01TWOW", + }, + [12] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_FINGER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Signet Ring of the Bronze Dragonflight", + ["link"] = "|cffa335ee|Hitem:21205:0:0:0|h[Signet Ring of the Bronze Dragonflight]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_40", + }, + [13] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [14] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [15] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [16] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + }, + ["numSlots"] = 16, + }, + [-2] = { + ["bagType"] = "regular", + ["freeSlots"] = 10, + ["slots"] = { + [1] = { + ["type"] = "Key", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Key", + ["count"] = 3, + ["name"] = "Relic Coffer Key", + ["link"] = "|cffffffff|Hitem:11078:0:0:0|h[Relic Coffer Key]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Key_03", + }, + [2] = { + ["type"] = "Key", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Key", + ["count"] = 1, + ["name"] = "Shadowforge Key", + ["link"] = "|cffffffff|Hitem:11000:0:0:0|h[Shadowforge Key]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Key_08", + }, + }, + ["numSlots"] = 12, + }, + }, + ["character"] = { + ["classToken"] = "PALADIN", + ["lastSeen"] = 1775470481, + ["class"] = "Paladin", + ["race"] = "High Elf", + ["name"] = "Pally", + ["level"] = 60, + ["realm"] = "Local Turtle (1,17,2)", + }, + ["name"] = "Pally", + ["bank"] = { + }, + ["level"] = 60, + ["equipped"] = { + ["Finger0Slot"] = { + ["name"] = "Angelista's Touch", + ["link"] = "|cffa335ee|Hitem:21695:0:0:0|h[Angelista's Touch]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_AhnQiraj_04", + }, + ["BackSlot"] = { + ["name"] = "Cryptfiend Silk Cloak", + ["link"] = "|cffa335ee|Hitem:22938:0:0:0|h[Cryptfiend Silk Cloak]|h|r", + ["texture"] = "Interface\\Icons\\INV_Misc_Cape_Naxxramas_02", + }, + ["Trinket0Slot"] = { + ["name"] = "Hand of Justice", + ["link"] = "|cff0070dd|Hitem:11815:0:0:0|h[Hand of Justice]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_01", + }, + ["FeetSlot"] = { + ["name"] = "Avenger's Greaves", + ["link"] = "|cffa335ee|Hitem:21388:0:0:0|h[Avenger's Greaves]|h|r", + ["texture"] = "Interface\\Icons\\INV_Boots_Chain_07", + }, + ["NeckSlot"] = { + ["name"] = "Gluth's Missing Collar", + ["link"] = "|cffa335ee|Hitem:22981:0:0:0|h[Gluth's Missing Collar]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Necklace_27Naxxramas", + }, + ["Finger1Slot"] = { + ["name"] = "Master Dragonslayer's Ring", + ["link"] = "|cffa335ee|Hitem:19384:0:0:0|h[Master Dragonslayer's Ring]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_41", + }, + ["ChestSlot"] = { + ["name"] = "Avenger's Breastplate", + ["link"] = "|cffa335ee|Hitem:21389:0:0:0|h[Avenger's Breastplate]|h|r", + ["texture"] = "Interface\\Icons\\INV_Chest_Plate03", + }, + ["Trinket1Slot"] = { + ["name"] = "Styleen's Impeding Scarab", + ["link"] = "|cffa335ee|Hitem:19431:0:0:0|h[Styleen's Impeding Scarab]|h|r", + ["texture"] = "Interface\\Icons\\INV_Misc_ArmorKit_10", + }, + ["ShoulderSlot"] = { + ["name"] = "Avenger's Pauldrons", + ["link"] = "|cffa335ee|Hitem:21391:0:0:0|h[Avenger's Pauldrons]|h|r", + ["texture"] = "Interface\\Icons\\INV_Shoulder_35", + }, + ["MainHandSlot"] = { + ["name"] = "Thunderfury, Blessed Blade of the Windseeker", + ["link"] = "|cffff8000|Hitem:19019:0:0:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r", + ["texture"] = "Interface\\Icons\\INV_Sword_39", + }, + ["SecondaryHandSlot"] = { + ["name"] = "The Face of Death", + ["link"] = "|cffa335ee|Hitem:23043:0:0:0|h[The Face of Death]|h|r", + ["texture"] = "Interface\\Icons\\INV_Shield_26", + }, + ["RangedSlot"] = { + ["name"] = "Libram of Fervor", + ["link"] = "|cff0070dd|Hitem:23203:0:0:0|h[Libram of Fervor]|h|r", + ["texture"] = "Interface\\Icons\\INV_Relics_LibramofTruth", + }, + ["LegsSlot"] = { + ["name"] = "Avenger's Legguards", + ["link"] = "|cffa335ee|Hitem:21390:0:0:0|h[Avenger's Legguards]|h|r", + ["texture"] = "Interface\\Icons\\INV_Pants_Plate_02", + }, + ["WristSlot"] = { + ["name"] = "Wristguards of True Flight", + ["link"] = "|cffa335ee|Hitem:18812:0:0:0|h[Wristguards of True Flight]|h|r", + ["texture"] = "Interface\\Icons\\INV_Bracer_02", + }, + ["HeadSlot"] = { + ["name"] = "Avenger's Crown", + ["link"] = "|cffa335ee|Hitem:21387:0:0:0|h[Avenger's Crown]|h|r", + ["texture"] = "Interface\\Icons\\INV_Helmet_72", + }, + ["WaistSlot"] = { + ["name"] = "Royal Qiraji Belt", + ["link"] = "|cffa335ee|Hitem:21598:0:0:0|h[Royal Qiraji Belt]|h|r", + ["texture"] = "Interface\\Icons\\INV_Belt_31", + }, + ["HandsSlot"] = { + ["name"] = "Gauntlets of Steadfast Determination", + ["link"] = "|cffa335ee|Hitem:21674:0:0:0|h[Gauntlets of Steadfast Determination]|h|r", + ["texture"] = "Interface\\Icons\\INV_Gauntlets_31", + }, + }, + ["realm"] = "Local Turtle (1,17,2)", + ["account"] = "123", + }, + + ["Ana-Local Turtle (1,17,2)"] = { + ["classToken"] = "PALADIN", + ["money"] = 104029332, + ["class"] = "Paladin", + ["realm"] = "Local Turtle (1,17,2)", + ["lastUpdate"] = 1775472281, + ["character"] = { + ["classToken"] = "PALADIN", + ["lastSeen"] = 1775472274, + ["class"] = "Paladin", + ["race"] = "High Elf", + ["name"] = "Ana", + ["level"] = 60, + ["realm"] = "Local Turtle (1,17,2)", + }, + ["name"] = "Ana", + ["bags"] = { + [1] = { + ["bagType"] = "regular", + ["freeSlots"] = 0, + ["slots"] = { + [1] = { + ["type"] = "Plate", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_SHOULDER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Avenger's Pauldrons", + ["link"] = "|cffa335ee|Hitem:21391:0:0:0|h[Avenger's Pauldrons]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Shoulder_35", + }, + [2] = { + ["type"] = "Plate", + ["iLevel"] = 47, + ["subclass"] = "INVTYPE_SHOULDER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Earthslag Shoulders", + ["link"] = "|cff0070dd|Hitem:11632:0:0:0|h[Earthslag Shoulders]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Shoulder_26", + }, + [3] = { + ["type"] = "Cloth", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_CLOAK", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Cryptfiend Silk Cloak", + ["link"] = "|cffa335ee|Hitem:22938:0:0:0|h[Cryptfiend Silk Cloak]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Misc_Cape_Naxxramas_02", + }, + [4] = { + ["type"] = "Cloth", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_ROBE", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Crystal Webbed Robe", + ["link"] = "|cffa335ee|Hitem:23220:0:0:0|h[Crystal Webbed Robe]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Chest_Cloth_46", + }, + [5] = { + ["type"] = "Plate", + ["iLevel"] = 44, + ["subclass"] = "INVTYPE_WRIST", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Revenant Bracers", + ["link"] = "|cff1eff00|Hitem:10127:0:188:0|h[Revenant Bracers of Stamina]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Bracer_16", + }, + [6] = { + ["type"] = "Cloth", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_LEGS", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Leggings of Polarity", + ["link"] = "|cffa335ee|Hitem:23070:0:0:0|h[Leggings of Polarity]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Pants_08", + }, + [7] = { + ["type"] = "Cloth", + ["iLevel"] = 41, + ["subclass"] = "INVTYPE_LEGS", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Windchaser Woolies", + ["link"] = "|cff1eff00|Hitem:14433:0:0:0|h[Windchaser Woolies]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Pants_12", + }, + [8] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_FINGER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Signet Ring of the Bronze Dragonflight", + ["link"] = "|cffa335ee|Hitem:21205:0:0:0|h[Signet Ring of the Bronze Dragonflight]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_40", + }, + [9] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 49, + ["subclass"] = "INVTYPE_FINGER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Radiant Thorium Twilight", + ["link"] = "|cff1eff00|Hitem:55256:0:0:0|h[Radiant Thorium Twilight]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_10", + }, + [10] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_FINGER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Band of Unnatural Forces", + ["link"] = "|cffa335ee|Hitem:23038:0:0:0|h[Band of Unnatural Forces]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_48Naxxramas", + }, + [11] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_FINGER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Band of Unanswered Prayers", + ["link"] = "|cffa335ee|Hitem:22939:0:0:0|h[Band of Unanswered Prayers]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_50Naxxramas", + }, + [12] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_TRINKET", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Argent Dawn Commission", + ["link"] = "|cffffffff|Hitem:12846:0:0:0|h[Argent Dawn Commission]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_07", + }, + [13] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_TRINKET", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Drake Fang Talisman", + ["link"] = "|cffa335ee|Hitem:19406:0:0:0|h[Drake Fang Talisman]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Misc_Bone_06", + }, + [14] = { + ["type"] = "Wands", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_RANGEDRIGHT", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Wand of Fates", + ["link"] = "|cffa335ee|Hitem:22820:0:0:0|h[Wand of Fates]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Wand_1H_Stratholme_D_01", + }, + [15] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_BODY", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Acolyte's Shirt", + ["link"] = "|cffffffff|Hitem:6097:0:0:0|h[Acolyte's Shirt]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Shirt_01", + }, + [16] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [17] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [18] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [19] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 20, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [20] = { + ["type"] = "Consumable", + ["iLevel"] = 51, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 14, + ["name"] = "Alterac Manna Biscuit", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [21] = { + ["type"] = "Consumable", + ["iLevel"] = 1, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 4, + ["name"] = "Crusty Flatbread", + ["link"] = "|cffffffff|Hitem:80251:0:0:0|h[Crusty Flatbread]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_09", + }, + [22] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 2, + ["name"] = "Homemade Cherry Pie", + ["link"] = "|cffffffff|Hitem:8950:0:0:0|h[Homemade Cherry Pie]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_10", + }, + [23] = { + ["type"] = "Consumable", + ["iLevel"] = 1, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 10, + ["name"] = "Roasted Boar Meat", + ["link"] = "|cffffffff|Hitem:2681:0:0:0|h[Roasted Boar Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_18", + }, + [24] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Roasted Quail", + ["link"] = "|cffffffff|Hitem:8952:0:0:0|h[Roasted Quail]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_15", + }, + [25] = { + ["type"] = "Consumable", + ["iLevel"] = 1, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 5, + ["name"] = "Tough Jerky", + ["link"] = "|cffffffff|Hitem:117:0:0:0|h[Tough Jerky]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_16", + }, + [26] = { + ["type"] = "Consumable", + ["iLevel"] = 1, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 2, + ["name"] = "Sun-Parched Waterskin", + ["link"] = "|cffffffff|Hitem:80250:0:0:0|h[Sun-Parched Waterskin]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Drink_Waterskin_05", + }, + [27] = { + ["type"] = "Consumable", + ["iLevel"] = 25, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Enchanted Water", + ["link"] = "|cffffffff|Hitem:4791:0:0:0|h[Enchanted Water]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_17", + }, + [28] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 5, + ["name"] = "Morning Glory Dew", + ["link"] = "|cffffffff|Hitem:8766:0:0:0|h[Morning Glory Dew]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_01", + }, + [29] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 5, + ["name"] = "Major Healing Potion", + ["link"] = "|cffffffff|Hitem:13446:0:0:0|h[Major Healing Potion]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_54", + }, + [30] = { + ["type"] = "Consumable", + ["iLevel"] = 35, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Superior Healing Potion", + ["link"] = "|cffffffff|Hitem:3928:0:0:0|h[Superior Healing Potion]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_53", + }, + [31] = { + ["type"] = "Consumable", + ["iLevel"] = 41, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Superior Mana Potion", + ["link"] = "|cffffffff|Hitem:13443:0:0:0|h[Superior Mana Potion]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_74", + }, + [32] = { + ["type"] = "Consumable", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Juju Chill", + ["link"] = "|cffffffff|Hitem:12457:0:0:0|h[Juju Chill]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_MonsterScales_09", + }, + [33] = { + ["type"] = "Consumable", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Juju Ember", + ["link"] = "|cffffffff|Hitem:12455:0:0:0|h[Juju Ember]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_MonsterScales_15", + }, + [34] = { + ["type"] = "Consumable", + ["iLevel"] = 45, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Scroll of Protection IV", + ["link"] = "|cffffffff|Hitem:10305:0:0:0|h[Scroll of Protection IV]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Scroll_07", + }, + [35] = { + ["type"] = "Consumable", + ["iLevel"] = 50, + ["subclass"] = "", + ["class"] = "Consumable", + ["count"] = 1, + ["name"] = "Scroll of Stamina IV", + ["link"] = "|cffffffff|Hitem:10307:0:0:0|h[Scroll of Stamina IV]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Scroll_07", + }, + [36] = { + ["type"] = "Quest", + ["iLevel"] = 20, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Tome of Valor", + ["link"] = "|cffffffff|Hitem:6776:0:0:0|h[Tome of Valor]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Book_07", + }, + }, + ["numSlots"] = 36, + }, + [2] = { + ["bagType"] = "regular", + ["freeSlots"] = 0, + ["slots"] = { + [1] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Untapped Dowsing Widget", + ["link"] = "|cffffffff|Hitem:8584:0:0:0|h[Untapped Dowsing Widget]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Potion_87", + }, + [2] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 1, + ["name"] = "Wildhammer Supply Package", + ["link"] = "|cffffffff|Hitem:41124:0:0:0|h[Wildhammer Supply Package]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Crate_01", + }, + [3] = { + ["type"] = "Quest", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Quest", + ["count"] = 8, + ["name"] = "Young Thalassian Boar Flank", + ["link"] = "|cffffffff|Hitem:41118:0:0:0|h[Young Thalassian Boar Flank]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_13", + }, + [4] = { + ["type"] = "Reagent", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["name"] = "Delicate Feather", + ["link"] = "|cffffffff|Hitem:5636:0:0:0|h[Delicate Feather]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Feather_10", + }, + [5] = { + ["type"] = "Reagent", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 9, + ["name"] = "Ironfeather", + ["link"] = "|cffffffff|Hitem:15420:0:0:0|h[Ironfeather]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Feather_05", + }, + [6] = { + ["type"] = "Reagent", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 100, + ["name"] = "Symbol of Kings", + ["link"] = "|cffffffff|Hitem:21177:0:0:0|h[Symbol of Kings]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_SymbolofKings_01", + }, + [7] = { + ["type"] = "Reagent", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 81, + ["name"] = "Symbol of Kings", + ["link"] = "|cffffffff|Hitem:21177:0:0:0|h[Symbol of Kings]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_SymbolofKings_01", + }, + [8] = { + ["type"] = "Reagent", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 20, + ["name"] = "Simple Wood", + ["link"] = "|cffffffff|Hitem:4470:0:0:0|h[Simple Wood]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_TradeskillItem_01", + }, + [9] = { + ["type"] = "", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 4, + ["name"] = "Pure Moonstone", + ["link"] = "|cff1eff00|Hitem:55251:0:0:0|h[Pure Moonstone]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Crystal_03", + }, + [10] = { + ["type"] = "", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Emberstone", + ["link"] = "|cff1eff00|Hitem:55250:0:0:0|h[Emberstone]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Ruby_01", + }, + [11] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Star Ruby", + ["link"] = "|cff1eff00|Hitem:7910:0:0:0|h[Star Ruby]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Ruby_02", + }, + [12] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 2, + ["name"] = "Greater Eternal Essence", + ["link"] = "|cff1eff00|Hitem:16203:0:0:0|h[Greater Eternal Essence]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Enchant_EssenceEternalLarge", + }, + [13] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 2, + ["name"] = "Greater Nether Essence", + ["link"] = "|cff1eff00|Hitem:11175:0:0:0|h[Greater Nether Essence]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Enchant_EssenceNetherLarge", + }, + [14] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [15] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [16] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [17] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [18] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Runecloth", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [19] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 10, + ["name"] = "Bolt of Silk Cloth", + ["link"] = "|cffffffff|Hitem:4305:0:0:0|h[Bolt of Silk Cloth]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Fabric_Silk_03", + }, + [20] = { + ["type"] = "Parts", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 10, + ["name"] = "Bronze Framework", + ["link"] = "|cffffffff|Hitem:4382:0:0:0|h[Bronze Framework]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Gizmo_BronzeFramework_01", + }, + [21] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Bloodvine", + ["link"] = "|cff1eff00|Hitem:19726:0:0:0|h[Bloodvine]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Herb_09", + }, + [22] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Heavy Leather", + ["link"] = "|cffffffff|Hitem:4234:0:0:0|h[Heavy Leather]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_LeatherScrap_07", + }, + [23] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 20, + ["name"] = "Heavy Leather", + ["link"] = "|cffffffff|Hitem:4234:0:0:0|h[Heavy Leather]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_LeatherScrap_07", + }, + [24] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 2, + ["name"] = "Wicked Claw", + ["link"] = "|cffffffff|Hitem:8146:0:0:0|h[Wicked Claw]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_MonsterClaw_01", + }, + [25] = { + ["type"] = "Parts", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Iron Strut", + ["link"] = "|cffffffff|Hitem:4387:0:0:0|h[Iron Strut]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Spear_05", + }, + [26] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 6, + ["name"] = "Giant Egg", + ["link"] = "|cffffffff|Hitem:12207:0:0:0|h[Giant Egg]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Egg_03", + }, + [27] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 5, + ["name"] = "Crawler Meat", + ["link"] = "|cffffffff|Hitem:2674:0:0:0|h[Crawler Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_51", + }, + [28] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 10, + ["name"] = "Red Wolf Meat", + ["link"] = "|cffffffff|Hitem:12203:0:0:0|h[Red Wolf Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_71", + }, + [29] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 4, + ["name"] = "Red Wolf Meat", + ["link"] = "|cffffffff|Hitem:12203:0:0:0|h[Red Wolf Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_71", + }, + [30] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 10, + ["name"] = "Tender Wolf Meat", + ["link"] = "|cffffffff|Hitem:12208:0:0:0|h[Tender Wolf Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_14", + }, + [31] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 10, + ["name"] = "Tender Wolf Meat", + ["link"] = "|cffffffff|Hitem:12208:0:0:0|h[Tender Wolf Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_14", + }, + [32] = { + ["type"] = "Trade Goods", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Tender Wolf Meat", + ["link"] = "|cffffffff|Hitem:12208:0:0:0|h[Tender Wolf Meat]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_14", + }, + [33] = { + ["type"] = "Devices", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_TRINKET", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Gnomish Cloaking Device", + ["link"] = "|cffffffff|Hitem:4397:0:0:0|h[Gnomish Cloaking Device]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Gizmo_01", + }, + [34] = { + ["type"] = "Devices", + ["iLevel"] = 55, + ["subclass"] = "INVTYPE_TRINKET", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Ultra-Flash Shadow Reflector", + ["link"] = "|cff0070dd|Hitem:18639:0:0:0|h[Ultra-Flash Shadow Reflector]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Misc_EngGizmos_16", + }, + [35] = { + ["type"] = "Devices", + ["iLevel"] = 50, + ["subclass"] = "INVTYPE_TRINKET", + ["class"] = "Trade Goods", + ["count"] = 1, + ["name"] = "Arcanite Dragonling", + ["link"] = "|cff0070dd|Hitem:16022:0:0:0|h[Arcanite Dragonling]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Misc_Head_Dragon_01", + }, + [36] = { + ["type"] = "Jewelcrafting", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Recipe", + ["count"] = 1, + ["name"] = "Plans: Stormcloud Sigil", + ["link"] = "|cff1eff00|Hitem:70109:0:0:0|h[Plans: Stormcloud Sigil]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Note_01", + }, + }, + ["numSlots"] = 36, + }, + [3] = { + ["bagType"] = "regular", + ["freeSlots"] = 32, + ["slots"] = { + [1] = { + ["type"] = "Bag", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_BAG", + ["class"] = "Container", + ["count"] = 1, + ["name"] = "Journeyman's Backpack", + ["link"] = "|cffffffff|Hitem:3914:0:0:0|h[Journeyman's Backpack]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Bag_07_Black", + }, + [2] = { + ["type"] = "Junk", + ["iLevel"] = 60, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["name"] = "Desecrated Breastplate", + ["link"] = "|cffa335ee|Hitem:22349:0:0:0|h[Desecrated Breastplate]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Desecrated_PlateChest", + }, + [3] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = -4, + ["name"] = "Time-Worn Rune", + ["link"] = "|cff1eff00|Hitem:61000:0:0:0|h[Time-Worn Rune]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Rune_08", + }, + [4] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["name"] = "Two of Portals", + ["link"] = "|cff0070dd|Hitem:19278:0:0:0|h[Two of Portals]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Ticket_Tarot_Portal_01", + }, + }, + ["numSlots"] = 36, + }, + [4] = { + ["bagType"] = "regular", + ["freeSlots"] = 29, + ["slots"] = { + [32] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["name"] = "Mysterious Unhatched Egg", + ["link"] = "|cff9d9d9d|Hitem:11419:0:0:0|h[Mysterious Unhatched Egg]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Egg_02", + }, + [34] = { + ["type"] = "One-Handed Axes", + ["iLevel"] = 43, + ["subclass"] = "INVTYPE_WEAPONMAINHAND", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Heavy Flint Axe", + ["link"] = "|cff9d9d9d|Hitem:4019:0:0:0|h[Heavy Flint Axe]|h|r", + ["quality"] = 0, + ["texture"] = "Interface\\Icons\\INV_ThrowingAxe_03", + }, + [36] = { + ["type"] = "Leather", + ["iLevel"] = 43, + ["subclass"] = "INVTYPE_FEET", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Thick Leather Boots", + ["link"] = "|cff9d9d9d|Hitem:3962:0:0:0|h[Thick Leather Boots]|h|r", + ["quality"] = 0, + ["texture"] = "Interface\\Icons\\INV_Boots_03", + }, + [30] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["name"] = "Feathery Wing", + ["link"] = "|cff9d9d9d|Hitem:11417:0:0:0|h[Feathery Wing]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_MonsterScales_01", + }, + [31] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_FEET", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Initiate's Boots", + ["link"] = "|cff9d9d9d|Hitem:24146:0:0:0|h[Initiate's Boots]|h|r", + ["quality"] = 0, + ["texture"] = "Interface\\Icons\\INV_Boots_Chain_01", + }, + [33] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 5, + ["name"] = "Splintered Tusk", + ["link"] = "|cff9d9d9d|Hitem:7098:0:0:0|h[Splintered Tusk]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Bone_05", + }, + [35] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 2, + ["name"] = "Savage Bear Claw", + ["link"] = "|cff9d9d9d|Hitem:11410:0:0:0|h[Savage Bear Claw]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_MonsterClaw_03", + }, + }, + ["numSlots"] = 36, + }, + [0] = { + ["bagType"] = "regular", + ["freeSlots"] = 0, + ["slots"] = { + [1] = { + ["type"] = "Junk", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["name"] = "Hearthstone", + ["link"] = "|cffffffff|Hitem:6948:0:0:0|h[Hearthstone]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Rune_01", + }, + [2] = { + ["type"] = "One-Handed Swords", + ["iLevel"] = 58, + ["subclass"] = "INVTYPE_WEAPONMAINHAND", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Sword of Zeal", + ["link"] = "|cff0070dd|Hitem:6622:0:0:0|h[Sword of Zeal]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Sword_39", + }, + [3] = { + ["type"] = "One-Handed Swords", + ["iLevel"] = 19, + ["subclass"] = "INVTYPE_WEAPONMAINHAND", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Shadowfang", + ["link"] = "|cff0070dd|Hitem:1482:0:0:0|h[Shadowfang]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Sword_13", + }, + [4] = { + ["type"] = "One-Handed Swords", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_WEAPON", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Thunderfury, Blessed Blade of the Windseeker", + ["link"] = "|cffff8000|Hitem:19019:0:0:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r", + ["quality"] = 5, + ["texture"] = "Interface\\Icons\\INV_Sword_39", + }, + [5] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 1, + ["subclass"] = "INVTYPE_WEAPON", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Skinning Knife", + ["link"] = "|cffffffff|Hitem:7005:0:0:0|h[Skinning Knife]|h|r", + ["quality"] = 1, + ["texture"] = "Interface\\Icons\\INV_Weapon_ShortBlade_01", + }, + [6] = { + ["type"] = "Staves", + ["iLevel"] = 35, + ["subclass"] = "INVTYPE_2HWEAPON", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Staff of Jordan", + ["link"] = "|cffa335ee|Hitem:873:0:0:0|h[Staff of Jordan]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Staff_13", + }, + [7] = { + ["type"] = "Two-Handed Swords", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_2HWEAPON", + ["class"] = "Weapon", + ["count"] = 1, + ["name"] = "Corrupted Ashbringer", + ["link"] = "|cffa335ee|Hitem:22691:0:0:0|h[Corrupted Ashbringer]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Sword_2H_AshbringerCorrupt", + }, + [8] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_HOLDABLE", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Noth's Frigid Heart", + ["link"] = "|cffa335ee|Hitem:23029:0:0:0|h[Noth's Frigid Heart]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Offhand_Naxxramas_04", + }, + [9] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_HOLDABLE", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Sapphiron's Left Eye", + ["link"] = "|cffa335ee|Hitem:23049:0:0:0|h[Sapphiron's Left Eye]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Offhand_Naxxramas_03", + }, + [10] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_HOLDABLE", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Sapphiron's Left Eye", + ["link"] = "|cffa335ee|Hitem:23049:0:0:0|h[Sapphiron's Left Eye]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Offhand_Naxxramas_03", + }, + [11] = { + ["type"] = "Cloth", + ["iLevel"] = 46, + ["subclass"] = "INVTYPE_HEAD", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Duskwoven Turban", + ["link"] = "|cff1eff00|Hitem:10061:0:792:0|h[Duskwoven Turban of the Owl]|h|r", + ["quality"] = 2, + ["texture"] = "Interface\\Icons\\INV_Helmet_32", + }, + [12] = { + ["type"] = "Cloth", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_HEAD", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Yshgo'lar, Cowl of Fanatical Devotion", + ["link"] = "|cffa335ee|Hitem:41077:0:0:0|h[Yshgo'lar, Cowl of Fanatical Devotion]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Helmet_Illidari_01", + }, + [13] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_NECK", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Necklace of Necropsy", + ["link"] = "|cffa335ee|Hitem:23036:0:0:0|h[Necklace of Necropsy]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Necklace_30Naxxramas", + }, + [14] = { + ["type"] = "Miscellaneous", + ["iLevel"] = 0, + ["subclass"] = "INVTYPE_NECK", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Drakefire Amulet", + ["link"] = "|cff0070dd|Hitem:16309:0:0:0|h[Drakefire Amulet]|h|r", + ["quality"] = 3, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_11", + }, + [15] = { + ["type"] = "Leather", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_SHOULDER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Polar Shoulder Pads", + ["link"] = "|cffa335ee|Hitem:22941:0:0:0|h[Polar Shoulder Pads]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Shoulder_07", + }, + [16] = { + ["type"] = "Cloth", + ["iLevel"] = 60, + ["subclass"] = "INVTYPE_SHOULDER", + ["class"] = "Armor", + ["count"] = 1, + ["name"] = "Rime Covered Mantle", + ["link"] = "|cffa335ee|Hitem:22983:0:0:0|h[Rime Covered Mantle]|h|r", + ["quality"] = 4, + ["texture"] = "Interface\\Icons\\INV_Shoulder_05", + }, + }, + ["numSlots"] = 16, + }, + [-2] = { + ["bagType"] = "regular", + ["freeSlots"] = 10, + ["slots"] = { + [1] = { + ["type"] = "Key", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Key", + ["count"] = 3, + ["name"] = "Relic Coffer Key", + ["link"] = "|cffffffff|Hitem:11078:0:0:0|h[Relic Coffer Key]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Key_03", + }, + [2] = { + ["type"] = "Key", + ["iLevel"] = 0, + ["subclass"] = "", + ["class"] = "Key", + ["count"] = 1, + ["name"] = "Shadowforge Key", + ["link"] = "|cffffffff|Hitem:11000:0:0:0|h[Shadowforge Key]|h|r", + ["quality"] = -1, + ["texture"] = "Interface\\Icons\\INV_Misc_Key_08", + }, + }, + ["numSlots"] = 12, + }, + }, + ["bank"] = { + }, + ["level"] = 60, + ["equipped"] = { + ["Finger0Slot"] = { + ["name"] = "Master Dragonslayer's Ring", + ["link"] = "|cffa335ee|Hitem:19384:0:0:0|h[Master Dragonslayer's Ring]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_41", + }, + ["BackSlot"] = { + ["name"] = "Veil of Eclipse", + ["link"] = "|cffa335ee|Hitem:23017:0:0:0|h[Veil of Eclipse]|h|r", + ["texture"] = "Interface\\Icons\\INV_Misc_Cape_Naxxramas_01", + }, + ["Trinket0Slot"] = { + ["name"] = "Styleen's Impeding Scarab", + ["link"] = "|cffa335ee|Hitem:19431:0:0:0|h[Styleen's Impeding Scarab]|h|r", + ["texture"] = "Interface\\Icons\\INV_Misc_ArmorKit_10", + }, + ["FeetSlot"] = { + ["name"] = "Avenger's Greaves", + ["link"] = "|cffa335ee|Hitem:21388:0:0:0|h[Avenger's Greaves]|h|r", + ["texture"] = "Interface\\Icons\\INV_Boots_Chain_07", + }, + ["NeckSlot"] = { + ["name"] = "Gluth's Missing Collar", + ["link"] = "|cffa335ee|Hitem:22981:0:0:0|h[Gluth's Missing Collar]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Necklace_27Naxxramas", + }, + ["Finger1Slot"] = { + ["name"] = "Angelista's Touch", + ["link"] = "|cffa335ee|Hitem:21695:0:0:0|h[Angelista's Touch]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_AhnQiraj_04", + }, + ["ChestSlot"] = { + ["name"] = "Avenger's Breastplate", + ["link"] = "|cffa335ee|Hitem:21389:0:0:0|h[Avenger's Breastplate]|h|r", + ["texture"] = "Interface\\Icons\\INV_Chest_Plate03", + }, + ["Trinket1Slot"] = { + ["name"] = "Hand of Justice", + ["link"] = "|cff0070dd|Hitem:11815:0:0:0|h[Hand of Justice]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_01", + }, + ["ShoulderSlot"] = { + ["name"] = "Glacial Mantle", + ["link"] = "|cffa335ee|Hitem:22968:0:0:0|h[Glacial Mantle]|h|r", + ["texture"] = "Interface\\Icons\\INV_Shoulder_14", + }, + ["MainHandSlot"] = { + ["name"] = "The End of Dreams", + ["link"] = "|cffa335ee|Hitem:22988:0:0:0|h[The End of Dreams]|h|r", + ["texture"] = "Interface\\Icons\\INV_Mace_1H_Stratholme_D_02", + }, + ["SecondaryHandSlot"] = { + ["name"] = "The Face of Death", + ["link"] = "|cffa335ee|Hitem:23043:0:0:0|h[The Face of Death]|h|r", + ["texture"] = "Interface\\Icons\\INV_Shield_26", + }, + ["RangedSlot"] = { + ["name"] = "Libram of Fervor", + ["link"] = "|cff0070dd|Hitem:23203:0:0:0|h[Libram of Fervor]|h|r", + ["texture"] = "Interface\\Icons\\INV_Relics_LibramofTruth", + }, + ["LegsSlot"] = { + ["name"] = "Avenger's Legguards", + ["link"] = "|cffa335ee|Hitem:21390:0:0:0|h[Avenger's Legguards]|h|r", + ["texture"] = "Interface\\Icons\\INV_Pants_Plate_02", + }, + ["WristSlot"] = { + ["name"] = "Wristguards of True Flight", + ["link"] = "|cffa335ee|Hitem:18812:0:0:0|h[Wristguards of True Flight]|h|r", + ["texture"] = "Interface\\Icons\\INV_Bracer_02", + }, + ["HeadSlot"] = { + ["name"] = "Avenger's Crown", + ["link"] = "|cffa335ee|Hitem:21387:0:0:0|h[Avenger's Crown]|h|r", + ["texture"] = "Interface\\Icons\\INV_Helmet_72", + }, + ["WaistSlot"] = { + ["name"] = "Royal Qiraji Belt", + ["link"] = "|cffa335ee|Hitem:21598:0:0:0|h[Royal Qiraji Belt]|h|r", + ["texture"] = "Interface\\Icons\\INV_Belt_31", + }, + ["HandsSlot"] = { + ["name"] = "Gauntlets of Steadfast Determination", + ["link"] = "|cffa335ee|Hitem:21674:0:0:0|h[Gauntlets of Steadfast Determination]|h|r", + ["texture"] = "Interface\\Icons\\INV_Gauntlets_31", + }, + }, + ["mailbox"] = { + }, + ["account"] = "VATI", + }, + ["Shibl-Local Turtle (1,17,2)"] = { + ["classToken"] = "HUNTER", + ["lastUpdate"] = 1775421035, + ["class"] = "Hunter", + ["mailbox"] = { + [1] = { + ["sender"] = "Ana", + ["money"] = 0, + ["item"] = { + ["name"] = "Simple Wood", + ["quality"] = -1, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_TradeskillItem_01", + }, + ["subject"] = "Simple Wood (20)", + ["wasRead"] = false, + ["hasItem"] = true, + ["CODAmount"] = 0, + ["daysLeft"] = 30, + }, + [2] = { + ["sender"] = "Ana", + ["money"] = 0, + ["item"] = { + ["name"] = "Simple Wood", + ["quality"] = -1, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_TradeskillItem_01", + }, + ["subject"] = "Simple Wood (20)", + ["wasRead"] = false, + ["hasItem"] = true, + ["CODAmount"] = 0, + ["daysLeft"] = 30, + }, + [3] = { + ["sender"] = "Ana", + ["money"] = 0, + ["item"] = { + ["name"] = "Simple Wood", + ["quality"] = -1, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_TradeskillItem_01", + }, + ["subject"] = "Simple Wood", + ["wasRead"] = false, + ["hasItem"] = true, + ["CODAmount"] = 0, + ["daysLeft"] = 30, + }, + [4] = { + ["sender"] = "Ana", + ["money"] = 0, + ["item"] = { + ["name"] = "Simple Wood", + ["quality"] = -1, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_TradeskillItem_01", + }, + ["subject"] = "Simple Wood (20)", + ["wasRead"] = false, + ["hasItem"] = true, + ["CODAmount"] = 0, + ["daysLeft"] = 30, + }, + }, + ["money"] = 99610, + ["character"] = { + ["classToken"] = "HUNTER", + ["lastSeen"] = 1775420944, + ["class"] = "Hunter", + ["race"] = "Night Elf", + ["name"] = "Shibl", + ["level"] = 60, + ["realm"] = "Local Turtle (1,17,2)", + }, + ["name"] = "Shibl", + ["bags"] = { + [1] = { + ["bagType"] = "regular", + ["freeSlots"] = 16, + ["slots"] = { + }, + ["numSlots"] = 16, + }, + [2] = { + ["bagType"] = "regular", + ["freeSlots"] = 16, + ["slots"] = { + }, + ["numSlots"] = 16, + }, + [3] = { + ["bagType"] = "regular", + ["freeSlots"] = 16, + ["slots"] = { + }, + ["numSlots"] = 16, + }, + [4] = { + ["bagType"] = "regular", + ["freeSlots"] = 16, + ["slots"] = { + }, + ["numSlots"] = 16, + }, + [0] = { + ["bagType"] = "regular", + ["freeSlots"] = 16, + ["slots"] = { + }, + ["numSlots"] = 16, + }, + [-2] = { + ["bagType"] = "regular", + ["freeSlots"] = 12, + ["slots"] = { + }, + ["numSlots"] = 12, + }, + }, + ["bank"] = { + }, + ["level"] = 60, + ["equipped"] = { + ["ChestSlot"] = { + ["name"] = "Gamemaster's Robe", + ["link"] = "|cffffffff|Hitem:2586:0:0:0|h[Gamemaster's Robe]|h|r", + ["texture"] = "Interface\\Icons\\INV_Chest_Cloth_23TWOW", + }, + ["FeetSlot"] = { + ["name"] = "Gamemaster's Slippers", + ["link"] = "|cffffffff|Hitem:11508:0:0:0|h[Gamemaster's Slippers]|h|r", + ["texture"] = "Interface\\Icons\\INV_Boots_Fabric_01TWOW", + }, + ["HeadSlot"] = { + ["name"] = "Gamemaster Hood", + ["link"] = "|cffffffff|Hitem:12064:0:0:0|h[Gamemaster Hood]|h|r", + ["texture"] = "Interface\\Icons\\INV_Helmet_29TWOW", + }, + }, + ["realm"] = "Local Turtle (1,17,2)", + ["account"] = "VATI", + }, + ["Murlock-Local Turtle (1,17,2)"] = { + ["classToken"] = "WARLOCK", + ["money"] = 308, + ["class"] = "Warlock", + ["realm"] = "Local Turtle (1,17,2)", + ["lastUpdate"] = 1775419564, + ["character"] = { + ["classToken"] = "WARLOCK", + ["lastSeen"] = 1775419554, + ["class"] = "Warlock", + ["race"] = "Undead", + ["name"] = "Murlock", + ["level"] = 60, + ["realm"] = "Local Turtle (1,17,2)", + }, + ["name"] = "Murlock", + ["bags"] = { + [1] = { + ["bagType"] = "regular", + ["numSlots"] = 16, + ["freeSlots"] = 16, + ["slots"] = { + }, + }, + [2] = { + ["bagType"] = "regular", + ["numSlots"] = 16, + ["freeSlots"] = 16, + ["slots"] = { + }, + }, + [3] = { + ["bagType"] = "regular", + ["numSlots"] = 16, + ["freeSlots"] = 13, + ["slots"] = { + [16] = { + ["type"] = "One-Handed Maces", + ["link"] = "|cff9d9d9d|Hitem:11411:0:0:0|h[Large Bear Bone]|h|r", + ["subclass"] = "INVTYPE_WEAPONMAINHAND", + ["class"] = "Weapon", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Bone_01", + ["name"] = "Large Bear Bone", + ["iLevel"] = 23, + ["quality"] = 0, + }, + [14] = { + ["type"] = "Junk", + ["link"] = "|cff9d9d9d|Hitem:11417:0:0:0|h[Feathery Wing]|h|r", + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 3, + ["texture"] = "Interface\\Icons\\INV_Misc_MonsterScales_01", + ["name"] = "Feathery Wing", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [15] = { + ["type"] = "Junk", + ["link"] = "|cff9d9d9d|Hitem:11408:0:0:0|h[Bear Jaw]|h|r", + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Bone_09", + ["name"] = "Bear Jaw", + ["iLevel"] = 0, + ["quality"] = -1, + }, + }, + }, + [4] = { + ["bagType"] = "soul", + ["numSlots"] = 28, + ["freeSlots"] = 8, + ["slots"] = { + [1] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [2] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [3] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [4] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [5] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [6] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [7] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [8] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [9] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [10] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [11] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [12] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [13] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [14] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [15] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [16] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [17] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [18] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [19] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [20] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:6265:0:0:0|h[Soul Shard]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Amethyst_02", + ["name"] = "Soul Shard", + ["iLevel"] = 0, + ["quality"] = -1, + }, + }, + }, + [0] = { + ["bagType"] = "regular", + ["numSlots"] = 16, + ["freeSlots"] = 7, + ["slots"] = { + [1] = { + ["type"] = "One-Handed Swords", + ["link"] = "|cffa335ee|Hitem:17103:0:0:0|h[Azuresong Mageblade]|h|r", + ["subclass"] = "INVTYPE_WEAPONMAINHAND", + ["class"] = "Weapon", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Sword_39", + ["name"] = "Azuresong Mageblade", + ["iLevel"] = 60, + ["quality"] = 4, + }, + [2] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:15420:0:0:0|h[Ironfeather]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["count"] = 3, + ["texture"] = "Interface\\Icons\\INV_Feather_05", + ["name"] = "Ironfeather", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [3] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + ["name"] = "Runecloth", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [4] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:20749:0:0:0|h[Brilliant Wizard Oil]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = -3, + ["texture"] = "Interface\\Icons\\INV_Potion_105", + ["name"] = "Brilliant Wizard Oil", + ["iLevel"] = 45, + ["quality"] = -1, + }, + [5] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:20749:0:0:0|h[Brilliant Wizard Oil]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = -5, + ["texture"] = "Interface\\Icons\\INV_Potion_105", + ["name"] = "Brilliant Wizard Oil", + ["iLevel"] = 45, + ["quality"] = -1, + }, + [6] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:12207:0:0:0|h[Giant Egg]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Egg_03", + ["name"] = "Giant Egg", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [7] = { + ["type"] = "Leatherworking", + ["link"] = "|cff1eff00|Hitem:15748:0:0:0|h[Pattern: Heavy Scorpid Leggings]|h|r", + ["subclass"] = "", + ["class"] = "Recipe", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Scroll_03", + ["name"] = "Pattern: Heavy Scorpid Leggings", + ["iLevel"] = 0, + ["quality"] = -1, + }, + [8] = { + ["type"] = "Bag", + ["link"] = "|cff1eff00|Hitem:4500:0:0:0|h[Traveler's Backpack]|h|r", + ["subclass"] = "INVTYPE_BAG", + ["class"] = "Container", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Bag_08", + ["name"] = "Traveler's Backpack", + ["iLevel"] = 0, + ["quality"] = 2, + }, + [9] = { + ["type"] = "Junk", + ["link"] = "|cffffffff|Hitem:22528:0:0:0|h[Dark Iron Scraps]|h|r", + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_ArmorKit_20", + ["name"] = "Dark Iron Scraps", + ["iLevel"] = 0, + ["quality"] = -1, + }, + }, + }, + [-2] = { + ["bagType"] = "regular", + ["numSlots"] = 12, + ["freeSlots"] = 12, + ["slots"] = { + }, + }, + }, + ["bank"] = { + }, + ["level"] = 60, + ["equipped"] = { + ["ChestSlot"] = { + ["name"] = "Gamemaster's Robe", + ["link"] = "|cffffffff|Hitem:2586:0:0:0|h[Gamemaster's Robe]|h|r", + ["texture"] = "Interface\\Icons\\INV_Chest_Cloth_23TWOW", + }, + ["FeetSlot"] = { + ["name"] = "Gamemaster's Slippers", + ["link"] = "|cffffffff|Hitem:11508:0:0:0|h[Gamemaster's Slippers]|h|r", + ["texture"] = "Interface\\Icons\\INV_Boots_Fabric_01TWOW", + }, + ["HeadSlot"] = { + ["name"] = "Gamemaster Hood", + ["link"] = "|cffffffff|Hitem:12064:0:0:0|h[Gamemaster Hood]|h|r", + ["texture"] = "Interface\\Icons\\INV_Helmet_29TWOW", + }, + }, + ["mailbox"] = { + }, + ["account"] = "VATI", + }, + ["Pally-Local Turtle (1,17,2)"] = { + ["classToken"] = "PALADIN", + ["money"] = 1100736, + ["class"] = "Paladin", + ["realm"] = "Local Turtle (1,17,2)", + ["account"] = "123", + ["lastUpdate"] = 1775470491, + ["bags"] = { + [1] = { + ["bagType"] = "regular", + ["slots"] = { + [1] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Alterac Manna Biscuit", + ["quality"] = -1, + ["iLevel"] = 51, + ["count"] = 19, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [2] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:8950:0:0:0|h[Homemade Cherry Pie]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Homemade Cherry Pie", + ["quality"] = -1, + ["iLevel"] = 45, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_10", + }, + [3] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:8952:0:0:0|h[Roasted Quail]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Roasted Quail", + ["quality"] = -1, + ["iLevel"] = 45, + ["count"] = 7, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_15", + }, + [4] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:8766:0:0:0|h[Morning Glory Dew]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Morning Glory Dew", + ["quality"] = -1, + ["iLevel"] = 45, + ["count"] = 3, + ["texture"] = "Interface\\Icons\\INV_Potion_01", + }, + [5] = { + ["type"] = "Junk", + ["link"] = "|cffa335ee|Hitem:18401:0:0:0|h[Foror's Compendium of Dragon Slaying]|h|r", + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["name"] = "Foror's Compendium of Dragon Slaying", + ["quality"] = -1, + ["iLevel"] = 60, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Book_11", + }, + [6] = { + ["type"] = "Junk", + ["link"] = "|cffa335ee|Hitem:19228:0:0:0|h[Beasts Deck]|h|r", + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["name"] = "Beasts Deck", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Ticket_Tarot_Stack_01", + }, + [7] = { + ["type"] = "Quest", + ["link"] = "|cff1eff00|Hitem:12844:0:0:0|h[Argent Dawn Valor Token]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Argent Dawn Valor Token", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_08", + }, + [8] = { + ["type"] = "Quest", + ["link"] = "|cffffffff|Hitem:13180:0:0:0|h[Stratholme Holy Water]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Stratholme Holy Water", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Potion_75", + }, + [9] = { + ["type"] = "Quest", + ["link"] = "|cff0070dd|Hitem:17191:0:0:0|h[Scepter of Celebras]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Scepter of Celebras", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Staff_16", + }, + [10] = { + ["type"] = "Quest", + ["link"] = "|cff1eff00|Hitem:9240:0:0:0|h[Mallet of Zul'Farrak]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Mallet of Zul'Farrak", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Hammer_19", + }, + [11] = { + ["type"] = "Quest", + ["link"] = "|cffffffff|Hitem:12938:0:0:0|h[Blood of Heroes]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Blood of Heroes", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Potion_33", + }, + [12] = { + ["type"] = "Quest", + ["link"] = "|cff0070dd|Hitem:20885:0:0:0|h[Qiraji Martial Drape]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Qiraji Martial Drape", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Qiraj_DrapeMartial", + }, + [13] = { + ["type"] = "Quest", + ["link"] = "|cffa335ee|Hitem:19723:0:0:0|h[Primal Hakkari Kossack]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Primal Hakkari Kossack", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Shirt_07", + }, + [14] = { + ["type"] = "Quest", + ["link"] = "|cffffffff|Hitem:2661:0:0:0|h[Neru Fragment]|h|r", + ["subclass"] = "", + ["class"] = "Quest", + ["name"] = "Neru Fragment", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Stone_12", + }, + [15] = { + ["type"] = "Reagent", + ["link"] = "|cffffffff|Hitem:21177:0:0:0|h[Symbol of Kings]|h|r", + ["subclass"] = "", + ["class"] = "Reagent", + ["name"] = "Symbol of Kings", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 78, + ["texture"] = "Interface\\Icons\\INV_Misc_SymbolofKings_01", + }, + [16] = { + ["type"] = "", + ["link"] = "|cff1eff00|Hitem:55251:0:0:0|h[Pure Moonstone]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["name"] = "Pure Moonstone", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 2, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Crystal_03", + }, + }, + ["numSlots"] = 16, + ["freeSlots"] = 0, + }, + [2] = { + ["bagType"] = "regular", + ["slots"] = { + [1] = { + ["type"] = "", + ["link"] = "|cff1eff00|Hitem:55250:0:0:0|h[Emberstone]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["name"] = "Emberstone", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Gem_Ruby_01", + }, + [2] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["name"] = "Runecloth", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [3] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["name"] = "Runecloth", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [4] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:14047:0:0:0|h[Runecloth]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["name"] = "Runecloth", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 7, + ["texture"] = "Interface\\Icons\\INV_Fabric_PurpleFire_01", + }, + [5] = { + ["type"] = "Trade Goods", + ["link"] = "|cffffffff|Hitem:12208:0:0:0|h[Tender Wolf Meat]|h|r", + ["subclass"] = "", + ["class"] = "Trade Goods", + ["name"] = "Tender Wolf Meat", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_14", + }, + [6] = { + ["type"] = "Tailoring", + ["link"] = "|cff1eff00|Hitem:14474:0:0:0|h[Pattern: Frostweave Gloves]|h|r", + ["subclass"] = "", + ["class"] = "Recipe", + ["name"] = "Pattern: Frostweave Gloves", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Scroll_06", + }, + [7] = { + ["type"] = "Leatherworking", + ["link"] = "|cff1eff00|Hitem:15748:0:0:0|h[Pattern: Heavy Scorpid Leggings]|h|r", + ["subclass"] = "", + ["class"] = "Recipe", + ["name"] = "Pattern: Heavy Scorpid Leggings", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Scroll_03", + }, + [8] = { + ["type"] = "Leatherworking", + ["link"] = "|cff1eff00|Hitem:15748:0:0:0|h[Pattern: Heavy Scorpid Leggings]|h|r", + ["subclass"] = "", + ["class"] = "Recipe", + ["name"] = "Pattern: Heavy Scorpid Leggings", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Scroll_03", + }, + [9] = { + ["type"] = "Alchemy", + ["link"] = "|cff1eff00|Hitem:13476:0:0:0|h[Recipe: Mighty Rage Potion]|h|r", + ["subclass"] = "", + ["class"] = "Recipe", + ["name"] = "Recipe: Mighty Rage Potion", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Scroll_06", + }, + [10] = { + ["type"] = "Bag", + ["link"] = "|cff1eff00|Hitem:4500:0:0:0|h[Traveler's Backpack]|h|r", + ["subclass"] = "INVTYPE_BAG", + ["class"] = "Container", + ["name"] = "Traveler's Backpack", + ["quality"] = 2, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Bag_08", + }, + [11] = { + ["type"] = "Junk", + ["link"] = "|cffffffff|Hitem:22528:0:0:0|h[Dark Iron Scraps]|h|r", + ["subclass"] = "", + ["class"] = "Miscellaneous", + ["name"] = "Dark Iron Scraps", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 16, + ["texture"] = "Interface\\Icons\\INV_Misc_ArmorKit_20", + }, + }, + ["numSlots"] = 16, + ["freeSlots"] = 5, + }, + [3] = { + ["bagType"] = "regular", + ["slots"] = { + }, + ["numSlots"] = 16, + ["freeSlots"] = 16, + }, + [4] = { + ["bagType"] = "regular", + ["slots"] = { + }, + ["numSlots"] = 16, + ["freeSlots"] = 16, + }, + [0] = { + ["bagType"] = "regular", + ["slots"] = { + [1] = { + ["type"] = "One-Handed Maces", + ["link"] = "|cffa335ee|Hitem:22988:0:0:0|h[The End of Dreams]|h|r", + ["subclass"] = "INVTYPE_WEAPON", + ["class"] = "Weapon", + ["name"] = "The End of Dreams", + ["quality"] = 4, + ["iLevel"] = 60, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Mace_1H_Stratholme_D_02", + }, + [2] = { + ["type"] = "Two-Handed Swords", + ["link"] = "|cff1eff00|Hitem:15252:0:705:0|h[Tusker Sword of the Tiger]|h|r", + ["subclass"] = "INVTYPE_2HWEAPON", + ["class"] = "Weapon", + ["name"] = "Tusker Sword", + ["quality"] = 2, + ["iLevel"] = 44, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Sword_45", + }, + [3] = { + ["type"] = "Cloth", + ["link"] = "|cffffffff|Hitem:12064:0:0:0|h[Gamemaster Hood]|h|r", + ["subclass"] = "INVTYPE_HEAD", + ["class"] = "Armor", + ["name"] = "Gamemaster Hood", + ["quality"] = 1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Helmet_29TWOW", + }, + [4] = { + ["type"] = "Miscellaneous", + ["link"] = "|cff0070dd|Hitem:16309:0:0:0|h[Drakefire Amulet]|h|r", + ["subclass"] = "INVTYPE_NECK", + ["class"] = "Armor", + ["name"] = "Drakefire Amulet", + ["quality"] = 3, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_11", + }, + [5] = { + ["type"] = "Mail", + ["link"] = "|cff1eff00|Hitem:10200:0:1620:0|h[Crusader's Pauldrons of Defense]|h|r", + ["subclass"] = "INVTYPE_SHOULDER", + ["class"] = "Armor", + ["name"] = "Crusader's Pauldrons", + ["quality"] = 2, + ["iLevel"] = 48, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Shoulder_28", + }, + [6] = { + ["type"] = "Cloth", + ["link"] = "|cffa335ee|Hitem:22938:0:0:0|h[Cryptfiend Silk Cloak]|h|r", + ["subclass"] = "INVTYPE_CLOAK", + ["class"] = "Armor", + ["name"] = "Cryptfiend Silk Cloak", + ["quality"] = 4, + ["iLevel"] = 60, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Cape_Naxxramas_02", + }, + [7] = { + ["type"] = "Plate", + ["link"] = "|cffa335ee|Hitem:21389:0:0:0|h[Avenger's Breastplate]|h|r", + ["subclass"] = "INVTYPE_CHEST", + ["class"] = "Armor", + ["name"] = "Avenger's Breastplate", + ["quality"] = 4, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Chest_Plate03", + }, + [8] = { + ["type"] = "Cloth", + ["link"] = "|cffffffff|Hitem:2586:0:0:0|h[Gamemaster's Robe]|h|r", + ["subclass"] = "INVTYPE_ROBE", + ["class"] = "Armor", + ["name"] = "Gamemaster's Robe", + ["quality"] = 1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Chest_Cloth_23TWOW", + }, + [9] = { + ["type"] = "Mail", + ["link"] = "|cff0070dd|Hitem:11679:0:0:0|h[Rubicund Armguards]|h|r", + ["subclass"] = "INVTYPE_WRIST", + ["class"] = "Armor", + ["name"] = "Rubicund Armguards", + ["quality"] = 3, + ["iLevel"] = 50, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Bracer_13", + }, + [10] = { + ["type"] = "Cloth", + ["link"] = "|cff1eff00|Hitem:10252:0:1063:0|h[Master's Leggings of the Whale]|h|r", + ["subclass"] = "INVTYPE_LEGS", + ["class"] = "Armor", + ["name"] = "Master's Leggings", + ["quality"] = 2, + ["iLevel"] = 59, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Pants_09", + }, + [11] = { + ["type"] = "Cloth", + ["link"] = "|cffffffff|Hitem:11508:0:0:0|h[Gamemaster's Slippers]|h|r", + ["subclass"] = "INVTYPE_FEET", + ["class"] = "Armor", + ["name"] = "Gamemaster's Slippers", + ["quality"] = 1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Boots_Fabric_01TWOW", + }, + [12] = { + ["type"] = "Miscellaneous", + ["link"] = "|cffa335ee|Hitem:21205:0:0:0|h[Signet Ring of the Bronze Dragonflight]|h|r", + ["subclass"] = "INVTYPE_FINGER", + ["class"] = "Armor", + ["name"] = "Signet Ring of the Bronze Dragonflight", + ["quality"] = 4, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_40", + }, + [13] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Alterac Manna Biscuit", + ["quality"] = -1, + ["iLevel"] = 51, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [14] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Alterac Manna Biscuit", + ["quality"] = -1, + ["iLevel"] = 51, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [15] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Alterac Manna Biscuit", + ["quality"] = -1, + ["iLevel"] = 51, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + [16] = { + ["type"] = "Consumable", + ["link"] = "|cffffffff|Hitem:19301:0:0:0|h[Alterac Manna Biscuit]|h|r", + ["subclass"] = "", + ["class"] = "Consumable", + ["name"] = "Alterac Manna Biscuit", + ["quality"] = -1, + ["iLevel"] = 51, + ["count"] = 20, + ["texture"] = "Interface\\Icons\\INV_Misc_Food_33", + }, + }, + ["numSlots"] = 16, + ["freeSlots"] = 0, + }, + [-2] = { + ["bagType"] = "regular", + ["slots"] = { + [1] = { + ["type"] = "Key", + ["link"] = "|cffffffff|Hitem:11078:0:0:0|h[Relic Coffer Key]|h|r", + ["subclass"] = "", + ["class"] = "Key", + ["name"] = "Relic Coffer Key", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 3, + ["texture"] = "Interface\\Icons\\INV_Misc_Key_03", + }, + [2] = { + ["type"] = "Key", + ["link"] = "|cffffffff|Hitem:11000:0:0:0|h[Shadowforge Key]|h|r", + ["subclass"] = "", + ["class"] = "Key", + ["name"] = "Shadowforge Key", + ["quality"] = -1, + ["iLevel"] = 0, + ["count"] = 1, + ["texture"] = "Interface\\Icons\\INV_Misc_Key_08", + }, + }, + ["numSlots"] = 12, + ["freeSlots"] = 10, + }, + }, + ["name"] = "Pally", + ["mailbox"] = { + }, + ["isShared"] = true, + ["level"] = 60, + ["equipped"] = { + ["Finger0Slot"] = { + ["name"] = "Angelista's Touch", + ["link"] = "|cffa335ee|Hitem:21695:0:0:0|h[Angelista's Touch]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_AhnQiraj_04", + }, + ["BackSlot"] = { + ["name"] = "Cryptfiend Silk Cloak", + ["link"] = "|cffa335ee|Hitem:22938:0:0:0|h[Cryptfiend Silk Cloak]|h|r", + ["texture"] = "Interface\\Icons\\INV_Misc_Cape_Naxxramas_02", + }, + ["Trinket0Slot"] = { + ["name"] = "Hand of Justice", + ["link"] = "|cff0070dd|Hitem:11815:0:0:0|h[Hand of Justice]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Talisman_01", + }, + ["FeetSlot"] = { + ["name"] = "Avenger's Greaves", + ["link"] = "|cffa335ee|Hitem:21388:0:0:0|h[Avenger's Greaves]|h|r", + ["texture"] = "Interface\\Icons\\INV_Boots_Chain_07", + }, + ["NeckSlot"] = { + ["name"] = "Gluth's Missing Collar", + ["link"] = "|cffa335ee|Hitem:22981:0:0:0|h[Gluth's Missing Collar]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Necklace_27Naxxramas", + }, + ["Finger1Slot"] = { + ["name"] = "Master Dragonslayer's Ring", + ["link"] = "|cffa335ee|Hitem:19384:0:0:0|h[Master Dragonslayer's Ring]|h|r", + ["texture"] = "Interface\\Icons\\INV_Jewelry_Ring_41", + }, + ["ChestSlot"] = { + ["name"] = "Avenger's Breastplate", + ["link"] = "|cffa335ee|Hitem:21389:0:0:0|h[Avenger's Breastplate]|h|r", + ["texture"] = "Interface\\Icons\\INV_Chest_Plate03", + }, + ["Trinket1Slot"] = { + ["name"] = "Styleen's Impeding Scarab", + ["link"] = "|cffa335ee|Hitem:19431:0:0:0|h[Styleen's Impeding Scarab]|h|r", + ["texture"] = "Interface\\Icons\\INV_Misc_ArmorKit_10", + }, + ["ShoulderSlot"] = { + ["name"] = "Avenger's Pauldrons", + ["link"] = "|cffa335ee|Hitem:21391:0:0:0|h[Avenger's Pauldrons]|h|r", + ["texture"] = "Interface\\Icons\\INV_Shoulder_35", + }, + ["MainHandSlot"] = { + ["name"] = "Thunderfury, Blessed Blade of the Windseeker", + ["link"] = "|cffff8000|Hitem:19019:0:0:0|h[Thunderfury, Blessed Blade of the Windseeker]|h|r", + ["texture"] = "Interface\\Icons\\INV_Sword_39", + }, + ["SecondaryHandSlot"] = { + ["name"] = "The Face of Death", + ["link"] = "|cffa335ee|Hitem:23043:0:0:0|h[The Face of Death]|h|r", + ["texture"] = "Interface\\Icons\\INV_Shield_26", + }, + ["LegsSlot"] = { + ["name"] = "Avenger's Legguards", + ["link"] = "|cffa335ee|Hitem:21390:0:0:0|h[Avenger's Legguards]|h|r", + ["texture"] = "Interface\\Icons\\INV_Pants_Plate_02", + }, + ["RangedSlot"] = { + ["name"] = "Libram of Fervor", + ["link"] = "|cff0070dd|Hitem:23203:0:0:0|h[Libram of Fervor]|h|r", + ["texture"] = "Interface\\Icons\\INV_Relics_LibramofTruth", + }, + ["HeadSlot"] = { + ["name"] = "Avenger's Crown", + ["link"] = "|cffa335ee|Hitem:21387:0:0:0|h[Avenger's Crown]|h|r", + ["texture"] = "Interface\\Icons\\INV_Helmet_72", + }, + ["WristSlot"] = { + ["name"] = "Wristguards of True Flight", + ["link"] = "|cffa335ee|Hitem:18812:0:0:0|h[Wristguards of True Flight]|h|r", + ["texture"] = "Interface\\Icons\\INV_Bracer_02", + }, + ["WaistSlot"] = { + ["name"] = "Royal Qiraji Belt", + ["link"] = "|cffa335ee|Hitem:21598:0:0:0|h[Royal Qiraji Belt]|h|r", + ["texture"] = "Interface\\Icons\\INV_Belt_31", + }, + ["HandsSlot"] = { + ["name"] = "Gauntlets of Steadfast Determination", + ["link"] = "|cffa335ee|Hitem:21674:0:0:0|h[Gauntlets of Steadfast Determination]|h|r", + ["texture"] = "Interface\\Icons\\INV_Gauntlets_31", + }, + }, + ["bank"] = { + }, + ["account"] = "VATI", + }, + } diff --git a/UI/BagFrame.lua b/UI/BagFrame.lua index d2730f3..bd04452 100644 --- a/UI/BagFrame.lua +++ b/UI/BagFrame.lua @@ -2250,73 +2250,68 @@ function Guda_MoneyTooltip_Show(anchor) local allChars = addon.Modules.DB:GetAllCharacters(false, false) -- all realms local totalMoney = 0 - -- Group non-blacklisted characters by realm - local realms = {} - local realmOrder = {} + -- Group non-blacklisted characters by account, then by realm + local accounts = {} -- account -> { realms = { realm -> { chars, money } }, money, order } + local accountOrder = {} + local myAccountLabel = "Current Account" + for _, char in ipairs(allChars) do if not addon.Modules.DB:IsGoldBlacklisted(char.fullName) then - local realm = char.realm or "Unknown" - if not realms[realm] then - realms[realm] = { chars = {}, money = 0 } - table.insert(realmOrder, realm) + local acctKey = char.isShared and (char.account or "Other") or myAccountLabel + if not accounts[acctKey] then + accounts[acctKey] = { realms = {}, realmOrder = {}, money = 0 } + table.insert(accountOrder, acctKey) end - table.insert(realms[realm].chars, char) - realms[realm].money = realms[realm].money + (char.money or 0) + local acct = accounts[acctKey] + local realm = char.realm or "Unknown" + if not acct.realms[realm] then + acct.realms[realm] = { chars = {}, money = 0 } + table.insert(acct.realmOrder, realm) + end + table.insert(acct.realms[realm].chars, char) + acct.realms[realm].money = acct.realms[realm].money + (char.money or 0) + acct.money = acct.money + (char.money or 0) totalMoney = totalMoney + (char.money or 0) end end - table.sort(realmOrder) + + -- Sort: own account first, then others alphabetically + table.sort(accountOrder, function(a, b) + if a == myAccountLabel then return true end + if b == myAccountLabel then return false end + return a < b + end) + for _, acct in pairs(accounts) do + table.sort(acct.realmOrder) + end -- Update header money moneyTooltip.header:SetText("Total gold") MoneyFrame_Update("Guda_MoneyTooltip_Total", totalMoney) FormatMoneyFrameWithCommas("Guda_MoneyTooltip_Total") - -- Layout rows: realm headers + character rows + -- Layout rows local rowHeight = 18 local padding = 10 local yOffset = -10 - 20 - 14 -- top padding + header height + gap local rowIndex = 0 + local hasMultipleAccounts = table.getn(accountOrder) > 1 - for _, realm in ipairs(realmOrder) do - local realmData = realms[realm] + for _, acctKey in ipairs(accountOrder) do + local acctData = accounts[acctKey] - -- Realm header row - rowIndex = rowIndex + 1 - local row = GetOrCreateMoneyRow(rowIndex) - row.label:SetTextColor(1, 0.82, 0) -- gold color for realm header - row.label:SetText(realm) - row.label:ClearAllPoints() - row.label:SetPoint("TOPLEFT", moneyTooltip, "TOPLEFT", padding, yOffset) - row.label:Show() - - local frameName = "Guda_MoneyTooltip_Row" .. rowIndex - MoneyFrame_Update(frameName, realmData.money) - FormatMoneyFrameWithCommas(frameName) - row.money:ClearAllPoints() - row.money:SetPoint("TOPRIGHT", moneyTooltip, "TOPRIGHT", -padding, yOffset) - row.money:Show() - - yOffset = yOffset - rowHeight - - -- Character rows (indented) - for _, char in ipairs(realmData.chars) do + -- Account header (only show if multiple accounts exist) + if hasMultipleAccounts then rowIndex = rowIndex + 1 - row = GetOrCreateMoneyRow(rowIndex) - - local classToken = char.classToken - local classColor = classToken and (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[classToken] - local r, g, b = 0.7, 0.7, 0.7 - if classColor then r, g, b = classColor.r, classColor.g, classColor.b end - - row.label:SetTextColor(r, g, b) - row.label:SetText(" " .. char.name) + local row = GetOrCreateMoneyRow(rowIndex) + row.label:SetTextColor(0.5, 0.8, 1) -- light blue for account header + row.label:SetText(acctKey) row.label:ClearAllPoints() row.label:SetPoint("TOPLEFT", moneyTooltip, "TOPLEFT", padding, yOffset) row.label:Show() - frameName = "Guda_MoneyTooltip_Row" .. rowIndex - MoneyFrame_Update(frameName, char.money or 0) + local frameName = "Guda_MoneyTooltip_Row" .. rowIndex + MoneyFrame_Update(frameName, acctData.money) FormatMoneyFrameWithCommas(frameName) row.money:ClearAllPoints() row.money:SetPoint("TOPRIGHT", moneyTooltip, "TOPRIGHT", -padding, yOffset) @@ -2324,6 +2319,56 @@ function Guda_MoneyTooltip_Show(anchor) yOffset = yOffset - rowHeight end + + local indent = hasMultipleAccounts and " " or "" + + for _, realm in ipairs(acctData.realmOrder) do + local realmData = acctData.realms[realm] + + -- Realm header row + rowIndex = rowIndex + 1 + local row = GetOrCreateMoneyRow(rowIndex) + row.label:SetTextColor(1, 0.82, 0) -- gold color for realm header + row.label:SetText(indent .. realm) + row.label:ClearAllPoints() + row.label:SetPoint("TOPLEFT", moneyTooltip, "TOPLEFT", padding, yOffset) + row.label:Show() + + local frameName = "Guda_MoneyTooltip_Row" .. rowIndex + MoneyFrame_Update(frameName, realmData.money) + FormatMoneyFrameWithCommas(frameName) + row.money:ClearAllPoints() + row.money:SetPoint("TOPRIGHT", moneyTooltip, "TOPRIGHT", -padding, yOffset) + row.money:Show() + + yOffset = yOffset - rowHeight + + -- Character rows + for _, char in ipairs(realmData.chars) do + rowIndex = rowIndex + 1 + row = GetOrCreateMoneyRow(rowIndex) + + local classToken = char.classToken + local classColor = classToken and (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[classToken] + local r, g, b = 0.7, 0.7, 0.7 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end + + row.label:SetTextColor(r, g, b) + row.label:SetText(indent .. " " .. char.name) + row.label:ClearAllPoints() + row.label:SetPoint("TOPLEFT", moneyTooltip, "TOPLEFT", padding, yOffset) + row.label:Show() + + frameName = "Guda_MoneyTooltip_Row" .. rowIndex + MoneyFrame_Update(frameName, char.money or 0) + FormatMoneyFrameWithCommas(frameName) + row.money:ClearAllPoints() + row.money:SetPoint("TOPRIGHT", moneyTooltip, "TOPRIGHT", -padding, yOffset) + row.money:Show() + + yOffset = yOffset - rowHeight + end + end end -- Hide unused rows @@ -2374,39 +2419,107 @@ function Guda_MoneyTooltip_Hide() end end --- Gold tracking dropdown menu (grouped by realm) +-- Gold tracking dropdown menu (grouped by account > realm > characters) local function Guda_GoldTrackingMenu_Initialize() local characters = addon.Modules.DB:GetAllCharacters(false, false) -- all realms + local myAccountLabel = "Current Account" - -- Group characters by realm - local realms = {} - local realmOrder = {} + -- Group by account, then realm + local accounts = {} + local accountOrder = {} for _, char in ipairs(characters) do - local realm = char.realm or "Unknown" - if not realms[realm] then - realms[realm] = {} - table.insert(realmOrder, realm) + local acctKey = char.isShared and (char.account or "Other") or myAccountLabel + if not accounts[acctKey] then + accounts[acctKey] = { realms = {}, realmOrder = {} } + table.insert(accountOrder, acctKey) end - table.insert(realms[realm], char) + local acct = accounts[acctKey] + local realm = char.realm or "Unknown" + if not acct.realms[realm] then + acct.realms[realm] = {} + table.insert(acct.realmOrder, realm) + end + table.insert(acct.realms[realm], char) end - -- Sort realm names - table.sort(realmOrder) + table.sort(accountOrder, function(a, b) + if a == myAccountLabel then return true end + if b == myAccountLabel then return false end + return a < b + end) + for _, acct in pairs(accounts) do + table.sort(acct.realmOrder) + end local level = UIDROPDOWNMENU_MENU_LEVEL or 1 if level == 1 then - for _, realm in ipairs(realmOrder) do - local info = {} - info.text = realm - info.notCheckable = 1 - info.hasArrow = 1 - info.value = realm - UIDropDownMenu_AddButton(info, 1) + -- Level 1: account names (or realm names if single account) + if table.getn(accountOrder) == 1 then + local acct = accounts[accountOrder[1]] + for _, realm in ipairs(acct.realmOrder) do + local info = {} + info.text = realm + info.notCheckable = 1 + info.hasArrow = 1 + info.value = accountOrder[1] .. "|" .. realm + UIDropDownMenu_AddButton(info, 1) + end + else + for _, acctKey in ipairs(accountOrder) do + local info = {} + info.text = acctKey + info.notCheckable = 1 + info.hasArrow = 1 + info.value = acctKey + UIDropDownMenu_AddButton(info, 1) + end end elseif level == 2 then - local realm = UIDROPDOWNMENU_MENU_VALUE - local chars = realms[realm] + local parentValue = UIDROPDOWNMENU_MENU_VALUE + if table.getn(accountOrder) == 1 then + local _, _, acctKey, realm = string.find(parentValue, "^(.+)|(.+)$") + local acct = accounts[acctKey] + local chars = acct and acct.realms[realm] + if chars then + for _, char in ipairs(chars) do + local charFullName = char.fullName + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end + + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) + info.checked = not addon.Modules.DB:IsGoldBlacklisted(charFullName) + info.keepShownOnClick = 1 + info.func = function() + addon.Modules.DB:ToggleGoldBlacklist(charFullName) + if moneyTooltip and moneyTooltip:IsShown() and moneyTooltip.anchor then + Guda_MoneyTooltip_Show(moneyTooltip.anchor) + end + end + UIDropDownMenu_AddButton(info, 2) + end + end + else + local acct = accounts[parentValue] + if acct then + for _, realm in ipairs(acct.realmOrder) do + local info = {} + info.text = realm + info.notCheckable = 1 + info.hasArrow = 1 + info.value = parentValue .. "|" .. realm + UIDropDownMenu_AddButton(info, 2) + end + end + end + Guda_ScaleDropdownFonts(12) + elseif level == 3 then + local parentValue = UIDROPDOWNMENU_MENU_VALUE + local _, _, acctKey, realm = string.find(parentValue, "^(.+)|(.+)$") + local acct = accounts[acctKey] + local chars = acct and acct.realms[realm] if chars then for _, char in ipairs(chars) do local charFullName = char.fullName @@ -2424,9 +2537,10 @@ local function Guda_GoldTrackingMenu_Initialize() Guda_MoneyTooltip_Show(moneyTooltip.anchor) end end - UIDropDownMenu_AddButton(info, 2) + UIDropDownMenu_AddButton(info, 3) end end + Guda_ScaleDropdownFonts(12) end end @@ -2437,7 +2551,7 @@ function Guda_ShowGoldTrackingMenu(anchor) end UIDropDownMenu_Initialize(menuFrame, Guda_GoldTrackingMenu_Initialize, "MENU") ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0) - Guda_ScaleDropdownFonts(14) + Guda_ScaleDropdownFonts(12) end -- Money tooltip handler (BagFrame entry point) @@ -2445,32 +2559,45 @@ function Guda_BagFrame_MoneyOnEnter(self) Guda_MoneyTooltip_Show(self) end +-- Helper: split characters into own and shared, filtered by blacklist +local function GetSplitCharacters(currentRealmOnly) + local characters = addon.Modules.DB:GetAllCharacters(false, currentRealmOnly) + local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName() + local own, shared = {}, {} + for _, char in ipairs(characters) do + if not addon.Modules.DB:IsGoldBlacklisted(char.fullName) or char.fullName == currentPlayerFullName then + if char.isShared then + table.insert(shared, char) + else + table.insert(own, char) + end + end + end + return own, shared, currentPlayerFullName +end + +-- Helper: add account separator header to dropdown +local function AddAccountSeparator(label) + local info = {} + info.text = label + info.isTitle = 1 + info.notCheckable = 1 + UIDropDownMenu_AddButton(info) +end + -- Dropdown management local function Guda_BagCharacterMenu_Initialize() - local characters = addon.Modules.DB:GetAllCharacters(false, true) - local info - local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName() + local own, shared, currentPlayerFullName = GetSplitCharacters(true) local currentViewChar = addon.Modules.BagFrame:GetCurrentViewChar() - for i, char in ipairs(characters) do - if addon.Modules.DB:IsGoldBlacklisted(char.fullName) and char.fullName ~= currentPlayerFullName then - -- skip blacklisted characters (never hide current player) - else + for _, char in ipairs(own) do local charFullName = char.fullName - local charClassToken = char.classToken - - -- Get class color - local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] local r, g, b = 1, 1, 1 - if classColor then - r, g, b = classColor.r, classColor.g, classColor.b - end + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end - -- Create colored name - local coloredName = addon.Modules.Utils:ColorText(char.name, r, g, b) - - info = {} - info.text = coloredName + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) info.func = function() if charFullName == currentPlayerFullName then addon.Modules.BagFrame:ShowCurrentCharacter() @@ -2480,7 +2607,24 @@ local function Guda_BagCharacterMenu_Initialize() end info.checked = (currentViewChar == charFullName or (not currentViewChar and charFullName == currentPlayerFullName)) UIDropDownMenu_AddButton(info) - end -- else + end + + if table.getn(shared) > 0 then + AddAccountSeparator("Other Accounts") + for _, char in ipairs(shared) do + local charFullName = char.fullName + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end + + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) + info.func = function() + addon.Modules.BagFrame:ShowCharacter(charFullName) + end + info.checked = (currentViewChar == charFullName) + UIDropDownMenu_AddButton(info) + end end end @@ -2492,44 +2636,51 @@ function Guda_BagFrame_ToggleCharacterDropdown(button) end UIDropDownMenu_Initialize(menuFrame, Guda_BagCharacterMenu_Initialize, "MENU") ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0) - Guda_ScaleDropdownFonts(14) + Guda_ScaleDropdownFonts(12) end -- Mailbox character dropdown local function Guda_BagMailboxMenu_Initialize() - local characters = addon.Modules.DB:GetAllCharacters(false, true) - local info - local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName() + local own, shared, currentPlayerFullName = GetSplitCharacters(true) + local mailboxViewChar = addon.Modules.MailboxFrame and addon.Modules.MailboxFrame.GetCurrentViewChar and addon.Modules.MailboxFrame:GetCurrentViewChar() - for i, char in ipairs(characters) do - if addon.Modules.DB:IsGoldBlacklisted(char.fullName) and char.fullName ~= currentPlayerFullName then - -- skip blacklisted characters (never hide current player) - else + for _, char in ipairs(own) do local charFullName = char.fullName - local charClassToken = char.classToken - - -- Get class color - local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] local r, g, b = 1, 1, 1 - if classColor then - r, g, b = classColor.r, classColor.g, classColor.b - end + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end - -- Create colored name - local coloredName = addon.Modules.Utils:ColorText(char.name, r, g, b) - - info = {} - info.text = coloredName + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) info.func = function() addon.Modules.MailboxFrame:ShowCharacter(charFullName) if not Guda_MailboxFrame:IsShown() then Guda_MailboxFrame:Show() end end - local mailboxViewChar = addon.Modules.MailboxFrame:GetCurrentViewChar() info.checked = (mailboxViewChar == charFullName or (not mailboxViewChar and charFullName == currentPlayerFullName)) UIDropDownMenu_AddButton(info) - end -- else + end + + if table.getn(shared) > 0 then + AddAccountSeparator("Other Accounts") + for _, char in ipairs(shared) do + local charFullName = char.fullName + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end + + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) + info.func = function() + addon.Modules.MailboxFrame:ShowCharacter(charFullName) + if not Guda_MailboxFrame:IsShown() then + Guda_MailboxFrame:Show() + end + end + info.checked = (mailboxViewChar == charFullName) + UIDropDownMenu_AddButton(info) + end end end @@ -2541,42 +2692,47 @@ function Guda_BagFrame_ToggleMailDropdown(button) end UIDropDownMenu_Initialize(menuFrame, Guda_BagMailboxMenu_Initialize, "MENU") ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0) - Guda_ScaleDropdownFonts(14) + Guda_ScaleDropdownFonts(12) end -- Bank character dropdown local function Guda_BagBankMenu_Initialize() - local characters = addon.Modules.DB:GetAllCharacters(false, true) - local info - local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName() + local own, shared, currentPlayerFullName = GetSplitCharacters(true) + local bankViewChar = addon.Modules.BankFrame:GetCurrentViewChar() - for i, char in ipairs(characters) do - if addon.Modules.DB:IsGoldBlacklisted(char.fullName) and char.fullName ~= currentPlayerFullName then - -- skip blacklisted characters (never hide current player) - else + for _, char in ipairs(own) do local charFullName = char.fullName - local charClassToken = char.classToken - - -- Get class color - local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] - local r, g, b = 1, 1, 1 - if classColor then - r, g, b = classColor.r, classColor.g, classColor.b - end - - -- Create colored name local charName = char.name - local coloredName = addon.Modules.Utils:ColorText(charName, r, g, b) + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end - info = {} - info.text = coloredName + local info = {} + info.text = addon.Modules.Utils:ColorText(charName, r, g, b) info.func = function() Guda_BagFrame_ShowCharacterBank(charFullName, charName) end - local bankViewChar = addon.Modules.BankFrame:GetCurrentViewChar() info.checked = (bankViewChar == charFullName or (not bankViewChar and charFullName == currentPlayerFullName)) UIDropDownMenu_AddButton(info) - end -- else + end + + if table.getn(shared) > 0 then + AddAccountSeparator("Other Accounts") + for _, char in ipairs(shared) do + local charFullName = char.fullName + local charName = char.name + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end + + local info = {} + info.text = addon.Modules.Utils:ColorText(charName, r, g, b) + info.func = function() + Guda_BagFrame_ShowCharacterBank(charFullName, charName) + end + info.checked = (bankViewChar == charFullName) + UIDropDownMenu_AddButton(info) + end end end @@ -2588,7 +2744,7 @@ function Guda_BagFrame_ToggleBankDropdown(button) end UIDropDownMenu_Initialize(menuFrame, Guda_BagBankMenu_Initialize, "MENU") ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0) - Guda_ScaleDropdownFonts(14) + Guda_ScaleDropdownFonts(12) end -- Show character's bank diff --git a/UI/BankFrame.lua b/UI/BankFrame.lua index 2f595c0..276c216 100644 --- a/UI/BankFrame.lua +++ b/UI/BankFrame.lua @@ -2794,30 +2794,31 @@ end -- Bank character dropdown (similar to BagFrame's bank dropdown) local function Guda_BankCharacterMenu_Initialize() - local characters = addon.Modules.DB:GetAllCharacters(false, true) - local info - local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName() + local DB = addon.Modules.DB + local currentPlayerFullName = DB:GetPlayerFullName() local currentViewChar = addon.Modules.BankFrame:GetCurrentViewChar() + local characters = DB:GetAllCharacters(false, true) - for i, char in ipairs(characters) do - if addon.Modules.DB:IsGoldBlacklisted(char.fullName) and char.fullName ~= currentPlayerFullName then - -- skip blacklisted characters (never hide current player) - else - local charFullName = char.fullName - local charClassToken = char.classToken - - -- Get class color - local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] - local r, g, b = 1, 1, 1 - if classColor then - r, g, b = classColor.r, classColor.g, classColor.b + -- Split into own and shared + local own, shared = {}, {} + for _, char in ipairs(characters) do + if not DB:IsGoldBlacklisted(char.fullName) or char.fullName == currentPlayerFullName then + if char.isShared then + table.insert(shared, char) + else + table.insert(own, char) + end end + end - -- Create colored name - local coloredName = addon.Modules.Utils:ColorText(char.name, r, g, b) + for _, char in ipairs(own) do + local charFullName = char.fullName + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end - info = {} - info.text = coloredName + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) info.func = function() if charFullName == currentPlayerFullName then addon.Modules.BankFrame:ShowCurrentCharacter() @@ -2827,7 +2828,29 @@ local function Guda_BankCharacterMenu_Initialize() end info.checked = (currentViewChar == charFullName or (not currentViewChar and charFullName == currentPlayerFullName)) UIDropDownMenu_AddButton(info) - end -- else + end + + if table.getn(shared) > 0 then + local sep = {} + sep.text = "Other Accounts" + sep.isTitle = 1 + sep.notCheckable = 1 + UIDropDownMenu_AddButton(sep) + + for _, char in ipairs(shared) do + local charFullName = char.fullName + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end + + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) + info.func = function() + addon.Modules.BankFrame:ShowCharacter(charFullName) + end + info.checked = (currentViewChar == charFullName) + UIDropDownMenu_AddButton(info) + end end end diff --git a/UI/FrameHelpers.lua b/UI/FrameHelpers.lua index 60e3c2f..80e363d 100644 --- a/UI/FrameHelpers.lua +++ b/UI/FrameHelpers.lua @@ -260,12 +260,12 @@ end -- Increase font size on Blizzard UIDropDownMenu buttons after ToggleDropDownMenu function Guda_ScaleDropdownFonts(size) - local list = getglobal("DropDownList1") - if not list then return end - for i = 1, 20 do - local btn = getglobal("DropDownList1Button" .. i) - if btn then - local ntxt = getglobal("DropDownList1Button" .. i .. "NormalText") + for level = 1, 3 do + local listName = "DropDownList" .. level + local list = getglobal(listName) + if not list then break end + for i = 1, 20 do + local ntxt = getglobal(listName .. "Button" .. i .. "NormalText") if ntxt then local f, _, fl = ntxt:GetFont() if f then ntxt:SetFont(f, size, fl) end diff --git a/UI/ItemButton.lua b/UI/ItemButton.lua index ef4baf7..63a7a20 100644 --- a/UI/ItemButton.lua +++ b/UI/ItemButton.lua @@ -2321,7 +2321,11 @@ function Guda_ItemButton_OnEnter(self) elseif self.otherChar or self.isReadOnly then GameTooltip.GudaViewedCharacter = self.otherChar if self.itemData and self.itemData.link then - GameTooltip:SetHyperlink(self.itemData.link) + local ok = pcall(GameTooltip.SetHyperlink, GameTooltip, self.itemData.link) + if not ok then + GameTooltip:Hide() + return + end else GameTooltip:Hide() return diff --git a/UI/MailboxFrame.lua b/UI/MailboxFrame.lua index 95d2b81..d443027 100644 --- a/UI/MailboxFrame.lua +++ b/UI/MailboxFrame.lua @@ -355,33 +355,55 @@ end -- Show character selection menu local function Guda_MailboxCharacterMenu_Initialize() - local characters = addon.Modules.DB:GetAllCharacters(true, true) - local info - local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName() + local DB = addon.Modules.DB + local currentPlayerFullName = DB:GetPlayerFullName() + local characters = DB:GetAllCharacters(true, true) - for i, char in ipairs(characters) do - if addon.Modules.DB:IsGoldBlacklisted(char.fullName) and char.fullName ~= currentPlayerFullName then - -- skip blacklisted characters (never hide current player) - else - local charFullName = char.fullName - local charClassToken = char.classToken - - -- Get class color - local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] - local r, g, b = 1, 1, 1 - if classColor then - r, g, b = classColor.r, classColor.g, classColor.b + local own, shared = {}, {} + for _, char in ipairs(characters) do + if not DB:IsGoldBlacklisted(char.fullName) or char.fullName == currentPlayerFullName then + if char.isShared then + table.insert(shared, char) + else + table.insert(own, char) + end end + end - -- Create colored name - local coloredName = addon.Modules.Utils:ColorText(char.name, r, g, b) + for _, char in ipairs(own) do + local charFullName = char.fullName + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end - info = {} - info.text = coloredName + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) info.func = function() MailboxFrame:ShowCharacter(charFullName) end - info.checked = (currentViewChar == char.fullName or (not currentViewChar and char.fullName == currentPlayerFullName)) + local currentViewChar = MailboxFrame:GetCurrentViewChar and MailboxFrame:GetCurrentViewChar() + info.checked = (currentViewChar == charFullName or (not currentViewChar and charFullName == currentPlayerFullName)) UIDropDownMenu_AddButton(info) - end -- else + end + + if table.getn(shared) > 0 then + local sep = {} + sep.text = "Other Accounts" + sep.isTitle = 1 + sep.notCheckable = 1 + UIDropDownMenu_AddButton(sep) + + for _, char in ipairs(shared) do + local charFullName = char.fullName + local classColor = char.classToken and RAID_CLASS_COLORS[char.classToken] + local r, g, b = 1, 1, 1 + if classColor then r, g, b = classColor.r, classColor.g, classColor.b end + + local info = {} + info.text = addon.Modules.Utils:ColorText(char.name, r, g, b) + info.func = function() MailboxFrame:ShowCharacter(charFullName) end + local currentViewChar = MailboxFrame:GetCurrentViewChar and MailboxFrame:GetCurrentViewChar() + info.checked = (currentViewChar == charFullName) + UIDropDownMenu_AddButton(info) + end end end