local mod = DBM : NewMod ( 1829 , " DBM-Raids-Legion " , 4 , 861 )
local L = mod : GetLocalizedStrings ( )
mod : SetRevision ( " 20240422191412 " )
mod : SetCreatureID ( 114537 )
mod : SetEncounterID ( 2008 )
mod : SetUsedIcons ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 )
mod : SetHotfixNoticeRev ( 16150 )
mod.respawnTime = 30
mod : RegisterCombat ( " combat " )
mod : RegisterEventsInCombat (
" SPELL_CAST_START 227967 228390 228565 228032 228854 227903 228056 228619 228633 " ,
" SPELL_CAST_SUCCESS 228300 228519 228854 " ,
" SPELL_AURA_APPLIED 229119 227982 193367 228519 232488 228054 230267 " ,
" SPELL_AURA_REMOVED 193367 229119 230267 228300 228054 " ,
" SPELL_PERIODIC_DAMAGE 227998 " ,
" SPELL_PERIODIC_MISSED 227998 " ,
" UNIT_DIED " ,
" INSTANCE_ENCOUNTER_ENGAGE_UNIT " ,
" RAID_BOSS_EMOTE " ,
" RAID_BOSS_WHISPER " ,
" UNIT_SPELLCAST_SUCCEEDED boss1 boss2 boss3 boss4 boss5 "
)
--[[
( ability.id = 228730 or ability.id = 228032 or ability.id = 228565 or ability.id = 227967 or ability.id = 228619 or ability.id = 228633 ) and type = " begincast " or
( ability.id = 228390 or ability.id = 228300 or ability.id = 227903 or ability.id = 228056 or ability.id = 228519 ) and type = " cast "
or ( ability.id = 228300 or ability.id = 228300 ) and type = " removebuff " or ability.id = 167910
or ( ability.name = " Fetid Rot " or ability.id = 228054 ) and ( type = " cast " or type = " applydebuff " ) or ability.id = 227992
--]]
--TODO, figure out what to do with Ghostly Rage (Night Watch Mariner). Most say it's not needed and fight already has too much information, so still holding off on this
--TODO, VERIFY timer update code for fury of maw, when mistcaller gets off a cast
--TODO, more work with Corrupted Axion and Dark Hatred?
--Stage One: Low Tide
local warnOrbOfCorruption = mod : NewTargetAnnounce ( 229119 , 3 )
local warnTaintOfSea = mod : NewTargetAnnounce ( 228054 , 2 )
--Stage Two: From the Mists (65%)
local warnPhase2 = mod : NewPhaseAnnounce ( 2 , 2 )
local warnTentaclesRemaining = mod : NewAddsLeftAnnounce ( " ej14309 " , 2 , 228797 )
----Grimelord
local warnFetidRot = mod : NewTargetAnnounce ( 193367 , 3 )
----Night Watch Mariner
----MistCaller
local warnMistInfusion = mod : NewCastAnnounce ( 228854 , 4 , nil , nil , false )
--Stage Three: Helheim's Last Stand
local warnPhase3 = mod : NewPhaseAnnounce ( 3 , 2 )
local warnDarkHatred = mod : NewTargetAnnounce ( 232488 , 3 )
local warnOrbOfCorrosion = mod : NewTargetAnnounce ( 230267 , 3 )
--Stage One: Low Tide
local specWarnOrbOfCorruption = mod : NewSpecialWarningYou ( 229119 , nil , nil , nil , 1 , 5 )
local yellOrbOfCorruption = mod : NewShortPosYell ( 229119 )
local specWarnTaintofSeaPre = mod : NewSpecialWarningYou ( 228088 , " false " , nil , nil , 1 , 2 )
local specWarnTaintofSea = mod : NewSpecialWarningDodge ( 228088 , nil , nil , nil , 1 , 2 )
local yellTaint = mod : NewShortPosYell ( 228088 , nil , false )
local specWarnBilewaterBreath = mod : NewSpecialWarningCount ( 227967 , nil , nil , nil , 2 , 2 )
local specWarnBilewaterRedox = mod : NewSpecialWarningTaunt ( 227982 , nil , nil , nil , 1 , 2 )
local specWarnBilewaterCorrosion = mod : NewSpecialWarningMove ( 227998 , nil , nil , nil , 1 , 2 )
local specWarnBilewaterSlimes = mod : NewSpecialWarningSwitch ( " ej14217 " , " Dps " , nil , nil , 1 , 2 )
local specWarnTentacleStrike = mod : NewSpecialWarningCount ( 228730 , nil , DBM_CORE_L.AUTO_SPEC_WARN_OPTIONS . spell : format ( 228730 ) , nil , 2 )
--Stage Two: From the Mists (65%)
----Helya
local specWarnFuryofMaw = mod : NewSpecialWarningSpell ( 228032 , nil , nil , nil , 2 )
----Grimelord
local specWarnGrimeLord = mod : NewSpecialWarningSwitch ( " ej14263 " , " Tank " , nil , nil , 1 , 2 )
local specWarnSludgeNova = mod : NewSpecialWarningRun ( 228390 , " Melee " , nil , nil , 4 , 3 )
local specWarnFetidRot = mod : NewSpecialWarningMoveAway ( 193367 , nil , nil , nil , 1 , 2 )
local yellFetidRot = mod : NewFadesYell ( 193367 )
local specWarnAnchorSlam = mod : NewSpecialWarningTaunt ( 228519 , nil , nil , nil , 1 , 2 )
----Night Watch Mariner
local specWarnLanternofDarkness = mod : NewSpecialWarningSpell ( 228619 , nil , nil , nil , 2 , 2 )
local specWarnGiveNoQuarter = mod : NewSpecialWarningDodge ( 228633 , nil , nil , nil , 1 , 2 )
--Stage Three: Helheim's Last Stand
local specWarnCorruptedBreath = mod : NewSpecialWarningCount ( 228565 , nil , nil , nil , 2 )
local specWarnOrbOfCorrosion = mod : NewSpecialWarningYou ( 230267 , nil , nil , nil , 1 , 5 )
local yellOrbOfCorrosion = mod : NewShortPosYell ( 230267 )
--Stage One: Low Tide
mod : AddTimerLine ( SCENARIO_STAGE : format ( 1 ) )
local timerOrbOfCorruptionCD = mod : NewNextTimer ( 25 , 229119 , " OrbsTimerText " , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON , nil , 3 , 4 )
local timerTaintOfSeaCD = mod : NewCDTimer ( 14.5 , 228088 , nil , nil , nil , 3 , nil , DBM_COMMON_L.HEALER_ICON )
local timerBilewaterBreathCD = mod : NewNextCountTimer ( 40 , 227967 , 21131 , nil , nil , 5 , nil , DBM_COMMON_L.TANK_ICON ) --On for everyone though so others avoid it too
local timerTentacleStrikeCD = mod : NewNextCountTimer ( 30 , 228730 , nil , nil , nil , 5 )
local timerTentacleStrike = mod : NewCastSourceTimer ( 6 , 228730 , nil , nil , nil , 5 )
local timerExplodingOozes = mod : NewCastTimer ( 20.5 , 227992 , nil , nil , nil , 2 , nil , DBM_COMMON_L.DAMAGE_ICON , nil , 1 , 4 )
--Stage Two: From the Mists (65%)
mod : AddTimerLine ( SCENARIO_STAGE : format ( 2 ) )
local timerFuryofMaw = mod : NewBuffActiveTimer ( 32 , 228032 , nil , nil , nil , 2 )
----Helya
local timerFuryofMawCD = mod : NewNextCountTimer ( 44.5 , 228032 , nil , nil , nil , 2 )
local timerAddsCD = mod : NewNextTimer ( 75.5 , 167910 , nil , nil , nil , 1 )
----Grimelord
local timerSludgeNovaCD = mod : NewCDTimer ( 24.2 , 228390 , nil , " Melee " , nil , 2 )
local timerAnchorSlamCD = mod : NewCDTimer ( 12 , 228519 , nil , " Tank " , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerFetidRotCD = mod : NewCDTimer ( 13 , 193367 , nil , nil , nil , 3 )
----Night Watch Mariner
local timerLanternofDarknessCD = mod : NewNextTimer ( 25 , 228619 , nil , nil , nil , 2 , nil , DBM_COMMON_L.DEADLY_ICON )
local timerGiveNoQuarterCD = mod : NewNextTimer ( 6 , 228633 , nil , nil , nil , 3 )
--Stage Three: Helheim's Last Stand
mod : AddTimerLine ( SCENARIO_STAGE : format ( 3 ) )
local timerCorruptedBreathCD = mod : NewCDCountTimer ( 40 , 228565 , 21131 , nil , nil , 5 , nil , DBM_COMMON_L.TANK_ICON )
local timerOrbOfCorrosionCD = mod : NewNextTimer ( 17 , 230267 , " OrbsTimerText " , nil , nil , 3 , nil , DBM_COMMON_L.DEADLY_ICON , nil , 3 , 4 )
local berserkTimer = mod : NewBerserkTimer ( 660 )
mod : AddRangeFrameOption ( 5 , 193367 )
mod : AddSetIconOption ( " SetIconOnTaint " , 228088 , false )
mod : AddSetIconOption ( " SetIconOnOrbs " , 229119 , true ) --Healer (Star), Tank (Circle), Deeps (Diamond)
mod : AddInfoFrameOption ( 193367 )
local seenMobs = { }
--[[
35.405 Striking Tentacle 1 begins casting Tentacle Strike ( melee )
39.384 Striking Tentacle 2 begins casting Tentacle Strike ( melee )
71.364 Striking Tentacle 3 begins casting Tentacle Strike ( melee )
71.364 Striking Tentacle 4 begins casting Tentacle Strike ( ranged )
106.591 Striking Tentacle 5 begins casting Tentacle Strike ( ranged )
110.597 Striking Tentacle 6 begins casting Tentacle Strike ( range )
142.234 Striking Tentacle 7 begins casting Tentacle Strike ( ranged )
146.222 Striking Tentacle 8 begins casting Tentacle Strike ( melee )
150.230 Striking Tentacle 9 begins casting Tentacle Strike ( ranged )
177.493 Striking Tentacle 10 begins casting Tentacle Strike ( melee )
181.444 Striking Tentacle 11 begins casting Tentacle Strike ( melee )
--]]
local mythicTentacleSpawns = { " 2x " .. DBM_COMMON_L.FRONT , " 1x " .. DBM_COMMON_L.FRONT .. " /1x " .. DBM_COMMON_L.BACK , " 2x " .. DBM_COMMON_L.BACK , " 2x " .. DBM_COMMON_L.BACK .. " /1x " .. DBM_COMMON_L.FRONT , " 2x " .. DBM_COMMON_L.FRONT }
local phase3MythicOrbs = { 6 , 13.0 , 13.0 , 27.1 , 10.7 , 13.0 , 25.0 , 13.0 , 13.0 , 25.0 , 13.0 , 17.6 , 19.5 , 13.0 , 13.0 , 12.0 , 12.0 , 15 , 8.2 } --last being 8.2 in one log, but 13 in another. leaving 8.2 for now
local phase3MythicTaint = { 0 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 20 , 17 , 14 , 11 , 11 } --Assumed that rest are 11 (if you someone survive past berserk)
mod.vb . phase = 1
mod.vb . rottedPlayers = 0
mod.vb . orbCount = 0
mod.vb . furyOfMawCount = 0
mod.vb . tentacleSetCount = 0
mod.vb . tentacleCount = 0
mod.vb . taintCount = 0
mod.vb . taintIcon = 4
mod.vb . lastTentacles = 9
mod.vb . breathCount = 0
function mod : OnCombatStart ( delay )
table.wipe ( seenMobs )
self.vb . phase = 1
self.vb . rottedPlayers = 0
self.vb . orbCount = 1
self.vb . furyOfMawCount = 0
self.vb . tentacleSetCount = 0
self.vb . tentacleCount = 0
self.vb . taintCount = 0
self.vb . taintIcon = 4
self.vb . breathCount = 0
if self : IsEasy ( ) then
self.vb . lastTentacles = 9
timerTaintOfSeaCD : Start ( 12.4 - delay )
timerBilewaterBreathCD : Start ( 13.3 - delay , 1 )
timerOrbOfCorruptionCD : Start ( 18 - delay , 1 , RANGED ) --START
timerTentacleStrikeCD : Start ( 53 - delay , 1 )
elseif self : IsMythic ( ) then
self.vb . lastTentacles = 8
timerBilewaterBreathCD : Start ( 11 - delay , 1 )
timerOrbOfCorruptionCD : Start ( 14 - delay , 1 , RANGED ) --START
timerTaintOfSeaCD : Start ( 15 - delay )
timerTentacleStrikeCD : Start ( 35 - delay , 1 )
berserkTimer : Start ( - delay ) --11 Min confirmed
else
self.vb . lastTentacles = 9
timerBilewaterBreathCD : Start ( 12 - delay , 1 )
timerTaintOfSeaCD : Start ( 19 - delay )
timerOrbOfCorruptionCD : Start ( 29 - delay , 1 , RANGED ) --START
timerTentacleStrikeCD : Start ( 36 - delay , 1 )
berserkTimer : Start ( - delay ) --11 Min assumed
end
end
function mod : OnCombatEnd ( )
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
if self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
end
function mod : SPELL_CAST_START ( args )
local spellId = args.spellId
if spellId == 227967 then
self.vb . breathCount = self.vb . breathCount + 1
specWarnBilewaterBreath : Show ( self.vb . breathCount )
specWarnBilewaterBreath : Play ( " breathsoon " )
if self : IsNormal ( ) then
timerBilewaterBreathCD : Start ( 57 , self.vb . breathCount + 1 )
elseif self : IsMythic ( ) then
timerBilewaterBreathCD : Start ( 43 , self.vb . breathCount + 1 )
else --Verified heroic and LFR. TODO, verify mythic and reverify LFR
timerBilewaterBreathCD : Start ( 52 , self.vb . breathCount + 1 )
end
--Start ooze stuff here since all their stuff is hidden from combat log
timerExplodingOozes : Start ( )
specWarnBilewaterSlimes : Schedule ( 3 )
specWarnBilewaterSlimes : ScheduleVoice ( 3 , " killmob " )
elseif spellId == 228390 then
if self : CheckTankDistance ( args.sourceGUID , 18 ) then --18 has to be used because of limitations in 7.1 distance APIs
--Only warn if you are near the person tanking this
specWarnSludgeNova : Show ( )
specWarnSludgeNova : Play ( " runout " )
end
timerSludgeNovaCD : Start ( )
elseif spellId == 228565 then
self.vb . breathCount = self.vb . breathCount + 1
specWarnCorruptedBreath : Show ( self.vb . breathCount )
if self : IsEasy ( ) then
timerCorruptedBreathCD : Start ( 51 , self.vb . breathCount + 1 )
elseif self : IsMythic ( ) then
timerCorruptedBreathCD : Start ( 43 , self.vb . breathCount + 1 )
else
timerCorruptedBreathCD : Start ( 47.5 , self.vb . breathCount + 1 )
end
elseif spellId == 228032 then --Phase 3 Fury of the Maw
self.vb . furyOfMawCount = self.vb . furyOfMawCount + 1
specWarnFuryofMaw : Show ( self.vb . furyOfMawCount )
if self : IsLFR ( ) then
timerFuryofMawCD : Start ( 92 , self.vb . furyOfMawCount + 1 )
elseif self : IsNormal ( ) then
timerFuryofMawCD : Start ( 77 , self.vb . furyOfMawCount + 1 )
elseif self : IsMythic ( ) then
timerFuryofMawCD : Start ( 56 , self.vb . furyOfMawCount + 1 )
else
timerFuryofMawCD : Start ( 74.6 , self.vb . furyOfMawCount + 1 )
end
timerAddsCD : Start ( 7 )
elseif spellId == 228854 then
if self : AntiSpam ( 0.5 , 5 ) then --Combine two cast at same time, but if at least a second apart separate them
warnMistInfusion : Show ( )
end
elseif spellId == 227903 then
self.vb . orbCount = self.vb . orbCount + 1
--Odd orbs are ranged and evens are melee
local text = self.vb . orbCount % 2 == 0 and MELEE or RANGED
if self : IsMythic ( ) then
timerOrbOfCorruptionCD : Start ( 24 , self.vb . orbCount , text )
elseif self : IsEasy ( ) then
timerOrbOfCorruptionCD : Start ( 31.2 , self.vb . orbCount , text )
else
timerOrbOfCorruptionCD : Start ( 28 , self.vb . orbCount , text )
end
elseif spellId == 228056 then
self.vb . orbCount = self.vb . orbCount + 1
--Odd orbs are ranged and evens are melee
local text = self.vb . orbCount % 2 == 0 and MELEE or RANGED
if self : IsMythic ( ) then
local timer = phase3MythicOrbs [ self.vb . orbCount ]
if timer then
timerOrbOfCorrosionCD : Start ( timer , self.vb . orbCount , text )
else
timerOrbOfCorrosionCD : Start ( 12 , self.vb . orbCount , text )
end
elseif self : IsLFR ( ) then
timerOrbOfCorrosionCD : Start ( 32.7 , self.vb . orbCount , text )
else --Reverify normal
timerOrbOfCorrosionCD : Start ( 17 , self.vb . orbCount , text )
end
elseif spellId == 228619 then
specWarnLanternofDarkness : Show ( )
elseif spellId == 228633 then
specWarnGiveNoQuarter : Show ( )
specWarnGiveNoQuarter : Play ( " watchstep " )
if self : IsEasy ( ) then
timerGiveNoQuarterCD : Start ( 9.7 )
else
timerGiveNoQuarterCD : Start ( 6 )
end
end
end
function mod : SPELL_CAST_SUCCESS ( args )
local spellId = args.spellId
if spellId == 228300 then --Phase 2 Fury of the Maw
self.vb . furyOfMawCount = self.vb . furyOfMawCount + 1
specWarnFuryofMaw : Show ( self.vb . furyOfMawCount )
timerFuryofMaw : Start ( )
if self : IsMythic ( ) then
timerAddsCD : Start ( 7 )
end
elseif spellId == 228519 then
if self : IsEasy ( ) then
timerAnchorSlamCD : Start ( 14 , args.sourceGUID )
else
timerAnchorSlamCD : Start ( 12 , args.sourceGUID )
end
elseif spellId == 228854 then --Mist infusion got off, update timers
local elapsed , total = timerFuryofMawCD : GetTime ( self.vb . furyOfMawCount + 1 )
local remaining = total - elapsed
if remaining and remaining > 11 then
timerFuryofMawCD : Update ( elapsed + 11 , total , self.vb . furyOfMawCount + 1 )
end
end
end
function mod : SPELL_AURA_APPLIED ( args )
local spellId = args.spellId
if spellId == 229119 then
warnOrbOfCorruption : CombinedShow ( 0.3 , args.destName )
if self.Options . SetIconOnOrbs then
local uId = DBM : GetRaidUnitId ( args.destName )
if self : IsTanking ( uId ) then
self : SetIcon ( args.destName , 2 ) --Circle
elseif self : IsHealer ( uId ) then
self : SetIcon ( args.destName , 1 ) --Star
else
self : SetIcon ( args.destName , 3 ) --Diamond
end
end
elseif spellId == 230267 then
warnOrbOfCorrosion : CombinedShow ( 0.3 , args.destName )
if self.Options . SetIconOnOrbs then
local uId = DBM : GetRaidUnitId ( args.destName )
if self : IsHealer ( uId ) then --On All difficulties as of Dec 6th, a tank isn't chosen, just 1 healer and 2 dps
self : SetIcon ( args.destName , 1 ) --Star
else
self : SetSortedIcon ( " roster " , 1 , args.destName , 2 , 2 ) --Circle and Diamond
end
end
elseif spellId == 227982 then
if not args : IsPlayer ( ) then
local uId = DBM : GetRaidUnitId ( args.destName )
if self : IsTanking ( uId ) then --Filter numties standing in front of boss that shouldn't be
specWarnBilewaterRedox : Show ( args.destName )
specWarnBilewaterRedox : Play ( " tauntboss " )
end
end
elseif spellId == 228519 then
if not args : IsPlayer ( ) then
local uId = DBM : GetRaidUnitId ( args.destName )
--Filter numties standing in front of boss that shouldn't be
--Also filter tanks that are too far away to taunt from (mythic split)
if self : IsTanking ( uId ) and self : CheckNearby ( 18 , args.destName ) then
specWarnAnchorSlam : Show ( args.destName )
specWarnAnchorSlam : Play ( " tauntboss " )
end
end
elseif spellId == 193367 then
self.vb . rottedPlayers = self.vb . rottedPlayers + 1
warnFetidRot : CombinedShow ( 0.3 , args.destName )
if args : IsPlayer ( ) then
specWarnFetidRot : Show ( )
specWarnFetidRot : Play ( " range5 " )
if self : IsMythic ( ) then --yell on applied as well, it starts spreading MUCH sooner
yellFetidRot : Yell ( 15 )
end
local _ , _ , _ , _ , duration , expires = DBM : UnitDebuff ( " player " , args.spellName )
if expires then
local remaining = expires - GetTime ( )
yellFetidRot : Schedule ( remaining - 1 , 1 )
yellFetidRot : Schedule ( remaining - 2 , 2 )
yellFetidRot : Schedule ( remaining - 3 , 3 )
end
if self.Options . RangeFrame then
DBM.RangeCheck : Show ( 5 )
end
end
if self.Options . InfoFrame and not DBM.InfoFrame : IsShown ( ) and not self : IsLFR ( ) then
DBM.InfoFrame : SetHeader ( args.spellName )
DBM.InfoFrame : Show ( 5 , " playerdebuffstacks " , args.spellName )
end
elseif spellId == 232488 then
warnDarkHatred : CombinedShow ( 0.3 , args.destName )
elseif spellId == 228054 then
warnTaintOfSea : CombinedShow ( 0.3 , args.destName )
if self : AntiSpam ( 5 , 6 ) then
self.vb . taintCount = self.vb . taintCount + 1
self.vb . taintIcon = 4
if self : IsEasy ( ) then --Cast MORE OFTEN in LFR/normal?
if self.vb . phase == 3 then
timerTaintOfSeaCD : Start ( 27 )
else
timerTaintOfSeaCD : Start ( 12.1 )
end
elseif self : IsMythic ( ) then
if self.vb . phase == 3 then
local timer = phase3MythicTaint [ self.vb . taintCount + 1 ]
if timer then
timerTaintOfSeaCD : Start ( timer )
else
timerTaintOfSeaCD : Start ( 11 ) --Assume rest are 11 until more data
end
else
timerTaintOfSeaCD : Start ( 12.1 )
end
else --Special snowflake for some reason (heroic)
if self.vb . phase == 3 then
timerTaintOfSeaCD : Start ( 25.5 ) --TODO, see what happens to it on heroic soft enrage mechanic
else
timerTaintOfSeaCD : Start ( ) --14.5, only mode that's not 12.1
end
end
end
if self.Options . SetIconOnTaint then
self : SetIcon ( args.destName , self.vb . taintIcon )
end
if args : IsPlayer ( ) then
specWarnTaintofSeaPre : Show ( )
specWarnTaintofSeaPre : Play ( " targetyou " )
yellTaint : Yell ( self.vb . taintIcon , " " )
yellTaint : Schedule ( 2 , self.vb . taintIcon , " " )
end
self.vb . taintIcon = self.vb . taintIcon + 1
end
end
function mod : SPELL_AURA_REMOVED ( args )
local spellId = args.spellId
if spellId == 193367 then
self.vb . rottedPlayers = self.vb . rottedPlayers - 1
if args : IsPlayer ( ) then
yellFetidRot : Cancel ( )
if self.Options . RangeFrame then
DBM.RangeCheck : Hide ( )
end
end
if self.vb . rottedPlayers == 0 and self.Options . InfoFrame then
DBM.InfoFrame : Hide ( )
end
elseif spellId == 229119 then
if self.Options . SetIconOnOrbs then
self : SetIcon ( args.destName , 0 )
end
elseif spellId == 228300 then
timerFuryofMaw : Stop ( )
if self.vb . phase == 2 then
if self : IsEasy ( ) then
timerAddsCD : Start ( 7 )
timerFuryofMawCD : Start ( 45 , self.vb . furyOfMawCount + 1 )
elseif self : IsMythic ( ) then
timerFuryofMawCD : Start ( 44.6 , self.vb . furyOfMawCount + 1 )
else
timerAddsCD : Start ( 7 )
timerFuryofMawCD : Start ( 42.6 , self.vb . furyOfMawCount + 1 )
end
end
elseif spellId == 228054 then
if args : IsPlayer ( ) then
specWarnTaintofSea : Show ( )
specWarnTaintofSea : Play ( " watchstep " )
end
if self.Options . SetIconOnTaint then
self : SetIcon ( args.destName , 0 )
end
end
end
function mod : SPELL_PERIODIC_DAMAGE ( _ , _ , _ , _ , destGUID , _ , _ , _ , spellId )
if spellId == 227998 and destGUID == UnitGUID ( " player " ) and self : AntiSpam ( 2 , 1 ) then
specWarnBilewaterCorrosion : Show ( )
specWarnBilewaterCorrosion : Play ( " runaway " )
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
function mod : UNIT_DIED ( args )
local cid = self : GetCIDFromGUID ( args.destGUID )
if cid == 114709 then --GrimeLord
timerSludgeNovaCD : Stop ( args.destGUID )
timerAnchorSlamCD : Stop ( args.destGUID )
timerFetidRotCD : Stop ( args.destGUID )
elseif cid == 114809 then --Night Watch Mariner
timerLanternofDarknessCD : Stop ( args.destGUID )
timerGiveNoQuarterCD : Stop ( args.destGUID )
end
end
--This is used over boats because it's more reliable
function mod : INSTANCE_ENCOUNTER_ENGAGE_UNIT ( )
for i = 1 , 5 do
local unitID = " boss " .. i
local GUID = UnitGUID ( unitID )
if GUID and not seenMobs [ GUID ] then
seenMobs [ GUID ] = true
local cid = self : GetCIDFromGUID ( GUID )
if cid == 114709 then --GrimeLord
specWarnGrimeLord : Show ( )
specWarnGrimeLord : Play ( " bigmob " )
timerFetidRotCD : Start ( 7 , GUID )
if not self : IsLFR ( ) then
timerAnchorSlamCD : Start ( 13.7 , GUID )
end
timerSludgeNovaCD : Start ( 17.5 , GUID )
elseif cid == 114809 then --Night Watch Mariner
if self.vb . phase == 2 then
if self : IsMythic ( ) then
timerGiveNoQuarterCD : Start ( 7 , GUID )
timerLanternofDarknessCD : Start ( 26 , GUID )
else
timerGiveNoQuarterCD : Start ( 7 , GUID )
timerLanternofDarknessCD : Start ( 30 , GUID )
end
else
if self : IsMythic ( ) then
timerGiveNoQuarterCD : Start ( 10 , GUID ) --Poor data. Oddity?
timerLanternofDarknessCD : Start ( 30 , GUID )
else
timerGiveNoQuarterCD : Start ( 7 , GUID )
timerLanternofDarknessCD : Start ( 35 , GUID )
end
end
end
end
end
end
function mod : RAID_BOSS_EMOTE ( msg )
if msg : find ( " inv_misc_monsterhorn_03 " ) then
if self : AntiSpam ( 20 , 2 ) then
self.vb . tentacleCount = 0
self.vb . tentacleSetCount = self.vb . tentacleSetCount + 1
if self : IsEasy ( ) then
timerTentacleStrikeCD : Start ( 40 , self.vb . tentacleSetCount + 1 )
elseif self : IsMythic ( ) then
timerTentacleStrikeCD : Start ( 35 , self.vb . tentacleSetCount + 1 )
local text = mythicTentacleSpawns [ self.vb . tentacleSetCount ]
if text then
specWarnTentacleStrike : Show ( text )
else
specWarnTentacleStrike : Show ( DBM_COMMON_L.UNKNOWN )
end
else
timerTentacleStrikeCD : Start ( 42.5 , self.vb . tentacleSetCount + 1 )
end
end
if msg : find ( L.near ) then
self.vb . tentacleCount = self.vb . tentacleCount + 1
if not self : IsMythic ( ) then
specWarnTentacleStrike : Show ( DBM_COMMON_L.FRONT )
end
local subtext = self : IsMythic ( ) and DBM_COMMON_L.FRONT .. " ( " .. self.vb . tentacleCount .. " ) " or DBM_COMMON_L.FRONT
timerTentacleStrike : Start ( subtext )
elseif msg : find ( L.far ) then
self.vb . tentacleCount = self.vb . tentacleCount + 1
if not self : IsMythic ( ) then
specWarnTentacleStrike : Show ( DBM_COMMON_L.BACK )
end
local subtext = self : IsMythic ( ) and DBM_COMMON_L.BACK .. " ( " .. self.vb . tentacleCount .. " ) " or DBM_COMMON_L.BACK
timerTentacleStrike : Start ( subtext )
--Backup for the like 8 languages dbm doesn't have translators for
else
self.vb . tentacleCount = self.vb . tentacleCount + 1
if not self : IsMythic ( ) then
specWarnTentacleStrike : Show ( DBM_COMMON_L.UNKNOWN )
end
local subtext = self : IsMythic ( ) and DBM_COMMON_L.UNKNOWN .. " ( " .. self.vb . tentacleCount .. " ) " or DBM_COMMON_L.UNKNOWN
timerTentacleStrike : Start ( subtext )
end
end
end
function mod : RAID_BOSS_WHISPER ( msg )
if msg : find ( " spell:227920 " ) then
specWarnOrbOfCorruption : Show ( )
specWarnOrbOfCorruption : Play ( " orbrun " )
if self : IsTank ( ) then
yellOrbOfCorruption : Yell ( 2 , DBM_COMMON_L.ORB , 2 )
elseif self : IsHealer ( ) then --LFR/Normal doesn't choose a healer, just tank/damage
yellOrbOfCorruption : Yell ( 1 , DBM_COMMON_L.ORB , 1 )
else
yellOrbOfCorruption : Yell ( 3 , DBM_COMMON_L.ORB , 3 )
end
elseif msg : find ( " spell:228058 " ) then
specWarnOrbOfCorrosion : Show ( )
specWarnOrbOfCorrosion : Play ( " orbrun " )
if self : IsTank ( ) then
yellOrbOfCorrosion : Yell ( 2 , DBM_COMMON_L.ORB , 2 )
elseif self : IsHealer ( ) then --LFR/Normal doesn't choose a healer, just tank/damage
yellOrbOfCorrosion : Yell ( 1 , DBM_COMMON_L.ORB , 1 )
else
yellOrbOfCorrosion : Yell ( 3 , DBM_COMMON_L.ORB , 3 )
end
end
end
function mod : UNIT_HEALTH ( uId )
if self.vb . phase ~= 2 then
self : UnregisterShortTermEvents ( )
return
end
local cid = self : GetUnitCreatureId ( uId )
if cid ~= 114537 then return end --Helya
local health = UnitHealth ( uId ) / UnitHealthMax ( uId ) * 100
local tentaclesRemaining = self : IsMythic ( ) and math.floor ( ( health - 45 ) / 2.5 ) or math.floor ( ( health - 40 ) / 2.77 )
if tentaclesRemaining < self.vb . lastTentacles then
self.vb . lastTentacles = tentaclesRemaining
if self.vb . lastTentacles >= 0 then
warnTentaclesRemaining : Show ( self.vb . lastTentacles )
end
end
end
function mod : UNIT_SPELLCAST_SUCCEEDED ( uId , _ , spellId )
if spellId == 228372 then --Mists of Helheim (Phase 2)
self.vb . phase = 2
timerTentacleStrikeCD : Stop ( )
timerBilewaterBreathCD : Stop ( )
timerOrbOfCorruptionCD : Stop ( )
warnPhase2 : Show ( )
if not self : IsMythic ( ) then
--On mythic first fury of maw is instantly on phase change, adds timer is handled by that
timerAddsCD : Start ( 14 )
timerFuryofMawCD : Start ( 36.5 , 1 )
end
self : RegisterShortTermEvents (
" UNIT_HEALTH boss1 boss2 boss3 boss4 boss5 "
)
elseif spellId == 228546 then --Helya (Phase 3, 6 seconds slower than yell)
self : UnregisterShortTermEvents ( )
self.vb . phase = 3
self.vb . taintCount = 0 --TODO, make sure helya happens before first taint goes out
self.vb . orbCount = 1
self.vb . furyOfMawCount = 0
self.vb . breathCount = 0
timerFuryofMawCD : Stop ( )
warnPhase3 : Show ( )
if self : IsMythic ( ) then
timerOrbOfCorrosionCD : Start ( 6 , 1 , RANGED )
timerCorruptedBreathCD : Start ( 10 , 1 )
timerFuryofMawCD : Start ( 35 , 1 )
elseif self : IsLFR ( ) then
timerOrbOfCorrosionCD : Start ( 11 , 1 , RANGED ) --Needs recheck
timerCorruptedBreathCD : Start ( 40 , 1 ) --Needs recheck
timerFuryofMawCD : Start ( 90 , 1 ) --Needs recheck
elseif self : IsNormal ( ) then --May still be same as heroic with variation
timerOrbOfCorrosionCD : Start ( 12 , 1 , RANGED ) --Needs recheck
timerCorruptedBreathCD : Start ( 20.5 , 1 )
timerFuryofMawCD : Start ( 33 , 1 ) --Needs more verification
else --Heroic
timerOrbOfCorrosionCD : Start ( 14 , 1 , RANGED ) --Needs more verification
timerCorruptedBreathCD : Start ( 19.4 , 1 )
timerFuryofMawCD : Start ( 30 , 1 )
end
elseif spellId == 228838 then
if self : IsEasy ( ) then
timerFetidRotCD : Start ( 15 , UnitGUID ( uId ) )
elseif self : IsMythic ( ) then
timerFetidRotCD : Start ( 13 , UnitGUID ( uId ) )
else
timerFetidRotCD : Start ( 12 , UnitGUID ( uId ) )
end
end
end