diff RaidBuffTray.lua @ 0:3dbcad2b387d

initial push
author Nenue
date Wed, 30 Mar 2016 02:24:56 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RaidBuffTray.lua	Wed Mar 30 02:24:56 2016 -0400
@@ -0,0 +1,354 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/20/2016 10:00 PM
+
+local _, A = ...
+local B = A.frame
+local MODULE = 'BuffFrame'
+local M = B:RegisterModule(MODULE)
+local displays = B.displays
+
+local parentAnchor, parentFrame, raidbuffsFrame
+local band, lshift, CreateFrame = bit.band, bit.lshift, CreateFrame
+local raidBuffs = {}
+local raidBuffSymbols = {'St', 'HP', 'AP', 'Ha', 'SP', 'Cr', 'Ma', 'MS', 'V' }
+local missingBuffs = {}
+local playerBuffing, playerCurrentBuff
+local playerBuffs = {}
+local c, ac, frameSize, frameSpacing, framePosition
+local fprint = B.fprint
+local NUM_LE_MISSING_RAID_BUFFS = 0
+local missingBuffsAnchor
+
+
+--- Takes a given icon texture and calls the pre-defined function set
+M.UpdateBuffStyle = function(buff, style, path)
+  local print = fprint()
+  local icon = buff.icon
+  local symbol = buff.symbol
+  path = path or icon.iconPath
+  --print(style,  icon.iconStyle)
+
+  if style ~= buff.iconStyle or path ~= buff.iconPath then
+    print('|cFF0088FFUpdateBuffStyle(|r',  icon:GetName(), style, path)
+    icon.iconStyle = style
+    icon.iconPath = path
+  else
+    --print('|cFF00FF88UpdateBuffStyle(|r',  icon:GetName(), style, path, ') same values, ignore')
+    return
+  end
+  local styleset = B.BuffStyles[style]
+  if not path or path == '' then
+    print('path is nil/empty')
+    icon:SetTexture(1, 1, 1, 1)
+    icon:SetVertexColor(unpack(styleset.Color))
+  else
+    icon:SetTexture(path or icon:GetTexture())
+    icon:SetVertexColor(unpack(styleset.Color))
+  end
+
+  if symbol and symbol.GetText then
+    symbol:SetTextColor(unpack(styleset.TextColor))
+    symbol:SetText(buff.symbolName or 'NaW')
+  end
+
+  icon:SetBlendMode(styleset.SetBlendMode)
+  icon:SetDesaturated(styleset.SetDesaturated)
+end
+
+--- Populates a list of targets needing a buff, fired by a handler
+local PlayerBuffTodo ={}
+M.UpdateBuffStatus = function(aura, filters)
+  if not PlayerBuffStatus[aura] then
+    PlayerBuffStatus[aura] = {}
+  end
+
+
+  print(UnitClass('player'))
+  if IsInGroup() then
+    local numBuffed = 0
+    local partySize = GetNumGroupMembers()
+    local missing = {}
+    for i = 1, partySize do
+      local unit = 'raid'..i
+      if UnitAura(unit, aura, nil, filters) then
+        numBuffed = numBuffed + 1
+      else
+        tinsert(missing, unit)
+      end
+    end
+
+    PlayerBuffTodo[aura] = missing
+
+  end
+end
+
+--- Evaluates buff availability criteria
+-- Uses hard returns to avoid over-iterating conditionals, particularly pet family
+local function IsBuffAvailable(criteria)
+  local available, active = false, false
+  local result
+  for _, test in ipairs(criteria) do
+    if test == true then
+      -- it's a passive effect that is always on
+      return true, true
+    else
+      if c.spec then
+        if not (result and c.spec == B.PlayerSpec) then
+          return false
+        end
+      end
+
+      if c.talent then
+        local talentID, name, texture, selected, available = GetTalentInfoByID(c.talent, GetActiveSpecGroup())
+        if not (result and selected) then
+          return false
+        end
+      end
+
+      if c.petFamily then
+        local lim = min(5, NUM_PET_STABLE_SLOTS) -- to avoid volatile loop condition
+        for p = 1, lim do
+          local hasPet = false
+          local icon, name, level, family, talent = GetStablePetInfo(p)
+          if family == c.petFamily then
+            hasPet = true
+          end
+          if not (result and hasPet) then
+            return false
+          end
+        end
+      end
+
+    end
+  end
+  return true, false
+end
+
+--- events: PLAYER_SPECIALIZATION_CHANGED
+function M:UpdateBuffsTodo (unit)
+  -- buffs vs. auras
+  if unit ~= 'player' then
+    -- look for changes in the GIST manifest and sort them out
+    return
+  end
+
+  local class = UnitClass('player')
+  local spec = GetSpecialization()
+  if not class or
+      not spec or
+      not IsInGroup() or
+      not B.PlayerBuffStatus[class] then
+    -- if just logging in, info won't be available for several seconds
+    -- if not grouped, don't calc
+    -- hide frame
+      B.PlayerBuffsActive = function() return false end
+    return
+  end
+
+  -- verify change
+  if B.PlayerCurrentSpec == spec or B.PlayerClass == class then
+    return
+  end
+  B.PlayerCurrentSpec = spec
+  B.PlayerClass = class
+
+  local test = B.ClassRaidBuffs
+  local buffTypes = {}
+  local auraTypes = {}
+  for i = 1, NUM_LE_RAID_BUFF_TYPES do
+    local name, filters
+    if test[i] and test[i][class] then
+      playerBuffs[i], name, filters = IsBuffAvailable(test[i][class])
+    else
+      playerBuffs[i] = nil
+    end
+
+    if name then
+      B.UpdateBuffStatus(name, filters)
+    end
+  end
+end
+
+-- Called once to setup the ConsolidatedBuffs stencil
+local consolidatedBuffsLoaded
+M.SetConsolidatedBuffs = function()
+  local print = fprint()
+  c = displays.ConsolidatedBuff.conf
+  parentFrame = B.guides[c.Parent][c.Position]
+  raidbuffsFrame = B.anchor.ConsolidatedBuff
+
+  B.SetConfigLayers(raidbuffsFrame)
+  consolidatedBuffsLoaded = true
+  ConsolidatedBuffs:ClearAllPoints()
+  ConsolidatedBuffs:SetAllPoints(parentFrame.icon)
+  if c.Icon then
+    ConsolidatedBuffsIcon:SetAllPoints(parentFrame.icon)
+    ConsolidatedBuffsIcon:SetTexCoord(0.609,0.89,0.215,0.78)
+  else
+    ConsolidatedBuffsIcon:Hide()
+  end
+
+  ConsolidatedBuffsCount:Hide()
+end
+
+local missingTypes = {}
+local raidBuffsInitialized
+M.UpdateRaidBuffs = function()
+  local print = fprint()
+  if not consolidatedBuffsLoaded then
+    M.SetConsolidatedBuffs()
+  end
+
+  if not M.ShowConsolidated or not parentFrame.contains then
+    print('  hiding raid buffs square')
+    if raidBuffsInitialized then
+      for i = 1, 9 do
+        if raidBuffs[i] then
+          raidBuffs[i]:Hide()
+        end
+      end
+      raidBuffsInitialized = nil
+    end
+    if parentFrame then
+      print(c.Parent, c.Position)
+      print('de-flagging parent')
+      parentFrame.contains = nil
+    end
+    raidbuffsFrame:Hide()
+    return
+  end
+
+  local c = B.displays.ConsolidatedBuff.conf
+  if parentFrame and not parentFrame.contains then
+    raidBuffsInitialized = true
+    print('re-flagging parent', parentFrame:GetName())
+    parentFrame.contains = parentFrame
+    B.decors[c.Parent][c.Position]:Hide()
+    raidbuffsFrame:Show()
+
+    -- make sure parent icon is updated
+    local w = c.Size*c.PerRow+c.Spacing*(c.PerRow-1)+c.Border*2
+    parentFrame:SetSize(w, w)
+    parentFrame.icon:SetSize(w - c.Border*2, w - c.Border*2)
+    parentFrame.contains = raidbuffsFrame
+
+    M.UpdateBuffs(c.Parent)
+  end
+
+  -- have to loop again due to tainting restrictions
+  -- could compare the tooltip font object pointers, but that may change
+  local buffStack = GetRaidBuffInfo()
+  print(GetRaidBuffInfo())
+  local guides = B.guides.ConsolidatedBuff
+  local numBuffs = 0
+  local numAvailable = 0
+  local mask = 1
+  if buffStack == nil then
+    return -- discard
+  end
+
+
+  for i = 1, NUM_LE_RAID_BUFF_TYPES do
+    local available = (band(buffStack, mask) > 0)
+    local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
+    print(i, name, icon, available)
+
+    raidBuffs[i] = raidBuffs[i] or CreateFrame('Frame', 'VeneerRaidBuff' .. i, raidbuffsFrame, 'VeneerRaidBuffTemplate')
+    local buff = raidBuffs[i]
+    if not raidBuffs[i].stylized then
+      print('  setting style', i)
+      buff.stylized = true
+      buff.symbol:SetText(raidBuffSymbols[i])
+      buff.symbol:SetFont("Fonts\\FRIZQT__.TTF", 10, 'OUTLINE')
+      buff:SetSize(parentFrame.icon:GetWidth()/c.PerRow,parentFrame.icon:GetWidth()/c.PerRow)
+      buff.symbolName = raidBuffSymbols[i]
+
+      buff.icon:SetAllPoints(guides[i].icon)
+      buff:SetAllPoints(guides[i])
+      raidbuffsFrame.Zoom(buff.icon)
+    end
+
+    buff:Show()
+    local buffStyle = 'missing'
+    if name then
+      buff:Show()
+      buff.symbol:Hide()
+      missingTypes[i] = nil
+      numBuffs = numBuffs + 1
+      numAvailable = numAvailable + 1
+      buffStyle = 'active'
+    else
+      buff.symbol:Show()
+      if band(buffStack, mask) > 0 then
+        buffStyle = 'available'
+        numAvailable = numAvailable + 1
+      else
+        buffStyle = 'missing'
+        icon = ''
+      end
+    end
+    mask = lshift(mask, 1)
+
+    M.UpdateBuffStyle(buff, buffStyle, icon)
+  end
+
+  -- todo: filter by castable and suppress for non-overlapping auras
+
+  raidbuffsFrame.label:SetText(numBuffs..'/'..numAvailable)
+  print(parentFrame:GetName(), parentFrame:GetSize())
+
+  if B.ShowMissingBuffs then
+      B.UpdateMissingBuffs()
+  elseif missingBuffsAnchor and missingBuffsAnchor:IsVisible() then
+    for i = 1, NUM_LE_MISSING_RAID_BUFFS do
+      missingBuffs[i]:Hide()
+    end
+  end
+end
+
+B.UpdateMissingBuffs = function()
+  local print = B.fprint()
+  local numMissing = 0
+
+  local firstMissing, lastMissing
+  for i = 1, NUM_LE_RAID_BUFF_TYPES do
+    local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
+
+    if not name then
+      numMissing = numMissing + 1
+
+      print('missing buff', i, numMissing)
+      B.UpdateBuffStyle(raidBuffs[i].icon, 'missing', "")
+
+      missingBuffs[numMissing] = missingBuffs[numMissing] or CreateFrame('Button', 'VeneerMissingBuff' .. numMissing, raidbuffsFrame, 'VeneerMissingBuffTemplate')
+
+      local missing = missingBuffs[numMissing]
+
+      missing:Show()
+      missing:SetSize(c.Size*c.PerRow, c.Size)
+      if numMissing == 1 then
+        firstMissing = missing
+      else
+        missing:SetPoint('TOP', lastMissing, 'BOTTOM', 0, -c.Spacing)
+      end
+
+      missing.label:SetText(_G['RAID_BUFF_'.. i])
+      lastMissing = missing
+
+    end
+  end
+
+  if firstMissing then
+    print(firstMissing:GetName(), raidbuffsFrame)
+    firstMissing:SetPoint('TOPRIGHT', raidbuffsFrame.label, 'BOTTOMRIGHT', 0, c.Spacing)
+    missingBuffsAnchor = firstMissing
+  end
+
+  for i = numMissing +1, NUM_LE_MISSING_RAID_BUFFS do
+    missingBuffs[i]:Hide()
+  end
+  NUM_LE_MISSING_RAID_BUFFS = numMissing
+end
\ No newline at end of file