comparison Modules/ArtifactPower.lua @ 101:f32b63c93275

- implement caching to reduce the number of tooltip queries made for each scan prompt
author Nenue
date Sat, 21 Jan 2017 20:12:17 -0500
parents 74d6d97a2d24
children 1e511e9aaca5
comparison
equal deleted inserted replaced
100:6bf83e41b08c 101:f32b63c93275
6 6
7 local print = DEVIAN_WORKSPACE and function(...) print('VnAP', ...) end or nop 7 local print = DEVIAN_WORKSPACE and function(...) print('VnAP', ...) end or nop
8 VeneerArtifactPowerMixin = { 8 VeneerArtifactPowerMixin = {
9 numItems = 0, 9 numItems = 0,
10 Tokens = {}, 10 Tokens = {},
11 cache = {},
12 fishingCache = {},
13 scanQueue = {},
11 ItemButtons = {}, 14 ItemButtons = {},
12 anchorPoint = 'TOP', 15 anchorPoint = 'TOP',
13 anchorFrom = 'TOP', 16 anchorFrom = 'TOP',
17 }
18 local defaultSettings = {
19 firstUse = true,
20 autoHide = true,
14 } 21 }
15 local ap = VeneerArtifactPowerMixin 22 local ap = VeneerArtifactPowerMixin
16 local BAGS_TO_SCAN = {BACKPACK_CONTAINER } 23 local BAGS_TO_SCAN = {BACKPACK_CONTAINER }
17 local TOOLTIP_NAME = 'VeneerAPScanner' 24 local TOOLTIP_NAME = 'VeneerAPScanner'
18 local POINT_COSTS = { 25 local POINT_COSTS = {
80 87
81 function ap:Setup() 88 function ap:Setup()
82 print(self:GetName()..':Setup()') 89 print(self:GetName()..':Setup()')
83 local guid = UnitGUID('player') 90 local guid = UnitGUID('player')
84 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings 91 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings
85 VeneerData.ArtifactPower[guid] = VeneerData.ArtifactPower[guid] or {} 92 self.db = VeneerData.ArtifactPower
86 self.profile = VeneerData.ArtifactPower[guid] 93 self.db[guid] = self.db[guid] or {}
94 self.db.cache = self.db.cache or {}
95 self.db.fishingCache = self.db.fishingCache or {}
96
97 for i, data in pairs(self.cache) do
98 -- bring in anything found before player data is active
99 self.db.cache[i] = data
100 end
101 for i, data in pairs(self.fishingCache) do
102 self.db.fishingCache[i] = data
103 end
104
105
106 self.cache = self.db.cache
107 self.profile = self.db[guid]
87 self.profile.bagslots = self.profile.bagslots or {} 108 self.profile.bagslots = self.profile.bagslots or {}
88 self.profile.artifacts = self.profile.artifacts or {} 109 self.profile.artifacts = self.profile.artifacts or {}
89 self.updateSummary = true 110 self.updateSummary = true
111
112 VeneerArtifactPowerTimer:SetScript('OnUpdate', function()
113 self:OnUpdate()
114 end)
90 115
91 local DoTryToShow = function() 116 local DoTryToShow = function()
92 self:TryToShow() 117 self:TryToShow()
93 end 118 end
94 hooksecurefunc("OpenBackpack", DoTryToShow) 119 hooksecurefunc("OpenBackpack", DoTryToShow)
120 hooksecurefunc(frame, name, DoTryToShow) 145 hooksecurefunc(frame, name, DoTryToShow)
121 end 146 end
122 end 147 end
123 end 148 end
124 end 149 end
150
151 if self.db.firstUse then
152 self.db.firstUse = nil
153
154 end
125 end 155 end
126 156
127 local UNDERLIGHT_ANGLER_ID = 133755 157 local UNDERLIGHT_ANGLER_ID = 133755
128 function ap:SetArtifact(itemID, name, texture, currentXP, pointsSpent) 158 function ap:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
129 print('|cFF00FF00SetArtifact()|r') 159 print('|cFF00FF00SetArtifact()|r')
130 if not self.profile then 160 if not self.profile then
131 return 161 return
132 end 162 end
133 local artifacts = self.profile.artifacts 163 local artifacts = self.profile.artifacts
134 164
165 local multi = C_ArtifactUI.GetArtifactKnowledgeMultiplier()
166 self.profile.knowledgeMultiplier = multi or self.profile.knowledgeMultiplier
167 print('multiplier:', multi)
135 168
136 if itemID then 169 if itemID then
137 170
138 self.currentEquipped = itemID 171 self.currentEquipped = itemID
139 172
272 elseif event == 'PLAYER_REGEN_DISABLED' then 305 elseif event == 'PLAYER_REGEN_DISABLED' then
273 self:Hide() 306 self:Hide()
274 end 307 end
275 end 308 end
276 309
310 function ap:OnUpdate()
311 if #self.scanQueue >= 1 then
312 local scanInfo = tremove(self.scanQueue, 1)
313
314 end
315 end
316
277 function ap:OnMouseDown() 317 function ap:OnMouseDown()
278 self.enabled = nil 318 self.enabled = nil
279 self:Hide() 319 self:Hide()
280 end 320 end
281 321
285 return 325 return
286 end 326 end
287 print('|cFF00FFFFUpdate()|r') 327 print('|cFF00FFFFUpdate()|r')
288 328
289 local bankText, bagText 329 local bankText, bagText
290 if not (self.bankAP and self.bagAP) then 330 if not self.profile.knowledgeMultiplier then
331 bankText = '|cFF00FF00Shift-Right-Click an artifact weapon to start building data.'
332 elseif not (self.bankAP and self.bagAP) then
291 bankText = '|cFFFF0000Open bank frame to count all AP|r ' 333 bankText = '|cFFFF0000Open bank frame to count all AP|r '
292 else 334 else
293 if (self.bagAP + self.bankAP) == 0 then 335 if (self.bagAP + self.bankAP) == 0 then
294 bankText = '|cFFFF4400No Artifact Power tokens on hand|r' 336 bankText = '|cFFFF4400No Artifact Power tokens on hand|r'
295 else 337 else
304 if self.fishingAP and self.fishingAP >= 1 then 346 if self.fishingAP and self.fishingAP >= 1 then
305 bankText = (bankText and (bankText .. ' ') or '') .. '|cFF0088FF' .. tostring(self.fishingAP) .. ' fishing AP|r' 347 bankText = (bankText and (bankText .. ' ') or '') .. '|cFF0088FF' .. tostring(self.fishingAP) .. ' fishing AP|r'
306 end 348 end
307 349
308 self.SummaryHeader:SetText(bankText) 350 self.SummaryHeader:SetText(bankText)
351
352 local numButtons = 0
353 local contentsHeight = 64
354 if self.profile.knowledgeMultiplier then
355 numButtons = self:UpdateArtifactButtons()
356 contentsHeight = contentsHeight + self:UpdateItemButtons()
357 end
358
359
360
361 self:SetWidth(64*numButtons + 4 * (numButtons+1))
362 self:SetHeight(16 + self.SummaryHeader:GetHeight() + contentsHeight)
363 self:Reanchor()
364 end
365
366 function ap:UpdateArtifactButtons()
309 367
310 -- Artifact icons, in no particular order 368 -- Artifact icons, in no particular order
311 self.equippedID = C_ArtifactUI.GetEquippedArtifactInfo() 369 self.equippedID = C_ArtifactUI.GetEquippedArtifactInfo()
312 local numButtons = 0 370 local numButtons = 0
313 local lastFrame = self 371 local lastFrame = self
339 for i = numButtons+ 1, #self.Artifact do 397 for i = numButtons+ 1, #self.Artifact do
340 print('hide', i) 398 print('hide', i)
341 self.Artifact[i]:Hide() 399 self.Artifact[i]:Hide()
342 end 400 end
343 401
344 self:UpdateItemButtons() 402 return numButtons
345
346
347 self:SetWidth(64*numButtons + 4 * (numButtons+1))
348 self:SetHeight(12 + self.SummaryHeader:GetHeight() + 64)
349 self:Reanchor()
350
351 end 403 end
352 404
353 405
354 function ap:UpdateItemButtons() 406 function ap:UpdateItemButtons()
355 print('|cFF00FFFFUpdateItemButtons()|r') 407 print('|cFF00FFFFUpdateItemButtons()|r')
356 local lastFrame, upFrame 408 local lastFrame, upFrame
357 local numButtons = 0 409 local numButtons = 0
410 local buttonsHeight = 0
411 local buttonWidth = 0
358 for index, button in ipairs(self.Tokens) do 412 for index, button in ipairs(self.Tokens) do
359 if button.numItems >= 1 then 413 if button.numItems >= 1 then
360 if button.itemName then 414 if button.itemName then
361 self:SetItemAction(button) 415 self:SetItemAction(button)
362 end 416 end
363 417
364 button:ClearAllPoints() 418 button:ClearAllPoints()
365 numButtons = numButtons + 1 419 numButtons = numButtons + 1
366 print(index, button:GetID(), button.Icon:GetTexture()) 420 print(index, button:GetID(), button.Icon:GetTexture())
367 if numButtons == 1 then 421 if numButtons == 1 then
368 button:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', 0, -2) 422 button:SetPoint('TOPLEFT', self, 'TOPLEFT', 4, -76)
369 upFrame = button 423 upFrame = button
424 buttonsHeight = 52
370 elseif mod(numButtons,8) == 1 then 425 elseif mod(numButtons,8) == 1 then
371 button:SetPoint('TOPLEFT', upFrame, 'BOTTOMLEFT', 0, -2) 426 button:SetPoint('TOPLEFT', upFrame, 'BOTTOMLEFT', 0, -2)
372 upFrame = button 427 upFrame = button
428 buttonsHeight = buttonsHeight + 52
373 else 429 else
374 button:SetPoint('TOPLEFT', lastFrame, 'TOPRIGHT', 2, 0) 430 button:SetPoint('TOPLEFT', lastFrame, 'TOPRIGHT', 2, 0)
375 end 431 end
376 button.Count:SetText(button.numItems) 432 button.Count:SetText(button.numItems)
377 lastFrame = button 433 lastFrame = button
378 button:Show() 434 button:Show()
379 else 435 else
380
381 button:Hide() 436 button:Hide()
382 end 437 end
383 438 end
384 end 439
385 440
441
442 return buttonsHeight
386 end 443 end
387 444
388 function ap:SetItemAction(button, name) 445 function ap:SetItemAction(button, name)
389 name = name or self.itemName 446 name = name or self.itemName
390 if InCombatLockdown() then 447 if InCombatLockdown() then
397 end 454 end
398 455
399 function ap:GetItemButton(itemID, texture, itemAP) 456 function ap:GetItemButton(itemID, texture, itemAP)
400 print('|cFF00FFFFGetItemButton()|r', itemID, texture, itemAP) 457 print('|cFF00FFFFGetItemButton()|r', itemID, texture, itemAP)
401 local button = self.ItemButtons[itemID] 458 local button = self.ItemButtons[itemID]
459
402 if not button then 460 if not button then
403 button = CreateFrame('Button', 'VeneerAPToken'..itemID, self, 'VeneerItemButton') 461 button = CreateFrame('Button', 'VeneerAPToken'..itemID, self, 'VeneerItemButton')
462 button.baseAP = itemAP
463
404 button:SetPushedTexture([[Interface\Buttons\UI-Quickslot-Depress]]) 464 button:SetPushedTexture([[Interface\Buttons\UI-Quickslot-Depress]])
405 button:SetHighlightTexture([[Interface\Buttons\ButtonHilight-Square]],"ADD") 465 button:SetHighlightTexture([[Interface\Buttons\ButtonHilight-Square]],"ADD")
406 button:SetID(itemID) 466 button:SetID(itemID)
407 button.numItems = 0 467 button.numItems = 0
408 button.Icon:SetTexture(texture) 468 button.Icon:SetTexture(texture)
409 button.Label:SetText(itemAP)
410 button:RegisterForClicks("AnyUp") 469 button:RegisterForClicks("AnyUp")
411 self:SetItemAction(button, GetItemInfo(itemID)) 470 self:SetItemAction(button, GetItemInfo(itemID))
412 471
413 print(' created') 472 print(' created')
414 self.ItemButtons[itemID] = button 473 self.ItemButtons[itemID] = button
415 self.numItems = self.numItems + 1 474 self.numItems = self.numItems + 1
416 end 475 end
417 476
477 local itemAPtext = itemAP * self.profile.knowledgeMultiplier
478 if itemAPtext >= 100000 then
479 itemAPtext = floor(itemAPtext/1000) .. 'k'
480 elseif itemAPtext >= 1000 then
481 itemAPtext = (floor(itemAPtext/100)/10 ) .. 'k'
482 end
483 button.Label:SetText(itemAPtext)
484
418 button.numItems = button.numItems + 1 485 button.numItems = button.numItems + 1
419 return button 486 return button
487 end
488
489 function ap:GetItemAP(itemID, itemLink, bagData)
490 if not self.cache[itemID] then
491
492 print('doing tooltip scan')
493 self.tooltip:SetOwner(self, 'ANCHOR_NONE')
494 self.tooltip:SetHyperlink(itemLink)
495 self.tooltip:Show()
496 local numLines = self.tooltip:NumLines()
497 if numLines >= 3 then
498 local subText = _G[TOOLTIP_NAME .. 'TextLeft2']:GetText()
499 if subText and subText:match(ARTIFACT_POWER) then
500 for i = 3, numLines do
501 local text = _G[TOOLTIP_NAME .. 'TextLeft'.. i]:GetText()
502 if text and text:match(ARTIFACT_POWER) then
503 text = text:gsub('[,%D]', '')
504 print(itemLink, '-', tonumber(text))
505 local itemAP = tonumber(text)
506 if itemAP then
507 itemAP = itemAP / self.profile.knowledgeMultiplier
508 self.cache[itemID] = itemAP
509 return itemAP
510 end
511 end
512 end
513 end
514 local fishingText = _G[TOOLTIP_NAME .. 'TextLeft3']:GetText()
515 if fishingText and fishingText:match('fishing artifact') then
516 local fishingAP = fishingText:match("%d+")
517 fishingAP = tonumber(fishingAP)
518 if fishingAP then
519 self.cache[itemID] = fishingAP
520 self.fishingCache[itemID] = true
521 return fishingAP, true
522 end
523 end
524 else
525
526 self.cache[itemID] = 0
527 end
528 end
529 return self.cache[itemID], self.fishingCache[itemID]
420 end 530 end
421 531
422 function ap:ScanBag(id) 532 function ap:ScanBag(id)
423 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id)) 533 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id))
424 local numSlots = GetContainerNumSlots(id) 534 local numSlots = GetContainerNumSlots(id)
436 bagData.items = bagData.items or {} 546 bagData.items = bagData.items or {}
437 table.wipe(bagData.items) 547 table.wipe(bagData.items)
438 548
439 for slotID = 1, numSlots do 549 for slotID = 1, numSlots do
440 local texture, count, locked, quality, readable, lootable, link = GetContainerItemInfo(id, slotID) 550 local texture, count, locked, quality, readable, lootable, link = GetContainerItemInfo(id, slotID)
441 local itemID = GetContainerItemID(id, slotID)
442
443 if link then 551 if link then
444 self.tooltip:SetOwner(self, 'ANCHOR_NONE') 552 local itemID = GetContainerItemID(id, slotID)
445 self.tooltip:SetHyperlink(link) 553 local name, _, quality, iLevel, reqLevel, class, subclass = GetItemInfo(link)
446 self.tooltip:Show() 554
447 local numLines = self.tooltip:NumLines() 555 if class == 'Consumable' and subclass == 'Other' then
448 if numLines >= 3 then 556 print(GetItemInfo(link))
449 local subText = _G[TOOLTIP_NAME .. 'TextLeft2']:GetText() 557 local itemAP, isFishingAP = self:GetItemAP(itemID, link)
450 if subText and subText:match(ARTIFACT_POWER) then 558 print(itemAP, isFishingAP)
451 for i = 3, numLines do 559 if itemAP > 0 then
452 local text = _G[TOOLTIP_NAME .. 'TextLeft'.. i]:GetText() 560 if isFishingAP then
453 if text and text:match(ARTIFACT_POWER) then 561 bagData.fishingItems = (bagData.fishingItems or 0) + 1
454 text = text:gsub('[,%D]', '') 562 bagData.fishingAP = (bagData.fishingAP or 0) + itemAP
455 print(link, '-', tonumber(text)) 563 else
456 local itemAP = tonumber(text) 564
457 if itemAP then 565 bagData.numItems = (bagData.numItems or 0) + 1
458 requiresUpdate = true 566 bagData.totalAP = (bagData.totalAP or 0) + itemAP
459 bagData.numItems = (bagData.numItems or 0) + 1
460 bagData.totalAP = (bagData.totalAP or 0) + itemAP
461 bagData.items[itemID] = (bagData.items[itemID] or 0) + 1
462
463
464 local itemButton = self:GetItemButton(itemID, texture, itemAP)
465 end
466 end
467 end 567 end
568 bagData.items[itemID] = (bagData.items[itemID] or 0) + 1
569 local itemButton = self:GetItemButton(itemID, texture, itemAP)
468 end 570 end
469 local fishingText = _G[TOOLTIP_NAME .. 'TextLeft3']:GetText() 571 elseif self.profile.artifacts[itemID] then
470 if fishingText and fishingText:match('fishing artifact') then 572 print('artfiact weapon', itemID, link, id, slotID)
471 local fishingAP = fishingText:match("%d+") 573 self.profile.artifacts[itemID].containerID = id
472 fishingAP = tonumber(fishingAP) 574 self.profile.artifacts[itemID].slotID = slotID
473 if fishingAP then 575 end
474 bagData.fishingItems = (bagData.fishingItems or 0) + 1 576
475 bagData.fishingAP = (bagData.fishingAP or 0) + fishingAP
476 bagData.items[itemID] = (bagData.items[itemID] or 0) + 1
477 local itemButton = self:GetItemButton(itemID, texture, fishingAP)
478 print(fishingAP, bagData.fishingAP)
479 end
480
481 end
482
483 end
484 end
485
486 if self.profile.artifacts[itemID] then
487 print('artfiact weapon', itemID, link, id, slotID)
488 self.profile.artifacts[itemID].containerID = id
489 self.profile.artifacts[itemID].slotID = slotID
490 end 577 end
491 578
492 end 579 end
493 580
494 end 581 end
499 function ap:ScanAllBags() 586 function ap:ScanAllBags()
500 if InCombatLockdown() then 587 if InCombatLockdown() then
501 self.queuedScan = true 588 self.queuedScan = true
502 return 589 return
503 end 590 end
591 if not self.profile.knowledgeMultiplier then
592 print('need to get knowledge level')
593 return
594 end
595
504 self.queuedScan = nil 596 self.queuedScan = nil
505 597
506 print('|cFFFF0088ScanAllBags()|r') 598 print('|cFFFF0088ScanAllBags()|r', self.profile.knowledgeMultiplier)
507 599
508 for _, button in ipairs(self.Tokens) do 600 for _, button in ipairs(self.Tokens) do
509 button.numItems = 0 601 button.numItems = 0
510 end 602 end
511 603
633 if self.level <= 53 then 725 if self.level <= 53 then
634 726
635 self.CurrentProgress.animateFrom = self.CurrentProgress:GetHeight() or 1 727 self.CurrentProgress.animateFrom = self.CurrentProgress:GetHeight() or 1
636 self.CurrentProgress.animateTo = currentProgress * self:GetHeight() 728 self.CurrentProgress.animateTo = currentProgress * self:GetHeight()
637 self.CurrentProgress:Show() 729 self.CurrentProgress:Show()
730 self.ProgressLine:Show()
638 else 731 else
639 self.CurrentProgress:Hide() 732 self.CurrentProgress:Hide()
733 self.ProgressLine:Hide()
640 end 734 end
641 735
642 if self.potentialXP > self.currentXP then 736 if self.potentialXP > self.currentXP then
643 local projectedProgress = (self.potentialAdjustedXP < self.potentialCost) and (self.potentialXP / self.potentialCost) or 1 737 local projectedProgress = (self.potentialAdjustedXP < self.potentialCost) and (self.potentialXP / self.potentialCost) or 1
644 738
651 end 745 end
652 print('show potential', currentProgress, projectedProgress) 746 print('show potential', currentProgress, projectedProgress)
653 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1 747 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1
654 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight() 748 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight()
655 749
750 self.AdjustedLine:Show()
656 self.AdjustedProgress:Show() 751 self.AdjustedProgress:Show()
657 else 752 else
658 self.AdjustedProgress:Hide() 753 self.AdjustedProgress:Hide()
754 self.AdjustedLine:Hide()
659 end 755 end
660 756
661 757
662 self.Icon:SetTexture(self.texture) 758 self.Icon:SetTexture(self.texture)
663 self:SetSize(64,64) 759 self:SetSize(64,64)