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