vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
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