|
|
|
|
local mod = DBM:NewMod(2599, "DBM-Raids-WarWithin", 1, 1273)
|
|
|
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
|
|
|
|
|
|
mod:SetRevision("20240811194936")
|
|
|
|
|
mod:SetCreatureID(214503)
|
|
|
|
|
mod:SetEncounterID(2898)
|
|
|
|
|
mod:SetUsedIcons(1, 2, 3)
|
|
|
|
|
mod:SetHotfixNoticeRev(20240628000000)
|
|
|
|
|
mod:SetMinSyncRevision(20240628000000)
|
|
|
|
|
mod.respawnTime = 29
|
|
|
|
|
|
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
|
|
|
|
|
|
mod:RegisterEventsInCombat(
|
|
|
|
|
"SPELL_CAST_START 456420 435401 432965 435403 439559 453258 442428",
|
|
|
|
|
"SPELL_AURA_APPLIED 459273 438845 435410 439191",--433517
|
|
|
|
|
"SPELL_AURA_APPLIED_DOSE 459273 438845",
|
|
|
|
|
"SPELL_AURA_REMOVED 459273 439191",--433517
|
|
|
|
|
-- "SPELL_PERIODIC_DAMAGE",
|
|
|
|
|
-- "SPELL_PERIODIC_MISSED",
|
|
|
|
|
"CHAT_MSG_RAID_BOSS_WHISPER",
|
|
|
|
|
"UNIT_SPELLCAST_SUCCEEDED boss1"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
--TODO, GTFO for rain of arrows with correct ID
|
|
|
|
|
--NOTE, As predicted, phase blades was made a private aura
|
|
|
|
|
--TODO, change option keys to match BW for weak aura compatability before live
|
|
|
|
|
--[[
|
|
|
|
|
(ability.id = 456420 or ability.id = 435401 or ability.id = 432965 or ability.id = 435403 or ability.id = 439559 or ability.id = 453258 or ability.id = 442428) and type = "begincast"
|
|
|
|
|
or ability.id = 433517 and type = "applydebuff"
|
|
|
|
|
--]]
|
|
|
|
|
local warnCosmicShards = mod:NewCountAnnounce(459273, 4, nil, nil, DBM_CORE_L.AUTO_ANNOUNCE_OPTIONS.stack:format(459273))--Player
|
|
|
|
|
local warnPhaseBlades = mod:NewIncomingCountAnnounce(433517, 3)
|
|
|
|
|
local warnRainofArrows = mod:NewCountAnnounce(439559, 3)
|
|
|
|
|
local warnDecimate = mod:NewTargetNoFilterAnnounce(442428, 3)
|
|
|
|
|
|
|
|
|
|
local specWarnShatteringSweep = mod:NewSpecialWarningRunCount(456420, nil, nil, nil, 4, 2)
|
|
|
|
|
local specWarnExpose = mod:NewSpecialWarningDefensive(435401, nil, nil, nil, 1, 2)
|
|
|
|
|
local specWarnPhaseLunge = mod:NewSpecialWarningDefensive(435403, nil, nil, nil, 1, 2)
|
|
|
|
|
local specWarnExposedWeakness = mod:NewSpecialWarningTaunt(438845, nil, nil, nil, 1, 2)
|
|
|
|
|
local specWarnPiercedDefenses = mod:NewSpecialWarningTaunt(435410, nil, nil, nil, 1, 2)
|
|
|
|
|
--local specWarnPhaseBlades = mod:NewSpecialWarningYou(433517, nil, nil, nil, 1, 2)
|
|
|
|
|
--local yellPhaseBlades = mod:NewPosYell(433517)
|
|
|
|
|
--local yellPhaseBladesFades = mod:NewIconFadesYell(433517)
|
|
|
|
|
local specWarnDecimate = mod:NewSpecialWarningYou(442428, nil, nil, nil, 1, 2)
|
|
|
|
|
local yellDecimate = mod:NewShortYell(442428)
|
|
|
|
|
local yellDecimateFades = mod:NewShortFadesYell(442428)
|
|
|
|
|
--local specWarnGTFO = mod:NewSpecialWarningGTFO(421532, nil, nil, nil, 1, 8)
|
|
|
|
|
|
|
|
|
|
local timerShatteringSweepCD = mod:NewCDCountTimer(97.3, 456420, nil, nil, nil, 2)
|
|
|
|
|
local timerCosmicShards = mod:NewBuffFadesTimer(6, 459273, nil, nil, nil, 5)
|
|
|
|
|
local timerCaptainsFlourishCD = mod:NewCDCountTimer(22, 439511, DBM_COMMON_L.TANKCOMBO.." (%s)", "Tank|Healer", nil, 5, nil, DBM_COMMON_L.TANK_ICON)
|
|
|
|
|
local timerPhaseBladesCD = mod:NewCDCountTimer(42.6, 433517, nil, nil, nil, 3)
|
|
|
|
|
local timerRainofArrowsCD = mod:NewCDCountTimer(52.3, 439559, nil, nil, nil, 3)
|
|
|
|
|
local timerDecimateCD = mod:NewCDCountTimer(38.1, 442428, nil, nil, nil, 3)
|
|
|
|
|
|
|
|
|
|
--mod:AddInfoFrameOption(407919, true)
|
|
|
|
|
--mod:AddSetIconOption("SetIconOnPhaseBlades", 433517, true, 0, {1, 2, 3, 4})
|
|
|
|
|
mod:AddSetIconOption("SetIconOnDecimate", 442428, true, 0, {1, 2, 3})
|
|
|
|
|
mod:AddPrivateAuraSoundOption(433517, true, 433517, 1)--Phase Blades
|
|
|
|
|
|
|
|
|
|
mod.vb.sweepCount = 0
|
|
|
|
|
mod.vb.tankCombo = 0
|
|
|
|
|
mod.vb.comboCount = 0
|
|
|
|
|
mod.vb.bladesCount = 0
|
|
|
|
|
mod.vb.arrowsCount = 0
|
|
|
|
|
mod.vb.decimateCount = 0
|
|
|
|
|
--mod.vb.bladesIcon = 1
|
|
|
|
|
mod.vb.decimateIcon = 1
|
|
|
|
|
|
|
|
|
|
function mod:OnCombatStart(delay)
|
|
|
|
|
self.vb.sweepCount = 0
|
|
|
|
|
self.vb.tankCombo = 0
|
|
|
|
|
self.vb.comboCount = 0
|
|
|
|
|
self.vb.bladesCount = 0
|
|
|
|
|
self.vb.arrowsCount = 0
|
|
|
|
|
self.vb.decimateCount = 0
|
|
|
|
|
timerCaptainsFlourishCD:Start(6-delay, 1)
|
|
|
|
|
if self:IsMythic() then
|
|
|
|
|
timerPhaseBladesCD:Start(12.4-delay, 1)
|
|
|
|
|
timerRainofArrowsCD:Start(23-delay, 1)
|
|
|
|
|
timerDecimateCD:Start(50.8-delay, 1)
|
|
|
|
|
else--Confirmed heroic and normal
|
|
|
|
|
timerPhaseBladesCD:Start(14.3-delay, 1)
|
|
|
|
|
timerRainofArrowsCD:Start(35.1-delay, 1)
|
|
|
|
|
timerDecimateCD:Start(42.7-delay, 1)
|
|
|
|
|
end
|
|
|
|
|
timerShatteringSweepCD:Start(89.9, 1)
|
|
|
|
|
self:EnablePrivateAuraSound(433517, "runout", 2)--Phase Blades
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
|
|
|
local spellId = args.spellId
|
|
|
|
|
if spellId == 456420 then
|
|
|
|
|
self.vb.sweepCount = self.vb.sweepCount + 1
|
|
|
|
|
specWarnShatteringSweep:Show(self.vb.sweepCount)
|
|
|
|
|
specWarnShatteringSweep:Play("justrun")
|
|
|
|
|
timerShatteringSweepCD:Start(nil, self.vb.sweepCount+1)
|
|
|
|
|
--Restart timers
|
|
|
|
|
--self.vb.tankCombo = 0
|
|
|
|
|
--self.vb.bladesCount = 0
|
|
|
|
|
--self.vb.arrowsCount = 0
|
|
|
|
|
--self.vb.decimateCount = 0
|
|
|
|
|
timerCaptainsFlourishCD:Start(10.7, self.vb.tankCombo+1)
|
|
|
|
|
timerPhaseBladesCD:Start(19.3, self.vb.bladesCount+1)
|
|
|
|
|
timerRainofArrowsCD:Start(self:IsMythic() and 29.1 or 39.7, self.vb.arrowsCount+1)
|
|
|
|
|
timerDecimateCD:Start(self:IsMythic() and 61.9 or 48.3, self.vb.decimateCount+1)
|
|
|
|
|
elseif spellId == 435401 or spellId == 432965 then--Second cast / First cast
|
|
|
|
|
if spellId == 432965 then
|
|
|
|
|
--First part of Combo
|
|
|
|
|
--self.vb.firstHitTank = ""
|
|
|
|
|
self.vb.tankCombo = self.vb.tankCombo + 1
|
|
|
|
|
self.vb.comboCount = 0
|
|
|
|
|
if self.vb.tankCombo < 4 then
|
|
|
|
|
--On mythic, the first tank combos are always 25.1 apart but then they are 27.9 apart after first sweep
|
|
|
|
|
timerCaptainsFlourishCD:Start(self:IsMythic() and (self.vb.sweepCount == 0 and 25.1 or 27.2) or 22.5, self.vb.tankCombo+1)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--Now do combo stuff
|
|
|
|
|
self.vb.comboCount = self.vb.comboCount + 1
|
|
|
|
|
if self:IsTanking("player", "boss1", nil, true) then
|
|
|
|
|
if spellId == 432965 then
|
|
|
|
|
specWarnExpose:Show()
|
|
|
|
|
specWarnExpose:Play("defensive")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif spellId == 435403 then
|
|
|
|
|
self.vb.comboCount = self.vb.comboCount + 1
|
|
|
|
|
if self:IsTanking("player", "boss1", nil, true) then
|
|
|
|
|
specWarnPhaseLunge:Show()
|
|
|
|
|
specWarnPhaseLunge:Play("defensive")
|
|
|
|
|
else
|
|
|
|
|
--Other tank has this debuff already and it will NOT be gone when cast finishes, TAUNT NOW!
|
|
|
|
|
--This doesn't check TankSwapBehavior dropdown because this always validates that the player about to get hit by this, shouldn't be hit by it
|
|
|
|
|
if UnitExists("boss1target") and not UnitIsUnit("player", "boss1target") then
|
|
|
|
|
local _, _, _, _, _, expireTimeTarget = DBM:UnitDebuff("boss1target", 435410)--Target has Pierced Defenses already and can't take this 500% damage hit
|
|
|
|
|
if (expireTimeTarget and expireTimeTarget-GetTime() >= 2) and self:AntiSpam(1.5, 1) then
|
|
|
|
|
specWarnPiercedDefenses:Show(UnitName("boss1target"))
|
|
|
|
|
specWarnPiercedDefenses:Play("tauntboss")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif spellId == 439559 or spellId == 453258 then
|
|
|
|
|
self.vb.arrowsCount = self.vb.arrowsCount + 1
|
|
|
|
|
warnRainofArrows:Show(self.vb.arrowsCount)
|
|
|
|
|
if self:IsMythic() then
|
|
|
|
|
--Behavior changes fairly radically after first sweep on mythic
|
|
|
|
|
if self.vb.arrowsCount == 1 then
|
|
|
|
|
timerRainofArrowsCD:Start(self.vb.sweepCount == 0 and 42.6 or 26.3, self.vb.arrowsCount+1)
|
|
|
|
|
elseif self.vb.arrowsCount == 2 and self.vb.sweepCount > 0 then
|
|
|
|
|
timerRainofArrowsCD:Start(26.3, self.vb.arrowsCount+1)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if self.vb.arrowsCount == 1 then
|
|
|
|
|
timerRainofArrowsCD:Start(52.3, self.vb.arrowsCount+1)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif spellId == 442428 then
|
|
|
|
|
self.vb.decimateCount = self.vb.decimateCount + 1
|
|
|
|
|
self.vb.decimateIcon = 1
|
|
|
|
|
if self.vb.decimateCount == 1 then
|
|
|
|
|
--26.1 before sweep, 28 after? (mythic). need more data, it's just an assumption atm
|
|
|
|
|
--Normal might be 39.8 instead of 38.1, need more data
|
|
|
|
|
timerDecimateCD:Start(self:IsMythic() and (self.vb.sweepCount == 0 and 26.1 or 28) or 38.1, self.vb.decimateCount+1)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
|
|
|
local spellId = args.spellId
|
|
|
|
|
if spellId == 459273 and args:IsPlayer() then
|
|
|
|
|
warnCosmicShards:Cancel()
|
|
|
|
|
--0.5 aggregation so all ones blowing up at once during Shattering Sweep are only single warned
|
|
|
|
|
warnCosmicShards:Schedule(0.5, args.amount or 1)
|
|
|
|
|
timerCosmicShards:Stop()
|
|
|
|
|
timerCosmicShards:Start()
|
|
|
|
|
elseif spellId == 438845 and not args:IsPlayer() then--Exposed weakness / Pierced Defenses
|
|
|
|
|
if (args.amount or 1) == 2 and self:AntiSpam(1.5, 1) then--Only thing we can be sure of, you don't want a tank taking all 3 hits
|
|
|
|
|
specWarnExposedWeakness:Show(args.destName)
|
|
|
|
|
specWarnExposedWeakness:Play("tauntboss")
|
|
|
|
|
end
|
|
|
|
|
--elseif spellId == 433517 then
|
|
|
|
|
-- if self:AntiSpam(10, 2) then--Backup
|
|
|
|
|
-- self.vb.bladesCount = self.vb.bladesCount + 1
|
|
|
|
|
-- self.vb.bladesIcon = 1
|
|
|
|
|
-- if self:IsMythic() then
|
|
|
|
|
-- if self.vb.bladesCount < 3 then
|
|
|
|
|
-- --Mythic consistently same before and after sweep, within the standard variation of ~28
|
|
|
|
|
-- timerPhaseBladesCD:Start(27.6, 1)
|
|
|
|
|
-- end
|
|
|
|
|
-- else
|
|
|
|
|
-- if self.vb.bladesCount == 1 then
|
|
|
|
|
-- --The 45 seems to be a consisted fluke only in first rotation (ie before first sweep)
|
|
|
|
|
-- timerPhaseBladesCD:Start(self.vb.sweepCount == 0 and 44.9 or 42.5, 1)
|
|
|
|
|
-- end
|
|
|
|
|
-- end
|
|
|
|
|
-- end
|
|
|
|
|
-- local icon = self.vb.bladesIcon
|
|
|
|
|
-- if self.Options.SetIconOnPhaseBlades then
|
|
|
|
|
-- self:SetIcon(args.destName, icon)
|
|
|
|
|
-- end
|
|
|
|
|
-- if args:IsPlayer() then
|
|
|
|
|
-- specWarnPhaseBlades:Show()
|
|
|
|
|
-- specWarnPhaseBlades:Play("targetyou")
|
|
|
|
|
-- yellPhaseBlades:Yell(icon, icon)
|
|
|
|
|
-- yellPhaseBladesFades:Countdown(5, nil, icon)
|
|
|
|
|
-- end
|
|
|
|
|
-- warnPhaseBlades:PreciseShow(4, args.destName)--4 is max targets, but it can scale down to less
|
|
|
|
|
-- self.vb.bladesIcon = self.vb.bladesIcon + 1
|
|
|
|
|
-- elseif spellId == 439191 then
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
|
|
|
|
|
|
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
|
|
|
local spellId = args.spellId
|
|
|
|
|
if spellId == 459273 and args:IsPlayer() then
|
|
|
|
|
timerCosmicShards:Stop()
|
|
|
|
|
--elseif spellId == 433517 then
|
|
|
|
|
-- if self.Options.SetIconOnPhaseBlades then
|
|
|
|
|
-- self:SetIcon(args.destName, 0)
|
|
|
|
|
-- end
|
|
|
|
|
-- if args:IsPlayer() then
|
|
|
|
|
-- yellPhaseBladesFades:Cancel()
|
|
|
|
|
-- end
|
|
|
|
|
--elseif spellId == 439191 then
|
|
|
|
|
-- if self.Options.SetIconOnDecimate then
|
|
|
|
|
-- self:SetIcon(args.destName, 0)
|
|
|
|
|
-- end
|
|
|
|
|
-- if args:IsPlayer() then
|
|
|
|
|
-- yellDecimateFades:Cancel()
|
|
|
|
|
-- end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function mod:CHAT_MSG_RAID_BOSS_WHISPER(msg)
|
|
|
|
|
if msg:find("spell:459349") then
|
|
|
|
|
specWarnDecimate:Show()
|
|
|
|
|
specWarnDecimate:Play("targetyou")
|
|
|
|
|
yellDecimate:Yell()--icon, icon
|
|
|
|
|
yellDecimateFades:Countdown(5.5)--, nil, icon
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--Icons will only be marked on targets that have either DBM or BW installed
|
|
|
|
|
function mod:OnTranscriptorSync(msg, targetName)
|
|
|
|
|
if msg:find("spell:459349") then
|
|
|
|
|
local icon = self.vb.decimateIcon
|
|
|
|
|
if self.Options.SetIconOnDecimate then
|
|
|
|
|
self:SetIcon(targetName, icon, 6)
|
|
|
|
|
end
|
|
|
|
|
warnDecimate:PreciseShow(3, targetName)--3 is max targets, but it can scale down to less
|
|
|
|
|
self.vb.decimateIcon = self.vb.decimateIcon + 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--[[
|
|
|
|
|
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
|
|
|
|
|
if spellId == 421532 and destGUID == UnitGUID("player") and self:AntiSpam(2, 2) 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 == 433475 then
|
|
|
|
|
if self:AntiSpam(10, 2) then
|
|
|
|
|
self.vb.bladesCount = self.vb.bladesCount + 1
|
|
|
|
|
warnPhaseBlades:Show(self.vb.bladesCount)
|
|
|
|
|
self.vb.bladesIcon = 1
|
|
|
|
|
if self:IsMythic() then
|
|
|
|
|
if self.vb.bladesCount < 3 then
|
|
|
|
|
--Mythic consistently same before and after sweep, within the standard variation of ~28
|
|
|
|
|
timerPhaseBladesCD:Start(27.6, 1)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if self.vb.bladesCount == 1 then
|
|
|
|
|
--The 45 seems to be a consisted fluke only in first rotation (ie before first sweep)
|
|
|
|
|
timerPhaseBladesCD:Start(self.vb.sweepCount == 0 and 44.9 or 42.5, 1)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|