Asa@59: local addonName, addonTable = ...; Asa@59: local ItemAuditor = _G[addonName] Asa@59: Asa@59: local AceGUI = LibStub("AceGUI-3.0") Asa@59: local ScrollingTable = LibStub("ScrollingTable") Asa@59: Asa@59: local validateMoney = ItemAuditor.validateMoney Asa@59: local parseMoney = ItemAuditor.parseMoney Asa@59: Asa@59: local realData = {} Asa@59: Asa@59: local function displayMoney(rowFrame, cellFrame, data, cols, row, realrow, column, fShow, table, ...) Asa@59: if fShow == true then Asa@59: local money = data[realrow][column] Asa@59: if money then Asa@59: cellFrame.text:SetText(ItemAuditor:FormatMoney(tonumber(money))) Asa@59: else Asa@59: cellFrame.text:SetText("") Asa@59: end Asa@59: Asa@59: end Asa@59: end Asa@59: Asa@59: local craftingCols = { Asa@59: { name= "Item", width = 200, defaultsort = "desc", Asa@59: ['DoCellUpdate'] = function(rowFrame, cellFrame, data, cols, row, realrow, column, fShow, table, ...) Asa@59: if fShow == true then Asa@59: local data = realData[realrow] Asa@59: cellFrame.text:SetText(data.link) Asa@59: end Asa@59: end, Asa@59: }, Asa@59: { name= "Cost Each", width = 100, align = "RIGHT", Asa@59: ['DoCellUpdate'] = displayMoney, Asa@59: }, Asa@59: { name= "Est Sale Each", width = 100, align = "RIGHT", Asa@59: ['DoCellUpdate'] = displayMoney, Asa@59: }, Asa@59: { name= "Decided By", width = 100, align = "RIGHT", Asa@59: Asa@59: }, Asa@59: { name= "craft", width = 50, align = "RIGHT", Asa@59: Asa@59: }, Asa@59: { name= "Total Profit", width = 100, align = "RIGHT", Asa@59: ['DoCellUpdate'] = displayMoney, Asa@59: }, Asa@59: } Asa@59: Asa@59: local function ExportToSkillet() Asa@59: local index = 1 Asa@59: local data = ItemAuditor:GetCraftingRow(index) Asa@59: while data do Asa@59: local skillString = select(3, string.find(data.recipeLink, "^|%x+|H(.+)|h%[.+%]")) Asa@59: local _, skillId = strsplit(":", skillString) Asa@59: Asa@59: ItemAuditor:AddToQueue(skillId,tradeSkillIndex, data.queue) Asa@59: Asa@59: local data = ItemAuditor:GetCraftingRow(index) Asa@59: end Asa@59: end Asa@59: Asa@59: local craftingContent = false Asa@59: local craftingTable = false Asa@59: local function ShowCrafting(container) Asa@59: if craftingContent == false then Asa@59: local window = container.frame Asa@59: craftingContent = CreateFrame("Frame",nil,window) Asa@59: craftingContent:SetBackdropColor(0, 0, 1, 0.5) Asa@59: craftingContent:SetBackdropBorderColor(1, 0, 0, 1) Asa@59: Asa@59: craftingContent:SetPoint("TOPLEFT", window, 10, -50) Asa@59: craftingContent:SetPoint("BOTTOMRIGHT",window, -10, 10) Asa@59: Asa@59: craftingTable = ScrollingTable:CreateST(craftingCols, 22, nil, nil, craftingContent ) Asa@59: Asa@59: IAcc = craftingContent Asa@59: IAccWindow = window Asa@59: craftingTable.frame:SetPoint("TOPLEFT",craftingContent, 0,0) Asa@59: craftingTable.frame:SetPoint("BOTTOMRIGHT", craftingContent, 0, 30) Asa@59: Asa@59: craftingTable:RegisterEvents({ Asa@59: ["OnEnter"] = function (rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...) Asa@59: if realrow then Asa@59: local data = realData[realrow] Asa@59: Asa@59: GameTooltip:SetOwner(rowFrame, "ANCHOR_CURSOR") Asa@59: GameTooltip:SetHyperlink(data.link) Asa@59: GameTooltip:Show() Asa@59: end Asa@59: end, Asa@59: ["OnLeave"] = function (rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...) Asa@59: GameTooltip:Hide() Asa@59: end, Asa@59: }); Asa@59: Asa@59: Asa@59: btnProcess = CreateFrame("Button", nil, craftingContent, "UIPanelButtonTemplate") Asa@59: btnProcess:SetText("Process") Asa@59: btnProcess:SetSize(100, 25) Asa@59: btnProcess:SetPoint("BOTTOMRIGHT", craftingContent, 0, 0) Asa@59: btnProcess:RegisterForClicks("LeftButtonUp"); Asa@59: btnProcess:SetScript("OnClick", function (self, button, down) Asa@59: local data = ItemAuditor:GetCraftingRow(1) Asa@59: ItemAuditor:Print('Crafting %sx%s', data.link, data.queue) Asa@59: DoTradeSkill(data.tradeSkillIndex, data.queue) Asa@59: end) Asa@59: Asa@59: btnProcess:SetScript("OnEnter", function() Asa@59: local data = ItemAuditor:GetCraftingRow(1) Asa@59: if data then Asa@59: GameTooltip:SetOwner(this, "ANCHOR_CURSOR") Asa@59: GameTooltip:SetText(format('Create %sx%s', data.link, data.queue)) Asa@59: GameTooltip:Show() Asa@59: end Asa@59: end) Asa@59: Asa@59: btnProcess:SetScript("OnLeave", function() Asa@59: GameTooltip:Hide() Asa@59: end) Asa@59: Asa@59: btnSkillet = CreateFrame("Button", nil, craftingContent, "UIPanelButtonTemplate") Asa@59: btnSkillet:SetText("Queue in Skillet") Asa@59: btnSkillet:SetSize(125, 25) Asa@59: btnSkillet:SetPoint("BOTTOMRIGHT", btnProcess, 'BOTTOMLEFT', 0, 0) Asa@59: btnSkillet:RegisterForClicks("LeftButtonUp"); Asa@59: btnSkillet:SetScript("OnClick", function (self, button, down) Asa@59: ExportToSkillet() Asa@59: end) Asa@59: Asa@59: end Asa@59: craftingContent:Show() Asa@59: Asa@59: if container.parent then Asa@59: local width = 80 Asa@59: for i, data in pairs(craftingCols) do Asa@59: width = width + data.width Asa@59: end Asa@59: container.parent:SetWidth(width); Asa@59: end Asa@59: Asa@59: ItemAuditor:RegisterEvent("TRADE_SKILL_SHOW", function() Asa@59: if craftingContent and craftingContent:IsVisible() then Asa@59: ItemAuditor:UpdateCraftingTable() Asa@59: end Asa@59: end) Asa@59: ItemAuditor:UpdateCraftingTable() Asa@59: Asa@59: return craftingContent Asa@59: end Asa@59: Asa@59: Asa@59: Asa@59: ItemAuditor:RegisterTab('Crafting', 'tab_crafting', ShowCrafting) Asa@59: function ItemAuditor:DisplayCrafting() Asa@59: self:CreateFrame('tab_crafting') Asa@59: end Asa@59: Asa@59: local craftingDeciders = {} Asa@59: Asa@59: function ItemAuditor:RegisterCraftingDecider(name, decider) Asa@59: craftingDeciders[name] = decider Asa@59: end Asa@59: Asa@59: local lastWinnder = "" Asa@59: local function Decide(data) Asa@59: local newDecision = 0 Asa@59: for name, decider in pairs(craftingDeciders) do Asa@59: if name ~= lastWinner then Asa@59: newDecision = decider(data) Asa@59: if newDecision > data.queue then Asa@59: data.queue = newDecision Asa@59: lastWinner = name Asa@59: return Decide(data) Asa@59: elseif newDecision < 0 then Asa@59: lastWinner = "" Asa@59: return 'VETO: '..name, 0 Asa@59: end Asa@59: end Asa@59: end Asa@59: Asa@59: winner = lastWinner Asa@59: lastWinner = "" Asa@59: Asa@59: return winner, data.queue Asa@59: end Asa@59: Asa@59: local function isProfitable(data) Asa@59: if data.profit > 0 and data.profit > ItemAuditor:GetCraftingThreshold() then Asa@59: return 1 Asa@59: end Asa@59: return -1 Asa@59: end Asa@59: ItemAuditor:RegisterCraftingDecider('Is Profitable', isProfitable) Asa@59: Asa@59: local function tableFilter(self, row, ...) Asa@59: -- column 5 is how many should be crafted Asa@59: return row[5] > 0 Asa@59: end Asa@59: Asa@59: local tableData = {} Asa@59: function ItemAuditor:UpdateCraftingTable() Asa@59: if LSW == nil then Asa@59: self:Print("This feature requires LilSparky's Workshop.") Asa@59: return Asa@59: end Asa@59: if Skillet == nil then Asa@59: self:Print("This feature requires Skillet.") Asa@59: return Asa@59: end Asa@59: if GetAuctionBuyout ~= nil then Asa@59: elseif AucAdvanced and AucAdvanced.Version then Asa@59: else Asa@59: self:Print("This feature requires Auctionator, Auctioneer, AuctionLite, or AuctionMaster.") Asa@59: return Asa@59: end Asa@59: wipe(realData) Asa@59: wipe(tableData) Asa@59: Asa@59: local profitableItems = {} Asa@59: local profitableIndex = 1 Asa@59: local numChecked = 0 Asa@59: local row = 1 Asa@59: Asa@59: for i = 1, GetNumTradeSkills() do Asa@59: local itemLink = GetTradeSkillItemLink(i) Asa@59: local itemId = Skillet:GetItemIDFromLink(itemLink) Asa@59: Asa@59: --Figure out if its an enchant or not Asa@59: _, _, _, _, altVerb = GetTradeSkillInfo(i) Asa@59: if LSW.scrollData[itemId] ~= nil and altVerb == 'Enchant' then Asa@59: -- Ask LSW for the correct scroll Asa@59: itemId = LSW.scrollData[itemId]["scrollID"] Asa@59: end Asa@59: Asa@59: local recipeLink = GetTradeSkillRecipeLink(i) Asa@59: local stackSize = 1 Asa@59: if recipeLink ~= nil and itemId ~= nil then Asa@59: local skillName, skillType, numAvailable, isExpanded, altVerb = GetTradeSkillInfo(i) Asa@59: local itemName, itemLink= GetItemInfo(itemId) Asa@59: Asa@59: local count = Altoholic:GetItemCount(itemId) Asa@59: local reagents = {} Asa@59: local totalCost = 0 Asa@59: for reagentId = 1, GetTradeSkillNumReagents(i) do Asa@59: local reagentName, _, reagentCount = GetTradeSkillReagentInfo(i, reagentId); Asa@59: local reagentLink = GetTradeSkillReagentItemLink(i, reagentId) Asa@59: Asa@59: reagents[reagentId] = { Asa@59: name = reagentName, Asa@59: count = reagentCount, Asa@59: price = self:GetReagentCost(reagentLink, reagentCount), Asa@59: } Asa@59: totalCost = totalCost + self:GetReagentCost(reagentLink, reagentCount) Asa@59: end Asa@59: Asa@59: local data = { Asa@59: recipeLink = recipeLink, Asa@59: link = itemLink, Asa@59: name = itemName, Asa@59: count = count, Asa@59: price = (self:GetAuctionPrice(itemLink) or 0), Asa@59: cost = totalCost, Asa@59: profit = (self:GetAuctionPrice(itemLink) or 0) - totalCost, Asa@59: reagents = reagents, Asa@59: count = count, Asa@59: tradeSkillIndex = i, Asa@59: queue = 0, Asa@59: winner = "", Asa@59: } Asa@59: Asa@59: data.winner, data.queue = Decide(data) Asa@59: data.queue = data.queue - count Asa@59: Asa@59: -- If a tradeskill makes 5 at a time and something asks for 9, we should only Asa@59: -- craft twice to get 10. Asa@59: data.queue = ceil(data.queue / GetTradeSkillNumMade(i)) Asa@59: Asa@59: realData[row] = data Asa@59: row = row + 1 Asa@59: end Asa@59: end Asa@59: table.sort(realData, function(a, b) return a.profit*a.queue > b.profit*b.queue end) Asa@59: for key, data in pairs(realData) do Asa@59: tableData[key] = { Asa@59: data.name, Asa@59: data.cost, Asa@59: data.price, Asa@59: data.winner, Asa@59: data.queue, Asa@59: data.profit*data.queue, Asa@59: } Asa@59: end Asa@59: Asa@59: craftingTable:SetData(tableData, true) Asa@59: craftingTable:SetFilter(tableFilter) Asa@59: end Asa@59: Asa@59: function ItemAuditor:GetCraftingRow(row) Asa@59: if craftingTable then Asa@59: for _, index in pairs(craftingTable.sorttable) do Asa@59: local tableRow = tableData[index] Asa@59: if tableFilter(nil, tableRow) then Asa@59: row = row - 1 Asa@59: if row == 0 then Asa@59: return realData[index] Asa@59: end Asa@59: end Asa@59: end Asa@59: elseif realData then Asa@59: return realData[row] Asa@59: end Asa@59: return nil Asa@59: end