vanilla-wow-addons – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | SL = (SL or {}); |
2 | SL.MeleeStats = (SL.MeleeStats or {}); |
||
3 | SL.SpellStats = (SL.SpellStats or {}); |
||
4 | SL.Verbose = (SL.Verbose or false); |
||
5 | SL.Debug = (SL.Debug or false); |
||
6 | SL_MaxShield = 0; |
||
7 | SL_ShieldLeft = 0; |
||
8 | SL_HasShield = false; |
||
9 | |||
10 | SLASH_SHIELDLEFT1 = "/shieldleft"; |
||
11 | SLASH_SHIELDLEFT2 = "/sl"; |
||
12 | |||
13 | eventlist = { |
||
14 | "CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS", |
||
15 | "CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES", |
||
16 | "CHAT_MSG_COMBAT_PARTY_HITS", |
||
17 | "CHAT_MSG_COMBAT_PARTY_MISSES", |
||
18 | "CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES", |
||
19 | "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE", |
||
20 | "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE", |
||
21 | "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE", |
||
22 | "CHAT_MSG_SPELL_SELF_DAMAGE", |
||
23 | "CHAT_MSG_SPELL_PARTY_DAMAGE", |
||
24 | "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS", |
||
25 | "CHAT_MSG_SPELL_AURA_GONE_SELF", |
||
26 | "PLAYER_ENTERING_WORLD", |
||
27 | "ADDON_LOADED", |
||
28 | "PET_BAR_UPDATE", |
||
29 | "LEARNED_SPELL_IN_TAB" |
||
30 | } |
||
31 | |||
32 | local function ShieldLeft_Debug(msg) |
||
33 | if SL.Debug then |
||
34 | DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00SL Debug: "..msg); |
||
35 | end |
||
36 | end |
||
37 | |||
38 | local function ShieldLeft_Verbose(msg) |
||
39 | if SL.Verbose then |
||
40 | DEFAULT_CHAT_FRAME:AddMessage("|cffffff00SL: "..msg); |
||
41 | end |
||
42 | end |
||
43 | |||
44 | local function ShieldLeft_Msg(msg) |
||
45 | DEFAULT_CHAT_FRAME:AddMessage("|cffffff00SL: "..msg); |
||
46 | end |
||
47 | |||
48 | local function ShieldLeft_Error(msg) |
||
49 | DEFAULT_CHAT_FRAME:AddMessage("|cffff0000ERROR: " .. msg); |
||
50 | UIErrorsFrame:AddMessage("!! " .. msg .. " !!", 1.0, 1.0, 0, 1, 3) |
||
51 | end |
||
52 | |||
53 | local function RegisterEvents(EventList) |
||
54 | if not EventList then |
||
55 | ShieldLeft_Error("eventlist is missing") |
||
56 | return |
||
57 | end |
||
58 | for _,aktEvent in EventList do |
||
59 | this:RegisterEvent(aktEvent) |
||
60 | end |
||
61 | end |
||
62 | |||
63 | local function UnregisterEvents(EventList) |
||
64 | if not EventList then |
||
65 | ShieldLeft_Error("eventlist is missing") |
||
66 | return |
||
67 | end |
||
68 | for _,aktEvent in EventList do |
||
69 | this:UnregisterEvent(aktEvent) |
||
70 | end |
||
71 | end |
||
72 | |||
73 | local function CheckShieldSpells() |
||
74 | ShieldLeft_Verbose(SL_MSG_CHECKINGSPELLS); |
||
75 | local i = 1 |
||
76 | while true do |
||
77 | local spellName, spellRank = GetSpellName(i, BOOKTYPE_SPELL) |
||
78 | if not spellName then |
||
79 | do break end |
||
80 | end |
||
81 | if spellName == SL_SHIELD then |
||
82 | ShieldLeft_Verbose("found " .. spellName .. '(' .. spellRank .. ')' ) |
||
83 | ShieldLeftTooltip:SetSpell(i, BOOKTYPE_SPELL); |
||
84 | local _, _, dmg = string.find(ShieldLeftTooltipTextLeft4:GetText(), SL_ABSORBING); |
||
85 | ShieldLeft_Debug(ShieldLeftTooltipTextLeft4:GetText()) |
||
86 | if ( dmg ) then |
||
87 | ShieldLeft_Debug(dmg) |
||
88 | if SL_MaxShield < tonumber(dmg) then |
||
89 | SL_MaxShield = tonumber(dmg); |
||
90 | ShieldLeft_Verbose(SL_MSG_NEWMAXSHIELD .. SL_MaxShield); |
||
91 | end |
||
92 | end |
||
93 | end |
||
94 | i = i + 1 |
||
95 | end |
||
96 | local i = 1 |
||
97 | while true do |
||
98 | local spellName, spellRank = GetSpellName(i, BOOKTYPE_PET) |
||
99 | if not spellName then |
||
100 | do break end |
||
101 | end |
||
102 | if spellName == SL_SHIELD then |
||
103 | ShieldLeft_Verbose( spellName .. '(' .. spellRank .. ')' ) |
||
104 | ShieldLeftTooltip:SetSpell(i, BOOKTYPE_PET); |
||
105 | local _, _, dmg = string.find(ShieldLeftTooltipTextLeft4:GetText(), SL_ABSORBING); |
||
106 | if ( dmg ) then |
||
107 | |||
108 | if SL_MaxShield < tonumber(dmg) then |
||
109 | SL_MaxShield = tonumber(dmg); |
||
110 | ShieldLeft_Verbose(SL_MSG_NEWMAXSHIELD .. SL_MaxShield); |
||
111 | end |
||
112 | end |
||
113 | end |
||
114 | i = i + 1 |
||
115 | end |
||
116 | end |
||
117 | |||
118 | SlashCmdList["SHIELDLEFT"] = function(msg) |
||
119 | if msg == "reset" then |
||
120 | -- ShieldLeft_Reset() |
||
121 | elseif msg == "info" then |
||
122 | ShieldLeft_ShowInfo() |
||
123 | elseif msg == "reset" then |
||
124 | -- |
||
125 | elseif msg == "check" then |
||
126 | CheckShieldSpells() |
||
127 | elseif msg == "verbose" then |
||
128 | SL.Verbose = not SL.Verbose; |
||
129 | if SL.Verbose then |
||
130 | ShieldLeft_Msg(SL_MSG_VERBOSEON) |
||
131 | else |
||
132 | ShieldLeft_Msg(SL_MSG_VERBOSEOFF) |
||
133 | end |
||
134 | elseif msg == "debug" then |
||
135 | SL.Debug = not SL.Debug; |
||
136 | if SL.Debug then |
||
137 | ShieldLeft_Msg(SL_MSG_DEBUGON) |
||
138 | else |
||
139 | ShieldLeft_Msg(SL_MSG_DEBUGOFF) |
||
140 | end |
||
141 | else |
||
142 | ShieldLeft_Msg(SL_MSG_HELP); |
||
143 | end |
||
144 | end |
||
145 | |||
146 | function ShieldLeft_OnEnter() |
||
147 | GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); |
||
148 | GameTooltip:SetText(SL_MSG_CLICKTODRAG); |
||
149 | end |
||
150 | |||
151 | function ShieldLeft_OnLoad() |
||
152 | RegisterEvents(eventlist) |
||
153 | ShieldLeft_Verbose(SL_MSG_LOADED); |
||
154 | end |
||
155 | |||
156 | function ShieldLeft_ShowInfo() |
||
157 | if SL.Verbose then |
||
158 | ShieldLeft_Msg(SL_MSG_VERBOSEON) |
||
159 | else |
||
160 | ShieldLeft_Msg(SL_MSG_VERBOSEOFF) |
||
161 | end |
||
162 | ShieldLeft_Msg(SL_MSG_MAXSHIELD .. SL_MaxShield .. "\n"); |
||
163 | for aktUnit in SL.MeleeStats do |
||
164 | ShieldLeft_Msg(aktUnit .. "(" .. SL.MeleeStats[aktUnit].med .. ")"); |
||
165 | end |
||
166 | for aktUnit in SL.SpellStats do |
||
167 | for aktSpell in SL.SpellStats[aktUnit] do |
||
168 | ShieldLeft_Msg(aktUnit .. "'s " .. aktSpell .. "(" .. SL.SpellStats[aktUnit][aktSpell].med .. ")"); |
||
169 | end |
||
170 | end |
||
171 | end |
||
172 | |||
173 | function ShieldLeft_Reset() |
||
174 | SL.MeleeStats = {}; |
||
175 | SL.SpellStats = {}; |
||
176 | ShieldLeft_Msg(SL_MSG_STATSRESET); |
||
177 | end |
||
178 | |||
179 | -- this adds meelee damage to the database |
||
180 | function ShieldLeft_AddDamage(unit, dmg) |
||
181 | if ( not SL.MeleeStats[unit] ) then |
||
182 | SL.MeleeStats[unit] = { ["hits"] = 1, ["dmg"] = dmg, ["med"] = dmg }; |
||
183 | ShieldLeft_Verbose(SL_MSG_NEWCRITTER .. unit .. "(" .. dmg .. ")"); |
||
184 | else |
||
185 | SL.MeleeStats[unit].hits = SL.MeleeStats[unit].hits + 1; |
||
186 | SL.MeleeStats[unit].dmg = SL.MeleeStats[unit].dmg + dmg; |
||
187 | local oldmed = (SL.MeleeStats[unit].med or 0); |
||
188 | SL.MeleeStats[unit].med = ceil(SL.MeleeStats[unit].dmg / SL.MeleeStats[unit].hits); |
||
189 | if abs(SL.MeleeStats[unit].med - oldmed) > 0 then |
||
190 | ShieldLeft_Verbose(unit .. ": " .. SL.MeleeStats[unit].med); |
||
191 | end |
||
192 | end |
||
193 | end |
||
194 | |||
195 | -- this adds spell/ranged damage to the database |
||
196 | function ShieldLeft_AddSpellDamage(unit, spell, dmg) |
||
197 | if ( not SL.SpellStats[unit] ) then |
||
198 | SL.SpellStats[unit] = { |
||
199 | [spell] = { |
||
200 | ["hits"] = 1, ["dmg"] = dmg, ["med"] = dmg |
||
201 | } |
||
202 | }; |
||
203 | ShieldLeft_Verbose(SL_MSG_NEWCRITTER .. unit); |
||
204 | elseif ( not SL.SpellStats[unit][spell] ) then |
||
205 | SL.SpellStats[unit][spell] = { |
||
206 | ["hits"] = 1, ["dmg"] = dmg, ["med"] = dmg |
||
207 | }; |
||
208 | ShieldLeft_Verbose(SL_MSG_NEWSPELLFOR .. unit .. ": " .. spell); |
||
209 | else |
||
210 | SL.SpellStats[unit][spell].hits = SL.SpellStats[unit][spell].hits + 1; |
||
211 | SL.SpellStats[unit][spell].dmg = SL.SpellStats[unit][spell].dmg + dmg; |
||
212 | local oldmed = (SL.SpellStats[unit][spell].med or 0); |
||
213 | SL.SpellStats[unit][spell].med = ceil(SL.SpellStats[unit][spell].dmg / SL.SpellStats[unit][spell].hits); |
||
214 | if abs(SL.SpellStats[unit][spell].med - oldmed) > 0 then |
||
215 | ShieldLeft_Verbose(unit .. "'s " .. spell .. ": " .. SL.SpellStats[unit][spell].med); |
||
216 | end |
||
217 | end |
||
218 | end |
||
219 | |||
220 | -- this subtracts the damagage the shield has absorbed from the "shield left" counter |
||
221 | function ShieldLeft_AbsorbShield(unit, spell) |
||
222 | if ( not SL_HasShield ) then |
||
223 | return; |
||
224 | end |
||
225 | local recognized; |
||
226 | if ( spell ) then |
||
227 | if ( SL.SpellStats[unit] and SL.SpellStats[unit][spell] ) then |
||
228 | SL_ShieldLeft = SL_ShieldLeft - SL.SpellStats[unit][spell].med; |
||
229 | recognized = true; |
||
230 | end |
||
231 | else |
||
232 | if ( SL.MeleeStats[unit] ) then |
||
233 | SL_ShieldLeft = SL_ShieldLeft - (SL.MeleeStats[unit].med or 0); |
||
234 | recognized = true; |
||
235 | end |
||
236 | end |
||
237 | if ( SL_ShieldLeft < 0 ) then |
||
238 | SL_ShieldLeft = 0; |
||
239 | end |
||
240 | ShieldLeftFrameText:SetText(SL_MSG_SHIELDLEFT .. SL_ShieldLeft .. "|r"); |
||
241 | ShieldLeftFrame:SetWidth(ShieldLeftFrameText:GetWidth()+10); |
||
242 | ShieldLeftFrame:SetHeight(ShieldLeftFrameText:GetHeight()+15); |
||
243 | |||
244 | if ( not recognized ) then |
||
245 | ShieldLeftFrame.recognized = nil; |
||
246 | ShieldLeftFrame:SetBackdropColor(1, 0, 0, 0.5); |
||
247 | elseif ( ShieldLeftFrame.recognized ) then |
||
248 | ShieldLeftFrame.recognized = 1; |
||
249 | ShieldLeftFrame:SetBackdropColor(0, 0, 1, 0.5); |
||
250 | end |
||
251 | end |
||
252 | |||
253 | function ShieldLeft_OnEvent(event) |
||
254 | local _,playerclass = UnitClass("player"); |
||
255 | ShieldLeft_Debug("EVENT: " .. event); |
||
256 | if event == "PLAYER_ENTERING_WORLD" then |
||
257 | this:UnregisterEvent("PLAYER_ENTERING_WORLD") |
||
258 | if playerclass == "PRIEST" then |
||
259 | ShieldLeft_Debug("adjusting for Priest"); |
||
260 | SL_SHIELD = SL_SHIELD_PRIEST; |
||
261 | SL_ABSORBING = SL_ABSORBING_PRIEST; |
||
262 | SL_YOUGAINSHIELD = SL_YOUGAINSHIELD_PRIEST; |
||
263 | SL_YOULOOSESHIELD = SL_YOULOOSESHIELD_PRIEST; |
||
264 | elseif playerclass == "WARLOCK" then |
||
265 | ShieldLeft_Debug("adjusting for Warlock"); |
||
266 | SL_SHIELD = SL_SHIELD_WARLOCK |
||
267 | SL_ABSORBING = SL_ABSORBING_WARLOCK |
||
268 | SL_YOUGAINSHIELD = SL_YOUGAINSHIELD_WARLOCK; |
||
269 | SL_YOULOOSESHIELD = SL_YOULOOSESHIELD_WARLOCK; |
||
270 | elseif playerclass == "MAGE" then |
||
271 | ShieldLeft_Debug("adjusting for Mage"); |
||
272 | SL_SHIELD = SL_SHIELD_MAGE |
||
273 | SL_ABSORBING = SL_ABSORBING_MAGE |
||
274 | SL_YOUGAINSHIELD = SL_YOUGAINSHIELD_MAGE |
||
275 | SL_YOULOOSESHIELD = SL_YOULOOSESHIELD_MAGE |
||
276 | else |
||
277 | UnregisterEvents(eventlist) |
||
278 | return; |
||
279 | end |
||
280 | CheckShieldSpells() |
||
281 | elseif event == "ADDON_LOADED" then |
||
282 | this:UnregisterEvent("ADDON_LOADED") |
||
283 | local MyAddonDetails = |
||
284 | { |
||
285 | name = SL_MODNAME, |
||
286 | version = SL_VERSION, |
||
287 | releaseDate = SL_RELEASEDATE, |
||
288 | category = MYADDONS_CATEGORY_COMBAT, |
||
289 | author = "VincentGdG", |
||
290 | email = "h40izsq02@sneakemail.com", |
||
291 | website = "http://wow.g-d-g.de" |
||
292 | } |
||
293 | local MyAddonHelp = {}; |
||
294 | MyAddonHelp[1] = SL_MSG_HELP; |
||
295 | if(myAddOnsFrame_Register) then |
||
296 | myAddOnsFrame_Register(MyAddonDetails,MyAddonHelp); |
||
297 | end |
||
298 | elseif event == "PET_BAR_UPDATE" or event == "LEARNED_SPELL_IN_TAB" then |
||
299 | CheckShieldSpells(); |
||
300 | elseif ( event == "CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS" or event == "CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS" or event == "CHAT_MSG_COMBAT_PARTY_HITS" or event == "CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES" or event == "CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES" or event == "CHAT_MSG_COMBAT_PARTY_MISSES" ) then |
||
301 | local _, _, unit, dmg1, dmg2 = string.find(arg1, SL_HITSYOUABSORBED); |
||
302 | --ShieldLeft_Debug("MELEE HIT"); |
||
303 | if ( unit and dmg1 and dmg2 ) then |
||
304 | ShieldLeft_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); |
||
305 | return; |
||
306 | end |
||
307 | local _, _, unit, dmg1, dmg2 = string.find(arg1, SL_CRITSYOUABSORBED); |
||
308 | if ( unit and dmg1 and dmg2 ) then |
||
309 | ShieldLeft_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); |
||
310 | return; |
||
311 | end |
||
312 | |||
313 | local _, _, unit, dmg1, dmg2 = string.find(arg1, SL_HITSYOUBLOCKED); |
||
314 | if ( unit and dmg1 and dmg2 ) then |
||
315 | ShieldLeft_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); |
||
316 | return; |
||
317 | end |
||
318 | local _, _, unit, dmg1, dmg2 = string.find(arg1, SL_CRITSYOUBLOCKED); |
||
319 | if ( unit and dmg1 and dmg2 ) then |
||
320 | ShieldLeft_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2)); |
||
321 | return; |
||
322 | end |
||
323 | |||
324 | local _, _, unit, dmg = string.find(arg1, SL_HITSYOUFOR) |
||
325 | if ( unit and dmg ) then |
||
326 | ShieldLeft_AddDamage(unit, tonumber(dmg)); |
||
327 | return; |
||
328 | end |
||
329 | local _, _, unit, dmg = string.find(arg1, SL_CRITSYOUFOR); |
||
330 | if ( unit and dmg ) then |
||
331 | ShieldLeft_AddDamage(unit, tonumber(dmg)); |
||
332 | return; |
||
333 | end |
||
334 | local _, _, unit = string.find(arg1,SL_ABSORBALL); |
||
335 | if ( unit ) then |
||
336 | ShieldLeft_AbsorbShield(unit); |
||
337 | return; |
||
338 | end |
||
339 | |||
340 | elseif ( event == "CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE" or event == "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE" or event == "CHAT_MSG_SPELL_PARTY_DAMAGE" or event == "CHAT_MSG_SPELL_SELF_DAMAGE" ) then |
||
341 | --ShieldLeft_Debug("RANGED HIT"); |
||
342 | local _, _, unit, spell, dmg1, dmg2 = string.find(arg1, SL_RANGED_HITSYOUABSORBED); |
||
343 | if ( unit and spell and dmg1 and dmg2 ) then |
||
344 | ShieldLeft_AddSpellDamage(unit, spell, tonumber(dmg1)+tonumber(dmg2)); |
||
345 | return; |
||
346 | end |
||
347 | |||
348 | local _, _, unit, spell, dmg1, dmg2 = string.find(arg1, SL_RANGED_CRITSYOUABSORBED); |
||
349 | if ( unit and spell and dmg1 and dmg2 ) then |
||
350 | ShieldLeft_AddSpellDamage(unit, spell, tonumber(dmg1)+tonumber(dmg2)); |
||
351 | return; |
||
352 | end |
||
353 | |||
354 | local _, _, unit, spell, dmg = string.find(arg1, SL_RANGED_HITSYOU); |
||
355 | if ( unit and spell and dmg ) then |
||
356 | ShieldLeft_AddSpellDamage(unit, spell, tonumber(dmg)); |
||
357 | return; |
||
358 | end |
||
359 | |||
360 | -- this only seems to be different from the other one in German, for shooting. |
||
361 | local _, _, unit, spell, dmg = string.find(arg1, SL_RANGED_HITSYOU2); |
||
362 | if ( unit and spell and dmg ) then |
||
363 | ShieldLeft_AddSpellDamage(unit, spell, tonumber(dmg)); |
||
364 | return; |
||
365 | end |
||
366 | |||
367 | local _, _, unit, spell, dmg = string.find(arg1, SL_RANGED_CRITSYOU); |
||
368 | if ( unit and spell and dmg ) then |
||
369 | ShieldLeft_AddSpellDamage(unit, spell, tonumber(dmg)); |
||
370 | return; |
||
371 | end |
||
372 | |||
373 | local _, _, unit, spell = string.find(arg1, SL_RANGED_YOUABSORB); |
||
374 | if ( unit and spell ) then |
||
375 | ShieldLeft_AbsorbShield(unit, spell); |
||
376 | return; |
||
377 | end |
||
378 | |||
379 | local _, _, spell, dmg = string.find(arg1, SL_YOURHITSYOU); |
||
380 | if ( spell and dmg) then |
||
381 | ShieldLeft_AddSpellDamage("GenericUnit", spell, tonumber(dmg)); |
||
382 | return; |
||
383 | end |
||
384 | |||
385 | local _, _, spell = string.find(arg1, SL_YOUABSORBYOUR); |
||
386 | if ( spell ) then |
||
387 | ShieldLeft_AbsorbShield("GenericUnit", spell); |
||
388 | return; |
||
389 | end |
||
390 | |||
391 | elseif ( event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE" ) then |
||
392 | local _, _, dmg, unit, spell = string.find(arg1, SL_YOUSUFFER); |
||
393 | if ( unit and spell and dmg ) then |
||
394 | ShieldLeft_AddSpellDamage(unit, spell, tonumber(dmg)); |
||
395 | return; |
||
396 | end |
||
397 | elseif ( event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" or event == "CHAT_MSG_SPELL_AURA_GONE_SELF" ) then |
||
398 | if ( arg1 == SL_YOUGAINSHIELD ) then |
||
399 | SL_HasShield = true; |
||
400 | SL_ShieldLeft = SL_MaxShield; |
||
401 | ShieldLeftFrame:Show(); |
||
402 | elseif ( arg1 == SL_YOULOOSESHIELD ) then |
||
403 | SL_HasShield = false; |
||
404 | SL_ShieldLeft = 0; |
||
405 | ShieldLeftFrame:Hide(); |
||
406 | end |
||
407 | return; |
||
408 | end |
||
409 | end |