You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
8.0 KiB
208 lines
8.0 KiB
-- ------------------------------------------------------------------------------ -- |
|
-- 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 = {} } |
|
|
|
local function IsCrafterPlayer(crafter) |
|
if not crafter then return false end |
|
local player = UnitName("player") |
|
if not player then return false end |
|
if strlower(crafter) == strlower(player) then |
|
return true |
|
end |
|
local baseName = strmatch(crafter, "^[^-]+") |
|
return baseName and strlower(baseName) == strlower(player) or false |
|
end |
|
|
|
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 |
|
local crafter = TSM.db.realm.gathering.crafter |
|
|
|
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"] or (task == L["Mail Items"] and IsCrafterPlayer(crafter))) 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, true) |
|
end |
|
else |
|
TSM.Inventory.gatherItem = nil |
|
if ignoreMaxQty then |
|
TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact", ShoppingCallback, true) |
|
else |
|
TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact/x" .. need, ShoppingCallback, true) |
|
end |
|
end |
|
|
|
else |
|
TSM.Inventory.gatherItem = nil |
|
if ignoreMaxQty then |
|
TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact", ShoppingCallback, true) |
|
else |
|
TSMAPI:ModuleAPI("Shopping", "runSearch", TSMAPI:GetSafeItemInfo(itemString) .. "/exact/x" .. need, ShoppingCallback, true) |
|
end |
|
end |
|
end
|
|
|