-- ------------------------------------------------------------------------------ -- -- 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 Cost = TSM:NewModule("Cost", "AceEvent-3.0") local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Crafting") -- loads the localization table local currentVisited = {} local cache = { time = 0 } function Cost:GetMatCost(itemString) local mat = TSM.db.realm.mats[itemString] if not mat then return end if cache.time < (time() - 1) then cache = {} cache.time = time() end if cache[itemString] then return cache[itemString] end if currentVisited[itemString] then return end currentVisited[itemString] = true local cost = TSM:GetCustomPrice(mat.customValue or TSM.db.global.defaultMatCostMethod, itemString) currentVisited[itemString] = nil cache[itemString] = cost return cost end -- gets the value of a crafted item function Cost:GetCraftValue(itemString) if type(itemString) == "number" then -- we got passed a spell if not TSM.db.realm.crafts[itemString] then return end itemString = TSM.db.realm.crafts[itemString].itemID end if type(itemString) ~= "string" then return end local operation = TSMAPI:GetItemOperation(itemString, "Crafting") TSMAPI:UpdateOperation("Crafting", operation and operation[1]) operation = operation and TSM.operations[operation[1]] local priceMethod = operation and operation.craftPriceMethod or TSM.db.global.defaultCraftPriceMethod return TSM:GetCustomPrice(priceMethod, itemString) end -- gets the cost to create this craft function Cost:GetCraftCost(itemID) local spellIDs if type(itemID) == "string" then -- we got passed an item spellIDs = TSM.craftReverseLookup[TSMAPI:GetBaseItemstring(itemID)] elseif type(itemID) == "number" then -- we got passed a spell if TSM.db.realm.crafts[itemID] then spellIDs = { itemID } end end if not spellIDs or #spellIDs == 0 then return end local lowestCost for _, spellID in ipairs(spellIDs) do local craft = TSM.db.realm.crafts[spellID] local cost, costIsValid = 0, true if #spellIDs >= 2 and TSM.db.global.ignoreCDCraftCost and TSM.db.realm.crafts[spellID].hasCD then costIsValid = false end for matID, matQuantity in pairs(craft.mats) do local matCost = Cost:GetMatCost(matID) if not matCost or matCost == 0 then costIsValid = false break end cost = cost + matQuantity * matCost end cost = floor(cost / (craft.numResult) + 0.5) --rounds to nearest gold if costIsValid then if not lowestCost or cost < lowestCost then lowestCost = cost end end end return lowestCost end -- calulates the cost, buyout, and profit for a crafted item function Cost:GetCraftPrices(itemID) if not itemID then return end local cost, buyout, profit cost = Cost:GetCraftCost(itemID) buyout = Cost:GetCraftValue(itemID) if cost and buyout then profit = floor(buyout - buyout * TSM.db.global.profitPercent - cost + 0.5) end return cost, buyout, profit end -- gets the spellID, cost, buyout, and profit for the cheapest way to craft the given item function Cost:GetLowestCraftPrices(itemString, intermediate) local spellIDs = TSM.craftReverseLookup[itemString] if not spellIDs then return end local lowestCost, cheapestSpellID local soh = "item:76061:0:0:0:0:0:0" -- Spirit of Harmony local fb = "item:800405:0:0:0:0:0:0" -- Fel Blood for _, spellID in ipairs(spellIDs) do if TSM.db.realm.crafts[spellID] then if intermediate and (TSM.db.realm.crafts[spellID].mats[soh] or TSM.db.realm.crafts[spellID].mats[fb] or TSM.db.realm.crafts[spellID].hasCD) then break end --exclude spells using SOH and FB or have cooldown from intermediate crafts local cost = Cost:GetCraftCost(spellID) if cost and (not lowestCost or cost < lowestCost) then -- exclude spells with cooldown if option to ignore is enabled or more than one way to craft and not soulbound e.g. BoE if not TSM.db.global.ignoreCDCraftCost then if TSM.db.realm.crafts[spellID].hasCD then if TSMAPI.SOULBOUND_MATS[itemString] or #spellIDs == 1 then lowestCost = cost cheapestSpellID = spellID end else lowestCost = cost cheapestSpellID = spellID end elseif not TSM.db.realm.crafts[spellID].hasCD then lowestCost = cost cheapestSpellID = spellID end end end end if not lowestCost or not cheapestSpellID then return end local profit, buyout buyout = Cost:GetCraftValue(itemString) if buyout then profit = floor(buyout - buyout * TSM.db.global.profitPercent - lowestCost + 0.5) end return cheapestSpellID, lowestCost, buyout, profit end