comparison Modules/Crafting.lua @ 59:4ec321eb0dfe

Adding a crafing tab to the ItemAuditor window.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Sun, 25 Jul 2010 15:51:13 -0700
parents
children 069f39f62104
comparison
equal deleted inserted replaced
58:bdf3aba93aa9 59:4ec321eb0dfe
1 local addonName, addonTable = ...;
2 local ItemAuditor = _G[addonName]
3
4 local AceGUI = LibStub("AceGUI-3.0")
5 local ScrollingTable = LibStub("ScrollingTable")
6
7 local validateMoney = ItemAuditor.validateMoney
8 local parseMoney = ItemAuditor.parseMoney
9
10 local realData = {}
11
12 local function displayMoney(rowFrame, cellFrame, data, cols, row, realrow, column, fShow, table, ...)
13 if fShow == true then
14 local money = data[realrow][column]
15 if money then
16 cellFrame.text:SetText(ItemAuditor:FormatMoney(tonumber(money)))
17 else
18 cellFrame.text:SetText("")
19 end
20
21 end
22 end
23
24 local craftingCols = {
25 { name= "Item", width = 200, defaultsort = "desc",
26 ['DoCellUpdate'] = function(rowFrame, cellFrame, data, cols, row, realrow, column, fShow, table, ...)
27 if fShow == true then
28 local data = realData[realrow]
29 cellFrame.text:SetText(data.link)
30 end
31 end,
32 },
33 { name= "Cost Each", width = 100, align = "RIGHT",
34 ['DoCellUpdate'] = displayMoney,
35 },
36 { name= "Est Sale Each", width = 100, align = "RIGHT",
37 ['DoCellUpdate'] = displayMoney,
38 },
39 { name= "Decided By", width = 100, align = "RIGHT",
40
41 },
42 { name= "craft", width = 50, align = "RIGHT",
43
44 },
45 { name= "Total Profit", width = 100, align = "RIGHT",
46 ['DoCellUpdate'] = displayMoney,
47 },
48 }
49
50 local function ExportToSkillet()
51 local index = 1
52 local data = ItemAuditor:GetCraftingRow(index)
53 while data do
54 local skillString = select(3, string.find(data.recipeLink, "^|%x+|H(.+)|h%[.+%]"))
55 local _, skillId = strsplit(":", skillString)
56
57 ItemAuditor:AddToQueue(skillId,tradeSkillIndex, data.queue)
58
59 local data = ItemAuditor:GetCraftingRow(index)
60 end
61 end
62
63 local craftingContent = false
64 local craftingTable = false
65 local function ShowCrafting(container)
66 if craftingContent == false then
67 local window = container.frame
68 craftingContent = CreateFrame("Frame",nil,window)
69 craftingContent:SetBackdropColor(0, 0, 1, 0.5)
70 craftingContent:SetBackdropBorderColor(1, 0, 0, 1)
71
72 craftingContent:SetPoint("TOPLEFT", window, 10, -50)
73 craftingContent:SetPoint("BOTTOMRIGHT",window, -10, 10)
74
75 craftingTable = ScrollingTable:CreateST(craftingCols, 22, nil, nil, craftingContent )
76
77 IAcc = craftingContent
78 IAccWindow = window
79 craftingTable.frame:SetPoint("TOPLEFT",craftingContent, 0,0)
80 craftingTable.frame:SetPoint("BOTTOMRIGHT", craftingContent, 0, 30)
81
82 craftingTable:RegisterEvents({
83 ["OnEnter"] = function (rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...)
84 if realrow then
85 local data = realData[realrow]
86
87 GameTooltip:SetOwner(rowFrame, "ANCHOR_CURSOR")
88 GameTooltip:SetHyperlink(data.link)
89 GameTooltip:Show()
90 end
91 end,
92 ["OnLeave"] = function (rowFrame, cellFrame, data, cols, row, realrow, column, scrollingTable, ...)
93 GameTooltip:Hide()
94 end,
95 });
96
97
98 btnProcess = CreateFrame("Button", nil, craftingContent, "UIPanelButtonTemplate")
99 btnProcess:SetText("Process")
100 btnProcess:SetSize(100, 25)
101 btnProcess:SetPoint("BOTTOMRIGHT", craftingContent, 0, 0)
102 btnProcess:RegisterForClicks("LeftButtonUp");
103 btnProcess:SetScript("OnClick", function (self, button, down)
104 local data = ItemAuditor:GetCraftingRow(1)
105 ItemAuditor:Print('Crafting %sx%s', data.link, data.queue)
106 DoTradeSkill(data.tradeSkillIndex, data.queue)
107 end)
108
109 btnProcess:SetScript("OnEnter", function()
110 local data = ItemAuditor:GetCraftingRow(1)
111 if data then
112 GameTooltip:SetOwner(this, "ANCHOR_CURSOR")
113 GameTooltip:SetText(format('Create %sx%s', data.link, data.queue))
114 GameTooltip:Show()
115 end
116 end)
117
118 btnProcess:SetScript("OnLeave", function()
119 GameTooltip:Hide()
120 end)
121
122 btnSkillet = CreateFrame("Button", nil, craftingContent, "UIPanelButtonTemplate")
123 btnSkillet:SetText("Queue in Skillet")
124 btnSkillet:SetSize(125, 25)
125 btnSkillet:SetPoint("BOTTOMRIGHT", btnProcess, 'BOTTOMLEFT', 0, 0)
126 btnSkillet:RegisterForClicks("LeftButtonUp");
127 btnSkillet:SetScript("OnClick", function (self, button, down)
128 ExportToSkillet()
129 end)
130
131 end
132 craftingContent:Show()
133
134 if container.parent then
135 local width = 80
136 for i, data in pairs(craftingCols) do
137 width = width + data.width
138 end
139 container.parent:SetWidth(width);
140 end
141
142 ItemAuditor:RegisterEvent("TRADE_SKILL_SHOW", function()
143 if craftingContent and craftingContent:IsVisible() then
144 ItemAuditor:UpdateCraftingTable()
145 end
146 end)
147 ItemAuditor:UpdateCraftingTable()
148
149 return craftingContent
150 end
151
152
153
154 ItemAuditor:RegisterTab('Crafting', 'tab_crafting', ShowCrafting)
155 function ItemAuditor:DisplayCrafting()
156 self:CreateFrame('tab_crafting')
157 end
158
159 local craftingDeciders = {}
160
161 function ItemAuditor:RegisterCraftingDecider(name, decider)
162 craftingDeciders[name] = decider
163 end
164
165 local lastWinnder = ""
166 local function Decide(data)
167 local newDecision = 0
168 for name, decider in pairs(craftingDeciders) do
169 if name ~= lastWinner then
170 newDecision = decider(data)
171 if newDecision > data.queue then
172 data.queue = newDecision
173 lastWinner = name
174 return Decide(data)
175 elseif newDecision < 0 then
176 lastWinner = ""
177 return 'VETO: '..name, 0
178 end
179 end
180 end
181
182 winner = lastWinner
183 lastWinner = ""
184
185 return winner, data.queue
186 end
187
188 local function isProfitable(data)
189 if data.profit > 0 and data.profit > ItemAuditor:GetCraftingThreshold() then
190 return 1
191 end
192 return -1
193 end
194 ItemAuditor:RegisterCraftingDecider('Is Profitable', isProfitable)
195
196 local function tableFilter(self, row, ...)
197 -- column 5 is how many should be crafted
198 return row[5] > 0
199 end
200
201 local tableData = {}
202 function ItemAuditor:UpdateCraftingTable()
203 if LSW == nil then
204 self:Print("This feature requires LilSparky's Workshop.")
205 return
206 end
207 if Skillet == nil then
208 self:Print("This feature requires Skillet.")
209 return
210 end
211 if GetAuctionBuyout ~= nil then
212 elseif AucAdvanced and AucAdvanced.Version then
213 else
214 self:Print("This feature requires Auctionator, Auctioneer, AuctionLite, or AuctionMaster.")
215 return
216 end
217 wipe(realData)
218 wipe(tableData)
219
220 local profitableItems = {}
221 local profitableIndex = 1
222 local numChecked = 0
223 local row = 1
224
225 for i = 1, GetNumTradeSkills() do
226 local itemLink = GetTradeSkillItemLink(i)
227 local itemId = Skillet:GetItemIDFromLink(itemLink)
228
229 --Figure out if its an enchant or not
230 _, _, _, _, altVerb = GetTradeSkillInfo(i)
231 if LSW.scrollData[itemId] ~= nil and altVerb == 'Enchant' then
232 -- Ask LSW for the correct scroll
233 itemId = LSW.scrollData[itemId]["scrollID"]
234 end
235
236 local recipeLink = GetTradeSkillRecipeLink(i)
237 local stackSize = 1
238 if recipeLink ~= nil and itemId ~= nil then
239 local skillName, skillType, numAvailable, isExpanded, altVerb = GetTradeSkillInfo(i)
240 local itemName, itemLink= GetItemInfo(itemId)
241
242 local count = Altoholic:GetItemCount(itemId)
243 local reagents = {}
244 local totalCost = 0
245 for reagentId = 1, GetTradeSkillNumReagents(i) do
246 local reagentName, _, reagentCount = GetTradeSkillReagentInfo(i, reagentId);
247 local reagentLink = GetTradeSkillReagentItemLink(i, reagentId)
248
249 reagents[reagentId] = {
250 name = reagentName,
251 count = reagentCount,
252 price = self:GetReagentCost(reagentLink, reagentCount),
253 }
254 totalCost = totalCost + self:GetReagentCost(reagentLink, reagentCount)
255 end
256
257 local data = {
258 recipeLink = recipeLink,
259 link = itemLink,
260 name = itemName,
261 count = count,
262 price = (self:GetAuctionPrice(itemLink) or 0),
263 cost = totalCost,
264 profit = (self:GetAuctionPrice(itemLink) or 0) - totalCost,
265 reagents = reagents,
266 count = count,
267 tradeSkillIndex = i,
268 queue = 0,
269 winner = "",
270 }
271
272 data.winner, data.queue = Decide(data)
273 data.queue = data.queue - count
274
275 -- If a tradeskill makes 5 at a time and something asks for 9, we should only
276 -- craft twice to get 10.
277 data.queue = ceil(data.queue / GetTradeSkillNumMade(i))
278
279 realData[row] = data
280 row = row + 1
281 end
282 end
283 table.sort(realData, function(a, b) return a.profit*a.queue > b.profit*b.queue end)
284 for key, data in pairs(realData) do
285 tableData[key] = {
286 data.name,
287 data.cost,
288 data.price,
289 data.winner,
290 data.queue,
291 data.profit*data.queue,
292 }
293 end
294
295 craftingTable:SetData(tableData, true)
296 craftingTable:SetFilter(tableFilter)
297 end
298
299 function ItemAuditor:GetCraftingRow(row)
300 if craftingTable then
301 for _, index in pairs(craftingTable.sorttable) do
302 local tableRow = tableData[index]
303 if tableFilter(nil, tableRow) then
304 row = row - 1
305 if row == 0 then
306 return realData[index]
307 end
308 end
309 end
310 elseif realData then
311 return realData[row]
312 end
313 return nil
314 end