vanilla-wow-addons – Blame information for rev 1
?pathlinks?
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 |