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