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.

450 lines
18 KiB

local mod = DBM:NewMod("d1993", "DBM-Challenges", 2)--1993 Stormwind 1995 Org
local L = mod:GetLocalizedStrings()
mod:SetRevision("20211208050610")
mod:RegisterCombat("scenario", 2213)--2212, 2213 (org, stormwind)
mod:RegisterEventsInCombat(
"SPELL_CAST_START 308278 309819 309648 298691 308669 308366 308406 311456 296911 296537 308481 308575 298033 308375 309882 309671 308305 311399 297315 308998 308265 296669",
"SPELL_AURA_APPLIED 311390 315385 316481 311641 308380 308366 308265 308998",
"SPELL_AURA_APPLIED_DOSE 311390",
"SPELL_AURA_REMOVED 308998 298033",
"SPELL_CAST_SUCCESS 309035",
"SPELL_PERIODIC_DAMAGE 312121 296674 308807 313303",
"SPELL_PERIODIC_MISSED 312121 296674 308807 313303",
"SPELL_INTERRUPT",
"UNIT_DIED",
"ENCOUNTER_START",
"UNIT_SPELLCAST_SUCCEEDED_UNFILTERED",
"UNIT_SPELLCAST_INTERRUPTED_UNFILTERED",
"UNIT_AURA player",
"NAME_PLATE_UNIT_ADDED",
"FORBIDDEN_NAME_PLATE_UNIT_ADDED"
)
--TODO, maybe add https://ptr.wowhead.com/spell=292021/madness-leaden-foot#see-also-other affix? just depends on warning to stop moving can be counter to a stacked affix
--TODO, see if target scanning will work on Entropic Leap
--General
local warnGiftoftheTitans = mod:NewSpellAnnounce(313698, 1)
local warnScorchedFeet = mod:NewSpellAnnounce(315385, 4)
--Extra Abilities (used by main boss and the area LTs)
local warnTaintedPolymorph = mod:NewCastAnnounce(309648, 3)
local warnEntropicMissiles = mod:NewSpellAnnounce(309373, 3)
local warnExplosiveOrdnance = mod:NewSpellAnnounce(305672, 3)
local warnSeekAndDestroy = mod:NewSpellAnnounce(311570, 3)
local warnSummonEyeofChaos = mod:NewSpellAnnounce(308681, 2)
local warnCorruptedBlight = mod:NewCastAnnounce(308265, 3)
local warnLurkingAppendage = mod:NewCastAnnounce(296669, 3)
--Other notable abilities by mini bosses/trash
local warnEntropicLeap = mod:NewCastAnnounce(308406, 3)
local warnConvert = mod:NewTargetNoFilterAnnounce(308380, 3)
local warnImprovedMorale = mod:NewTargetNoFilterAnnounce(308998, 3)
local warnTouchoftheAbyss = mod:NewCastAnnounce(298033, 4)
local warnBrutalSmash = mod:NewCastAnnounce(309882, 3)
--General (GTFOs and Affixes)
local specWarnGTFO = mod:NewSpecialWarningGTFO(312121, nil, nil, nil, 1, 8)
local specWarnEntomophobia = mod:NewSpecialWarningJump(311389, nil, nil, nil, 1, 6)
local specWarnHauntingShadows = mod:NewSpecialWarningDodge(306545, false, nil, 4, 1, 2)
local specWarnScorchedFeet = mod:NewSpecialWarningYou(315385, false, nil, 2, 1, 2)
local yellScorchedFeet = mod:NewYell(315385)
local specWarnSplitPersonality = mod:NewSpecialWarningYou(316481, nil, nil, nil, 1, 2)
local specWarnWaveringWill = mod:NewSpecialWarningReflect(311641, "false", nil, nil, 1, 2)--Off by default, it's only 5%, but that might matter to some classes
--Alleria Windrunner
local specWarnDarkenedSky = mod:NewSpecialWarningDodge(308278, nil, nil, nil, 2, 2)
local specWarnVoidEruption = mod:NewSpecialWarningMoveTo(309819, nil, nil, nil, 3, 2)
--Extra Abilities (used by Alleria and the area LTs)
local specWarnChainsofServitude = mod:NewSpecialWarningRun(298691, nil, nil, nil, 4, 2)
local specWarnDarkGaze = mod:NewSpecialWarningLookAway(308669, false, nil, 2, 2, 2)
local specWarnForgeBreath = mod:NewSpecialWarningDodge(309671, nil, nil, nil, 2, 2)
local specWarnTaintedPolymorph = mod:NewSpecialWarningInterrupt(309648, "HasInterrupt", nil, nil, 1, 2)
--Other notable abilities by mini bosses/trash
local specWarnAgonizingTorment = mod:NewSpecialWarningInterrupt(308366, "HasInterrupt", nil, nil, 1, 2)
local specWarnEntropicMissiles = mod:NewSpecialWarningInterrupt(309035, "HasInterrupt", nil, nil, 1, 2)
local specWarnMentalAssault = mod:NewSpecialWarningInterrupt(296537, "HasInterrupt", nil, nil, 1, 2)
local specWarnShadowShift = mod:NewSpecialWarningInterrupt(308575, "HasInterrupt", nil, nil, 1, 2)
local specWarnTouchoftheAbyss = mod:NewSpecialWarningInterrupt(298033, "HasInterrupt", nil, nil, 1, 2)
local specWarnPsychicScream = mod:NewSpecialWarningInterrupt(308375, "HasInterrupt", nil, nil, 1, 2)
local specWarnImproveMorale = mod:NewSpecialWarningInterrupt(308998, "HasInterrupt", nil, nil, 1, 2)
local specWarnVoidBuffet = mod:NewSpecialWarningInterrupt(297315, "HasInterrupt", nil, nil, 1, 2)
local specWarnBladeFlourish = mod:NewSpecialWarningRun(311399, nil, nil, nil, 4, 2)
local specWarnRoaringBlast = mod:NewSpecialWarningDodge(311456, nil, nil, nil, 2, 2)
local specWarnChaosBreath = mod:NewSpecialWarningDodge(296911, nil, nil, nil, 2, 2)
local specWarnAgonizingTormentD = mod:NewSpecialWarningDispel(308366, "RemoveCurse", nil, nil, 1, 2)
local specWarnCorruptedBlight = mod:NewSpecialWarningDispel(308265, "RemoveDisease", nil, 2, 1, 2)
local specWarnBlightEruption = mod:NewSpecialWarningMoveAway(308305, nil, nil, nil, 1, 2)
local yellBlightEruption = mod:NewYell(308305)
local specWarnRiftStrike = mod:NewSpecialWarningDodge(308481, nil, nil, nil, 2, 2)
--General
local timerGiftoftheTitan = mod:NewBuffFadesTimer(20, 313698, nil, nil, nil, 5)
--Affixes/Masks
local timerDarkImaginationCD = mod:NewCDTimer(60, 315976, nil, nil, nil, 1, 296733)
--Alleria Windrunner
local timerDarkenedSkyCD = mod:NewCDTimer(13.3, 308278, nil, nil, nil, 3)
local timerVoidEruptionCD = mod:NewCDTimer(27.9, 309819, nil, nil, nil, 2)
--Extra Abilities (used by Alleria and the area LTs)
--local timerTaintedPolymorphCD = mod:NewAITimer(21, 309648, nil, nil, nil, 3, nil, DBM_COMMON_L.MAGIC_ICON)
--local timerExplosiveOrdnanceCD = mod:NewCDTimer(20.7, 305672, nil, nil, nil, 3)--20-25 (on alleria anyways, forgot to log other guy)
mod:AddInfoFrameOption(307831, true)
mod:AddNamePlateOption("NPAuraOnHaunting2", 306545, false)
mod:AddNamePlateOption("NPAuraOnAbyss", 298033)
mod:AddNamePlateOption("NPAuraOnMorale", 308998)
--Antispam 1: Boss throttles, 2: GTFOs, 3: Dodge stuff on ground. 4: Face Away/special action. 5: Dodge Shockwaves
local playerName = UnitName("player")
mod.vb.TherumCleared = false
mod.vb.UlrokCleared = false
mod.vb.ShawCleared = false
mod.vb.UmbricCleared = false
local warnedGUIDs = {}
--If you have potions when run ends, the debuffs throw you in combat for about 6 seconds after run has ended
local function DelayedNameplateFix(self, once)
--Check if we changed users nameplate options and restore them
if self.Options.CVAR1 or self.Options.CVAR2 or self.Options.CVAR3 then
if InCombatLockdown() then
if once then return end
--In combat, delay nameplate fix
DBM:Schedule(2, DelayedNameplateFix, self)
else
if self.Options.CVAR1 then
SetCVar("nameplateShowFriends", self.Options.CVAR1)
end
if self.Options.CVAR2 then
SetCVar("nameplateShowFriendlyNPCs", self.Options.CVAR2)
end
if self.Options.CVAR3 then
SetCVar("nameplateShowOnlyNames", self.Options.CVAR3)
end
self.Options.CVAR1, self.Options.CVAR2, self.Options.CVAR3 = nil, nil, nil
end
end
end
function mod:OnCombatStart(delay)
self.vb.TherumCleared = false
self.vb.UlrokCleared = false
self.vb.ShawCleared = false
self.vb.UmbricCleared = false
table.wipe(warnedGUIDs)
DelayedNameplateFix(self, true)--Repair settings from previous session if they didn't get repaired in last session
if self.Options.SpecWarn306545dodge4 then
--This warning requires friendly nameplates, because it's only way to detect it.
self.Options.CVAR1, self.Options.CVAR2, self.Options.CVAR3 = tonumber(GetCVar("nameplateShowFriends") or 0), tonumber(GetCVar("nameplateShowFriendlyNPCs") or 0), tonumber(GetCVar("nameplateShowOnlyNames") or 0)
--Check if they were disabled, if disabled, force enable them
if self.Options.CVAR1 == 0 then
SetCVar("nameplateShowFriends", 1)
end
if self.Options.CVAR2 == 0 then
SetCVar("nameplateShowFriendlyNPCs", 1)
end
if self.Options.CVAR3 == 0 then
SetCVar("nameplateShowOnlyNames", 1)
end
--Making this option rely on another option is kind of required because this won't work without nameplateShowFriendlyNPCs
if not DBM:HasMapRestrictions() and self.Options.NPAuraOnHaunting2 then
DBM:FireEvent("BossMod_EnableFriendlyNameplates")
end
end
if self.Options.NPAuraOnAbyss or self.Options.NPAuraOnMorale then
DBM:FireEvent("BossMod_EnableHostileNameplates")
end
if self.Options.InfoFrame then
DBM.InfoFrame:SetHeader(DBM:GetSpellInfo(307831))
DBM.InfoFrame:Show(5, "playerpower", 1, ALTERNATE_POWER_INDEX, nil, nil, 2)--Sorting lowest to highest
end
end
function mod:OnCombatEnd()
table.wipe(warnedGUIDs)
if self.Options.InfoFrame then
DBM.InfoFrame:Hide()
end
if self.Options.NPAuraOnAbyss or self.Options.NPAuraOnHaunting2 or self.Options.NPAuraOnMorale then
DBM.Nameplate:Hide(true, nil, nil, nil, true, self.Options.NPAuraOnAbyss or self.Options.NPAuraOnMorale, self.Options.CVAR1)--isGUID, unit, spellId, texture, force, isHostile, isFriendly
end
--Check if we changed users nameplate options and restore them
DelayedNameplateFix(self)
end
function mod:SPELL_CAST_START(args)
local spellId = args.spellId
if spellId == 308278 then
specWarnDarkenedSky:Show()
specWarnDarkenedSky:Play("watchstep")
timerDarkenedSkyCD:Start()
elseif spellId == 309819 then
specWarnVoidEruption:Show(DBM_COMMON_L.BREAK_LOS)
specWarnVoidEruption:Play("findshelter")
timerVoidEruptionCD:Start()
elseif spellId == 309648 then
if self.Options.SpecWarn309648interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnTaintedPolymorph:Show(args.sourceName)
specWarnTaintedPolymorph:Play("kickcast")
else
warnTaintedPolymorph:Show()
end
--timerTaintedPolymorphCD:Start()
elseif spellId == 298691 then
specWarnChainsofServitude:Show()
specWarnChainsofServitude:Play("justrun")
elseif spellId == 308669 and self:AntiSpam(5, 4) then
specWarnDarkGaze:Show(args.sourceName)
specWarnDarkGaze:Play("turnaway")
elseif spellId == 308366 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnAgonizingTorment:Show(args.sourceName)
specWarnAgonizingTorment:Play("kickcast")
elseif spellId == 296537 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnMentalAssault:Show(args.sourceName)
specWarnMentalAssault:Play("kickcast")
elseif spellId == 308575 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnShadowShift:Show(args.sourceName)
specWarnShadowShift:Play("kickcast")
elseif spellId == 308375 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnPsychicScream:Show(args.sourceName)
specWarnPsychicScream:Play("kickcast")
elseif spellId == 297315 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnVoidBuffet:Show(args.sourceName)
specWarnVoidBuffet:Play("kickcast")
elseif spellId == 308998 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnImproveMorale:Show(args.sourceName)
specWarnImproveMorale:Play("kickcast")
elseif spellId == 298033 then
if self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnTouchoftheAbyss:Show(args.sourceName)
specWarnTouchoftheAbyss:Play("kickcast")
else
warnTouchoftheAbyss:Show()
end
if self.Options.NPAuraOnAbyss then
DBM.Nameplate:Show(true, args.sourceGUID, 298033, nil, 7)
end
elseif spellId == 308406 then
warnEntropicLeap:Show()
elseif spellId == 311456 and self:AntiSpam(3, 5) then
specWarnRoaringBlast:Show()
specWarnRoaringBlast:Play("shockwave")
elseif spellId == 296911 and self:AntiSpam(3, 5) then
specWarnChaosBreath:Show()
specWarnChaosBreath:Play("shockwave")
elseif spellId == 309671 and self:AntiSpam(3, 5) then
specWarnForgeBreath:Show()
specWarnForgeBreath:Play("shockwave")
elseif spellId == 308481 and self:AntiSpam(5, 3) then
specWarnRiftStrike:Show()
specWarnRiftStrike:Play("watchstep")
elseif spellId == 309882 and self:AntiSpam(5, 3) then
warnBrutalSmash:Show()
elseif spellId == 308305 and GetNumGroupMembers() > 1 and DBM:UnitDebuff("player", 308265) then
specWarnBlightEruption:Show()
specWarnBlightEruption:Play("runout")
yellBlightEruption:Yell()
elseif spellId == 311399 then
specWarnBladeFlourish:Show()
specWarnBladeFlourish:Play("justrun")
elseif spellId == 308265 then
warnCorruptedBlight:Show()
elseif spellId == 296669 then
warnLurkingAppendage:Show()
end
end
function mod:SPELL_CAST_SUCCESS(args)
local spellId = args.spellId
if spellId == 309035 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
specWarnEntropicMissiles:Show(args.sourceName)
specWarnEntropicMissiles:Play("kickcast")
end
end
function mod:SPELL_AURA_APPLIED(args)
local spellId = args.spellId
if spellId == 311390 and args:IsPlayer() then
local amount = args.amount or 1
if amount >= 4 then
specWarnEntomophobia:Show()
specWarnEntomophobia:Play("keepjump")
end
elseif spellId == 315385 and args:IsPlayer() then
if self.Options.SpecWarn315385you then
specWarnScorchedFeet:Show()
specWarnScorchedFeet:Play("targetyou")
else
warnScorchedFeet:Show()
end
if GetNumGroupMembers() > 1 then--Warn allies if in scenario with others
yellScorchedFeet:Yell()
end
elseif spellId == 316481 and args:IsPlayer() then
specWarnSplitPersonality:Show()
specWarnSplitPersonality:Play("targetyou")
elseif spellId == 311641 and args:IsPlayer() then
specWarnWaveringWill:Show(playerName)
specWarnWaveringWill:Play("stopattack")
elseif spellId == 308380 then
warnConvert:Show(args.destName)
elseif spellId == 308366 and self:CheckDispelFilter() then
specWarnAgonizingTormentD:Show(args.destName)
specWarnAgonizingTormentD:Play("helpdispel")
elseif spellId == 308265 then
if self:CheckDispelFilter() then
specWarnCorruptedBlight:Show(args.destName)
specWarnCorruptedBlight:Play("helpdispel")
end
elseif spellId == 308998 then
warnImprovedMorale:CombinedShow(0.5, args.destName)
if self.Options.NPAuraOnMorale then
DBM.Nameplate:Show(true, args.destGUID, spellId, nil, 12)
end
end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED
function mod:SPELL_AURA_REMOVED(args)
local spellId = args.spellId
if spellId == 308998 then
if self.Options.NPAuraOnMorale then
DBM.Nameplate:Hide(true, args.destGUID, spellId)
end
elseif spellId == 298033 then
if self.Options.NPAuraOnAbyss then
DBM.Nameplate:Hide(true, args.sourceGUID, 298033)
end
end
end
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
if (spellId == 296674 or spellId == 312121 or spellId == 308807 or spellId == 313303) 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_INTERRUPT(args)
if type(args.extraSpellId) == "number" and args.extraSpellId == 298033 then
if self.Options.NPAuraOnAbyss then
DBM.Nameplate:Hide(true, args.destGUID, 298033)
end
end
end
function mod:UNIT_DIED(args)
local cid = self:GetCIDFromGUID(args.destGUID)
if cid == 152718 then--Alleria Windrunner
timerDarkenedSkyCD:Stop()
timerVoidEruptionCD:Stop()
--timerTaintedPolymorphCD:Stop()
--timerExplosiveOrdnanceCD:Stop()
DBM:EndCombat(self)
elseif cid == 156577 then--Therum Deepforge
--timerExplosiveOrdnanceCD:Stop()
self.vb.TherumCleared = true
elseif cid == 153541 then--slavemaster-ulrok
self.vb.UlrokCleared = true
elseif cid == 158157 then--Overlord Mathias Shaw
self.vb.ShawCleared = true
elseif cid == 158035 then--Magister Umbric
--timerTaintedPolymorphCD:Stop()
self.vb.UmbricCleared = true
elseif cid == 156795 then--S.I. Informant
if self.Options.NPAuraOnAbyss then
DBM.Nameplate:Hide(true, args.destGUID, 298033)
end
end
end
function mod:ENCOUNTER_START(encounterID)
if encounterID == 2338 and self:IsInCombat() then
timerDarkenedSkyCD:Start(4.9)
timerVoidEruptionCD:Start(20.5)
--if self.vb.TherumCleared then
--timerExplosiveOrdnanceCD:Start(9.7)
--end
--if self.vb.UlrokCleared then
--end
--if self.vb.UmbricCleared then
-- timerTaintedPolymorphCD:Start(27.9)
--end
end
end
--None of these boss abilities are in combat log
function mod:UNIT_SPELLCAST_SUCCEEDED_UNFILTERED(uId, _, spellId)
if (spellId == 305708 or spellId == 312260) and self:AntiSpam(2, 1) then
self:SendSync("ExplosiveOrd")
elseif spellId == 309035 and self:AntiSpam(2, 1) then
self:SendSync("EntropicMissiles")
elseif spellId == 311530 and self:AntiSpam(2, 1) then
self:SendSync("SeekandDestroy")
elseif spellId == 308681 and self:AntiSpam(2, 1) then
self:SendSync("SummonEye")
elseif spellId == 18950 and self:AntiSpam(2, 6) then
local cid = self:GetUnitCreatureId(uId)
if cid == 164189 or cid == 164188 then
self:SendSync("DarkImagination")
end
end
end
function mod:UNIT_SPELLCAST_INTERRUPTED_UNFILTERED(uId, _, spellId)
if spellId == 298033 then
if self.Options.NPAuraOnAbyss then
local guid = UnitGUID(uId)
DBM.Nameplate:Hide(true, guid, 298033)
end
end
end
do
--Gift of the Titans isn't in combat log either
local titanWarned = false
function mod:UNIT_AURA(uId)
local hasTitan = DBM:UnitBuff("player", 313698)
if hasTitan and not titanWarned then
warnGiftoftheTitans:Show()
timerGiftoftheTitan:Start()
titanWarned = true
elseif not hasTitan and titanWarned then
titanWarned = false
end
end
end
function mod:NAME_PLATE_UNIT_ADDED(unit)
if unit and (UnitName(unit) == playerName) and not (UnitPlayerOrPetInRaid(unit) or UnitPlayerOrPetInParty(unit)) then
local guid = UnitGUID(unit)
if not guid then return end
if not warnedGUIDs[guid] then
warnedGUIDs[guid] = true
if self:AntiSpam(2, 2) then--Throttled because sometimes two spawn at once
specWarnHauntingShadows:Show()
specWarnHauntingShadows:Play("runaway")
end
end
if not DBM:HasMapRestrictions() and self.Options.NPAuraOnHaunting2 then
DBM.Nameplate:Show(true, guid, 306545, 1029718, 5)
end
end
end
mod.FORBIDDEN_NAME_PLATE_UNIT_ADDED = mod.NAME_PLATE_UNIT_ADDED--Just in case blizzard fixes map restrictions
function mod:OnSync(msg)
if not self:IsInCombat() then return end
if msg == "ExplosiveOrd" then
warnExplosiveOrdnance:Show()
elseif msg == "EntropicMissiles" then
warnEntropicMissiles:Show()
elseif msg == "SeekandDestroy" then
warnSeekAndDestroy:Show()
elseif msg == "SummonEye" then
warnSummonEyeofChaos:Show()
elseif msg == "DarkImagination" then
timerDarkImaginationCD:Start()
end
end