diff Modules/OrderHall.lua @ 81:65ec88b30eb8

- OrderHall plugin converted to a general world state cluster. Includes: - Suramar ancient mana - Artifact power/XP progress - OrderHall bar shrinker
author Nenue
date Mon, 17 Oct 2016 04:57:32 -0400
parents bb6b532c5d2f
children be813a9d99c0
line wrap: on
line diff
--- a/Modules/OrderHall.lua	Tue Oct 11 08:03:41 2016 -0400
+++ b/Modules/OrderHall.lua	Mon Oct 17 04:57:32 2016 -0400
@@ -5,58 +5,91 @@
 --
 
 VeneerWorldStateCurrencyMixin = {}
-VeneerWorldStateMixin = {}
+VeneerWorldStateProgressMixin = {}
+VeneerWorldStateMixin = {
+  detectedFrames = {}
+}
 local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop
 
 function VeneerWorldStateMixin:Setup()
-  hooksecurefunc(OrderHallCommandBar,'Show', function()
-    self:Refresh()
-  end)
   self:Refresh()
   --DEFAULT_CHAT_FRAME:AddMessage('Loaded')
+  print('All:Setup()')
+
+  self.modules = self.modules or {self:GetChildren()}
+  for i, frame in ipairs(self.modules) do
+    if frame.Setup then
+      frame:Setup()
+    end
+  end
 end
 
 function VeneerWorldStateMixin:Refresh()
-  OrderHallCommandBar:ClearAllPoints()
-  OrderHallCommandBar:SetPoint('TOP')
-  OrderHallCommandBar:SetWidth(600)
-  OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
-  OrderHallCommandBar.WorldMapButton:Hide()
-  OrderHallCommandBar:EnableMouse(false)
+  if OrderHallCommandBar then
+    if not self.detectedFrames[OrderHallCommandBar] then
+      self.detectedFrames[OrderHallCommandBar] = true
+      hooksecurefunc(OrderHallCommandBar,'Show', function()
+        self:Refresh()
+      end)
+    end
+
+
+    OrderHallCommandBar:ClearAllPoints()
+    OrderHallCommandBar:SetPoint('TOP')
+    OrderHallCommandBar:SetWidth(600)
+    OrderHallCommandBar.Background:SetColorTexture(0,0,0,0.5)
+    OrderHallCommandBar.WorldMapButton:Hide()
+    OrderHallCommandBar:EnableMouse(false)
+  end
+
 end
 local initialized
 function VeneerWorldStateMixin:OnEvent(event, arg)
   print(event, arg)
-  if OrderHallCommandBar and not initialized then
-    initialized = true
+
+  if event == 'PLAYER_LOGIN' and not initialized then
+    if IsLoggedIn() then
+      initialized = true
       self:Setup()
-      self:UnregisterEvent('ADDON_LOADED')
+      self:UnregisterEvent('PLAYER_LOGIN')
+    end
   end
 
   if event == 'PLAYER_ENTERING_WORLD' then
     self:Update()
+  elseif event == 'PLAYER_REGEN_ENABLED' then
+    self:Show()
+  elseif event == 'PLAYER_REGEN_DISABLED' then
+    self:Hide()
   end
 end
 
 function VeneerWorldStateMixin:Update()
-  local frames = {self:GetChildren()}
+  self.modules = self.modules or {self:GetChildren()}
   print('|cFFFFFF00All:Update()|r')
-  for i, frame in ipairs(frames) do
+  self.maxHeight = 0
+  for i, frame in ipairs(self.modules) do
     if frame.Update then
       print(frame:GetName())
       frame:Update()
+      if frame:IsVisible() then
+        self.maxHeight = max(self.maxHeight, frame.maxHeight)
+      end
     end
   end
+  self:SetHeight(self.maxHeight)
 end
 
 
 
 function VeneerWorldStateMixin:OnLoad ()
+  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 VeneerWorldStateCurrencyMixin:OnLoad ()
@@ -73,9 +106,9 @@
 
 
 function VeneerWorldStateCurrencyMixin:Update()
-  local mapID = GetCurrentMapAreaID()
+
   print('currency refresh: zone =', mapID)
-  if mapID == 1033 then
+  if GetZoneText() == 'Suramar' then
     local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(1155)
 
     self.Icon:SetTexture(texture)
@@ -85,4 +118,118 @@
   else
     self:Hide()
   end
+
+  self.maxHeight = self:GetHeight()
+end
+
+function VeneerWorldStateProgressMixin:OnLoad()
+  self:RegisterEvent('PLAYER_XP_UPDATE')
+  self:RegisterEvent('PLAYER_LEVEL_UP')
+  self:RegisterEvent('PLAYER_UPDATE_RESTING')
+  self:RegisterEvent('ENABLE_XP_GAIN')
+  self:RegisterEvent('DISABLE_XP_GAIN')
+  self:RegisterEvent('PLAYER_LOGIN')
+  self:RegisterEvent('ARTIFACT_UPDATE')
+  self:RegisterEvent('ARTIFACT_XP_UPDATE')
+
+end
+
+function VeneerWorldStateProgressMixin:Setup()
+  self:UpdateXPGain()
+  if UnitLevel('player') < GetMaxPlayerLevel() then
+    self.mode = 'xp'
+  else
+    self.mode = 'artifact'
+  end
+  print('setup mode:', self.mode)
+  self:Update()
+end
+
+function VeneerWorldStateProgressMixin:OnEvent(event)
+  if 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_XP_UPDATE' or 'PLAYER_LEVEL_UP' then
+    self.mode = 'xp'
+  end
+
+
+  self:Update()
+
+end
+function VeneerWorldStateProgressMixin:UpdateXPGain()
+  if IsXPUserDisabled() then
+    self.ProgressBar:SetColorTexture(0.75,0.75,0.75)
+    self.mode = nil
+  else
+    self.ProgressBar:SetColorTexture(1,1,1)
+  end
+end
+
+local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo
+local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank
+function VeneerWorldStateProgressMixin:Update()
+
+  if not self.mode then
+    if UnitLevel('player') < GetMaxPlayerLevel() then
+      self.mode = 'xp'
+    else
+      self.mode = 'artifact'
+    end
+  end
+
+
+  self.progressPercent = 0
+  self.progressAmount = 0
+  self.progressMax = 1
+  self.progressOverflow = 0
+  if self.mode == 'xp' then
+    local xp = UnitXP('player')
+    local xpMax = UnitXPMax('player')
+    local bonusXP = GetXPExhaustion()
+    if xp then
+      self.progressPercent = xp / xpMax
+    end
+  elseif self.mode == 'artifact' then
+
+    local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo()
+    if not itemID then
+      self:Hide()
+      return
+    end
+
+    local pointsAvailable = 0
+
+    local nextRankCost = GetCostForPointAtRank(pointsSpent) or 0
+
+    self.progressAmount = totalXP
+    self.progressMax = nextRankCost
+    if totalXP > nextRankCost then
+      self.progressPercent = 1
+      self.progressOverflow = totalXP - nextRankCost
+    else
+      self.progressPercent = totalXP / nextRankCost
+    end
+
+    self.progressText = name .. ' ('..pointsSpent .. '): '.. totalXP .. ' / ' .. nextRankCost
+  else
+    self:Hide()
+    return
+  end
+
+  print(self.progressPercent, floor(self.ProgressBG:GetWidth()* self.progressPercent))
+
+  if self.progressPercent > 0 then
+    self.ProgressBar:Show()
+    self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self.ProgressBG:GetWidth()* self.progressPercent , 0)
+
+    self.Label:SetText(self.progressText)
+  else
+    self.ProgressBar:Hide()
+  end
+
+
+
+  self.maxHeight = self:GetHeight()
 end
\ No newline at end of file