vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 ------------------------------
2 -- Are you local? --
3 ------------------------------
4  
5 local boss = AceLibrary("Babble-Boss-2.2")["Sapphiron"]
6 local L = AceLibrary("AceLocale-2.2"):new("BigWigs"..boss)
7  
8 local time
9 local cachedUnitId
10 local lastTarget
11 local started
12  
13 ----------------------------
14 -- Localization --
15 ----------------------------
16  
17 L:RegisterTranslations("enUS", function() return {
18 cmd = "Sapphiron",
19  
20 deepbreath_cmd = "deepbreath",
21 deepbreath_name = "Deep Breath alert",
22 deepbreath_desc = "Warn when Sapphiron begins to cast Deep Breath.",
23  
24 lifedrain_cmd = "lifedrain",
25 lifedrain_name = "Life Drain",
26 lifedrain_desc = "Warns about the Life Drain curse.",
27  
28 berserk_cmd = "berserk",
29 berserk_name = "Berserk",
30 berserk_desc = "Warn for berserk.",
31  
32 berserk_bar = "Berserk",
33 berserk_warn_10min = "10min to berserk!",
34 berserk_warn_5min = "5min to berserk!",
35 berserk_warn_rest = "%s sec to berserk!",
36  
37 engage_message = "Sapphiron engaged! Berserk in 15min!",
38  
39 lifedrain_message = "Life Drain! Possibly new one ~24sec!",
40 lifedrain_warn1 = "Life Drain in 5sec!",
41 lifedrain_bar = "Life Drain",
42  
43 lifedrain_trigger = "afflicted by Life Drain",
44 lifedrain_trigger2 = "Life Drain was resisted by",
45  
46 deepbreath_incoming_message = "Ice Bomb casting in ~23sec!",
47 deepbreath_incoming_soon_message = "Ice Bomb casting in ~5sec!",
48 deepbreath_incoming_bar = "Ice Bomb Cast",
49 deepbreath_trigger = "%s takes in a deep breath...",
50 deepbreath_warning = "Ice Bomb Incoming!",
51 deepbreath_bar = "Ice Bomb Lands!",
52 } end )
53  
54 L:RegisterTranslations("koKR", function() return {
55 deepbreath_name = "딥브레스 경고",
56 deepbreath_desc = "사피론 딥 브레스 시전 시 경고.",
57  
58 lifedrain_name = "생명력 흡수",
59 lifedrain_desc = "생명력 흡수 저주에 대한 경고.",
60  
61 lifedrain_message = "생명력 흡수! 새로운 생명력 흡수 ~24초!",
62 lifedrain_warn1 = "5초간 생명력 흡수!",
63 lifedrain_bar = "생명력 흡수",
64  
65 berserk_name = "광폭화",
66 berserk_desc = "광폭화에 대한 경고.",
67  
68 berserk_bar = "광폭화",
69 berserk_warn_10min = "10분 후 광폭화!",
70 berserk_warn_5min = "5분 후 광폭화!",
71 berserk_warn_rest = "%s초 후 광폭화!",
72  
73 engage_message = "사피론 전투 개시! 광폭화 까지 15분!",
74  
75 lifedrain_trigger = "생명력 흡수에 걸렸습니다.",
76 lifedrain_trigger2 = "생명력 흡수|1으로;로; (.+)|1을;를; 공격했지만 저항했습니다.",
77  
78 deepbreath_incoming_message = "얼음 폭탄 시전 - 약 25초 후!",
79 deepbreath_incoming_soon_message = "얼음 폭탄 시전 - 약 5초 후!",
80 deepbreath_incoming_bar = "얼음 폭탄 시전",
81 deepbreath_trigger = "%s|1이;가; 숨을 깊게 들이쉽니다.",
82 deepbreath_warning = "얼음 폭탄 다가옴!",
83 deepbreath_bar = "얼음 폭탄 떨어짐!",
84 } end )
85  
86 L:RegisterTranslations("deDE", function() return {
87 deepbreath_name = "Frostatem Warnung",
88 deepbreath_desc = "Warnt, wenn Saphiron Frostatem zaubert.",
89  
90 lifedrain_name = "Lebenssauger",
91 lifedrain_desc = "Warnt vor dem Lebenssauger Fluch.",
92  
93 berserk_name = "Berserker",
94 berserk_desc = "Warnt vor Berserker.",
95  
96 berserk_bar = "Berserker",
97 berserk_warn_10min = "10min bis Berserker!",
98 berserk_warn_5min = "5min bis Berserker!",
99 berserk_warn_rest = "%s sek bis Berserker!",
100  
101 engage_message = "Sapphiron angegriffen! Berserker in 15min!",
102  
103 lifedrain_message = "Lebenssauger! N\195\164chster in ~24sek!",
104 lifedrain_warn1 = "Lebenssauger in 5sek!",
105 lifedrain_bar = "Lebenssauger",
106  
107 lifedrain_trigger = "von Lebenssauger betroffen",
108 lifedrain_trigger2 = "Lebenssauger wurde von .+ widerstanden",
109  
110 deepbreath_incoming_message = "Frostatem in ~23sek!",
111 deepbreath_incoming_soon_message = "Frostatem in ~5sek!",
112 deepbreath_incoming_bar = "Frostatem",
113 deepbreath_trigger = "%s atmet tief ein...",
114 deepbreath_warning = "Frostatem kommt!",
115 deepbreath_bar = "Frostatem!",
116 } end )
117  
118 L:RegisterTranslations("zhCN", function() return {
119 deepbreath_name = "深呼吸警报",
120 deepbreath_desc = "萨菲隆开始施放深呼吸时发出警报",
121  
122 lifedrain_name = "生命吸取警报",
123 lifedrain_desc = "生命吸取诅咒时候发出警报",
124  
125 berserk_name = "狂暴警报",
126 berserk_desc = "狂暴警报",
127  
128 berserk_bar = "狂暴",
129 berserk_warn_10min = "10分钟后狂暴!",
130 berserk_warn_5min = "5分钟后狂暴!",
131 berserk_warn_rest = "%s秒后狂暴!",
132  
133 engage_message = "萨菲隆激活!15分钟后进入狂暴状态!",
134  
135 lifedrain_message = "生命吸取,~24秒后再次施放!",
136 lifedrain_warn1 = "5秒后生命吸取!",
137 lifedrain_bar = "生命吸取",
138  
139 lifedrain_trigger = "受到了生命吸取效果的影响",
140 lifedrain_trigger2 = "生命吸取被抵抗", -- need confirm
141  
142 deepbreath_incoming_message = "寒冰炸弹~23秒后施放!",
143 deepbreath_incoming_soon_message = "寒冰炸弹~5秒后施放!",
144 deepbreath_incoming_bar = "寒冰炸弹",
145 deepbreath_trigger = "%s深深地吸了一口气……",
146 deepbreath_warning = "寒冰炸弹即将着地!",
147 deepbreath_bar = "寒冰炸弹着地!",
148 } end )
149  
150 L:RegisterTranslations("zhTW", function() return {
151 --Sapphiron 薩菲隆
152 deepbreath_name = "深呼吸警報",
153 deepbreath_desc = "薩菲隆開始施放深呼吸時發出警報",
154  
155 lifedrain_name = "生命吸取警報",
156 lifedrain_desc = "生命吸取詛咒時候發出警報",
157  
158 berserk_name = "狂暴警報",
159 berserk_desc = "狂暴警報",
160  
161 berserk_bar = "狂暴",
162 berserk_warn_10min = "10分鐘後狂暴!",
163 berserk_warn_5min = "5分鐘後狂暴!",
164 berserk_warn_rest = "%s秒後狂暴!",
165  
166 engage_message = "薩菲隆進入戰鬥 - 15 分鐘後進入狂暴狀態!",
167  
168 lifedrain_message = "生命吸取 24 秒後再次施放!",
169 lifedrain_warn1 = "5 秒後生命吸取!",
170 lifedrain_bar = "生命吸取",
171  
172 lifedrain_trigger = "受到了生命吸取效果的影響",
173 lifedrain_trigger2 = "生命吸取被抵抗", -- need confirm
174  
175 deepbreath_incoming_message = "寒冰炸彈23 秒後施放!",
176 deepbreath_incoming_soon_message = "寒冰炸彈 5 秒後施放!",
177 deepbreath_incoming_bar = "寒冰炸彈",
178 deepbreath_trigger = "%s深深地吸了一口氣……",
179 deepbreath_warning = "寒冰炸彈即將著地!",
180 deepbreath_bar = "寒冰炸彈",
181 } end )
182  
183 ----------------------------------
184 -- Module Declaration --
185 ----------------------------------
186  
187 BigWigsSapphiron = BigWigs:NewModule(boss)
188 BigWigsSapphiron.zonename = AceLibrary("Babble-Zone-2.2")["Naxxramas"]
189 BigWigsSapphiron.enabletrigger = boss
190 BigWigsSapphiron.toggleoptions = { "berserk", "lifedrain", "deepbreath", "bosskill" }
191 BigWigsSapphiron.revision = tonumber(string.sub("$Revision: 17540 $", 12, -3))
192  
193 ------------------------------
194 -- Initialization --
195 ------------------------------
196  
197 function BigWigsSapphiron:OnEnable()
198 time = nil
199 cachedUnitId = nil
200 lastTarget = nil
201 started = nil
202  
203 if self:IsEventScheduled("bwsapphtargetscanner") then
204 self:CancelScheduledEvent("bwsapphtargetscanner")
205 end
206 if self:IsEventScheduled("bwsapphdelayed") then
207 self:CancelScheduledEvent("bwsapphdelayed")
208 end
209  
210 self:RegisterEvent("CHAT_MSG_MONSTER_EMOTE")
211  
212 self:RegisterEvent("PLAYER_REGEN_ENABLED", "CheckForWipe")
213 self:RegisterEvent("PLAYER_REGEN_DISABLED", "CheckForEngage")
214  
215 self:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE", "LifeDrain")
216 self:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE", "LifeDrain")
217 self:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE", "LifeDrain")
218  
219 self:RegisterEvent("CHAT_MSG_COMBAT_HOSTILE_DEATH", "GenericBossDeath")
220  
221 self:RegisterEvent("BigWigs_RecvSync")
222 self:TriggerEvent("BigWigs_ThrottleSync", "SapphironLifeDrain", 4)
223 self:TriggerEvent("BigWigs_ThrottleSync", "SapphironFlight", 5)
224 end
225  
226 ------------------------------
227 -- Event Handlers --
228 ------------------------------
229  
230 function BigWigsSapphiron:BigWigs_RecvSync( sync, rest, nick )
231 if sync == self:GetEngageSync() and rest and rest == boss and not started then
232 started = true
233 if self:IsEventRegistered("PLAYER_REGEN_DISABLED") then self:UnregisterEvent("PLAYER_REGEN_DISABLED") end
234 if self:IsEventScheduled("bwsapphtargetscanner") then
235 self:CancelScheduledEvent("bwsapphtargetscanner")
236 end
237 if self:IsEventScheduled("bwsapphdelayed") then
238 self:CancelScheduledEvent("bwsapphdelayed")
239 end
240 if self.db.profile.berserk then
241 self:TriggerEvent("BigWigs_Message", L["engage_message"], "Attention")
242 self:TriggerEvent("BigWigs_StartBar", self, L["berserk_bar"], 900, "Interface\\Icons\\INV_Shield_01")
243 self:ScheduleEvent("bwsapphberserk1", "BigWigs_Message", 300, L["berserk_warn_10min"], "Attention")
244 self:ScheduleEvent("bwsapphberserk2", "BigWigs_Message", 600, L["berserk_warn_5min"], "Attention")
245 self:ScheduleEvent("bwsapphberserk3", "BigWigs_Message", 840, string.format(L["berserk_warn_rest"], 60), "Urgent")
246 self:ScheduleEvent("bwsapphberserk4", "BigWigs_Message", 870, string.format(L["berserk_warn_rest"], 30), "Important")
247 self:ScheduleEvent("bwsapphberserk5", "BigWigs_Message", 890, string.format(L["berserk_warn_rest"], 10), "Important")
248 self:ScheduleEvent("bwsapphberserk6", "BigWigs_Message", 895, string.format(L["berserk_warn_rest"], 5), "Important")
249 end
250 if self.db.profile.deepbreath then
251 -- Lets start a repeated event after 5 seconds of combat so that
252 -- we're sure that the entire raid is in fact in combat when we
253 -- start it.
254 self:ScheduleEvent("besapphdelayed", self.StartTargetScanner, 5, self)
255 end
256 elseif sync == "SapphironLifeDrain" and self.db.profile.lifedrain then
257 self:TriggerEvent("BigWigs_Message", L["lifedrain_message"], "Urgent")
258 self:TriggerEvent("BigWigs_StartBar", self, L["lifedrain_bar"], 24, "Interface\\Icons\\Spell_Shadow_LifeDrain02")
259 elseif sync == "SapphironFlight" and self.db.profile.deepbreath and started then
260 if self:IsEventScheduled("bwsapphtargetscanner") then
261 self:CancelScheduledEvent("bwsapphtargetscanner")
262 end
263 if self:IsEventScheduled("bwsapphdelayed") then
264 self:CancelScheduledEvent("bwsapphdelayed")
265 end
266 self:TriggerEvent("BigWigs_Message", L["deepbreath_incoming_message"], "Urgent")
267 self:TriggerEvent("BigWigs_StartBar", self, L["deepbreath_incoming_bar"], 23, "Interface\\Icons\\Spell_Arcane_PortalIronForge")
268 lastTarget = nil
269 cachedUnitId = nil
270 self:ScheduleEvent("besapphdelayed", self.StartTargetScanner, 50, self)
271 end
272 end
273  
274 function BigWigsSapphiron:LifeDrain(msg)
275 if string.find(msg, L["lifedrain_trigger"]) or string.find(msg, L["lifedrain_trigger2"]) then
276 if not time or (time + 2) < GetTime() then
277 self:TriggerEvent("BigWigs_SendSync", "SapphironLifeDrain")
278 time = GetTime()
279 end
280 end
281 end
282  
283 function BigWigsSapphiron:CHAT_MSG_MONSTER_EMOTE(msg)
284 if msg == L["deepbreath_trigger"] then
285 if self.db.profile.deepbreath then
286 self:TriggerEvent("BigWigs_Message", L["deepbreath_warning"], "Important")
287 self:TriggerEvent("BigWigs_StartBar", self, L["deepbreath_bar"], 7, "Interface\\Icons\\Spell_Frost_FrostShock")
288 end
289 self:TriggerEvent("BigWigs_StopBar", self, L["lifedrain_bar"])
290 if self.db.profile.lifedrain then
291 self:TriggerEvent("BigWigs_StartBar", self, L["lifedrain_bar"], 14, "Interface\\Icons\\Spell_Shadow_LifeDrain02")
292 end
293 end
294 end
295  
296 ------------------------------
297 -- Target Scanning --
298 ------------------------------
299  
300 function BigWigsSapphiron:StartTargetScanner()
301 if self:IsEventScheduled("bwsapphtargetscanner") or not started then return end
302  
303 -- Start a repeating event that scans the raid for targets every 1 second.
304 self:ScheduleRepeatingEvent("bwsapphtargetscanner", self.RepeatedTargetScanner, 1, self)
305 end
306  
307 function BigWigsSapphiron:RepeatedTargetScanner()
308 if not UnitAffectingCombat("player") then
309 self:CancelScheduledEvent("bwsapphtargetscanner")
310 return
311 end
312  
313 if not started then return end
314 local found = nil
315  
316 -- If we have a cached unit (which we will if we found someone with the boss
317 -- as target), then check if he still has the same target
318 if cachedUnitId and UnitExists(cachedUnitId) and UnitName(cachedUnitId) == boss then
319 found = true
320 end
321  
322 -- Check the players target
323 if not found and UnitExists("target") and UnitName("target") == boss then
324 cachedUnitId = "target"
325 found = true
326 end
327  
328 -- Loop the raid roster
329 if not found then
330 for i = 1, GetNumRaidMembers() do
331 local unit = string.format("raid%dtarget", i)
332 if UnitExists(unit) and UnitName(unit) == boss then
333 cachedUnitId = unit
334 found = true
335 break
336 end
337 end
338 end
339  
340 -- We've checked everything. If nothing was found, just return home.
341 -- We basically shouldn't return here, because someone should always have
342 -- him targetted.
343 if not found then return end
344  
345 local inFlight = nil
346  
347 -- Alright, we've got a valid unitId with the boss as target, now check if
348 -- the boss had a target on the last iteration or not - if he didn't, and
349 -- still doesn't, then we fire the "in air" warning.
350 if not UnitExists(cachedUnitId.."target") then
351 -- Okay, the boss doesn't have a target.
352 if not lastTarget then
353 -- He didn't have a target last time either
354 inFlight = true
355 end
356 lastTarget = nil
357 else
358 -- This should always be set before we hit the time when he actually
359 -- loses his target, hence we can check |if not lastTarget| above.
360 lastTarget = true
361 end
362  
363 -- He's not flying, so we're just going to continue scanning.
364 if not inFlight then return end
365  
366 -- He's in flight! (I hope)
367 if self:IsEventScheduled("bwsapphtargetscanner") then
368 self:CancelScheduledEvent("bwsapphtargetscanner")
369 end
370 self:TriggerEvent("BigWigs_SendSync", "SapphironFlight")
371 end
372