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.

475 lines
17 KiB

local mod = DBM:NewMod(1704, "DBM-Raids-Legion", 5, 768)
local L = mod:GetLocalizedStrings()
mod:SetRevision("20240428104720")
mod:SetCreatureID(102679)--Ysondre, 102683 (Emeriss), 102682 (Lethon), 102681 (Taerar)
mod:SetEncounterID(1854)
mod:SetUsedIcons(8, 7, 6, 5, 4, 3, 2, 1)
mod:SetHotfixNoticeRev(15407)
mod.respawnTime = 39
mod:RegisterCombat("combat")
mod:RegisterEventsInCombat(
"SPELL_CAST_START 203028 204767 205300 203817 203888 204100 204078 214540 207573",
"SPELL_CAST_SUCCESS 203787 205298 205329",
"SPELL_AURA_APPLIED 203102 203125 203124 203121 203110 203770 203787 204040",
"SPELL_AURA_APPLIED_DOSE 203102 203125 203124 203121",
"SPELL_AURA_REMOVED 203787 204040 203787",
-- "SPELL_DAMAGE",
-- "SPELL_MISSED",
"CHAT_MSG_RAID_BOSS_EMOTE",
"UNIT_SPELLCAST_SUCCEEDED boss1 boss2 boss3 boss4 boss5"
)
local Ysondre = DBM:EJ_GetSectionInfo(12768)
local Emeriss = DBM:EJ_GetSectionInfo(12770)
local Lethon = DBM:EJ_GetSectionInfo(12772)
local Taerar = DBM:EJ_GetSectionInfo(12774)
--(type = "begincast" or type = "cast" or type = "applybuff") and (source.name = "Taerar" or source.name = "Ysondre" or source.name = "Emeriss" or source.name = "Lethon")
--TODO, if only one volatile infection goes out at a time, hide general alert if player affected
--TODO, remove combined show from any warnings that are only one target
--TODO, when timers are more finalized add countdowns to more things.
--All
local warnSlumberingNightmare = mod:NewTargetAnnounce(203110, 4, nil, false)--An option to announce fuckups
local warnBreath = mod:NewSpellAnnounce(203028, 2)
--Ysondre
local warnCallDefiledSpirit = mod:NewSpellAnnounce(207573, 4)
local warnNightmareBlast = mod:NewSpellAnnounce(203153, 2)
--Emeriss
local warnVolatileInfection = mod:NewTargetAnnounce(203787, 3)
local warnEssenceOfCorruption = mod:NewSpellAnnounce(205298, 2)
--Lethon
local warnGloom = mod:NewSpellAnnounce(205329, 2)
local warnShadowBurst = mod:NewTargetAnnounce(204040, 3)
--All
local specWarnMark = mod:NewSpecialWarningStack("ej12809", nil, 7, nil, 2, 1, 6)
local specWarnDragon = mod:NewSpecialWarningTarget(204720, "Tank", nil, nil, 1, 2)
--Ysondre
--local specWarnNightmareBlast = mod:NewSpecialWarningSpell(203153, nil, nil, nil, 2)
local specWarnDefiledSpirit = mod:NewSpecialWarningYou(207573)
local yellSpirit = mod:NewYell(207573)
local specWarnDefiledVines = mod:NewSpecialWarningDispel(207573, "Healer", nil, nil, 1, 2)
local specWarnLumberingMindgorger = mod:NewSpecialWarningSwitch("ej13460", "-Dps", nil, nil, 1, 2)
local specWarnCollapsingNightmare = mod:NewSpecialWarningInterrupt(214540, "HasInterrupt", nil, nil, 1, 2)
--Emeriss
local specWarnVolatileInfection = mod:NewSpecialWarningMoveAway(203787, nil, nil, nil, 1, 2)
local yellVolatileInfection = mod:NewYell(203787)
local specWarnCorruptedBurst = mod:NewSpecialWarningDodge(203817, "Melee", nil, nil, 1, 2)
local specWarnCorruption = mod:NewSpecialWarningInterrupt(205300, "HasInterrupt", nil, nil, 1, 2)
--Lethon
local specWarnSiphonSpirit = mod:NewSpecialWarningSwitch(203888, "Dps", nil, nil, 3, 2)
local specWarnShadowBurst = mod:NewSpecialWarningYou(204040, nil, nil, nil, 1, 2)
local yellShadowBurst = mod:NewFadesYell(204040, nil, false, 2)
--Taerar
local specWarnShadesOfTaerar = mod:NewSpecialWarningSwitch(204100, "Tank", nil, nil, 1, 2)
local specWarnBellowingRoar = mod:NewSpecialWarningSpell(204078, nil, nil, nil, 2, 6)
--All
local timerMarkCD = mod:NewNextTimer(7, "ej12809", 28836, false, 2, 3, 203102)--Now off by default, to further reduce timer clutter, plus sometimes it's wrong because in rare cases the dragons desync for some reason
local timerBreathCD = mod:NewCDSourceTimer(27, 203028, 21131, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON)--27-34 for Ysondre, Cohorts 27-29.
--Ysondre
mod:AddTimerLine(Ysondre)
local timerNightmareBlastCD = mod:NewCDTimer(15, 203153, nil, "-Tank", nil, 3)--15-20
local timerDefiledSpiritCD = mod:NewCDTimer(33.2, 207573, nil, nil, nil, 3)
--Emeriss
mod:AddTimerLine(Emeriss)
local timerVolatileInfectionCD = mod:NewCDTimer(45.4, 203787, nil, "-Tank", 2, 3)
local timerEssenceOfCorruptionCD = mod:NewNextTimer(30, 205298, nil, nil, nil, 1)
--Lethon
mod:AddTimerLine(Lethon)
local timerSiphonSpiritCD = mod:NewNextTimer(49.9, 203888, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)
local timerShadowBurstCD = mod:NewNextTimer(14.5, 204040, nil, nil, nil, 3)--Air
--Taerar
mod:AddTimerLine(Taerar)
local timerShadesOfTaerarCD = mod:NewNextTimer(48.5, 204100, nil, "-Healer", nil, 1, nil, nil, nil, 1, 4)
local timerSeepingFogCD = mod:NewCDTimer(15.5, 205341, nil, false, 2, 3, 24814)--Spawn pretty often, and timers don't help dodge, so now off by default
local timerBellowingRoarCD = mod:NewCDTimer(44.5, 204078, 118699, nil, nil, 2)--Air
mod:AddRangeFrameOption(10, 203787)
mod:AddSetIconOption("SetIconOnInfection", 203787, false)
mod:AddSetIconOption("SetIconOnOozes", 205298, false, 5)
mod:AddInfoFrameOption("ej12809")
mod.vb.volatileInfectionIcon = 1
mod.vb.alternateOozes = false
local activeBossGUIDS = {}
local spellName1, spellName2, spellName3, spellName4 = DBM:GetSpellName(203102), DBM:GetSpellName(203125), DBM:GetSpellName(203124), DBM:GetSpellName(203121)
local function whoDatUpThere(self)
local emerissFound = false
local lethonFound = false
local taerarFound = false
for i = 1, 5 do
local bossUID = "boss"..i
if UnitExists(bossUID) then--if they are in air they won't exist.
local cid = self:GetUnitCreatureId(bossUID)
if cid == 102683 then -- Emeriss
emerissFound = true
elseif cid == 102682 then -- Lethon
lethonFound = true
elseif cid == 102681 then -- Taerar
taerarFound = true
end
end
end
--Subtracking 2 from all timers do to delay
if not emerissFound then -- Emeriss
end
if not lethonFound then -- Lethon
timerShadowBurstCD:Start(12.6)
end
if not taerarFound then -- Taerar
timerBellowingRoarCD:Start(43)
end
end
--Probably broken with recent infoframe changes, needs code review
local updateInfoFrame
do
-- local playerName = UnitName("player")
local lines = {}
local floor = math.floor
updateInfoFrame = function()
table.wipe(lines)
local playersWithTwo = false
for uId in DBM:GetGroupMembers() do
local debuffCount = 0
local text = ""
if DBM:UnitDebuff(uId, spellName1) then
debuffCount = debuffCount + 1
local _, _, stackCount, _, _, expires = DBM:UnitDebuff(uId, spellName1)
if expires == 0 then
text = SPELL_FAILED_OUT_OF_RANGE
else
local debuffTime = expires - GetTime()
text = tostring(floor(debuffTime))
end
end
if DBM:UnitDebuff(uId, spellName2) then
debuffCount = debuffCount + 1
local _, _, stackCount, _, _, expires = DBM:UnitDebuff(uId, spellName2)
if expires == 0 then
text = SPELL_FAILED_OUT_OF_RANGE
else
local debuffTime = expires - GetTime()
text = text..", "..floor(debuffTime)
end
end
if DBM:UnitDebuff(uId, spellName3) then
debuffCount = debuffCount + 1
local _, _, stackCount, _, _, expires = DBM:UnitDebuff(uId, spellName3)
if expires == 0 then
text = SPELL_FAILED_OUT_OF_RANGE
else
local debuffTime = expires - GetTime()
text = text..", "..floor(debuffTime)
end
end
if DBM:UnitDebuff(uId, spellName4) then
debuffCount = debuffCount + 1
local _, _, stackCount, _, _, expires = DBM:UnitDebuff(uId, spellName4)
if expires == 0 then
text = SPELL_FAILED_OUT_OF_RANGE
else
local debuffTime = expires - GetTime()
text = text..", "..floor(debuffTime)
end
end
if debuffCount > 1 then
playersWithTwo = true
lines[UnitName(uId)] = text
end
end
if not playersWithTwo then
--No players with two, show generic stats
--Do stuff
lines[ALL] = OKAY
end
return lines
end
end
function mod:OnCombatStart(delay)
self.vb.volatileInfectionIcon = 1
self.vb.alternateOozes = false
table.wipe(activeBossGUIDS)
self:RegisterShortTermEvents(
"INSTANCE_ENCOUNTER_ENGAGE_UNIT"--We register here to make sure we wipe vb.on pull
)
timerBreathCD:Start(15.5, Ysondre)
timerDefiledSpiritCD:Start(30-delay)
timerNightmareBlastCD:Start(40-delay)--40 on mythic, it changing on heroic too is assumed. Was 22.5 before
if self:IsMythic() then
--Only done on mythic for now since we know for sure what dragons are up once we know what dragons are down.
--On non mythic one dragon is missing from encounter and we have no way of knowing what one currently :\
self:Schedule(2, whoDatUpThere, self)
end
if self.Options.InfoFrame and not self:IsLFR() then
DBM.InfoFrame:SetHeader(DBM:EJ_GetSectionInfo(12809))
DBM.InfoFrame:Show(5, "function", updateInfoFrame)
end
end
function mod:OnCombatEnd()
self:UnregisterShortTermEvents()
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 == 203028 or spellId == 204767 then--204767 is weaker version used by Shade of Taerar
local targetName, uId, bossuid = self:GetBossTarget(args.sourceGUID)
if not bossuid then
DBM:Debug("GetBossTarget failed, no bossuid")
return
end
if self:IsTanking("player", bossuid, nil, true) then
warnBreath:Show()
end
if args:GetSrcCreatureID() ~= 103145 then--Filter shades
timerBreathCD:Start(27, args.sourceName)
end
elseif spellId == 207573 then
warnCallDefiledSpirit:Show()
self:SendSync("DefiledSpirit")
elseif spellId == 205300 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnCorruption:Show(args.sourceName)
specWarnCorruption:Play("kickcast")
elseif spellId == 214540 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnCollapsingNightmare:Show(args.sourceName)
specWarnCollapsingNightmare:Play("kickcast")
elseif spellId == 203817 and self:AntiSpam(5, 6) then
specWarnCorruptedBurst:Show()
specWarnCorruptedBurst:Play("watchstep")
elseif spellId == 203888 then
specWarnSiphonSpirit:Show()
specWarnSiphonSpirit:Play("killspirit")
self:SendSync("SiphonSpirit")
elseif spellId == 204100 then
specWarnShadesOfTaerar:Show()
specWarnShadesOfTaerar:Play("mobsoon")
self:SendSync("Shades")
elseif spellId == 204078 then
specWarnBellowingRoar:Show()
specWarnBellowingRoar:Play("fearsoon")
self:SendSync("Fear")
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 203787 then
self:SendSync("Infection")
elseif spellId == 205298 then
warnEssenceOfCorruption:Show()
timerEssenceOfCorruptionCD:Start()
if self.Options.SetIconOnOozes then
if self.vb.alternateOozes then
--6 and 5 used
self:ScanForMobs(103691, 0, 6, 2, nil, 10, "SetIconOnOozes")
else
--8 and 7 used
self:ScanForMobs(103691, 0, 8, 2, nil, 10, "SetIconOnOozes")
end
end
self.vb.alternateOozes = not self.vb.alternateOozes
elseif spellId == 205329 then
warnGloom:Show()
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if (spellId == 203102 or spellId == 203125 or spellId == 203124 or spellId == 203121) and args:IsPlayer() then
local amount = args.amount or 1
if amount >= 7 then
specWarnMark:Show(amount)
specWarnMark:Play("stackhigh")
end
if self:AntiSpam(5, 2) then
if self:IsMythic() then
timerMarkCD:Start()
elseif self:IsHeroic() then
timerMarkCD:Start(8)
elseif self:IsNormal() then
timerMarkCD:Start(10)
else
timerMarkCD:Start(12)
end
end
elseif spellId == 203110 then
warnSlumberingNightmare:CombinedShow(0.5, args.destName)
elseif spellId == 203770 then
specWarnDefiledVines:CombinedShow(0.5, args.destName)
if self:AntiSpam(2, 1) then
specWarnDefiledVines:Play("helpdispel")
end
elseif spellId == 203787 then
warnVolatileInfection:CombinedShow(0.5, args.destName)
if args:IsPlayer() then
specWarnVolatileInfection:Show()
yellVolatileInfection:Yell()
specWarnVolatileInfection:Play("scatter")
if self.Options.RangeFrame then
DBM.RangeCheck:Show(10)
end
end
if self.Options.SetIconOnInfection then
self:SetIcon(args.destName, self.vb.volatileInfectionIcon)
end
self.vb.volatileInfectionIcon = self.vb.volatileInfectionIcon + 1
if self.vb.volatileInfectionIcon > 4 then
self.vb.volatileInfectionIcon = 1
end
elseif spellId == 204040 then
warnShadowBurst:CombinedShow(1, args.destName)
if self:AntiSpam(5, 5) then
timerShadowBurstCD:Start()
end
if args:IsPlayer() then
specWarnShadowBurst:Show()
yellShadowBurst:Schedule(5, 1)
yellShadowBurst:Schedule(4, 2)
yellShadowBurst:Schedule(3, 3)
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 203787 and args:IsPlayer() and self.Options.RangeFrame then
DBM.RangeCheck:Hide()
elseif spellId == 204040 and args:IsPlayer() then
yellShadowBurst:Cancel()
elseif spellId == 203787 and self.Options.SetIconOnInfection then
self:SetIcon(args.destName, 0)
end
end
--this should work for both pull and any of them landing from air, well assuming the timers in both situations are same
function mod:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
for i = 1, 5 do
local unitID = "boss"..i
local unitGUID = UnitGUID(unitID)
if unitGUID and UnitExists(unitID) and not activeBossGUIDS[unitGUID] then
activeBossGUIDS[unitGUID] = true
local bossName = UnitName(unitID)
local cid = self:GetUnitCreatureId(unitID)
--Subtracking .5 from all timers do to slight delay in IEEU vs ENCOUNTER_START
if cid == 102683 then -- Emeriss
timerBreathCD:Start(15.5, bossName)
timerVolatileInfectionCD:Start(19.5)
timerEssenceOfCorruptionCD:Start(29.5)
elseif cid == 102682 then -- Lethon
timerShadowBurstCD:Stop()
timerBreathCD:Start(13, bossName)
timerSiphonSpiritCD:Start(20.5)
elseif cid == 102681 then -- Taerar
timerBellowingRoarCD:Stop()
timerBreathCD:Start(17, bossName)
timerShadesOfTaerarCD:Start(19.5)--19.5-21
timerSeepingFogCD:Start(25)
end
self:SendSync("IEEU", bossName, unitGUID)
end
end
end
--"<38.03 01:01:06> [CHAT_MSG_RAID_BOSS_EMOTE] |TInterface\\Icons\\sha_ability_rogue_envelopingshadows_nightmare:20|tA Lumbering Mindgorger forms in the mists of The Hinterlands!#Ysondre#####0#0##0#1
function mod:CHAT_MSG_RAID_BOSS_EMOTE(msg, _, _, _, targetname)
if msg:find("sha_ability_rogue_envelopingshadows_nightmare") then
specWarnLumberingMindgorger:Show()
specWarnLumberingMindgorger:Play("bigmob")
end
end
local function delayedClear(self, GUID)
activeBossGUIDS[GUID] = nil
end
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
if spellId == 203147 then--Nightmare Blast
warnNightmareBlast:Show()
timerNightmareBlastCD:Start()
elseif spellId == 205331 then--Seeping Fog
timerSeepingFogCD:Start()
elseif spellId == 204720 then--Aeriel
local unitGUID = UnitGUID(uId)
local bossName = UnitName(uId)
self:SendSync("Aeriel", bossName, unitGUID)
end
end
--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId)
if spellId == 205611 and destGUID == UnitGUID("player") and self:AntiSpam(2, 1) then
-- specWarnMiasma:Show()
-- specWarnMiasma:Play("runaway")
end
end
mod.SPELL_ABSORBED = mod.SPELL_PERIODIC_DAMAGE
--]]
function mod:OnSync(msg, targetName, guid)
if not self:IsInCombat() then return end
if guid and msg == "Aeriel" then
local cid = self:GetCIDFromGUID(guid)
specWarnDragon:Show(targetName)
self:Schedule(10, delayedClear, self, guid)
timerBreathCD:Stop(targetName)
if cid == 102683 then--Emeriss
timerVolatileInfectionCD:Stop()
timerEssenceOfCorruptionCD:Stop()
elseif cid == 102682 then--Lethon
timerSiphonSpiritCD:Stop()
if not self:IsEasy() then
timerShadowBurstCD:Start(19.5)
end
elseif cid == 102681 then--Taerar
timerShadesOfTaerarCD:Stop()
timerSeepingFogCD:Stop()
if not self:IsEasy() then
timerBellowingRoarCD:Start(44.5)
end
end
elseif guid and msg == "IEEU" and not activeBossGUIDS[guid] then
activeBossGUIDS[guid] = true
local cid = self:GetCIDFromGUID(guid)
--Subtracking .5 from all timers do to slight delay in IEEU vs ENCOUNTER_START
if cid == 102683 then -- Emeriss
timerBreathCD:Start(17, targetName)
timerVolatileInfectionCD:Start(19.5)
timerEssenceOfCorruptionCD:Start(29.5)
elseif cid == 102682 then -- Lethon
timerShadowBurstCD:Stop()
timerBreathCD:Start(13, targetName)
timerSiphonSpiritCD:Start(20.5)
elseif cid == 102681 then -- Taerar
timerBellowingRoarCD:Stop()
timerBreathCD:Start(17, targetName)
timerShadesOfTaerarCD:Start(19.5)--19.5-21
timerSeepingFogCD:Start(25)
end
elseif msg == "Shades" then
timerShadesOfTaerarCD:Start()
elseif msg == "Fear" then
timerBellowingRoarCD:Start()
elseif msg == "SiphonSpirit" then
timerSiphonSpiritCD:Start()
elseif msg == "DefiledSpirit" then
timerDefiledSpiritCD:Start()
elseif msg == "Infection" then
timerVolatileInfectionCD:Start()
end
end