comparison Modules/WorldState.lua @ 113:2105b6e5095f

- Added Blood of Sargeras to currency list - Fixed panel ordering issues when a module is loaded on the fly.
author Nick@Zahhak
date Sun, 26 Mar 2017 06:25:18 -0400
parents 7c77fde36287
children 6748c98a6c6c
comparison
equal deleted inserted replaced
112:7c77fde36287 113:2105b6e5095f
1 -- Veneer 1 -- Veneer
2 -- WorldState.lua 2 -- WorldState.lua
3 -- Created: 10/7/2016 10:55 PM 3 -- Created: 10/7/2016 10:55 PM
4 -- %file-revision% 4 -- %file-revision%
5 -- 5 -- An extensible panel group for HUD values
6 6
7 local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop 7 local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop
8 local WorldStateBlockMixin = {} 8 local WorldStateBlockMixin = {}
9 VeneerOrderHallMixin = { 9 VeneerOrderHallMixin = {
10 anchorPoint = 'TOP', 10 anchorPoint = 'TOP',
11 anchorFrom = 'TOP', 11 anchorFrom = 'TOP',
12 anchorPriority = 1,
12 anchorX = 0, 13 anchorX = 0,
13 anchorY = 0, 14 anchorY = 0,
14 addonTrigger = 'Blizzard_OrderHallUI', 15 addonTrigger = 'Blizzard_OrderHallUI',
15 addonFrame = 'OrderHallCommandBar', 16 addonFrame = 'OrderHallCommandBar',
16 } 17 }
17 18
18 VeneerWorldStateHeadsUpMixin = {
19 }
20
21 VeneerWorldStateCurrencyMixin = {
22 }
23 VeneerWorldStateProgressMixin = {
24 keepOpen = true,
25 }
26 VeneerWorldStateMixin = { 19 VeneerWorldStateMixin = {
27 maxHeight = 0, 20 maxHeight = 0,
28 detectedFrames = {}, 21 detectedFrames = {},
29 anchorPoint = 'TOP', 22 anchorPoint = 'TOP',
23 modules = {}
30 } 24 }
31 25
32 function VeneerWorldStateMixin:Reset() 26 function VeneerWorldStateMixin:Reset()
33 for i, frame in ipairs(self.modules) do 27 for i, frame in ipairs(self.modules) do
34 if frame.Reset then 28 if frame.Reset then
40 34
41 function VeneerWorldStateMixin:Setup() 35 function VeneerWorldStateMixin:Setup()
42 --DEFAULT_CHAT_FRAME:AddMessage('Loaded') 36 --DEFAULT_CHAT_FRAME:AddMessage('Loaded')
43 print('|cFFFFFF00'..self:GetName()..'|r:Setup()') 37 print('|cFFFFFF00'..self:GetName()..'|r:Setup()')
44 38
45 self.modules = self.modules or {self:GetChildren()}
46 for i, frame in ipairs(self.modules) do 39 for i, frame in ipairs(self.modules) do
47 print('--'.. frame:GetName()..' exists') 40 print('--'.. frame:GetName()..' exists')
48 if frame.Setup then 41 if frame.Setup then
49 print('--'.. frame:GetName()..':Setup()') 42 print('--'.. frame:GetName()..':Setup()')
50 frame:Setup() 43 frame:Setup()
73 self.modules = {self:GetChildren()} 66 self.modules = {self:GetChildren()}
74 print('|cFFFFFF00'..self:GetName()..'|r!') 67 print('|cFFFFFF00'..self:GetName()..'|r!')
75 self:RegisterEvent('PLAYER_ENTERING_WORLD') 68 self:RegisterEvent('PLAYER_ENTERING_WORLD')
76 self:RegisterEvent('PLAYER_REGEN_ENABLED') 69 self:RegisterEvent('PLAYER_REGEN_ENABLED')
77 self:RegisterEvent('PLAYER_REGEN_DISABLED') 70 self:RegisterEvent('PLAYER_REGEN_DISABLED')
78 Veneer:AddHandler(self, self.anchorPoint, 2) 71 Veneer:AddHandler(self, self.anchorPoint, self.anchorPriority)
79 SLASH_VENEERWORLDSTATE1 = "/vws" 72 SLASH_VENEERWORLDSTATE1 = "/vws"
80 SLASH_VENEERWORLDSTATE2 = "/worldstate" 73 SLASH_VENEERWORLDSTATE2 = "/worldstate"
81 SlashCmdList.VENEERWORLDSTATE = function() 74 SlashCmdList.VENEERWORLDSTATE = function()
82 self:Reset() 75 self:Reset()
83 end 76 end
155 end 148 end
156 149
157 function VeneerOrderHallMixin:Setup() 150 function VeneerOrderHallMixin:Setup()
158 print('|cFFFFFF00'..self:GetName()..':Setup()') 151 print('|cFFFFFF00'..self:GetName()..':Setup()')
159 self:SetParent(OrderHallCommandBar) 152 self:SetParent(OrderHallCommandBar)
160 self:RegisterEvent("ZONE_CHANGED"); 153 self:RegisterEvent("UNIT_AURA");
161 self:RegisterEvent("ZONE_CHANGED_INDOORS"); 154 self:RegisterEvent("GARRISON_FOLLOWER_CATEGORIES_UPDATED")
162 self:RegisterEvent("ZONE_CHANGED_NEW_AREA"); 155 self:RegisterEvent("GARRISON_FOLLOWER_ADDED")
156 self:RegisterEvent("GARRISON_FOLLOWER_REMOVED")
157
163 self:SetShown(true) 158 self:SetShown(true)
164 end 159 end
165 160
166 function VeneerOrderHallMixin:OnLoad() 161 function VeneerOrderHallMixin:OnLoad()
167 Veneer:AddHandler(self, 'TOP', 1) 162 Veneer:AddHandler(self, 'TOP', 1)
163 self:EnableMouse(false)
168 end 164 end
169 165
170 function VeneerOrderHallMixin:OnEvent(event, ...) 166 function VeneerOrderHallMixin:OnEvent(event, ...)
171 167
172 print('|cFF00AAFF'..self:GetName()..'|r:'.. event, ...) 168 print('|cFF00AAFF'..self:GetName()..'|r:'.. event, ...)
187 end 183 end
188 Veneer:Reanchor() 184 Veneer:Reanchor()
189 end 185 end
190 186
191 function VeneerOrderHallMixin:Update() 187 function VeneerOrderHallMixin:Update()
192
193 if not OrderHallCommandBar then 188 if not OrderHallCommandBar then
194 print('|cFFFF4400'..self:GetName()..' updater called without target') 189 print('|cFFFF4400'..self:GetName()..' updater called without target')
195 return 190 return
196 end 191 end
197 192
199 OrderHallCommandBar:SetAllPoints(self) 194 OrderHallCommandBar:SetAllPoints(self)
200 195
201 OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5) 196 OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
202 OrderHallCommandBar.WorldMapButton:Hide() 197 OrderHallCommandBar.WorldMapButton:Hide()
203 OrderHallCommandBar:EnableMouse(false) 198 OrderHallCommandBar:EnableMouse(false)
204 self:SetSize(700, 24) 199 self:SetSize(700, 22)
200
201 local troops = OrderHallCommandBar.TroopSummary
202 if troops then
203 for _, category in ipairs(troops) do
204 category.Count:SetFontObject(VeneerNumberFont)
205 category.Count:ClearAllPoints()
206 category.Count:SetPoint('BOTTOMRIGHT', category.Icon, 'BOTTOMRIGHT', -1, 1)
207 end
208 end
209
205 210
206 211
207 print('|cFF00AAFF'..self:GetName()..'|r:Update()', OrderHallCommandBar:IsVisible(), self:IsShown()) 212 print('|cFF00AAFF'..self:GetName()..'|r:Update()', OrderHallCommandBar:IsVisible(), self:IsShown())
208 print(debugstack(6)) 213 print(debugstack(6))
209 Veneer:DynamicReanchor() 214 Veneer:DynamicReanchor()
210 end 215 end
211 216
212 function VeneerWorldStateCurrencyMixin:OnLoad () 217
213 self:RegisterEvent("PLAYER_ENTERING_WORLD");
214 self:RegisterEvent("ZONE_CHANGED");
215 self:RegisterEvent("ZONE_CHANGED_INDOORS");
216 self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
217 self:RegisterEvent('CURRENCY_DISPLAY_UPDATE')
218 self:RegisterEvent('CHAT_MSG_CURRENCY')
219 end
220
221 function VeneerWorldStateCurrencyMixin:OnEvent (event, arg)
222 self:Update()
223 end
224 local zoneCurrency = {
225 ['Suramar'] = 1155,
226 ["Sashj'tar Ruins"] = 1155,
227 ["Faronaar Ruins"] = 1155
228 }
229 local zoneBountyInfo = {
230 ['Suramar'] = 1859,
231 ["Sashj'tar Ruins"] = 1859,
232 ["Faronaar Ruins"] = 1859,
233
234 ['Azsuna'] = 1900,
235 }
236 local globalBountyInfo = {
237 }
238 function VeneerWorldStateCurrencyMixin:Update(isBatchUpdate)
239 local zoneText = GetRealZoneText()
240 local canShow = false
241 if zoneText then
242 local currency = zoneCurrency[zoneText]
243 if currency then
244 local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(zoneCurrency[zoneText])
245 self.Icon:SetTexture(texture)
246 self.Label:SetFormattedText("%d / %d", earned, totalMax)
247 self:SetWidth(self.Icon:GetWidth() + self.Label:GetStringWidth() + 6)
248 canShow = true
249 end
250 else
251 end
252 self:SetShown(canShow)
253 VeneerWorldState:Reanchor(true)
254 end
255
256 function VeneerWorldStateProgressMixin:OnUpdate(sinceLast)
257 self.timeLived = (self.timeLived or 0) + sinceLast
258 if self.keepOpen then
259 return
260 end
261 if self.timeLived >= 3 and not self.TimedFadeOut:IsPlaying() then
262 self.TimedFadeOut:Play()
263 end
264 end
265
266 function VeneerWorldStateProgressMixin:OnLoad()
267 self:RegisterEvent('PLAYER_EQUIPMENT_CHANGED')
268
269 self:RegisterEvent("PLAYER_XP_UPDATE");
270 self:RegisterEvent("UPDATE_EXHAUSTION");
271 self:RegisterEvent("PLAYER_LEVEL_UP");
272 self:RegisterEvent("PLAYER_UPDATE_RESTING");
273
274 self:RegisterEvent("ARTIFACT_UPDATE");
275 self:RegisterEvent("ARTIFACT_XP_UPDATE");
276 self:RegisterEvent("ARTIFACT_CLOSE");
277 self:RegisterEvent("ARTIFACT_MAX_RANKS_UPDATE");
278
279 self.progressPercent = 0
280 self.progressAmount = 0
281 self.progressMax = 1
282 self.progressOverflow = 0
283
284 end
285
286 function VeneerWorldStateProgressMixin:Setup()
287 self:UpdateXPGain()
288 if self.canGainXP then
289 self.mode = 'xp'
290 else
291 self.mode = 'artifact'
292 end
293 print('setup mode:', self.mode)
294 end
295
296 function VeneerWorldStateProgressMixin:OnEvent(event, ...)
297 local lastMode = self.mode
298 if event == 'PLAYER_LEVEL_UP' or event == 'ENABLE_XP_GAIN' or event == 'DISABLE_XP_GAIN' then
299 self:UpdateXPGain()
300 elseif event == 'ARTIFACT_XP_UPDATE' or event == 'ARTIFACT_UPDATE' then
301 self.mode = 'artifact'
302
303 elseif event == 'PLAYER_EQUIPMENT_CHANGED' then
304 local slot, hasEquip = ...
305 if slot == 16 then
306 self.mode = 'artifact'
307 lastMode = nil
308 end
309 elseif event == 'PLAYER_XP_UPDATE' or event == 'PLAYER_LEVEL_UP' then
310 print('forcing to XP mode')
311 self.mode = 'xp'
312 end
313 self.modeChanged = (lastMode ~= self.mode)
314 if self.modeChanged and self:IsVisible() then
315 print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()', event, ...)
316 self:AnimateMode()
317 else
318 print('|cFFFFFF00'..self:GetName()..':Update()', event, ...)
319 self:Update()
320 end
321 end
322 function VeneerWorldStateProgressMixin:UpdateXPGain()
323 self.canGainXP = (UnitLevel('player') < GetMaxPlayerLevel()) and (not IsXPUserDisabled())
324 if not self.canGainXP then
325 self.ProgressBar:SetColorTexture(0.75,0.75,0.75)
326 end
327 end
328
329 local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo
330 local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank
331
332
333 local progressHandlers = {
334 xp = function(self)
335 local hasNewInfo, showChange = false, false
336 local xp = UnitXP('player')
337 local xpMax = UnitXPMax('player')
338 local bonusXP = GetXPExhaustion()
339 if xp then
340 self.progressPercent = xp / xpMax
341 end
342 self.progressText = '|cFFFFCC00' .. UnitLevel('player') .. '|r ' .. xp .. '/' .. xpMax
343 if bonusXP then
344 self.progressOverflow = min(1,(bonusXP / xpMax))
345 self.OverflowBar:SetColorTexture(0.5, 0.5,0.5, 0.25)
346 self.OverflowBar:SetPoint('LEFT', self.ProgressBar, 'LEFT')
347 else
348 self.progressOverflow = nil
349 end
350 self.ProgressBar:SetColorTexture(0, 0.5,1,1)
351 self.OverflowAnchor = self.ProgressBar
352 self.hasNewInfo = (self.progressAmount ~= xp)
353 showChange = (hasNewInfo and not self.modeChanged) and ((xp - self.progressAmount) / xpMax)
354
355 self.progressAmount = xp
356 self.progressMax = xpMax
357 return hasNewInfo, showChange
358 end,
359 artifact = function(self)
360 local hasNewInfo, showChange = false, false
361 local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo()
362 if itemID then
363 local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0
364 print(' API:', itemID, name, 'XP:', totalXP, 'Points:', pointsSpent, 'Next:', nextRankCost)
365 hasNewInfo = (self.progressAmount ~= totalXP)
366 showChange = (hasNewInfo and not self.modeChanged) and (((totalXP - self.progressAmount) / nextRankCost))
367
368 if totalXP > nextRankCost then
369 self.progressPercent = 1
370 else
371 self.progressPercent = totalXP / nextRankCost
372 end
373
374 self.progressText = name .. ' ('..pointsSpent .. '): '.. totalXP .. ' / ' .. nextRankCost
375
376 self.ProgressBar:SetColorTexture(1,0.5,0,1)
377 self.OverflowBar:Hide()
378
379 if totalXP > nextRankCost then
380 self.progressText = self.progressText .. ' Level Up!'
381 self.progressOverflow = (totalXP - nextRankCost) / nextRankCost
382 self.OverflowBar:SetPoint('LEFT', self.ProgressBG, 'LEFT')
383 self.OverflowAnchor = self.OverflawBar
384 else
385 self.progressOverflow = nil
386 self.OverflowAnchor = self.ProgressBar
387 end
388
389 self.progressAmount = totalXP
390 self.progressMax = nextRankCost
391 else
392 self.progressOverflow = nil
393 self.progressAmount = 0
394 self.progressMax = 1
395 self.progressText = ''
396 end
397 return hasNewInfo, showChange
398 end
399 }
400
401 function VeneerWorldStateProgressMixin:Update(isBatchUpdate)
402
403 local progressChange = false
404 print(' current mode:', self.mode, 'vis:', self:IsVisible())
405 if (not self.mode) or (not progressHandlers[self.mode]) then
406 self:HidePanel()
407 return
408 end
409
410 local hasNewInfo, showProgress = progressHandlers[self.mode](self)
411 self:SetSize(600,16)
412 if hasNewInfo then
413 self.timeOut = nil
414 self.timeLived = 0
415 end
416
417
418 if not self:IsVisible() then
419 self.TransitionFadeIn:Play()
420 else
421 self:ShowPanel()
422 end
423
424 print(' Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'new:', hasNewInfo, 'shown:', self:IsShown())
425 print(' Metrics:', self:IsVisible(), self:GetWidth(), self.ProgressBG:GetWidth())
426 if self.progressPercent > 0 then
427 self.ProgressBar:Show()
428 self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self:GetWidth()* self.progressPercent , 0)
429 self.Label:SetText(self.progressText)
430
431 self.ProgressSpark:ClearAllPoints()
432 if self.progressOverflow then
433 print(' Overflow:', self.progressOverflow)
434 self.OverflowBar:Show()
435 self.OverflowBar:SetWidth(self.progressOverflow * self:GetWidth(), 0)
436 else
437 self.OverflowBar:Hide()
438 end
439 self.ProgressSpark:SetPoint('CENTER', self.OverflowAnchor, 'RIGHT', 0, 0)
440
441 else
442 self.ProgressBar:Hide()
443 end
444
445 if self.progressOverflow and (self.progressOverflow >= self.progressPercent) then
446 self.OverflowBar:SetDrawLayer('ARTWORK', 1)
447 self.ProgressBar:SetDrawLayer('ARTWORK', 2)
448 else
449 self.OverflowBar:SetDrawLayer('ARTWORK', 2)
450 self.ProgressBar:SetDrawLayer('ARTWORK', 1)
451 end
452
453 if progressChange then
454 self:AnimateProgress(progressChange)
455 end
456
457 self.modeChanged = nil
458 end
459
460
461 function VeneerWorldStateProgressMixin:AnimateProgress(progressChange)
462
463
464 local changeAnchor = (self.progressOverflow and self.OverflowBar) or self.ProgressBar
465 local progressWidth = self:GetWidth() * min(progressChange, changeAnchor:GetWidth())
466
467 self.ProgressAdded:Show()
468 self.ProgressAdded:ClearAllPoints()
469 self.ProgressAdded:SetPoint('TOPRIGHT', changeAnchor, 'TOPRIGHT', 0, 0)
470 self.ProgressAdded:SetPoint('BOTTOMLEFT', changeAnchor, 'BOTTOMRIGHT', - (progressWidth), 0)
471
472 print(' Render change:', progressWidth, changeAnchor)
473 self.ProgressFlash.translation:SetOffset(progressWidth, 0)
474 self.ProgressFlash:Play()
475 end
476
477 function VeneerWorldStateProgressMixin:OnMouseDown(button)
478 if button == 'RightButton' then
479 if self.keepOpen then
480 self.keepOpen = nil
481 self.timeLived = 1000
482 else
483 self.keepOpen = true
484
485 self.modeChanged = true
486 end
487 print('keepOpen =', self.keepOpen)
488 self:Update()
489 else
490
491 if self.mode == 'xp' then
492 self.mode = 'artifact'
493 else
494 if not self.canGainXP then
495 return
496 end
497 self.mode = 'xp'
498 end
499 print('|cFFFF4400Change mode:', self.mode)
500
501
502 self:AnimateMode()
503 end
504
505 end
506
507 function VeneerWorldStateProgressMixin:AnimateMode()
508
509 self.TransitionFadeIn:Stop()
510 print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()')
511 self.modeChanged = true
512 self.TransitionFadeOut:Play()
513 end
514 218
515 do 219 do
516 function WorldStateBlockMixin:ShowPanel() 220 function WorldStateBlockMixin:ShowPanel()
517 print('|cFF0088FF'..self:GetName()..':ShowPanel()') 221 print('|cFF0088FF'..self:GetName()..':ShowPanel()')
518 self:SetShown(true) 222 self:SetShown(true)
553 self.keepOpen = true 257 self.keepOpen = true
554 self:Setup() 258 self:Setup()
555 end 259 end
556 end 260 end
557 261
262