annotate Modules/WorldState.lua @ 84:16b300d96724

rewritten using mixin attributes
author Nenue
date Tue, 18 Oct 2016 13:07:21 -0400
parents Modules/OrderHall.lua@4ec4fd89fced
children 1196b8175674
rev   line source
Nenue@80 1 -- Veneer
Nenue@84 2 -- WorldState.lua
Nenue@80 3 -- Created: 10/7/2016 10:55 PM
Nenue@80 4 -- %file-revision%
Nenue@80 5 --
Nenue@80 6
Nenue@80 7 VeneerWorldStateCurrencyMixin = {}
Nenue@84 8 VeneerWorldStateProgressMixin = {
Nenue@84 9 keepOpen = true
Nenue@84 10 }
Nenue@81 11 VeneerWorldStateMixin = {
Nenue@82 12 maxHeight = 0,
Nenue@81 13 detectedFrames = {}
Nenue@81 14 }
Nenue@80 15 local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop
Nenue@80 16
Nenue@80 17 function VeneerWorldStateMixin:Setup()
Nenue@80 18 --DEFAULT_CHAT_FRAME:AddMessage('Loaded')
Nenue@84 19 print('|cFFFFFF00'..self:GetName()..'|r:Setup()')
Nenue@81 20
Nenue@81 21 self.modules = self.modules or {self:GetChildren()}
Nenue@81 22 for i, frame in ipairs(self.modules) do
Nenue@84 23 print('--'.. frame:GetName()..' exists')
Nenue@81 24 if frame.Setup then
Nenue@84 25 print('--'.. frame:GetName()..':Setup()')
Nenue@81 26 frame:Setup()
Nenue@81 27 end
Nenue@82 28
Nenue@82 29 frame:SetScript('OnSizeChanged', function()
Nenue@82 30 local h = frame:GetHeight()
Nenue@82 31 if h > self.maxHeight then
Nenue@82 32 self.maxHeight = h
Nenue@82 33 self:SetHeight(h)
Nenue@82 34 print('updating max height:', h)
Nenue@82 35 elseif h < self.maxHeight then
Nenue@82 36 self:UpdateSize()
Nenue@82 37 end
Nenue@82 38 end)
Nenue@82 39 frame:SetScript('OnHide', function()
Nenue@82 40 print('|cFF0088FF'..frame:GetName()..':OnHide()')
Nenue@82 41 self:UpdateSize()
Nenue@82 42 end)
Nenue@82 43 frame:SetScript('OnShow', function()
Nenue@82 44 frame.timeLived = 0
Nenue@82 45 print('|cFF0088FF'..frame:GetName()..':OnShow()')
Nenue@82 46 self:UpdateSize()
Nenue@82 47 end)
Nenue@82 48
Nenue@82 49 function frame.ShowPanel(frame)
Nenue@82 50 frame:SetShown(true)
Nenue@82 51 self:Show()
Nenue@82 52 end
Nenue@83 53 function frame.HidePanel(frame)
Nenue@83 54 frame:SetShown(false)
Nenue@83 55 self:UpdateSize()
Nenue@83 56 end
Nenue@81 57 end
Nenue@82 58 self:SetOrderHallUIMods()
Nenue@84 59 self:UnregisterEvent('PLAYER_LOGIN')
Nenue@80 60 end
Nenue@80 61
Nenue@82 62 function VeneerWorldStateMixin:SetOrderHallUIMods()
Nenue@81 63 if OrderHallCommandBar then
Nenue@81 64 if not self.detectedFrames[OrderHallCommandBar] then
Nenue@81 65 self.detectedFrames[OrderHallCommandBar] = true
Nenue@81 66 hooksecurefunc(OrderHallCommandBar,'Show', function()
Nenue@82 67 self:SetOrderHallUIMods()
Nenue@82 68 end)
Nenue@82 69 hooksecurefunc(OrderHallCommandBar,'Hide', function()
Nenue@82 70 self:SetOrderHallUIMods()
Nenue@84 71 self:UpdateSize()
Nenue@81 72 end)
Nenue@81 73 end
Nenue@81 74
Nenue@81 75
Nenue@81 76 OrderHallCommandBar:ClearAllPoints()
Nenue@81 77 OrderHallCommandBar:SetPoint('TOP')
Nenue@81 78 OrderHallCommandBar:SetWidth(600)
Nenue@81 79 OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
Nenue@81 80 OrderHallCommandBar.WorldMapButton:Hide()
Nenue@81 81 OrderHallCommandBar:EnableMouse(false)
Nenue@82 82
Nenue@82 83 if OrderHallCommandBar:IsVisible() then
Nenue@82 84 self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM')
Nenue@82 85 print('anchoring to CommandBar')
Nenue@82 86 else
Nenue@82 87 self:SetPoint('TOP', UIParent, 'TOP')
Nenue@82 88 print('anchoring to UIParent')
Nenue@82 89 end
Nenue@84 90
Nenue@84 91 self:UnregisterEvent('ADDON_LOADED')
Nenue@82 92 else
Nenue@82 93 self:SetPoint('TOP', UIParent, 'TOP')
Nenue@82 94 print('anchoring to UIParent')
Nenue@81 95 end
Nenue@80 96 end
Nenue@84 97
Nenue@84 98
Nenue@84 99 function VeneerWorldStateMixin:OnLoad ()
Nenue@84 100 print('|cFFFFFF00'..self:GetName()..'|r!')
Nenue@84 101 self:RegisterEvent('PLAYER_LOGIN')
Nenue@84 102 self:RegisterEvent('ADDON_LOADED')
Nenue@84 103 self:RegisterEvent('ARTIFACT_UPDATE')
Nenue@84 104 self:RegisterEvent('ARTIFACT_XP_UPDATE')
Nenue@84 105 self:RegisterEvent('PLAYER_ENTERING_WORLD')
Nenue@84 106 self:RegisterEvent('PLAYER_REGEN_ENABLED')
Nenue@84 107 self:RegisterEvent('PLAYER_REGEN_DISABLED')
Nenue@84 108 end
Nenue@84 109
Nenue@80 110 function VeneerWorldStateMixin:OnEvent(event, arg)
Nenue@80 111 print(event, arg)
Nenue@81 112
Nenue@84 113 if event == 'PLAYER_LOGIN' then
Nenue@84 114 if IsLoggedIn() and not self.initialized then
Nenue@84 115 self.initialized = true
Nenue@80 116 self:Setup()
Nenue@81 117 end
Nenue@82 118 elseif event == 'ADDON_LOADED' then
Nenue@84 119 if self.initialized and IsAddOnLoaded('Blizzard_OrderHallUI') then
Nenue@82 120 self:SetOrderHallUIMods()
Nenue@82 121 end
Nenue@82 122 elseif event == 'PLAYER_ENTERING_WORLD' then
Nenue@80 123 self:Update()
Nenue@81 124 elseif event == 'PLAYER_REGEN_ENABLED' then
Nenue@83 125 self:SetShown(true)
Nenue@81 126 elseif event == 'PLAYER_REGEN_DISABLED' then
Nenue@83 127 self:SetShown(false)
Nenue@80 128 end
Nenue@80 129 end
Nenue@80 130
Nenue@80 131 function VeneerWorldStateMixin:Update()
Nenue@82 132 self.modules = {self:GetChildren()}
Nenue@80 133 print('|cFFFFFF00All:Update()|r')
Nenue@82 134 print(self:GetChildren())
Nenue@82 135 for i, frame in ipairs(self.modules) do
Nenue@82 136 if frame.Update then
Nenue@82 137 print(' |cFFFF00FF'.. frame:GetName() .. ':Update()')
Nenue@82 138 frame:Update()
Nenue@82 139 end
Nenue@82 140 end
Nenue@82 141 self:SetOrderHallUIMods()
Nenue@82 142 end
Nenue@82 143
Nenue@82 144 function VeneerWorldStateMixin:UpdateSize()
Nenue@82 145 print('|cFFFFFF00All:UpdateSize()|r')
Nenue@82 146 print(self:GetChildren())
Nenue@82 147 self.modules = {self:GetChildren()}
Nenue@81 148 self.maxHeight = 0
Nenue@81 149 for i, frame in ipairs(self.modules) do
Nenue@82 150 print(' '..frame:GetName()..':',frame:IsShown(), frame:IsVisible(), frame:GetHeight())
Nenue@82 151 if frame:IsShown() then
Nenue@82 152 self.maxHeight = max(self.maxHeight, frame:GetHeight())
Nenue@80 153 end
Nenue@80 154 end
Nenue@82 155 if self.maxHeight == 0 then
Nenue@82 156 print ('height zero')
Nenue@82 157 self:Hide()
Nenue@82 158 else
Nenue@82 159 self:Show()
Nenue@82 160 print ('height update:', self.maxHeight)
Nenue@82 161 self:SetHeight(self.maxHeight)
Nenue@82 162 end
Nenue@82 163
Nenue@80 164 end
Nenue@80 165
Nenue@80 166
Nenue@80 167
Nenue@84 168 function VeneerWorldStateMixin:OnMouseDown()
Nenue@80 169 end
Nenue@80 170
Nenue@80 171 function VeneerWorldStateCurrencyMixin:OnLoad ()
Nenue@80 172
Nenue@84 173 self:RegisterEvent("PLAYER_ENTERING_WORLD");
Nenue@84 174 self:RegisterEvent("ZONE_CHANGED");
Nenue@84 175 self:RegisterEvent("ZONE_CHANGED_INDOORS");
Nenue@84 176 self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
Nenue@80 177 self:RegisterEvent('CURRENCY_DISPLAY_UPDATE')
Nenue@80 178 self:RegisterEvent('CHAT_MSG_CURRENCY')
Nenue@80 179
Nenue@80 180 end
Nenue@80 181
Nenue@80 182 function VeneerWorldStateCurrencyMixin:OnEvent (event, arg)
Nenue@80 183 self:Update()
Nenue@80 184 end
Nenue@80 185
Nenue@80 186
Nenue@80 187 function VeneerWorldStateCurrencyMixin:Update()
Nenue@81 188
Nenue@82 189 print(' Zone:', GetZoneText())
Nenue@81 190 if GetZoneText() == 'Suramar' then
Nenue@80 191 local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(1155)
Nenue@80 192
Nenue@80 193 self.Icon:SetTexture(texture)
Nenue@80 194 self.Label:SetFormattedText("%d / %d", earned, totalMax)
Nenue@80 195 self:Show()
Nenue@80 196 self:SetWidth(self.Icon:GetWidth() + self.Label:GetStringWidth() + 6)
Nenue@82 197 self:SetSize(200,16)
Nenue@80 198 else
Nenue@80 199 self:Hide()
Nenue@80 200 end
Nenue@81 201
Nenue@82 202
Nenue@81 203 end
Nenue@81 204
Nenue@82 205 function VeneerWorldStateProgressMixin:OnUpdate(sinceLast)
Nenue@84 206 if self.keepOpen then
Nenue@84 207 return
Nenue@84 208 end
Nenue@84 209
Nenue@82 210 self.timeLived = (self.timeLived or 0) + sinceLast
Nenue@82 211 if self.timeLived >= 3 and not self.TransitionFadeOut:IsPlaying() then
Nenue@82 212 if not self.timeOut then
Nenue@82 213 self.timeOut = true
Nenue@84 214 self.TimedFadeOut:Play()
Nenue@82 215 end
Nenue@82 216 end
Nenue@82 217 end
Nenue@82 218
Nenue@82 219
Nenue@81 220 function VeneerWorldStateProgressMixin:OnLoad()
Nenue@82 221 self:RegisterEvent('PLAYER_EQUIPMENT_CHANGED')
Nenue@81 222
Nenue@82 223 self:RegisterEvent("PLAYER_XP_UPDATE");
Nenue@82 224 self:RegisterEvent("UPDATE_EXHAUSTION");
Nenue@82 225 self:RegisterEvent("PLAYER_LEVEL_UP");
Nenue@82 226 self:RegisterEvent("PLAYER_UPDATE_RESTING");
Nenue@82 227
Nenue@82 228 self:RegisterEvent("ARTIFACT_UPDATE");
Nenue@82 229 self:RegisterEvent("ARTIFACT_XP_UPDATE");
Nenue@82 230 self:RegisterEvent("ARTIFACT_CLOSE");
Nenue@82 231 self:RegisterEvent("ARTIFACT_MAX_RANKS_UPDATE");
Nenue@82 232
Nenue@82 233 self.progressPercent = 0
Nenue@82 234 self.progressAmount = 0
Nenue@82 235 self.progressMax = 1
Nenue@82 236 self.progressOverflow = 0
Nenue@84 237
Nenue@81 238 end
Nenue@81 239
Nenue@81 240 function VeneerWorldStateProgressMixin:Setup()
Nenue@81 241 self:UpdateXPGain()
Nenue@82 242
Nenue@82 243 if self.canGainXP then
Nenue@81 244 self.mode = 'xp'
Nenue@81 245 else
Nenue@81 246 self.mode = 'artifact'
Nenue@81 247 end
Nenue@81 248 print('setup mode:', self.mode)
Nenue@81 249 end
Nenue@81 250
Nenue@82 251 function VeneerWorldStateProgressMixin:OnEvent(event, ...)
Nenue@82 252 local lastMode = self.mode
Nenue@82 253 if event == 'PLAYER_LEVEL_UP' or event == 'ENABLE_XP_GAIN' or event == 'DISABLE_XP_GAIN' then
Nenue@81 254 self:UpdateXPGain()
Nenue@81 255 elseif event == 'ARTIFACT_XP_UPDATE' or event == 'ARTIFACT_UPDATE' then
Nenue@81 256 self.mode = 'artifact'
Nenue@82 257
Nenue@82 258 elseif event == 'PLAYER_EQUIPMENT_CHANGED' then
Nenue@82 259 local slot, hasEquip = ...
Nenue@82 260 if slot == 16 then
Nenue@82 261 self.mode = 'artifact'
Nenue@82 262 lastMode = nil
Nenue@82 263 end
Nenue@82 264 elseif event == 'PLAYER_XP_UPDATE' or event == 'PLAYER_LEVEL_UP' then
Nenue@82 265 print('forcing to XP mode')
Nenue@81 266 self.mode = 'xp'
Nenue@81 267 end
Nenue@82 268 self.modeChanged = (lastMode ~= self.mode)
Nenue@82 269 if self.modeChanged and self:IsVisible() then
Nenue@82 270 print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()', event, ...)
Nenue@84 271 self:AnimateMode()
Nenue@82 272 else
Nenue@82 273 print('|cFFFFFF00'..self:GetName()..':Update()', event, ...)
Nenue@82 274 self:Update()
Nenue@82 275 end
Nenue@81 276 end
Nenue@81 277 function VeneerWorldStateProgressMixin:UpdateXPGain()
Nenue@82 278 self.canGainXP = (UnitLevel('player') < GetMaxPlayerLevel()) and (not IsXPUserDisabled())
Nenue@82 279 if not self.canGainXP then
Nenue@81 280 self.ProgressBar:SetColorTexture(0.75,0.75,0.75)
Nenue@81 281 end
Nenue@81 282 end
Nenue@81 283
Nenue@81 284 local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo
Nenue@81 285 local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank
Nenue@81 286 function VeneerWorldStateProgressMixin:Update()
Nenue@82 287 local hasNewInfo = false
Nenue@82 288 local progressChange = false
Nenue@82 289 print(' current mode:', self.mode)
Nenue@81 290
Nenue@81 291
Nenue@81 292 if self.mode == 'xp' then
Nenue@81 293 local xp = UnitXP('player')
Nenue@81 294 local xpMax = UnitXPMax('player')
Nenue@81 295 local bonusXP = GetXPExhaustion()
Nenue@81 296 if xp then
Nenue@81 297 self.progressPercent = xp / xpMax
Nenue@81 298 end
Nenue@82 299
Nenue@84 300 self.progressText = '|cFFFFCC00' .. UnitLevel('player') .. '|r ' .. xp .. '/' .. xpMax
Nenue@82 301
Nenue@82 302 if bonusXP then
Nenue@82 303 self.ProgressBar:SetColorTexture(0, 0.5,1)
Nenue@82 304 self.OverflowBar:Show()
Nenue@82 305 self.OverflowBar:ClearAllPoints()
Nenue@82 306 self.OverflowBar:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', 0, 0)
Nenue@82 307
Nenue@82 308 else
Nenue@82 309 self.ProgressBar:SetColorTexture(0.5,0,1)
Nenue@82 310 end
Nenue@82 311 hasNewInfo = (self.progressAmount ~= xp)
Nenue@82 312
Nenue@83 313 progressChange = (hasNewInfo and not self.modeChanged) and ((xp - self.progressAmount) / xpMax)
Nenue@82 314
Nenue@84 315 self.progressOverFlow = bonusXP
Nenue@82 316 self.progressAmount = xp
Nenue@82 317 self.progressMax = xpMax
Nenue@81 318 elseif self.mode == 'artifact' then
Nenue@81 319
Nenue@81 320 local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo()
Nenue@82 321 print(' C_AUI:', itemID, altItemID, name, icon, totalXP, pointsSpent)
Nenue@82 322
Nenue@82 323 if itemID then
Nenue@82 324 local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0
Nenue@82 325 hasNewInfo = (self.progressAmount ~= totalXP)
Nenue@83 326 progressChange = (hasNewInfo and not self.modeChanged) and (((totalXP - self.progressAmount) / nextRankCost))
Nenue@82 327
Nenue@82 328 if totalXP > nextRankCost then
Nenue@82 329 self.progressPercent = 1
Nenue@82 330 self.progressPercent = totalXP / nextRankCost
Nenue@82 331 end
Nenue@82 332
Nenue@82 333 self.progressText = name .. ' ('..pointsSpent .. '): '.. totalXP .. ' / ' .. nextRankCost
Nenue@82 334
Nenue@82 335 self.ProgressBar:SetColorTexture(1,0.5,0,1)
Nenue@82 336 self.OverflowBar:Hide()
Nenue@82 337
Nenue@84 338 self.progressOverFlow = 0
Nenue@82 339 self.progressAmount = totalXP
Nenue@82 340 self.progressMax = nextRankCost
Nenue@82 341 else
Nenue@82 342 self.progressAmount = 0
Nenue@82 343 self.progressMax = 1
Nenue@82 344 self.progressText = ''
Nenue@82 345 end
Nenue@82 346 end
Nenue@82 347
Nenue@82 348 if self.mode then
Nenue@82 349 self:SetSize(600,16)
Nenue@82 350 if hasNewInfo then
Nenue@82 351 self.timeOut = nil
Nenue@82 352 self.timeLived = 0
Nenue@82 353 if self.TransitionFadeOut:IsPlaying() then
Nenue@82 354 self.TransitionFadeOut:Stop()
Nenue@82 355 self:SetAlpha(1)
Nenue@82 356 end
Nenue@82 357 if not self:IsVisible() then
Nenue@82 358 self.TransitionFadeIn:Play()
Nenue@82 359 else
Nenue@82 360 self:ShowPanel()
Nenue@82 361 end
Nenue@82 362
Nenue@81 363 end
Nenue@81 364
Nenue@84 365 --print(self.ProgressBG:GetWidth())
Nenue@82 366 print(' Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'NewInfo:', hasNewInfo, 'IsShown:', self:IsShown())
Nenue@81 367
Nenue@81 368
Nenue@82 369 if progressChange then
Nenue@82 370 print(' Render change:', progressChange)
Nenue@82 371 self.ProgressAdded:Show()
Nenue@82 372 self.ProgressAdded:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', - (self:GetWidth() * progressChange), 0)
Nenue@82 373 self.ProgressAdded:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', 0, 0)
Nenue@82 374 self.ProgressFlash:Play()
Nenue@81 375 end
Nenue@81 376
Nenue@82 377
Nenue@82 378 if self.progressPercent > 0 then
Nenue@82 379 self.ProgressBar:Show()
Nenue@82 380 self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self:GetWidth()* self.progressPercent , 0)
Nenue@84 381 self.Label:SetText(self.progressText)
Nenue@82 382
Nenue@84 383 self.progressLeft = self.progressMax - self.progressAmount
Nenue@84 384 if self.progressOverflow >= self.progressLeft then
Nenue@84 385
Nenue@84 386 self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', (self.progressOverflow / self.progressMax) * self:GetWidth(), 0)
Nenue@84 387 else
Nenue@84 388 self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPRIGHT', 0, 0)
Nenue@84 389 end
Nenue@84 390
Nenue@82 391 else
Nenue@82 392 self.ProgressBar:Hide()
Nenue@82 393 end
Nenue@81 394 else
Nenue@84 395 --self:HidePanel()
Nenue@81 396 end
Nenue@81 397
Nenue@82 398 self.modeChanged = nil
Nenue@84 399 end
Nenue@84 400
Nenue@84 401 function VeneerWorldStateProgressMixin:OnMouseDown(button)
Nenue@84 402 if button == 'RightButton' then
Nenue@84 403 if self.keepOpen then
Nenue@84 404 self.keepOpen = nil
Nenue@84 405 else
Nenue@84 406 self.keepOpen = true
Nenue@84 407 end
Nenue@84 408 print('keepOpen =', self.keepOpen)
Nenue@84 409 else
Nenue@84 410 if self.mode == 'xp' then
Nenue@84 411 self.mode = 'artifact'
Nenue@84 412 else
Nenue@84 413 self.mode = 'xp'
Nenue@84 414 end
Nenue@84 415 self:AnimateMode()
Nenue@84 416 end
Nenue@84 417
Nenue@84 418 end
Nenue@84 419
Nenue@84 420 function VeneerWorldStateProgressMixin:AnimateMode()
Nenue@84 421
Nenue@84 422 self.TransitionFadeIn:Stop()
Nenue@84 423 print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()')
Nenue@84 424 self.modeChanged = true
Nenue@84 425 self.TransitionFadeOut:Play()
Nenue@80 426 end