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.
315 lines
13 KiB
315 lines
13 KiB
local mod = DBM:NewMod(2394, "DBM-CastleNathria", nil, 1190)
|
|
local L = mod:GetLocalizedStrings()
|
|
|
|
mod:SetRevision("20220806032935")
|
|
mod:SetCreatureID(164407)
|
|
mod:SetEncounterID(2399)
|
|
mod:SetUsedIcons(1)
|
|
mod:SetHotfixNoticeRev(20210119000000)--2021, 01, 19
|
|
mod:SetMinSyncRevision(20201228000000)
|
|
mod.respawnTime = 29
|
|
|
|
mod:RegisterCombat("combat")
|
|
|
|
mod:RegisterEventsInCombat(
|
|
"SPELL_CAST_START 332318",
|
|
"SPELL_CAST_SUCCESS 332687",
|
|
"SPELL_AURA_APPLIED 331209 331314 342420 335470 340817 341250",
|
|
"SPELL_AURA_REMOVED 331209 331314 342419 342420 340817",
|
|
-- "SPELL_PERIODIC_DAMAGE",
|
|
-- "SPELL_PERIODIC_MISSED",
|
|
"SPELL_ENERGIZE 346269",
|
|
"UNIT_SPELLCAST_SUCCEEDED boss1"
|
|
)
|
|
|
|
--TODO, this straght up needs an updateAllTimers function like archimonde to be perfect, especially around hateful gaze/impact stun
|
|
--The timers COULD be perfected, I'm just not sure it's worth the effort to since the variations are all predictable (based around spell queuing or delayed by impact stun)
|
|
--I'll return to perfecting timers if things don't change on live and can analylize dozens more logs to verify patterns
|
|
--[[
|
|
(ability.id = 332318) and type = "begincast"
|
|
or ability.id = 332687 and type = "cast"
|
|
or (ability.id = 335470 or ability.id = 335470 or ability.id = 331209) and type = "applydebuff"
|
|
or ability.id = 346269 or ability.id = 331314
|
|
or (ability.id = 342420 or ability.id = 340817) and type = "applydebuff"
|
|
--]]
|
|
local warnHatefulGaze = mod:NewTargetCountAnnounce(331209, 4, nil, nil, nil, nil, nil, nil, true)
|
|
local warnStunnedImpact = mod:NewTargetNoFilterAnnounce(331314, 1)
|
|
--local warnChainLink = mod:NewTargetAnnounce(342419, 3)--Targetting debuff
|
|
local warnChainSlam = mod:NewTargetCountAnnounce(335470, 3, nil, nil, nil, nil, nil, nil, true)
|
|
local warnGruesomeRage = mod:NewTargetNoFilterAnnounce(341250, 4)
|
|
|
|
local specWarnHatefulGaze = mod:NewSpecialWarningMoveTo(331209, nil, nil, nil, 3, 2)
|
|
local specWarnHeedlessCharge = mod:NewSpecialWarningSoon(331212, nil, nil, nil, 2, 2)
|
|
local yellHatefulGaze = mod:NewShortYell(331209)
|
|
local yellHatefulGazeFades = mod:NewShortFadesYell(331209)
|
|
local specWarnChainLink = mod:NewSpecialWarningMoveTo(335300, nil, nil, nil, 1, 2)
|
|
local yellChainLink = mod:NewIconRepeatYell(335300, DBM_CORE_L.AUTO_YELL_ANNOUNCE_TEXT.shortyell, false, 2)
|
|
local specWarnChainSlam = mod:NewSpecialWarningYou(335470, nil, nil, nil, 1, 2)
|
|
local specWarnChainSlamPartner = mod:NewSpecialWarningTarget(335470, nil, nil, nil, 1, 2)
|
|
local yellChainSlam = mod:NewShortYell(335470, nil, nil, nil, "YELL")
|
|
local yellChainSlamFades = mod:NewShortFadesYell(335470, nil, nil, nil, "YELL")
|
|
local specWarnDestructiveStomp = mod:NewSpecialWarningRun(332318, "Melee", 247733, nil, 4, 2)
|
|
local specWarnColossalRoar = mod:NewSpecialWarningSpell(332687, nil, 226056, nil, 2, 2)
|
|
local specWarnFallingRubble = mod:NewSpecialWarningDodge(332572, nil, nil, nil, 2, 2)
|
|
local specWarnSiesmicShift = mod:NewSpecialWarningMoveAway(340817, nil, nil, nil, 2, 2, 4)
|
|
--local specWarnGTFO = mod:NewSpecialWarningGTFO(270290, nil, nil, nil, 1, 8)
|
|
|
|
--All timers outside of stun and gaze will use keep arg so timers remain visible if they come off CD during gaze stun
|
|
local timerHatefulGazeCD = mod:NewCDCountTimer(68.9, 331209, nil, nil, nil, 3, nil, DBM_COMMON_L.IMPORTANT_ICON, nil, 1, 4)
|
|
local timerStunnedImpact = mod:NewBuffActiveTimer(12, 331314, nil, nil, nil, 5, nil, DBM_COMMON_L.DAMAGE_ICON)
|
|
local timerChainLinkCD = mod:NewCDCountTimer(68.9, 335300, nil, nil, nil, 3, nil, nil, true)
|
|
local timerChainSlamCD = mod:NewCDCountTimer(68.9, 335470, nil, nil, nil, 3, nil, DBM_COMMON_L.HEROIC_ICON, true)
|
|
local timerDestructiveStompCD = mod:NewCDCountTimer(44.3, 332318, 247733, nil, nil, 3, nil, nil, true)
|
|
local timerFallingRubbleCD = mod:NewCDCountTimer(68.9, 332572, nil, nil, nil, 3, nil, nil, true)
|
|
local timerColossalRoarCD = mod:NewCDCountTimer(27.9, 332687, 226056, nil, nil, 2, nil, nil, true)
|
|
local timerSiesmicShiftCD = mod:NewCDCountTimer(34, 340817, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON, true)--Mythic
|
|
|
|
--local berserkTimer = mod:NewBerserkTimer(600)
|
|
|
|
mod:AddRangeFrameOption(5, 340817)
|
|
mod:AddSetIconOption("SetIconGaze", 331209, true, false, {1})
|
|
|
|
mod.vb.gazeCount = 0
|
|
mod.vb.stompCount = 0
|
|
mod.vb.roarCount = 0
|
|
mod.vb.linkCount = 0
|
|
mod.vb.chainSlamCount = 0
|
|
mod.vb.rubbleCount = 0
|
|
mod.vb.shiftCount = 0
|
|
local ChainLinkTargets = {}
|
|
local playerName = UnitName("player")
|
|
local playerPartner = nil
|
|
local SiesmicTimers = {18.1, 25.4, 29.3, 12.3, 25.5, 30.1, 12.6, 25.5, 30.1, 12.3, 25.4, 30.1, 13.5, 25.5, 28.8}
|
|
-- 30.1 13.5 31.3
|
|
local function ChainLinkYellRepeater(self, text, runTimes)
|
|
yellChainLink:Yell(text)
|
|
runTimes = runTimes + 1
|
|
if runTimes < 3 then
|
|
self:Schedule(2, ChainLinkYellRepeater, self, text, runTimes)
|
|
end
|
|
end
|
|
|
|
function mod:OnCombatStart(delay)
|
|
self.vb.gazeCount = 0
|
|
self.vb.stompCount = 0
|
|
self.vb.roarCount = 0
|
|
self.vb.linkCount = 0
|
|
self.vb.chainSlamCount = 0
|
|
self.vb.rubbleCount = 0
|
|
playerPartner = nil
|
|
table.wipe(ChainLinkTargets)
|
|
--Roar cast instantly on pull, no timer needed
|
|
--These 3 are same across board
|
|
timerFallingRubbleCD:Start(12.1-delay, 1)--Unknown, not in combat log
|
|
timerDestructiveStompCD:Start(18.1-delay, 1)
|
|
timerHatefulGazeCD:Start(50.1-delay, 1)
|
|
if not self:IsLFR() then
|
|
timerChainLinkCD:Start(4.7-delay, 1)--Used on normal+
|
|
if self:IsHard() then--Heroic+
|
|
timerChainSlamCD:Start(28.3-delay, 1)
|
|
if self:IsMythic() then--Mythic+
|
|
self.vb.shiftCount = 0
|
|
timerSiesmicShiftCD:Start(18.1, 1)
|
|
end
|
|
end
|
|
end
|
|
-- berserkTimer:Start(-delay)
|
|
end
|
|
|
|
function mod:OnCombatEnd()
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_START(args)
|
|
local spellId = args.spellId
|
|
if spellId == 332318 then
|
|
self.vb.stompCount = self.vb.stompCount + 1
|
|
specWarnDestructiveStomp:Show()
|
|
specWarnDestructiveStomp:Play("justrun")
|
|
--Heroic
|
|
--pull:18.2, 25.9, 44.6, 25.5, 44.9, 25.5, 45.0, 25.3, 44.0", -- [2]
|
|
--Mythic
|
|
--pull:18.6, 25.5, 43.4, 25.5, 43.8, 25.5, 43.7", -- [2]
|
|
if self.vb.stompCount % 2 == 0 then
|
|
timerDestructiveStompCD:Start(43, self.vb.stompCount+1)
|
|
else
|
|
timerDestructiveStompCD:Start(25, self.vb.stompCount+1)--LFR is only about .5 seconds slower, so not worth nitpick
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_CAST_SUCCESS(args)
|
|
local spellId = args.spellId
|
|
if spellId == 332687 then
|
|
self.vb.roarCount = self.vb.roarCount + 1
|
|
specWarnColossalRoar:Show()
|
|
specWarnColossalRoar:Play("aesoon")
|
|
timerColossalRoarCD:Start(self:IsLFR() and 33.2 or 27.9, self.vb.roarCount+1)--27-31 in fated?
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_APPLIED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 331209 then
|
|
self.vb.gazeCount = self.vb.gazeCount + 1
|
|
timerHatefulGazeCD:Start(self:IsLFR() and 69.1 or 67.3, self.vb.gazeCount+1)
|
|
if self.Options.SetIconGaze then
|
|
self:SetIcon(args.destName, 1)
|
|
end
|
|
if args:IsPlayer() then
|
|
specWarnHatefulGaze:Show(DBM_COMMON_L.PILLAR)
|
|
specWarnHatefulGaze:Play("targetyou")
|
|
yellHatefulGaze:Yell()
|
|
yellHatefulGazeFades:Countdown(spellId)
|
|
else
|
|
specWarnHeedlessCharge:Show()
|
|
specWarnHeedlessCharge:Play("farfromline")
|
|
warnHatefulGaze:Show(self.vb.gazeCount, args.destName)
|
|
end
|
|
elseif spellId == 331314 then
|
|
warnStunnedImpact:Show(args.destName)
|
|
timerStunnedImpact:Start()
|
|
elseif spellId == 342420 then--spellId == 342419 or
|
|
--Combat log order is all 342419 first, then all 342420
|
|
--Update, both spell Ids now have source and des names, so can just ignore one spell Id entirely and apply source/dest to check for pairs
|
|
ChainLinkTargets[#ChainLinkTargets + 1] = args.sourceName
|
|
-- warnChainLink:CombinedShow(0.3, args.destName)
|
|
local icon = #ChainLinkTargets--Generate icon on the evens, because then we can divide it by 2 to assign raid icon to that pair
|
|
local playerIsInPair = false
|
|
if args.sourceName == playerName then
|
|
specWarnChainLink:Show(args.destName)
|
|
specWarnChainLink:Play("gather")
|
|
playerIsInPair = true
|
|
playerPartner = args.destName
|
|
elseif args.destName == playerName then
|
|
specWarnChainLink:Show(args.sourceName)
|
|
specWarnChainLink:Play("gather")
|
|
playerIsInPair = true
|
|
playerPartner = args.sourceName
|
|
end
|
|
if playerIsInPair then
|
|
--need to account for up to 30 people (15 pairs)
|
|
if icon == 9 then
|
|
icon = "(°,,°)"
|
|
elseif icon == 10 then
|
|
icon = "(•_•)"
|
|
elseif icon == 11 then
|
|
icon = "(ಥ﹏ಥ)"
|
|
elseif icon == 12 then
|
|
icon = "(ツ)"
|
|
elseif icon == 13 then
|
|
icon = "ʕ•ᴥ•ʔ"
|
|
elseif icon == 14 then
|
|
icon = "ಠ_ಠ"
|
|
elseif icon == 15 then
|
|
icon = "(͡°͜°)"
|
|
end
|
|
self:Unschedule(ChainLinkYellRepeater)
|
|
if type(icon) == "number" then icon = DBM_CORE_L.AUTO_YELL_CUSTOM_POSITION:format(icon, "") end
|
|
self:Schedule(2, ChainLinkYellRepeater, self, icon, 0)
|
|
yellChainLink:Yell(icon)
|
|
end
|
|
elseif spellId == 335470 then
|
|
if args:IsPlayer() then
|
|
specWarnChainSlam:Show()
|
|
specWarnChainSlam:Play("targetyou")
|
|
yellChainSlam:Yell()
|
|
yellChainSlamFades:Countdown(4)--Can't auto pull from spellId
|
|
elseif playerPartner and playerPartner == args.destName then
|
|
specWarnChainSlamPartner:Show(args.destName)
|
|
specWarnChainSlamPartner:Play("gathershare")
|
|
else
|
|
warnChainSlam:Show(self.vb.chainSlamCount, args.destName)
|
|
end
|
|
--Chain slam always extends Colossal Roar by a very precise amount
|
|
if timerColossalRoarCD:GetRemaining(self.vb.roarCount+1) < 7.25 then
|
|
local elapsed, total = timerColossalRoarCD:GetTime(self.vb.roarCount+1)
|
|
local extend = 7.25 - (total-elapsed)
|
|
DBM:Debug("timerColossalRoarCD extended by: "..extend, 2)
|
|
timerColossalRoarCD:Stop()
|
|
timerColossalRoarCD:Update(elapsed, total+extend, self.vb.roarCount+1)
|
|
end
|
|
elseif spellId == 341250 then
|
|
warnGruesomeRage:Show(args.destName)
|
|
elseif spellId == 340817 then
|
|
if self:AntiSpam(8, 9) then
|
|
self.vb.shiftCount = self.vb.shiftCount + 1
|
|
local timer = SiesmicTimers[self.vb.shiftCount+1]
|
|
if timer then
|
|
timerSiesmicShiftCD:Start(timer, self.vb.shiftCount+1)
|
|
local timerAfter = SiesmicTimers[self.vb.shiftCount+2]
|
|
if not timerAfter then--Disable timer keeping if we're out of timer data beind THIS timer
|
|
timerSiesmicShiftCD:SetSTKeep(false, self.vb.shiftCount+1)
|
|
end
|
|
end
|
|
end
|
|
if args:IsPlayer() then
|
|
specWarnSiesmicShift:Show()
|
|
specWarnSiesmicShift:Play("range5")
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Show(5)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function mod:SPELL_AURA_REMOVED(args)
|
|
local spellId = args.spellId
|
|
if spellId == 331209 then
|
|
if args:IsPlayer() then
|
|
yellHatefulGazeFades:Cancel()
|
|
end
|
|
if self.Options.SetIconGaze then
|
|
self:SetIcon(args.destName, 0)
|
|
end
|
|
elseif spellId == 331314 then
|
|
timerStunnedImpact:Stop(args.destName)
|
|
elseif spellId == 342419 or spellId == 342420 then--Both spellIds checked on purpose here for personal removal
|
|
if args:IsPlayer() then
|
|
self:Unschedule(ChainLinkYellRepeater)
|
|
playerPartner = nil
|
|
end
|
|
elseif spellId == 340817 then
|
|
if args:IsPlayer() then
|
|
if self.Options.RangeFrame then
|
|
DBM.RangeCheck:Hide()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--[[
|
|
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
|
|
if spellId == 270290 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:SPELL_ENERGIZE(_, _, _, _, _, _, _, _, spellId, _, _, amount)
|
|
if spellId == 346269 then
|
|
timerHatefulGazeCD:Stop()--Boss immediately full energy so terminate timer/countdown immediately
|
|
--TODO, also adjust other timers instead of just using KeepTime?
|
|
--Might be annoying work to do for something that shouldn't happen in a properly executed fight
|
|
end
|
|
end
|
|
|
|
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
|
|
if spellId == 335300 then--Chain link
|
|
table.wipe(ChainLinkTargets)
|
|
self.vb.linkCount = self.vb.linkCount + 1
|
|
timerChainLinkCD:Start(67.7, self.vb.linkCount+1)--67.7-69.1
|
|
elseif spellId == 341193 then--or spellId == 341103
|
|
self.vb.rubbleCount = self.vb.rubbleCount + 1
|
|
specWarnFallingRubble:Show(self.vb.rubbleCount)
|
|
specWarnFallingRubble:Play("watchstep")
|
|
timerFallingRubbleCD:Start(67.8, self.vb.rubbleCount+1)
|
|
elseif spellId == 335354 then--Chain Slam
|
|
self.vb.chainSlamCount = self.vb.chainSlamCount + 1
|
|
timerChainSlamCD:Start(68.9, self.vb.chainSlamCount+1)
|
|
end
|
|
end
|
|
|