comparison Modules/Crafting.lua @ 124:060d1c45afab

[mq]: Vellums
author Asa Ayers <Asa.Ayers@Gmail.com>
date Thu, 02 Sep 2010 22:22:51 -0700
parents 4aa521a2a7e7
children e8d3c299542c
comparison
equal deleted inserted replaced
123:4aa521a2a7e7 124:060d1c45afab
1 local ItemAuditor = select(2, ...) 1 local ItemAuditor = select(2, ...)
2 local Crafting = ItemAuditor:NewModule("Crafting") 2 local Crafting = ItemAuditor:NewModule("Crafting", 'AceEvent-3.0')
3 3
4 local Utils = ItemAuditor:GetModule("Utils") 4 local Utils = ItemAuditor:GetModule("Utils")
5 5
6 local AceGUI = LibStub("AceGUI-3.0") 6 local AceGUI = LibStub("AceGUI-3.0")
7 local ScrollingTable = LibStub("ScrollingTable") 7 local ScrollingTable = LibStub("ScrollingTable")
9 local validateMoney = ItemAuditor.validateMoney 9 local validateMoney = ItemAuditor.validateMoney
10 local parseMoney = ItemAuditor.parseMoney 10 local parseMoney = ItemAuditor.parseMoney
11 11
12 local realData = {} 12 local realData = {}
13 13
14 local vellumLevelMap = {
15 [38682] = 37602, -- Armor Vellum => Armor Vellum II
16 [37602] = 43145, -- Armor Vellum II => Armor Vellum III
17 [39349] = 39350, -- Weapon Vellum => Weapon Vellum II
18 [39350] = 43146, -- Weapon Vellum II => Weapon Vellum III
19 }
14 20
15 local queueDestinations = {} 21 local queueDestinations = {}
16 local displayCraftingDestinations = {} 22 local displayCraftingDestinations = {}
17 function Crafting.RegisterQueueDestination(name, destination) 23 function Crafting.RegisterQueueDestination(name, destination)
18 queueDestinations[name] = destination 24 queueDestinations[name] = destination
236 GameTooltip:SetOwner(this, "ANCHOR_CURSOR") 242 GameTooltip:SetOwner(this, "ANCHOR_CURSOR")
237 GameTooltip:SetText(format('Create %sx%s', data.link, data.queue)) 243 GameTooltip:SetText(format('Create %sx%s', data.link, data.queue))
238 GameTooltip:Show() 244 GameTooltip:Show()
239 end 245 end
240 end 246 end
247
248 --[[
249 When enchanting UseContainerItem seems to be protected, so the enchants
250 have to be done one at a time.
251 ]]
252 local function useVellum(vellumID, idealVellum)
253 for bagID = 0, NUM_BAG_SLOTS do
254 for slotID = 0, GetContainerNumSlots(bagID) do
255 local link = GetContainerItemLink(bagID, slotID)
256 local id = Utils.GetItemID(link);
257 if id == vellumID then
258 if idealVellum then
259 ItemAuditor:Print("Using %s instead of %s.",
260 select(2, GetItemInfo(vellumID)),
261 select(2, GetItemInfo(idealVellum))
262 )
263 end
264 UseContainerItem(bagID, slotID)
265 return
266 end
267 end
268 end
269 if vellumLevelMap[vellumID] then
270 return useVellum(vellumLevelMap[vellumID], idealVellum or vellumID)
271 end
272 end
273
241 btnProcess:SetScript("OnClick", function (self, button, down) 274 btnProcess:SetScript("OnClick", function (self, button, down)
242 local data = ItemAuditor:GetCraftingRow(1) 275 local data = ItemAuditor:GetCraftingRow(1)
243 if data then 276 if data then
244 ItemAuditor:Print('Crafting %sx%s', data.link, data.queue) 277 local queue = data.queue
245 DoTradeSkill(data.tradeSkillIndex, data.queue) 278 local vellumID = nil
246 data.queue = 0 279 _, _, _, _, altVerb = GetTradeSkillInfo(data.tradeSkillIndex)
280 if altVerb == 'Enchant' and LSW.scrollData[data.recipeID] ~= nil then
281 vellumID = LSW.scrollData[data.recipeID]["vellumID"]
282 queue = 1
283 end
284 ItemAuditor:Print('Crafting %sx%s', data.link, queue)
285 DoTradeSkill(data.tradeSkillIndex, queue)
286 if vellumID then
287 useVellum(vellumID)
288 end
289
290 data.queue = data.queue - queue
247 ItemAuditor:RefreshCraftingTable() 291 ItemAuditor:RefreshCraftingTable()
248 UpdateProcessTooltip() 292 UpdateProcessTooltip()
249 end 293 end
250 end) 294 end)
251 295
285 end) 329 end)
286 ItemAuditor:UpdateCraftingTable() 330 ItemAuditor:UpdateCraftingTable()
287 331
288 return craftingContent 332 return craftingContent
289 end 333 end
290
291
292 334
293 ItemAuditor:RegisterTab('Crafting', 'tab_crafting', ShowCrafting) 335 ItemAuditor:RegisterTab('Crafting', 'tab_crafting', ShowCrafting)
294 function ItemAuditor:DisplayCrafting() 336 function ItemAuditor:DisplayCrafting()
295 self:CreateFrame('tab_crafting') 337 self:CreateFrame('tab_crafting')
296 end 338 end
399 local row = 1 441 local row = 1
400 442
401 for i = 1, GetNumTradeSkills() do 443 for i = 1, GetNumTradeSkills() do
402 local itemLink = GetTradeSkillItemLink(i) 444 local itemLink = GetTradeSkillItemLink(i)
403 local itemId = Utils.GetItemID(itemLink) 445 local itemId = Utils.GetItemID(itemLink)
446 local vellumID = nil
404 447
405 --Figure out if its an enchant or not 448 --Figure out if its an enchant or not
406 _, _, _, _, altVerb = GetTradeSkillInfo(i) 449 _, _, _, _, altVerb = GetTradeSkillInfo(i)
407 if LSW.scrollData[itemId] ~= nil and altVerb == 'Enchant' then 450 if LSW.scrollData[itemId] ~= nil and altVerb == 'Enchant' then
408 -- Ask LSW for the correct scroll 451 -- Ask LSW for the correct scroll
409 itemId = LSW.scrollData[itemId]["scrollID"] 452 local sd = LSW.scrollData[itemId]
453 itemId = sd.scrollID
454 vellumID = sd.vellumID
410 end 455 end
411 456
412 local recipeLink = GetTradeSkillRecipeLink(i) 457 local recipeLink = GetTradeSkillRecipeLink(i)
413 local stackSize = 1 458 local stackSize = 1
414 if recipeLink ~= nil and itemId ~= nil then 459 if recipeLink ~= nil and itemId ~= nil then
425 local reagentLink = GetTradeSkillReagentItemLink(i, reagentId) 470 local reagentLink = GetTradeSkillReagentItemLink(i, reagentId)
426 local reagentTotalCost = self:GetReagentCost(reagentLink, reagentCount) 471 local reagentTotalCost = self:GetReagentCost(reagentLink, reagentCount)
427 472
428 reagents[reagentId] = { 473 reagents[reagentId] = {
429 link = reagentLink, 474 link = reagentLink,
475 itemID = Utils.GetItemID(reagentLink),
430 name = reagentName, 476 name = reagentName,
431 count = reagentCount, 477 count = reagentCount,
432 price = reagentTotalCost / reagentCount, 478 price = reagentTotalCost / reagentCount,
433 need = 0, -- This will get populated after the decisions have been made. it can't 479 need = 0, -- This will get populated after the decisions have been made. it can't
434 -- be done before that because highest profit items get priority on materials. 480 -- be done before that because highest profit items get priority on materials.
435 } 481 }
436 totalCost = totalCost + reagentTotalCost 482 totalCost = totalCost + reagentTotalCost
483 end
484 if vellumID then
485 reagentId = GetTradeSkillNumReagents(i) + 1
486 local reagentName, reagentLink = GetItemInfo(vellumID)
487 reagents[reagentId] = {
488 link = reagentLink,
489 itemID = vellumID,
490 name = reagentName,
491 count = 1,
492 price = self:GetReagentCost(reagentLink, 1),
493 need = 0, -- This will get populated after the decisions have been made. it can't
494 -- be done before that because highest profit items get priority on materials.
495 }
496 totalCost = totalCost + self:GetReagentCost(reagentLink, 1)
437 end 497 end
438 498
439 local price = (self:GetAuctionPrice(itemLink) or 0) 499 local price = (self:GetAuctionPrice(itemLink) or 0)
440 totalCost = totalCost + (price * ItemAuditor:GetAHCut()) 500 totalCost = totalCost + (price * ItemAuditor:GetAHCut())
441 local data = { 501 local data = {
473 end 533 end
474 end 534 end
475 table.sort(realData, function(a, b) return a.profit*max(1, a.queue) > b.profit*max(1, b.queue) end) 535 table.sort(realData, function(a, b) return a.profit*max(1, a.queue) > b.profit*max(1, b.queue) end)
476 536
477 local numOwned = {} 537 local numOwned = {}
538
478 for key, data in pairs(realData) do 539 for key, data in pairs(realData) do
479 data.haveMaterials = true 540 data.haveMaterials = true
480 for id, reagent in pairs(data.reagents) do 541 for id, reagent in pairs(data.reagents) do
481 reagent.count = reagent.count * data.queue 542 reagent.count = reagent.count * data.queue
482 543
483 if not numOwned[reagent.link] then 544 if not numOwned[reagent.link] then
484 numOwned[reagent.link] = ItemAuditor:GetItemCount(ItemAuditor:GetIDFromLink(reagent.link)) 545 numOwned[reagent.link] = ItemAuditor:GetItemCount(ItemAuditor:GetIDFromLink(reagent.link))
485 end 546 end
486 numOwned[reagent.link] = numOwned[reagent.link] - reagent.count 547 numOwned[reagent.link] = numOwned[reagent.link] - reagent.count
487 548
488 if numOwned[reagent.link] < 0 then 549 -- Vellums count in cost, but not against whether or not you have the mats.
550 -- I chose to do it this way because you can use a higher level of vellum
551 -- and I'm not sure the best way to determine cost and materials in that situation.
552 if numOwned[reagent.link] < 0 and not vellumLevelMap[reagent.itemID] then
489 data.haveMaterials = false 553 data.haveMaterials = false
490 reagent.need = min(reagent.count, abs(numOwned[reagent.link])) 554 reagent.need = min(reagent.count, abs(numOwned[reagent.link]))
491 end 555 end
492 end 556 end
493 end 557 end