You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

340 lines
14 KiB

local mod = DBM:NewMod(1744, "DBM-EmeraldNightmare", nil, 768)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20220116041824")
mod:SetCreatureID(106087)
mod:SetEncounterID(1876)
mod:SetUsedIcons(1, 2, 3, 4, 5)
mod:SetHotfixNoticeRev(15357)
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 212707 210948 210547 215288 210308 210326 215582",
"SPELL_CAST_SUCCESS 210864 215443 218630 218124",
"SPELL_AURA_APPLIED 212514 218124 218629 215582 215307 215300",
"SPELL_AURA_APPLIED_DOSE 212512 215582",
"SPELL_AURA_REMOVED 218124 218629 215300 215307",
"SPELL_PERIODIC_DAMAGE 213124",
"SPELL_PERIODIC_MISSED 213124",
"UNIT_SPELLCAST_SUCCEEDED boss1"
)
--TODO, Shimering Feather (212993) also missing from combat log. Will add tracking for this when blizzard revises fight when/if they fix it. If they don't, UNIT_AURA it is!
--(ability.id = 212707 or ability.id = 210948 or ability.id = 210547 or ability.id = 215582 or ability.id = 210326 or ability.id = 210308 or ability.id = 218124) and type = "begincast" or (ability.id = 210864 or ability.id = 215443 or ability.id = 218630 or ability.id = 218124) and type = "cast"
--Spider Form
local warnSpiderForm = mod:NewSpellAnnounce(210326, 2)
local warnFeedingTime = mod:NewSpellAnnounce(212364, 3)
local warnWebWrap = mod:NewTargetAnnounce(212514, 4)
local warnNecroticVenom = mod:NewTargetAnnounce(218831, 3)
local warnWebOfPain = mod:NewAnnounce("warnWebOfPain", 2, 215307)
----Mythic
local warnNightmareSpawn = mod:NewSpellAnnounce(218630, 3)
--Roc Form
local warnRocForm = mod:NewSpellAnnounce(210308, 2)
local warnTwistingShadows = mod:NewTargetCountAnnounce(210864, 3)
----Mythic
local warnViolentWinds = mod:NewTargetAnnounce(218124, 4)
--Spider Form
local specWarnFeedingTime = mod:NewSpecialWarningSwitch(212364, "-Healer", nil, nil, 1, 2)
local specWarnVenomousPool = mod:NewSpecialWarningMove(213124, nil, nil, nil, 1, 2)
local specWarnWebWrap = mod:NewSpecialWarningStack(212512, nil, 5, nil, nil, 1, 6)
local specWarnNecroticVenom = mod:NewSpecialWarningMoveAway(218831, nil, nil, nil, 1, 2)
local yellNecroticVenom = mod:NewFadesYell(218831)
local specWarnWebofPain = mod:NewSpecialWarning("specWarnWebofPain", nil, nil, nil, 1, 2)
--Roc Form
local specWarnGatheringClouds = mod:NewSpecialWarningSpell(212707, nil, nil, nil, 1, 2)
local specWarnDarkStorm = mod:NewSpecialWarningMoveTo(210948, nil, nil, nil, 1, 2)
local specWarnTwistingShadows = mod:NewSpecialWarningMoveAway(210864, nil, nil, nil, 1, 2)
local specWarnTwistingShadowsMove = mod:NewSpecialWarningMove(210864, nil, nil, nil, 1, 2)--For expires. visual is WAY off from debuff, if you wait for visual you'll die to this
local yellTwistingShadows = mod:NewFadesYell(210864)
local specWarnRazorWing = mod:NewSpecialWarningDodge(210547, nil, nil, nil, 3, 2)
local specWarnRakingTalon = mod:NewSpecialWarningDefensive(215582, nil, nil, nil, 1, 2)
local specWarnRakingTalonOther = mod:NewSpecialWarningTaunt(215582, nil, nil, nil, 1, 2)
----Mythic
local specViolentWinds = mod:NewSpecialWarningYou(218124, nil, nil, nil, 3, 2)
local yellViolentWinds = mod:NewYell(218124)
--Spider Form
mod:AddTimerLine(DBM:GetSpellInfo(210326))
local timerSpiderFormCD = mod:NewNextTimer(132, 210326, nil, nil, nil, 6, nil, nil, nil, 1, 4)
local timerFeedingTimeCD = mod:NewNextCountTimer(50, 212364, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)
local timerNecroticVenomCD = mod:NewNextCountTimer(21.8, 215443, nil, nil, nil, 3, nil, nil, nil, 3, 4)--This only targets ranged, but melee/tanks need to be sure to also move away from them
mod:AddTimerLine(ENCOUNTER_JOURNAL_SECTION_FLAG12)
local timerNightmareSpawnCD = mod:NewNextTimer(10, 218630, nil, nil, nil, 1, nil, DBM_COMMON_L.HEROIC_ICON)
--Roc Form
mod:AddTimerLine(DBM:GetSpellInfo(210308))
local timerRocFormCD = mod:NewNextTimer(47, 210308, nil, nil, nil, 6, nil, nil, nil, 1, 4)
local timerGatheringCloudsCD = mod:NewNextTimer(15.8, 212707, nil, nil, nil, 2)
local timerDarkStormCD = mod:NewNextTimer(26, 210948, nil, nil, nil, 2)
local timerTwistingShadowsCD = mod:NewNextCountTimer(21.5, 210864, nil, nil, nil, 3)
local timerRazorWingCD = mod:NewNextTimer(32.5, 210547, nil, nil, nil, 3)
local timerRakingTalonsCD = mod:NewCDCountTimer(32, 215582, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
mod:AddTimerLine(ENCOUNTER_JOURNAL_SECTION_FLAG12)
local timerViolentWindsCD = mod:NewNextTimer(40.5, 218124, nil, nil, nil, 5, nil, DBM_COMMON_L.HEROIC_ICON..DBM_COMMON_L.TANK_ICON)
local berserkTimer = mod:NewBerserkTimer(540)
--mod:AddRangeFrameOption("5")--Add range frame to Necrotic Debuff if detecting it actually works with FindDebuff()
mod:AddSetIconOption("SetIconOnWeb", 215307)
mod:AddSetIconOption("SetIconOnWinds", 218124)
mod.vb.feedingTimeCast = 0
mod.vb.venomCast = 0
mod.vb.twistedCast = 0
mod.vb.talonsCast = 0
mod.vb.razorWingCast = 0
mod.vb.windsCast = 0
mod.vb.platformCount = 1
mod.vb.ViolentWindsPlat = false
local eyeOfStorm = DBM:GetSpellInfo(211127)
local scanTime = 0
local playerGUID = UnitGUID("player")
--TODO, need exact number of target affected by it for each scale to refactor it to just not stop until it finds all targets, then make it faster again
local function findDebuff(self, spellName, spellId)
scanTime = scanTime + 1
local found = 0
for uId in DBM:GetGroupMembers() do
local name = DBM:GetUnitFullName(uId)
if DBM:UnitDebuff(uId, spellName) then
found = found + 1
if spellId == 210864 then
warnTwistingShadows:CombinedShow(0.1, self.vb.twistedCast, name)
if name == UnitName("player") then
specWarnTwistingShadows:Show()
specWarnTwistingShadows:Play("runout")
local _, _, _, _, _, expires = DBM:UnitDebuff("Player", spellName)
local debuffTime = expires - GetTime()
if debuffTime then
yellTwistingShadows:Schedule(debuffTime-1, 1)
yellTwistingShadows:Schedule(debuffTime-2, 2)
yellTwistingShadows:Schedule(debuffTime-3, 3)
end
end
else
warnNecroticVenom:CombinedShow(0.1, name)
if name == UnitName("player") then
specWarnNecroticVenom:Show()
specWarnNecroticVenom:Play("runout")
local _, _, _, _, _, expires = DBM:UnitDebuff("Player", spellName)
local debuffTime = expires - GetTime()
if debuffTime then
yellNecroticVenom:Schedule(debuffTime - 1, 1)
yellNecroticVenom:Schedule(debuffTime - 2, 2)
yellNecroticVenom:Schedule(debuffTime - 3, 3)
end
end
end
end
end
if found == 0 and scanTime < 6 then--Scan for 1.8 sec, not forever.
self:Schedule(1, findDebuff, self, spellName, spellId)
end
end
function mod:OnCombatStart(delay)
self.vb.venomCast = 0
self.vb.feedingTimeCast = 0
timerNecroticVenomCD:Start(12.2-delay, 1)
timerFeedingTimeCD:Start(15.5-delay, 1)
timerRocFormCD:Start(90-delay)--Some variation expected. I've seen 90-92. Always happens with energy based bosses
berserkTimer:Start(-delay)--540 heroic, other difficulties not confirmed
self.vb.platformCount = 1
self.vb.ViolentWindsPlat = false
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 212707 then
specWarnGatheringClouds:Show()
specWarnGatheringClouds:Play("aesoon")
elseif spellId == 210948 then
specWarnDarkStorm:Show(eyeOfStorm)
specWarnDarkStorm:Play("findshelter")
elseif spellId == 210547 then
self.vb.razorWingCast = self.vb.razorWingCast + 1
specWarnRazorWing:Show()
specWarnRazorWing:Play("carefly")
if self.vb.ViolentWindsPlat and self.vb.razorWingCast < 2 or self.vb.razorWingCast < 3 then
timerRazorWingCD:Start(self.vb.ViolentWindsPlat and 46 or 32.5, self.vb.razorWingCast+1)
end
elseif spellId == 215582 then
self.vb.talonsCast = self.vb.talonsCast + 1
local targetName, uId, bossuid = self:GetBossTarget(106087, true)
if self:IsTanking("player", bossuid, nil, true) then
specWarnRakingTalon:Show()
specWarnRakingTalon:Play("defensive")
end
if self.vb.ViolentWindsPlat and self.vb.talonsCast < 2 or self.vb.talonsCast < 3 then
timerRakingTalonsCD:Start(self.vb.ViolentWindsPlat and 46 or 32.5, self.vb.talonsCast+1)
end
elseif spellId == 210326 then--Spider Form
DBM:Debug("CLEU: Spider Form Cast")
elseif spellId == 210308 then--Roc Form
DBM:Debug("CLEU: Roc Form Cast")
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 210864 then
self.vb.twistedCast = self.vb.twistedCast + 1
--Only cast 4x per roc form (used to be 3, but roc form is 127 seconds now, up from like 97)
if self.vb.twistedCast == 1 then
timerTwistingShadowsCD:Start(40, 2)
elseif self.vb.twistedCast == 2 then
if self.vb.ViolentWindsPlat then
timerTwistingShadowsCD:Start(34, 3)
else
timerTwistingShadowsCD:Start(21.5, 3)
end
elseif self.vb.twistedCast == 3 then
if self.vb.ViolentWindsPlat then
timerTwistingShadowsCD:Start(24, 4)
else
timerTwistingShadowsCD:Start(32.5, 4)
end
end
self:Schedule(1, findDebuff, self, args.spellName, spellId)
elseif spellId == 215443 then
scanTime = 0
self.vb.venomCast = self.vb.venomCast + 1
self:Schedule(1, findDebuff, self, args.spellName, spellId)
if self.vb.venomCast < 4 then--Cast 4x per spider form
timerNecroticVenomCD:Start(nil, self.vb.venomCast+1)
end
elseif spellId == 218630 then
warnNightmareSpawn:Show()
timerNightmareSpawnCD:Start()
elseif spellId == 218124 then
self.vb.windsCast = self.vb.windsCast + 1
if self.vb.windsCast == 1 then
timerViolentWindsCD:Start()
end
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 212514 then
warnWebWrap:Show(args.destName)
elseif spellId == 218124 then--218144 is ID people helping to soak get, 218124 is only applied to current tank
local uId = DBM:GetRaidUnitId(args.destName)
if self:IsTanking(uId) then--Why I need a tank filter is beyond me but for some reason 218124 is MAGICALLY triggering on 218144
if args:IsPlayer() then
specViolentWinds:Show()
specViolentWinds:Play("justrun")
specViolentWinds:ScheduleVoice(1, "keepmove")
yellViolentWinds:Yell()
else
warnViolentWinds:Show(args.destName)
end
if self.Options.SetIconOnWinds then
self:SetIcon(args.destName, 5)
end
end
elseif spellId == 215582 then
if not args:IsPlayer() then--Player is not current target
specWarnRakingTalonOther:Show(args.destName)
specWarnRakingTalonOther:Play("tauntboss")
end
elseif spellId == 215300 then--215307 can also be used and technically is actually faster since it's first event in combat log, However 215300 is what BW uses and I want to make sure DMM repots it in same Order. Especially if they add icon options
if args.sourceGUID == playerGUID then
specWarnWebofPain:Show(args.destName)
specWarnWebofPain:Play("targetyou")
elseif args.destGUID == playerGUID then
specWarnWebofPain:Show(args.sourceName)
else
warnWebOfPain:Show(args.sourceName, args.destName)
end
if self.Options.SetIconOnWeb and self:IsInCombat() then
local uId = DBM:GetRaidUnitId(args.destName)
if self:IsTanking(uId) then--Tank Group
self:SetIcon(args.sourceName, 1)
self:SetIcon(args.destName, 2)
else--Non Tank Group
self:SetIcon(args.sourceName, 3)
self:SetIcon(args.destName, 4)
end
end
end
end
function mod:SPELL_AURA_APPLIED_DOSE(args)
local spellId = args.spellId
if spellId == 212512 and args:IsPlayer() then
local amount = args.amount or 1
if amount >= 5 then
specWarnWebWrap:Show(amount)
specWarnWebWrap:Play("stackhigh")
end
end
end
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 218124 then
if self.Options.SetIconOnWinds then
self:SetIcon(args.destName, 0)
end
elseif spellId == 218629 then
timerNightmareSpawnCD:Stop()
elseif (spellId == 215300 or spellId == 215307) then--Remove calls need both
if self.Options.SetIconOnWeb then
self:SetIcon(args.destName, 0)
end
end
end
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId)
if spellId == 213124 and destGUID == playerGUID and self:AntiSpam(2, 1) then
specWarnVenomousPool:Show()
specWarnVenomousPool:Play("runaway")
end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if spellId == 212364 then--Feeding Time
self.vb.feedingTimeCast = self.vb.feedingTimeCast + 1
specWarnFeedingTime:Show(self.vb.feedingTimeCast)
specWarnFeedingTime:Play("killmob")
if self.vb.feedingTimeCast < 2 then
timerFeedingTimeCD:Start(nil, 2)
end
elseif spellId == 226039 then--Bird Transform
DBM:Debug("Bird Transform Cast")
self.vb.platformCount = self.vb.platformCount + 1
self.vb.ViolentWindsPlat = false
self.vb.twistedCast = 0
self.vb.talonsCast = 0
self.vb.razorWingCast = 0
self.vb.windsCast = 0
warnRocForm:Show()
timerTwistingShadowsCD:Start(6.6, 1)
timerGatheringCloudsCD:Start()--15.8-16
timerDarkStormCD:Start()--26
timerSpiderFormCD:Start()
if self:IsMythic() and self.vb.platformCount == 2 then--Only happens platform 2, platform 4 (roc form second cast behaves like non mythic
self.vb.ViolentWindsPlat = true
timerViolentWindsCD:Start(56)--50 plus 6 second cast
timerRakingTalonsCD:Start(66, 1)
timerRazorWingCD:Start(73, 1)
else
timerRakingTalonsCD:Start(52, 1)
timerRazorWingCD:Start(59, 1)
end
elseif spellId == 226055 then--Spider Transform
DBM:Debug("Spider Transform Cast")
self.vb.platformCount = self.vb.platformCount + 1
self.vb.ViolentWindsPlat = false
self.vb.venomCast = 0
self.vb.feedingTimeCast = 0
timerRazorWingCD:Stop()
warnSpiderForm:Show()
timerNecroticVenomCD:Start(12.2, 1)
timerFeedingTimeCD:Start(15.5, 1)
timerRocFormCD:Start(92)
end
end