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.
329 lines
13 KiB
329 lines
13 KiB
local mod = DBM:NewMod(1750, "DBM-Raids-Legion", 5, 768)
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision("20240616044104")
|
|
mod:SetCreatureID(104636)
|
|
mod:SetEncounterID(1877)
|
|
mod:SetUsedIcons(8, 7, 6, 5, 4)
|
|
mod:SetHotfixNoticeRev(15557)
|
|
mod.respawnTime = 30
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
mod:RegisterEventsInCombat(
|
|
"SPELL_CAST_START 212726 212630 211073 211368 214529 213162 214249 226821",
|
|
"SPELL_CAST_SUCCESS 214529 211471 212726",
|
|
"SPELL_AURA_APPLIED 210346 211368 211471",
|
|
"SPELL_AURA_APPLIED_DOSE 210279",
|
|
"SPELL_AURA_REMOVED 210346",
|
|
"UNIT_DIED",
|
|
"UNIT_SPELLCAST_SUCCEEDED boss1 boss2 boss3 boss4 boss5",
|
|
"UNIT_AURA player"
|
|
)
|
|
|
|
--Cenarius
|
|
local warnNightmareBrambles = mod:NewTargetAnnounce(210290, 2)
|
|
local warnPhase2 = mod:NewPhaseAnnounce(2, 2, nil, nil, nil, nil, nil, 2)
|
|
----Forces of Nightmare
|
|
local warnDesiccatingStomp = mod:NewCastAnnounce(211073, 3, nil, nil, true, 2)--Basic warning for now, will change to special if needed
|
|
local warnRottenBreath = mod:NewTargetAnnounce(211192, 2)
|
|
local warnScornedTouch = mod:NewTargetAnnounce(211471, 3)
|
|
--Malfurion Stormrage
|
|
local warnCleansingGround = mod:NewCastAnnounce(212630, 1)
|
|
|
|
--Cenarius
|
|
local specWarnCreepingNightmares = mod:NewSpecialWarningStack(210279, nil, 16, nil, 2, 1, 6)--Stack warning subject to tuning
|
|
local yellNightmareBrambles = mod:NewYell(210290, L.BrambleYell)
|
|
local specWarnNightmareBramblesNear = mod:NewSpecialWarningClose(210290, nil, nil, nil, 1, 2)
|
|
local specWarnNightmareBlast = mod:NewSpecialWarningDefensive(213162, nil, nil, nil, 1, 2)
|
|
local specWarnNightmareBlastOther = mod:NewSpecialWarningTaunt(213162, nil, nil, nil, 1, 2)
|
|
local specWarnForcesOfNightmare = mod:NewSpecialWarningSwitchCount(212726, nil, nil, nil, 1, 2)--Switch warning or just spell warning?
|
|
local specWarnSpearOfNightmares = mod:NewSpecialWarningDefensive(214529, nil, nil, nil, 1, 2)
|
|
local specWarnSpearOfNightmaresOther= mod:NewSpecialWarningTaunt(214529, nil, nil, nil, 1, 2)
|
|
local specWarnSpearOfNightmaresMelee= mod:NewSpecialWarningRun(214529, nil, nil, nil, 4, 2)
|
|
local specWarnEntangledNightmares = mod:NewSpecialWarningSwitch(214505, "Dps", nil, nil, 1, 2)
|
|
local specWarnBeastsOfNightmare = mod:NewSpecialWarningDodge(214876, nil, nil, nil, 2, 2)
|
|
----Forces of Nightmare
|
|
local yellRottenBreath = mod:NewYell(211192)
|
|
local specWarnTouchofLife = mod:NewSpecialWarningInterrupt(211368, "HasInterrupt")
|
|
local specWarnTouchofLifeDispel = mod:NewSpecialWarningDispel(211368, "MagicDispeller")
|
|
local specWarnScornedTouch = mod:NewSpecialWarningMoveAway(211471, nil, nil, nil, 3, 2)
|
|
local yellScornedTouch = mod:NewYell(211471)
|
|
|
|
--Cenarius
|
|
mod:AddTimerLine(L.name)
|
|
local timerNightmareBramblesCD = mod:NewCDTimer(30, 210290, nil, "-Tank", 2, 3, nil, nil, nil, 3, 4)--On for all, for now. Doesn't target melee but melee still have to be aware. Just not AS aware.
|
|
local timerDreadThornsCD = mod:NewCDTimer(34, 210346, nil, false, 3, 5, nil, DBM_COMMON_L.TANK_ICON)--Optional but off by default
|
|
local timerNightmareBlastCD = mod:NewNextTimer(32.5, 213162, nil, "Tank", nil, 5, nil, DBM_COMMON_L.TANK_ICON, nil, 2, 4)
|
|
local timerForcesOfNightmareCD = mod:NewCDCountTimer(77.6, 212726, nil, nil, nil, 1, nil, nil, nil, 1, 4)--77.8-80
|
|
local timerSpearOfNightmaresCD = mod:NewCDTimer(18.2, 214529, nil, "Melee|Healer", 3, 5, nil, DBM_COMMON_L.TANK_ICON, nil, 2, 4)
|
|
local timerBeastsOfNightmareCD = mod:NewCDTimer(30, 214876, nil, nil, 2, 3, nil, DBM_COMMON_L.DEADLY_ICON)
|
|
local timerEntanglingNightmareCD = mod:NewNextTimer(51, 214505, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)
|
|
----Malfurion
|
|
local timerCleansingGroundCD = mod:NewNextTimer(77, 214249, nil, nil, nil, 3)--Phase 2 version only for now. Not sure if cast more than once though?
|
|
----Forces of Nightmare
|
|
mod:AddTimerLine(DBM_COMMON_L.ADDS)
|
|
local timerScornedTouchCD = mod:NewCDTimer(20.7, 211471, nil, nil, nil, 3, nil, DBM_COMMON_L.DEADLY_ICON)
|
|
local timerTouchofLifeCD = mod:NewCDTimer(15, 211368, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
|
|
local timerRottenBreathCD = mod:NewCDTimer(24.3, 211192, nil, nil, nil, 3)
|
|
local timerDisiccatingStompCD = mod:NewCDTimer(32, 211073, nil, nil, nil, 2, nil, DBM_COMMON_L.HEALER_ICON)
|
|
|
|
mod:AddRangeFrameOption(8, 211471)
|
|
mod:AddSetIconOption("SetIconOnWisps", "ej13348", false, 5)
|
|
mod:AddInfoFrameOption(210279)
|
|
|
|
mod.vb.phase = 1
|
|
mod.vb.addsCount = 0
|
|
mod.vb.sisterCount = 0
|
|
local scornedWarned = false
|
|
local seenMobs = {}
|
|
local debuffName, infoframeName = DBM:GetSpellName(211471), DBM:GetSpellName(210279)
|
|
|
|
function mod:BreathTarget(targetname, uId)
|
|
if not targetname then return end
|
|
warnRottenBreath:Show(targetname)
|
|
if targetname == UnitName("player") then
|
|
yellRottenBreath:Yell()
|
|
end
|
|
end
|
|
|
|
function mod:OnCombatStart(delay)
|
|
scornedWarned = false
|
|
table.wipe(seenMobs)
|
|
self.vb.phase = 1
|
|
self.vb.addsCount = 0
|
|
self.vb.sisterCount = 0
|
|
timerForcesOfNightmareCD:Start(7.2-delay, 1)--7.2-8.6
|
|
timerDreadThornsCD:Start(14-delay)
|
|
timerNightmareBramblesCD:Start(27.5-delay)--Cast finish.
|
|
if self:IsMythic() then
|
|
timerNightmareBlastCD:Start(30.5-delay)
|
|
end
|
|
self:RegisterShortTermEvents(
|
|
"INSTANCE_ENCOUNTER_ENGAGE_UNIT"
|
|
)
|
|
if self.Options.InfoFrame and not self:IsLFR() then
|
|
DBM.InfoFrame:SetHeader(infoframeName)
|
|
DBM.InfoFrame:Show(8, "playerdebuffstacks", infoframeName)
|
|
end
|
|
end
|
|
|
|
function mod:OnCombatEnd()
|
|
self:UnregisterShortTermEvents()
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
--DBM:AddMsg(L.BrambleMessage)
|
|
if self.Options.InfoFrame then
|
|
DBM.InfoFrame:Hide()
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
local spellId = args.spellId
|
|
if spellId == 212726 then
|
|
self.vb.addsCount = self.vb.addsCount + 1
|
|
specWarnForcesOfNightmare:Show(self.vb.addsCount)
|
|
specWarnForcesOfNightmare:Play("mobsoon")
|
|
timerForcesOfNightmareCD:Start(nil, self.vb.addsCount+1)
|
|
elseif spellId == 212630 or spellId == 214249 then--214249 is phase 2
|
|
warnCleansingGround:Show()
|
|
elseif (spellId == 211073 or spellId == 226821) and self:AntiSpam(10, args.sourceGUID) then
|
|
warnDesiccatingStomp:Show()
|
|
if self:IsMythic() then
|
|
timerDisiccatingStompCD:Start(29, args.sourceGUID)
|
|
else
|
|
timerDisiccatingStompCD:Start(nil, args.sourceGUID)
|
|
end
|
|
elseif spellId == 211368 then
|
|
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
|
|
specWarnTouchofLife:Show(args.sourceName)
|
|
specWarnTouchofLife:Play("kickcast")
|
|
end
|
|
if self:IsEasy() then
|
|
timerTouchofLifeCD:Start(15, args.sourceGUID)
|
|
else
|
|
timerTouchofLifeCD:Start(11, args.sourceGUID)
|
|
end
|
|
elseif spellId == 214529 then
|
|
timerSpearOfNightmaresCD:Start()
|
|
local targetName, uId, bossuid = self:GetBossTarget(104636, true)
|
|
if self:IsTanking("player", bossuid, nil, true) then
|
|
specWarnSpearOfNightmares:Show()
|
|
specWarnSpearOfNightmares:Play("defensive")
|
|
end
|
|
if self:IsMeleeDps() and self:IsMythic() then
|
|
specWarnSpearOfNightmaresMelee:Show()
|
|
specWarnSpearOfNightmaresMelee:Play("runout")
|
|
end
|
|
elseif spellId == 213162 then
|
|
timerNightmareBlastCD:Start()
|
|
local targetName, uId, bossuid = self:GetBossTarget(104636, true)
|
|
if self:IsTanking("player", bossuid, nil, true) then
|
|
specWarnNightmareBlast:Show()
|
|
specWarnNightmareBlast:Play("defensive")
|
|
else
|
|
if self:GetNumAliveTanks() >= 3 and not self:CheckNearby(30, targetName) then return end--You are not near current tank, you're probably 3rd tank on Adds that never taunts nightmare blast
|
|
specWarnNightmareBlastOther:Schedule(2, targetName)
|
|
specWarnNightmareBlastOther:ScheduleVoice(2, "tauntboss")
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_SUCCESS(args)
|
|
local spellId = args.spellId
|
|
if spellId == 214529 and not args:IsPlayer() then
|
|
if self:GetNumAliveTanks() >= 3 and not self:CheckNearby(21, args.destName) then return end--You are not near current tank, you're probably 3rd tank on Adds that never taunts nightmare blast
|
|
specWarnSpearOfNightmaresOther:Show(args.destName)
|
|
specWarnSpearOfNightmaresOther:Play("tauntboss")
|
|
elseif spellId == 211471 and self:AntiSpam(5, 1) then
|
|
timerScornedTouchCD:Start(nil, args.sourceGUID)
|
|
elseif spellId == 212726 then
|
|
--Wisps don't fire IEEU so done here instead
|
|
if self.Options.SetIconOnWisps then
|
|
self:ScanForMobs(106304, 0, 8, 5, {[106304] = true, [106659] = true,}, 20, "SetIconOnWisps", false)--Double ID scan for wisps
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 210346 then
|
|
-- specWarnDreadThorns:Show()
|
|
-- specWarnDreadThorns:Play("bossout")
|
|
elseif spellId == 211368 then
|
|
specWarnTouchofLifeDispel:Show(args.destName)
|
|
if self.Options.SpecWarn211368dispel then
|
|
specWarnTouchofLifeDispel:Play("dispelnow")
|
|
end
|
|
elseif spellId == 211471 then--Original casts only. Jumps can't be warned this way as of 04-01-16 Testing
|
|
warnScornedTouch:CombinedShow(0.5, args.destName)
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED_DOSE(args)
|
|
local spellId = args.spellId
|
|
if spellId == 210279 and args:IsPlayer() then
|
|
local amount = args.amount or 1
|
|
if amount % 4 == 0 then--Every 4
|
|
if amount >= 16 then--Starting at 16
|
|
specWarnCreepingNightmares:Show(amount)
|
|
specWarnCreepingNightmares:Play("stackhigh")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 210346 then
|
|
timerDreadThornsCD:Start()
|
|
end
|
|
end
|
|
|
|
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] and UnitIsEnemy("player", unitID) then
|
|
seenMobs[GUID] = true
|
|
local cid = self:GetCIDFromGUID(GUID)
|
|
if cid == 105495 then--Scorned Sister
|
|
self.vb.sisterCount = self.vb.sisterCount + 1
|
|
timerScornedTouchCD:Start(4.5, GUID)
|
|
timerTouchofLifeCD:Start(6, GUID)
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(8)
|
|
end
|
|
elseif cid == 105494 then--Rotten Drake
|
|
timerRottenBreathCD:Start(18.1, GUID)
|
|
elseif cid == 105468 then--Nightmare Ancient
|
|
timerDisiccatingStompCD:Start(18.1, GUID)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:UNIT_DIED(args)
|
|
local cid = self:GetCIDFromGUID(args.destGUID)
|
|
if cid == 105495 then--Scorned Sister
|
|
self.vb.sisterCount = self.vb.sisterCount - 1
|
|
timerTouchofLifeCD:Stop(args.destGUID)
|
|
timerScornedTouchCD:Stop(args.destGUID)
|
|
if self.Options.RangeFrame and self.vb.sisterCount == 0 and not DBM:UnitDebuff("player", debuffName) then--Do to shitty spellInfo code, it'll fail to hide first time
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
elseif cid == 105494 then--Rotten Drake
|
|
--This is safer method to cancel it but if more than 1 drake is up it may in rare cases break scan for 2nd drake
|
|
self:BossUnitTargetScannerAbort()
|
|
timerRottenBreathCD:Stop(args.destGUID)
|
|
elseif cid == 105468 then--Nightmare Ancient
|
|
timerDisiccatingStompCD:Stop(args.destGUID)
|
|
end
|
|
end
|
|
|
|
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
|
|
if spellId == 211189 then--Rotten Breath precast. Best method for fastest and most accurate target scanning
|
|
self:BossUnitTargetScanner(uId, "BreathTarget")
|
|
timerRottenBreathCD:Start(nil, UnitGUID(uId))
|
|
elseif spellId == 210290 then--Bramble cast finish (only thing not hidden, probably be hidden too by live, if so will STILL find a way to warn this, even if it means scanning boss 24/7)
|
|
local targetName = DBM:GetUnitFullName(uId.."target")
|
|
if not targetName then return end
|
|
if UnitIsUnit("player", uId.."target") then
|
|
specWarnNightmareBramblesNear:Show(YOU)
|
|
yellNightmareBrambles:Yell()
|
|
specWarnNightmareBramblesNear:Play("runout")
|
|
elseif self:CheckNearby(8, targetName) then
|
|
specWarnNightmareBramblesNear:Show(targetName)
|
|
specWarnNightmareBramblesNear:Play("watchstep")
|
|
else
|
|
warnNightmareBrambles:Show(targetName)
|
|
end
|
|
timerNightmareBramblesCD:Start()
|
|
elseif spellId == 217368 then--Overwhelming Nightmare (Phase 2)
|
|
self.vb.phase = 2
|
|
warnPhase2:Show()
|
|
warnPhase2:Play("ptwo")
|
|
timerForcesOfNightmareCD:Stop()
|
|
timerNightmareBlastCD:Stop()
|
|
timerDreadThornsCD:Stop()
|
|
timerNightmareBramblesCD:Stop()
|
|
timerCleansingGroundCD:Stop()
|
|
timerNightmareBramblesCD:Start(13)
|
|
timerSpearOfNightmaresCD:Start(20)
|
|
timerCleansingGroundCD:Start(30.5)
|
|
timerEntanglingNightmareCD:Start(35)
|
|
-- if self:IsMythic() then
|
|
-- timerBeastsOfNightmareCD:Start(1)--First one is near right away
|
|
-- end
|
|
elseif spellId == 214454 then--Entangling Nightmares (this is just a lot faster than combat log)
|
|
specWarnEntangledNightmares:Show()
|
|
timerEntanglingNightmareCD:Start()
|
|
elseif spellId == 214876 then
|
|
specWarnBeastsOfNightmare:Show()
|
|
specWarnBeastsOfNightmare:Play("watchstep")
|
|
timerBeastsOfNightmareCD:Start()
|
|
end
|
|
end
|
|
|
|
do
|
|
--Jumps didn't show in combat log during testing, only original casts. However, jumps need warnings too
|
|
--Check at later time if jumps are in combat log
|
|
function mod:UNIT_AURA(uId)
|
|
local hasDebuff = DBM:UnitDebuff("player", debuffName)
|
|
if hasDebuff and not scornedWarned then
|
|
specWarnScornedTouch:Show()
|
|
specWarnScornedTouch:Play("runout")
|
|
yellScornedTouch:Yell()
|
|
scornedWarned = true
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(8)
|
|
end
|
|
elseif not hasDebuff and scornedWarned then
|
|
scornedWarned = false
|
|
if self.Options.RangeFrame and self.vb.sisterCount == 0 then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|