local mod = DBM:NewMod(2535, "DBM-Party-Dragonflight", 9, 1209) local L = mod:GetLocalizedStrings() mod:SetRevision("20230712012906") mod.multiIDSingleBoss = true mod:SetCreatureID(198997, 201792, 201788, 201790)--It's technically just one creature animated 3 others, but checkbossHp will query all and return highest health for boss health percent mod:SetEncounterID(2668) --mod:SetUsedIcons(1, 2, 3) --mod:SetBossHPInfoToHighest()--may not be needed due to shared/synced health pools mod:SetHotfixNoticeRev(20230711000000) mod:SetMinSyncRevision(20230704000000) --mod.respawnTime = 29 --mod.sendMainBossGUID = true--sendMainBossGUID is not sent because of stage 3 split mod:RegisterCombat("combat") mod:RegisterEventsInCombat( "SPELL_CAST_START 408029 406886 407159 408141", "SPELL_CAST_SUCCESS 408029 407978", "SPELL_AURA_APPLIED 407147 415097 415114 407406 418346", -- "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED 407406" -- "SPELL_PERIODIC_DAMAGE", -- "SPELL_PERIODIC_MISSED", -- "UNIT_SPELLCAST_SUCCEEDED boss1" ) --[[ (ability.id = 406886 or ability.id = 407159 or ability.id = 408029 or ability.id = 408141) and type = "begincast" or ability.id = 407978 and type = "cast" or ability.id = 415097 or ability.id = 415114 or (source.type = "NPC" and source.firstSeen = timestamp) and (source.id = 201792 or source.id = 201788 or source.id = 201790) or (target.type = "NPC" and target.firstSeen = timestamp) and (target.id = 201792 or target.id = 201788 or target.id = 201790) or type = "death" and (target.id = 201792 or target.id = 201788 or target.id = 201790) or type = "dungeonencounterstart" or type = "dungeonencounterend" --TODO, maybe target scan frost to be slightly faster? Can also use applied of 408084 but that's even slower than success --TODO, Possibly transition stages on REMOVED not applied? --TODO, attach GUID to timers in a way that's compat with multi target --TODO, need much longer logs to fix many of timers again --]] local warnCorrosion = mod:NewTargetNoFilterAnnounce(407406, 3) local warnCorruptedMind = mod:NewTargetNoFilterAnnounce(418346, 4) local specWarnCorrosiveInfusion = mod:NewSpecialWarningDodgeCount(406886, nil, nil, nil, 1, 2) local specWarnCorrosion = mod:NewSpecialWarningYou(407406, nil, nil, nil, 1, 2) local yellCorrosion = mod:NewYell(407406) local yellCorrosionFades = mod:NewShortFadesYell(407406, nil, nil, nil, "YELL")--WHen countdown shows, it needs to be passed, so it's a share yell not an avoid one, IE red text local specWarnCorrosionClear = mod:NewSpecialWarningMoveTo(407406, nil, nil, nil, 1, 2) local specWarnReclamation = mod:NewSpecialWarningCount(407159, nil, nil, nil, 2, 2) local specWarnNecroticWinds = mod:NewSpecialWarningDodgeCount(407978, nil, nil, nil, 1, 2) local specWarnNecrofrost = mod:NewSpecialWarningSwitchCount(408029, "Dps", nil, nil, 1, 2) local yellNecrofrost = mod:NewYell(408029, nil, nil, nil, "YELL") local specWarnIncinBlightBreath = mod:NewSpecialWarningDodgeCount(408141, nil, nil, nil, 1, 2) local specWarnGTFO = mod:NewSpecialWarningGTFO(407147, nil, nil, nil, 1, 8) local timerCorrosiveInfusionCD = mod:NewCDCountTimer(19.4, 386173, nil, nil, nil, 3) local timerBlightReclamationCD = mod:NewCDCountTimer(19.4, 407159, nil, nil, nil, 5, nil, DBM_COMMON_L.TANK_ICON) local timerNecroticWindsCD = mod:NewCDCountTimer(19.4, 407978, nil, nil, nil, 2) local timerNecrofrostCD = mod:NewCDCountTimer(19.4, 408029, nil, nil, nil, 3, nil, DBM_COMMON_L.DAMAGE_ICON) local timerIncineratingBlightbreathCD = mod:NewCDCountTimer(19.4, 408141, nil, nil, nil, 3) --mod:AddInfoFrameOption(391977, true) mod.vb.corrosiveCount = 0 mod.vb.reclaimCount = 0 mod.vb.windsCount = 0--Reused for necrofrost mod.vb.fireBreathCount = 0 function mod:OnCombatStart(delay) self.vb.corrosiveCount = 0 self.vb.reclaimCount = 0 self.vb.windsCount = 0 self.vb.fireBreathCount = 0 self:SetStage(1) timerCorrosiveInfusionCD:Start(4.5-delay, 1) timerBlightReclamationCD:Start(14.2-delay, 1) end --function mod:OnCombatEnd() -- if self.Options.RangeFrame then -- DBM.RangeCheck:Hide() -- end -- if self.Options.InfoFrame then -- DBM.InfoFrame:Hide() -- end --end local function checkDebuffPass(self) --Next pass is to tank if timerBlightReclamationCD:GetRemaining(self.vb.reclaimCount+1) < 6 then --Have debuff, and not the tank, and debuff will expire after next Blight Reclamation, it should go to the tank if not self:IsTanking("player", "boss1", nil, true) then specWarnCorrosionClear:Show(DBM_COMMON_L.TANK) specWarnCorrosionClear:Play("movetotank") end --Next pass is NOT to tank else --No tank check, because this condition will run if 5 seconds left on debuff but > 5 seconds til breath, so tank has to pass it too specWarnCorrosionClear:Show(DBM_COMMON_L.ALLY) specWarnCorrosionClear:Play("gathershare")--Will be changed to "passdebuff" or something later? end end function mod:SPELL_CAST_START(args) local spellId = args.spellId if spellId == 406886 then self.vb.corrosiveCount = self.vb.corrosiveCount + 1 specWarnCorrosiveInfusion:Show(self.vb.corrosiveCount) specWarnCorrosiveInfusion:Play("watchstep") local timer if self:GetStage(1) then timer = 17 elseif self:GetStage(2) then timer = 31.5 else--Stage 3 timer = 63.1 --Update min timers on abilities affected by this if timerIncineratingBlightbreathCD:GetRemaining(self.vb.fireBreathCount+1) < 8 then local elapsed, total = timerIncineratingBlightbreathCD:GetTime(self.vb.fireBreathCount+1) local extend = 8 - (total-elapsed) DBM:Debug("timerIncineratingBlightbreathCD extended by: "..extend, 2) timerIncineratingBlightbreathCD:Update(elapsed, total+extend, self.vb.fireBreathCount+1) end if timerNecrofrostCD:GetRemaining(self.vb.windsCount+1) < 15.7 then local elapsed, total = timerNecrofrostCD:GetTime(self.vb.windsCount+1) local extend = 15.7 - (total-elapsed) DBM:Debug("timerNecrofrostCD extended by: "..extend, 2) timerNecrofrostCD:Update(elapsed, total+extend, self.vb.windsCount+1) end end timerCorrosiveInfusionCD:Start(timer, self.vb.corrosiveCount+1) elseif spellId == 407159 then self.vb.reclaimCount = self.vb.reclaimCount + 1 specWarnReclamation:Show(self.vb.reclaimCount) specWarnReclamation:Play("shockwave")--Shockwave used so it doesn't use same voice as other breath local timer if self:GetStage(1) then timer = 17 elseif self:GetStage(2) then timer = 31.5 --rule only applies to stage 2. If time left on corrosive is less than 9.7, it's extended. this is what causes it to be 34 instead of 31.5 sometimes if timerIncineratingBlightbreathCD:GetRemaining(self.vb.corrosiveCount+1) < 9.7 then local elapsed, total = timerIncineratingBlightbreathCD:GetTime(self.vb.corrosiveCount+1) local extend = 9.7 - (total-elapsed) DBM:Debug("timerIncineratingBlightbreathCD extended by: "..extend, 2) timerIncineratingBlightbreathCD:Update(elapsed, total+extend, self.vb.corrosiveCount+1) end else timer = 63.1--Not verfied yet, assumed cause it looks same as corrosive end timerBlightReclamationCD:Start(timer, self.vb.reclaimCount+1) if self.vb.reclaimCount == 2 then--To verify the 63.1 DBM:AddMsg("If you are logging this fight, please share log on DBM discord because you saw at least 2 reclamation casts in stage 3") end elseif spellId == 408029 then self.vb.windsCount = self.vb.windsCount + 1 --The timers that are delayed will be auto corrected by Corrosive cast timerNecrofrostCD:Start(19.4, self.vb.windsCount+1) elseif spellId == 408141 then self.vb.fireBreathCount = self.vb.fireBreathCount + 1 specWarnIncinBlightBreath:Show(self.vb.fireBreathCount) specWarnIncinBlightBreath:Play("breathsoon") --The timers that are delayed will be auto corrected by Corrosive cast timerIncineratingBlightbreathCD:Start(17.1, self.vb.fireBreathCount+1) end end function mod:SPELL_CAST_SUCCESS(args) local spellId = args.spellId if spellId == 408029 then if args:IsPlayer() then yellNecrofrost:Yell() else specWarnNecrofrost:Show(self.vb.windsCount) specWarnNecrofrost:Play("targetchange") end elseif spellId == 407978 then self.vb.windsCount = self.vb.windsCount + 1 specWarnNecroticWinds:Show(self.vb.windsCount) specWarnNecroticWinds:Play("aesoon") specWarnNecroticWinds:ScheduleVoice(1.5, "watchstep") timerNecroticWindsCD:Start(31.5, self.vb.windsCount+1) end end function mod:SPELL_AURA_APPLIED(args) local spellId = args.spellId if spellId == 407147 and args:IsPlayer() and self:AntiSpam(3, 2) then specWarnGTFO:Show(args.spellName) specWarnGTFO:Play("watchfeet") elseif spellId == 415097 then--Malignant Transferal (stage 2) self:SetStage(2) self.vb.corrosiveCount = 0 self.vb.reclaimCount = 0 timerCorrosiveInfusionCD:Stop() timerBlightReclamationCD:Stop() --Starting here is less accurate than spell aura removed, causes ~1.5 variance timerCorrosiveInfusionCD:Start(9.7, 1) timerNecroticWindsCD:Start(19.4, 1) timerBlightReclamationCD:Start(34, 1) elseif spellId == 415114 then--Malignant Transferal (stage 2) self:SetStage(3) self.vb.corrosiveCount = 0 self.vb.reclaimCount = 0 self.vb.windsCount = 0 timerCorrosiveInfusionCD:Stop() timerBlightReclamationCD:Stop() timerNecroticWindsCD:Stop() --Starting here is less accurate than spell aura removed, causes ~1.5 variance timerCorrosiveInfusionCD:Start(17.8, 1) timerIncineratingBlightbreathCD:Start(26.8, 1) timerNecrofrostCD:Start(34.7, 1) timerBlightReclamationCD:Start(67.5, 1) elseif spellId == 407406 then if args:IsPlayer() then specWarnCorrosion:Show() specWarnCorrosion:Play("targetyou") yellCorrosion:Yell() yellCorrosionFades:Countdown(spellId, 3) self:Unschedule(checkDebuffPass) self:Schedule(7, checkDebuffPass, self)--Check pass conditions 5 seconds til expire else warnCorrosion:Show(args.destName) end elseif spellId == 418346 then warnCorruptedMind:Show(args.destName) end end --mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED function mod:SPELL_AURA_REMOVED(args) local spellId = args.spellId if spellId == 407406 then if args:IsPlayer() then yellCorrosionFades:Cancel() self:Unschedule(checkDebuffPass) end end end --[[ function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName) if spellId == 386201 and destGUID == UnitGUID("player") and self:AntiSpam(2, 4) then specWarnGTFO:Show(spellName) specWarnGTFO:Play("watchfeet") end end mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE --]] --[[ function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId) if spellId == 353193 then end end --]]