Nenue@97
|
1 -- Veneer
|
Nenue@97
|
2 -- ArtifactPower.lua
|
Nenue@97
|
3 -- Created: 1/15/2017 11:44 PM
|
Nenue@97
|
4 -- %file-revision%
|
Nenue@97
|
5 --
|
Nenue@97
|
6
|
Nenue@97
|
7 local print = DEVIAN_WORKSPACE and function(...) print('VnAP', ...) end or nop
|
Nenue@97
|
8 VeneerArtifactPowerMixin = {
|
Nenue@99
|
9 numItems = 0,
|
Nenue@99
|
10 Tokens = {},
|
Nenue@101
|
11 cache = {},
|
Nenue@101
|
12 fishingCache = {},
|
Nenue@101
|
13 scanQueue = {},
|
Nenue@99
|
14 ItemButtons = {},
|
Nenue@97
|
15 anchorPoint = 'TOP',
|
Nenue@115
|
16 anchorPriority = 2,
|
Nenue@97
|
17 anchorFrom = 'TOP',
|
Nenue@115
|
18 moduleName = 'Artifactor',
|
Nenue@115
|
19 HideCombat = true
|
Nenue@97
|
20 }
|
Nenue@101
|
21 local defaultSettings = {
|
Nenue@101
|
22 firstUse = true,
|
Nenue@101
|
23 autoHide = true,
|
Nenue@101
|
24 }
|
Nenue@97
|
25 local ap = VeneerArtifactPowerMixin
|
Nenue@97
|
26 local BAGS_TO_SCAN = {BACKPACK_CONTAINER }
|
Nenue@97
|
27 local TOOLTIP_NAME = 'VeneerAPScanner'
|
Nenue@98
|
28 local POINT_COSTS = {
|
Nenue@98
|
29 100, 300, 325, 350, 375,
|
Nenue@98
|
30 400, 425, 450, 525, 625,
|
Nenue@98
|
31 750, 875, 1000, 6840, 8830,
|
Nenue@98
|
32 11280, 14400, 18620, 24000, 30600,
|
Nenue@98
|
33 39520, 50880, 64800, 82500, 105280,
|
Nenue@98
|
34 138650, 182780, 240870, 325520, 417560,
|
Nenue@98
|
35 546000, 718200, 946660, 1245840, 1635200,
|
Nenue@98
|
36 191500, 2010000, 2110000, 2215000, 2325000,
|
Nenue@98
|
37 2440000, 2560000, 2690000, 2825000, 2965000,
|
Nenue@98
|
38 3115000, 3270000, 3435000, 3605000, 3785000,
|
Nenue@98
|
39 3975000, 4175000, 4385000, 4605000
|
Nenue@98
|
40 }
|
Nick@111
|
41 local FISHING_MAX_TRAITS = 24
|
Nick@111
|
42 local WEAPON_MAX_TRAITS = 54
|
Nick@111
|
43 local BUTTON_SIZE = 48
|
Nenue@99
|
44 local FRAME_LIST = {'ContainerFrame1', 'BankFrame'}
|
Nenue@99
|
45 local BAG_FRAMES = {'ContainerFrame1'}
|
Nenue@99
|
46 local BANK_FRAMES = {'BankFrame'}
|
Nenue@99
|
47
|
Nenue@97
|
48 function ap:OnLoad()
|
Nenue@97
|
49 self:RegisterEvent('BAG_UPDATE') -- use to obtain bag IDs to scan
|
Nenue@97
|
50 self:RegisterEvent('BAG_UPDATE_DELAYED') -- use to trigger actual scan activity
|
Nenue@97
|
51 self:RegisterEvent('BANKFRAME_OPENED') -- determine when bank info is available
|
Nenue@97
|
52 self:RegisterEvent('BANKFRAME_CLOSED') -- " " "
|
Nenue@97
|
53 self:RegisterEvent('ARTIFACT_UPDATE') -- when artifact data has changed
|
Nenue@98
|
54 self:RegisterEvent('ARTIFACT_XP_UPDATE') -- when artifact xp has changed (but not necessarily data)
|
Nenue@97
|
55 self:RegisterEvent('PLAYER_REGEN_ENABLED')
|
Nenue@97
|
56 self:RegisterEvent('PLAYER_REGEN_DISABLED')
|
Nenue@99
|
57 self:RegisterEvent('PLAYER_ENTERING_WORLD')
|
Nick@108
|
58 self:RegisterEvent('ITEM_LOCK_CHANGED') -- use to clear bag slot cache data
|
Nenue@115
|
59 Veneer:AddHandler(self)
|
Nenue@97
|
60 SLASH_VENEER_AP1 = "/vap"
|
Nenue@97
|
61 SLASH_VENEER_AP2 = "/veneerap"
|
Nenue@98
|
62 SlashCmdList.VENEER_AP = function(arg)
|
Nenue@98
|
63 if arg == 'fishing' then
|
Nenue@98
|
64 if VeneerData.ArtifactPower.EnableFishing then
|
Nenue@98
|
65 VeneerData.ArtifactPower.EnableFishing = nil
|
Nenue@98
|
66 else
|
Nenue@98
|
67 VeneerData.ArtifactPower.EnableFishing = true
|
Nenue@98
|
68 end
|
Nenue@98
|
69 self:Print('Show Underlight Angler:', (VeneerData.ArtifactPower.EnableFishing and 'ON' or 'OFF'))
|
Nenue@98
|
70 self:Update()
|
Nick@108
|
71 elseif arg == 'reset' then
|
Nick@108
|
72 if self.db then
|
Nick@108
|
73 table.wipe(self.db.cache)
|
Nick@108
|
74 table.wipe(self.db.fishingCache)
|
Nick@108
|
75 end
|
Nick@108
|
76 self:Print('Cache data reset.')
|
Nick@108
|
77 self:Update()
|
Nenue@98
|
78 else
|
Nenue@98
|
79 self:Show()
|
Nenue@98
|
80 end
|
Nenue@97
|
81 end
|
Nenue@97
|
82
|
Nenue@97
|
83 self.tooltip = CreateFrame('GameTooltip', TOOLTIP_NAME, self, 'GameTooltipTemplate')
|
Nenue@99
|
84
|
Nenue@97
|
85
|
Nenue@97
|
86 end
|
Nick@108
|
87 local ShortNumberString = function (value)
|
Nick@108
|
88 if value >= 100000 then
|
Nick@108
|
89 return tostring(floor(value/1000)) .. 'k'
|
Nick@108
|
90 elseif value >= 1000 then
|
Nick@108
|
91 return tostring(floor(value/100)/10) .. 'k'
|
Nick@108
|
92 else
|
Nick@108
|
93 return value
|
Nick@108
|
94 end
|
Nick@108
|
95 end
|
Nenue@97
|
96
|
Nenue@102
|
97
|
Nenue@102
|
98 local IsBagnonOpen = function()
|
Nenue@102
|
99 return ((BagnonFramebank and BagnonFramebank:IsShown()) or (BagnonFrameinventory and BagnonFrameinventory:IsShown()))
|
Nenue@102
|
100 end
|
Nenue@99
|
101 local addonCompatibility = {
|
Nenue@99
|
102 ['Bagnon'] = {
|
Nenue@99
|
103 BagFrames = {'BagnonFrameinventory'},
|
Nenue@99
|
104 BankFrames = {'BagnonFramebank'},
|
Nenue@102
|
105 FrameMethods = {
|
Nenue@103
|
106 ['Hide'] = IsBagnonOpen,
|
Nenue@103
|
107 ['Show'] = IsBagnonOpen
|
Nenue@102
|
108 },
|
Nenue@103
|
109 PostHooks = {},
|
Nenue@99
|
110 MethodClass = 'Bagnon',
|
Nenue@102
|
111 MethodHooks = {'BANK_OPENED', 'BANKFRAME_CLOSED'},
|
Nenue@102
|
112
|
Nenue@99
|
113 }
|
Nenue@97
|
114 }
|
Nenue@97
|
115
|
Nenue@103
|
116
|
Nenue@103
|
117
|
Nenue@103
|
118 local queued_hooks = {}
|
Nenue@103
|
119 local function CreateHook(...)
|
Nenue@103
|
120 if select('#', ...) >= 2 then
|
Nenue@103
|
121 tinsert(queued_hooks, {...})
|
Nenue@103
|
122 end
|
Nenue@103
|
123 if not InCombatLockdown() then
|
Nenue@103
|
124 local info = tremove(queued_hooks)
|
Nenue@103
|
125 while info do
|
Nick@111
|
126 --[[local oFunc = tremove(info, #info)
|
Nick@111
|
127 local args = info
|
Nick@111
|
128
|
Nick@111
|
129 local func = function(...)
|
Nick@111
|
130 print('|cFFFF0088Callback:|r', unpack(args))
|
Nick@111
|
131
|
Nick@111
|
132 oFunc(...)
|
Nick@111
|
133 end
|
Nick@111
|
134 print('hooking', unpack(info), oFunc, func)
|
Nick@111
|
135 hooksecurefunc(unpack(info), func)
|
Nick@111
|
136 --]]
|
Nenue@103
|
137 hooksecurefunc(unpack(info))
|
Nenue@103
|
138 info = tremove(queued_hooks)
|
Nenue@103
|
139 end
|
Nenue@103
|
140
|
Nenue@103
|
141 end
|
Nenue@103
|
142 end
|
Nenue@103
|
143
|
Nenue@102
|
144 local function AddFrameHooks(frame, args)
|
Nenue@102
|
145 for funcName, func in pairs(args.FrameMethods) do
|
Nenue@102
|
146 print('binding', frame:GetName(), funcName, 'to', tostring(func))
|
Nenue@103
|
147 CreateHook(frame, funcName, function()
|
Nick@111
|
148 print(frame:GetName(), funcName, 'hook')
|
Nenue@103
|
149 VeneerArtifactPower:TryToShow()
|
Nenue@103
|
150 end)
|
Nenue@102
|
151 end
|
Nenue@102
|
152 end
|
Nenue@102
|
153 local PENDING_HOOKS = {}
|
Nenue@102
|
154
|
Nenue@102
|
155 local function RegisterInventoryFrame(name, listType, args)
|
Nenue@102
|
156 print('register', name, 'as inventory frame type =', (listType == BAG_FRAMES) and 'bags' or 'bank')
|
Nenue@102
|
157 tinsert(FRAME_LIST, name)
|
Nenue@102
|
158 tinsert(listType, name)
|
Nenue@102
|
159 if _G[name] then
|
Nenue@102
|
160 AddFrameHooks(_G[name], args)
|
Nenue@102
|
161 else
|
Nenue@102
|
162 PENDING_HOOKS[name] = args
|
Nenue@102
|
163 end
|
Nenue@102
|
164 end
|
Nenue@102
|
165
|
Nenue@97
|
166 function ap:Setup()
|
Nenue@97
|
167 print(self:GetName()..':Setup()')
|
Nenue@97
|
168 local guid = UnitGUID('player')
|
Nenue@97
|
169 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings
|
Nenue@101
|
170 self.db = VeneerData.ArtifactPower
|
Nenue@101
|
171 self.db[guid] = self.db[guid] or {}
|
Nenue@101
|
172 self.db.cache = self.db.cache or {}
|
Nenue@101
|
173 self.db.fishingCache = self.db.fishingCache or {}
|
Nenue@101
|
174
|
Nenue@101
|
175 for i, data in pairs(self.cache) do
|
Nenue@101
|
176 -- bring in anything found before player data is active
|
Nenue@101
|
177 self.db.cache[i] = data
|
Nenue@101
|
178 end
|
Nenue@101
|
179 for i, data in pairs(self.fishingCache) do
|
Nenue@101
|
180 self.db.fishingCache[i] = data
|
Nenue@101
|
181 end
|
Nenue@101
|
182
|
Nenue@101
|
183
|
Nenue@101
|
184 self.profile = self.db[guid]
|
Nick@108
|
185 self.profile.cache = self.profile.cache or {}
|
Nick@108
|
186 self.profile.cache.bagItems = self.profile.cache.bagItems or {}
|
Nick@108
|
187 self.profile.cache.bags = self.profile.cache.bags or {}
|
Nick@108
|
188 self.profile.cache.fishing = self.profile.cache.fishing or {}
|
Nick@108
|
189 self.profile.cache.items = self.profile.cache.items or {}
|
Nenue@97
|
190 self.profile.bagslots = self.profile.bagslots or {}
|
Nenue@97
|
191 self.profile.artifacts = self.profile.artifacts or {}
|
Nenue@97
|
192 self.updateSummary = true
|
Nick@108
|
193 self.cache = self.profile.cache
|
Nenue@97
|
194
|
Nenue@101
|
195 VeneerArtifactPowerTimer:SetScript('OnUpdate', function()
|
Nenue@101
|
196 self:OnUpdate()
|
Nenue@101
|
197 end)
|
Nenue@101
|
198
|
Nenue@99
|
199 local DoTryToShow = function()
|
Nick@111
|
200
|
Nenue@99
|
201 self:TryToShow()
|
Nenue@99
|
202 end
|
Nenue@103
|
203 CreateHook("OpenBackpack", DoTryToShow)
|
Nenue@103
|
204 CreateHook("CloseBackpack", DoTryToShow)
|
Nenue@99
|
205
|
Nenue@97
|
206 -- Bagnon compatibility
|
Nenue@97
|
207 -- todo: ArkInventory, Elv, etc
|
Nenue@99
|
208 for addon, args in pairs(addonCompatibility) do
|
Nenue@99
|
209 if IsAddOnLoaded(addon) then
|
Nenue@102
|
210
|
Nenue@99
|
211 for _, name in ipairs(args.BagFrames) do
|
Nenue@102
|
212 RegisterInventoryFrame(name, BAG_FRAMES, args)
|
Nenue@99
|
213 end
|
Nenue@99
|
214 for _, name in ipairs(args.BankFrames) do
|
Nenue@102
|
215 RegisterInventoryFrame(name, BANK_FRAMES, args)
|
Nenue@99
|
216 end
|
Nenue@102
|
217
|
Nenue@102
|
218 -- should only specify non-secure functions in this table
|
Nenue@99
|
219 for _, name in ipairs(args.PostHooks) do
|
Nenue@99
|
220 local oFunc = _G[name]
|
Nenue@103
|
221 print('hook entry', name, tostring(oFunc))
|
Nenue@103
|
222 CreateHook(name, function(...)
|
Nenue@103
|
223 print('|cFFFF0088' .. name .. '|r', ..., 'original', tostring(oFunc))
|
Nenue@99
|
224 oFunc(...)
|
Nenue@99
|
225 self:TryToShow()
|
Nenue@103
|
226 end)
|
Nenue@99
|
227 end
|
Nenue@99
|
228 local frame = _G[args.MethodClass]
|
Nenue@99
|
229 if frame then
|
Nenue@103
|
230 print()
|
Nenue@99
|
231 for _, name in ipairs(args.MethodHooks) do
|
Nenue@103
|
232 CreateHook(frame, name, DoTryToShow)
|
Nenue@99
|
233 end
|
Nenue@97
|
234 end
|
Nenue@97
|
235 end
|
Nenue@97
|
236 end
|
Nenue@101
|
237
|
Nenue@101
|
238 if self.db.firstUse then
|
Nenue@101
|
239 self.db.firstUse = nil
|
Nenue@101
|
240
|
Nenue@101
|
241 end
|
Nenue@99
|
242 end
|
Nenue@97
|
243
|
Nenue@97
|
244 local UNDERLIGHT_ANGLER_ID = 133755
|
Nenue@97
|
245
|
Nick@111
|
246 function ap:ResetCache()
|
Nick@111
|
247 table.wipe(self.cache.items)
|
Nick@111
|
248 table.wipe(self.cache.fishing)
|
Nick@111
|
249 table.wipe(self.cache.bags)
|
Nick@111
|
250 table.wipe(self.cache.bagItems)
|
Nick@111
|
251 self:ScanAllBags()
|
Nick@111
|
252 end
|
Nick@111
|
253
|
Nenue@97
|
254 function ap:QueueBag(containerID)
|
Nenue@97
|
255 containerID = tonumber(containerID)
|
Nenue@97
|
256 if not containerID then
|
Nenue@97
|
257 return
|
Nenue@97
|
258 end
|
Nenue@97
|
259
|
Nenue@97
|
260 if not tContains(BAGS_TO_SCAN, containerID) then
|
Nenue@97
|
261 print(' queueing', containerID, type(containerID), #BAGS_TO_SCAN , 'in line')
|
Nenue@97
|
262 BAGS_TO_SCAN[#BAGS_TO_SCAN + 1] = containerID
|
Nenue@97
|
263 end
|
Nenue@97
|
264 end
|
Nenue@97
|
265
|
Nenue@99
|
266 function ap:Reanchor()
|
Nenue@99
|
267 if Veneer then
|
Nenue@99
|
268 Veneer:DynamicReanchor()
|
Nenue@99
|
269 end
|
Nenue@99
|
270 end
|
Nenue@99
|
271
|
Nenue@97
|
272 function ap:OnShow()
|
Nenue@99
|
273 print('|cFFFFFF00OnShow()|r')
|
Nenue@102
|
274
|
Nenue@102
|
275 for name, args in pairs(PENDING_HOOKS) do
|
Nenue@102
|
276 if _G[name] then
|
Nenue@102
|
277 AddFrameHooks(_G[name], args)
|
Nenue@102
|
278 PENDING_HOOKS[name] = nil
|
Nenue@102
|
279 end
|
Nenue@102
|
280 end
|
Nenue@102
|
281
|
Nenue@102
|
282
|
Nenue@97
|
283 self.enabled = true
|
Nenue@99
|
284 self:ScanAllBags()
|
Nenue@99
|
285 self:Reanchor()
|
Nenue@97
|
286 end
|
Nenue@97
|
287 function ap:OnHide()
|
Nick@111
|
288 print('|cFF88FF00OnHide()|r', debugstack())
|
Nenue@99
|
289 self:Reanchor()
|
Nenue@97
|
290 end
|
Nenue@97
|
291 function ap:OnEnter()
|
Nenue@97
|
292
|
Nenue@97
|
293 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
|
Nenue@97
|
294
|
Nenue@99
|
295
|
Nenue@97
|
296 GameTooltip:AddLine(self.bagAP)
|
Nenue@97
|
297 GameTooltip:AddLine(self.bankAP)
|
Nenue@97
|
298
|
Nenue@97
|
299 end
|
Nenue@97
|
300
|
Nenue@99
|
301 function ap:TryToShow()
|
Nenue@99
|
302
|
Nenue@99
|
303 print('|cFFFFFF00TryToShow()')
|
Nenue@99
|
304
|
Nenue@99
|
305 if not InCombatLockdown() then
|
Nenue@99
|
306 for _, name in ipairs(FRAME_LIST) do
|
Nenue@103
|
307 print('test:', name, (_G[name] and _G[name]:IsShown()))
|
Nick@111
|
308 if _G[name] and _G[name]:IsVisible() then
|
Nenue@99
|
309 if self:IsShown() then
|
Nenue@99
|
310 self:Update()
|
Nenue@99
|
311 else
|
Nenue@99
|
312 self:Show()
|
Nenue@99
|
313 end
|
Nenue@99
|
314 return
|
Nenue@99
|
315 end
|
Nenue@99
|
316 end
|
Nenue@99
|
317 end
|
Nenue@99
|
318
|
Nick@111
|
319 print('failed tests')
|
Nenue@99
|
320 self:Hide()
|
Nenue@99
|
321 end
|
Nenue@99
|
322
|
Nenue@99
|
323
|
Nenue@97
|
324 function ap:OnEvent(event, ...)
|
Nenue@99
|
325 print('|cFF00FF88OnEvent()', event, ...)
|
Nenue@99
|
326 if event == 'PLAYER_ENTERING_WORLD' then
|
Nenue@99
|
327 self:TryToShow()
|
Nenue@99
|
328 elseif event == 'BAG_UPDATE' then
|
Nenue@97
|
329 local containerID = ...
|
Nick@108
|
330
|
Nick@108
|
331
|
Nenue@97
|
332 self:QueueBag(containerID)
|
Nick@108
|
333 elseif event == 'ITEM_LOCK_CHANGED' then
|
Nick@108
|
334
|
Nick@108
|
335 local containerID, slotID = ...
|
Nick@108
|
336
|
Nick@108
|
337 if self.cache.bags[containerID] and self.cache.bags[containerID][slotID] then
|
Nick@108
|
338 self.cache.bags[containerID][slotID] = nil
|
Nick@108
|
339 self.cache.fishing[containerID][slotID] = nil
|
Nick@108
|
340 end
|
Nick@108
|
341
|
Nick@108
|
342
|
Nenue@97
|
343 elseif event == 'PLAYER_BANKSLOTS_CHANGED' then
|
Nenue@99
|
344 self:ScanAllBags()
|
Nenue@97
|
345 elseif event == 'BAG_UPDATE_DELAYED' then
|
Nenue@99
|
346 if not self.firstHit then
|
Nenue@99
|
347 self.firstHit = true
|
Nenue@99
|
348 else
|
Nenue@99
|
349 self:ScanAllBags()
|
Nenue@99
|
350 end
|
Nenue@97
|
351 elseif event == 'BANKFRAME_OPENED' then
|
Nenue@97
|
352 self.bankAccess = true
|
Nenue@99
|
353 self:ScanAllBags()
|
Nenue@97
|
354 elseif event == 'BANKFRAME_CLOSED' then
|
Nenue@99
|
355 self.bankAccess = nil
|
Nenue@97
|
356 elseif event == 'ARTIFACT_UPDATE' then
|
Nenue@98
|
357 local newItem = ...
|
Nenue@98
|
358 if newItem then
|
Nenue@98
|
359 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetArtifactInfo()
|
Nenue@98
|
360 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
|
Nenue@98
|
361 self:ScanAllBags(self.bankAccess)
|
Nenue@98
|
362 end
|
Nenue@98
|
363 elseif event == 'ARTIFACT_XP_UPDATE' then
|
Nenue@98
|
364 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetEquippedArtifactInfo()
|
Nenue@98
|
365 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
|
Nenue@98
|
366 self:ScanAllBags(self.bankAccess)
|
Nenue@97
|
367 elseif event == 'PLAYER_REGEN_ENABLED' then
|
Nenue@103
|
368
|
Nenue@103
|
369 if self.queuedScan then
|
Nenue@103
|
370 self:ScanAllBags(self.backAccess)
|
Nenue@103
|
371 else
|
Nenue@103
|
372 self:TryToShow()
|
Nenue@97
|
373 end
|
Nenue@97
|
374
|
Nenue@103
|
375 if #queued_hooks >= 1 then
|
Nenue@103
|
376 CreateHook()
|
Nenue@103
|
377 end
|
Nenue@97
|
378 elseif event == 'PLAYER_REGEN_DISABLED' then
|
Nenue@97
|
379 self:Hide()
|
Nenue@97
|
380 end
|
Nenue@97
|
381 end
|
Nenue@97
|
382
|
Nenue@101
|
383 function ap:OnUpdate()
|
Nenue@101
|
384 if #self.scanQueue >= 1 then
|
Nenue@101
|
385 local scanInfo = tremove(self.scanQueue, 1)
|
Nick@111
|
386 end
|
Nick@111
|
387 if IsShiftKeyDown() then
|
Nick@111
|
388 self.Refresh:Show()
|
Nick@111
|
389 else
|
Nick@111
|
390 self.Refresh:Hide()
|
Nick@111
|
391 end
|
Nenue@101
|
392
|
Nenue@101
|
393 end
|
Nenue@101
|
394
|
Nenue@97
|
395 function ap:OnMouseDown()
|
Nenue@97
|
396 self.enabled = nil
|
Nenue@97
|
397 self:Hide()
|
Nenue@97
|
398 end
|
Nenue@97
|
399
|
Nenue@97
|
400 function ap:Update()
|
Nenue@97
|
401 if not self:IsShown() then
|
Nenue@99
|
402 print('|cFFFF4400Update()|r')
|
Nenue@97
|
403 return
|
Nenue@97
|
404 end
|
Nenue@97
|
405 print('|cFF00FFFFUpdate()|r')
|
Nenue@97
|
406
|
Nenue@97
|
407 local bankText, bagText
|
Nenue@101
|
408 if not self.profile.knowledgeMultiplier then
|
Nenue@101
|
409 bankText = '|cFF00FF00Shift-Right-Click an artifact weapon to start building data.'
|
Nenue@101
|
410 elseif not (self.bankAP and self.bagAP) then
|
Nenue@97
|
411 bankText = '|cFFFF0000Open bank frame to count all AP|r '
|
Nenue@97
|
412 else
|
Nick@111
|
413
|
Nick@111
|
414 if self.bagAP and (self.bagAP > 0) then
|
Nick@111
|
415 bankText = 'Inventory: |cFFFFFFFF' .. ShortNumberString(self.bagAP) .. '|r'
|
Nick@111
|
416 end
|
Nick@111
|
417 if self.bankAP and (self.bankAP > 0) then
|
Nick@111
|
418 bankText = (bankText and (bankText .. ' | ') or '') .. '|cFFFFFF00'..ShortNumberString(self.bankAP)..' banked|r'
|
Nick@111
|
419 end
|
Nick@111
|
420 if self.fishingAP and self.fishingAP > 0 then
|
Nick@111
|
421 bankText = (bankText and (bankText .. ' | ') or '') .. '|cFF0088FF' .. ShortNumberString(self.fishingAP) .. ' fishing|r'
|
Nick@111
|
422 end
|
Nick@111
|
423 end
|
Nick@111
|
424
|
Nick@111
|
425 self.worldQuestAP = 0
|
Nick@111
|
426 if WorldPlan then
|
Nick@111
|
427
|
Nick@111
|
428 if not self.worldPlanHooked then
|
Nick@111
|
429 WorldPlan:RegisterDataCallback(function()
|
Nick@111
|
430 self:Update()
|
Nick@111
|
431 end)
|
Nick@111
|
432 end
|
Nick@111
|
433
|
Nick@111
|
434
|
Nick@111
|
435 local showWQ
|
Nick@111
|
436 print('world plan is loaded')
|
Nick@111
|
437 local worldQuests = WorldPlan:GetQuestPins()
|
Nick@111
|
438 for index, pin in ipairs(worldQuests) do
|
Nick@112
|
439 if pin.dataLoaded and (pin.rewardType == WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER) and (pin.isActive) then
|
Nick@111
|
440 showWQ = true
|
Nick@111
|
441 print(pin.itemNumber)
|
Nick@111
|
442 self.worldQuestAP = self.worldQuestAP + pin.itemNumber
|
Nenue@98
|
443 end
|
Nenue@98
|
444 end
|
Nick@111
|
445
|
Nick@111
|
446 if showWQ then
|
Nick@111
|
447 bankText = (bankText and (bankText .. '\n') or '') .. '|cFFFFBB00World Quests:|r |cFFFFFFFF' .. ShortNumberString(self.worldQuestAP) .. ''
|
Nick@111
|
448 end
|
Nick@111
|
449
|
Nenue@99
|
450 end
|
Nenue@99
|
451
|
Nenue@97
|
452 self.SummaryHeader:SetText(bankText)
|
Nenue@97
|
453
|
Nenue@101
|
454 local numButtons = 0
|
Nick@111
|
455 local contentsHeight = 16 + self.SummaryHeader:GetHeight()
|
Nick@111
|
456 local contentsWidth = self.SummaryHeader:GetWidth() + 16
|
Nenue@101
|
457 if self.profile.knowledgeMultiplier then
|
Nenue@101
|
458 numButtons = self:UpdateArtifactButtons()
|
Nick@108
|
459
|
Nick@111
|
460 if numButtons ~= 0 then
|
Nick@111
|
461 contentsHeight = contentsHeight + 64
|
Nick@111
|
462 end
|
Nick@111
|
463
|
Nick@111
|
464 contentsWidth = max(contentsWidth, 64*numButtons + 4 * (numButtons+1))
|
Nick@108
|
465
|
Nick@108
|
466 local itemsWidth, itemsHeight = self:UpdateItemButtons()
|
Nick@108
|
467 contentsHeight = contentsHeight + itemsHeight
|
Nick@108
|
468 contentsWidth = max(contentsWidth, itemsWidth)
|
Nenue@101
|
469 end
|
Nenue@101
|
470
|
Nenue@101
|
471
|
Nick@111
|
472 if not self.hasArtifacts then
|
Nick@111
|
473 self:SetShown(false)
|
Nick@111
|
474 end
|
Nick@111
|
475
|
Nenue@101
|
476
|
Nick@108
|
477 self:SetWidth(contentsWidth)
|
Nick@108
|
478 self:SetHeight(contentsHeight)
|
Nenue@101
|
479 self:Reanchor()
|
Nenue@101
|
480 end
|
Nenue@101
|
481
|
Nenue@101
|
482 function ap:UpdateArtifactButtons()
|
Nenue@101
|
483
|
Nenue@97
|
484 -- Artifact icons, in no particular order
|
Nenue@99
|
485 self.equippedID = C_ArtifactUI.GetEquippedArtifactInfo()
|
Nick@111
|
486 self.canAddAP = nil
|
Nick@111
|
487 self.canAddFishingAP = nil
|
Nick@111
|
488 local hasArtifacts
|
Nenue@97
|
489 local numButtons = 0
|
Nenue@99
|
490 local lastFrame = self
|
Nenue@99
|
491 local fishingID, fishingData
|
Nenue@98
|
492 local index, button
|
Nenue@97
|
493 for itemID, artifact in pairs(self.profile.artifacts) do
|
Nenue@99
|
494 if (itemID == UNDERLIGHT_ANGLER_ID) then
|
Nenue@98
|
495 if VeneerData.ArtifactPower.EnableFishing then
|
Nenue@98
|
496 fishingID = itemID
|
Nenue@98
|
497 fishingData = artifact
|
Nenue@98
|
498 end
|
Nenue@97
|
499
|
Nick@111
|
500 if artifact.level < FISHING_MAX_TRAITS then
|
Nick@111
|
501 if itemID == self.equippedID then
|
Nick@111
|
502 self.canAddFishingAP = true
|
Nick@111
|
503 end
|
Nick@111
|
504 end
|
Nick@111
|
505
|
Nick@111
|
506
|
Nenue@98
|
507 else
|
Nick@111
|
508 if artifact.level < WEAPON_MAX_TRAITS then
|
Nick@111
|
509
|
Nick@111
|
510 if itemID == self.equippedID then
|
Nick@111
|
511 self.canAddAP = true
|
Nick@111
|
512 end
|
Nick@111
|
513 hasArtifacts = true
|
Nick@108
|
514 numButtons = numButtons + 1
|
Nick@108
|
515 button = self.Artifact[numButtons]
|
Nick@108
|
516 button.relativeFrame = lastFrame
|
Nick@111
|
517 lastFrame = button:SetButton(itemID, artifact, numButtons, (self.equippedID == itemID), nil)
|
Nick@108
|
518 end
|
Nenue@97
|
519 end
|
Nick@111
|
520 end
|
Nenue@97
|
521
|
Nenue@97
|
522
|
Nick@108
|
523 if fishingData and (self.fishingAP and self.fishingAP > 0) then
|
Nenue@98
|
524 numButtons = numButtons + 1
|
Nick@111
|
525 hasArtifacts = true
|
Nenue@99
|
526 local button = self.Artifact[numButtons]
|
Nenue@99
|
527 button.relativeFrame = lastFrame
|
Nick@111
|
528 button.isFishing = true
|
Nenue@99
|
529 button:SetButton(fishingID, fishingData, numButtons, self.equippedID == fishingID)
|
Nenue@98
|
530 end
|
Nenue@97
|
531
|
Nick@111
|
532 self.hasArtifacts = hasArtifacts
|
Nenue@99
|
533 for i = numButtons+ 1, #self.Artifact do
|
Nenue@97
|
534 print('hide', i)
|
Nenue@97
|
535 self.Artifact[i]:Hide()
|
Nenue@97
|
536 end
|
Nenue@97
|
537
|
Nick@111
|
538
|
Nenue@101
|
539 return numButtons
|
Nenue@97
|
540 end
|
Nenue@97
|
541
|
Nenue@99
|
542
|
Nenue@99
|
543 function ap:UpdateItemButtons()
|
Nenue@99
|
544 print('|cFF00FFFFUpdateItemButtons()|r')
|
Nick@111
|
545
|
Nick@111
|
546 local apType
|
Nick@111
|
547 if self.canAddFishingAP then
|
Nick@111
|
548 apType = true
|
Nick@111
|
549 elseif not self.canAddAP then
|
Nick@111
|
550 for index, button in ipairs(self.Tokens) do
|
Nick@111
|
551 button:Hide()
|
Nick@111
|
552 end
|
Nick@111
|
553 return 0, 0
|
Nick@111
|
554 end
|
Nick@111
|
555
|
Nick@111
|
556
|
Nenue@99
|
557 local lastFrame, upFrame
|
Nenue@99
|
558 local numButtons = 0
|
Nenue@101
|
559 local buttonsHeight = 0
|
Nick@108
|
560 local buttonsWidth = 0
|
Nick@111
|
561
|
Nenue@99
|
562 for index, button in ipairs(self.Tokens) do
|
Nick@111
|
563 if (button.numItems >= 1) and (button.isFishingAP == apType) then
|
Nenue@99
|
564 if button.itemName then
|
Nenue@99
|
565 self:SetItemAction(button)
|
Nenue@99
|
566 end
|
Nenue@99
|
567
|
Nenue@99
|
568 button:ClearAllPoints()
|
Nenue@99
|
569 numButtons = numButtons + 1
|
Nick@111
|
570 local col = mod(numButtons,8)
|
Nenue@99
|
571 print(index, button:GetID(), button.Icon:GetTexture())
|
Nenue@99
|
572 if numButtons == 1 then
|
Nenue@101
|
573 button:SetPoint('TOPLEFT', self, 'TOPLEFT', 4, -76)
|
Nenue@99
|
574 upFrame = button
|
Nenue@101
|
575 buttonsHeight = 52
|
Nenue@99
|
576 else
|
Nick@108
|
577 if col == 1 then
|
Nick@108
|
578 button:SetPoint('TOPLEFT', upFrame, 'BOTTOMLEFT', 0, -2)
|
Nick@108
|
579 upFrame = button
|
Nick@108
|
580 buttonsHeight = buttonsHeight + 52
|
Nick@108
|
581
|
Nick@108
|
582 else
|
Nick@108
|
583 button:SetPoint('TOPLEFT', lastFrame, 'TOPRIGHT', 2, 0)
|
Nick@108
|
584
|
Nick@108
|
585 end
|
Nenue@99
|
586 end
|
Nick@111
|
587
|
Nenue@99
|
588 button.Count:SetText(button.numItems)
|
Nenue@99
|
589 lastFrame = button
|
Nenue@99
|
590 button:Show()
|
Nenue@99
|
591 else
|
Nenue@99
|
592 button:Hide()
|
Nenue@99
|
593 end
|
Nick@111
|
594 buttonsWidth = min(numButtons, 8) * (BUTTON_SIZE)
|
Nick@111
|
595 end
|
Nick@111
|
596
|
Nick@111
|
597
|
Nick@111
|
598
|
Nick@111
|
599 if buttonsWidth ~= 0 then
|
Nick@111
|
600 buttonsWidth = buttonsWidth + 8+ ((min(numButtons, 8)-1)*2)
|
Nenue@99
|
601 end
|
Nenue@99
|
602
|
Nenue@101
|
603
|
Nenue@101
|
604
|
Nick@108
|
605 return buttonsWidth, buttonsHeight
|
Nenue@99
|
606 end
|
Nenue@99
|
607
|
Nenue@99
|
608 function ap:SetItemAction(button, name)
|
Nenue@99
|
609 name = name or self.itemName
|
Nenue@99
|
610 if InCombatLockdown() then
|
Nenue@99
|
611 self.itemName = name
|
Nenue@99
|
612 return
|
Nenue@99
|
613 else
|
Nenue@99
|
614 button:SetAttribute('*type*','item')
|
Nenue@99
|
615 button:SetAttribute('*item*', name)
|
Nenue@99
|
616 end
|
Nenue@99
|
617 end
|
Nenue@99
|
618
|
Nick@111
|
619 function ap:GetItemButton(itemID, texture, itemAP, fishing)
|
Nenue@99
|
620 print('|cFF00FFFFGetItemButton()|r', itemID, texture, itemAP)
|
Nenue@99
|
621 local button = self.ItemButtons[itemID]
|
Nenue@101
|
622
|
Nenue@99
|
623 if not button then
|
Nenue@99
|
624 button = CreateFrame('Button', 'VeneerAPToken'..itemID, self, 'VeneerItemButton')
|
Nenue@101
|
625 button.baseAP = itemAP
|
Nenue@101
|
626
|
Nenue@99
|
627 button:SetPushedTexture([[Interface\Buttons\UI-Quickslot-Depress]])
|
Nenue@99
|
628 button:SetHighlightTexture([[Interface\Buttons\ButtonHilight-Square]],"ADD")
|
Nenue@99
|
629 button:SetID(itemID)
|
Nenue@99
|
630 button.numItems = 0
|
Nenue@99
|
631 button.Icon:SetTexture(texture)
|
Nenue@99
|
632 button:RegisterForClicks("AnyUp")
|
Nick@111
|
633 button.isFishingAP = fishing
|
Nenue@99
|
634 self:SetItemAction(button, GetItemInfo(itemID))
|
Nenue@99
|
635
|
Nenue@99
|
636 print(' created')
|
Nenue@99
|
637 self.ItemButtons[itemID] = button
|
Nenue@99
|
638 self.numItems = self.numItems + 1
|
Nenue@99
|
639 end
|
Nenue@99
|
640
|
Nick@108
|
641 local itemAPtext = itemAP
|
Nenue@101
|
642 if itemAPtext >= 100000 then
|
Nenue@101
|
643 itemAPtext = floor(itemAPtext/1000) .. 'k'
|
Nenue@101
|
644 elseif itemAPtext >= 1000 then
|
Nenue@101
|
645 itemAPtext = (floor(itemAPtext/100)/10 ) .. 'k'
|
Nenue@101
|
646 end
|
Nenue@101
|
647 button.Label:SetText(itemAPtext)
|
Nenue@101
|
648
|
Nenue@99
|
649 button.numItems = button.numItems + 1
|
Nenue@99
|
650 return button
|
Nenue@99
|
651 end
|
Nenue@99
|
652
|
Nenue@101
|
653 function ap:GetItemAP(itemID, itemLink, bagData)
|
Nick@108
|
654 if not self.cache.items[itemID] then
|
Nenue@101
|
655
|
Nick@111
|
656 print('doing tooltip scan', itemLink, itemID)
|
Nenue@101
|
657 self.tooltip:SetOwner(self, 'ANCHOR_NONE')
|
Nenue@101
|
658 self.tooltip:SetHyperlink(itemLink)
|
Nenue@101
|
659 self.tooltip:Show()
|
Nenue@101
|
660 local numLines = self.tooltip:NumLines()
|
Nenue@101
|
661 if numLines >= 3 then
|
Nenue@101
|
662 for i = 3, numLines do
|
Nenue@101
|
663 local text = _G[TOOLTIP_NAME .. 'TextLeft'.. i]:GetText()
|
Nick@111
|
664 if text then
|
Nick@111
|
665
|
Nick@111
|
666 text = text:lower():gsub(',', '')
|
Nick@111
|
667 if text:match('equipped artifact') then
|
Nick@111
|
668 print(itemLink, '-', tonumber(text))
|
Nick@111
|
669 local itemAP = text:match('%d+')
|
Nick@111
|
670 if itemAP then
|
Nick@111
|
671 itemAP = itemAP
|
Nick@111
|
672 self.cache.items[itemID] = tonumber(itemAP)
|
Nick@111
|
673 end
|
Nick@111
|
674 end
|
Nick@111
|
675 if text:match('fishing artifact') then
|
Nick@111
|
676 local fishingAP = text:match("%d+")
|
Nick@111
|
677 fishingAP = fishingAP
|
Nick@111
|
678 print(itemLink, 'fishing', tonumber(text))
|
Nick@111
|
679 if fishingAP then
|
Nick@111
|
680 self.cache.items[itemID] = tonumber(fishingAP)
|
Nick@111
|
681 self.cache.fishing[itemID] = true
|
Nick@111
|
682 end
|
Nenue@101
|
683 end
|
Nenue@101
|
684 end
|
Nenue@101
|
685 end
|
Nenue@101
|
686 else
|
Nenue@101
|
687
|
Nick@108
|
688 self.cache.items[itemID] = 0
|
Nenue@101
|
689 end
|
Nenue@101
|
690 end
|
Nick@108
|
691 return self.cache.items[itemID], self.cache.fishing[itemID]
|
Nenue@101
|
692 end
|
Nenue@101
|
693
|
Nenue@103
|
694 function ap:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
|
Nenue@103
|
695 print('|cFF00FF00SetArtifact()|r')
|
Nenue@103
|
696 if not self.profile then
|
Nenue@103
|
697 return
|
Nenue@103
|
698 end
|
Nenue@103
|
699 local artifacts = self.profile.artifacts
|
Nenue@103
|
700
|
Nenue@103
|
701 local multi = C_ArtifactUI.GetArtifactKnowledgeMultiplier()
|
Nick@108
|
702 if multi and (self.profile.knowledgeMultiplier ~= multi) then
|
Nick@108
|
703 table.wipe(self.cache.items)
|
Nick@108
|
704 table.wipe(self.cache.fishing)
|
Nick@108
|
705 end
|
Nick@108
|
706
|
Nenue@103
|
707 self.profile.knowledgeMultiplier = multi or self.profile.knowledgeMultiplier
|
Nenue@103
|
708 print('multiplier:', multi)
|
Nenue@103
|
709
|
Nenue@103
|
710 if itemID then
|
Nenue@103
|
711
|
Nenue@103
|
712 self.currentEquipped = itemID
|
Nenue@103
|
713
|
Nenue@103
|
714 artifacts[itemID] = artifacts[itemID] or {}
|
Nenue@103
|
715 table.wipe(artifacts[itemID])
|
Nenue@103
|
716 local artifact = artifacts[itemID]
|
Nenue@103
|
717
|
Nenue@103
|
718 artifact.name = name
|
Nenue@103
|
719 artifact.texture = texture
|
Nenue@103
|
720 artifact.currentXP = currentXP
|
Nenue@103
|
721 artifact.level = pointsSpent
|
Nenue@103
|
722 local cost = C_ArtifactUI.GetCostForPointAtRank(pointsSpent)
|
Nick@108
|
723 artifact.currentCost = cost
|
Nenue@103
|
724
|
Nenue@103
|
725 local pointsAvailable = pointsSpent
|
Nenue@103
|
726 local actualCost = cost
|
Nenue@103
|
727 local actualXP = currentXP
|
Nenue@103
|
728 while actualXP >= actualCost do
|
Nenue@103
|
729 pointsAvailable = pointsAvailable + 1
|
Nenue@103
|
730 actualXP = actualXP - actualCost
|
Nenue@103
|
731 print(pointsAvailable, '-', actualCost, '=', actualXP)
|
Nenue@103
|
732 actualCost = C_ArtifactUI.GetCostForPointAtRank(pointsAvailable)
|
Nenue@103
|
733 end
|
Nenue@103
|
734 print('updating', itemID, name, currentXP, pointsSpent, pointsAvailable, actualXP)
|
Nenue@103
|
735 artifact.actualXP = actualXP
|
Nenue@103
|
736 artifact.actualLevel = pointsAvailable
|
Nenue@103
|
737 artifact.actualCost = actualCost
|
Nenue@103
|
738
|
Nenue@103
|
739 end
|
Nenue@103
|
740 end
|
Nenue@103
|
741
|
Nenue@97
|
742 function ap:ScanBag(id)
|
Nenue@97
|
743 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id))
|
Nenue@97
|
744 local numSlots = GetContainerNumSlots(id)
|
Nenue@97
|
745 local requiresUpdate
|
Nenue@97
|
746 if numSlots == 0 then
|
Nenue@97
|
747 return nil
|
Nenue@97
|
748 end
|
Nenue@97
|
749
|
Nenue@97
|
750
|
Nenue@97
|
751 self.profile.bagslots[id] = self.profile.bagslots[id] or {}
|
Nenue@97
|
752 table.wipe(self.profile.bagslots[id])
|
Nenue@97
|
753 local bagData = self.profile.bagslots[id]
|
Nenue@97
|
754 bagData.totalAP = 0
|
Nenue@99
|
755 bagData.fishingAP = 0
|
Nenue@99
|
756 bagData.items = bagData.items or {}
|
Nenue@99
|
757 table.wipe(bagData.items)
|
Nick@111
|
758 local c = self.cache
|
Nenue@99
|
759
|
Nick@111
|
760 c.bagItems[id] = c.bagItems[id] or {}
|
Nick@111
|
761 c.bags[id] = c.bags[id] or {}
|
Nick@111
|
762 c.fishing[id] = c.fishing[id] or {}
|
Nick@108
|
763
|
Nenue@97
|
764 for slotID = 1, numSlots do
|
Nenue@97
|
765 local texture, count, locked, quality, readable, lootable, link = GetContainerItemInfo(id, slotID)
|
Nenue@101
|
766 if link then
|
Nenue@101
|
767 local itemID = GetContainerItemID(id, slotID)
|
Nenue@101
|
768 local name, _, quality, iLevel, reqLevel, class, subclass = GetItemInfo(link)
|
Nenue@97
|
769
|
Nick@111
|
770 if class == 'Consumable' or subclass == 'Cooking' then
|
Nenue@102
|
771 --print(GetItemInfo(link))
|
Nick@108
|
772 local itemAP, isFishingAP
|
Nick@111
|
773 if c.bags[id][slotID] and (c.bagItems[id][slotID] == itemID) then
|
Nick@111
|
774 --print('cached slot', id, slotID, name)
|
Nick@111
|
775 itemAP = c.bags[id][slotID]
|
Nick@111
|
776 isFishingAP = c.fishing[id] and c.fishing[id][slotID]
|
Nick@108
|
777 else
|
Nick@108
|
778 itemAP, isFishingAP = self:GetItemAP(itemID, link)
|
Nick@111
|
779 c.bagItems[id][slotID] = itemID
|
Nick@111
|
780 c.bags[id][slotID] = itemAP
|
Nick@111
|
781 c.fishing[id][slotID] = isFishingAP
|
Nick@108
|
782 end
|
Nick@108
|
783
|
Nick@108
|
784
|
Nenue@102
|
785 --print(itemAP, isFishingAP)
|
Nenue@102
|
786 if itemAP and (itemAP > 0) then
|
Nick@111
|
787 local itemButton = self:GetItemButton(itemID, texture, itemAP, isFishingAP)
|
Nenue@102
|
788
|
Nenue@101
|
789 if isFishingAP then
|
Nenue@101
|
790 bagData.fishingItems = (bagData.fishingItems or 0) + 1
|
Nenue@101
|
791 bagData.fishingAP = (bagData.fishingAP or 0) + itemAP
|
Nenue@101
|
792 else
|
Nick@108
|
793 itemAP = itemAP
|
Nenue@101
|
794 bagData.numItems = (bagData.numItems or 0) + 1
|
Nenue@101
|
795 bagData.totalAP = (bagData.totalAP or 0) + itemAP
|
Nenue@101
|
796 end
|
Nenue@101
|
797 bagData.items[itemID] = (bagData.items[itemID] or 0) + 1
|
Nenue@101
|
798 end
|
Nenue@101
|
799 elseif self.profile.artifacts[itemID] then
|
Nick@111
|
800 --print('artifact weapon', itemID, link, id, slotID)
|
Nenue@101
|
801 self.profile.artifacts[itemID].containerID = id
|
Nenue@101
|
802 self.profile.artifacts[itemID].slotID = slotID
|
Nick@111
|
803 else
|
Nick@111
|
804 --print('skipping', class, subclass, link)
|
Nenue@101
|
805 end
|
Nenue@99
|
806
|
Nenue@97
|
807 end
|
Nenue@97
|
808
|
Nenue@97
|
809 end
|
Nenue@97
|
810
|
Nenue@97
|
811 end
|
Nenue@97
|
812
|
Nenue@98
|
813 local BAG_SLOTS = {0, 1, 2, 3, 4 }
|
Nenue@98
|
814 local BANK_SLOTS = {-1, 5, 6,7, 8, 9, 10, 11, 12}
|
Nenue@99
|
815 local ItemCounts = {}
|
Nenue@99
|
816 function ap:ScanAllBags()
|
Nenue@99
|
817 if InCombatLockdown() then
|
Nenue@99
|
818 self.queuedScan = true
|
Nenue@99
|
819 return
|
Nenue@99
|
820 end
|
Nenue@101
|
821 if not self.profile.knowledgeMultiplier then
|
Nenue@101
|
822 print('need to get knowledge level')
|
Nenue@101
|
823 return
|
Nenue@101
|
824 end
|
Nenue@101
|
825
|
Nenue@99
|
826 self.queuedScan = nil
|
Nenue@98
|
827
|
Nenue@101
|
828 print('|cFFFF0088ScanAllBags()|r', self.profile.knowledgeMultiplier)
|
Nenue@97
|
829
|
Nenue@99
|
830 for _, button in ipairs(self.Tokens) do
|
Nenue@99
|
831 button.numItems = 0
|
Nenue@99
|
832 end
|
Nenue@99
|
833
|
Nenue@99
|
834
|
Nenue@98
|
835 for _, bagID in ipairs(BAG_SLOTS) do
|
Nenue@98
|
836 self:ScanBag(bagID)
|
Nenue@97
|
837 end
|
Nenue@97
|
838
|
Nenue@99
|
839 if self.bankAccess then
|
Nenue@98
|
840 for _, bagID in ipairs(BANK_SLOTS) do
|
Nenue@98
|
841 self:ScanBag(bagID)
|
Nenue@98
|
842 end
|
Nenue@98
|
843 end
|
Nenue@98
|
844
|
Nenue@98
|
845 self.bankAP = 0
|
Nenue@98
|
846 self.bagAP = 0
|
Nenue@99
|
847 self.fishingAP = 0
|
Nenue@99
|
848
|
Nenue@99
|
849 table.wipe(ItemCounts)
|
Nenue@98
|
850 for id, bagData in pairs(self.profile.bagslots) do
|
Nick@111
|
851 print(id, GetBagName(id), bagData.totalAP, bagData.fishingAP)
|
Nenue@98
|
852 id = tonumber(id)
|
Nenue@98
|
853 if bagData.totalAP then
|
Nenue@98
|
854 if (id == BANK_CONTAINER) or (id >= 5) then
|
Nenue@98
|
855 self.bankAP = self.bankAP + bagData.totalAP
|
Nenue@98
|
856 else
|
Nenue@98
|
857 self.bagAP = self.bagAP + bagData.totalAP
|
Nenue@97
|
858 end
|
Nenue@98
|
859 end
|
Nenue@99
|
860 if bagData.fishingAP then
|
Nenue@99
|
861 self.fishingAP = self.fishingAP + bagData.fishingAP
|
Nenue@99
|
862 end
|
Nenue@97
|
863
|
Nenue@97
|
864 end
|
Nenue@98
|
865 self.lastUpdate = GetTime()
|
Nenue@103
|
866 self.queuedScan = nil
|
Nenue@99
|
867 self:TryToShow()
|
Nenue@97
|
868 end
|
Nenue@97
|
869
|
Nenue@97
|
870 VeneerArtifactButtonMixin = {}
|
Nenue@98
|
871
|
Nick@111
|
872 function VeneerArtifactButtonMixin:SetButton(itemID, artifact, index, equipped, fishing)
|
Nenue@99
|
873 print(itemID, index)
|
Nenue@98
|
874 print(artifact.name, artifact.texture, artifact.currentXP)
|
Nenue@98
|
875 self:SetID(itemID)
|
Nick@108
|
876 if not artifact.currentCost then
|
Nick@108
|
877 artifact.currentCost = artifact.cost
|
Nick@108
|
878 end
|
Nick@108
|
879
|
Nenue@98
|
880 for k,v in pairs(artifact) do
|
Nenue@98
|
881 --print('::',k,v)
|
Nenue@98
|
882 self[k] = v
|
Nenue@98
|
883 end
|
Nenue@98
|
884
|
Nick@111
|
885 self.isFishing = fishing
|
Nenue@98
|
886 -- this can change between artifact parses
|
Nenue@98
|
887 local potentialPoints = self.actualLevel
|
Nenue@99
|
888 local totalAP = (itemID ~= UNDERLIGHT_ANGLER_ID) and ((self:GetParent().bankAP or 0) + (self:GetParent().bagAP or 0)) or (self:GetParent().fishingAP or 0)
|
Nenue@99
|
889 print(totalAP)
|
Nenue@98
|
890 local potentialXP = self.actualXP + totalAP
|
Nenue@99
|
891
|
Nenue@98
|
892 self.potentialXP = potentialXP
|
Nenue@98
|
893 local potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints)
|
Nenue@98
|
894 while potentialXP >= potentialCost do
|
Nenue@98
|
895 potentialXP = potentialXP - potentialCost
|
Nenue@98
|
896 potentialPoints = potentialPoints + 1
|
Nenue@98
|
897 print('inc estimate', potentialXP, potentialPoints)
|
Nenue@98
|
898 potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints)
|
Nenue@98
|
899 end
|
Nenue@98
|
900 self.potentialCost = potentialCost
|
Nenue@98
|
901 self.potentialLevel = potentialPoints
|
Nenue@98
|
902 self.potentialAdjustedXP = potentialXP
|
Nenue@98
|
903
|
Nick@108
|
904 self.maxCost = self.currentCost
|
Nick@108
|
905 for i = self.level + 1, #POINT_COSTS do
|
Nick@108
|
906 self.maxCost = self.maxCost + POINT_COSTS[i]
|
Nick@108
|
907 end
|
Nenue@98
|
908
|
Nenue@99
|
909 if index ~= 1 then
|
Nenue@99
|
910 self:ClearAllPoints()
|
Nenue@99
|
911 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPRIGHT', 4, 0)
|
Nenue@99
|
912 else
|
Nenue@99
|
913 self:ClearAllPoints()
|
Nenue@99
|
914 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPLEFT', 4, -4)
|
Nenue@99
|
915 end
|
Nenue@98
|
916
|
Nenue@99
|
917 self.isEquipped = equipped
|
Nenue@98
|
918 self:Update()
|
Nenue@98
|
919 self:Show()
|
Nenue@98
|
920 return self
|
Nenue@98
|
921 end
|
Nenue@98
|
922
|
Nenue@97
|
923 function VeneerArtifactButtonMixin:Update()
|
Nenue@99
|
924 local r, g, b = 1, 1, 1
|
Nenue@99
|
925 local lR, lG, lB = 1, 1, 0
|
Nenue@99
|
926 local levelText = self.level
|
Nick@111
|
927 local xpValue = ShortNumberString(self.currentXP)
|
Nick@108
|
928 local costValue = self.currentCost
|
Nenue@97
|
929 if self.actualLevel ~= self.level then
|
Nenue@99
|
930 levelText, r,g,b = self.actualLevel, 0,1,0
|
Nick@111
|
931 xpValue, costValue, lR, lG, lB = ShortNumberString(self.potentialXP) .. '\n' .. ShortNumberString(self.potentialCost-self.potentialXP), self.actualCost, 0, 1, 0
|
Nenue@99
|
932 elseif self.potentialLevel ~= self.level then
|
Nenue@99
|
933 levelText, r, g, b = self.potentialLevel, 0,1,1
|
Nick@111
|
934 xpValue, costValue, lR, lG, lB = ShortNumberString(self.potentialXP) .. '\n' .. ShortNumberString(self.potentialCost-self.potentialXP), self.potentialCost, 0,1,1
|
Nick@111
|
935 else
|
Nick@111
|
936 xpValue, lR, lG, lB = ShortNumberString(self.actualXP) .. '\n|cFFFFFF00' .. ShortNumberString(self.actualCost-self.actualXP)..'|r', 1, 1, 1
|
Nenue@97
|
937 end
|
Nenue@97
|
938
|
Nenue@99
|
939 self.Level:SetText(levelText)
|
Nenue@99
|
940 self.Level:SetTextColor(r, g, b)
|
Nick@111
|
941 self.CurrentXP:SetText( xpValue)
|
Nenue@99
|
942 self.CurrentXP:SetTextColor(lR, lG, lB)
|
Nenue@99
|
943
|
Nenue@97
|
944 if self.isEquipped then
|
Nenue@97
|
945 self:SetNormalTexture([[Interface\Buttons\ButtonHilight-Square]])
|
Nenue@97
|
946 self:GetNormalTexture():SetBlendMode('ADD')
|
Nenue@97
|
947 self:GetNormalTexture():SetVertexColor(0,1,0)
|
Nenue@97
|
948 else
|
Nenue@97
|
949 self:SetNormalTexture(nil, 'ADD')
|
Nenue@97
|
950 end
|
Nenue@97
|
951
|
Nick@108
|
952 local currentProgress = (self.currentXP < self.currentCost) and (self.currentXP / self.currentCost) or 1
|
Nenue@98
|
953 if self.level <= 53 then
|
Nenue@98
|
954 self.CurrentProgress.animateFrom = self.CurrentProgress:GetHeight() or 1
|
Nenue@98
|
955 self.CurrentProgress.animateTo = currentProgress * self:GetHeight()
|
Nenue@98
|
956 self.CurrentProgress:Show()
|
Nenue@101
|
957 self.ProgressLine:Show()
|
Nenue@98
|
958 else
|
Nenue@98
|
959 self.CurrentProgress:Hide()
|
Nenue@101
|
960 self.ProgressLine:Hide()
|
Nenue@98
|
961 end
|
Nenue@99
|
962
|
Nenue@98
|
963 if self.potentialXP > self.currentXP then
|
Nenue@99
|
964 local projectedProgress = (self.potentialAdjustedXP < self.potentialCost) and (self.potentialXP / self.potentialCost) or 1
|
Nenue@98
|
965 if (projectedProgress > currentProgress) then
|
Nenue@98
|
966 self.AdjustedProgress:SetPoint('BOTTOM', self.CurrentProgress, 'TOP')
|
Nenue@98
|
967 projectedProgress = projectedProgress - currentProgress
|
Nenue@98
|
968 else
|
Nenue@98
|
969 self.AdjustedProgress:SetPoint('BOTTOM', self, 'BOTTOM')
|
Nenue@98
|
970 end
|
Nenue@99
|
971 print('show potential', currentProgress, projectedProgress)
|
Nenue@98
|
972 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1
|
Nenue@98
|
973 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight()
|
Nenue@101
|
974 self.AdjustedLine:Show()
|
Nenue@98
|
975 self.AdjustedProgress:Show()
|
Nenue@98
|
976 else
|
Nenue@98
|
977 self.AdjustedProgress:Hide()
|
Nenue@101
|
978 self.AdjustedLine:Hide()
|
Nenue@98
|
979 end
|
Nenue@97
|
980 self.Icon:SetTexture(self.texture)
|
Nenue@97
|
981 self:SetSize(64,64)
|
Nenue@97
|
982 end
|
Nenue@97
|
983
|
Nenue@98
|
984
|
Nenue@98
|
985 function VeneerArtifactButtonMixin:AnimateProgress(region)
|
Nenue@98
|
986 local cTime = GetTime()
|
Nenue@98
|
987 if not region.animateStart then
|
Nenue@98
|
988 region.animateStart = cTime
|
Nenue@98
|
989 end
|
Nenue@98
|
990 local progressTo, progressFrom = region.animateTo, region.animateFrom
|
Nenue@98
|
991 local elapsed = cTime - region.animateStart
|
Nenue@98
|
992 if elapsed >= .5 then
|
Nenue@98
|
993 region:SetHeight(progressTo)
|
Nenue@98
|
994 region.animateTo = nil
|
Nenue@98
|
995 region.animateStart = nil
|
Nenue@98
|
996 region.animateFrom = nil
|
Nenue@98
|
997 else
|
Nenue@98
|
998 local progress = elapsed / .5
|
Nenue@98
|
999 local height = (progressFrom + (progressTo - progressFrom) * progress)
|
Nenue@98
|
1000 --print(self:GetName(), progressTo, progressFrom, (progressTo - progressFrom), ceil(progress*10)/10, ceil(height))
|
Nenue@98
|
1001 region:SetHeight(height)
|
Nenue@98
|
1002 end
|
Nenue@98
|
1003 end
|
Nenue@98
|
1004
|
Nenue@98
|
1005 function VeneerArtifactButtonMixin:OnUpdate(sinceLast)
|
Nenue@98
|
1006 if self.CurrentProgress.animateTo then
|
Nenue@98
|
1007 self:AnimateProgress(self.CurrentProgress)
|
Nenue@98
|
1008 end
|
Nenue@98
|
1009
|
Nenue@98
|
1010 if self.AdjustedProgress.animateTo then
|
Nenue@98
|
1011 self:AnimateProgress(self.AdjustedProgress)
|
Nenue@98
|
1012 end
|
Nenue@98
|
1013 end
|
Nenue@98
|
1014
|
Nenue@97
|
1015 function VeneerArtifactButtonMixin:OnEnter()
|
Nenue@97
|
1016 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
|
Nenue@97
|
1017 GameTooltip:SetText(self.name)
|
Nick@108
|
1018 GameTooltip:AddLine(ShortNumberString(self.currentXP) .. ' / '..ShortNumberString(self.currentCost), 1, 1, 0)
|
Nenue@98
|
1019 if self.potentialXP > self.currentXP then
|
Nick@108
|
1020 GameTooltip:AddLine(ShortNumberString(self.potentialXP) .. ' potential XP', 0, 1, 1)
|
Nenue@99
|
1021 if self.potentialAdjustedXP ~= self.potentialXP then
|
Nick@108
|
1022 GameTooltip:AddLine(ShortNumberString(self.potentialAdjustedXP) .. ' / ' .. ShortNumberString(self.potentialCost).. ' after', 0, 1, 0)
|
Nenue@98
|
1023 end
|
Nenue@97
|
1024 end
|
Nenue@99
|
1025 if self.actualLevel ~= self.level then
|
Nick@108
|
1026 GameTooltip:AddLine(ShortNumberString(self.actualLevel - self.level) .. ' points unlocked', 0, 1, 1)
|
Nick@108
|
1027 end
|
Nick@108
|
1028 if self.currentXP < self.currentCost then
|
Nick@108
|
1029 GameTooltip:AddLine(ShortNumberString(self.currentCost - self.currentXP) .. ' needed')
|
Nenue@99
|
1030 end
|
Nenue@99
|
1031
|
Nenue@97
|
1032 GameTooltip:Show()
|
Nenue@97
|
1033 end
|
Nenue@97
|
1034 function VeneerArtifactButtonMixin:OnLeave()
|
Nenue@97
|
1035 if GameTooltip:IsOwned(self) then
|
Nenue@97
|
1036 GameTooltip:Hide()
|
Nenue@97
|
1037 end
|
Nenue@97
|
1038 end
|
Nick@108
|
1039 function VeneerArtifactButtonMixin:OnHide()
|
Nick@108
|
1040
|
Nick@108
|
1041 if GameTooltip:IsOwned(self) then
|
Nick@108
|
1042 GameTooltip:Hide()
|
Nick@108
|
1043 end
|
Nick@108
|
1044 end
|
Nenue@97
|
1045
|
Nenue@97
|
1046 function VeneerArtifactButtonMixin:OnClick(button, down)
|
Nenue@97
|
1047 if self.isEquipped then
|
Nenue@97
|
1048 SocketInventoryItem(16)
|
Nenue@97
|
1049 else
|
Nick@108
|
1050 if IsShiftKeyDown() then
|
Nenue@97
|
1051 SocketContainerItem(self.containerID, self.slotID)
|
Nick@108
|
1052 else
|
Nick@108
|
1053
|
Nick@108
|
1054 end
|
Nenue@97
|
1055 end
|
Nenue@97
|
1056 end |