-
Notifications
You must be signed in to change notification settings - Fork 1
/
ShowMeBuff.lua
370 lines (334 loc) · 9.28 KB
/
ShowMeBuff.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
local function print(...)
for i=1,select('#',...) do
local x = select(i,...)
if x == nil then
x = "nil"
end
ChatFrame1:AddMessage("|cff33ff99 ShowMeBuff|r: " .. x)
end
end
-- Utils
local function array_contains(tab, val)
-- V: no value given
if not tab then return false end
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
local name, o = ...
smbDefaults = {
buffOverDebuffs = true,
buffs = {
hideNames = {
46705, --"Honorless Target",
32727, --"Arena Preparation",
32728, --"Arena Preparation",
33795, --"Strength of the Halaani",
57940, --"Essence of Wintergrasp",
67759, --"Shard of Flame"
44521, --"Preparation"
--procs - keep powerful ones
67750, -- "Energized", -- solace
72416, -- Frostforged Sage, ICC caster ring
50402, -- Frostforged Champion, ICC melee ring
55637, --"Lightweave", -- tailor back
59626, -- Black Magic
--Priest
47515, -- "Divine Aegis",
63944, -- "Renewed Hope",
15363, -- "Inspiration",
45244, -- "Focused Will",
52800, -- "Borrowed Time",
--Mage
57669, --"Replenishment",
--Lock
47891, --"Shadow Ward",
48018, --"Demonic Circle: Summon",
57567, --"Fel Intelligence",
--"Soul Link", -- keep it ?
47260, --"Backdraft", -- same ?
--"Backlash",
--"Nether Protection",
47197, --"Eradication",
--"Shadow Trance",
--Druid
71184, --"Soothing", -- rdruid idol
16246, --"Clearcasting",
48412, --"Master Shapeshifter",
33883, --"Natural Perfection",
--Hunt
61847, --"Aspect of the Dragonhawk",
19506, --"Trueshot Aura",
52858, --"Culling the Herd",
--Pal
32223, --"Crusader Aura"
},
hideInfinite = false,
hideMounts = true,
hideConsolidated = true,
hideDuration = 600, -- 10min
hideFiltered = true,
hideNonPlayer = false,
onlyCastable = false,
numLines = 18,
numPerLine = 6,
buffSize = 15,
},
debuffs = {
hideNames = {
26013, -- Deserter
-- War
46857, -- Trauma
30070, -- Blood Frenzy
-- Rogue
48660, -- Hemorrhage
-- Warlock
29341, --"Shadowburn",
},
hideFiltered = true,
numLines = 18,
numPerLine = 6,
buffSize = 15,
},
debug = false,
verson = 1,
}
local mountIds = {
17229, -- Winterspring Frostsaber
60114, -- Armored Brown Bear
60116, -- Armored Brown Bear
72286, -- Invincible
46628, -- Swift White Hawkstrider
23338, -- Swift Stormsaber
23219, -- Swift Mistsaber
71342, -- Big Love Rocket
}
-- BUFFS
local function ShowThisBuff(rules, name, spellId, duration, expirationTime, unitCaster, shouldConsolidate)
--print(name, debuffType, duration, expirationTime, "--")
if rules.hideConsolidated and shouldConsolidate then
-- consolidated buff
--print(name..": consolidated")
return
end
if rules.hideInfinite and expirationTime == 0 then
-- infinite debuff
--print(name..": infinite")
return
end
if rules.hideFiltered and array_contains(rules.hideNames, name) then
-- buff explicitly ignored
--print(name..": ignored")
return
end
if rules.hideNonPlayer and unitCaster ~= "player" then
-- buff not casted by a player
return
end
if rules.hideDuration and duration >= rules.hideDuration then
-- buff too long
--print(name..": "..duration.." too long")
return
end
if rules.hideMounts and array_contains(mountIds, spellId) then
-- mount buff
--print(name..": mount")
return
end
--print(name, duration, "ok")
return true
end
-- V: Copy-pasted then modified
local function RefreshBuffsList(frame, friendly, unit, rules, checker)
local numBuffs = rules.numLines * rules.numPerLine
-- TODO detect suffix from isFriendly(unit)?
local framePrefix = frame:GetName()..(friendly and "Buff" or "Debuff")
local buffFn = friendly and UnitBuff or UnitDebuff
local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellId;
local buffI = 1
local filter = rules.onlyCastable and friendly and "RAID" -- TODO use isFriendly() for "RAID" or not?
for i=1, numBuffs do
name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellId = buffFn(unit, i, filter)
-- we ran out of buffs OR we have enough displayed
if not name or buffI > numBuffs then
break -- could even return
end
if checker(rules, name, spellId, duration, expirationTime, unitCaster, friendly and shouldConsolidate) then
local buffName = framePrefix..buffI
if ( icon ) then
-- if we have an icon to show then proceed with setting up the aura
-- set the icon
local buffIcon = _G[buffName.."Icon"]
buffIcon:SetTexture(icon)
-- setup the cooldown
local cooldown = _G[buffName.."Cooldown"]
if cooldown then
CooldownFrame_SetTimer(cooldown, expirationTime - duration, duration, 1)
end
-- show the aura
_G[buffName]:Show()
else
-- no icon, hide the aura
_G[buffName]:Hide()
end
buffI = buffI + 1
end
end
-- hide all remaining buff frames
-- "buffI" here is already 1 past the last displayed buff
for i=buffI, 40 do
local buffName = framePrefix..i
_G[buffName]:Hide()
end
end
function LoadUnitBuffs(rules, pointX, pointY, f)
local g = f.smbBuffFrame
if not g then
f:UnregisterEvent("UNIT_AURA")
g = CreateFrame("Frame")
f.smbBuffFrame = g
g:RegisterEvent("UNIT_AURA")
g:SetScript("OnEvent",function(self,event,a1)
if a1 == f.unit then
RefreshBuffsList(f, true, f.unit, rules, ShowThisBuff)
end
end)
end
for j=1, 40 do
local l = f:GetName().."Buff"
local n = l..j
local c = _G[n] or CreateFrame("Frame", n, f, "TargetBuffFrameTemplate")
c:SetSize(rules.buffSize, rules.buffSize)
c:ClearAllPoints()
if j == 1 then
c:SetPoint("TOPLEFT",pointX,pointY)
elseif ((j - 1) % rules.numPerLine) == 0 then
c:SetPoint("TOPLEFT",_G[l..(j - rules.numPerLine)],"BOTTOMLEFT", 0, -1)
else
c:SetPoint("LEFT",_G[l..(j-1)],"RIGHT",1,0)
end
c:Hide()
c:EnableMouse(false)
end
RefreshBuffsList(f, true, f.unit, rules, ShowThisBuff)
end
-- DEBUFFS
local function LoadUnitDebuffs(rules, pointX, pointY, f)
local g = f.smbDebuffFrame
if not g then
f:UnregisterEvent("UNIT_AURA")
g = CreateFrame("Frame")
f.smbDebuffFrame = g
g:RegisterEvent("UNIT_AURA")
g:SetScript("OnEvent",function(self,event,a1)
if a1 == f.unit then
RefreshBuffsList(f, false, f.unit, rules, ShowThisBuff)
elseif a1 == f.unit.."pet" then
-- V: todo integrate lawz's code
--PartyMemberFrame_RefreshPetDebuffs(f)
end
end)
end
for j=1, 40 do
local l = f:GetName().."Debuff"
local n = l..j
local c = _G[n] or CreateFrame("Frame",n,f,"PartyDebuffFrameTemplate")
c:ClearAllPoints()
if j == 1 then
--c:SetPoint("BOTTOMLEFT", _G[l..(j-1)],"BOTTOMRIGHT", 3, 0)
--c:SetPoint("TOPLEFT",pointX,pointY)
elseif ((j - 1) % rules.numPerLine) == 0 then
c:SetPoint("TOPLEFT",_G[l..(j - rules.numPerLine)],"BOTTOMLEFT", 0, -1)
else
c:SetPoint("LEFT",_G[l..(j-1)],"RIGHT",1,0)
end
c:SetSize(rules.buffSize, rules.buffSize)
c:Hide()
-- V: we need to specifically create a cooldown frame inside of "c"
-- because PartyDebuffFrameTemplate has none
local cd = _G[n.."Cooldown"]
if not cd then
cd = CreateFrame("Cooldown",n.."Cooldown",c,"CooldownFrameTemplate")
cd:SetReverse(true)
--cd:SetDrawEdge(true)
cd:SetSize(20, 20) -- V: size needs to be AT LEAST 20
-- ...does that mean rules.buffSize should be >=20?
cd:SetPoint("CENTER", 0, -1)
end
end
local b = _G[f:GetName().."Debuff1"]
b:ClearAllPoints()
b:SetPoint("TOPLEFT", pointX, pointY)
RefreshBuffsList(f, false, f.unit, rules, ShowThisBuff)
end
local function LoadPartyBuffs(rules, pointX, pointY)
for i=1,4 do
local f = _G["PartyMemberFrame"..i] -- PartyMemberFrame1
LoadUnitBuffs(rules, pointX, pointY, f)
end
end
local function LoadPartyDebuffs(rules, pointX, pointY)
for i=1, 4 do
local f = _G["PartyMemberFrame"..i]
LoadUnitDebuffs(rules, pointX, pointY, f)
end
end
local smb = CreateFrame("Frame")
smb:Show()
o.smb = smb
function smb:Reset()
ShowMeBuffDB = smbDefaults
print("Resetting options!")
end
local function LoadBuffs()
local BUFF_POINT
if ShowMeBuffDB.buffOverDebuffs then
BUFF_POINT = -32
else
BUFF_POINT = -50
end
LoadPartyBuffs(ShowMeBuffDB.buffs, 48, BUFF_POINT)
LoadUnitBuffs(ShowMeBuffDB.buffs, -100, 0, PlayerFrame)
end
local function LoadDebuffs()
local DEBUFF_POINT
if ShowMeBuffDB.buffOverDebuffs then
DEBUFF_POINT = -64
else
DEBUFF_POINT = -32
end
LoadPartyDebuffs(ShowMeBuffDB.debuffs, 48, DEBUFF_POINT)
LoadUnitDebuffs(ShowMeBuffDB.debuffs, -100, -50, PlayerFrame)
end
local function SmbLoaded(self)
self:SetScript("OnEvent", function(self,event,...) if self[event] then self[event](self,...) end end)
ShowMeBuffDB = ShowMeBuffDB or smbDefaults
if ShowMeBuffDB.version ~= smbDefaults.version then
smb:MigrateDB()
end
self:CreateOptions()
convertspellids(ShowMeBuffDB.buffs.hideNames)
convertspellids(ShowMeBuffDB.debuffs.hideNames)
LoadBuffs()
smb.LoadBuffs = LoadBuffs
LoadDebuffs()
smb.LoadDebuffs = LoadDebuffs
end
function convertspellids(list)
for k, v in pairs(list) do
local name = GetSpellInfo(v)
if name then
list[k] = name
end
end
end
smb:RegisterEvent("VARIABLES_LOADED")
smb:SetScript("OnEvent", SmbLoaded)
function smb:MigrateDB()
--if ShowMeBuffDB.version == 0 then
-- ShowMeBuffDB.version = 1
--end
end