-------------------------------------------------------------------------------- -- Module Declaration -- local mod, CL = BigWigs:NewBoss("The Jailer", 2481, 2464) if not mod then return end mod:RegisterEnableMob(180990) -- The Jailer mod:SetEncounterID(2537) mod:SetRespawnTime(30) -------------------------------------------------------------------------------- -- Locals -- local relentlessDominationCount = 1 local chainsOfOppressionCount = 1 local martyrdomCount = 1 local tormentCount = 1 local runeOfDamnationCount = 1 local unholyAttunementCount = 1 local shatteringBlastCount = 1 local runeOfCompulsion = 1 local decimatorCount = 1 local desolationCount = 1 local runeOfDominationCount = 1 local chainsOfAnguishCount = 1 local defileCount = 1 local fallingDebrisCount = 1 local currentAzerothHealth = 100 local lastAzerothHealth = 100 local worldCount = 1 local specialCount = 1 local specialTimer = nil local meteorCleaveCount = 1 -------------------------------------------------------------------------------- -- Timers -- local timersNormal = { [1] = { [365436] = {21.9, 51, 69, 0}, -- Torment [363893] = {40, 40, 40, 40, 0}, -- Martyrdom [362028] = {48, 60, 60, 0}, -- Relenting Domination [359809] = {90, 0}, -- Chains of Oppression [360281] = {11, 19, 34, 33.0, 28, 26.0, 0}, -- Rune of Damnation }, [2] = { [365436] = {42, 50.0, 55.0, 45.0}, -- Torment [360562] = {27.9, 57.5, 47.5, 43.0}, -- Decimator [360373] = {18.9, 45, 45, 45, 42.5, 0}, -- Unholy Attunement [359856] = {34.5, 13.4, 30, 15, 30.9, 15.5, 28.4, 15.9}, -- Shattering Blast [366285] = {61.9, 60, 60}, -- Rune of Compulsion }, [3] = { [365436] = {26, 86.9}, -- Torment [360562] = {34.9, 52, 41.9, 41.9}, -- Decimator [365033] = {41.9, 60, 60}, -- Desolation [365150] = {63, 83.9}, -- Rune of Domination [365212] = {51.9, 41.9, 41.9, 41.9}, -- Chains of Anguish [365169] = {55, 40.9, 43, 42.9}, -- Defile }, } local timersHeroic = { [1] = { [365436] = {11.0, 52.0, 45.0, 47.0, 0}, -- Torment [363893] = {31.0, 40.0, 52.0, 39.0, 0}, -- Martyrdom [362028] = {55.0, 57.0, 56.0, 0}, -- Relenting Domination [359809] = {40.0, 48.0, 49.0, 0}, -- Chains of Oppression [360281] = {22.0, 25.0, 29.0, 21.0, 30.5, 19.5, 0}, -- Rune of Damnation }, [2] = { [365436] = {22, 16.0, 35.5, 61.5, 29, 30, 0}, -- Torment [360562] = {26, 41.0, 35, 45, 41, 0}, -- Decimator [360373] = {19, 45.0, 45.0, 46, 41.9, 0}, -- Unholy Attunement [359856] = {33.0, 16.0, 30.0, 15.0, 29.0, 17.0, 29.0, 14.0, 0}, -- Shattering Blast [366285] = {41.0, 46.0, 45.0, 47, 0}, -- Rune of Compulsion }, [3] = { [365436] = {51, 75}, -- Torment [360562] = {26, 38, 47, 33, 40}, -- Decimator [365033] = {42, 60, 64}, -- Desolation [365150] = {71, 79}, -- Rune of Domination [365212] = {37, 55, 43, 43}, -- Chains of Anguish [365169] = {33, 45, 45, 52}, -- Defile }, } local timersMythic = { [1] = { [365436] = {8.0, 42.0, 40.0, 32.0, 44.0, 0}, -- Torment [363893] = {30.0, 47.0, 31.0, 43.0}, -- Martyrdom [362028] = {44.0, 54.0, 70, 0}, -- Relenting Domination [359809] = {16.0, 111.0, 0}, -- Chains of Oppression [360281] = {35.0, 23.0, 26.0, 29.0, 27.0, 18.0, 0}, -- Rune of Damnation -- Heals are in mythicSpecialTimers }, [2] = { [365436] = {33.0, 38.0, 35.0, 25.0, 32.0, 26.0}, -- Torment [360562] = {57.0, 42.5, 33.5, 41.0}, -- Decimator [360373] = {19.0, 45.0, 45.0, 45.0, 42.0}, -- Unholy Attunement [359856] = {35.0, 14.0, 30.0, 15.0, 26.0, 22.0, 26.0, 14.0}, -- Shattering Blast [366285] = {27.0, 50, 50.0, 61.0}, -- Rune of Compulsion -- Heals are in mythicSpecialTimers }, [3] = { [365436] = {58.0, 110.0, 0}, -- Torment [360562] = {28.0, 44.0, 39.0, 36.0, 0}, -- Decimator [365033] = {39.0, 82.0, 0}, -- Desolation [365150] = {85.0, 57.0, 0}, -- Rune of Domination [365212] = {36.0, 47.0, 47.5, 40.5, 0}, -- Chains of Anguish [365169] = {55.0, 24.0, 39.0, 40, 0}, -- Defile -- Heals are in mythicSpecialTimers }, [4] = { [360281] = {14.5, 28.5, 43.0}, -- Rune of Damnation [360378] = {20.0, 61.0, 44.0}, -- Meteor Cleave [368591] = {12.5}, -- Death Sentence [360562] = {25.0, 31.0, 48.0}, -- Decimator [365436] = {50.0, 24.0, 38.0}, -- Torment -- Dispels are in mythicSpecialTimers }, } local timersLFR = { [1] = { [365436] = {21.9, 51, 69, 0}, -- Torment [363893] = {40, 40, 40, 40, 0}, -- Martyrdom [362028] = {48, 60, 60, 0}, -- Relenting Domination [359809] = {90, 0}, -- Chains of Oppression [360281] = {11, 19, 34, 33.0, 28, 26.0, 0}, -- Rune of Damnation }, [2] = { [365436] = {37.0, 59.0, 18.0, 39.0, 39.0, 0}, -- Torment [360562] = {23.0, 65.0, 39.0, 50.0, 0}, -- Decimator [360373] = {196.7, 0}, -- Unholy Attunement [359856] = {30.0, 22.0, 22.0, 28.0, 18.0, 20.0, 22.0, 22.0, 0}, -- Shattering Blast [366285] = {59.0, 48.1, 61.9, 0}, -- Rune of Compulsion }, [3] = { -- from a 15:25 kill (6:15 P3) with a few extra extrapolated times [365436] = {46.0, 42.0, 32.0, 10.0}, -- Torment (first sequence is 26, 50, 32, 10; then this repeats) [360562] = {35.0, 52.0, 42.0, 42.0, 45.0, 42.0, 42.0, 46.0, 42.0, 42.0, 46.0, 42.0, 42.0, 46.0}, -- Decimator [365150] = {63.0, 84.0, 45.0, 84.0, 46.0, 84.0, 46.0, 84.0, 46.0, 84.0}, -- Rune of Domination [365212] = {52.0, 42.0, 42.0, 42.0, 45.0, 42.0, 42.0, 46.0, 42.0, 42.0, 46.0, 42.0, 42.0, 46.0}, -- Chains of Anguish [365169] = {47.0, 36.0, 31.0, 43.0, 55.0, 31.0, 37.0, 62.0, 31.0, 37.0, 62.0, 31.0, 37.0, 62.0}, -- Defile }, } local timerTable = { [14] = timersNormal, [15] = timersHeroic, [16] = timersMythic, [17] = timersLFR, } local timers local mythicSpecialTimers = { -- pull/0:00 -> 0:25 -> 1:11 -> 1:43 -> 2:17 [1] = {25.0, 46.0, 32.0, 34.0}, -- stage2/2:47 -> 3:40.5 -> 4:22 -> 5:15 -> 5:49 [2] = {48.5, 46.5, 53, 34}, -- stage3/6:15 -> 7:00.5 -> 7:21 -> 7:54.5 (2x lines) -> 8:33 [3] = {45.5, 20.5, 33.5, 38.5}, -- Dispel Timers in last stage, from Heal Channel Start (_SUCCES) [4] = {40, 30, 29} } -------------------------------------------------------------------------------- -- Localization -- local L = mod:GetLocale() if L then L.rune_of_damnation_countdown = "Countdown" L.rune_of_damnation_countdown_icon = 360281 -- Rune of Damnation L.rune_of_damnation_countdown_desc = "Countdown for the players who are affected by Rune of Damnation" L.jump = "Jump In" L.relentless_domination = "Domination" L.chains_of_oppression = "Pull Chains" L.unholy_attunement = "Pylons" L.shattering_blast = "Tank Blast" L.rune_of_compulsion = "Charms" L.desolation = "Azeroth Soak" L.chains_of_anguish = "Spread Chains" L.chain = "Chain" L.chain_target = "Chaining %s!" L.chains_remaining = "%d/%d Chains Broken" L.rune_of_domination = "Group Soaks" L.final = "Final %s" L.azeroth_health = "Azeroth Health" L.azeroth_health_desc = "Azeroth Health Warnings" L.azeroth_new_health_plus = "Azeroth Health: +%.1f%% (%d)" L.azeroth_new_health_minus = "Azeroth Health: -%.1f%% (%d)" L.mythic_blood_soak_stage_1 = "Stage 1 Blood Soak timings" L.mythic_blood_soak_stage_1_desc = "Show a bar for timings when healing azeroth is at a good time, used by Echo on their first kill" L.mythic_blood_soak_stage_2 = "Stage 2 Blood Soak timings" L.mythic_blood_soak_stage_2_desc = L.mythic_blood_soak_stage_1_desc L.mythic_blood_soak_stage_3 = "Stage 3 Blood Soak timings" L.mythic_blood_soak_stage_3_desc = L.mythic_blood_soak_stage_1_desc L.mythic_blood_soak_bar = "Heal Azeroth" L.mythic_blood_soak_icon = "spell_azerite_essence10" L.floors_open = "Floors Open" L.floors_open_desc = "Time until the floors opens up and you can fall into opened holes." L.mythic_dispel_stage_4 = "Dispel Timers" L.mythic_dispel_stage_4_desc = "Timers for when to do dispels in the last stage, used by Echo on their first kill" L.mythic_dispel_bar = "Dispels" L.mythic_dispel_icon = "spell_holy_dispelmagic" end -------------------------------------------------------------------------------- -- Initialization -- local runeOfDamnationMarker = mod:AddMarkerOption(false, "player", 1, 360281, 1, 2, 3, 4, 5, 6) -- Rune of Damnation local runeOfCompulsionMarker = mod:AddMarkerOption(false, "player", 1, 366285, 1, 2, 3, 4) -- Rune of Compulsion local runeOfDominationMarker = mod:AddMarkerOption(false, "player", 1, 365150, 1, 2, 3) -- Rune of Domination local chainsOfAnguishMarker = mod:AddMarkerOption(false, "player", 8, 365212, 8, 7, 6, 5) -- Chains of Anguish function mod:GetOptions() return { "stages", "azeroth_health", 362012, -- Eternity's End "floors_open", -- Stage One: Origin of Domination 362028, -- Relentless Domination 362075, -- Domination 366132, -- Tyranny 359809, -- Chains of Oppression {363893, "SAY", "SAY_COUNTDOWN"}, -- Martyrdom {366545, "TANK"}, -- Persecution 365436, -- Torment {360281, "SAY", "SAY_COUNTDOWN", "ME_ONLY"}, -- Rune of Damnation {"rune_of_damnation_countdown", "COUNTDOWN"}, runeOfDamnationMarker, -- Stage Two: Unholy Attunement 360373, -- Unholy Attunement 363332, -- Unbreakable Grasp 359856, -- Shattering Blast {366285, "SAY", "SAY_COUNTDOWN"}, -- Rune of Compulsion runeOfCompulsionMarker, 360562, -- Decimator -- Stage Three: Eternity's End 365033, -- Desolation {365150, "SAY", "SAY_COUNTDOWN"}, -- Rune of Domination runeOfDominationMarker, 365212, -- Chains of Anguish chainsOfAnguishMarker, 365169, -- Defile -- Mythic "mythic_blood_soak_stage_1", "mythic_blood_soak_stage_2", "mythic_blood_soak_stage_3", 366374, -- World Crusher 366678, -- World Cracker 367051, -- World Shatterer "mythic_dispel_stage_4", 368383, -- Diverted Life Shield 360378, -- Meteor Cleave {368591, "SAY", "SAY_COUNTDOWN"}, -- Death Sentence },{ ["stages"] = "general", [362028] = -24087, -- Stage One: Origin of Domination [360373] = -23925, -- Stage Two: Unholy Attunement [365033] = -24252, -- Stage Three: Eternity's End ["mythic_blood_soak_stage_1"] = "mythic", -- Stage Three: Eternity's End },{ [362028] = L.relentless_domination, -- Relentless Domination [359809] = L.chains_of_oppression, -- Chains of Oppression [363893] = CL.tank_combo, -- Martyrdom [360281] = CL.bombs, -- Rune of Damnation [360373] = L.unholy_attunement, -- Unholy Attunement [359856] = L.shattering_blast, -- Shattering Blast [366285] = L.rune_of_compulsion, -- Rune of Compulsion [360562] = CL.knockback, -- Decimator [365033] = L.desolation, -- Desolation [365150] = L.rune_of_domination, -- Rune of Domination [365212] = L.chains_of_anguish, -- Chains of Anguish ["mythic_blood_soak_stage_1"] = L.mythic_blood_soak_bar, -- Heal Azeroth ["mythic_blood_soak_stage_2"] = L.mythic_blood_soak_bar, -- Heal Azeroth ["mythic_blood_soak_stage_3"] = L.mythic_blood_soak_bar, -- Heal Azeroth } end function mod:OnBossEnable() self:RegisterWidgetEvent(3554, "AzerothHealthWidget") -- Stage One: Origin of Domination self:Log("SPELL_CAST_START", "RelentlessDomination", 362028) self:Log("SPELL_AURA_APPLIED", "DominationApplied", 362075) self:Log("SPELL_AURA_APPLIED", "TyrannyApplied", 366132) self:Log("SPELL_CAST_SUCCESS", "ChainsOfOppression", 359809) self:Log("SPELL_AURA_APPLIED", "MartyrdomApplied", 363893) self:Log("SPELL_AURA_APPLIED", "PersecutionApplied", 366545) self:Log("SPELL_CAST_SUCCESS", "Torment", 365436, 370071) -- p1/p2, p3 (+adds) self:Log("SPELL_AURA_APPLIED", "TormentApplied", 362401) self:Log("SPELL_CAST_SUCCESS", "RuneOfDamnation", 360279) self:Log("SPELL_AURA_APPLIED", "RuneOfDamnationApplied", 360281) self:Log("SPELL_AURA_REMOVED", "RuneOfDamnationRemoved", 360281) -- Stage Two: Unholy Attunement self:Log("SPELL_CAST_START", "FinalRelentlessDomination", 367851) self:Log("SPELL_CAST_START", "UnholyAttunement", 360373) self:Log("SPELL_CAST_START", "ShatteringBlast", 359856) self:Log("SPELL_CAST_SUCCESS", "RuneOfCompulsion", 366284) self:Log("SPELL_AURA_APPLIED", "RuneOfCompulsionApplied", 366285) self:Log("SPELL_AURA_REMOVED", "RuneOfCompulsionRemoved", 366285) self:Log("SPELL_CAST_START", "Decimator", 360562, 364942, 364488) -- 3 different types based on distance? self:Log("SPELL_CAST_START", "FinalUnholyAttunement", 367290) -- Stage Three: Eternity's End self:Log("SPELL_CAST_SUCCESS", "UnbreakingGrasp", 363332) self:Log("SPELL_CAST_START", "Desolation", 365033) self:Log("SPELL_CAST_SUCCESS", "RuneOfDomination", 365147) self:Log("SPELL_AURA_APPLIED", "RuneOfDominationApplied", 365150) self:Log("SPELL_AURA_REMOVED", "RuneOfDominationRemoved", 365150) self:Log("SPELL_CAST_START", "ChainsOfAnguish", 365212) self:Log("SPELL_AURA_APPLIED", "ChainsOfAnguishApplied", 365222) -- 365219 Initial Target, 365222 Secondary Targets self:Log("SPELL_AURA_REMOVED", "ChainsOfAnguishRemoved", 365222) self:Log("SPELL_CAST_START", "Defile", 365169) self:Log("SPELL_CAST_START", "EternitysEnd", 362012) -- Mythic self:Log("SPELL_CAST_START", "WorldCrusher", 366374) self:Log("SPELL_CAST_START", "WorldCracker", 366678) self:Log("SPELL_CAST_SUCCESS", "WorldShatterer", 367051) -- -- Stage 4 self:Log("SPELL_CAST_SUCCESS", "DivertedLifeShield", 368383) self:Log("SPELL_CAST_START", "MeteorCleave", 360378) self:Log("SPELL_CAST_SUCCESS", "DeathSentence", 363772) -- Initial Debuff self:Log("SPELL_AURA_APPLIED", "DeathSentenceApplied", 368591) self:Log("SPELL_AURA_REMOVED", "DeathSentenceRemoved", 368591) timers = timerTable[mod:Difficulty()] -- make sure something is set, but you're screwed if you reload regardless end function mod:OnEngage(difficulty) timers = timerTable[difficulty] self:SetStage(1) currentAzerothHealth = 100 lastAzerothHealth = 100 -- Stage 1 relentlessDominationCount = 1 chainsOfOppressionCount = 1 martyrdomCount = 1 tormentCount = 1 runeOfDamnationCount = 1 -- Stage 2 unholyAttunementCount = 1 shatteringBlastCount = 1 runeOfCompulsion = 1 decimatorCount = 1 -- Stage 3 desolationCount = 1 runeOfDominationCount = 1 chainsOfAnguishCount = 1 defileCount = 1 fallingDebrisCount = 1 self:Bar(360281, timers[1][360281][runeOfDamnationCount], CL.count:format(CL.bombs, runeOfDamnationCount)) self:Bar(365436, timers[1][365436][tormentCount], CL.count:format(self:SpellName(365436), tormentCount)) self:Bar(363893, timers[1][363893][martyrdomCount], CL.count:format(CL.tank_combo, martyrdomCount)) self:Bar(362028, timers[1][362028][relentlessDominationCount], CL.count:format(L.relentless_domination, relentlessDominationCount)) self:Bar(359809, timers[1][359809][chainsOfOppressionCount], CL.count:format(L.chains_of_oppression, chainsOfOppressionCount)) self:Bar("stages", 180, CL.stage:format(2), 360373) -- Unholy Attunement if self:Mythic() then worldCount = 1 specialCount = 1 self:Bar(366374, 3) -- World Crusher self:StartSpecialTimer(mythicSpecialTimers[1][specialCount]) -- Heal Azeroth end end -------------------------------------------------------------------------------- -- Event Handlers -- do local scheduled = nil function mod:AzerothHealthMessage() if currentAzerothHealth > lastAzerothHealth and (currentAzerothHealth - lastAzerothHealth) > 3 then local change = currentAzerothHealth - lastAzerothHealth mod:Message("azeroth_health", "green", L.azeroth_new_health_plus:format(change, currentAzerothHealth), "inv_heartofazeroth") elseif currentAzerothHealth ~= lastAzerothHealth and (lastAzerothHealth - currentAzerothHealth) > 3 then -- only if changed local change = lastAzerothHealth - currentAzerothHealth mod:Message("azeroth_health", "red", L.azeroth_new_health_minus:format(change, currentAzerothHealth), "inv_heartofazeroth") end lastAzerothHealth = currentAzerothHealth scheduled = nil end function mod:AzerothHealthWidget(_, value) self:CancelTimer(scheduled) scheduled = self:ScheduleTimer("AzerothHealthMessage", 1.5) currentAzerothHealth = value end end function mod:EternitysEnd(args) self:Message(args.spellId, "red") self:PlaySound(args.spellId, "long") end -- Stage One: Origin of Domination function mod:RelentlessDomination(args) self:StopBar(CL.count:format(L.relentless_domination, relentlessDominationCount)) self:Message(args.spellId, "red", CL.count:format(L.relentless_domination, relentlessDominationCount)) self:PlaySound(args.spellId, "warning") relentlessDominationCount = relentlessDominationCount + 1 self:Bar(args.spellId, timers[1][args.spellId][relentlessDominationCount], relentlessDominationCount == 3 and L.final:format(CL.count:format(L.relentless_domination, relentlessDominationCount)) or CL.count:format(L.relentless_domination, relentlessDominationCount)) if not self:Easy() then self:Bar(366132, 11.1) -- Tyranny end end do local prev = 0 local playerList = {} function mod:DominationApplied(args) local t = args.time if t-prev > 2 then prev = t playerList = {} end playerList[#playerList+1] = args.destName if self:Me(args.destGUID) then self:PlaySound(args.spellId, "warning") end self:NewTargetsMessage(args.spellId, "red", playerList) end end do local prev = 0 function mod:TyrannyApplied(args) -- XXX this is the hit debuff, doesn't seem like there is a way to get targets local t = args.time if t-prev > 2 then prev = t self:StopBar(args.spellId) end if self:Me(args.destGUID) then self:PersonalMessage(args.spellId) self:PlaySound(args.spellId, "alarm") end end end function mod:ChainsOfOppression(args) self:StopBar(CL.count:format(L.chains_of_oppression, chainsOfOppressionCount)) self:Message(args.spellId, "yellow", CL.count:format(L.chains_of_oppression, chainsOfOppressionCount)) self:CastBar(args.spellId, 6, CL.explosion) self:PlaySound(args.spellId, "long") chainsOfOppressionCount = chainsOfOppressionCount + 1 self:Bar(args.spellId, timers[1][args.spellId][chainsOfOppressionCount], CL.count:format(L.chains_of_oppression, chainsOfOppressionCount)) end function mod:MartyrdomApplied(args) self:StopBar(CL.count:format(CL.tank_combo, martyrdomCount)) if self:Me(args.destGUID) then self:Yell(args.spellId, CL.tank_combo) self:YellCountdown(args.spellId, 3.5, nil, 2) end self:TargetMessage(args.spellId, "purple", args.destName, CL.count:format(CL.tank_combo, martyrdomCount)) self:PlaySound(args.spellId, "alarm") martyrdomCount = martyrdomCount + 1 self:Bar(args.spellId, timers[1][args.spellId][martyrdomCount], CL.count:format(CL.tank_combo, martyrdomCount)) end function mod:PersecutionApplied(args) self:TargetMessage(args.spellId, "purple", args.destName) self:PlaySound(args.spellId, "warning") end function mod:Torment(args) self:StopBar(CL.count:format(args.spellName, tormentCount)) self:Message(365436, "yellow", CL.count:format(args.spellName, tormentCount)) tormentCount = tormentCount + 1 if self:LFR() and self:GetStage() == 3 then -- four cast cycle with the first two being different local cd = timers[3][365436][(tormentCount - 1) % 4 + 1] if tormentCount == 2 then cd = 50.0 end self:Bar(365436, cd, CL.count:format(args.spellName, tormentCount)) else self:Bar(365436, timers[self:GetStage()][365436][tormentCount], CL.count:format(args.spellName, tormentCount)) end end function mod:TormentApplied(args) if self:Me(args.destGUID) then self:PlaySound(365436, "warning") --self:Say(365436) -- Everyone Gets it, no need I guess --self:SayCountdown(365436, 5) end end do local playerList = {} function mod:RuneOfDamnation(args) self:StopBar(CL.count:format(CL.bombs, runeOfDamnationCount)) runeOfDamnationCount = runeOfDamnationCount + 1 self:Bar(360281, timers[self:GetStage()][360281][runeOfDamnationCount], CL.count:format(CL.bombs, runeOfDamnationCount)) playerList = {} end function mod:RuneOfDamnationApplied(args) local count = #playerList+1 local icon = count playerList[count] = args.destName playerList[args.destName] = icon -- Set raid marker if self:Me(args.destGUID) then self:PlaySound(args.spellId, "warning") self:Say(args.spellId, CL.count_rticon:format(CL.bomb, icon, icon)) self:SayCountdown(args.spellId, 6, icon) if self:GetOption("rune_of_damnation_countdown") then -- Show Jumpbar, instead of TargetBar self:Bar("rune_of_damnation_countdown", 5.5, L.jump, 360281) -- Jump a bit earlier else self:TargetBar(args.spellId, 6, args.destName) end end self:NewTargetsMessage(args.spellId, "cyan", playerList, nil, CL.count:format(CL.bombs, runeOfDamnationCount-1)) self:CustomIcon(runeOfDamnationMarker, args.destName, icon) end function mod:RuneOfDamnationRemoved(args) if self:Me(args.destGUID) then self:CancelSayCountdown(args.spellId) self:StopBar(L.jump) end self:CustomIcon(runeOfDamnationMarker, args.destName) end end -- Stage Two: Unholy Attunement function mod:FinalRelentlessDomination() self:Message(362028, "red", L.final:format(CL.count:format(L.relentless_domination, relentlessDominationCount))) self:PlaySound(362028, "warning") self:SetStage(2) self:StopBar(CL.count:format(L.relentless_domination, relentlessDominationCount)) -- Relentless Domination self:StopBar(CL.count:format(L.chains_of_oppression, chainsOfOppressionCount)) -- Chains of Opression self:StopBar(CL.count:format(CL.tank_combo, martyrdomCount)) -- Martyrdom self:StopBar(CL.count:format(self:SpellName(365436), tormentCount)) -- Torment self:StopBar(CL.count:format(CL.bombs, runeOfDamnationCount)) -- Rune of Damnation self:StopBar(CL.count:format(L.mythic_blood_soak_bar, specialCount-1)) -- Heal Azeroth if specialTimer then self:CancelTimer(specialTimer) self:CancelDelayedMessage(CL.count:format(L.mythic_blood_soak_bar, specialCount-2)) specialTimer = nil end unholyAttunementCount = 1 shatteringBlastCount = 1 runeOfCompulsion = 1 decimatorCount = 1 tormentCount = 1 if not self:Easy() then self:Bar(366132, 11.1) -- Tyranny end self:Bar("floors_open", 16, L.floors_open, "inv_engineering_90_blackhole") -- Holes opening up self:Bar(360373, timers[2][360373][unholyAttunementCount], CL.count:format(L.unholy_attunement, unholyAttunementCount)) -- Unholy Attunement self:Bar(359856, timers[2][359856][shatteringBlastCount], CL.count:format(L.shattering_blast, shatteringBlastCount)) -- Shattering Blast self:Bar(366285, timers[2][366285][runeOfCompulsion], CL.count:format(L.rune_of_compulsion, runeOfCompulsion)) -- Rune of Compulsion self:Bar(360562, timers[2][360562][decimatorCount], CL.count:format(CL.knockback, decimatorCount)) -- Decimator self:Bar(365436, timers[2][365436][tormentCount], CL.count:format(self:SpellName(365436), tormentCount)) -- Torment if self:Mythic() then worldCount = 1 specialCount = 1 self:Bar(366678, 23, CL.count:format(self:SpellName(366678), worldCount)) -- World Cracker self:StartSpecialTimer(mythicSpecialTimers[2][specialCount]) -- Heal Azeroth end end function mod:UnholyAttunement(args) self:StopBar(CL.count:format(L.unholy_attunement, unholyAttunementCount)) self:Message(args.spellId, "yellow", CL.count:format(L.unholy_attunement, unholyAttunementCount)) self:PlaySound(args.spellId, "alert") unholyAttunementCount = unholyAttunementCount + 1 self:Bar(args.spellId, timers[2][args.spellId][unholyAttunementCount], unholyAttunementCount == 5 and L.final:format(CL.count:format(L.unholy_attunement, unholyAttunementCount)) or CL.count:format(L.unholy_attunement, unholyAttunementCount)) end function mod:ShatteringBlast(args) self:StopBar(CL.count:format(L.shattering_blast, shatteringBlastCount)) self:Message(args.spellId, "purple", CL.count:format(L.shattering_blast, shatteringBlastCount)) self:PlaySound(args.spellId, "alarm") shatteringBlastCount = shatteringBlastCount + 1 self:Bar(args.spellId, timers[2][args.spellId][shatteringBlastCount], CL.count:format(L.shattering_blast, shatteringBlastCount)) end do local playerList = {} function mod:RuneOfCompulsion(args) self:StopBar(CL.count:format(L.rune_of_compulsion, runeOfCompulsion)) runeOfCompulsion = runeOfCompulsion + 1 self:Bar(366285, timers[2][366285][runeOfCompulsion], CL.count:format(L.rune_of_compulsion, runeOfCompulsion)) playerList = {} end function mod:RuneOfCompulsionApplied(args) local count = #playerList+1 local icon = count playerList[count] = args.destName playerList[args.destName] = icon -- Set raid marker if self:Me(args.destGUID) then self:PlaySound(args.spellId, "warning") self:Say(args.spellId, CL.count_rticon:format(L.rune_of_compulsion, icon, icon)) self:SayCountdown(args.spellId, 4, icon) end self:NewTargetsMessage(args.spellId, "cyan", playerList, nil, CL.count:format(L.rune_of_compulsion, runeOfCompulsion-1)) self:CustomIcon(runeOfCompulsionMarker, args.destName, icon) end function mod:RuneOfCompulsionRemoved(args) if self:Me(args.destGUID) then self:CancelSayCountdown(args.spellId) end self:CustomIcon(runeOfCompulsionMarker, args.destName) end end function mod:Decimator() self:StopBar(CL.count:format(CL.knockback, decimatorCount)) self:Message(360562, "yellow", CL.count:format(CL.knockback, decimatorCount)) self:PlaySound(360562, "alert") decimatorCount = decimatorCount + 1 self:Bar(360562, timers[self:GetStage()][360562][decimatorCount], CL.count:format(CL.knockback, decimatorCount)) end function mod:FinalUnholyAttunement(args) self:Message(360373, "yellow", L.final:format(CL.count:format(L.unholy_attunement, unholyAttunementCount))) self:PlaySound(360373, "alert") self:StopBar(CL.count:format(self:SpellName(366678), worldCount)) -- World Cracker self:StopBar(CL.count:format(L.unholy_attunement, unholyAttunementCount)) -- Unholy Attunement self:StopBar(CL.count:format(L.shattering_blast, shatteringBlastCount)) -- Shattering Blast self:StopBar(CL.count:format(L.rune_of_compulsion, runeOfCompulsion)) -- Rune of Compulsion self:StopBar(CL.count:format(CL.knockback, decimatorCount)) -- Decimator self:StopBar(CL.count:format(self:SpellName(365436), tormentCount)) -- Torment self:StopBar(CL.count:format(L.mythic_blood_soak_bar, specialCount-1)) -- Heal Azeroth if specialTimer then self:CancelTimer(specialTimer) self:CancelDelayedMessage(CL.count:format(L.mythic_blood_soak_bar, specialCount-2)) -- Heal Azeroth specialTimer = nil end self:Bar("floors_open", 3.5, L.floors_open, "inv_engineering_90_blackhole") -- Holes opening up self:Bar("stages", 10.5, CL.stage:format(3), 363332) -- Unbreaking Grasp end -- Stage Three: Eternity's End function mod:UnbreakingGrasp(args) self:SetStage(3) self:Message("stages", "cyan", CL.stage:format(3), false) self:PlaySound("stages", "long") self:Bar(args.spellId, 15) tormentCount = 1 decimatorCount = 1 desolationCount = 1 chainsOfAnguishCount = 1 runeOfDominationCount = 1 defileCount = 1 fallingDebrisCount = 1 self:Bar(360562, timers[3][360562][decimatorCount], CL.count:format(CL.knockback, decimatorCount)) -- Decimator self:Bar(365436, self:LFR() and 26 or timers[3][365436][tormentCount], CL.count:format(self:SpellName(365436), tormentCount)) -- Torment self:Bar(365212, timers[3][365212][chainsOfAnguishCount], CL.count:format(L.chains_of_anguish, chainsOfAnguishCount)) -- Chains of Anguish self:Bar(365150, timers[3][365150][runeOfDominationCount], CL.count:format(L.rune_of_domination, runeOfDominationCount)) -- Rune of Domination self:Bar(365169, timers[3][365169][defileCount], CL.count:format(self:SpellName(365169), defileCount)) -- Defile if not self:LFR() then self:Bar(365033, timers[3][365033][desolationCount], CL.count:format(L.desolation, desolationCount)) -- Desolation end if self:Mythic() then worldCount = 1 specialCount = 1 self:Bar(367051, 21.5, CL.count:format(self:SpellName(367051), worldCount)) -- World Shatterer self:StartSpecialTimer(mythicSpecialTimers[3][specialCount]) -- Heal Azeroth end end function mod:Desolation(args) self:StopBar(CL.count:format(L.desolation, desolationCount)) self:Message(args.spellId, "red", CL.count:format(L.desolation, desolationCount)) self:PlaySound(args.spellId, "alert") desolationCount = desolationCount + 1 self:Bar(args.spellId, timers[3][args.spellId][desolationCount], CL.count:format(L.desolation, desolationCount)) end do local playerList = {} function mod:RuneOfDomination(args) self:StopBar(CL.count:format(L.rune_of_domination, runeOfDominationCount)) runeOfDominationCount = runeOfDominationCount + 1 self:Bar(365150, timers[3][365150][runeOfDominationCount], CL.count:format(L.rune_of_domination, runeOfDominationCount)) playerList = {} end function mod:RuneOfDominationApplied(args) local count = #playerList+1 local icon = count playerList[count] = args.destName playerList[args.destName] = icon -- Set raid marker if self:Me(args.destGUID) then self:PlaySound(args.spellId, "warning") self:Say(args.spellId, CL.count_rticon:format(L.rune_of_domination, icon, icon)) self:SayCountdown(args.spellId, 6, icon) end self:NewTargetsMessage(args.spellId, "cyan", playerList, nil, CL.count:format(L.rune_of_domination, runeOfDominationCount-1)) self:CustomIcon(runeOfDominationMarker, args.destName, icon) end function mod:RuneOfDominationRemoved(args) if self:Me(args.destGUID) then self:CancelSayCountdown(args.spellId) end self:CustomIcon(runeOfDominationMarker, args.destName) end end do local playerList = {} local removed, count = 0, 0 function mod:ChainsOfAnguish(args) self:StopBar(CL.count:format(L.chains_of_anguish, chainsOfAnguishCount)) self:Message(args.spellId, "yellow", CL.count:format(L.chain_target:format(self:ColorName(self:UnitName("boss1target") or "???")), chainsOfAnguishCount)) if self:Tank() then self:PlaySound(args.spellId, "warning") else self:PlaySound(args.spellId, "alert") end chainsOfAnguishCount = chainsOfAnguishCount + 1 playerList = {} removed, count = 0, 0 self:Bar(args.spellId, timers[3][args.spellId][chainsOfAnguishCount], CL.count:format(L.chains_of_anguish, chainsOfAnguishCount)) end function mod:ChainsOfAnguishApplied(args) count = #playerList+1 local icon = 9 - count -- 8, 7, 6, 5 playerList[count] = args.destName playerList[args.destName] = icon -- Set raid marker if self:Me(args.destGUID) then self:PlaySound(365212, "warning") end self:NewTargetsMessage(365212, "yellow", playerList, nil, CL.count:format(L.chains_of_anguish, chainsOfAnguishCount-1)) self:CustomIcon(chainsOfAnguishMarker, args.destName, icon) end function mod:ChainsOfAnguishRemoved(args) removed = removed + 1 if self:Me(args.destGUID) then self:Message(365212, "blue", CL.removed:format(L.chains_of_anguish)) end self:Message(365212, "green", L.chains_remaining:format(removed, count)) self:PlaySound(365212, "info") self:CustomIcon(chainsOfAnguishMarker, args.destName) end end function mod:Defile(args) self:StopBar(CL.count:format(args.spellName, defileCount)) self:Message(args.spellId, "orange", CL.count:format(args.spellName, defileCount)) self:PlaySound(args.spellId, "warning") defileCount = defileCount + 1 self:Bar(args.spellId, timers[3][args.spellId][defileCount], CL.count:format(args.spellName, defileCount)) end -- Mythic function mod:StartSpecialTimer(t) local stage = self:GetStage() local text = stage == 4 and L.mythic_dispel_bar or L.mythic_blood_soak_bar local icon = stage == 4 and L.mythic_dispel_icon or L.mythic_blood_soak_icon local spellId = stage == 1 and "mythic_blood_soak_stage_1" or stage == 2 and "mythic_blood_soak_stage_2" or stage == 3 and "mythic_blood_soak_stage_3" or "mythic_dispel_stage_4" -- SetOption:"mythic_blood_soak_stage_1","mythic_blood_soak_stage_2","mythic_blood_soak_stage_3","mythic_dispel_stage_4": self:Bar(spellId, t, CL.count:format(text, specialCount), icon) self:DelayedMessage(spellId, t, "yellow", CL.count:format(text, specialCount), icon, "long") specialCount = specialCount + 1 if mythicSpecialTimers[stage][specialCount] then specialTimer = self:ScheduleTimer("StartSpecialTimer", t, mythicSpecialTimers[stage][specialCount]) end end function mod:WorldCrusher(args) self:Message(args.spellId, "cyan") self:PlaySound(args.spellId, "info") end function mod:WorldCracker(args) self:StopBar(CL.count:format(args.spellName, worldCount)) self:Message(args.spellId, "cyan", CL.count:format(args.spellName, worldCount)) self:PlaySound(args.spellId, "info") worldCount = worldCount + 1 if worldCount < 5 then self:Bar(args.spellId, timers[2][360373][unholyAttunementCount], CL.count:format(args.spellName, worldCount)) -- Re-use unholy attunement timers end end function mod:WorldShatterer(args) self:Message(args.spellId, "cyan") self:PlaySound(args.spellId, "info") end function mod:DivertedLifeShield(args) self:SetStage(4) self:Message("stages", "cyan", CL.stage:format(4), false) self:PlaySound("stages", "long") self:StopBar(CL.count:format(L.desolation, desolationCount)) -- Desolation self:StopBar(CL.count:format(L.rune_of_domination, runeOfDominationCount)) -- Rune of Domination self:StopBar(CL.count:format(L.chains_of_anguish, chainsOfAnguishCount)) -- Chains of Anguish self:StopBar(CL.count:format(self:SpellName(365169), defileCount)) -- Defile self:StopBar(CL.count:format(CL.knockback, decimatorCount)) -- Decimator self:StopBar(CL.count:format(self:SpellName(365436), tormentCount)) -- Torment if specialTimer then self:CancelTimer(specialTimer) self:CancelDelayedMessage(CL.count:format(L.mythic_blood_soak_bar, specialCount-2)) specialTimer = nil end meteorCleaveCount = 1 runeOfDamnationCount = 1 decimatorCount = 1 tormentCount = 1 self:Bar(368591, timers[4][368591][1]) -- Death Sentence self:Bar(360378, timers[4][360378][meteorCleaveCount], CL.count:format(self:SpellName(360378), meteorCleaveCount)) -- Meteor Cleave self:Bar(360281, timers[4][360281][runeOfDamnationCount], CL.count:format(CL.bombs, runeOfDamnationCount)) -- Rune of Damnation self:Bar(360562, timers[4][360562][decimatorCount], CL.count:format(CL.knockback, decimatorCount)) -- Decimator self:Bar(365436, timers[4][365436][tormentCount], CL.count:format(self:SpellName(365436), tormentCount)) -- Torment specialCount = 1 self:StartSpecialTimer(mythicSpecialTimers[4][specialCount]) -- Dispels end function mod:MeteorCleave(args) self:Message(args.spellId, "yellow", CL.count:format(args.spellName, meteorCleaveCount)) self:PlaySound(args.spellId, "alert") meteorCleaveCount = meteorCleaveCount + 1 self:Bar(args.spellId, timers[4][args.spellId][meteorCleaveCount], CL.count:format(args.spellName, meteorCleaveCount)) end function mod:DeathSentence(args) self:TargetMessage(368591, "yellow", args.destName) end function mod:DeathSentenceApplied(args) if self:Me(args.destGUID) then self:PersonalMessage(args.spellId) self:PlaySound(args.spellId, "warning") self:Say(args.spellId) self:SayCountdown(args.spellId, 30) end end function mod:DeathSentenceRemoved(args) if self:Me(args.destGUID) then self:CancelSayCountdown(args.spellId) end end