vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 CT_ShieldMod_ShieldDamageLeft = 0;
2 CT_ShieldMod_MeleeStats = { };
3 CT_ShieldMod_SpellStats = { };
4 CT_ShieldMod_Version = "B1.0";
5 CT_ShieldMod_SaveStatus = "off";
6  
7 SLASH_SHIELDMOD1 = "/shieldmod";
8 SLASH_SHIELDMOD2 = "/sm";
9  
10 SlashCmdList["SHIELDMOD"] = function(msg)
11 if ( msg == "save on" ) then
12 CT_ShieldMod_SaveStatus = "on";
13 if ( CT_Mods and CT_Mods[CT_SHIELDMOD_MODNAME] ) then
14 CT_Mods[CT_SHIELDMOD_MODNAME]["modStatus"] = "on";
15 end
16 DEFAULT_CHAT_FRAME:AddMessage("<CTMod> Shield Mod is now saving data over sessions.", 1, 1, 0);
17 elseif ( msg == "save off" ) then
18 CT_ShieldMod_SaveStatus = "off";
19 if ( CT_Mods and CT_Mods[CT_SHIELDMOD_MODNAME] ) then
20 CT_Mods[CT_SHIELDMOD_MODNAME]["modStatus"] = "off";
21 end
22 DEFAULT_CHAT_FRAME:AddMessage("<CTMod> Shield Mod is no longer saving data over sessions.", 1, 1, 0);
23 else
24 DEFAULT_CHAT_FRAME:AddMessage("<CTMod> You can use the following slash commands to control Shield Mod:", 1, 1, 0);
25 DEFAULT_CHAT_FRAME:AddMessage("<CTMod> |c00FFFFFF/shieldmod save on|r - Saves stats over sessions.", 1, 1, 0);
26 DEFAULT_CHAT_FRAME:AddMessage("<CTMod> |c00FFFFFF/shieldmod save off|r - Stops saving stats over sessions.", 1, 1, 0);
27 DEFAULT_CHAT_FRAME:AddMessage("<CTMod> Note that you can also use |c00FFFFFF/sm|r.", 1, 1, 0);
28 end
29 end
30  
31 if ( CT_AddMovable ) then
32 CT_AddMovable("CT_ShieldFrame", CT_SHIELDMOD_MOVABLE, "RIGHT", "LEFT", "Minimap", -14, 0);
33 end
34  
35 function CT_ShieldMod_OnEnter()
36 if ( not CT_RegisterMod or CT_MF_ShowFrames ) then
37 GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
38 GameTooltip:SetText("Click to drag");
39 end
40 end
41  
42 function CT_ShieldMod_ModOnClick(modId)
43 SlashCmdList["SHIELDMOD"]("save " .. CT_Mods[modId]["modStatus"]);
44 end
45  
46 function CT_ShieldMod_OnLoad()
47 this:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS");
48 this:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES");
49 this:RegisterEvent("CHAT_MSG_COMBAT_PARTY_HITS");
50 this:RegisterEvent("CHAT_MSG_COMBAT_PARTY_MISSES");
51 this:RegisterEvent("CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES");
52  
53 this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE");
54 this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE");
55 this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE");
56 this:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE");
57 this:RegisterEvent("CHAT_MSG_SPELL_PARTY_DAMAGE");
58  
59 this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS");
60 this:RegisterEvent("CHAT_MSG_SPELL_AURA_GONE_SELF");
61 this:RegisterEvent("VARIABLES_LOADED");
62 if ( not CT_RegisterMod ) then
63 DEFAULT_CHAT_FRAME:AddMessage("<CTMod> Shield Mod " .. CT_ShieldMod_Version .. " loaded. Write /shieldmod for more info.", 1, 1, 0);
64 else
65 CT_RegisterMod(CT_SHIELDMOD_MODNAME, CT_SHIELDMOD_SUBNAME, 4, "Interface\\Icons\\Spell_Holy_PowerWordShield", CT_SHIELDMOD_TOOLTIP, "off", nil, CT_ShieldMod_ModOnClick);
66 end
67 end
68  
69 function CT_ShieldMod_AddDamage(unit, dmg)
70 if ( not CT_ShieldMod_MeleeStats[unit] ) then
71 CT_ShieldMod_MeleeStats[unit] = { ["hits"] = 1, ["dmg"] = dmg };
72 else
73 CT_ShieldMod_MeleeStats[unit].hits = CT_ShieldMod_MeleeStats[unit].hits + 1;
74 CT_ShieldMod_MeleeStats[unit].dmg = CT_ShieldMod_MeleeStats[unit].dmg + dmg;
75 end
76 end
77  
78 function CT_ShieldMod_AbsorbShield(unit, spell)
79 if ( not CT_ShieldMod_HasShield ) then return; end
80 local recognized;
81 if ( spell ) then
82 if ( CT_ShieldMod_SpellStats[unit] and CT_ShieldMod_SpellStats[unit][spell] ) then
83 CT_ShieldMod_ShieldDamageLeft = CT_ShieldMod_ShieldDamageLeft - floor(CT_ShieldMod_SpellStats[unit][spell].dmg / CT_ShieldMod_SpellStats[unit][spell].hits+0.5);
84 recognized = true;
85 end
86 else
87 if ( CT_ShieldMod_MeleeStats[unit] ) then
88 CT_ShieldMod_ShieldDamageLeft = CT_ShieldMod_ShieldDamageLeft - floor(CT_ShieldMod_MeleeStats[unit].dmg / CT_ShieldMod_MeleeStats[unit].hits+0.5);
89 recognized = true;
90 end
91 end
92 if ( CT_ShieldMod_ShieldDamageLeft < 0 ) then
93 CT_ShieldMod_ShieldDamageLeft = 0;
94 end
95 CT_ShieldFrameText:SetText("Damage Left: |c00FFFFFF" .. CT_ShieldMod_ShieldDamageLeft .. "|r");
96 CT_ShieldFrame:SetWidth(CT_ShieldFrameText:GetWidth()+10);
97 CT_ShieldFrame:SetHeight(CT_ShieldFrameText:GetHeight()+15);
98  
99 if ( not recognized ) then
100 CT_ShieldFrame.recognized = nil;
101 CT_ShieldFrame:SetBackdropColor(1, 0, 0, 0.5);
102 elseif ( CT_ShieldFrame.recognized ) then
103 CT_ShieldFrame.recognized = 1;
104 CT_ShieldFrame:SetBackdropColor(0, 0, 1, 0.5);
105 end
106 end
107  
108 function CT_ShieldMod_AddSpellDamage(unit, spell, dmg)
109 if ( not CT_ShieldMod_SpellStats[unit] ) then
110 CT_ShieldMod_SpellStats[unit] = {
111 [spell] = {
112 ["hits"] = 1, ["dmg"] = dmg
113 }
114 };
115 elseif ( not CT_ShieldMod_SpellStats[unit][spell] ) then
116 CT_ShieldMod_SpellStats[unit][spell] = {
117 ["hits"] = 1, ["dmg"] = dmg
118 };
119 else
120 CT_ShieldMod_SpellStats[unit][spell].hits = CT_ShieldMod_SpellStats[unit][spell].hits + 1;
121 CT_ShieldMod_SpellStats[unit][spell].dmg = CT_ShieldMod_SpellStats[unit][spell].dmg + dmg;
122 end
123 end
124  
125 function CT_ShieldMod_OnEvent(event)
126 if ( event == "VARIABLES_LOADED" ) then
127 if ( CT_ShieldMod_SaveStatus == "off" ) then
128 CT_ShieldMod_SpellStats = { };
129 CT_ShieldMod_MeleeStats = { };
130 end
131 elseif ( UnitClass("player") ~= "Priest" ) then
132 return;
133 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
134 local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) hits you for (%d+) %((%+) absorbed%)%.");
135 if ( unit and dmg1 and dmg2 ) then
136 CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2));
137 return;
138 end
139 local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) crits you for (%d+) %((%+) absorbed%)%.");
140 if ( unit and dmg1 and dmg2 ) then
141 CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2));
142 return;
143 end
144  
145 local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) hits you for (%d+)%. %((%+) blocked%)");
146 if ( unit and dmg1 and dmg2 ) then
147 CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2));
148 return;
149 end
150 local _, _, unit, dmg1, dmg2 = string.find(arg1, "(.+) crits you for (%d+)%. %((%+) blocked%)");
151 if ( unit and dmg1 and dmg2 ) then
152 CT_ShieldMod_AddDamage(unit, tonumber(dmg1)+tonumber(dmg2));
153 return;
154 end
155  
156 local _, _, unit, dmg = string.find(arg1, "(.+) hits you for (%d+)%.")
157 if ( unit and dmg ) then
158 CT_ShieldMod_AddDamage(unit, tonumber(dmg));
159 return;
160 end
161 local _, _, unit, dmg = string.find(arg1, "(.+) crits you for (%d+)%.");
162 if ( unit and dmg ) then
163 CT_ShieldMod_AddDamage(unit, tonumber(dmg));
164 return;
165 end
166 local _, _, unit = string.find(arg1, "(.+) attacks%. You absorb all the damage%.");
167 if ( unit ) then
168 CT_ShieldMod_AbsorbShield(unit);
169 return;
170 end
171  
172 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
173  
174 local _, _, unit, spell, dmg1, dmg2 = string.find(arg1, "(.+)'s (.+) hits you for (%d+) %((%d+) absorbed%)%.");
175 if ( unit and spell and dmg1 and dmg2 ) then
176 CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg1)+tonumber(dmg2));
177 return;
178 end
179  
180 local _, _, unit, spell, dmg1, dmg2 = string.find(arg1, "(.+)'s (.+) crits you for (%d+) %((%d+) absorbed%)%.");
181 if ( unit and spell and dmg1 and dmg2 ) then
182 CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg1)+tonumber(dmg2));
183 return;
184 end
185  
186 local _, _, unit, spell, dmg = string.find(arg1, "(.+)'s (.+) hits you for (%d+)%.");
187 if ( unit and spell and dmg ) then
188 CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg));
189 return;
190 end
191  
192 local _, _, unit, spell, dmg = string.find(arg1, "(.+)'s (.+) crits you for (%d+)%.");
193 if ( unit and spell and dmg ) then
194 CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg));
195 return;
196 end
197  
198 local _, _, unit, spell = string.find(arg1, "You absorb (.+)'s (.+)%.");
199 if ( unit and spell ) then
200 CT_ShieldMod_AbsorbShield(unit, spell);
201 return;
202 end
203  
204 local _, _, spell, dmg = string.find(arg1, "Your (.+) hits you for (%d+)%.");
205 if ( spell and dmg) then
206 CT_ShieldMod_AddSpellDamage("GenericUnit", spell, tonumber(dmg));
207 return;
208 end
209  
210 local _, _, spell = string.find(arg1, "You absorb your (.+)%.");
211 if ( spell ) then
212 CT_ShieldMod_AbsorbShield("GenericUnit", spell);
213 return;
214 end
215  
216 elseif ( event == "CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE" ) then
217 local _, _, dmg, unit, spell = string.find(arg1, "You suffer (%d+) .+ from (.+)'s (.+)%.");
218 if ( unit and spell and dmg ) then
219 CT_ShieldMod_AddSpellDamage(unit, spell, tonumber(dmg));
220 return;
221 end
222 elseif ( event == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" or event == "CHAT_MSG_SPELL_AURA_GONE_SELF" ) then
223 if ( arg1 == "You gain Power Word: Shield." ) then
224 CT_ShieldMod_HasShield = 1;
225 CT_ShieldFrame:Show();
226 elseif ( arg1 == "Power Word: Shield fades from you." ) then
227 CT_ShieldMod_HasShield = nil;
228 CT_ShieldFrame:Hide();
229 end
230 return;
231 end
232  
233 end
234  
235 CT_ShieldMod_oldUA = UseAction;
236 function CT_ShieldMod_newUA(id, cursor, self)
237 CT_ShieldMod_oldUA(id, cursor, self);
238 CT_ShieldMod_ScanTooltip(id);
239 end
240 UseAction = CT_ShieldMod_newUA;
241  
242 CT_ShieldMod_oldCS = CastSpell;
243 function CT_ShieldMod_newCS(id, tab)
244 CT_ShieldMod_oldCS(id, tab);
245 CT_ShieldMod_ScanTooltip(id, 1, tab);
246 end
247 CastSpell = CT_ShieldMod_newCS;
248  
249  
250 function CT_ShieldMod_ScanTooltip(id, useSpell, spellTab)
251 CT_ShieldModTooltipTextLeft1:SetText("");
252 local oldVar = GetCVar("UberTooltips");
253 SetCVar("UberTooltips", 1);
254 if ( useSpell ) then
255 CT_ShieldModTooltip:SetSpell(id, spellTab);
256 else
257 CT_ShieldModTooltip:SetAction(id);
258 end
259 SetCVar("UberTooltips", oldVar);
260 if ( CT_ShieldModTooltipTextLeft1:GetText() ~= "Power Word: Shield" ) then
261 return;
262 end
263 for i = 1, CT_ShieldModTooltip:NumLines(), 1 do
264 local left = getglobal("CT_ShieldModTooltipTextLeft" .. i);
265 if ( left and left:GetText() ) then
266 local _, _, dmg = string.find(left:GetText(), "absorbing (%d+) damage");
267 if ( dmg ) then
268 CT_ShieldMod_ShieldDamageLeft = tonumber(dmg);
269 return;
270 end
271 end
272 local right = getglobal("CT_ShieldModTooltipTextRight" .. i);
273 if ( right and right:GetText() ) then
274 local _, _, dmg = string.find(right:GetText(), "absorbing (%d+) damage");
275 if ( dmg ) then
276 CT_ShieldMod_ShieldDamageLeft = tonumber(dmg);
277 return;
278 end
279 end
280 end
281 end