comparison Modules/ArtifactPower.lua @ 116:ddfe19d70a34

ArtifactPower: - Further 7.2 accommodations, relating to tokens that grant millions of AP. Currency: - Ancient Mana zones list expanded - Legionfall War Supplies, Nethershards, and Blood of Sargeras are tracked globally PaperDoll: - Should update more effectively when delayed artifact data loads in. WorldState: - Fixed hanging panels after OrderHallCommandBar is hidden.
author Nenue
date Wed, 26 Apr 2017 20:06:38 -0400
parents 8c94bee4fdfc
children 589045559484
comparison
equal deleted inserted replaced
115:8c94bee4fdfc 116:ddfe19d70a34
11 cache = {}, 11 cache = {},
12 fishingCache = {}, 12 fishingCache = {},
13 scanQueue = {}, 13 scanQueue = {},
14 ItemButtons = {}, 14 ItemButtons = {},
15 anchorPoint = 'TOP', 15 anchorPoint = 'TOP',
16 anchorPriority = 2, 16 anchorPriority = 3,
17 anchorFrom = 'TOP', 17 anchorFrom = 'TOP',
18 moduleName = 'Artifactor', 18 moduleName = 'Artifactor',
19 HideCombat = true 19 HideCombat = true
20 } 20 }
21 local defaultSettings = { 21 local defaultSettings = {
22 firstUse = true, 22 firstUse = true,
23 autoHide = true, 23 autoHide = true,
24 } 24 }
25 local ap = VeneerArtifactPowerMixin 25 local Module = VeneerArtifactPowerMixin
26 local BAGS_TO_SCAN = {BACKPACK_CONTAINER } 26 local BAGS_TO_SCAN = {BACKPACK_CONTAINER }
27 local TOOLTIP_NAME = 'VeneerAPScanner' 27 local TOOLTIP_NAME = 'VeneerAPScanner'
28 local POINT_COSTS = { 28 local POINT_COSTS = {
29 100, 300, 325, 350, 375, 29 100, 300, 325, 350, 375,
30 400, 425, 450, 525, 625, 30 400, 425, 450, 525, 625,
37 2440000, 2560000, 2690000, 2825000, 2965000, 37 2440000, 2560000, 2690000, 2825000, 2965000,
38 3115000, 3270000, 3435000, 3605000, 3785000, 38 3115000, 3270000, 3435000, 3605000, 3785000,
39 3975000, 4175000, 4385000, 4605000 39 3975000, 4175000, 4385000, 4605000
40 } 40 }
41 local FISHING_MAX_TRAITS = 24 41 local FISHING_MAX_TRAITS = 24
42 local WEAPON_MAX_TRAITS = 54 42 local WEAPON_MAX_TRAITS = 92
43 local FRAME_PADDING = 4
44 local EQUIPPED_SIZE = 64
43 local BUTTON_SIZE = 48 45 local BUTTON_SIZE = 48
44 local FRAME_LIST = {'ContainerFrame1', 'BankFrame'} 46 local FRAME_LIST = {'ContainerFrame1', 'BankFrame'}
45 local BAG_FRAMES = {'ContainerFrame1'} 47 local BAG_FRAMES = {'ContainerFrame1'}
46 local BANK_FRAMES = {'BankFrame'} 48 local BANK_FRAMES = {'BankFrame'}
47 49
48 function ap:OnLoad() 50 function Module:OnLoad()
49 self:RegisterEvent('BAG_UPDATE') -- use to obtain bag IDs to scan 51 self:RegisterEvent('BAG_UPDATE') -- use to obtain bag IDs to scan
50 self:RegisterEvent('BAG_UPDATE_DELAYED') -- use to trigger actual scan activity 52 self:RegisterEvent('BAG_UPDATE_DELAYED') -- use to trigger actual scan activity
51 self:RegisterEvent('BANKFRAME_OPENED') -- determine when bank info is available 53 self:RegisterEvent('BANKFRAME_OPENED') -- determine when bank info is available
52 self:RegisterEvent('BANKFRAME_CLOSED') -- " " " 54 self:RegisterEvent('BANKFRAME_CLOSED') -- " " "
53 self:RegisterEvent('ARTIFACT_UPDATE') -- when artifact data has changed 55 self:RegisterEvent('ARTIFACT_UPDATE') -- when artifact data has changed
83 self.tooltip = CreateFrame('GameTooltip', TOOLTIP_NAME, self, 'GameTooltipTemplate') 85 self.tooltip = CreateFrame('GameTooltip', TOOLTIP_NAME, self, 'GameTooltipTemplate')
84 86
85 87
86 end 88 end
87 local ShortNumberString = function (value) 89 local ShortNumberString = function (value)
88 if value >= 100000 then 90 if value >= 1000000 then
91 return tostring(floor(value/100000)/10) .. 'M'
92 elseif value >= 100000 then
89 return tostring(floor(value/1000)) .. 'k' 93 return tostring(floor(value/1000)) .. 'k'
90 elseif value >= 1000 then 94 elseif value >= 1000 then
91 return tostring(floor(value/100)/10) .. 'k' 95 return tostring(floor(value/100)/10) .. 'k'
92 else 96 else
93 return value 97 return value
161 else 165 else
162 PENDING_HOOKS[name] = args 166 PENDING_HOOKS[name] = args
163 end 167 end
164 end 168 end
165 169
166 function ap:Setup() 170 function Module:Setup()
167 print(self:GetName()..':Setup()') 171 print(self:GetName()..':Setup()')
168 local guid = UnitGUID('player') 172 local guid = UnitGUID('player')
169 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings 173 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings
170 self.db = VeneerData.ArtifactPower 174 self.db = VeneerData.ArtifactPower
171 self.db[guid] = self.db[guid] or {} 175 self.db[guid] = self.db[guid] or {}
241 end 245 end
242 end 246 end
243 247
244 local UNDERLIGHT_ANGLER_ID = 133755 248 local UNDERLIGHT_ANGLER_ID = 133755
245 249
246 function ap:ResetCache() 250 function Module:ResetCache()
247 table.wipe(self.cache.items) 251 table.wipe(self.cache.items)
248 table.wipe(self.cache.fishing) 252 table.wipe(self.cache.fishing)
249 table.wipe(self.cache.bags) 253 table.wipe(self.cache.bags)
250 table.wipe(self.cache.bagItems) 254 table.wipe(self.cache.bagItems)
251 self:ScanAllBags() 255 self:ScanAllBags()
252 end 256 end
253 257
254 function ap:QueueBag(containerID) 258 function Module:QueueBag(containerID)
255 containerID = tonumber(containerID) 259 containerID = tonumber(containerID)
256 if not containerID then 260 if not containerID then
257 return 261 return
258 end 262 end
259 263
261 print(' queueing', containerID, type(containerID), #BAGS_TO_SCAN , 'in line') 265 print(' queueing', containerID, type(containerID), #BAGS_TO_SCAN , 'in line')
262 BAGS_TO_SCAN[#BAGS_TO_SCAN + 1] = containerID 266 BAGS_TO_SCAN[#BAGS_TO_SCAN + 1] = containerID
263 end 267 end
264 end 268 end
265 269
266 function ap:Reanchor() 270 function Module:Reanchor()
267 if Veneer then 271 if Veneer then
268 Veneer:DynamicReanchor() 272 Veneer:DynamicReanchor()
269 end 273 end
270 end 274 end
271 275
272 function ap:OnShow() 276 function Module:OnShow()
273 print('|cFFFFFF00OnShow()|r') 277 print('|cFFFFFF00OnShow()|r')
274 278
275 for name, args in pairs(PENDING_HOOKS) do 279 for name, args in pairs(PENDING_HOOKS) do
276 if _G[name] then 280 if _G[name] then
277 AddFrameHooks(_G[name], args) 281 AddFrameHooks(_G[name], args)
282 286
283 self.enabled = true 287 self.enabled = true
284 self:ScanAllBags() 288 self:ScanAllBags()
285 self:Reanchor() 289 self:Reanchor()
286 end 290 end
287 function ap:OnHide() 291 function Module:OnHide()
288 print('|cFF88FF00OnHide()|r', debugstack()) 292 print('|cFF88FF00OnHide()|r', debugstack())
289 self:Reanchor() 293 self:Reanchor()
290 end 294 end
291 function ap:OnEnter() 295 function Module:OnEnter()
292 296
293 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR') 297 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
294 298
295 299
296 GameTooltip:AddLine(self.bagAP) 300 GameTooltip:AddLine(self.bagAP)
297 GameTooltip:AddLine(self.bankAP) 301 GameTooltip:AddLine(self.bankAP)
298 302
299 end 303 end
300 304
301 function ap:TryToShow() 305 function Module:TryToShow()
302 306
303 print('|cFFFFFF00TryToShow()') 307 print('|cFFFFFF00TryToShow()')
304 308
305 if not InCombatLockdown() then 309 if not InCombatLockdown() then
306 for _, name in ipairs(FRAME_LIST) do 310 for _, name in ipairs(FRAME_LIST) do
319 print('failed tests') 323 print('failed tests')
320 self:Hide() 324 self:Hide()
321 end 325 end
322 326
323 327
324 function ap:OnEvent(event, ...) 328 function Module:OnEvent(event, ...)
325 print('|cFF00FF88OnEvent()', event, ...) 329 print('|cFF00FF88OnEvent()', event, ...)
326 if event == 'PLAYER_ENTERING_WORLD' then 330 if event == 'PLAYER_ENTERING_WORLD' then
327 self:TryToShow() 331 self:TryToShow()
328 elseif event == 'BAG_UPDATE' then 332 elseif event == 'BAG_UPDATE' then
329 local containerID = ... 333 local containerID = ...
378 elseif event == 'PLAYER_REGEN_DISABLED' then 382 elseif event == 'PLAYER_REGEN_DISABLED' then
379 self:Hide() 383 self:Hide()
380 end 384 end
381 end 385 end
382 386
383 function ap:OnUpdate() 387 function Module:OnUpdate()
384 if #self.scanQueue >= 1 then 388 if #self.scanQueue >= 1 then
385 local scanInfo = tremove(self.scanQueue, 1) 389 local scanInfo = tremove(self.scanQueue, 1)
386 end 390 end
387 if IsShiftKeyDown() then 391 if IsShiftKeyDown() then
388 self.Refresh:Show() 392 self.Refresh:Show()
390 self.Refresh:Hide() 394 self.Refresh:Hide()
391 end 395 end
392 396
393 end 397 end
394 398
395 function ap:OnMouseDown() 399 function Module:OnMouseDown()
396 self.enabled = nil 400 self.enabled = nil
397 self:Hide() 401 self:Hide()
398 end 402 end
399 403
400 function ap:Update() 404 function Module:Update()
401 if not self:IsShown() then 405 if not self:IsShown() then
402 print('|cFFFF4400Update()|r') 406 print('|cFFFF4400Update()|r')
403 return 407 return
404 end 408 end
405 print('|cFF00FFFFUpdate()|r') 409 print('|cFF00FFFFUpdate()|r')
425 self.worldQuestAP = 0 429 self.worldQuestAP = 0
426 if WorldPlan then 430 if WorldPlan then
427 431
428 if not self.worldPlanHooked then 432 if not self.worldPlanHooked then
429 WorldPlan:RegisterDataCallback(function() 433 WorldPlan:RegisterDataCallback(function()
434 print('data udpate callback')
430 self:Update() 435 self:Update()
431 end) 436 end)
437 self.worldPlanHooked = true
432 end 438 end
433 439
434 440
435 local showWQ 441 local showWQ
436 print('world plan is loaded') 442 print('world plan is loaded')
437 local worldQuests = WorldPlan:GetQuestPins() 443 local worldQuests = WorldPlan:GetQuestPins()
438 for index, pin in ipairs(worldQuests) do 444 for index, pin in ipairs(worldQuests) do
439 if pin.dataLoaded and (pin.rewardType == WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER) and (pin.isActive) then 445 if (pin.rewardType == WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER) and (pin.isActive) and (pin.dataLoaded) then
440 showWQ = true 446 showWQ = true
441 print(pin.itemNumber) 447 print(pin.itemNumber)
442 self.worldQuestAP = self.worldQuestAP + pin.itemNumber 448 self.worldQuestAP = self.worldQuestAP + pin.itemNumber
443 end 449 end
444 end 450 end
453 459
454 local numButtons = 0 460 local numButtons = 0
455 local contentsHeight = 16 + self.SummaryHeader:GetHeight() 461 local contentsHeight = 16 + self.SummaryHeader:GetHeight()
456 local contentsWidth = self.SummaryHeader:GetWidth() + 16 462 local contentsWidth = self.SummaryHeader:GetWidth() + 16
457 if self.profile.knowledgeMultiplier then 463 if self.profile.knowledgeMultiplier then
458 numButtons = self:UpdateArtifactButtons() 464 local artifactsWidth = self:UpdateArtifactButtons()
459 465
460 if numButtons ~= 0 then 466 if artifactsWidth ~= 0 then
461 contentsHeight = contentsHeight + 64 467 contentsHeight = contentsHeight + 64
462 end 468 end
463 469
464 contentsWidth = max(contentsWidth, 64*numButtons + 4 * (numButtons+1)) 470 contentsWidth = max(contentsWidth, artifactsWidth)
465 471
466 local itemsWidth, itemsHeight = self:UpdateItemButtons() 472 local itemsWidth, itemsHeight = self:UpdateItemButtons()
467 contentsHeight = contentsHeight + itemsHeight 473 contentsHeight = contentsHeight + itemsHeight
468 contentsWidth = max(contentsWidth, itemsWidth) 474 contentsWidth = max(contentsWidth, itemsWidth)
469 end 475 end
477 self:SetWidth(contentsWidth) 483 self:SetWidth(contentsWidth)
478 self:SetHeight(contentsHeight) 484 self:SetHeight(contentsHeight)
479 self:Reanchor() 485 self:Reanchor()
480 end 486 end
481 487
482 function ap:UpdateArtifactButtons() 488 function Module:UpdateArtifactButtons()
483 489
484 -- Artifact icons, in no particular order 490 -- Artifact icons, in no particular order
485 self.equippedID = C_ArtifactUI.GetEquippedArtifactInfo() 491 self.equippedID = C_ArtifactUI.GetEquippedArtifactInfo()
486 self.canAddAP = nil 492 self.canAddAP = nil
487 self.canAddFishingAP = nil 493 self.canAddFishingAP = nil
488 local hasArtifacts 494 local hasArtifacts
489 local numButtons = 0 495 local numButtons = 0
490 local lastFrame = self 496 local lastFrame = self
491 local fishingID, fishingData 497 local fishingID, fishingData
492 local index, button 498 local index, button
499 local equipped =self.profile.artifacts[self.equippedID]
500 local buttonsWidth = 0
501 if equipped then
502 numButtons = numButtons + 1
503 button = self.Artifact[numButtons]
504 button.relativeFrame = self
505 lastFrame = button:SetButton(self.equippedID, equipped, numButtons, true, nil)
506 hasArtifacts = true
507
508 buttonsWidth = EQUIPPED_SIZE + (FRAME_PADDING * 2)
509 end
510
511
493 for itemID, artifact in pairs(self.profile.artifacts) do 512 for itemID, artifact in pairs(self.profile.artifacts) do
494 if (itemID == UNDERLIGHT_ANGLER_ID) then 513 if (itemID == UNDERLIGHT_ANGLER_ID) then
495 if VeneerData.ArtifactPower.EnableFishing then 514 -- only add if we have fishing AP items and it's not being shown in the equipped slot
515 if VeneerData.ArtifactPower.EnableFishing and (itemID ~= self.equippedID) then
496 fishingID = itemID 516 fishingID = itemID
497 fishingData = artifact 517 fishingData = artifact
498 end 518 end
499 519
500 if artifact.level < FISHING_MAX_TRAITS then 520 if artifact.level < FISHING_MAX_TRAITS then
501 if itemID == self.equippedID then 521 if itemID == self.equippedID then
502 self.canAddFishingAP = true 522 self.canAddFishingAP = true
503 end 523 end
504 end 524 end
505
506
507 else 525 else
508 if artifact.level < WEAPON_MAX_TRAITS then 526 if artifact.level < WEAPON_MAX_TRAITS then
509
510 if itemID == self.equippedID then 527 if itemID == self.equippedID then
511 self.canAddAP = true 528 self.canAddAP = true
529 else
530
531 hasArtifacts = true
532 numButtons = numButtons + 1
533 button = self.Artifact[numButtons]
534 button.relativeFrame = lastFrame
535 lastFrame = button:SetButton(itemID, artifact, numButtons, (self.equippedID == itemID), nil)
536 buttonsWidth = buttonsWidth + lastFrame:GetWidth() + FRAME_PADDING
512 end 537 end
513 hasArtifacts = true
514 numButtons = numButtons + 1
515 button = self.Artifact[numButtons]
516 button.relativeFrame = lastFrame
517 lastFrame = button:SetButton(itemID, artifact, numButtons, (self.equippedID == itemID), nil)
518 end 538 end
519 end 539 end
520 end 540 end
521 541
522 542
534 print('hide', i) 554 print('hide', i)
535 self.Artifact[i]:Hide() 555 self.Artifact[i]:Hide()
536 end 556 end
537 557
538 558
539 return numButtons 559 return buttonsWidth
540 end 560 end
541 561
542 562
543 function ap:UpdateItemButtons() 563 function Module:UpdateItemButtons()
544 print('|cFF00FFFFUpdateItemButtons()|r') 564 print('|cFF00FFFFUpdateItemButtons()|r')
545 565
546 local apType 566 local apType
547 if self.canAddFishingAP then 567 if self.canAddFishingAP then
548 apType = true 568 apType = true
603 623
604 624
605 return buttonsWidth, buttonsHeight 625 return buttonsWidth, buttonsHeight
606 end 626 end
607 627
608 function ap:SetItemAction(button, name) 628 function Module:SetItemAction(button, name)
609 name = name or self.itemName 629 name = name or self.itemName
610 if InCombatLockdown() then 630 if InCombatLockdown() then
611 self.itemName = name 631 self.itemName = name
612 return 632 return
613 else 633 else
614 button:SetAttribute('*type*','item') 634 button:SetAttribute('*type*','item')
615 button:SetAttribute('*item*', name) 635 button:SetAttribute('*item*', name)
616 end 636 end
617 end 637 end
618 638
619 function ap:GetItemButton(itemID, texture, itemAP, fishing) 639 function Module:GetItemButton(itemID, texture, itemAP, fishing)
620 print('|cFF00FFFFGetItemButton()|r', itemID, texture, itemAP) 640 print('|cFF00FFFFGetItemButton()|r', itemID, texture, itemAP)
621 local button = self.ItemButtons[itemID] 641 local button = self.ItemButtons[itemID]
622 642
623 if not button then 643 if not button then
624 button = CreateFrame('Button', 'VeneerAPToken'..itemID, self, 'VeneerItemButton') 644 button = CreateFrame('Button', 'VeneerAPToken'..itemID, self, 'VeneerItemButton')
636 print(' created') 656 print(' created')
637 self.ItemButtons[itemID] = button 657 self.ItemButtons[itemID] = button
638 self.numItems = self.numItems + 1 658 self.numItems = self.numItems + 1
639 end 659 end
640 660
641 local itemAPtext = itemAP 661 button.Label:SetText(ShortNumberString(itemAP))
642 if itemAPtext >= 100000 then
643 itemAPtext = floor(itemAPtext/1000) .. 'k'
644 elseif itemAPtext >= 1000 then
645 itemAPtext = (floor(itemAPtext/100)/10 ) .. 'k'
646 end
647 button.Label:SetText(itemAPtext)
648 662
649 button.numItems = button.numItems + 1 663 button.numItems = button.numItems + 1
650 return button 664 return button
651 end 665 end
652 666
653 function ap:GetItemAP(itemID, itemLink, bagData) 667 function Module:GetItemAP(itemID, itemLink, bagData)
654 if not self.cache.items[itemID] then 668 if not self.cache.items[itemID] then
655 669
656 print('doing tooltip scan', itemLink, itemID) 670 print('doing tooltip scan', itemLink, itemID)
657 self.tooltip:SetOwner(self, 'ANCHOR_NONE') 671 self.tooltip:SetOwner(self, 'ANCHOR_NONE')
658 self.tooltip:SetHyperlink(itemLink) 672 self.tooltip:SetHyperlink(itemLink)
662 for i = 3, numLines do 676 for i = 3, numLines do
663 local text = _G[TOOLTIP_NAME .. 'TextLeft'.. i]:GetText() 677 local text = _G[TOOLTIP_NAME .. 'TextLeft'.. i]:GetText()
664 if text then 678 if text then
665 679
666 text = text:lower():gsub(',', '') 680 text = text:lower():gsub(',', '')
681
667 if text:match('equipped artifact') then 682 if text:match('equipped artifact') then
668 print(itemLink, '-', tonumber(text)) 683 print(itemLink, '-', tonumber(text))
669 local itemAP = text:match('%d+') 684
685 local itemAP = text:match('[%d%.]+')
670 if itemAP then 686 if itemAP then
687 -- tokens > 1M are described as '%f million'
688 if text:match("million") then
689 itemAP = tonumber(itemAP) * 1000000
690 end
691
671 itemAP = itemAP 692 itemAP = itemAP
672 self.cache.items[itemID] = tonumber(itemAP) 693 self.cache.items[itemID] = tonumber(itemAP)
673 end 694 end
674 end 695 end
675 if text:match('fishing artifact') then 696 if text:match('fishing artifact') then
689 end 710 end
690 end 711 end
691 return self.cache.items[itemID], self.cache.fishing[itemID] 712 return self.cache.items[itemID], self.cache.fishing[itemID]
692 end 713 end
693 714
694 function ap:SetArtifact(itemID, name, texture, currentXP, pointsSpent) 715 function Module:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
695 print('|cFF00FF00SetArtifact()|r') 716 print('|cFF00FF00SetArtifact()|r')
696 if not self.profile then 717 if not self.profile then
697 return 718 return
698 end 719 end
699 local artifacts = self.profile.artifacts 720 local artifacts = self.profile.artifacts
717 738
718 artifact.name = name 739 artifact.name = name
719 artifact.texture = texture 740 artifact.texture = texture
720 artifact.currentXP = currentXP 741 artifact.currentXP = currentXP
721 artifact.level = pointsSpent 742 artifact.level = pointsSpent
722 local cost = C_ArtifactUI.GetCostForPointAtRank(pointsSpent) 743 artifact.tier = C_ArtifactUI.GetArtifactTier() or ((pointsSpent >= 36) and 2 or 1)
744
745 print('tier', artifact.tier)
746 local cost = C_ArtifactUI.GetCostForPointAtRank(pointsSpent, artifact.tier)
723 artifact.currentCost = cost 747 artifact.currentCost = cost
724 748
725 local pointsAvailable = pointsSpent 749
726 local actualCost = cost 750
727 local actualXP = currentXP 751 end
728 while actualXP >= actualCost do 752 end
729 pointsAvailable = pointsAvailable + 1 753
730 actualXP = actualXP - actualCost 754 function Module:ScanBag(id)
731 print(pointsAvailable, '-', actualCost, '=', actualXP)
732 actualCost = C_ArtifactUI.GetCostForPointAtRank(pointsAvailable)
733 end
734 print('updating', itemID, name, currentXP, pointsSpent, pointsAvailable, actualXP)
735 artifact.actualXP = actualXP
736 artifact.actualLevel = pointsAvailable
737 artifact.actualCost = actualCost
738
739 end
740 end
741
742 function ap:ScanBag(id)
743 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id)) 755 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id))
744 local numSlots = GetContainerNumSlots(id) 756 local numSlots = GetContainerNumSlots(id)
745 local requiresUpdate 757 local requiresUpdate
746 if numSlots == 0 then 758 if numSlots == 0 then
747 return nil 759 return nil
811 end 823 end
812 824
813 local BAG_SLOTS = {0, 1, 2, 3, 4 } 825 local BAG_SLOTS = {0, 1, 2, 3, 4 }
814 local BANK_SLOTS = {-1, 5, 6,7, 8, 9, 10, 11, 12} 826 local BANK_SLOTS = {-1, 5, 6,7, 8, 9, 10, 11, 12}
815 local ItemCounts = {} 827 local ItemCounts = {}
816 function ap:ScanAllBags() 828 function Module:ScanAllBags()
817 if InCombatLockdown() then 829 if InCombatLockdown() then
818 self.queuedScan = true 830 self.queuedScan = true
819 return 831 return
820 end 832 end
821 if not self.profile.knowledgeMultiplier then 833 if not self.profile.knowledgeMultiplier then
866 self.queuedScan = nil 878 self.queuedScan = nil
867 self:TryToShow() 879 self:TryToShow()
868 end 880 end
869 881
870 VeneerArtifactButtonMixin = {} 882 VeneerArtifactButtonMixin = {}
871 883 local Artifact = VeneerArtifactButtonMixin
872 function VeneerArtifactButtonMixin:SetButton(itemID, artifact, index, equipped, fishing) 884
885 function Artifact:SetButton(itemID, artifact, index, equipped, fishing)
873 print(itemID, index) 886 print(itemID, index)
874 print(artifact.name, artifact.texture, artifact.currentXP) 887 print(artifact.name, artifact.texture, artifact.currentXP)
875 self:SetID(itemID) 888 self:SetID(itemID)
876 if not artifact.currentCost then 889 if not artifact.currentCost then
877 artifact.currentCost = artifact.cost 890 artifact.currentCost = artifact.cost
882 self[k] = v 895 self[k] = v
883 end 896 end
884 897
885 self.isFishing = fishing 898 self.isFishing = fishing
886 -- this can change between artifact parses 899 -- this can change between artifact parses
887 local potentialPoints = self.actualLevel
888 local totalAP = (itemID ~= UNDERLIGHT_ANGLER_ID) and ((self:GetParent().bankAP or 0) + (self:GetParent().bagAP or 0)) or (self:GetParent().fishingAP or 0) 900 local totalAP = (itemID ~= UNDERLIGHT_ANGLER_ID) and ((self:GetParent().bankAP or 0) + (self:GetParent().bagAP or 0)) or (self:GetParent().fishingAP or 0)
889 print(totalAP) 901 print(totalAP)
890 local potentialXP = self.actualXP + totalAP 902
891 903 -- currentXP what has been spent on the artifact
892 self.potentialXP = potentialXP 904 -- actualXP amount
893 local potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints) 905 -- totalXP
894 while potentialXP >= potentialCost do 906 local actualXP = artifact.currentXP + totalAP
895 potentialXP = potentialXP - potentialCost 907 local actualLevel = artifact.level
896 potentialPoints = potentialPoints + 1 908 local actualCost = C_ArtifactUI.GetCostForPointAtRank(actualLevel, artifact.tier)
897 print('inc estimate', potentialXP, potentialPoints) 909
898 potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints) 910 while actualXP >= actualCost do
899 end 911 actualXP = actualXP - actualCost
900 self.potentialCost = potentialCost 912 actualLevel = actualLevel + 1
901 self.potentialLevel = potentialPoints 913 actualCost = C_ArtifactUI.GetCostForPointAtRank(actualLevel, artifact.tier)
902 self.potentialAdjustedXP = potentialXP 914 print('* ', actualLevel, actualXP, actualCost)
903 915 end
904 self.maxCost = self.currentCost 916 self.actualCost = actualCost
905 for i = self.level + 1, #POINT_COSTS do 917 self.actualLevel = actualLevel
906 self.maxCost = self.maxCost + POINT_COSTS[i] 918 self.actualXP = actualXP
907 end 919 self.totalXP = artifact.currentXP + totalAP
920
908 921
909 if index ~= 1 then 922 if index ~= 1 then
910 self:ClearAllPoints() 923 self:ClearAllPoints()
911 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPRIGHT', 4, 0) 924 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPRIGHT', 4, 0)
912 else 925 else
918 self:Update() 931 self:Update()
919 self:Show() 932 self:Show()
920 return self 933 return self
921 end 934 end
922 935
923 function VeneerArtifactButtonMixin:Update() 936 function Artifact:Update()
924 local r, g, b = 1, 1, 1 937 local r1, g1, b1 = 1, 1, 1
925 local lR, lG, lB = 1, 1, 0 938 local r2, g2, b2 = 1, 1, 0
926 local levelText = self.level 939 local levelText = self.level
927 local xpValue = ShortNumberString(self.currentXP) 940 local xpText = ShortNumberString(self.currentXP)
928 local costValue = self.currentCost 941 local costText = ShortNumberString(self.currentCost)
942 local remainingText = ShortNumberString(self.currentCost - self.currentXP)
943 -- current: amount shown in blizz ui
944 -- actual: amount contributing the next level, will be same until current point cap is reached
945 -- potential: total of ap on hand
946 print(self.currentXP, self.actualXP, self.potentialXP)
929 if self.actualLevel ~= self.level then 947 if self.actualLevel ~= self.level then
930 levelText, r,g,b = self.actualLevel, 0,1,0 948
931 xpValue, costValue, lR, lG, lB = ShortNumberString(self.potentialXP) .. '\n' .. ShortNumberString(self.potentialCost-self.potentialXP), self.actualCost, 0, 1, 0 949 levelText = self.actualLevel
932 elseif self.potentialLevel ~= self.level then 950 r1, g1, b1 = 0, 1, 0
933 levelText, r, g, b = self.potentialLevel, 0,1,1 951 r2, g2, b2 = 0, 1, 0
934 xpValue, costValue, lR, lG, lB = ShortNumberString(self.potentialXP) .. '\n' .. ShortNumberString(self.potentialCost-self.potentialXP), self.potentialCost, 0,1,1 952 xpText = ShortNumberString(self.actualXP)
935 else 953 costText = ShortNumberString(self.actualCost)
936 xpValue, lR, lG, lB = ShortNumberString(self.actualXP) .. '\n|cFFFFFF00' .. ShortNumberString(self.actualCost-self.actualXP)..'|r', 1, 1, 1 954 remainingText = ShortNumberString(self.actualCost-self.actualXP)
955 --[[elseif self.potentialLevel ~= self.level then
956 r1, g1, b1 = 0, 1, 1
957 r2, g2, b2 = 0, 1, 1
958 costText = ShortNumberString(self.potentialCost)
959 remainingText = ShortNumberString(self.potentialCost-self.potentialXP)
960 --]]
937 end 961 end
938 962
939 self.Level:SetText(levelText) 963 self.Level:SetText(levelText)
940 self.Level:SetTextColor(r, g, b) 964 self.CurrentXP:SetText( xpText )
941 self.CurrentXP:SetText( xpValue) 965 self.RemainingCost:SetText(remainingText)
942 self.CurrentXP:SetTextColor(lR, lG, lB) 966 self.Level:SetTextColor(r1, g1, b1)
967 self.CurrentXP:SetTextColor(r1, g1, b1)
943 968
944 if self.isEquipped then 969 if self.isEquipped then
970 self:SetSize(64,64)
945 self:SetNormalTexture([[Interface\Buttons\ButtonHilight-Square]]) 971 self:SetNormalTexture([[Interface\Buttons\ButtonHilight-Square]])
946 self:GetNormalTexture():SetBlendMode('ADD') 972 self:GetNormalTexture():SetBlendMode('ADD')
947 self:GetNormalTexture():SetVertexColor(0,1,0) 973 self:GetNormalTexture():SetVertexColor(0,1,0)
948 else 974 else
975 self:SetSize(48,48)
949 self:SetNormalTexture(nil, 'ADD') 976 self:SetNormalTexture(nil, 'ADD')
950 end 977 end
951 978
952 local currentProgress = (self.currentXP < self.currentCost) and (self.currentXP / self.currentCost) or 1 979 local currentProgress = (self.currentXP < self.currentCost) and (self.currentXP / self.currentCost) or 1
953 if self.level <= 53 then 980 if self.level <= 53 then
958 else 985 else
959 self.CurrentProgress:Hide() 986 self.CurrentProgress:Hide()
960 self.ProgressLine:Hide() 987 self.ProgressLine:Hide()
961 end 988 end
962 989
963 if self.potentialXP > self.currentXP then 990 if self.actualXP ~= self.currentXP then
964 local projectedProgress = (self.potentialAdjustedXP < self.potentialCost) and (self.potentialXP / self.potentialCost) or 1 991 local projectedProgress = (self.actualXP ~= self.actualCost) and (self.actualXP / self.actualCost) or 1
965 if (projectedProgress > currentProgress) then 992 if (projectedProgress > currentProgress) then
966 self.AdjustedProgress:SetPoint('BOTTOM', self.CurrentProgress, 'TOP') 993 self.AdjustedProgress:SetPoint('BOTTOM', self.CurrentProgress, 'TOP')
967 projectedProgress = projectedProgress - currentProgress 994 projectedProgress = projectedProgress - currentProgress
968 else 995 else
996 self.CurrentProgress:Hide()
997 self.ProgressLine:Hide()
969 self.AdjustedProgress:SetPoint('BOTTOM', self, 'BOTTOM') 998 self.AdjustedProgress:SetPoint('BOTTOM', self, 'BOTTOM')
970 end 999 end
971 print('show potential', currentProgress, projectedProgress) 1000 print('show actual', currentProgress, projectedProgress)
972 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1 1001 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1
973 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight() 1002 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight()
974 self.AdjustedLine:Show() 1003 self.AdjustedLine:Show()
975 self.AdjustedProgress:Show() 1004 self.AdjustedProgress:Show()
976 else 1005 else
977 self.AdjustedProgress:Hide() 1006 self.AdjustedProgress:Hide()
978 self.AdjustedLine:Hide() 1007 self.AdjustedLine:Hide()
979 end 1008 end
1009
1010
1011
980 self.Icon:SetTexture(self.texture) 1012 self.Icon:SetTexture(self.texture)
981 self:SetSize(64,64) 1013 end
982 end 1014
983 1015
984 1016 function Artifact:AnimateProgress(region)
985 function VeneerArtifactButtonMixin:AnimateProgress(region)
986 local cTime = GetTime() 1017 local cTime = GetTime()
987 if not region.animateStart then 1018 if not region.animateStart then
988 region.animateStart = cTime 1019 region.animateStart = cTime
989 end 1020 end
990 local progressTo, progressFrom = region.animateTo, region.animateFrom 1021 local progressTo, progressFrom = region.animateTo, region.animateFrom
1000 --print(self:GetName(), progressTo, progressFrom, (progressTo - progressFrom), ceil(progress*10)/10, ceil(height)) 1031 --print(self:GetName(), progressTo, progressFrom, (progressTo - progressFrom), ceil(progress*10)/10, ceil(height))
1001 region:SetHeight(height) 1032 region:SetHeight(height)
1002 end 1033 end
1003 end 1034 end
1004 1035
1005 function VeneerArtifactButtonMixin:OnUpdate(sinceLast) 1036 function Artifact:OnUpdate(sinceLast)
1006 if self.CurrentProgress.animateTo then 1037 if self.CurrentProgress.animateTo then
1007 self:AnimateProgress(self.CurrentProgress) 1038 self:AnimateProgress(self.CurrentProgress)
1008 end 1039 end
1009 1040
1010 if self.AdjustedProgress.animateTo then 1041 if self.AdjustedProgress.animateTo then
1011 self:AnimateProgress(self.AdjustedProgress) 1042 self:AnimateProgress(self.AdjustedProgress)
1012 end 1043 end
1013 end 1044 end
1014 1045
1015 function VeneerArtifactButtonMixin:OnEnter() 1046 function Artifact:OnEnter()
1016 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR') 1047 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
1017 GameTooltip:SetText(self.name) 1048 GameTooltip:SetText(self.name)
1018 GameTooltip:AddLine(ShortNumberString(self.currentXP) .. ' / '..ShortNumberString(self.currentCost), 1, 1, 0) 1049 GameTooltip:AddLine(ShortNumberString(self.currentXP) .. ' / '..ShortNumberString(self.currentCost), 1, 1, 0)
1019 if self.potentialXP > self.currentXP then 1050 if self.totalXP ~= self.currentXP then
1020 GameTooltip:AddLine(ShortNumberString(self.potentialXP) .. ' potential XP', 0, 1, 1) 1051 GameTooltip:AddLine(ShortNumberString(self.totalXP) .. ' total XP', 0, 1, 1)
1021 if self.potentialAdjustedXP ~= self.potentialXP then 1052 if self.actualXP ~= self.potentialXP then
1022 GameTooltip:AddLine(ShortNumberString(self.potentialAdjustedXP) .. ' / ' .. ShortNumberString(self.potentialCost).. ' after', 0, 1, 0) 1053 GameTooltip:AddLine(ShortNumberString(self.actualXP) .. ' / ' .. ShortNumberString(self.actualCost).. ' after', 0, 1, 0)
1023 end 1054 end
1024 end 1055 end
1025 if self.actualLevel ~= self.level then 1056 if self.actualLevel ~= self.level then
1026 GameTooltip:AddLine(ShortNumberString(self.actualLevel - self.level) .. ' points unlocked', 0, 1, 1) 1057 GameTooltip:AddLine(ShortNumberString(self.actualLevel - self.level) .. ' points unlocked', 0, 1, 1)
1027 end 1058 end
1029 GameTooltip:AddLine(ShortNumberString(self.currentCost - self.currentXP) .. ' needed') 1060 GameTooltip:AddLine(ShortNumberString(self.currentCost - self.currentXP) .. ' needed')
1030 end 1061 end
1031 1062
1032 GameTooltip:Show() 1063 GameTooltip:Show()
1033 end 1064 end
1034 function VeneerArtifactButtonMixin:OnLeave() 1065 function Artifact:OnLeave()
1035 if GameTooltip:IsOwned(self) then 1066 if GameTooltip:IsOwned(self) then
1036 GameTooltip:Hide() 1067 GameTooltip:Hide()
1037 end 1068 end
1038 end 1069 end
1039 function VeneerArtifactButtonMixin:OnHide() 1070 function Artifact:OnHide()
1040 1071
1041 if GameTooltip:IsOwned(self) then 1072 if GameTooltip:IsOwned(self) then
1042 GameTooltip:Hide() 1073 GameTooltip:Hide()
1043 end 1074 end
1044 end 1075 end
1045 1076
1046 function VeneerArtifactButtonMixin:OnClick(button, down) 1077 function Artifact:OnClick(button, down)
1047 if self.isEquipped then 1078 if self.isEquipped then
1048 SocketInventoryItem(16) 1079 SocketInventoryItem(16)
1049 else 1080 else
1050 if IsShiftKeyDown() then 1081 if IsShiftKeyDown() then
1051 SocketContainerItem(self.containerID, self.slotID) 1082 SocketContainerItem(self.containerID, self.slotID)