Mercurial > wow > turok
comparison Spirit.lua @ 1:766d8a40a1d6
first commit?
author | Nenue |
---|---|
date | Tue, 15 Dec 2015 08:07:21 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:ebbcc148a407 | 1:766d8a40a1d6 |
---|---|
1 -- User: Krakyn | |
2 -- Created: 12/8/2015 7:30 PM | |
3 local T = LibStub("AceAddon-3.0"):GetAddon("Turok") | |
4 local TL = 'Spirit' | |
5 local print = function(...) _G.print(TL, ...) end | |
6 local LSM = LibStub("LibSharedMedia-3.0") | |
7 local mod = T:NewModule("Spirit", "AceTimer-3.0") | |
8 local time = _G.ct | |
9 local auras = { | |
10 168811, -- sniper training | |
11 168809, -- sniper training: recently moved | |
12 13159, -- aspect of the pack, | |
13 187615, -- Maalus | |
14 } | |
15 local spells = { | |
16 3045, -- rapid fire, | |
17 26297, -- berserking, | |
18 121818, -- stampede, | |
19 | |
20 } | |
21 local FRAME_PREFIX = 'TkSpirit' | |
22 local FADE_TIME = 0.5 | |
23 -- local repetitive tasks | |
24 local function FindSpirit(id) | |
25 local db = T.db | |
26 local c = db.spirit | |
27 local isIcon = false | |
28 if db.spirit.progressbar[id] then | |
29 c = db.spirit.progressbar[id] | |
30 elseif db.spirit.icon[id] then | |
31 c = db.spirit.icon[id] | |
32 isIcon = true | |
33 end | |
34 local name, rank, icon, castingTime, minRange, maxRange, spellID = GetSpellInfo(id) | |
35 local s = { | |
36 name = name, | |
37 rank = rank, | |
38 icon = icon, | |
39 castingTime = castingTime, | |
40 minRange = minRange, | |
41 maxRange = maxRange, | |
42 spellID = spellID | |
43 } | |
44 | |
45 return s, c, isIcon | |
46 end | |
47 | |
48 function mod:OnEnable() | |
49 local db = _G.TurokData | |
50 self.aura_watch = {} | |
51 self.cooldown_watch = {} | |
52 self.item_watch = {} | |
53 self.myGUID = UnitGUID('player') | |
54 | |
55 | |
56 db.spirit = { | |
57 foreground_color = {1, 1, 1, 0.7}, | |
58 foreground_texture = 'Cilo', | |
59 foreground_blend = 'BLEND', | |
60 foreground_inset = -1, | |
61 background_color = {0, 0, 0, 0.7}, | |
62 background_blend = 'BLEND', | |
63 background_texture = 'Cilo', | |
64 icon_show = true, | |
65 width = 250, height = 20, | |
66 anchor = 'CENTER', parent = 'UIParent', anchorTo = 'CENTER', | |
67 posX = 0, posY = -150, | |
68 label_color = {1, 1, 1, 1}, | |
69 label_font = 'turok', | |
70 label_size = 14, | |
71 label_inset = -2, | |
72 label_point = 'LEFT', | |
73 label_outline = 'OUTLINE', | |
74 label_string = '%n %p', | |
75 label_strata = 'HIGH', | |
76 expire_sound = LSM:Fetch('sound'), | |
77 strata = 'LOW', | |
78 icon = { | |
79 [13159] = { -- Aspect of the Pack | |
80 posX = 20, posY = 20, width = 140, height = 140, | |
81 }, | |
82 [3045] = { | |
83 parent = 13159, anchor = 'RIGHT', anchorTo = 'LEFT', | |
84 posx = 0, posY = 0, width = 64, height = 64, | |
85 } | |
86 }, | |
87 progressbar = { | |
88 [168811] = { -- Sniper Training (duration) | |
89 background_color = {0,0,0,0}, | |
90 foreground_color = {1,0,0,1}, | |
91 anchor = 'BOTTOMLEFT', parent = 'TkFocusBar', anchorTo = 'TOPLEFT', | |
92 posX = 0, posY = 0, height = 16, width = 250, | |
93 label_string = '', | |
94 label_point = 'TOPLEFT', | |
95 strata = 'LOW', | |
96 attach = {{ | |
97 width_relative = 0.5, | |
98 height_relative = 1, | |
99 background_color = {1,0,0,1}, | |
100 foreground_color = {1,1,0.5, 1}, | |
101 background_blend = 'ADD', | |
102 foreground_blend = 'ADD', | |
103 | |
104 anchor = 'LEFT', | |
105 anchorTo = 'LEFT', | |
106 strata = 'MEDIUM', | |
107 }} | |
108 }, | |
109 [168809] = { -- Sniper Training: Recently Moved | |
110 background_color = {0,0,0,0 }, | |
111 foreground_color = {1,1,1,1}, | |
112 foreground_blend = 'ADD', | |
113 anchor = 'BOTTOMLEFT', parent = 'TkFocusBar', anchorTo = 'TOPLEFT', | |
114 strata = 'HIGH', | |
115 posX = 0, posY = 0, height = 16, width = 125, | |
116 icon_show = false, | |
117 label_string = '', | |
118 exceptions = { | |
119 function(aura) | |
120 return (mod.aura_watch[168811].expires < aura.expires) | |
121 end | |
122 }, | |
123 }, | |
124 }, | |
125 } | |
126 | |
127 for _, id in pairs(auras) do | |
128 -- store spellinfo fetch | |
129 self.aura_watch[id] = self:CreateSpiritFrame(id) | |
130 self.aura_watch[id].count = 0 | |
131 self.aura_watch[id].duration = 0 | |
132 self.aura_watch[id].expires = 0 | |
133 self.aura_watch[id].caster = 0 | |
134 print('AURA', id, self.aura_watch[id].name) | |
135 end | |
136 | |
137 for _, id in ipairs(spells) do | |
138 self.cooldown_watch[id] = self:CreateSpiritFrame(id) | |
139 print('COOLDOWN', id, self.cooldown_watch[id].name) | |
140 end | |
141 | |
142 self:SpiritScan() | |
143 self:RegisterEvent('UNIT_AURA') | |
144 self:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED') | |
145 self:RegisterEvent('PLAYER_REGEN_DISABLED') | |
146 self:RegisterEvent('PLAYER_REGEN_ENABLED') | |
147 end | |
148 | |
149 -- StatusBar factory | |
150 function mod:CreateSpiritFrame(id) | |
151 local s, c, isIcon = FindSpirit(id) | |
152 | |
153 -- how much frame do we need? | |
154 local f | |
155 if isIcon then | |
156 f = CreateFrame('Frame', FRAME_PREFIX..id, UIParent) | |
157 f.db = c | |
158 function f:Update() end | |
159 else | |
160 f = T:CreateBar('TkAuraBar'..id, c) | |
161 f.isTimer = true | |
162 if (c.label_string ~= '') then | |
163 print('has label, add it', id) | |
164 T:AddLabel(f, c) | |
165 end | |
166 end | |
167 f:Hide() | |
168 | |
169 -- general display | |
170 f:SetPoint(c.anchor, c.parent, c.anchorTo, c.posX, c.posY) | |
171 f:SetSize(c.width, c.height) | |
172 f:SetFrameStrata(c.strata) | |
173 | |
174 -- icon? | |
175 f.icon = s.icon | |
176 T:CreateStatusIcon(f) | |
177 | |
178 -- attachment frames? | |
179 if c.attach then | |
180 for i, e in ipairs(c.attach) do | |
181 local ef = CreateFrame('Frame', 'TkExtra'..id, f) | |
182 f[i] = ef | |
183 ef:SetPoint(e.anchor, f, e.anchorTo) | |
184 ef:SetSize(c.width * e.width_relative or e.width, c.height * e.height_relative or e.height) | |
185 ef:SetFrameStrata(e.strata or c.strata) | |
186 T:CreateStatusTextures(ef, e) | |
187 end | |
188 end | |
189 | |
190 -- setup suppression checking | |
191 if c.exceptions then | |
192 function s:ExceptionCheck () | |
193 for i, func in ipairs(c.exceptions) do | |
194 if not func(self) then | |
195 return false, i | |
196 end | |
197 end | |
198 return true | |
199 end | |
200 else | |
201 function s:ExceptionCheck () return true end | |
202 end | |
203 | |
204 -- access linkage | |
205 f.format = c.label_string | |
206 f.spirit = s | |
207 f.name = s.name | |
208 s.frame = f | |
209 return s | |
210 end | |
211 | |
212 function mod:UNIT_AURA(e, unit) | |
213 if unit == 'player' then | |
214 self:SpiritScan() | |
215 end | |
216 end | |
217 | |
218 -- Updates aura watches | |
219 function mod:SpiritScan() | |
220 local db = _G.TurokData | |
221 for id, aura in pairs(self.aura_watch) do | |
222 local c = aura.conf | |
223 local f = aura.frame | |
224 | |
225 local name, _, _, count, _, duration, expires, caster = UnitAura('player', aura.name) | |
226 | |
227 if name then | |
228 aura.duration = duration | |
229 aura.expires = expires | |
230 aura.caster = caster | |
231 aura.count = count | |
232 local test, i = aura:ExceptionCheck() | |
233 print(name, duration, expires) | |
234 if not test then | |
235 print('suppressing '..aura.name..' (failed test #'..i..')') | |
236 else | |
237 f.name = name | |
238 f:Update(nil, duration, expires) | |
239 f:Show() | |
240 end | |
241 end | |
242 end | |
243 end | |
244 | |
245 function mod:PLAYER_REGEN_ENABLED() | |
246 for id, aura in pairs(self.aura_watch) do | |
247 print('non-combat alpha for #', id, aura.name, 'is', aura.frame.db.alpha_ooc) | |
248 aura.frame.fadeTo = aura.frame.db.alpha_ooc | |
249 aura.frame.fadeDuration = FADE_TIME | |
250 end | |
251 end | |
252 | |
253 function mod:PLAYER_REGEN_DISABLED() | |
254 for id, aura in pairs(self.aura_watch) do | |
255 print('combat alpha for #', id, aura.name, 'is', aura.frame.db.alpha) | |
256 aura.frame.fadeTo = aura.frame.db.alpha | |
257 aura.frame.fadeDuration = FADE_TIME | |
258 end | |
259 end | |
260 | |
261 -- This is the most reliable way of catching item and spell uses, other events are delayed or too vague to be useful | |
262 function mod:COMBAT_LOG_EVENT_UNFILTERED(e, ...) | |
263 local timestamp, combatEvent, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags = | |
264 ...; -- Those arguments appear for all combat event variants. | |
265 local eventPrefix, eventSuffix = combatEvent:match("^(.-)_?([^_]*)$"); | |
266 if eventPrefix ~= 'SPELL_' or sourceGUID ~= self.myGUID then | |
267 return | |
268 end | |
269 | |
270 local spellid, name, count, type = select(13, select('#', ...), ...) | |
271 local kc = '' | |
272 for i=1,4 do | |
273 kc = kc .. string.format('%X',((string.byte(eventSuffix,i) % 8) + 8)) | |
274 end | |
275 print('|cFFFF'..kc..eventSuffix..'|r', sourceName, destName, spellid, name) | |
276 end |