comparison Modules/ArtifactPower.lua @ 99:74d6d97a2d24 v7.1.5-r100

- artifact progress visualizations, green for current, blue for attainable - force fishing artifact to list last - support for fishing artifact power
author Nenue
date Fri, 20 Jan 2017 19:40:55 -0500
parents dadddb8a551f
children f32b63c93275
comparison
equal deleted inserted replaced
98:dadddb8a551f 99:74d6d97a2d24
4 -- %file-revision% 4 -- %file-revision%
5 -- 5 --
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 9 numItems = 0,
10 Tokens = {},
11 ItemButtons = {},
10 anchorPoint = 'TOP', 12 anchorPoint = 'TOP',
11 anchorFrom = 'TOP', 13 anchorFrom = 'TOP',
12 } 14 }
13 local ap = VeneerArtifactPowerMixin 15 local ap = VeneerArtifactPowerMixin
14 local BAGS_TO_SCAN = {BACKPACK_CONTAINER } 16 local BAGS_TO_SCAN = {BACKPACK_CONTAINER }
25 2440000, 2560000, 2690000, 2825000, 2965000, 27 2440000, 2560000, 2690000, 2825000, 2965000,
26 3115000, 3270000, 3435000, 3605000, 3785000, 28 3115000, 3270000, 3435000, 3605000, 3785000,
27 3975000, 4175000, 4385000, 4605000 29 3975000, 4175000, 4385000, 4605000
28 } 30 }
29 31
32 local FRAME_LIST = {'ContainerFrame1', 'BankFrame'}
33 local BAG_FRAMES = {'ContainerFrame1'}
34 local BANK_FRAMES = {'BankFrame'}
35
30 function ap:OnLoad() 36 function ap:OnLoad()
31 self:RegisterEvent('BAG_UPDATE') -- use to obtain bag IDs to scan 37 self:RegisterEvent('BAG_UPDATE') -- use to obtain bag IDs to scan
32 self:RegisterEvent('BAG_UPDATE_DELAYED') -- use to trigger actual scan activity 38 self:RegisterEvent('BAG_UPDATE_DELAYED') -- use to trigger actual scan activity
33 self:RegisterEvent('BANKFRAME_OPENED') -- determine when bank info is available 39 self:RegisterEvent('BANKFRAME_OPENED') -- determine when bank info is available
34 self:RegisterEvent('BANKFRAME_CLOSED') -- " " " 40 self:RegisterEvent('BANKFRAME_CLOSED') -- " " "
35 self:RegisterEvent('ARTIFACT_UPDATE') -- when artifact data has changed 41 self:RegisterEvent('ARTIFACT_UPDATE') -- when artifact data has changed
36 self:RegisterEvent('ARTIFACT_XP_UPDATE') -- when artifact xp has changed (but not necessarily data) 42 self:RegisterEvent('ARTIFACT_XP_UPDATE') -- when artifact xp has changed (but not necessarily data)
37 self:RegisterEvent('MODIFIER_STATE_CHANGED')
38 self:RegisterEvent('PLAYER_REGEN_ENABLED') 43 self:RegisterEvent('PLAYER_REGEN_ENABLED')
39 self:RegisterEvent('PLAYER_REGEN_DISABLED') 44 self:RegisterEvent('PLAYER_REGEN_DISABLED')
45 self:RegisterEvent('PLAYER_ENTERING_WORLD')
40 Veneer:AddHandler(self, self.anchorPoint, true) 46 Veneer:AddHandler(self, self.anchorPoint, true)
41 SLASH_VENEER_AP1 = "/vap" 47 SLASH_VENEER_AP1 = "/vap"
42 SLASH_VENEER_AP2 = "/veneerap" 48 SLASH_VENEER_AP2 = "/veneerap"
43 SlashCmdList.VENEER_AP = function(arg) 49 SlashCmdList.VENEER_AP = function(arg)
44 if arg == 'fishing' then 50 if arg == 'fishing' then
54 self:Show() 60 self:Show()
55 end 61 end
56 end 62 end
57 63
58 self.tooltip = CreateFrame('GameTooltip', TOOLTIP_NAME, self, 'GameTooltipTemplate') 64 self.tooltip = CreateFrame('GameTooltip', TOOLTIP_NAME, self, 'GameTooltipTemplate')
59 65 tinsert(UISpecialFrames, self:GetName())
60 end 66
61 67
62 local defaultSettings = { 68 end
69
70 local addonCompatibility = {
71 ['Bagnon'] = {
72 BagFrames = {'BagnonFrameinventory'},
73 BankFrames = {'BagnonFramebank'},
74 PostHooks = {'ToggleAllBags', 'ToggleBackpack' },
75 MethodClass = 'Bagnon',
76 MethodHooks = {'BANK_OPENED', 'BANKFRAME_CLOSED'}
77 }
63 } 78 }
79
64 80
65 function ap:Setup() 81 function ap:Setup()
66 print(self:GetName()..':Setup()') 82 print(self:GetName()..':Setup()')
67 local guid = UnitGUID('player') 83 local guid = UnitGUID('player')
68 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings 84 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings
70 self.profile = VeneerData.ArtifactPower[guid] 86 self.profile = VeneerData.ArtifactPower[guid]
71 self.profile.bagslots = self.profile.bagslots or {} 87 self.profile.bagslots = self.profile.bagslots or {}
72 self.profile.artifacts = self.profile.artifacts or {} 88 self.profile.artifacts = self.profile.artifacts or {}
73 self.updateSummary = true 89 self.updateSummary = true
74 90
91 local DoTryToShow = function()
92 self:TryToShow()
93 end
94 hooksecurefunc("OpenBackpack", DoTryToShow)
95 hooksecurefunc("CloseBackpack", DoTryToShow)
96
75 -- Bagnon compatibility 97 -- Bagnon compatibility
76 -- todo: ArkInventory, Elv, etc 98 -- todo: ArkInventory, Elv, etc
77 if IsAddOnLoaded('Bagnon') then 99 for addon, args in pairs(addonCompatibility) do
78 local oToggleAllBags = ToggleAllBags 100 if IsAddOnLoaded(addon) then
79 ToggleAllBags = function() 101 for _, name in ipairs(args.BagFrames) do
80 print('|cFFFF0088ToggleAllBags') 102 tinsert(FRAME_LIST, name)
81 oToggleAllBags() 103 tinsert(BAG_FRAMES, name)
82 if BagnonFrameinventory:IsShown() then 104 end
83 self:Show() 105 for _, name in ipairs(args.BankFrames) do
84 else 106 tinsert(FRAME_LIST, name)
85 self.enabled = nil 107 tinsert(BAG_FRAMES, name)
86 self:Hide() 108 end
87 end 109 for _, name in ipairs(args.PostHooks) do
88 end 110 local oFunc = _G[name]
89 else 111 _G[name] = function(...)
90 hooksecurefunc("OpenBackpack", function() 112 print('|cFFFF0088' .. name .. '|r', ...)
91 self:Show() 113 oFunc(...)
92 end) 114 self:TryToShow()
93 hooksecurefunc("CloseBackpack", function() 115 end
94 self.enabled = nil 116 end
95 self:Hide() 117 local frame = _G[args.MethodClass]
96 end) 118 if frame then
97 end 119 for _, name in ipairs(args.MethodHooks) do
98 120 hooksecurefunc(frame, name, DoTryToShow)
99 121 end
100 end 122 end
123 end
124 end
125 end
126
101 local UNDERLIGHT_ANGLER_ID = 133755 127 local UNDERLIGHT_ANGLER_ID = 133755
102 function ap:SetArtifact(itemID, name, texture, currentXP, pointsSpent) 128 function ap:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
103 print('|cFF00FF00SetArtifact()|r') 129 print('|cFF00FF00SetArtifact()|r')
104 if not self.profile then 130 if not self.profile then
105 return 131 return
106 end 132 end
107 local artifacts = self.profile.artifacts 133 local artifacts = self.profile.artifacts
108 134
109 135
110 if itemID then 136 if itemID then
137
138 self.currentEquipped = itemID
139
111 artifacts[itemID] = artifacts[itemID] or {} 140 artifacts[itemID] = artifacts[itemID] or {}
112 table.wipe(artifacts[itemID]) 141 table.wipe(artifacts[itemID])
113 local artifact = artifacts[itemID] 142 local artifact = artifacts[itemID]
114 143
115 artifact.name = name 144 artifact.name = name
145 print(' queueing', containerID, type(containerID), #BAGS_TO_SCAN , 'in line') 174 print(' queueing', containerID, type(containerID), #BAGS_TO_SCAN , 'in line')
146 BAGS_TO_SCAN[#BAGS_TO_SCAN + 1] = containerID 175 BAGS_TO_SCAN[#BAGS_TO_SCAN + 1] = containerID
147 end 176 end
148 end 177 end
149 178
179 function ap:Reanchor()
180 if Veneer then
181 Veneer:DynamicReanchor()
182 end
183 end
184
150 function ap:OnShow() 185 function ap:OnShow()
186 print('|cFFFFFF00OnShow()|r')
151 self.enabled = true 187 self.enabled = true
152 self:Update() 188 self:ScanAllBags()
153 Veneer:DynamicReanchor() 189 self:Reanchor()
190 if not self.postShowSetup then
191 self.postShowSetup = true
192 hooksecurefunc("HideUIPanel", function() self:TryToShow() end)
193 end
154 end 194 end
155 function ap:OnHide() 195 function ap:OnHide()
156 Veneer:DynamicReanchor() 196 print('|cFF88FF00OnHide()|r')
157 end 197 self:Reanchor()
158 198 end
159 function ap:OnEnter() 199 function ap:OnEnter()
160 200
161 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR') 201 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
202
162 203
163 GameTooltip:AddLine(self.bagAP) 204 GameTooltip:AddLine(self.bagAP)
164 GameTooltip:AddLine(self.bankAP) 205 GameTooltip:AddLine(self.bankAP)
165 206
166 end 207 end
167 208
209 function ap:TryToShow()
210
211 print('|cFFFFFF00TryToShow()')
212
213 if not InCombatLockdown() then
214 for _, name in ipairs(FRAME_LIST) do
215 --print(name, (_G[name] and _G[name]:IsShown()))
216 if _G[name] and _G[name]:IsShown() then
217 if self:IsShown() then
218 self:Update()
219 else
220 self:Show()
221 end
222 return
223 end
224 end
225 end
226
227
228 self:Hide()
229 end
230
231
168 function ap:OnEvent(event, ...) 232 function ap:OnEvent(event, ...)
169 print(self:GetName()..':OnEvent()', event, ...) 233 print('|cFF00FF88OnEvent()', event, ...)
170 if event == 'BAG_UPDATE' then 234 if event == 'PLAYER_ENTERING_WORLD' then
235 self:TryToShow()
236 elseif event == 'BAG_UPDATE' then
171 local containerID = ... 237 local containerID = ...
172 self:QueueBag(containerID) 238 self:QueueBag(containerID)
173 elseif event == 'PLAYER_BANKSLOTS_CHANGED' then 239 elseif event == 'PLAYER_BANKSLOTS_CHANGED' then
174 self:ScanAllBags(true) 240 self:ScanAllBags()
175 self:Update()
176 elseif event == 'BAG_UPDATE_DELAYED' then 241 elseif event == 'BAG_UPDATE_DELAYED' then
177 self:ScanAllBags(self.bankAccess) 242 if not self.firstHit then
243 self.firstHit = true
244 else
245 self:ScanAllBags()
246 end
178 elseif event == 'BANKFRAME_OPENED' then 247 elseif event == 'BANKFRAME_OPENED' then
179 self.bankAccess = true 248 self.bankAccess = true
180 self:ScanAllBags(true) 249 self:ScanAllBags()
181 elseif event == 'BANKFRAME_CLOSED' then 250 elseif event == 'BANKFRAME_CLOSED' then
182 self.bankAccess = false 251 self.bankAccess = nil
183 elseif event == 'ARTIFACT_UPDATE' then 252 elseif event == 'ARTIFACT_UPDATE' then
184 local newItem = ... 253 local newItem = ...
185 if newItem then 254 if newItem then
186 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetArtifactInfo() 255 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetArtifactInfo()
187 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent) 256 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
191 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetEquippedArtifactInfo() 260 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetEquippedArtifactInfo()
192 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent) 261 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
193 self:ScanAllBags(self.bankAccess) 262 self:ScanAllBags(self.bankAccess)
194 elseif event == 'PLAYER_REGEN_ENABLED' then 263 elseif event == 'PLAYER_REGEN_ENABLED' then
195 if self.enabled then 264 if self.enabled then
196 self:Show() 265 if self.queuedScan then
266 self:ScanAllBags(self.backAccess)
267 else
268 self:TryToShow()
269 end
197 end 270 end
198 271
199 elseif event == 'PLAYER_REGEN_DISABLED' then 272 elseif event == 'PLAYER_REGEN_DISABLED' then
200 self:Hide() 273 self:Hide()
201 end 274 end
206 self:Hide() 279 self:Hide()
207 end 280 end
208 281
209 function ap:Update() 282 function ap:Update()
210 if not self:IsShown() then 283 if not self:IsShown() then
284 print('|cFFFF4400Update()|r')
211 return 285 return
212 end 286 end
213 print('|cFF00FFFFUpdate()|r') 287 print('|cFF00FFFFUpdate()|r')
214 288
215 local bankText, bagText 289 local bankText, bagText
216 if not (self.bankAP and self.bagAP) then 290 if not (self.bankAP and self.bagAP) then
217 bankText = '|cFFFF0000Open bank frame to count all AP|r ' 291 bankText = '|cFFFF0000Open bank frame to count all AP|r '
218 else 292 else
219 if (self.bagAP + self.bankAP) == 0 then 293 if (self.bagAP + self.bankAP) == 0 then
220 bankText = '|cFF00FFFFNo Items|r' 294 bankText = '|cFFFF4400No Artifact Power tokens on hand|r'
221 else 295 else
222 if self.bagAP and (self.bagAP > 0) then 296 if self.bagAP and (self.bagAP > 0) then
223 bankText = '|cFFFFFFFF' .. tostring(self.bagAP) .. '|r' 297 bankText = '|cFFFFFFFF' .. tostring(self.bagAP) .. '|r'
224 end 298 end
225 if self.bankAP and (self.bankAP > 0) then 299 if self.bankAP and (self.bankAP > 0) then
226 bankText = (bankText and (bankText .. ' | ') or '') .. '|cFFFFFF00'..tostring(self.bankAP)..'|r' 300 bankText = (bankText and (bankText .. ' | ') or '') .. '|cFFFFFF00'..tostring(self.bankAP)..'|r'
227 end 301 end
228 end 302 end
229 end 303 end
304 if self.fishingAP and self.fishingAP >= 1 then
305 bankText = (bankText and (bankText .. ' ') or '') .. '|cFF0088FF' .. tostring(self.fishingAP) .. ' fishing AP|r'
306 end
307
230 self.SummaryHeader:SetText(bankText) 308 self.SummaryHeader:SetText(bankText)
231 309
232 -- Artifact icons, in no particular order 310 -- Artifact icons, in no particular order
233 local equippedID = C_ArtifactUI.GetEquippedArtifactInfo() 311 self.equippedID = C_ArtifactUI.GetEquippedArtifactInfo()
234 local numButtons = 0 312 local numButtons = 0
235 local lastFrame 313 local lastFrame = self
236 local fishingRod, fishingID, fishingData 314 local fishingID, fishingData
237 local index, button 315 local index, button
238 for itemID, artifact in pairs(self.profile.artifacts) do 316 for itemID, artifact in pairs(self.profile.artifacts) do
239 local isFishingRod = (itemID == UNDERLIGHT_ANGLER_ID) 317 if (itemID == UNDERLIGHT_ANGLER_ID) then
240 if isFishingRod then
241 if VeneerData.ArtifactPower.EnableFishing then 318 if VeneerData.ArtifactPower.EnableFishing then
242 fishingID = itemID 319 fishingID = itemID
243 fishingData = artifact 320 fishingData = artifact
244 end 321 end
245 322
246 else 323 else
247 numButtons = numButtons + 1 324 numButtons = numButtons + 1
248 button = self.Artifact[numButtons] 325 button = self.Artifact[numButtons]
249 lastFrame = button:SetButton(itemID, artifact, lastFrame) 326 button.relativeFrame = lastFrame
327 lastFrame = button:SetButton(itemID, artifact, numButtons, (self.equippedID == itemID))
250 end 328 end
251 329
252 end 330 end
253 331
254 if fishingData then 332 if fishingData then
255 numButtons = numButtons + 1 333 numButtons = numButtons + 1
256 local button = self.Artifact[GetNumSpecializations()+1] 334 local button = self.Artifact[numButtons]
257 button:SetButton(fishingID, fishingData, lastFrame) 335 button.relativeFrame = lastFrame
258 end 336 button:SetButton(fishingID, fishingData, numButtons, self.equippedID == fishingID)
259 337 end
260 for i = numButtons+ (fishingRod and 2 or 1), #self.Artifact do 338
339 for i = numButtons+ 1, #self.Artifact do
261 print('hide', i) 340 print('hide', i)
262 self.Artifact[i]:Hide() 341 self.Artifact[i]:Hide()
263 end 342 end
264 343
344 self:UpdateItemButtons()
265 345
266 346
267 self:SetWidth(64*numButtons + 4 * (numButtons+1)) 347 self:SetWidth(64*numButtons + 4 * (numButtons+1))
268 self:SetHeight(12 + self.SummaryHeader:GetHeight() + 64) 348 self:SetHeight(12 + self.SummaryHeader:GetHeight() + 64)
269 self:Reanchor() 349 self:Reanchor()
270 350
351 end
352
353
354 function ap:UpdateItemButtons()
355 print('|cFF00FFFFUpdateItemButtons()|r')
356 local lastFrame, upFrame
357 local numButtons = 0
358 for index, button in ipairs(self.Tokens) do
359 if button.numItems >= 1 then
360 if button.itemName then
361 self:SetItemAction(button)
362 end
363
364 button:ClearAllPoints()
365 numButtons = numButtons + 1
366 print(index, button:GetID(), button.Icon:GetTexture())
367 if numButtons == 1 then
368 button:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', 0, -2)
369 upFrame = button
370 elseif mod(numButtons,8) == 1 then
371 button:SetPoint('TOPLEFT', upFrame, 'BOTTOMLEFT', 0, -2)
372 upFrame = button
373 else
374 button:SetPoint('TOPLEFT', lastFrame, 'TOPRIGHT', 2, 0)
375 end
376 button.Count:SetText(button.numItems)
377 lastFrame = button
378 button:Show()
379 else
380
381 button:Hide()
382 end
383
384 end
385
386 end
387
388 function ap:SetItemAction(button, name)
389 name = name or self.itemName
390 if InCombatLockdown() then
391 self.itemName = name
392 return
393 else
394 button:SetAttribute('*type*','item')
395 button:SetAttribute('*item*', name)
396 end
397 end
398
399 function ap:GetItemButton(itemID, texture, itemAP)
400 print('|cFF00FFFFGetItemButton()|r', itemID, texture, itemAP)
401 local button = self.ItemButtons[itemID]
402 if not button then
403 button = CreateFrame('Button', 'VeneerAPToken'..itemID, self, 'VeneerItemButton')
404 button:SetPushedTexture([[Interface\Buttons\UI-Quickslot-Depress]])
405 button:SetHighlightTexture([[Interface\Buttons\ButtonHilight-Square]],"ADD")
406 button:SetID(itemID)
407 button.numItems = 0
408 button.Icon:SetTexture(texture)
409 button.Label:SetText(itemAP)
410 button:RegisterForClicks("AnyUp")
411 self:SetItemAction(button, GetItemInfo(itemID))
412
413 print(' created')
414 self.ItemButtons[itemID] = button
415 self.numItems = self.numItems + 1
416 end
417
418 button.numItems = button.numItems + 1
419 return button
271 end 420 end
272 421
273 function ap:ScanBag(id) 422 function ap:ScanBag(id)
274 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id)) 423 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id))
275 local numSlots = GetContainerNumSlots(id) 424 local numSlots = GetContainerNumSlots(id)
281 430
282 self.profile.bagslots[id] = self.profile.bagslots[id] or {} 431 self.profile.bagslots[id] = self.profile.bagslots[id] or {}
283 table.wipe(self.profile.bagslots[id]) 432 table.wipe(self.profile.bagslots[id])
284 local bagData = self.profile.bagslots[id] 433 local bagData = self.profile.bagslots[id]
285 bagData.totalAP = 0 434 bagData.totalAP = 0
435 bagData.fishingAP = 0
436 bagData.items = bagData.items or {}
437 table.wipe(bagData.items)
438
286 for slotID = 1, numSlots do 439 for slotID = 1, numSlots do
287 local texture, count, locked, quality, readable, lootable, link = GetContainerItemInfo(id, slotID) 440 local texture, count, locked, quality, readable, lootable, link = GetContainerItemInfo(id, slotID)
288 local itemID = GetContainerItemID(id, slotID) 441 local itemID = GetContainerItemID(id, slotID)
289 442
290 if link then 443 if link then
303 local itemAP = tonumber(text) 456 local itemAP = tonumber(text)
304 if itemAP then 457 if itemAP then
305 requiresUpdate = true 458 requiresUpdate = true
306 bagData.numItems = (bagData.numItems or 0) + 1 459 bagData.numItems = (bagData.numItems or 0) + 1
307 bagData.totalAP = (bagData.totalAP or 0) + itemAP 460 bagData.totalAP = (bagData.totalAP or 0) + itemAP
308 bagData.items = bagData.items or {} 461 bagData.items[itemID] = (bagData.items[itemID] or 0) + 1
309 if not bagData.items[itemID] then 462
310 bagData.numUnique = (bagData.numUnique or 0) + 1 463
311 end 464 local itemButton = self:GetItemButton(itemID, texture, itemAP)
312 bagData.items[itemID] = (bagData.items[itemAP] or 0) + 1
313 end 465 end
314 end 466 end
315 end 467 end
316 end 468 end
469 local fishingText = _G[TOOLTIP_NAME .. 'TextLeft3']:GetText()
470 if fishingText and fishingText:match('fishing artifact') then
471 local fishingAP = fishingText:match("%d+")
472 fishingAP = tonumber(fishingAP)
473 if fishingAP then
474 bagData.fishingItems = (bagData.fishingItems or 0) + 1
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
317 end 483 end
318 end 484 end
319 485
320 if self.profile.artifacts[itemID] then 486 if self.profile.artifacts[itemID] then
321 print('artfiact weapon', itemID, link, id, slotID) 487 print('artfiact weapon', itemID, link, id, slotID)
327 493
328 end 494 end
329 495
330 local BAG_SLOTS = {0, 1, 2, 3, 4 } 496 local BAG_SLOTS = {0, 1, 2, 3, 4 }
331 local BANK_SLOTS = {-1, 5, 6,7, 8, 9, 10, 11, 12} 497 local BANK_SLOTS = {-1, 5, 6,7, 8, 9, 10, 11, 12}
332 498 local ItemCounts = {}
333 function ap:ScanAllBags(checkBank) 499 function ap:ScanAllBags()
500 if InCombatLockdown() then
501 self.queuedScan = true
502 return
503 end
504 self.queuedScan = nil
505
334 print('|cFFFF0088ScanAllBags()|r') 506 print('|cFFFF0088ScanAllBags()|r')
507
508 for _, button in ipairs(self.Tokens) do
509 button.numItems = 0
510 end
511
335 512
336 for _, bagID in ipairs(BAG_SLOTS) do 513 for _, bagID in ipairs(BAG_SLOTS) do
337 self:ScanBag(bagID) 514 self:ScanBag(bagID)
338 end 515 end
339 516
340 if checkBank then 517 if self.bankAccess then
341 for _, bagID in ipairs(BANK_SLOTS) do 518 for _, bagID in ipairs(BANK_SLOTS) do
342 self:ScanBag(bagID) 519 self:ScanBag(bagID)
343 end 520 end
344 end 521 end
345 522
346 self.bankAP = 0 523 self.bankAP = 0
347 self.bagAP = 0 524 self.bagAP = 0
525 self.fishingAP = 0
526
527 table.wipe(ItemCounts)
348 for id, bagData in pairs(self.profile.bagslots) do 528 for id, bagData in pairs(self.profile.bagslots) do
349 print(id, GetBagName(id), bagData.totalAP) 529 print(id, GetBagName(id), bagData.totalAP)
350 id = tonumber(id) 530 id = tonumber(id)
351 if bagData.totalAP then 531 if bagData.totalAP then
352 if (id == BANK_CONTAINER) or (id >= 5) then 532 if (id == BANK_CONTAINER) or (id >= 5) then
353 self.bankAP = self.bankAP + bagData.totalAP 533 self.bankAP = self.bankAP + bagData.totalAP
354 else 534 else
355 self.bagAP = self.bagAP + bagData.totalAP 535 self.bagAP = self.bagAP + bagData.totalAP
356 end 536 end
357 end 537 end
538 if bagData.fishingAP then
539 self.fishingAP = self.fishingAP + bagData.fishingAP
540 end
358 541
359 end 542 end
360 self.lastUpdate = GetTime() 543 self.lastUpdate = GetTime()
361 self:Update() 544 self:TryToShow()
362 self.updateSummary = nil
363 end 545 end
364 546
365 VeneerArtifactButtonMixin = {} 547 VeneerArtifactButtonMixin = {}
366 548
367 function VeneerArtifactButtonMixin:SetButton(itemID, artifact, lastFrame) 549 function VeneerArtifactButtonMixin:SetButton(itemID, artifact, index, equipped)
550 print(itemID, index)
368 print(artifact.name, artifact.texture, artifact.currentXP) 551 print(artifact.name, artifact.texture, artifact.currentXP)
369 self:SetID(itemID) 552 self:SetID(itemID)
370 for k,v in pairs(artifact) do 553 for k,v in pairs(artifact) do
371 --print('::',k,v) 554 --print('::',k,v)
372 self[k] = v 555 self[k] = v
373 end 556 end
374 557
375 -- this can change between artifact parses 558 -- this can change between artifact parses
376 local potentialPoints = self.actualLevel 559 local potentialPoints = self.actualLevel
377 local totalAP = (itemID == UNDERLIGHT_ANGLER_ID) and ((self:GetParent().bankAP or 0) + (self:GetParent().bagAP or 0)) or (self.fishingAP or 0) 560 local totalAP = (itemID ~= UNDERLIGHT_ANGLER_ID) and ((self:GetParent().bankAP or 0) + (self:GetParent().bagAP or 0)) or (self:GetParent().fishingAP or 0)
561 print(totalAP)
378 local potentialXP = self.actualXP + totalAP 562 local potentialXP = self.actualXP + totalAP
563
379 self.potentialXP = potentialXP 564 self.potentialXP = potentialXP
380 local potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints) 565 local potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints)
381 while potentialXP >= potentialCost do 566 while potentialXP >= potentialCost do
382 potentialXP = potentialXP - potentialCost 567 potentialXP = potentialXP - potentialCost
383 potentialPoints = potentialPoints + 1 568 potentialPoints = potentialPoints + 1
387 self.potentialCost = potentialCost 572 self.potentialCost = potentialCost
388 self.potentialLevel = potentialPoints 573 self.potentialLevel = potentialPoints
389 self.potentialAdjustedXP = potentialXP 574 self.potentialAdjustedXP = potentialXP
390 575
391 576
392 577 if index ~= 1 then
393 self.isEquipped = (equippedID == itemID) 578 self:ClearAllPoints()
394 self.relativeFrame = lastFrame 579 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPRIGHT', 4, 0)
580 else
581 self:ClearAllPoints()
582 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPLEFT', 4, -4)
583 end
584
585 self.isEquipped = equipped
395 self:Update() 586 self:Update()
396 self:Show() 587 self:Show()
397 return self 588 return self
398 end 589 end
399 590
400 function VeneerArtifactButtonMixin:Update() 591 function VeneerArtifactButtonMixin:Update()
401 592
593 local r, g, b = 1, 1, 1
594 local lR, lG, lB = 1, 1, 0
595 local levelText = self.level
596 local xpValue = self.currentXP
597 local costValue = self.cost
402 if self.actualLevel ~= self.level then 598 if self.actualLevel ~= self.level then
403 self.Level:SetText(self.actualLevel) 599 levelText, r,g,b = self.actualLevel, 0,1,0
404 self.Level:SetTextColor(0,1,0) 600 xpValue, costValue, lR, lG, lB = self.actualXP, self.actualCost, 0, 1, 0
405 self.CurrentXP:SetText(self.adjustedXP) 601 elseif self.potentialLevel ~= self.level then
406 self.CurrentXP:SetTextColor(0,1,0) 602 levelText, r, g, b = self.potentialLevel, 0,1,1
407 else 603 xpValue, costValue, lR, lG, lB = self.potentialAdjustedXP, self.potentialCost, 0,1,0
408 self.Level:SetText(self.level, 1, 1, 1) 604
409 self.Level:SetTextColor(1,1,1) 605 end
410 self.CurrentXP:SetText(self.currentXP) 606
411 self.CurrentXP:SetTextColor(1,1,0) 607 if xpValue >= 100000 then
412 end 608 xpValue = tostring(floor(xpValue/1000))..'k'
609 elseif xpValue > 1000 then
610 xpValue = tostring(floor(xpValue/100)/10)..'k'
611 end
612 if costValue >= 100000 then
613 costValue = tostring(floor(costValue/1000))..'k'
614 elseif costValue >= 1000 then
615 costValue = tostring(floor(costValue/100)/10)..'k'
616 end
617
618
619 self.Level:SetText(levelText)
620 self.Level:SetTextColor(r, g, b)
621 self.CurrentXP:SetText(xpValue)
622 self.CurrentXP:SetTextColor(lR, lG, lB)
413 623
414 if self.isEquipped then 624 if self.isEquipped then
415 self:SetNormalTexture([[Interface\Buttons\ButtonHilight-Square]]) 625 self:SetNormalTexture([[Interface\Buttons\ButtonHilight-Square]])
416 self:GetNormalTexture():SetBlendMode('ADD') 626 self:GetNormalTexture():SetBlendMode('ADD')
417 self:GetNormalTexture():SetVertexColor(0,1,0) 627 self:GetNormalTexture():SetVertexColor(0,1,0)
418 else 628 else
419 self:SetNormalTexture(nil, 'ADD') 629 self:SetNormalTexture(nil, 'ADD')
420 end 630 end
421 631
422 self:ClearAllPoints()
423 if self.relativeFrame then
424 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPRIGHT', 4, 0)
425 else
426 self:SetPoint('TOPLEFT', 4, -4)
427 end
428 local currentProgress = (self.currentXP < self.cost) and (self.currentXP / self.cost) or 1 632 local currentProgress = (self.currentXP < self.cost) and (self.currentXP / self.cost) or 1
429 if self.level <= 53 then 633 if self.level <= 53 then
634
430 self.CurrentProgress.animateFrom = self.CurrentProgress:GetHeight() or 1 635 self.CurrentProgress.animateFrom = self.CurrentProgress:GetHeight() or 1
431 self.CurrentProgress.animateTo = currentProgress * self:GetHeight() 636 self.CurrentProgress.animateTo = currentProgress * self:GetHeight()
432 self.CurrentProgress:Show() 637 self.CurrentProgress:Show()
433 else 638 else
434 self.CurrentProgress:Hide() 639 self.CurrentProgress:Hide()
435 end 640 end
436 print(currentProgress) 641
437 if self.potentialXP > self.currentXP then 642 if self.potentialXP > self.currentXP then
438 local projectedProgress = (self.potentialAdjustedXP < self.potentialCost) and (self.potentialAdjustedXP / self.potentialCost) or 1 643 local projectedProgress = (self.potentialAdjustedXP < self.potentialCost) and (self.potentialXP / self.potentialCost) or 1
439 print(projectedProgress) 644
440 if (projectedProgress > currentProgress) then 645 if (projectedProgress > currentProgress) then
441 self.AdjustedProgress:SetPoint('BOTTOM', self.CurrentProgress, 'TOP') 646 self.AdjustedProgress:SetPoint('BOTTOM', self.CurrentProgress, 'TOP')
442 projectedProgress = projectedProgress - currentProgress 647 projectedProgress = projectedProgress - currentProgress
443 print(projectedProgress) 648
444 else 649 else
445 self.AdjustedProgress:SetPoint('BOTTOM', self, 'BOTTOM') 650 self.AdjustedProgress:SetPoint('BOTTOM', self, 'BOTTOM')
446 end 651 end
652 print('show potential', currentProgress, projectedProgress)
447 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1 653 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1
448 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight() 654 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight()
449 655
450 self.AdjustedProgress:Show() 656 self.AdjustedProgress:Show()
451 else 657 else
452 self.AdjustedProgress:Hide() 658 self.AdjustedProgress:Hide()
453 end 659 end
454 660
661
455 self.Icon:SetTexture(self.texture) 662 self.Icon:SetTexture(self.texture)
456 self.Name:SetText(self.name)
457 self:SetSize(64,64) 663 self:SetSize(64,64)
458 end 664 end
459 665
460 666
461 function VeneerArtifactButtonMixin:AnimateProgress(region) 667 function VeneerArtifactButtonMixin:AnimateProgress(region)
493 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR') 699 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
494 GameTooltip:SetText(self.name) 700 GameTooltip:SetText(self.name)
495 GameTooltip:AddLine(tostring(self.currentXP) .. ' / '..tostring(self.cost), 1, 1, 0) 701 GameTooltip:AddLine(tostring(self.currentXP) .. ' / '..tostring(self.cost), 1, 1, 0)
496 if self.potentialXP > self.currentXP then 702 if self.potentialXP > self.currentXP then
497 GameTooltip:AddLine(tostring(self.potentialXP) .. ' potential XP', 0, 1, 1) 703 GameTooltip:AddLine(tostring(self.potentialXP) .. ' potential XP', 0, 1, 1)
498 if self.adjustedXP ~= self.potentialXP then 704 if self.potentialAdjustedXP ~= self.potentialXP then
499 GameTooltip:AddLine(tostring(self.potentialAdjustedXP) .. ' / ' .. tostring(self.potentialAdjustedCost).. ' after spending', 0, 1, 0) 705 GameTooltip:AddLine(tostring(self.potentialAdjustedXP) .. ' / ' .. tostring(self.potentialCost).. ' after', 0, 1, 0)
500 end 706 end
501 end 707 end
708 if self.actualLevel ~= self.level then
709 GameTooltip:AddLine(tostring(self.actualLevel - self.level) .. ' points unlocked', 0, 1, 1)
710 end
711
502 GameTooltip:Show() 712 GameTooltip:Show()
503 end 713 end
504 function VeneerArtifactButtonMixin:OnLeave() 714 function VeneerArtifactButtonMixin:OnLeave()
505 if GameTooltip:IsOwned(self) then 715 if GameTooltip:IsOwned(self) then
506 GameTooltip:Hide() 716 GameTooltip:Hide()