comparison BuffFrame/RaidBuffTray.lua @ 47:1a322b92dbfa

file cleanup
author Nenue
date Thu, 28 Apr 2016 05:54:21 -0400
parents RaidBuffTray.lua@3dbcad2b387d
children 9837069e366a
comparison
equal deleted inserted replaced
46:aa693607b813 47:1a322b92dbfa
1 --- ${PACKAGE_NAME}
2 -- @file-author@
3 -- @project-revision@ @project-hash@
4 -- @file-revision@ @file-hash@
5 -- Created: 3/20/2016 10:00 PM
6
7 local _, A = ...
8 local B = A.frame
9 local MODULE = 'BuffFrame'
10 local M = B:RegisterModule(MODULE)
11 local displays = B.displays
12
13 local parentAnchor, parentFrame, raidbuffsFrame
14 local band, lshift, CreateFrame = bit.band, bit.lshift, CreateFrame
15 local raidBuffs = {}
16 local raidBuffSymbols = {'St', 'HP', 'AP', 'Ha', 'SP', 'Cr', 'Ma', 'MS', 'V' }
17 local missingBuffs = {}
18 local playerBuffing, playerCurrentBuff
19 local playerBuffs = {}
20 local c, ac, frameSize, frameSpacing, framePosition
21 local fprint = B.fprint
22 local NUM_LE_MISSING_RAID_BUFFS = 0
23 local missingBuffsAnchor
24
25
26 --- Takes a given icon texture and calls the pre-defined function set
27 M.UpdateBuffStyle = function(buff, style, path)
28 local print = fprint()
29 local icon = buff.icon
30 local symbol = buff.symbol
31 path = path or icon.iconPath
32 --print(style, icon.iconStyle)
33
34 if style ~= buff.iconStyle or path ~= buff.iconPath then
35 print('|cFF0088FFUpdateBuffStyle(|r', icon:GetName(), style, path)
36 icon.iconStyle = style
37 icon.iconPath = path
38 else
39 --print('|cFF00FF88UpdateBuffStyle(|r', icon:GetName(), style, path, ') same values, ignore')
40 return
41 end
42 local styleset = B.BuffStyles[style]
43 if not path or path == '' then
44 print('path is nil/empty')
45 icon:SetTexture(1, 1, 1, 1)
46 icon:SetVertexColor(unpack(styleset.Color))
47 else
48 icon:SetTexture(path or icon:GetTexture())
49 icon:SetVertexColor(unpack(styleset.Color))
50 end
51
52 if symbol and symbol.GetText then
53 symbol:SetTextColor(unpack(styleset.TextColor))
54 symbol:SetText(buff.symbolName or 'NaW')
55 end
56
57 icon:SetBlendMode(styleset.SetBlendMode)
58 icon:SetDesaturated(styleset.SetDesaturated)
59 end
60
61 --- Populates a list of targets needing a buff, fired by a handler
62 local PlayerBuffTodo ={}
63 M.UpdateBuffStatus = function(aura, filters)
64 if not PlayerBuffStatus[aura] then
65 PlayerBuffStatus[aura] = {}
66 end
67
68
69 print(UnitClass('player'))
70 if IsInGroup() then
71 local numBuffed = 0
72 local partySize = GetNumGroupMembers()
73 local missing = {}
74 for i = 1, partySize do
75 local unit = 'raid'..i
76 if UnitAura(unit, aura, nil, filters) then
77 numBuffed = numBuffed + 1
78 else
79 tinsert(missing, unit)
80 end
81 end
82
83 PlayerBuffTodo[aura] = missing
84
85 end
86 end
87
88 --- Evaluates buff availability criteria
89 -- Uses hard returns to avoid over-iterating conditionals, particularly pet family
90 local function IsBuffAvailable(criteria)
91 local available, active = false, false
92 local result
93 for _, test in ipairs(criteria) do
94 if test == true then
95 -- it's a passive effect that is always on
96 return true, true
97 else
98 if c.spec then
99 if not (result and c.spec == B.PlayerSpec) then
100 return false
101 end
102 end
103
104 if c.talent then
105 local talentID, name, texture, selected, available = GetTalentInfoByID(c.talent, GetActiveSpecGroup())
106 if not (result and selected) then
107 return false
108 end
109 end
110
111 if c.petFamily then
112 local lim = min(5, NUM_PET_STABLE_SLOTS) -- to avoid volatile loop condition
113 for p = 1, lim do
114 local hasPet = false
115 local icon, name, level, family, talent = GetStablePetInfo(p)
116 if family == c.petFamily then
117 hasPet = true
118 end
119 if not (result and hasPet) then
120 return false
121 end
122 end
123 end
124
125 end
126 end
127 return true, false
128 end
129
130 --- events: PLAYER_SPECIALIZATION_CHANGED
131 function M:UpdateBuffsTodo (unit)
132 -- buffs vs. auras
133 if unit ~= 'player' then
134 -- look for changes in the GIST manifest and sort them out
135 return
136 end
137
138 local class = UnitClass('player')
139 local spec = GetSpecialization()
140 if not class or
141 not spec or
142 not IsInGroup() or
143 not B.PlayerBuffStatus[class] then
144 -- if just logging in, info won't be available for several seconds
145 -- if not grouped, don't calc
146 -- hide frame
147 B.PlayerBuffsActive = function() return false end
148 return
149 end
150
151 -- verify change
152 if B.PlayerCurrentSpec == spec or B.PlayerClass == class then
153 return
154 end
155 B.PlayerCurrentSpec = spec
156 B.PlayerClass = class
157
158 local test = B.ClassRaidBuffs
159 local buffTypes = {}
160 local auraTypes = {}
161 for i = 1, NUM_LE_RAID_BUFF_TYPES do
162 local name, filters
163 if test[i] and test[i][class] then
164 playerBuffs[i], name, filters = IsBuffAvailable(test[i][class])
165 else
166 playerBuffs[i] = nil
167 end
168
169 if name then
170 B.UpdateBuffStatus(name, filters)
171 end
172 end
173 end
174
175 -- Called once to setup the ConsolidatedBuffs stencil
176 local consolidatedBuffsLoaded
177 M.SetConsolidatedBuffs = function()
178 local print = fprint()
179 c = displays.ConsolidatedBuff.conf
180 parentFrame = B.guides[c.Parent][c.Position]
181 raidbuffsFrame = B.anchor.ConsolidatedBuff
182
183 B.SetConfigLayers(raidbuffsFrame)
184 consolidatedBuffsLoaded = true
185 ConsolidatedBuffs:ClearAllPoints()
186 ConsolidatedBuffs:SetAllPoints(parentFrame.icon)
187 if c.Icon then
188 ConsolidatedBuffsIcon:SetAllPoints(parentFrame.icon)
189 ConsolidatedBuffsIcon:SetTexCoord(0.609,0.89,0.215,0.78)
190 else
191 ConsolidatedBuffsIcon:Hide()
192 end
193
194 ConsolidatedBuffsCount:Hide()
195 end
196
197 local missingTypes = {}
198 local raidBuffsInitialized
199 M.UpdateRaidBuffs = function()
200 local print = fprint()
201 if not consolidatedBuffsLoaded then
202 M.SetConsolidatedBuffs()
203 end
204
205 if not M.ShowConsolidated or not parentFrame.contains then
206 print(' hiding raid buffs square')
207 if raidBuffsInitialized then
208 for i = 1, 9 do
209 if raidBuffs[i] then
210 raidBuffs[i]:Hide()
211 end
212 end
213 raidBuffsInitialized = nil
214 end
215 if parentFrame then
216 print(c.Parent, c.Position)
217 print('de-flagging parent')
218 parentFrame.contains = nil
219 end
220 raidbuffsFrame:Hide()
221 return
222 end
223
224 local c = B.displays.ConsolidatedBuff.conf
225 if parentFrame and not parentFrame.contains then
226 raidBuffsInitialized = true
227 print('re-flagging parent', parentFrame:GetName())
228 parentFrame.contains = parentFrame
229 B.decors[c.Parent][c.Position]:Hide()
230 raidbuffsFrame:Show()
231
232 -- make sure parent icon is updated
233 local w = c.Size*c.PerRow+c.Spacing*(c.PerRow-1)+c.Border*2
234 parentFrame:SetSize(w, w)
235 parentFrame.icon:SetSize(w - c.Border*2, w - c.Border*2)
236 parentFrame.contains = raidbuffsFrame
237
238 M.UpdateBuffs(c.Parent)
239 end
240
241 -- have to loop again due to tainting restrictions
242 -- could compare the tooltip font object pointers, but that may change
243 local buffStack = GetRaidBuffInfo()
244 print(GetRaidBuffInfo())
245 local guides = B.guides.ConsolidatedBuff
246 local numBuffs = 0
247 local numAvailable = 0
248 local mask = 1
249 if buffStack == nil then
250 return -- discard
251 end
252
253
254 for i = 1, NUM_LE_RAID_BUFF_TYPES do
255 local available = (band(buffStack, mask) > 0)
256 local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
257 print(i, name, icon, available)
258
259 raidBuffs[i] = raidBuffs[i] or CreateFrame('Frame', 'VeneerRaidBuff' .. i, raidbuffsFrame, 'VeneerRaidBuffTemplate')
260 local buff = raidBuffs[i]
261 if not raidBuffs[i].stylized then
262 print(' setting style', i)
263 buff.stylized = true
264 buff.symbol:SetText(raidBuffSymbols[i])
265 buff.symbol:SetFont("Fonts\\FRIZQT__.TTF", 10, 'OUTLINE')
266 buff:SetSize(parentFrame.icon:GetWidth()/c.PerRow,parentFrame.icon:GetWidth()/c.PerRow)
267 buff.symbolName = raidBuffSymbols[i]
268
269 buff.icon:SetAllPoints(guides[i].icon)
270 buff:SetAllPoints(guides[i])
271 raidbuffsFrame.Zoom(buff.icon)
272 end
273
274 buff:Show()
275 local buffStyle = 'missing'
276 if name then
277 buff:Show()
278 buff.symbol:Hide()
279 missingTypes[i] = nil
280 numBuffs = numBuffs + 1
281 numAvailable = numAvailable + 1
282 buffStyle = 'active'
283 else
284 buff.symbol:Show()
285 if band(buffStack, mask) > 0 then
286 buffStyle = 'available'
287 numAvailable = numAvailable + 1
288 else
289 buffStyle = 'missing'
290 icon = ''
291 end
292 end
293 mask = lshift(mask, 1)
294
295 M.UpdateBuffStyle(buff, buffStyle, icon)
296 end
297
298 -- todo: filter by castable and suppress for non-overlapping auras
299
300 raidbuffsFrame.label:SetText(numBuffs..'/'..numAvailable)
301 print(parentFrame:GetName(), parentFrame:GetSize())
302
303 if B.ShowMissingBuffs then
304 B.UpdateMissingBuffs()
305 elseif missingBuffsAnchor and missingBuffsAnchor:IsVisible() then
306 for i = 1, NUM_LE_MISSING_RAID_BUFFS do
307 missingBuffs[i]:Hide()
308 end
309 end
310 end
311
312 B.UpdateMissingBuffs = function()
313 local print = B.fprint()
314 local numMissing = 0
315
316 local firstMissing, lastMissing
317 for i = 1, NUM_LE_RAID_BUFF_TYPES do
318 local name, _, icon, start, duration, spellID, slot = GetRaidBuffTrayAuraInfo(i)
319
320 if not name then
321 numMissing = numMissing + 1
322
323 print('missing buff', i, numMissing)
324 B.UpdateBuffStyle(raidBuffs[i].icon, 'missing', "")
325
326 missingBuffs[numMissing] = missingBuffs[numMissing] or CreateFrame('Button', 'VeneerMissingBuff' .. numMissing, raidbuffsFrame, 'VeneerMissingBuffTemplate')
327
328 local missing = missingBuffs[numMissing]
329
330 missing:Show()
331 missing:SetSize(c.Size*c.PerRow, c.Size)
332 if numMissing == 1 then
333 firstMissing = missing
334 else
335 missing:SetPoint('TOP', lastMissing, 'BOTTOM', 0, -c.Spacing)
336 end
337
338 missing.label:SetText(_G['RAID_BUFF_'.. i])
339 lastMissing = missing
340
341 end
342 end
343
344 if firstMissing then
345 print(firstMissing:GetName(), raidbuffsFrame)
346 firstMissing:SetPoint('TOPRIGHT', raidbuffsFrame.label, 'BOTTOMRIGHT', 0, c.Spacing)
347 missingBuffsAnchor = firstMissing
348 end
349
350 for i = numMissing +1, NUM_LE_MISSING_RAID_BUFFS do
351 missingBuffs[i]:Hide()
352 end
353 NUM_LE_MISSING_RAID_BUFFS = numMissing
354 end