-- ------------------------------------------------------------------------------ -- -- 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 Gather = TSM:NewModule("Gather", "AceEvent-3.0") local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Crafting") -- loads the localization table local next = next local private = { shoppingItems = {} } function Gather:BuyFromMerchant(neededMats) for i = 1, GetMerchantNumItems() do local itemString = TSMAPI:GetItemString(GetMerchantItemLink(i)) if neededMats[itemString] then local _, _, _, quantity = GetMerchantItemInfo(i) local maxStack = GetMerchantItemMaxStack(i) quantity = max(quantity or 1, 1) local toBuy = neededMats[itemString] while toBuy > 0 do local buyCount = math.ceil(toBuy / quantity) if maxStack and maxStack > 0 then buyCount = math.min(buyCount, maxStack) end BuyMerchantItem(i, buyCount) toBuy = toBuy - (buyCount * quantity) TSM.db.realm.gathering.gatheredMats = true end end end end function Gather:gatherItems(source, task) local items = TSM.db.realm.gathering.availableMats if source == L["Vendor"] then Gather:BuyFromMerchant(items) elseif source == UnitName("player") and (task == L["Visit Bank"] or task == L["Visit Guild Bank"]) then Gather:GatherBank(items) elseif source == UnitName("player") and task == L["Collect Mail"] then TSMAPI:ModuleAPI("Mailing", "collectItems", items, Gather.PrintMsg) elseif source == UnitName("player") and task == L["Mail Items"] then Gather:MailItems(items) elseif source == L["Auction House"] then if TSMAPI:AHTabIsVisible("Shopping") then private.shoppingItems = {} for itemString, quantity in pairs(items) do tinsert(private.shoppingItems, { itemString = itemString, quantity = quantity }) end Gather:ShoppingSearch(private.shoppingItems[1].itemString, private.shoppingItems[1].quantity) else TSM:Printf(L["Please switch to the Shopping Tab to perform the gathering search."]) end end end function Gather:GatherBank(moveItems) local next = next if next(moveItems) == nil then TSM:Print(L["Nothing to Gather"]) else TSM:Print(L["Gathering Crafting Mats"]) TSMAPI:MoveItems(moveItems, Gather.PrintMsg) TSM.db.realm.gathering.gatheredMats = true end end function Gather.PrintMsg(message) if message then TSM:Print(message) end end function Gather:MerchantSells(neededItem) for i = 1, GetMerchantNumItems() do local itemString = TSMAPI:GetItemString(GetMerchantItemLink(i)) if neededItem == itemString then return true end end return false end function Gather:MailItems(neededItems) local next = next if next(neededItems) == nil then TSM:Print(L["Nothing to Mail"]) else local crafter = TSM.db.realm.gathering.crafter if crafter then TSM:Print(format(L["Mailing Craft Mats to %s"], crafter)) TSMAPI:ModuleAPI("Mailing", "mailItems", neededItems, crafter, Gather.PrintMsg) TSM.db.realm.gathering.gatheredMats = true end end end local function ShoppingNextSearch() if next(private.shoppingItems) then Gather:ShoppingSearch(private.shoppingItems[1].itemString, private.shoppingItems[1].quantity) end end local function ShoppingCallback(remainingQty, boughtItem, stackSize) if not boughtItem then if next(private.shoppingItems) then local name = TSMAPI:GetSafeItemInfo(private.shoppingItems[1].itemString) TSM:Print("No Auctions found for", name) tremove(private.shoppingItems, 1) TSMAPI:CreateTimeDelay("shoppingSearchThrottle", 0.5, ShoppingNextSearch) end else TSM.Inventory.gatherQuantity = remainingQty if TSM.Inventory.gatherItem and boughtItem ~= TSM.Inventory.gatherItem then for itemString, data in pairs(TSMAPI.Conversions[TSM.Inventory.gatherItem] or {}) do if itemString == boughtItem then TSM.db.realm.gathering.destroyingMats[boughtItem] = (TSM.db.realm.gathering.destroyingMats[boughtItem] or 0) + stackSize end end end if max(TSM.Inventory.gatherQuantity, 0) == 0 and next(private.shoppingItems) then tremove(private.shoppingItems, 1) TSMAPI:CreateTimeDelay("shoppingSearchThrottle", 0.5, ShoppingNextSearch) end end end function Gather:ShoppingSearch(itemString, need, ignoreMaxQty) TSM.Inventory.gatherQuantity = nil local matPrice = TSMAPI:FormatTextMoney(TSM.Cost:GetMatCost(itemString)) if not TSM.db.realm.gathering.destroyDisable then if TSMAPI.InkConversions[itemString] then TSM.Inventory.gatherItem = itemString if TSM.db.realm.gathering.evenStacks then if ignoreMaxQty then TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/even", ShoppingCallback) else TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/even/x" .. need, ShoppingCallback) end elseif ignoreMaxQty then TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString), ShoppingCallback) else TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/x" .. need, ShoppingCallback) end elseif TSMAPI:GetDisenchantData(itemString) then TSM.Inventory.gatherItem = itemString if ignoreMaxQty then TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact", ShoppingCallback) else TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact/x" .. need, ShoppingCallback) end elseif TSMAPI.Conversions[itemString] then TSM.Inventory.gatherItem = itemString local convertSource for _, data in pairs(TSMAPI.Conversions[itemString]) do convertSource = data.source break end if convertSource == "mill" or convertSource == "prospect" then if TSM.db.realm.gathering.evenStacks then if ignoreMaxQty then TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/even", ShoppingCallback) else TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/even/x" .. need, ShoppingCallback) end elseif ignoreMaxQty then TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString), ShoppingCallback) else TSMAPI:ModuleAPI("Shopping", "runDestroySearch", TSMAPI:GetSafeItemInfo(itemString) .. "/x" .. need, ShoppingCallback) end else TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact/x" .. need, ShoppingCallback) end else TSM.Inventory.gatherItem = nil if ignoreMaxQty then TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact", ShoppingCallback) else TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact/x" .. need, ShoppingCallback) end end else TSM.Inventory.gatherItem = nil if ignoreMaxQty then TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact", ShoppingCallback) else TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact/x" .. need, ShoppingCallback) end end end