-- GLOBALS: tDeleteItem, string -------------------------------------------------------------------------------- -- TODO List: -- - Add more timers, if they are more reliable in the future -- - Could add bar stopping for: -- - EchoingAnguish -- - TormentingBurst -- - Suffocating Dark -------------------------------------------------------------------------------- -- Module Declaration -- local mod, CL = BigWigs:NewBoss("Demonic Inquisition", 1676, 1867) if not mod then return end mod:RegisterEnableMob(116689, 116691) mod.engageId = 2048 mod.respawnTime = 15 -------------------------------------------------------------------------------- -- Locals -- local pangsofGuiltCounter = 1 local sweepCounter = 1 local nextAltPowerWarning = 20 local suffocatingDarkCounter = 1 local jailList = {} local jailCount = 0 local jailTimer = nil local fixateList = {} -------------------------------------------------------------------------------- -- Localization -- local L = mod:GetLocale() if L then L.fixate = "{-15307} ({41951})" L.fixate_desc = -15307 L.fixate_icon = 41951 L.custom_on_fixate_plates = "Fixate icon on Enemy Nameplate" L.custom_on_fixate_plates_desc = "Show an icon on the target nameplate that is fixating on you.\nRequires the use of Enemy Nameplates. This feature is currently only supported by KuiNameplates." L.custom_on_fixate_plates_icon = L.fixate_icon L.infobox_title_prisoners = "%d |4Prisoner:Prisoners;" L.custom_on_stop_timers = "Always show ability bars" L.custom_on_stop_timers_desc = "Demonic Inquisition has some spells which are delayed by interupts/other casts. When this option is enabled, the bars for those abilities will stay on your screen." end -------------------------------------------------------------------------------- -- Initialization -- local anguishMarker = mod:AddMarkerOption(false, "player", 1, 233983, 1, 2, 3) function mod:GetOptions() return { {236283, "INFOBOX"}, -- Belac's Prisoner "altpower", "custom_on_stop_timers", 233104, -- Torment 248671, -- Unbridled Torment (Berserk) {233426, "TANK"}, -- Scythe Sweep {233431, "SAY"}, -- Calcified Quills 233441, -- Bone Saw 239401, -- Pangs of Guilt {233983, "FLASH", "SAY", "PROXIMITY"}, -- Echoing Anguish anguishMarker, 233895, -- Suffocating Dark 234015, -- Tormenting Burst 235230, -- Fel Squall 248713, -- Soul Corruption {"fixate", "FLASH"}, "custom_on_fixate_plates", },{ [236283] = "general", [233426] = -14645, -- Atrigan [239401] = -14646, -- Belac [248713] = -15550, -- Tormented Soul ["fixate"] = "mythic", } end function mod:OnBossEnable() -- General self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1", "boss2") self:RegisterMessage("BigWigs_BarCreated", "BarCreated") self:Log("SPELL_AURA_APPLIED", "BelacsPrisoner", 236283) self:Log("SPELL_AURA_REMOVED", "BelacsPrisonerRemoved", 236283) -- Atrigan self:Log("SPELL_CAST_START", "ScytheSweep", 233426) self:Log("SPELL_CAST_SUCCESS", "CalcifiedQuills", 233431) self:Log("SPELL_CAST_SUCCESS", "BoneSaw", 233441) -- Belac self:Log("SPELL_CAST_START", "PangsofGuilt", 239401) self:Log("SPELL_CAST_START", "EchoingAnguish", 233983) self:Log("SPELL_AURA_APPLIED", "EchoingAnguishApplied", 233983) self:Log("SPELL_AURA_REMOVED", "EchoingAnguishRemoved", 233983) self:Log("SPELL_CAST_START", "TormentingBurst", 234015) self:Log("SPELL_CAST_SUCCESS", "FelSquall", 235230) self:Log("SPELL_AURA_APPLIED", "SuffocatingDarkDamage", 233901) self:Log("SPELL_PERIODIC_DAMAGE", "SuffocatingDarkDamage", 233901) self:Log("SPELL_PERIODIC_MISSED", "SuffocatingDarkDamage", 233901) -- Tormented Soul self:Log("SPELL_AURA_APPLIED_DOSE", "SoulCorruption", 248713) if self:Mythic() and self:GetOption("custom_on_fixate_plates") then self:ShowPlates() end end function mod:OnEngage() pangsofGuiltCounter = 1 sweepCounter = 1 suffocatingDarkCounter = 1 nextAltPowerWarning = 20 jailCount = 0 jailTimer = nil jailList = {} fixateList = {} -- Jail Infobox self:OpenInfo(236283, L.infobox_title_prisoners:format(jailCount)) self:OpenAltPower("altpower", 233104) -- Torment -- Atrigan self:CDBar(233426, 5.8) -- Scythe Sweep if not self:Easy() then self:CDBar(233431, 11) -- Calcified Quills end self:CDBar(233441, 60.5) -- Bone Saw -- Belac self:CDBar(235230, 35) -- Fel Squall self:RegisterUnitEvent("UNIT_POWER_FREQUENT", nil, "player") self:Berserk(720, true, nil, 248671, 248671) -- confirmed for nm/hc/my - 248671 has a nice description, 248669 is the aura applied if self:Mythic() and (self:GetOption("fixate") > 0 or self:GetOption("custom_on_fixate_plates")) then self:RegisterTargetEvents("CheckForFixate") end end function mod:OnBossDisable() if self:Mythic() and self:GetOption("custom_on_fixate_plates") then self:HidePlates() end end -------------------------------------------------------------------------------- -- Event Handlers -- do local prev = 0 function mod:CheckForFixate(_, unit, guid) local mobId = self:MobId(guid) if mobId == 121138 and not fixateList[guid] and self:Me(self:UnitGUID(unit.."target")) then -- Tormented Fragment fixateList[guid] = true local t = GetTime() if t-prev > 1 then prev = t self:Flash("fixate", 41951) self:MessageOld("fixate", "blue", "long", CL.you:format(self:SpellName(41951)), 41951) -- 41951 = "Fixate" end if self:GetOption("custom_on_fixate_plates") then self:AddPlateIcon(41951, guid) end end end end do local abilitysToPause = { [233983] = true, -- Echoing Anguish [234015] = true, -- Tormenting Burst [233895] = true, -- Suffocating Dark } local castPattern = CL.cast:gsub("%%s", ".+") local function stopAtZeroSec(bar) if bar.remaining < 0.15 then -- Pause at 0.0 bar:SetDuration(0.01) -- Make the bar look full bar:Start() bar:Pause() bar:SetTimeVisibility(false) end end function mod:BarCreated(_, _, bar, _, key, text) if self:GetOption("custom_on_stop_timers") and abilitysToPause[key] and not text:match(castPattern) then bar:AddUpdateFunction(stopAtZeroSec) end end end function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId) if spellId == 233895 then -- Suffocating Dark self:MessageOld(spellId, "yellow", "info") suffocatingDarkCounter = suffocatingDarkCounter + 1 self:CDBar(spellId, suffocatingDarkCounter == 2 and 42 or 25) end end do local lastPower, prev = 0, 0 function mod:UNIT_POWER_FREQUENT(event, unit, pType) if pType == "ALTERNATE" then local power = UnitPower(unit, 10) -- Enum.PowerType.Alternate = 10 if power < lastPower or power >= nextAltPowerWarning then self:StackMessage(233104, self:UnitName(unit), power, "blue") local t = GetTime() if (power >= 80 or power < lastPower) and t-prev > 1.5 then self:PlaySound(233104, "info") prev = t end nextAltPowerWarning = tonumber(string.format("%d", power/20))*20+20 -- every 20 power end lastPower = power end end end do local function updatePower(self) for k in next, jailList do jailList[k] = UnitPower(k, 10) or 1 end self:SetInfoByTable(236283, jailList) end function mod:BelacsPrisoner(args) if self:Me(args.destGUID)then self:TargetMessageOld(args.spellId, args.destName, "blue", "alert") end -- Add person to InfoBox jailCount = jailCount + 1 jailList[args.destName] = UnitPower(args.destName, 10) or 1 -- Incase we can't grab unitpower self:SetInfoTitle(args.spellId, L.infobox_title_prisoners:format(jailCount)) self:SetInfoByTable(args.spellId, jailList) if not jailTimer then jailTimer = self:ScheduleRepeatingTimer(updatePower, 1, self) end end end function mod:BelacsPrisonerRemoved(args) -- Remove from InfoBox jailList[args.destName] = nil jailCount = jailCount - 1 if not next(jailList) then self:CancelTimer(jailTimer) jailTimer = nil end self:SetInfoTitle(args.spellId, L.infobox_title_prisoners:format(jailCount)) self:SetInfoByTable(args.spellId, jailList) end function mod:ScytheSweep(args) self:MessageOld(args.spellId, "yellow", self:Tank() and "alert") sweepCounter = sweepCounter + 1 self:CDBar(args.spellId, sweepCounter > 4 and sweepCounter % 2 == 0 and 35 or 24) end do local function printTarget(self, name, guid) self:TargetMessageOld(233431, name, "orange", "alert", nil, nil, true) if self:Me(guid) then self:Say(233431) end end function mod:CalcifiedQuills(args) self:GetBossTarget(printTarget, 0.7, args.sourceGUID) self:CastBar(args.spellId, 5) self:CDBar(args.spellId, 21.5) end end function mod:BoneSaw(args) self:MessageOld(args.spellId, "red", "warning") self:CastBar(args.spellId, 16) if self:Easy() then self:Bar(args.spellId, 60.5) else self:CDBar(args.spellId, 61) -- 61-63 end end function mod:PangsofGuilt(args) -- Interuptable self:MessageOld(args.spellId, "red", self:Interrupter(args.sourceGUID) and "alarm", CL.casting:format(CL.count:format(args.spellName, pangsofGuiltCounter))) pangsofGuiltCounter = (pangsofGuiltCounter % 3) + 1 end function mod:EchoingAnguish(args) self:MessageOld(args.spellId, "red", "alert") self:OpenProximity(args.spellId, 8) -- Open proximity a bit before self:CDBar(args.spellId, 22) end do local proxList = {} function mod:EchoingAnguishApplied(args) proxList[#proxList+1] = args.destName if self:Me(args.destGUID) then self:Flash(args.spellId) self:Say(args.spellId) end self:OpenProximity(args.spellId, 8, proxList) -- Don't stand near others if they have the debuff if self:GetOption(anguishMarker) then self:CustomIcon(false, args.destName, #proxList) end end function mod:EchoingAnguishRemoved(args) tDeleteItem(proxList, args.destName) if self:GetOption(anguishMarker) then self:CustomIcon(false, args.destName) end if #proxList == 0 then -- If there are no debuffs left, close proximity self:CloseProximity(args.spellId) else self:OpenProximity(args.spellId, 8, proxList) -- Refresh list end end end function mod:TormentingBurst(args) self:MessageOld(args.spellId, "yellow", self:Healer() and "long") self:CDBar(args.spellId, 17.1) end function mod:FelSquall(args) self:MessageOld(args.spellId, "red", "warning") self:CastBar(args.spellId, 16) self:Bar(args.spellId, 60.5) end do local prev = 0 function mod:SuffocatingDarkDamage(args) local t = GetTime() if self:Me(args.destGUID) and t-prev > 3 then prev = t self:MessageOld(233895, "blue", "alert", CL.underyou:format(args.spellName)) end end end function mod:SoulCorruption(args) if self:Me(args.destGUID) then local amount = args.amount or 1 if amount % 5 == 0 then self:StackMessage(args.spellId, args.destName, amount, "red", "warning") -- check sound amount end end end