------------------------------ -- Are you local? -- ------------------------------ local boss = AceLibrary("Babble-Boss-2.2")["Sapphiron"] local L = AceLibrary("AceLocale-2.2"):new("BigWigs"..boss) local time local cachedUnitId local lastTarget local started ---------------------------- -- Localization -- ---------------------------- L:RegisterTranslations("enUS", function() return { cmd = "Sapphiron", deepbreath_cmd = "deepbreath", deepbreath_name = "Deep Breath alert", deepbreath_desc = "Warn when Sapphiron begins to cast Deep Breath.", lifedrain_cmd = "lifedrain", lifedrain_name = "Life Drain", lifedrain_desc = "Warns about the Life Drain curse.", berserk_cmd = "berserk", berserk_name = "Berserk", berserk_desc = "Warn for berserk.", berserk_bar = "Berserk", berserk_warn_10min = "10min to berserk!", berserk_warn_5min = "5min to berserk!", berserk_warn_rest = "%s sec to berserk!", engage_message = "Sapphiron engaged! Berserk in 15min!", lifedrain_message = "Life Drain! Possibly new one ~24sec!", lifedrain_warn1 = "Life Drain in 5sec!", lifedrain_bar = "Life Drain", lifedrain_trigger = "afflicted by Life Drain", lifedrain_trigger2 = "Life Drain was resisted by", deepbreath_incoming_message = "Ice Bomb casting in ~23sec!", deepbreath_incoming_soon_message = "Ice Bomb casting in ~5sec!", deepbreath_incoming_bar = "Ice Bomb Cast", deepbreath_trigger = "%s takes in a deep breath...", deepbreath_warning = "Ice Bomb Incoming!", deepbreath_bar = "Ice Bomb Lands!", } end ) L:RegisterTranslations("koKR", function() return { deepbreath_name = "딥브레스 경고", deepbreath_desc = "사피론 딥 브레스 시전 시 경고.", lifedrain_name = "생명력 흡수", lifedrain_desc = "생명력 흡수 저주에 대한 경고.", lifedrain_message = "생명력 흡수! 새로운 생명력 흡수 ~24초!", lifedrain_warn1 = "5초간 생명력 흡수!", lifedrain_bar = "생명력 흡수", berserk_name = "광폭화", berserk_desc = "광폭화에 대한 경고.", berserk_bar = "광폭화", berserk_warn_10min = "10분 후 광폭화!", berserk_warn_5min = "5분 후 광폭화!", berserk_warn_rest = "%s초 후 광폭화!", engage_message = "사피론 전투 개시! 광폭화 까지 15분!", lifedrain_trigger = "생명력 흡수에 걸렸습니다.", lifedrain_trigger2 = "생명력 흡수|1으로;로; (.+)|1을;를; 공격했지만 저항했습니다.", deepbreath_incoming_message = "얼음 폭탄 시전 - 약 25초 후!", deepbreath_incoming_soon_message = "얼음 폭탄 시전 - 약 5초 후!", deepbreath_incoming_bar = "얼음 폭탄 시전", deepbreath_trigger = "%s|1이;가; 숨을 깊게 들이쉽니다.", deepbreath_warning = "얼음 폭탄 다가옴!", deepbreath_bar = "얼음 폭탄 떨어짐!", } end ) L:RegisterTranslations("deDE", function() return { deepbreath_name = "Frostatem Warnung", deepbreath_desc = "Warnt, wenn Saphiron Frostatem zaubert.", lifedrain_name = "Lebenssauger", lifedrain_desc = "Warnt vor dem Lebenssauger Fluch.", berserk_name = "Berserker", berserk_desc = "Warnt vor Berserker.", berserk_bar = "Berserker", berserk_warn_10min = "10min bis Berserker!", berserk_warn_5min = "5min bis Berserker!", berserk_warn_rest = "%s sek bis Berserker!", engage_message = "Sapphiron angegriffen! Berserker in 15min!", lifedrain_message = "Lebenssauger! N\195\164chster in ~24sek!", lifedrain_warn1 = "Lebenssauger in 5sek!", lifedrain_bar = "Lebenssauger", lifedrain_trigger = "von Lebenssauger betroffen", lifedrain_trigger2 = "Lebenssauger wurde von .+ widerstanden", deepbreath_incoming_message = "Frostatem in ~23sek!", deepbreath_incoming_soon_message = "Frostatem in ~5sek!", deepbreath_incoming_bar = "Frostatem", deepbreath_trigger = "%s atmet tief ein...", deepbreath_warning = "Frostatem kommt!", deepbreath_bar = "Frostatem!", } end ) L:RegisterTranslations("zhCN", function() return { deepbreath_name = "深呼吸警报", deepbreath_desc = "萨菲隆开始施放深呼吸时发出警报", lifedrain_name = "生命吸取警报", lifedrain_desc = "生命吸取诅咒时候发出警报", berserk_name = "狂暴警报", berserk_desc = "狂暴警报", berserk_bar = "狂暴", berserk_warn_10min = "10分钟后狂暴!", berserk_warn_5min = "5分钟后狂暴!", berserk_warn_rest = "%s秒后狂暴!", engage_message = "萨菲隆激活!15分钟后进入狂暴状态!", lifedrain_message = "生命吸取,~24秒后再次施放!", lifedrain_warn1 = "5秒后生命吸取!", lifedrain_bar = "生命吸取", lifedrain_trigger = "受到了生命吸取效果的影响", lifedrain_trigger2 = "生命吸取被抵抗", -- need confirm deepbreath_incoming_message = "寒冰炸弹~23秒后施放!", deepbreath_incoming_soon_message = "寒冰炸弹~5秒后施放!", deepbreath_incoming_bar = "寒冰炸弹", deepbreath_trigger = "%s深深地吸了一口气……", deepbreath_warning = "寒冰炸弹即将着地!", deepbreath_bar = "寒冰炸弹着地!", } end ) L:RegisterTranslations("zhTW", function() return { --Sapphiron 薩菲隆 deepbreath_name = "深呼吸警報", deepbreath_desc = "薩菲隆開始施放深呼吸時發出警報", lifedrain_name = "生命吸取警報", lifedrain_desc = "生命吸取詛咒時候發出警報", berserk_name = "狂暴警報", berserk_desc = "狂暴警報", berserk_bar = "狂暴", berserk_warn_10min = "10分鐘後狂暴!", berserk_warn_5min = "5分鐘後狂暴!", berserk_warn_rest = "%s秒後狂暴!", engage_message = "薩菲隆進入戰鬥 - 15 分鐘後進入狂暴狀態!", lifedrain_message = "生命吸取 24 秒後再次施放!", lifedrain_warn1 = "5 秒後生命吸取!", lifedrain_bar = "生命吸取", lifedrain_trigger = "受到了生命吸取效果的影響", lifedrain_trigger2 = "生命吸取被抵抗", -- need confirm deepbreath_incoming_message = "寒冰炸彈23 秒後施放!", deepbreath_incoming_soon_message = "寒冰炸彈 5 秒後施放!", deepbreath_incoming_bar = "寒冰炸彈", deepbreath_trigger = "%s深深地吸了一口氣……", deepbreath_warning = "寒冰炸彈即將著地!", deepbreath_bar = "寒冰炸彈", } end ) ---------------------------------- -- Module Declaration -- ---------------------------------- BigWigsSapphiron = BigWigs:NewModule(boss) BigWigsSapphiron.zonename = AceLibrary("Babble-Zone-2.2")["Naxxramas"] BigWigsSapphiron.enabletrigger = boss BigWigsSapphiron.toggleoptions = { "berserk", "lifedrain", "deepbreath", "bosskill" } BigWigsSapphiron.revision = tonumber(string.sub("$Revision: 17540 $", 12, -3)) ------------------------------ -- Initialization -- ------------------------------ function BigWigsSapphiron:OnEnable() time = nil cachedUnitId = nil lastTarget = nil started = nil if self:IsEventScheduled("bwsapphtargetscanner") then self:CancelScheduledEvent("bwsapphtargetscanner") end if self:IsEventScheduled("bwsapphdelayed") then self:CancelScheduledEvent("bwsapphdelayed") end self:RegisterEvent("CHAT_MSG_MONSTER_EMOTE") self:RegisterEvent("PLAYER_REGEN_ENABLED", "CheckForWipe") self:RegisterEvent("PLAYER_REGEN_DISABLED", "CheckForEngage") self:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE", "LifeDrain") self:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE", "LifeDrain") self:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE", "LifeDrain") self:RegisterEvent("CHAT_MSG_COMBAT_HOSTILE_DEATH", "GenericBossDeath") self:RegisterEvent("BigWigs_RecvSync") self:TriggerEvent("BigWigs_ThrottleSync", "SapphironLifeDrain", 4) self:TriggerEvent("BigWigs_ThrottleSync", "SapphironFlight", 5) end ------------------------------ -- Event Handlers -- ------------------------------ function BigWigsSapphiron:BigWigs_RecvSync( sync, rest, nick ) if sync == self:GetEngageSync() and rest and rest == boss and not started then started = true if self:IsEventRegistered("PLAYER_REGEN_DISABLED") then self:UnregisterEvent("PLAYER_REGEN_DISABLED") end if self:IsEventScheduled("bwsapphtargetscanner") then self:CancelScheduledEvent("bwsapphtargetscanner") end if self:IsEventScheduled("bwsapphdelayed") then self:CancelScheduledEvent("bwsapphdelayed") end if self.db.profile.berserk then self:TriggerEvent("BigWigs_Message", L["engage_message"], "Attention") self:TriggerEvent("BigWigs_StartBar", self, L["berserk_bar"], 900, "Interface\\Icons\\INV_Shield_01") self:ScheduleEvent("bwsapphberserk1", "BigWigs_Message", 300, L["berserk_warn_10min"], "Attention") self:ScheduleEvent("bwsapphberserk2", "BigWigs_Message", 600, L["berserk_warn_5min"], "Attention") self:ScheduleEvent("bwsapphberserk3", "BigWigs_Message", 840, string.format(L["berserk_warn_rest"], 60), "Urgent") self:ScheduleEvent("bwsapphberserk4", "BigWigs_Message", 870, string.format(L["berserk_warn_rest"], 30), "Important") self:ScheduleEvent("bwsapphberserk5", "BigWigs_Message", 890, string.format(L["berserk_warn_rest"], 10), "Important") self:ScheduleEvent("bwsapphberserk6", "BigWigs_Message", 895, string.format(L["berserk_warn_rest"], 5), "Important") end if self.db.profile.deepbreath then -- Lets start a repeated event after 5 seconds of combat so that -- we're sure that the entire raid is in fact in combat when we -- start it. self:ScheduleEvent("besapphdelayed", self.StartTargetScanner, 5, self) end elseif sync == "SapphironLifeDrain" and self.db.profile.lifedrain then self:TriggerEvent("BigWigs_Message", L["lifedrain_message"], "Urgent") self:TriggerEvent("BigWigs_StartBar", self, L["lifedrain_bar"], 24, "Interface\\Icons\\Spell_Shadow_LifeDrain02") elseif sync == "SapphironFlight" and self.db.profile.deepbreath and started then if self:IsEventScheduled("bwsapphtargetscanner") then self:CancelScheduledEvent("bwsapphtargetscanner") end if self:IsEventScheduled("bwsapphdelayed") then self:CancelScheduledEvent("bwsapphdelayed") end self:TriggerEvent("BigWigs_Message", L["deepbreath_incoming_message"], "Urgent") self:TriggerEvent("BigWigs_StartBar", self, L["deepbreath_incoming_bar"], 23, "Interface\\Icons\\Spell_Arcane_PortalIronForge") lastTarget = nil cachedUnitId = nil self:ScheduleEvent("besapphdelayed", self.StartTargetScanner, 50, self) end end function BigWigsSapphiron:LifeDrain(msg) if string.find(msg, L["lifedrain_trigger"]) or string.find(msg, L["lifedrain_trigger2"]) then if not time or (time + 2) < GetTime() then self:TriggerEvent("BigWigs_SendSync", "SapphironLifeDrain") time = GetTime() end end end function BigWigsSapphiron:CHAT_MSG_MONSTER_EMOTE(msg) if msg == L["deepbreath_trigger"] then if self.db.profile.deepbreath then self:TriggerEvent("BigWigs_Message", L["deepbreath_warning"], "Important") self:TriggerEvent("BigWigs_StartBar", self, L["deepbreath_bar"], 7, "Interface\\Icons\\Spell_Frost_FrostShock") end self:TriggerEvent("BigWigs_StopBar", self, L["lifedrain_bar"]) if self.db.profile.lifedrain then self:TriggerEvent("BigWigs_StartBar", self, L["lifedrain_bar"], 14, "Interface\\Icons\\Spell_Shadow_LifeDrain02") end end end ------------------------------ -- Target Scanning -- ------------------------------ function BigWigsSapphiron:StartTargetScanner() if self:IsEventScheduled("bwsapphtargetscanner") or not started then return end -- Start a repeating event that scans the raid for targets every 1 second. self:ScheduleRepeatingEvent("bwsapphtargetscanner", self.RepeatedTargetScanner, 1, self) end function BigWigsSapphiron:RepeatedTargetScanner() if not UnitAffectingCombat("player") then self:CancelScheduledEvent("bwsapphtargetscanner") return end if not started then return end local found = nil -- If we have a cached unit (which we will if we found someone with the boss -- as target), then check if he still has the same target if cachedUnitId and UnitExists(cachedUnitId) and UnitName(cachedUnitId) == boss then found = true end -- Check the players target if not found and UnitExists("target") and UnitName("target") == boss then cachedUnitId = "target" found = true end -- Loop the raid roster if not found then for i = 1, GetNumRaidMembers() do local unit = string.format("raid%dtarget", i) if UnitExists(unit) and UnitName(unit) == boss then cachedUnitId = unit found = true break end end end -- We've checked everything. If nothing was found, just return home. -- We basically shouldn't return here, because someone should always have -- him targetted. if not found then return end local inFlight = nil -- Alright, we've got a valid unitId with the boss as target, now check if -- the boss had a target on the last iteration or not - if he didn't, and -- still doesn't, then we fire the "in air" warning. if not UnitExists(cachedUnitId.."target") then -- Okay, the boss doesn't have a target. if not lastTarget then -- He didn't have a target last time either inFlight = true end lastTarget = nil else -- This should always be set before we hit the time when he actually -- loses his target, hence we can check |if not lastTarget| above. lastTarget = true end -- He's not flying, so we're just going to continue scanning. if not inFlight then return end -- He's in flight! (I hope) if self:IsEventScheduled("bwsapphtargetscanner") then self:CancelScheduledEvent("bwsapphtargetscanner") end self:TriggerEvent("BigWigs_SendSync", "SapphironFlight") end