From 5c96064fa811735a0a4d16baf366d97dab304111 Mon Sep 17 00:00:00 2001 From: soltanikian Date: Tue, 9 Dec 2025 21:14:46 +0100 Subject: [PATCH 1/5] added personal and realm bank implementations --- TradeSkillMaster_Crafting/Locale/enUS.lua | 3 + .../Modules/Inventory.lua | 738 ++++++++++-------- TradeSkillMaster_ItemTracker/Locale/enUS.lua | 4 + TradeSkillMaster_ItemTracker/Modules/data.lua | 111 ++- .../TradeSkillMaster_ItemTracker.lua | 87 ++- 5 files changed, 585 insertions(+), 358 deletions(-) diff --git a/TradeSkillMaster_Crafting/Locale/enUS.lua b/TradeSkillMaster_Crafting/Locale/enUS.lua index 5f6ebef..b28c53c 100644 --- a/TradeSkillMaster_Crafting/Locale/enUS.lua +++ b/TradeSkillMaster_Crafting/Locale/enUS.lua @@ -168,6 +168,9 @@ L["Total"] = true L["Vendor"] = true L["Visit Bank"] = true L["Visit Guild Bank"] = true +L["Visit Personal Bank"] = true +L["Visit Realm Bank"] = true +L["Realm Bank"] = true L["Visit Vendor"] = true L["Warning: The min restock quantity must be lower than the max restock quantity."] = true L["When you click on the \"Restock Queue\" button enough of each craft will be queued so that you have this maximum number on hand. For example, if you have 2 of item X on hand and you set this to 4, 2 more will be added to the craft queue."] = true diff --git a/TradeSkillMaster_Crafting/Modules/Inventory.lua b/TradeSkillMaster_Crafting/Modules/Inventory.lua index 4fbce8b..b66adad 100644 --- a/TradeSkillMaster_Crafting/Modules/Inventory.lua +++ b/TradeSkillMaster_Crafting/Modules/Inventory.lua @@ -1,340 +1,400 @@ - -- ------------------------------------------------------------------------------ -- - -- TradeSkillMaster_Crafting -- - -- http://www.curse.com/addons/wow/tradeskillmaster_crafting -- - -- -- - -- A TradeSkillMaster Addon (http://tradeskillmaster.com) -- - -- All Rights Reserved* - Detailed license information included with addon. -- - -- ------------------------------------------------------------------------------ -- - - -- load the parent file (TSM) into a local variable and register this file as a module - local TSM = select(2, ...) - local Inventory = TSM:NewModule("Inventory", "AceEvent-3.0") - local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Crafting") -- loads the localization table - - - -- gets the number of an item in the current player's bags - function Inventory:GetPlayerBagNum(itemString) - if not itemString then return end - - if TSMAPI.SOULBOUND_MATS[itemString] then - return GetItemCount(itemString) - else - local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", UnitName("player")) or {} - return bags and bags[itemString] or 0 - end - end - - function Inventory:GetTotals() - local bagTotal, auctionTotal, otherTotal, total = {}, {}, {}, {} - - for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do - if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then - local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} - local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} - local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} - local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {} - for itemString, quantity in pairs(bags) do - if player == UnitName("player") then - bagTotal[itemString] = (bagTotal[itemString] or 0) + quantity - total[itemString] = (total[itemString] or 0) + quantity - else - otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity - total[itemString] = (total[itemString] or 0) + quantity - end - end - for itemString, quantity in pairs(bank) do - otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity - total[itemString] = (total[itemString] or 0) + quantity - end - for itemString, quantity in pairs(mail) do - otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity - total[itemString] = (total[itemString] or 0) + quantity - end - for itemString, quantity in pairs(auctions) do - auctionTotal[itemString] = (auctionTotal[itemString] or 0) + quantity - total[itemString] = (total[itemString] or 0) + quantity - end - end - end - - for itemString in pairs(TSMAPI.SOULBOUND_MATS) do - local bagNum = GetItemCount(itemString) - local bankNum = GetItemCount(itemString, true) - GetItemCount(itemString) - bagTotal[itemString] = (bagTotal[itemString] or 0) + bagNum - otherTotal[itemString] = (otherTotal[itemString] or 0) + bankNum - total[itemString] = (total[itemString] or 0) + bagNum + bankNum - end - - -- add gbank counts of all non-ignored guilds - for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do - if not TSM.db.global.ignoreGuilds[guild] then - local gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} - for itemString, quantity in pairs(gbank) do - otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity - total[itemString] = (total[itemString] or 0) + quantity - end - end - end - return bagTotal, auctionTotal, otherTotal, total - end - - -- gets the total number of some item that they have - function Inventory:GetTotalQuantity(itemString) - if not itemString then return 0 end - local count = 0 - - -- add bags/bank/mail/auction counts of all non-ignored characters (always including current character) - for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do - if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then - local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} - local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} - local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} - local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {} - count = count + (bags[itemString] or 0) - count = count + (bank[itemString] or 0) - count = count + (mail[itemString] or 0) - count = count + (auctions[itemString] or 0) - end - end - -- add gbank counts of all non-ignored guilds - for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do - if not TSM.db.global.ignoreGuilds[guild] then - local bank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} - count = count + (bank[itemString] or 0) - end - end - - if TSMAPI.SOULBOUND_MATS[itemString] then - count = count + GetItemCount(itemString, true) - end - - return count - end - - function Inventory:GetItemSources(crafter, neededMats) - if not neededMats then return end - local sources = {} - local gbank = {} - local next = next - local crafterBags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", crafter) or {} - local crafterMail = TSMAPI:ModuleAPI("ItemTracker", "playermail", crafter) or {} - local crafterBank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", crafter) or {} - - -- add vendor items - local task = {} - local items = {} - for itemString, quantity in pairs(neededMats) do - if TSMAPI:GetVendorCost(itemString) then - local vendorNeed = quantity - ((crafterBags[itemString] or 0) + (crafterMail[itemString] or 0) + (crafterBank[itemString] or 0)) - if vendorNeed > 0 then - items[itemString] = vendorNeed - end - elseif TSMAPI.Conversions[itemString] and TSMAPI.InkConversions[itemString] then - local tradeItem, data = next(TSMAPI.Conversions[itemString]) - if data.source == "vendortrade" then - local num = floor(Inventory:GetTotalQuantity(tradeItem) * data.rate) - if quantity > Inventory:GetTotalQuantity(itemString) and num >= (quantity - Inventory:GetTotalQuantity(itemString)) then - items[itemString] = quantity - Inventory:GetTotalQuantity(itemString) - neededMats[tradeItem] = (neededMats[tradeItem] or 0) + quantity / data.rate -- add the qty of IOD to needed mats - end - end - end - end - if next(items) then - tinsert(task, { taskType = L["Visit Vendor"], items = items }) - tinsert(sources, { sourceName = L["Vendor"], isCrafter = false, isVendor = true, isAH = false, tasks = task }) - end - - -- double check if crafter already has all the items needed - local shortItems = {} - for itemString, quantity in pairs(neededMats) do - local soulboundBagCount - if TSMAPI.SOULBOUND_MATS[itemString] then - soulboundBagCount = GetItemCount(itemString) - end - local need = max(quantity - (crafterBags[itemString] or soulboundBagCount or 0), 0) - if need > 0 then - shortItems[itemString] = need - end - end - if not next(shortItems) then return end - - -- add bags/bank/mail "tasks" for needed items of all non-ignored characters (always include crafter) - for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do - if player == crafter or not TSM.db.global.ignoreCharacters[player] then - local task = {} - local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} - local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} - local guild = TSMAPI:ModuleAPI("ItemTracker", "playerguild", player) or {} - local gbank = {} - if guild and not TSM.db.global.ignoreGuilds[guild] then - gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} - end - local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} - local bankItems = {} - local gbankItems = {} - local mailItems = {} - local bagItems = {} - - for itemString in pairs(neededMats) do - local soulboundBagCount, soulboundBankCount - if TSMAPI.SOULBOUND_MATS[itemString] then - soulboundBagCount = GetItemCount(itemString) - soulboundBankCount = GetItemCount(itemString, true) - soulboundBagCount - end - if (bank[itemString] or (soulboundBankCount and soulboundBankCount > 0)) and shortItems[itemString] then - if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then - bankItems[itemString] = bank[itemString] or soulboundBankCount - end - end - if gbank[itemString] and shortItems[itemString] then - if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then - gbankItems[itemString] = gbank[itemString] - end - end - if mail[itemString] and shortItems[itemString] then - mailItems[itemString] = mail[itemString] - end - if bags[itemString] and shortItems[itemString] then - if player ~= crafter then - if shortItems[itemString] - (crafterMail[itemString] or 0) > 0 then - bagItems[itemString] = bags[itemString] - end - end - end - end - -- add mail tasks for destroyable items bought through shopping search (exclude items already added to mail tasks) - for itemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do - if mail[itemString] and not shortItems[itemString] then - mailItems[itemString] = quantity - end - end - - if next(bankItems) then - tinsert(task, { taskType = L["Visit Bank"], items = bankItems }) - end - if next(gbankItems) then - tinsert(task, { taskType = L["Visit Guild Bank"], items = gbankItems }) - end - if next(mailItems) then - tinsert(task, { taskType = L["Collect Mail"], items = mailItems }) - end - if next(bagItems) then - tinsert(task, { taskType = L["Mail Items"], items = bagItems }) - end - if next(task) then - tinsert(sources, { sourceName = player, isCrafter = player == crafter, isVendor = false, isAH = false, tasks = task, isCurrent = (player == UnitName("player")) }) - end - end - end - - -- add auction house tasks - local auctionTask = {} - local auctionItems = {} - for itemString, quantity in pairs(neededMats) do - if not TSMAPI.SOULBOUND_MATS[itemString] and not TSMAPI:GetVendorCost(itemString) then - local need - if TSM.Inventory.gatherItem == itemString and TSM.Inventory.gatherQuantity then - need = TSM.Inventory.gatherQuantity - else - need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0) - end - if need > 0 then - auctionItems[itemString] = need - end - end - end - if next(auctionItems) then - tinsert(auctionTask, { taskType = L["Search for Mats"], items = auctionItems }) - tinsert(sources, { sourceName = L["Auction House"], isCrafter = false, isVendor = false, isAH = true, tasks = auctionTask }) - end - - -- add destroying tasks - local destroyingTask, millItems, prospectItems, transformItems, deItems = {}, {}, {}, {}, {} - - for itemString, quantity in pairs(neededMats) do - local need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0) - -- conversion items - for destroyItem, data in pairs(TSMAPI.Conversions[itemString] or {}) do - if TSM.db.realm.gathering.destroyingMats[destroyItem] then - if need > 0 then - local destroyNeed - if data.source == "mill" then - destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5) - if destroyNeed > 0 then - millItems[destroyItem] = (millItems[destroyItem] or 0) + destroyNeed - end - elseif data.source == "prospect" then - destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5) - if destroyNeed > 0 then - prospectItems[destroyItem] = (prospectItems[destroyItem] or 0) + destroyNeed - end - elseif data.source == "transform" then - if data.rate == 1 / 3 then - destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 3) - elseif data.rate == 1 / 10 then - destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 10) - else - destroyNeed = TSM.db.realm.gathering.destroyingMats[destroyItem] - end - if destroyNeed > 0 then - transformItems[destroyItem] = (transformItems[destroyItem] or 0) + destroyNeed - end - end - else - TSM.db.realm.gathering.destroyingMats[destroyItem] = nil - end - end - end - -- disenchantable items - if next(TSM.db.realm.gathering.destroyingMats) then - for deItemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do - if Inventory:IsDisenchantable(deItemString) then - if need > 0 then - deItems[deItemString] = quantity - else - TSM.db.realm.gathering.destroyingMats[deItemString] = nil - end - end - end - end - end - - if next(millItems) then - tinsert(destroyingTask, { taskType = L["Milling"], items = millItems }) - end - if next(prospectItems) then - tinsert(destroyingTask, { taskType = L["Prospect"], items = prospectItems }) - end - if next(transformItems) then - tinsert(destroyingTask, { taskType = L["Transform"], items = transformItems }) - end - if next(deItems) then - tinsert(destroyingTask, { taskType = L["Disenchant"], items = deItems }) - end - if next(destroyingTask) then - tinsert(sources, { sourceName = L["Destroying"], isCrafter = false, isVendor = false, isAH = true, tasks = destroyingTask }) - end - - - sort(sources, function(a, b) - if a.isCurrent then return true end - if b.isCurrent then return false end - if a.isAH then return false end - if b.isAH then return true end - if a.isVendor then return false end - if b.isVendor then return true end - if a.isCrafter then return false end - if b.isCrafter then return true end - return a.sourceName < b.sourceName - end) - return sources - end - - function Inventory:IsDisenchantable(itemString) - local _, link, quality, _, _, iType = TSMAPI:GetSafeItemInfo(itemString) - local WEAPON, ARMOR = GetAuctionItemClasses() - if itemString and not TSMAPI.DisenchantingData.notDisenchantable[itemString] and (iType == ARMOR or iType == WEAPON) then - return true - end + -- ------------------------------------------------------------------------------ -- + -- TradeSkillMaster_Crafting -- + -- http://www.curse.com/addons/wow/tradeskillmaster_crafting -- + -- -- + -- A TradeSkillMaster Addon (http://tradeskillmaster.com) -- + -- All Rights Reserved* - Detailed license information included with addon. -- + -- ------------------------------------------------------------------------------ -- + + -- load the parent file (TSM) into a local variable and register this file as a module + local TSM = select(2, ...) + local Inventory = TSM:NewModule("Inventory", "AceEvent-3.0") + local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Crafting") -- loads the localization table + + + -- gets the number of an item in the current player's bags + function Inventory:GetPlayerBagNum(itemString) + if not itemString then return end + + if TSMAPI.SOULBOUND_MATS[itemString] then + return GetItemCount(itemString) + else + local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", UnitName("player")) or {} + return bags and bags[itemString] or 0 + end + end + + function Inventory:GetTotals() + local bagTotal, auctionTotal, otherTotal, total = {}, {}, {}, {} + + for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do + if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then + local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} + local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} + local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} + local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {} + for itemString, quantity in pairs(bags) do + if player == UnitName("player") then + bagTotal[itemString] = (bagTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + else + otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + end + end + for itemString, quantity in pairs(bank) do + otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + end + for itemString, quantity in pairs(mail) do + otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + end + for itemString, quantity in pairs(auctions) do + auctionTotal[itemString] = (auctionTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + end + end + end + + for itemString in pairs(TSMAPI.SOULBOUND_MATS) do + local bagNum = GetItemCount(itemString) + local bankNum = GetItemCount(itemString, true) - GetItemCount(itemString) + bagTotal[itemString] = (bagTotal[itemString] or 0) + bagNum + otherTotal[itemString] = (otherTotal[itemString] or 0) + bankNum + total[itemString] = (total[itemString] or 0) + bagNum + bankNum + end + + -- add gbank counts of all non-ignored guilds + for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do + if not TSM.db.global.ignoreGuilds[guild] then + local gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} + for itemString, quantity in pairs(gbank) do + otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + end + end + end + -- Ascension WoW: add personal bank counts for all non-ignored characters + for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do + if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then + local personalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", player) or {} + for itemString, quantity in pairs(personalBank) do + otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + end + end + end + + -- Ascension WoW: add realm bank counts + local realmBank = TSMAPI:ModuleAPI("ItemTracker", "realmbank") or {} + for itemString, quantity in pairs(realmBank) do + otherTotal[itemString] = (otherTotal[itemString] or 0) + quantity + total[itemString] = (total[itemString] or 0) + quantity + end + + return bagTotal, auctionTotal, otherTotal, total + end + + -- gets the total number of some item that they have + function Inventory:GetTotalQuantity(itemString) + if not itemString then return 0 end + local count = 0 + + -- add bags/bank/mail/auction counts of all non-ignored characters (always including current character) + for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do + if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then + local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} + local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} + local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} + local auctions = TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player) or {} + count = count + (bags[itemString] or 0) + count = count + (bank[itemString] or 0) + count = count + (mail[itemString] or 0) + count = count + (auctions[itemString] or 0) + end + end + -- add gbank counts of all non-ignored guilds + for _, guild in pairs(TSMAPI:ModuleAPI("ItemTracker", "guildlist") or {}) do + if not TSM.db.global.ignoreGuilds[guild] then + local bank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} + count = count + (bank[itemString] or 0) + end + end + + -- Ascension WoW: add personal bank counts for all non-ignored characters + for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do + if player == UnitName("player") or not TSM.db.global.ignoreCharacters[player] then + local personalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", player) or {} + count = count + (personalBank[itemString] or 0) + end + end + + -- Ascension WoW: add realm bank count + local realmBank = TSMAPI:ModuleAPI("ItemTracker", "realmbank") or {} + count = count + (realmBank[itemString] or 0) + + if TSMAPI.SOULBOUND_MATS[itemString] then + count = count + GetItemCount(itemString, true) + end + + return count + end + + function Inventory:GetItemSources(crafter, neededMats) + if not neededMats then return end + local sources = {} + local gbank = {} + local next = next + local crafterBags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", crafter) or {} + local crafterMail = TSMAPI:ModuleAPI("ItemTracker", "playermail", crafter) or {} + local crafterBank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", crafter) or {} + -- Ascension WoW: crafter's personal bank + local crafterPersonalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", crafter) or {} + + -- add vendor items + local task = {} + local items = {} + for itemString, quantity in pairs(neededMats) do + if TSMAPI:GetVendorCost(itemString) then + local vendorNeed = quantity - ((crafterBags[itemString] or 0) + (crafterMail[itemString] or 0) + (crafterBank[itemString] or 0) + (crafterPersonalBank[itemString] or 0)) + if vendorNeed > 0 then + items[itemString] = vendorNeed + end + elseif TSMAPI.Conversions[itemString] and TSMAPI.InkConversions[itemString] then + local tradeItem, data = next(TSMAPI.Conversions[itemString]) + if data.source == "vendortrade" then + local num = floor(Inventory:GetTotalQuantity(tradeItem) * data.rate) + if quantity > Inventory:GetTotalQuantity(itemString) and num >= (quantity - Inventory:GetTotalQuantity(itemString)) then + items[itemString] = quantity - Inventory:GetTotalQuantity(itemString) + neededMats[tradeItem] = (neededMats[tradeItem] or 0) + quantity / data.rate -- add the qty of IOD to needed mats + end + end + end + end + if next(items) then + tinsert(task, { taskType = L["Visit Vendor"], items = items }) + tinsert(sources, { sourceName = L["Vendor"], isCrafter = false, isVendor = true, isAH = false, tasks = task }) + end + + -- double check if crafter already has all the items needed + local shortItems = {} + for itemString, quantity in pairs(neededMats) do + local soulboundBagCount + if TSMAPI.SOULBOUND_MATS[itemString] then + soulboundBagCount = GetItemCount(itemString) + end + local need = max(quantity - (crafterBags[itemString] or soulboundBagCount or 0), 0) + if need > 0 then + shortItems[itemString] = need + end + end + if not next(shortItems) then return end + + -- add bags/bank/mail "tasks" for needed items of all non-ignored characters (always include crafter) + for _, player in pairs(TSMAPI:ModuleAPI("ItemTracker", "playerlist") or {}) do + if player == crafter or not TSM.db.global.ignoreCharacters[player] then + local task = {} + local bags = TSMAPI:ModuleAPI("ItemTracker", "playerbags", player) or {} + local bank = TSMAPI:ModuleAPI("ItemTracker", "playerbank", player) or {} + local guild = TSMAPI:ModuleAPI("ItemTracker", "playerguild", player) or {} + local gbank = {} + if guild and not TSM.db.global.ignoreGuilds[guild] then + gbank = TSMAPI:ModuleAPI("ItemTracker", "guildbank", guild) or {} + end + local mail = TSMAPI:ModuleAPI("ItemTracker", "playermail", player) or {} + -- Ascension WoW: personal bank for this player + local personalBank = TSMAPI:ModuleAPI("ItemTracker", "personalbank", player) or {} + local bankItems = {} + local gbankItems = {} + local mailItems = {} + local bagItems = {} + local personalBankItems = {} + + for itemString in pairs(neededMats) do + local soulboundBagCount, soulboundBankCount + if TSMAPI.SOULBOUND_MATS[itemString] then + soulboundBagCount = GetItemCount(itemString) + soulboundBankCount = GetItemCount(itemString, true) - soulboundBagCount + end + if (bank[itemString] or (soulboundBankCount and soulboundBankCount > 0)) and shortItems[itemString] then + if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then + bankItems[itemString] = bank[itemString] or soulboundBankCount + end + end + if gbank[itemString] and shortItems[itemString] then + if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then + gbankItems[itemString] = gbank[itemString] + end + end + -- Ascension WoW: check personal bank + if personalBank[itemString] and shortItems[itemString] then + if shortItems[itemString] - (crafterMail[itemString] or 0) - (player ~= crafter and bags[itemString] or 0) > 0 then + personalBankItems[itemString] = personalBank[itemString] + end + end + if mail[itemString] and shortItems[itemString] then + mailItems[itemString] = mail[itemString] + end + if bags[itemString] and shortItems[itemString] then + if player ~= crafter then + if shortItems[itemString] - (crafterMail[itemString] or 0) > 0 then + bagItems[itemString] = bags[itemString] + end + end + end + end + -- add mail tasks for destroyable items bought through shopping search (exclude items already added to mail tasks) + for itemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do + if mail[itemString] and not shortItems[itemString] then + mailItems[itemString] = quantity + end + end + + if next(bankItems) then + tinsert(task, { taskType = L["Visit Bank"], items = bankItems }) + end + if next(gbankItems) then + tinsert(task, { taskType = L["Visit Guild Bank"], items = gbankItems }) + end + -- Ascension WoW: personal bank task + if next(personalBankItems) then + tinsert(task, { taskType = L["Visit Personal Bank"], items = personalBankItems }) + end + if next(mailItems) then + tinsert(task, { taskType = L["Collect Mail"], items = mailItems }) + end + if next(bagItems) then + tinsert(task, { taskType = L["Mail Items"], items = bagItems }) + end + if next(task) then + tinsert(sources, { sourceName = player, isCrafter = player == crafter, isVendor = false, isAH = false, tasks = task, isCurrent = (player == UnitName("player")) }) + end + end + end + -- Ascension WoW: add realm bank as a separate source + local realmBank = TSMAPI:ModuleAPI("ItemTracker", "realmbank") or {} + local realmBankTask = {} + local realmBankItems = {} + for itemString in pairs(neededMats) do + if realmBank[itemString] and shortItems[itemString] then + if shortItems[itemString] - (crafterMail[itemString] or 0) > 0 then + realmBankItems[itemString] = realmBank[itemString] + end + end + end + if next(realmBankItems) then + tinsert(realmBankTask, { taskType = L["Visit Realm Bank"], items = realmBankItems }) + tinsert(sources, { sourceName = L["Realm Bank"], isCrafter = false, isVendor = false, isAH = false, tasks = realmBankTask, isCurrent = true }) + end + + -- add auction house tasks + local auctionTask = {} + local auctionItems = {} + for itemString, quantity in pairs(neededMats) do + if not TSMAPI.SOULBOUND_MATS[itemString] and not TSMAPI:GetVendorCost(itemString) then + local need + if TSM.Inventory.gatherItem == itemString and TSM.Inventory.gatherQuantity then + need = TSM.Inventory.gatherQuantity + else + need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0) + end + if need > 0 then + auctionItems[itemString] = need + end + end + end + if next(auctionItems) then + tinsert(auctionTask, { taskType = L["Search for Mats"], items = auctionItems }) + tinsert(sources, { sourceName = L["Auction House"], isCrafter = false, isVendor = false, isAH = true, tasks = auctionTask }) + end + + -- add destroying tasks + local destroyingTask, millItems, prospectItems, transformItems, deItems = {}, {}, {}, {}, {} + + for itemString, quantity in pairs(neededMats) do + local need = max(quantity - (TSM.Inventory:GetTotalQuantity(itemString) or 0), 0) + -- conversion items + for destroyItem, data in pairs(TSMAPI.Conversions[itemString] or {}) do + if TSM.db.realm.gathering.destroyingMats[destroyItem] then + if need > 0 then + local destroyNeed + if data.source == "mill" then + destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5) + if destroyNeed > 0 then + millItems[destroyItem] = (millItems[destroyItem] or 0) + destroyNeed + end + elseif data.source == "prospect" then + destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 5) + if destroyNeed > 0 then + prospectItems[destroyItem] = (prospectItems[destroyItem] or 0) + destroyNeed + end + elseif data.source == "transform" then + if data.rate == 1 / 3 then + destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 3) + elseif data.rate == 1 / 10 then + destroyNeed = floor(TSM.db.realm.gathering.destroyingMats[destroyItem] / 10) + else + destroyNeed = TSM.db.realm.gathering.destroyingMats[destroyItem] + end + if destroyNeed > 0 then + transformItems[destroyItem] = (transformItems[destroyItem] or 0) + destroyNeed + end + end + else + TSM.db.realm.gathering.destroyingMats[destroyItem] = nil + end + end + end + -- disenchantable items + if next(TSM.db.realm.gathering.destroyingMats) then + for deItemString, quantity in pairs(TSM.db.realm.gathering.destroyingMats) do + if Inventory:IsDisenchantable(deItemString) then + if need > 0 then + deItems[deItemString] = quantity + else + TSM.db.realm.gathering.destroyingMats[deItemString] = nil + end + end + end + end + end + + if next(millItems) then + tinsert(destroyingTask, { taskType = L["Milling"], items = millItems }) + end + if next(prospectItems) then + tinsert(destroyingTask, { taskType = L["Prospect"], items = prospectItems }) + end + if next(transformItems) then + tinsert(destroyingTask, { taskType = L["Transform"], items = transformItems }) + end + if next(deItems) then + tinsert(destroyingTask, { taskType = L["Disenchant"], items = deItems }) + end + if next(destroyingTask) then + tinsert(sources, { sourceName = L["Destroying"], isCrafter = false, isVendor = false, isAH = true, tasks = destroyingTask }) + end + + + sort(sources, function(a, b) + if a.isCurrent then return true end + if b.isCurrent then return false end + if a.isAH then return false end + if b.isAH then return true end + if a.isVendor then return false end + if b.isVendor then return true end + if a.isCrafter then return false end + if b.isCrafter then return true end + return a.sourceName < b.sourceName + end) + return sources + end + + function Inventory:IsDisenchantable(itemString) + local _, link, quality, _, _, iType = TSMAPI:GetSafeItemInfo(itemString) + local WEAPON, ARMOR = GetAuctionItemClasses() + if itemString and not TSMAPI.DisenchantingData.notDisenchantable[itemString] and (iType == ARMOR or iType == WEAPON) then + return true + end end \ No newline at end of file diff --git a/TradeSkillMaster_ItemTracker/Locale/enUS.lua b/TradeSkillMaster_ItemTracker/Locale/enUS.lua index cda0cb4..629d12a 100644 --- a/TradeSkillMaster_ItemTracker/Locale/enUS.lua +++ b/TradeSkillMaster_ItemTracker/Locale/enUS.lua @@ -14,9 +14,13 @@ local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_ItemTracker", "en if not L then return end L["%s (%s bags, %s bank, %s AH, %s mail)"] = true +L["%s (%s bags, %s bank, %s AH, %s mail, %s personal)"] = true L["%s in guild bank"] = true +L["%s in realm bank"] = true L["%s item(s) total"] = true L["(%s player, %s alts, %s guild banks, %s AH)"] = true +L["(%s player, %s alts, %s guild, %s AH, %s personal, %s realm)"] = true +L["Realm Bank"] = true L["AH"] = true L["Bags"] = true L["Bank"] = true diff --git a/TradeSkillMaster_ItemTracker/Modules/data.lua b/TradeSkillMaster_ItemTracker/Modules/data.lua index 665e371..3be0035 100644 --- a/TradeSkillMaster_ItemTracker/Modules/data.lua +++ b/TradeSkillMaster_ItemTracker/Modules/data.lua @@ -78,12 +78,39 @@ function Data:ThrottleEvent(event) throttleFrames[event]:Show() end +-- Ascension WoW bank type constants +local BANK_TYPE_PERSONAL = "personal" +local BANK_TYPE_REALM = "realm" +local BANK_TYPE_GUILD = "guild" + +-- Detect the type of bank currently open based on tab names +-- Ascension uses "Personal Bank" and "Realm Bank" as tab names for custom banks +local function GetCurrentBankType() + local numTabs = GetNumGuildBankTabs() + if numTabs == 0 then return nil end + + local firstTabName = GetGuildBankTabInfo(1) + if firstTabName == "Personal Bank" then + return BANK_TYPE_PERSONAL + elseif firstTabName == "Realm Bank" then + return BANK_TYPE_REALM + else + return BANK_TYPE_GUILD + end +end + +-- Store the current bank type when opened (persists until next open) +local currentOpenBankType = nil + function Data:EventHandler(event, fire) if isScanning then return end if fire ~= "FIRE" then Data:ThrottleEvent(event) else if event == "GUILDBANKFRAME_OPENED" then + -- Detect and store the bank type + currentOpenBankType = GetCurrentBankType() + -- Query all tabs of the gbank to ensure all tabs will be scanned. local initialTab = GetCurrentGuildBankTab() for tab = 1, GetNumGuildBankTabs() do @@ -93,7 +120,14 @@ function Data:EventHandler(event, fire) end QueryGuildBankTab(initialTab) elseif event == "GUILDBANKBAGSLOTS_CHANGED" then - Data:GetGuildBankData() + -- Route to the appropriate handler based on bank type + if currentOpenBankType == BANK_TYPE_PERSONAL then + Data:GetPersonalBankData() + elseif currentOpenBankType == BANK_TYPE_REALM then + Data:GetRealmBankData() + else + Data:GetGuildBankData() + end elseif event == "AUCTION_OWNED_LIST_UPDATE" then Data:ScanPlayerAuctions() end @@ -128,35 +162,86 @@ function Data:GetBankData(state) TSM.Sync:BroadcastUpdateRequest() end --- scan the guild bank -function Data:GetGuildBankData() - if not TSM.CURRENT_GUILD then - Data:StoreCurrentGuildInfo(true) - if not TSM.CURRENT_GUILD then return end - end - wipe(TSM.guilds[TSM.CURRENT_GUILD].items) - - for tab = 1, GetNumGuildBankTabs() do - if select(5, GetGuildBankTabInfo(tab)) > 0 or IsGuildLeader(UnitName("player")) then +-- Helper function to scan all guild bank slots and return items table +local function ScanGuildBankSlots() + local items = {} + local numTabs = GetNumGuildBankTabs() + for tab = 1, numTabs do + local name, icon, isViewable, canDeposit, numWithdrawals = GetGuildBankTabInfo(tab) + -- Ascension WoW: For Personal/Realm banks, always scan (numWithdrawals check may not apply) + local canAccess = (numWithdrawals and numWithdrawals > 0) or IsGuildLeader(UnitName("player")) or (name == "Personal Bank") or (name == "Realm Bank") + if canAccess then for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do local itemString = TSMAPI:GetItemString(GetGuildBankItemLink(tab, slot)) local baseItemString = TSMAPI:GetBaseItemString(GetGuildBankItemLink(tab, slot)) if itemString then local quantity = select(2, GetGuildBankItemInfo(tab, slot)) - TSM.guilds[TSM.CURRENT_GUILD].items[itemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[itemString] or 0) + quantity + items[itemString] = (items[itemString] or 0) + quantity if itemString ~= baseItemString then - TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] or 0) + quantity + items[baseItemString] = (items[baseItemString] or 0) + quantity end end end end end + return items +end + +-- scan the guild bank (real guild bank only) +function Data:GetGuildBankData() + if not TSM.CURRENT_GUILD then + Data:StoreCurrentGuildInfo(true) + if not TSM.CURRENT_GUILD then return end + end + wipe(TSM.guilds[TSM.CURRENT_GUILD].items) + + local items = ScanGuildBankSlots() + for itemString, quantity in pairs(items) do + TSM.guilds[TSM.CURRENT_GUILD].items[itemString] = quantity + end + if GuildBankFrame and GuildBankFrame:IsVisible() then TSM.guilds[TSM.CURRENT_GUILD].lastUpdate = time() end TSM.Sync:BroadcastUpdateRequest() end +-- Ascension WoW: scan the personal bank (per character) +function Data:GetPersonalBankData() + -- Initialize personal bank for current player if needed + if not TSM.personalBanks[TSM.CURRENT_PLAYER] then + TSM.personalBanks[TSM.CURRENT_PLAYER] = { items = {}, lastUpdate = 0 } + end + wipe(TSM.personalBanks[TSM.CURRENT_PLAYER].items) + + local items = ScanGuildBankSlots() + for itemString, quantity in pairs(items) do + TSM.personalBanks[TSM.CURRENT_PLAYER].items[itemString] = quantity + end + + TSM.personalBanks[TSM.CURRENT_PLAYER].lastUpdate = time() + TSM.Sync:BroadcastUpdateRequest() +end + +-- Ascension WoW: scan the realm bank (shared across realm) +function Data:GetRealmBankData() + -- Initialize realm bank if needed + if not TSM.realmBank.items then + TSM.realmBank.items = {} + end + wipe(TSM.realmBank.items) + + local items = ScanGuildBankSlots() + for itemString, quantity in pairs(items) do + TSM.realmBank.items[itemString] = quantity + end + + if GuildBankFrame and GuildBankFrame:IsVisible() then + TSM.realmBank.lastUpdate = time() + end + TSM.Sync:BroadcastUpdateRequest() +end + function Data:ScanPlayerAuctions() wipe(TSM.characters[TSM.CURRENT_PLAYER].auctions) TSM.characters[TSM.CURRENT_PLAYER].auctions.time = time() diff --git a/TradeSkillMaster_ItemTracker/TradeSkillMaster_ItemTracker.lua b/TradeSkillMaster_ItemTracker/TradeSkillMaster_ItemTracker.lua index 53aa09d..ccd580e 100644 --- a/TradeSkillMaster_ItemTracker/TradeSkillMaster_ItemTracker.lua +++ b/TradeSkillMaster_ItemTracker/TradeSkillMaster_ItemTracker.lua @@ -13,7 +13,7 @@ local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_ItemTracker") -- default values for the savedDB local savedDBDefaults = { - -- any global + -- any global global = { tooltip = "simple", }, @@ -23,6 +23,10 @@ local savedDBDefaults = { characters = {}, guilds = {}, ignoreGuilds = {}, + -- Ascension WoW: Personal banks (per character, stored by character name) + personalBanks = {}, + -- Ascension WoW: Realm bank (shared across all characters on realm) + realmBank = { items = {}, lastUpdate = 0 }, }, -- data that is stored per user profile @@ -47,6 +51,11 @@ local guildDefaults = { items = {}, lastUpdate = 0, } +-- Ascension WoW: Personal bank defaults (same structure as guild) +local personalBankDefaults = { + items = {}, + lastUpdate = 0, +} -- Called once the player has loaded into the game -- Anything that needs to be done in order to initialize the addon should go here @@ -58,9 +67,12 @@ function TSM:OnInitialize() -- load the saved variables table into TSM.db TSM.db = LibStub:GetLibrary("AceDB-3.0"):New("AscensionTSM_ItemTrackerDB", savedDBDefaults, true) - + TSM.characters = TSM.db.realm.characters TSM.guilds = TSM.db.realm.guilds + -- Ascension WoW: Personal banks and realm bank + TSM.personalBanks = TSM.db.realm.personalBanks + TSM.realmBank = TSM.db.realm.realmBank -- handle connected realms for characters local connectedRealms = TSMAPI.GetConnectedRealms and TSMAPI:GetConnectedRealms() or {} @@ -117,6 +129,11 @@ function TSM:OnInitialize() for _, guildData in pairs(TSM.guilds) do ClearItemIDs(guildData.items) end + -- Ascension WoW: Clean up personal banks and realm bank + for _, personalBankData in pairs(TSM.personalBanks) do + ClearItemIDs(personalBankData.items) + end + ClearItemIDs(TSM.realmBank.items) TSM.Data:Initialize() TSM:UpdatePlayerLookup() @@ -151,6 +168,11 @@ function TSM:RegisterModule() { key = "guildtotal", callback = "GetGuildTotal" }, { key = "playerguildtotal", callback = "GetPlayerGuildTotal" }, { key = "playerguild", callback = "GetPlayerGuild" }, + -- Ascension WoW: Personal banks and realm bank APIs + { key = "personalbank", callback = "GetPersonalBank" }, + { key = "realmbank", callback = "GetRealmBank" }, + { key = "personalbankstotal", callback = "GetPersonalBanksTotal" }, + { key = "realmbanktotal", callback = "GetRealmBankTotal" }, } --TSM.sync = { callback = "Sync:Callback" } TSM.tooltipOptions = { callback = "Config:LoadTooltipOptions" } @@ -169,9 +191,18 @@ function TSM:GetTooltip(itemString) local player, alts = TSM:GetPlayerTotal(itemString) local guild = TSM:GetGuildTotal(itemString) local auctions = TSM:GetAuctionsTotal(itemString) - grandTotal = grandTotal + player + alts + guild + auctions + -- Ascension WoW: Add personal banks and realm bank + local personalBanks = TSM:GetPersonalBanksTotal(itemString) + local realmBank = TSM:GetRealmBankTotal(itemString) + grandTotal = grandTotal + player + alts + guild + auctions + personalBanks + realmBank if grandTotal > 0 then - tinsert(text, { left = " " .. "ItemTracker:", right = format(L["(%s player, %s alts, %s guild banks, %s AH)"], "|cffffffff" .. player .. "|r", "|cffffffff" .. alts .. "|r", "|cffffffff" .. guild .. "|r", "|cffffffff" .. auctions .. "|r") }) + tinsert(text, { left = " " .. "ItemTracker:", right = format(L["(%s player, %s alts, %s guild, %s AH, %s personal, %s realm)"], + "|cffffffff" .. player .. "|r", + "|cffffffff" .. alts .. "|r", + "|cffffffff" .. guild .. "|r", + "|cffffffff" .. auctions .. "|r", + "|cffffffff" .. personalBanks .. "|r", + "|cffffffff" .. realmBank .. "|r") }) end elseif TSM.db.global.tooltip == "full" then for name, data in pairs(TSM.characters) do @@ -179,17 +210,26 @@ function TSM:GetTooltip(itemString) local bank = data.bank[itemString] or 0 local auctions = data.auctions[itemString] or 0 local mail = data.mail[itemString] or 0 - local total = bags + bank + auctions + mail + -- Ascension WoW: Add personal bank for this character + local personalBank = TSM.personalBanks[name] and TSM.personalBanks[name].items[itemString] or 0 + local total = bags + bank + auctions + mail + personalBank grandTotal = grandTotal + total local bagText = "|cffffffff" .. bags .. "|r" local bankText = "|cffffffff" .. bank .. "|r" local auctionText = "|cffffffff" .. auctions .. "|r" local mailText = "|cffffffff" .. mail .. "|r" + local personalBankText = "|cffffffff" .. personalBank .. "|r" local totalText = "|cffffffff" .. total .. "|r" if total > 0 then - tinsert(text, { left = format(" %s:", name), right = format(L["%s (%s bags, %s bank, %s AH, %s mail)"], "|cffffffff" .. totalText, "|cffffffff" .. bagText, "|cffffffff" .. bankText, "|cffffffff" .. auctionText, "|cffffffff" .. mailText) }) + tinsert(text, { left = format(" %s:", name), right = format(L["%s (%s bags, %s bank, %s AH, %s mail, %s personal)"], + "|cffffffff" .. totalText, + "|cffffffff" .. bagText, + "|cffffffff" .. bankText, + "|cffffffff" .. auctionText, + "|cffffffff" .. mailText, + "|cffffffff" .. personalBankText) }) end end @@ -205,6 +245,14 @@ function TSM:GetTooltip(itemString) end end end + + -- Ascension WoW: Show realm bank + local realmBank = TSM:GetRealmBankTotal(itemString) + if realmBank > 0 then + grandTotal = grandTotal + realmBank + local realmBankText = "|cffffffff" .. realmBank .. "|r" + tinsert(text, { left = " " .. L["Realm Bank"] .. ":", right = format(L["%s in realm bank"], realmBankText) }) + end end if #text > 0 then @@ -343,4 +391,31 @@ function TSM:GetPlayerGuild(player) player = TSM.playerLookup[player] or player if not player or not TSM.characters[player] then return end return TSM.characters[player].guild +end + +-- Ascension WoW: Get personal bank data for a player +function TSM:GetPersonalBank(player) + player = player or TSM.CURRENT_PLAYER + player = TSM.playerLookup[player] or player + if not player or not TSM.personalBanks[player] then return end + return TSM.personalBanks[player].items +end + +-- Ascension WoW: Get realm bank data +function TSM:GetRealmBank() + return TSM.realmBank.items +end + +-- Ascension WoW: Get total items across all personal banks +function TSM:GetPersonalBanksTotal(itemString) + local total = 0 + for _, data in pairs(TSM.personalBanks) do + total = total + (data.items[itemString] or 0) + end + return total +end + +-- Ascension WoW: Get realm bank total for an item +function TSM:GetRealmBankTotal(itemString) + return TSM.realmBank.items[itemString] or 0 end \ No newline at end of file From 61f80fc1c183297ff0803996bb63d698c5d3f500 Mon Sep 17 00:00:00 2001 From: soltanikian Date: Wed, 10 Dec 2025 21:01:14 +0100 Subject: [PATCH 2/5] fix gathering from personal and realm banks --- TradeSkillMaster_Crafting/Modules/CraftingGUI.lua | 15 +++++++++++++-- TradeSkillMaster_Crafting/Modules/Gather.lua | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua b/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua index 85e964a..a6fa526 100644 --- a/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua +++ b/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua @@ -2622,8 +2622,19 @@ function GUI:GatheringEventHandler(event) if not GUI.gatheringFrame or not GUI.gatheringFrame:IsShown() then return end if event == "GUILDBANKFRAME_OPENED" then - private.currentSource = UnitName("player") - private.currentTask = L["Visit Guild Bank"] + -- Ascension WoW: Detect bank type based on first tab name + local numTabs = GetNumGuildBankTabs() + local firstTabName = numTabs > 0 and GetGuildBankTabInfo(1) or nil + if firstTabName == "Personal Bank" then + private.currentSource = UnitName("player") + private.currentTask = L["Visit Personal Bank"] + elseif firstTabName == "Realm Bank" then + private.currentSource = L["Realm Bank"] + private.currentTask = L["Visit Realm Bank"] + else + private.currentSource = UnitName("player") + private.currentTask = L["Visit Guild Bank"] + end elseif event == "GUILDBANKFRAME_CLOSED" then private.currentSource = nil private.currentTask = nil diff --git a/TradeSkillMaster_Crafting/Modules/Gather.lua b/TradeSkillMaster_Crafting/Modules/Gather.lua index 6f603f0..fa75cc5 100644 --- a/TradeSkillMaster_Crafting/Modules/Gather.lua +++ b/TradeSkillMaster_Crafting/Modules/Gather.lua @@ -34,7 +34,7 @@ function Gather:gatherItems(source, task) if source == L["Vendor"] then Gather:BuyFromMerchant(items) - elseif source == UnitName("player") and (task == L["Visit Bank"] or task == L["Visit Guild Bank"]) then + elseif (source == UnitName("player") or source == L["Realm Bank"]) and (task == L["Visit Bank"] or task == L["Visit Guild Bank"] or task == L["Visit Personal Bank"] or task == L["Visit Realm Bank"]) then Gather:GatherBank(items) elseif source == UnitName("player") and task == L["Mail Items"] then Gather:MailItems(items) From c84783d137aa06951a25056ca448b9893bac8a5d Mon Sep 17 00:00:00 2001 From: soltanikian Date: Wed, 10 Dec 2025 21:06:01 +0100 Subject: [PATCH 3/5] faster gathering from personal and realm banks --- TradeSkillMaster/Core/Mover.lua | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/TradeSkillMaster/Core/Mover.lua b/TradeSkillMaster/Core/Mover.lua index 17728aa..5a16d16 100644 --- a/TradeSkillMaster/Core/Mover.lua +++ b/TradeSkillMaster/Core/Mover.lua @@ -14,9 +14,23 @@ local AceGUI = LibStub("AceGUI-3.0") -- load the AceGUI libraries local lib = TSMAPI local bankType +local ascensionBankType -- Ascension WoW: "personal", "realm", or nil for real guild bank local fullMoves, splitMoves, bagState = {}, {}, {} local callbackMsg = {} +-- Ascension WoW: Detect bank type based on first tab name +local function GetAscensionBankType() + local numTabs = GetNumGuildBankTabs() + if numTabs == 0 then return nil end + local firstTabName = GetGuildBankTabInfo(1) + if firstTabName == "Personal Bank" then + return "personal" + elseif firstTabName == "Realm Bank" then + return "realm" + end + return nil +end + -- this is a set of wrapper functions so that I can switch -- between guildbank and bank function easily (taken from warehousing) @@ -42,6 +56,7 @@ function TSM:OnEnable() TSM:RegisterEvent("GUILDBANKFRAME_OPENED", function(event) bankType = "guildbank" + ascensionBankType = GetAscensionBankType() -- Ascension WoW: detect personal/realm bank end) TSM:RegisterEvent("BANKFRAME_OPENED", function(event) @@ -50,6 +65,7 @@ function TSM:OnEnable() TSM:RegisterEvent("GUILDBANKFRAME_CLOSED", function(event, addon) bankType = nil + ascensionBankType = nil -- Ascension WoW: reset TSM:UnregisterEvent("GUILDBANKBAGSLOTS_CHANGED") end) @@ -402,13 +418,23 @@ function TSM.generateMoves(includeSoulbound) if next(fullMoves) ~= nil then if bankType == "guildbank" then - TSMAPI:CreateTimeDelay("moveItem", 0.05, TSM.moveItem, 0.35) + -- Ascension WoW: Personal/Realm banks don't need slow delays like real guild banks + if ascensionBankType then + TSMAPI:CreateTimeDelay("moveItem", 0.05, TSM.moveItem, 0.05) + else + TSMAPI:CreateTimeDelay("moveItem", 0.05, TSM.moveItem, 0.35) + end else TSMAPI:CreateTimeDelay("moveItem", 0.05, TSM.moveItem, 0.05) end elseif next(splitMoves) ~= nil then if bankType == "guildbank" then - TSMAPI:CreateTimeDelay("moveSplitItem", 0.05, TSM.moveSplitItem, 0.75) + -- Ascension WoW: Personal/Realm banks don't need slow delays like real guild banks + if ascensionBankType then + TSMAPI:CreateTimeDelay("moveSplitItem", 0.05, TSM.moveSplitItem, 0.1) + else + TSMAPI:CreateTimeDelay("moveSplitItem", 0.05, TSM.moveSplitItem, 0.75) + end else TSMAPI:CreateTimeDelay("moveSplitItem", 0.05, TSM.moveSplitItem, 0.4) end From b4ae27c57a537a9fc7ff33631efc2b6576c5ed3a Mon Sep 17 00:00:00 2001 From: soltanikian Date: Wed, 10 Dec 2025 21:36:56 +0100 Subject: [PATCH 4/5] Fix Profession Multiselect on Gathering window --- .gitignore | 4 +++- TradeSkillMaster_Crafting/Modules/CraftingGUI.lua | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 44356e3..95d5645 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ .install .lua/* .vscode -.idea \ No newline at end of file +.idea +deploy.bat +claude.md \ No newline at end of file diff --git a/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua b/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua index a6fa526..5711116 100644 --- a/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua +++ b/TradeSkillMaster_Crafting/Modules/CraftingGUI.lua @@ -2041,7 +2041,12 @@ function GUI:CreateGatheringSelectionFrame(parent) dropdown:SetMultiselect(true) dropdown:SetCallback("OnValueChanged", function(_, _, profession, value) private.gather.professions[profession] = value or nil - GUI:UpdateGatherSelectionWindow() + -- Only update the button state, don't rebuild the dropdown list + if next(private.gather.professions) then + frame.gatherButton:Enable() + else + frame.gatherButton:Disable() + end end) frame.professionDropdown = dropdown From 60b279ed6f935eb2517db22a8f8cbfa79f387d0c Mon Sep 17 00:00:00 2001 From: soltanikian Date: Sun, 14 Dec 2025 18:52:01 +0100 Subject: [PATCH 5/5] commented milling and prospecting conversions since jobs are not available yet. --- TradeSkillMaster/Data/Conversions.lua | 656 +++++++++++++------------- 1 file changed, 328 insertions(+), 328 deletions(-) diff --git a/TradeSkillMaster/Data/Conversions.lua b/TradeSkillMaster/Data/Conversions.lua index 6b75015..62e85e9 100644 --- a/TradeSkillMaster/Data/Conversions.lua +++ b/TradeSkillMaster/Data/Conversions.lua @@ -12,284 +12,284 @@ local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster") -- loads the lo local conversions = { -- Epic WotLK gems - ["item:36919:0:0:0:0:0:0"] = { -- Cardinal Ruby - ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:36922:0:0:0:0:0:0"] = { -- King's Amber - ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:36925:0:0:0:0:0:0"] = { -- Majestic Zircon - ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:36928:0:0:0:0:0:0"] = { -- Dreadstone - ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:36931:0:0:0:0:0:0"] = { -- Ametrine - ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:36934:0:0:0:0:0:0"] = { -- Eye of Zul - ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, + -- ["item:36919:0:0:0:0:0:0"] = { -- Cardinal Ruby + -- ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:36922:0:0:0:0:0:0"] = { -- King's Amber + -- ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:36925:0:0:0:0:0:0"] = { -- Majestic Zircon + -- ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:36928:0:0:0:0:0:0"] = { -- Dreadstone + -- ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:36931:0:0:0:0:0:0"] = { -- Ametrine + -- ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:36934:0:0:0:0:0:0"] = { -- Eye of Zul + -- ["item:36910:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, -- common pigments (inks) - ["item:39151:0:0:0:0:0:0"] = { -- Alabaster Pigment (Ivory / Moonglow Ink) - ["item:765:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:2447:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:2449:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:39343:0:0:0:0:0:0"] = { -- Azure Pigment (Ink of the Sea) - ["item:39969:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:36904:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:36907:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:36901:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:39970:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:37921:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:36905:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:36906:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:36903:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:61979:0:0:0:0:0:0"] = { -- Ashen Pigment (Blackfallow Ink) - ["item:52983:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:52984:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:52985:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:52986:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:52987:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:52988:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:39334:0:0:0:0:0:0"] = { -- Dusky Pigment (Midnight Ink) - ["item:785:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:2450:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:2452:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:2453:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:3820:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:39339:0:0:0:0:0:0"] = { -- Emerald Pigment (Jadefire Ink) - ["item:3818:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:3821:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:3358:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:3819:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:39338:0:0:0:0:0:0"] = { -- Golden Pigment (Lion's Ink) - ["item:3355:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:3369:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:3356:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:3357:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:39342:0:0:0:0:0:0"] = { -- Nether Pigment (Ethereal Ink) - ["item:22786:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:22785:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:22789:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:22787:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:22790:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:22793:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:22791:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:22792:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:79251:0:0:0:0:0:0"] = { -- Shadow Pigment (Ink of Dreams) - ["item:72237:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:72234:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:79010:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:72235:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:79011:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:89639:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - }, - ["item:39341:0:0:0:0:0:0"] = { -- Silvery Pigment (Shimmering Ink) - ["item:13464:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:13463:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:13465:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:13466:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:13467:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, - ["item:39340:0:0:0:0:0:0"] = { -- Violet Pigment (Celestial Ink) - ["item:4625:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:8831:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:8838:0:0:0:0:0:0"] = {rate=.5, source="mill"}, - ["item:8839:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:8845:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - ["item:8846:0:0:0:0:0:0"] = {rate=.6, source="mill"}, - }, + -- ["item:39151:0:0:0:0:0:0"] = { -- Alabaster Pigment (Ivory / Moonglow Ink) + -- ["item:765:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:2447:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:2449:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:39343:0:0:0:0:0:0"] = { -- Azure Pigment (Ink of the Sea) + -- ["item:39969:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:36904:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:36907:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:36901:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:39970:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:37921:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:36905:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:36906:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:36903:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:61979:0:0:0:0:0:0"] = { -- Ashen Pigment (Blackfallow Ink) + -- ["item:52983:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:52984:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:52985:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:52986:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:52987:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:52988:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:39334:0:0:0:0:0:0"] = { -- Dusky Pigment (Midnight Ink) + -- ["item:785:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:2450:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:2452:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:2453:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:3820:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:39339:0:0:0:0:0:0"] = { -- Emerald Pigment (Jadefire Ink) + -- ["item:3818:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:3821:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:3358:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:3819:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:39338:0:0:0:0:0:0"] = { -- Golden Pigment (Lion's Ink) + -- ["item:3355:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:3369:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:3356:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:3357:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:39342:0:0:0:0:0:0"] = { -- Nether Pigment (Ethereal Ink) + -- ["item:22786:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:22785:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:22789:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:22787:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:22790:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:22793:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:22791:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:22792:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:79251:0:0:0:0:0:0"] = { -- Shadow Pigment (Ink of Dreams) + -- ["item:72237:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:72234:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:79010:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:72235:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:79011:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:89639:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- }, + -- ["item:39341:0:0:0:0:0:0"] = { -- Silvery Pigment (Shimmering Ink) + -- ["item:13464:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:13463:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:13465:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:13466:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:13467:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, + -- ["item:39340:0:0:0:0:0:0"] = { -- Violet Pigment (Celestial Ink) + -- ["item:4625:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:8831:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:8838:0:0:0:0:0:0"] = {rate=.5, source="mill"}, + -- ["item:8839:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:8845:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- ["item:8846:0:0:0:0:0:0"] = {rate=.6, source="mill"}, + -- }, - -- rare pigments (inks) - ["item:43109:0:0:0:0:0:0"] = { -- Icy Pigment (Snowfall Ink) - ["item:39969:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:36904:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:36907:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:36901:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:39970:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:37921:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:36905:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:36906:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:36903:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - }, - ["item:61980:0:0:0:0:0:0"] = { -- Burning Embers (Inferno Ink) - ["item:52983:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:52984:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:52985:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:52986:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:52987:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:52988:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - }, - ["item:43104:0:0:0:0:0:0"] = { -- Burnt Pigment (Dawnstar Ink) - ["item:3356:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:3357:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:3369:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:3355:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - }, - ["item:43108:0:0:0:0:0:0"] = { -- Ebon Pigment (Darkflame Ink) - ["item:22792:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:22790:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:22791:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:22793:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:22786:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:22785:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:22787:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:22789:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - }, - ["item:43105:0:0:0:0:0:0"] = { -- Indigo Pigment (Royal Ink) - ["item:3358:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:3819:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:3821:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:3818:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - }, - ["item:79253:0:0:0:0:0:0"] = { -- Misty Pigment (Starlight Ink) - ["item:72237:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:72234:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:79010:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:72235:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:79011:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:89639:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - }, - ["item:43106:0:0:0:0:0:0"] = { -- Ruby Pigment (Fiery Ink) - ["item:4625:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:8838:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:8831:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:8845:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:8846:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:8839:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - }, - ["item:43107:0:0:0:0:0:0"] = { -- Sapphire Pigment (Ink of the Sky) - ["item:13463:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:13464:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:13465:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:13466:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:13467:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - }, - ["item:43103:0:0:0:0:0:0"] = { -- Verdant Pigment (Hunter's Ink) - ["item:2453:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:3820:0:0:0:0:0:0"] = {rate=.1, source="mill"}, - ["item:2450:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:785:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - ["item:2452:0:0:0:0:0:0"] = {rate=.05, source="mill"}, - }, + -- -- rare pigments (inks) + -- ["item:43109:0:0:0:0:0:0"] = { -- Icy Pigment (Snowfall Ink) + -- ["item:39969:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:36904:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:36907:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:36901:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:39970:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:37921:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:36905:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:36906:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:36903:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- }, + -- ["item:61980:0:0:0:0:0:0"] = { -- Burning Embers (Inferno Ink) + -- ["item:52983:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:52984:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:52985:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:52986:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:52987:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:52988:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- }, + -- ["item:43104:0:0:0:0:0:0"] = { -- Burnt Pigment (Dawnstar Ink) + -- ["item:3356:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:3357:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:3369:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:3355:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- }, + -- ["item:43108:0:0:0:0:0:0"] = { -- Ebon Pigment (Darkflame Ink) + -- ["item:22792:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:22790:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:22791:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:22793:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:22786:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:22785:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:22787:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:22789:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- }, + -- ["item:43105:0:0:0:0:0:0"] = { -- Indigo Pigment (Royal Ink) + -- ["item:3358:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:3819:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:3821:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:3818:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- }, + -- ["item:79253:0:0:0:0:0:0"] = { -- Misty Pigment (Starlight Ink) + -- ["item:72237:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:72234:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:79010:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:72235:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:79011:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:89639:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- }, + -- ["item:43106:0:0:0:0:0:0"] = { -- Ruby Pigment (Fiery Ink) + -- ["item:4625:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:8838:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:8831:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:8845:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:8846:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:8839:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- }, + -- ["item:43107:0:0:0:0:0:0"] = { -- Sapphire Pigment (Ink of the Sky) + -- ["item:13463:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:13464:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:13465:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:13466:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:13467:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- }, + -- ["item:43103:0:0:0:0:0:0"] = { -- Verdant Pigment (Hunter's Ink) + -- ["item:2453:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:3820:0:0:0:0:0:0"] = {rate=.1, source="mill"}, + -- ["item:2450:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:785:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- ["item:2452:0:0:0:0:0:0"] = {rate=.05, source="mill"}, + -- }, - --Vanilla Gems - ["item:774:0:0:0:0:0:0"] = { -- malachite - ["item:2770:0:0:0:0:0:0"] = {rate=.5, source="prospect"}, - }, - ["item:818:0:0:0:0:0:0"] = { -- Tigerseye - ["item:2770:0:0:0:0:0:0"] = {rate=.5, source="prospect"}, - }, - ["item:1210:0:0:0:0:0:0"] = { -- Shadowgem - ["item:2771:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, - ["item:2770:0:0:0:0:0:0"] = {rate=.1, source="prospect"}, - }, - ["item:1206:0:0:0:0:0:0"] = { -- Moss Agate - ["item:2771:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, - }, - ["item:1705:0:0:0:0:0:0"] = { -- Lesser moonstone - ["item:2771:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, - ["item:2772:0:0:0:0:0:0"] = { rate=.3, source="prospect"}, - }, - ["item:1529:0:0:0:0:0:0"] = { -- Jade - ["item:2772:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, - ["item:2771:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:3864:0:0:0:0:0:0"] = { -- Citrine - ["item:2772:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, -- iron - ["item:3858:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, -- mith - ["item:2771:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, -- tin - }, - ["item:7909:0:0:0:0:0:0"] = { -- Aquamarine - ["item:3858:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, - ["item:2772:0:0:0:0:0:0"] = {rate=.05, source="prospect"}, - ["item:2771:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:7910:0:0:0:0:0:0"] = { -- Star Ruby - ["item:3858:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, - ["item:10620:0:0:0:0:0:0"] = {rate=.1, source="prospect"}, - ["item:2772:0:0:0:0:0:0"] = {rate=.05, source="prospect"}, - }, - ["item:12361:0:0:0:0:0:0"] = { -- Blue Sapphire - ["item:10620:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, - ["item:3858:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, - }, - ["item:12799:0:0:0:0:0:0"] = { -- Large Opal - ["item:10620:0:0:0:0:0:0"] = {rate =.3, source="prospect"}, -- thorium - ["item:3858:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, -- Mith - }, - ["item:12800:0:0:0:0:0:0"] = { -- Azerothian Diamond - ["item:10620:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, - ["item:3858:0:0:0:0:0:0"] = {rate=.02, source="prospect"}, - }, - ["item:12364:0:0:0:0:0:0"] = { -- Huge Emerald - ["item:10620:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, - ["item:3858:0:0:0:0:0:0"] = {rate=.02, source="prospect"}, - }, + -- --Vanilla Gems + -- ["item:774:0:0:0:0:0:0"] = { -- malachite + -- ["item:2770:0:0:0:0:0:0"] = {rate=.5, source="prospect"}, + -- }, + -- ["item:818:0:0:0:0:0:0"] = { -- Tigerseye + -- ["item:2770:0:0:0:0:0:0"] = {rate=.5, source="prospect"}, + -- }, + -- ["item:1210:0:0:0:0:0:0"] = { -- Shadowgem + -- ["item:2771:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, + -- ["item:2770:0:0:0:0:0:0"] = {rate=.1, source="prospect"}, + -- }, + -- ["item:1206:0:0:0:0:0:0"] = { -- Moss Agate + -- ["item:2771:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, + -- }, + -- ["item:1705:0:0:0:0:0:0"] = { -- Lesser moonstone + -- ["item:2771:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, + -- ["item:2772:0:0:0:0:0:0"] = { rate=.3, source="prospect"}, + -- }, + -- ["item:1529:0:0:0:0:0:0"] = { -- Jade + -- ["item:2772:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, + -- ["item:2771:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:3864:0:0:0:0:0:0"] = { -- Citrine + -- ["item:2772:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, -- iron + -- ["item:3858:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, -- mith + -- ["item:2771:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, -- tin + -- }, + -- ["item:7909:0:0:0:0:0:0"] = { -- Aquamarine + -- ["item:3858:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, + -- ["item:2772:0:0:0:0:0:0"] = {rate=.05, source="prospect"}, + -- ["item:2771:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:7910:0:0:0:0:0:0"] = { -- Star Ruby + -- ["item:3858:0:0:0:0:0:0"] = {rate=.4, source="prospect"}, + -- ["item:10620:0:0:0:0:0:0"] = {rate=.1, source="prospect"}, + -- ["item:2772:0:0:0:0:0:0"] = {rate=.05, source="prospect"}, + -- }, + -- ["item:12361:0:0:0:0:0:0"] = { -- Blue Sapphire + -- ["item:10620:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, + -- ["item:3858:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, + -- }, + -- ["item:12799:0:0:0:0:0:0"] = { -- Large Opal + -- ["item:10620:0:0:0:0:0:0"] = {rate =.3, source="prospect"}, -- thorium + -- ["item:3858:0:0:0:0:0:0"] = {rate=.03, source="prospect"}, -- Mith + -- }, + -- ["item:12800:0:0:0:0:0:0"] = { -- Azerothian Diamond + -- ["item:10620:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, + -- ["item:3858:0:0:0:0:0:0"] = {rate=.02, source="prospect"}, + -- }, + -- ["item:12364:0:0:0:0:0:0"] = { -- Huge Emerald + -- ["item:10620:0:0:0:0:0:0"] = {rate=.3, source="prospect"}, + -- ["item:3858:0:0:0:0:0:0"] = {rate=.02, source="prospect"}, + -- }, - -- uncommon gems - ["item:23117:0:0:0:0:0:0"] = { -- Azure Moonstone - ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - }, - ["item:23077:0:0:0:0:0:0"] = { -- Blood Garnet - ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - }, - ["item:23079:0:0:0:0:0:0"] = { -- Deep Peridot - ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - }, - ["item:21929:0:0:0:0:0:0"] = { -- Flame Spessarite - ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - }, - ["item:23112:0:0:0:0:0:0"] = { -- Golden Draenite - ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - }, - ["item:23107:0:0:0:0:0:0"] = { -- Shadow Draenite - ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - }, - ["item:36917:0:0:0:0:0:0"] = { -- Bloodstone - ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - }, - ["item:36923:0:0:0:0:0:0"] = { -- Chalcedony - ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - }, - ["item:36932:0:0:0:0:0:0"] = { -- Dark Jade - ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - }, - ["item:36929:0:0:0:0:0:0"] = { -- Huge Citrine - ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - }, - ["item:36926:0:0:0:0:0:0"] = { -- Shadow Crystal - ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - }, - ["item:36920:0:0:0:0:0:0"] = { -- Sun Crystal - ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, - }, + -- -- uncommon gems + -- ["item:23117:0:0:0:0:0:0"] = { -- Azure Moonstone + -- ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- }, + -- ["item:23077:0:0:0:0:0:0"] = { -- Blood Garnet + -- ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- }, + -- ["item:23079:0:0:0:0:0:0"] = { -- Deep Peridot + -- ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- }, + -- ["item:21929:0:0:0:0:0:0"] = { -- Flame Spessarite + -- ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- }, + -- ["item:23112:0:0:0:0:0:0"] = { -- Golden Draenite + -- ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- }, + -- ["item:23107:0:0:0:0:0:0"] = { -- Shadow Draenite + -- ["item:23424:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- }, + -- ["item:36917:0:0:0:0:0:0"] = { -- Bloodstone + -- ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- }, + -- ["item:36923:0:0:0:0:0:0"] = { -- Chalcedony + -- ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- }, + -- ["item:36932:0:0:0:0:0:0"] = { -- Dark Jade + -- ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- }, + -- ["item:36929:0:0:0:0:0:0"] = { -- Huge Citrine + -- ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- }, + -- ["item:36926:0:0:0:0:0:0"] = { -- Shadow Crystal + -- ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- }, + -- ["item:36920:0:0:0:0:0:0"] = { -- Sun Crystal + -- ["item:36909:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, + -- }, -- ["item:52182:0:0:0:0:0:0"] = { -- Jasper -- ["item:53038:0:0:0:0:0:0"] = {rate=.25, source="prospect"}, -- ["item:52185:0:0:0:0:0:0"] = {rate=.2, source="prospect"}, @@ -358,60 +358,60 @@ local conversions = { -- }, --Rare Gems - ["item:23440:0:0:0:0:0:0"] = { -- Dawnstone - ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:23436:0:0:0:0:0:0"] = { -- Living Ruby - ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:23441:0:0:0:0:0:0"] = { -- Nightseye - ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:23439:0:0:0:0:0:0"] = { -- Noble Topaz - ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:23438:0:0:0:0:0:0"] = { -- Star of Elune - ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:23437:0:0:0:0:0:0"] = { -- Talasite - ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:36921:0:0:0:0:0:0"] = { -- Autumn's Glow - ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:36933:0:0:0:0:0:0"] = { -- Forest Emerald - ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:36930:0:0:0:0:0:0"] = { -- Monarch Topaz - ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:36918:0:0:0:0:0:0"] = { -- Scarlet Ruby - ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:36924:0:0:0:0:0:0"] = { -- Sky Sapphire - ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, - ["item:36927:0:0:0:0:0:0"] = { -- Twilight Opal - ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, - ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, - }, + -- ["item:23440:0:0:0:0:0:0"] = { -- Dawnstone + -- ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:23436:0:0:0:0:0:0"] = { -- Living Ruby + -- ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:23441:0:0:0:0:0:0"] = { -- Nightseye + -- ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:23439:0:0:0:0:0:0"] = { -- Noble Topaz + -- ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:23438:0:0:0:0:0:0"] = { -- Star of Elune + -- ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:23437:0:0:0:0:0:0"] = { -- Talasite + -- ["item:23424:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:23425:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:36921:0:0:0:0:0:0"] = { -- Autumn's Glow + -- ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:36933:0:0:0:0:0:0"] = { -- Forest Emerald + -- ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:36930:0:0:0:0:0:0"] = { -- Monarch Topaz + -- ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:36918:0:0:0:0:0:0"] = { -- Scarlet Ruby + -- ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:36924:0:0:0:0:0:0"] = { -- Sky Sapphire + -- ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, + -- ["item:36927:0:0:0:0:0:0"] = { -- Twilight Opal + -- ["item:36909:0:0:0:0:0:0"] = {rate=.01, source="prospect"}, + -- ["item:36912:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- ["item:36910:0:0:0:0:0:0"] = {rate=.04, source="prospect"}, + -- }, -- ["item:52192:0:0:0:0:0:0"] = { -- Dream Emerald -- ["item:53038:0:0:0:0:0:0"] = {rate=.08, source="prospect"}, -- ["item:52185:0:0:0:0:0:0"] = {rate=.05, source="prospect"},