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