Mercurial > wow > buffalo2
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Modules/WorldState.lua Tue Oct 18 13:07:21 2016 -0400 @@ -0,0 +1,426 @@ +-- Veneer +-- WorldState.lua +-- Created: 10/7/2016 10:55 PM +-- %file-revision% +-- + +VeneerWorldStateCurrencyMixin = {} +VeneerWorldStateProgressMixin = { + keepOpen = true +} +VeneerWorldStateMixin = { + maxHeight = 0, + detectedFrames = {} +} +local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop + +function VeneerWorldStateMixin:Setup() + --DEFAULT_CHAT_FRAME:AddMessage('Loaded') + print('|cFFFFFF00'..self:GetName()..'|r:Setup()') + + self.modules = self.modules or {self:GetChildren()} + for i, frame in ipairs(self.modules) do + print('--'.. frame:GetName()..' exists') + if frame.Setup then + print('--'.. frame:GetName()..':Setup()') + frame:Setup() + end + + frame:SetScript('OnSizeChanged', function() + local h = frame:GetHeight() + if h > self.maxHeight then + self.maxHeight = h + self:SetHeight(h) + print('updating max height:', h) + elseif h < self.maxHeight then + self:UpdateSize() + end + end) + frame:SetScript('OnHide', function() + print('|cFF0088FF'..frame:GetName()..':OnHide()') + self:UpdateSize() + end) + frame:SetScript('OnShow', function() + frame.timeLived = 0 + print('|cFF0088FF'..frame:GetName()..':OnShow()') + self:UpdateSize() + end) + + function frame.ShowPanel(frame) + frame:SetShown(true) + self:Show() + end + function frame.HidePanel(frame) + frame:SetShown(false) + self:UpdateSize() + end + end + self:SetOrderHallUIMods() + self:UnregisterEvent('PLAYER_LOGIN') +end + +function VeneerWorldStateMixin:SetOrderHallUIMods() + if OrderHallCommandBar then + if not self.detectedFrames[OrderHallCommandBar] then + self.detectedFrames[OrderHallCommandBar] = true + hooksecurefunc(OrderHallCommandBar,'Show', function() + self:SetOrderHallUIMods() + end) + hooksecurefunc(OrderHallCommandBar,'Hide', function() + self:SetOrderHallUIMods() + self:UpdateSize() + end) + end + + + OrderHallCommandBar:ClearAllPoints() + OrderHallCommandBar:SetPoint('TOP') + OrderHallCommandBar:SetWidth(600) + OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5) + OrderHallCommandBar.WorldMapButton:Hide() + OrderHallCommandBar:EnableMouse(false) + + if OrderHallCommandBar:IsVisible() then + self:SetPoint('TOP', OrderHallCommandBar, 'BOTTOM') + print('anchoring to CommandBar') + else + self:SetPoint('TOP', UIParent, 'TOP') + print('anchoring to UIParent') + end + + self:UnregisterEvent('ADDON_LOADED') + else + self:SetPoint('TOP', UIParent, 'TOP') + print('anchoring to UIParent') + end +end + + +function VeneerWorldStateMixin:OnLoad () + print('|cFFFFFF00'..self:GetName()..'|r!') + self:RegisterEvent('PLAYER_LOGIN') + self:RegisterEvent('ADDON_LOADED') + self:RegisterEvent('ARTIFACT_UPDATE') + self:RegisterEvent('ARTIFACT_XP_UPDATE') + self:RegisterEvent('PLAYER_ENTERING_WORLD') + self:RegisterEvent('PLAYER_REGEN_ENABLED') + self:RegisterEvent('PLAYER_REGEN_DISABLED') +end + +function VeneerWorldStateMixin:OnEvent(event, arg) + print(event, arg) + + if event == 'PLAYER_LOGIN' then + if IsLoggedIn() and not self.initialized then + self.initialized = true + self:Setup() + end + elseif event == 'ADDON_LOADED' then + if self.initialized and IsAddOnLoaded('Blizzard_OrderHallUI') then + self:SetOrderHallUIMods() + end + elseif event == 'PLAYER_ENTERING_WORLD' then + self:Update() + elseif event == 'PLAYER_REGEN_ENABLED' then + self:SetShown(true) + elseif event == 'PLAYER_REGEN_DISABLED' then + self:SetShown(false) + end +end + +function VeneerWorldStateMixin:Update() + self.modules = {self:GetChildren()} + print('|cFFFFFF00All:Update()|r') + print(self:GetChildren()) + for i, frame in ipairs(self.modules) do + if frame.Update then + print(' |cFFFF00FF'.. frame:GetName() .. ':Update()') + frame:Update() + end + end + self:SetOrderHallUIMods() +end + +function VeneerWorldStateMixin:UpdateSize() + print('|cFFFFFF00All:UpdateSize()|r') + print(self:GetChildren()) + self.modules = {self:GetChildren()} + self.maxHeight = 0 + for i, frame in ipairs(self.modules) do + print(' '..frame:GetName()..':',frame:IsShown(), frame:IsVisible(), frame:GetHeight()) + if frame:IsShown() then + self.maxHeight = max(self.maxHeight, frame:GetHeight()) + end + end + if self.maxHeight == 0 then + print ('height zero') + self:Hide() + else + self:Show() + print ('height update:', self.maxHeight) + self:SetHeight(self.maxHeight) + end + +end + + + +function VeneerWorldStateMixin:OnMouseDown() +end + +function VeneerWorldStateCurrencyMixin:OnLoad () + + self:RegisterEvent("PLAYER_ENTERING_WORLD"); + self:RegisterEvent("ZONE_CHANGED"); + self:RegisterEvent("ZONE_CHANGED_INDOORS"); + self:RegisterEvent("ZONE_CHANGED_NEW_AREA"); + self:RegisterEvent('CURRENCY_DISPLAY_UPDATE') + self:RegisterEvent('CHAT_MSG_CURRENCY') + +end + +function VeneerWorldStateCurrencyMixin:OnEvent (event, arg) + self:Update() +end + + +function VeneerWorldStateCurrencyMixin:Update() + + print(' Zone:', GetZoneText()) + if GetZoneText() == 'Suramar' then + local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(1155) + + self.Icon:SetTexture(texture) + self.Label:SetFormattedText("%d / %d", earned, totalMax) + self:Show() + self:SetWidth(self.Icon:GetWidth() + self.Label:GetStringWidth() + 6) + self:SetSize(200,16) + else + self:Hide() + end + + +end + +function VeneerWorldStateProgressMixin:OnUpdate(sinceLast) + if self.keepOpen then + return + end + + self.timeLived = (self.timeLived or 0) + sinceLast + if self.timeLived >= 3 and not self.TransitionFadeOut:IsPlaying() then + if not self.timeOut then + self.timeOut = true + self.TimedFadeOut:Play() + end + end +end + + +function VeneerWorldStateProgressMixin:OnLoad() + self:RegisterEvent('PLAYER_EQUIPMENT_CHANGED') + + self:RegisterEvent("PLAYER_XP_UPDATE"); + self:RegisterEvent("UPDATE_EXHAUSTION"); + self:RegisterEvent("PLAYER_LEVEL_UP"); + self:RegisterEvent("PLAYER_UPDATE_RESTING"); + + self:RegisterEvent("ARTIFACT_UPDATE"); + self:RegisterEvent("ARTIFACT_XP_UPDATE"); + self:RegisterEvent("ARTIFACT_CLOSE"); + self:RegisterEvent("ARTIFACT_MAX_RANKS_UPDATE"); + + self.progressPercent = 0 + self.progressAmount = 0 + self.progressMax = 1 + self.progressOverflow = 0 + +end + +function VeneerWorldStateProgressMixin:Setup() + self:UpdateXPGain() + + if self.canGainXP then + self.mode = 'xp' + else + self.mode = 'artifact' + end + print('setup mode:', self.mode) +end + +function VeneerWorldStateProgressMixin:OnEvent(event, ...) + local lastMode = self.mode + if event == 'PLAYER_LEVEL_UP' or event == 'ENABLE_XP_GAIN' or event == 'DISABLE_XP_GAIN' then + self:UpdateXPGain() + elseif event == 'ARTIFACT_XP_UPDATE' or event == 'ARTIFACT_UPDATE' then + self.mode = 'artifact' + + elseif event == 'PLAYER_EQUIPMENT_CHANGED' then + local slot, hasEquip = ... + if slot == 16 then + self.mode = 'artifact' + lastMode = nil + end + elseif event == 'PLAYER_XP_UPDATE' or event == 'PLAYER_LEVEL_UP' then + print('forcing to XP mode') + self.mode = 'xp' + end + self.modeChanged = (lastMode ~= self.mode) + if self.modeChanged and self:IsVisible() then + print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()', event, ...) + self:AnimateMode() + else + print('|cFFFFFF00'..self:GetName()..':Update()', event, ...) + self:Update() + end +end +function VeneerWorldStateProgressMixin:UpdateXPGain() + self.canGainXP = (UnitLevel('player') < GetMaxPlayerLevel()) and (not IsXPUserDisabled()) + if not self.canGainXP then + self.ProgressBar:SetColorTexture(0.75,0.75,0.75) + end +end + +local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo +local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank +function VeneerWorldStateProgressMixin:Update() + local hasNewInfo = false + local progressChange = false + print(' current mode:', self.mode) + + + if self.mode == 'xp' then + local xp = UnitXP('player') + local xpMax = UnitXPMax('player') + local bonusXP = GetXPExhaustion() + if xp then + self.progressPercent = xp / xpMax + end + + self.progressText = '|cFFFFCC00' .. UnitLevel('player') .. '|r ' .. xp .. '/' .. xpMax + + if bonusXP then + self.ProgressBar:SetColorTexture(0, 0.5,1) + self.OverflowBar:Show() + self.OverflowBar:ClearAllPoints() + self.OverflowBar:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', 0, 0) + + else + self.ProgressBar:SetColorTexture(0.5,0,1) + end + hasNewInfo = (self.progressAmount ~= xp) + + progressChange = (hasNewInfo and not self.modeChanged) and ((xp - self.progressAmount) / xpMax) + + self.progressOverFlow = bonusXP + self.progressAmount = xp + self.progressMax = xpMax + elseif self.mode == 'artifact' then + + local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo() + print(' C_AUI:', itemID, altItemID, name, icon, totalXP, pointsSpent) + + if itemID then + local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0 + hasNewInfo = (self.progressAmount ~= totalXP) + progressChange = (hasNewInfo and not self.modeChanged) and (((totalXP - self.progressAmount) / nextRankCost)) + + if totalXP > nextRankCost then + self.progressPercent = 1 + self.progressPercent = totalXP / nextRankCost + end + + self.progressText = name .. ' ('..pointsSpent .. '): '.. totalXP .. ' / ' .. nextRankCost + + self.ProgressBar:SetColorTexture(1,0.5,0,1) + self.OverflowBar:Hide() + + self.progressOverFlow = 0 + self.progressAmount = totalXP + self.progressMax = nextRankCost + else + self.progressAmount = 0 + self.progressMax = 1 + self.progressText = '' + end + end + + if self.mode then + self:SetSize(600,16) + if hasNewInfo then + self.timeOut = nil + self.timeLived = 0 + if self.TransitionFadeOut:IsPlaying() then + self.TransitionFadeOut:Stop() + self:SetAlpha(1) + end + if not self:IsVisible() then + self.TransitionFadeIn:Play() + else + self:ShowPanel() + end + + end + + --print(self.ProgressBG:GetWidth()) + print(' Percent:', floor(self.progressPercent*100)/100, 'BarLength:', floor(self:GetWidth()* self.progressPercent), 'NewInfo:', hasNewInfo, 'IsShown:', self:IsShown()) + + + if progressChange then + print(' Render change:', progressChange) + self.ProgressAdded:Show() + self.ProgressAdded:SetPoint('BOTTOMLEFT', self.ProgressBar, 'BOTTOMRIGHT', - (self:GetWidth() * progressChange), 0) + self.ProgressAdded:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', 0, 0) + self.ProgressFlash:Play() + end + + + if self.progressPercent > 0 then + self.ProgressBar:Show() + self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self:GetWidth()* self.progressPercent , 0) + self.Label:SetText(self.progressText) + + self.progressLeft = self.progressMax - self.progressAmount + if self.progressOverflow >= self.progressLeft then + + self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBar, 'TOPRIGHT', (self.progressOverflow / self.progressMax) * self:GetWidth(), 0) + else + self.OverflowBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPRIGHT', 0, 0) + end + + else + self.ProgressBar:Hide() + end + else + --self:HidePanel() + end + + self.modeChanged = nil +end + +function VeneerWorldStateProgressMixin:OnMouseDown(button) + if button == 'RightButton' then + if self.keepOpen then + self.keepOpen = nil + else + self.keepOpen = true + end + print('keepOpen =', self.keepOpen) + else + if self.mode == 'xp' then + self.mode = 'artifact' + else + self.mode = 'xp' + end + self:AnimateMode() + end + +end + +function VeneerWorldStateProgressMixin:AnimateMode() + + self.TransitionFadeIn:Stop() + print('|cFF88FF00'..self:GetName()..'.TransitionFadeOut:Play()') + self.modeChanged = true + self.TransitionFadeOut:Play() +end \ No newline at end of file