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.

297 lines
9.8 KiB

--------------------------------------------------------------------------------
-- TODO List:
-- - All the timers
-- - Mythic abilitys
-- - 212993 Shimmering Feather is not in the combat log
--------------------------------------------------------------------------------
-- Module Declaration
--
local mod, CL = BigWigs:NewBoss("Elerethe Renferal", 1520, 1744)
if not mod then return end
mod:RegisterEnableMob(106087)
mod.engageId = 1876
mod.respawnTime = 30
--------------------------------------------------------------------------------
-- Locals
--
local twistingShadowsCount = 1
local webOfPainTargets = {}
--------------------------------------------------------------------------------
-- Localization
--
local L = mod:GetLocale()
if L then
L.isLinkedWith = "%s is linked with %s"
L.yourLink = "You are linked with %s"
L.yourLinkShort = "Linked with %s"
L.custom_off_webofpain_marker = "Web of Pain marker"
L.custom_off_webofpain_marker_desc = "Mark Web of Pain targets with {rt1}{rt2}{rt3}{rt4}, requires promoted or leader. The tanks will be marked with {rt1} and {rt2}. The other targets with {rt3} and {rt4}."
L.custom_off_webofpain_marker_icon = 1
end
--------------------------------------------------------------------------------
-- Initialization
--
function mod:GetOptions()
return {
--[[ Spider Form ]]--
215300, -- Web of Pain
"custom_off_webofpain_marker",
212364, -- Feeding Time
214348, -- Vile Ambush
{215443, "SAY", "SAY_COUNTDOWN", "FLASH"}, -- Necrotic Venom
--[[ Roc Form ]]--
212707, -- Gathering Clouds
210948, -- Dark Storm
{210864, "SAY", "SAY_COUNTDOWN", "FLASH"}, -- Twisting Shadows
210547, -- Razor Wing
{215582, "TANK"}, -- Raking Talons
218124, -- Violent Winds (mythic)
--[[ General ]]--
"stages",
213124, -- Venomous Pool
"berserk",
},{
[215300] = -13259, -- Spider Form
[212707] = -13263, -- Roc Form
["stages"] = "general",
}
end
function mod:OnBossEnable()
self:RegisterUnitEvent("UNIT_SPELLCAST_SUCCEEDED", nil, "boss1")
--[[ Spider Form ]]--
self:Log("SPELL_AURA_APPLIED", "WebOfPainApplied", 215300) -- 215307 is applied to the other player
self:Log("SPELL_AURA_REMOVED", "WebOfPainRemoved", 215300)
self:Log("SPELL_CAST_SUCCESS", "VileAmbush", 214348)
self:Log("SPELL_CAST_SUCCESS", "NecroticVenom", 215443)
--[[ Roc Form ]]--
self:Log("SPELL_CAST_START", "GatheringCloudsStart", 212707)
self:Log("SPELL_CAST_START", "DarkStorm", 210948)
self:Log("SPELL_CAST_SUCCESS", "TwistingShadows", 210864)
self:Log("SPELL_CAST_START", "RazorWing", 210547)
self:Log("SPELL_CAST_START", "RakingTalons", 215582)
self:Log("SPELL_CAST_START", "ViolentWinds", 218124)
--[[ General ]]--
self:Log("SPELL_CAST_START", "StartDebuffScan", 215443, 210864) -- Necrotic Venom, Twisting Shadows
self:Log("SPELL_AURA_APPLIED", "PoolDamage", 213124, 215489)
self:Log("SPELL_AURA_APPLIED_DOSE", "PoolDamage", 213124, 215489)
self:Log("SPELL_PERIODIC_DAMAGE", "PoolDamage", 213124, 215489)
self:Log("SPELL_PERIODIC_MISSED", "PoolDamage", 213124, 215489)
end
function mod:OnEngage()
twistingShadowsCount = 1
self:Bar(215300, 6) -- Web of Pain
self:Bar(212364, 16) -- Feeding Time
self:Bar("stages", 91, -13263, "inv_ravenlordmount") -- Roc Form
webOfPainTargets = {}
end
function mod:OnBossDisable()
for player,_ in pairs(webOfPainTargets) do
self:CustomIcon(false, player)
end
webOfPainTargets = {}
end
--------------------------------------------------------------------------------
-- Event Handlers
--
local function timeToTransform(self)
local spiderFormIn = self:BarTimeLeft(-13259) -- Spider Form
return spiderFormIn > 0 and spiderFormIn or self:BarTimeLeft(-13263) -- Roc Form
end
-- Blizzard made us write this awesome function due to a lack of SPELL_AURA_APPLIED events
-- Necrotic Venom: 215443
-- Twisting Shadows: 210864
do
local scheduled, players, list = nil, {}, mod:NewTargetList()
local key, spellName = 0, ""
function mod:UNIT_AURA(_, unit) -- XXX get Blizz to fix this
if self:UnitDebuff(unit, spellName, 215449) then -- 215449 is Necrotic Venom on Mythic
local guid = self:UnitGUID(unit)
if not players[guid] then
local spellId = key -- SetOption:215443,210864:
players[guid] = true
list[#list+1] = self:UnitName(unit)
if unit == "player" then
self:MessageOld(spellId, "blue", "long", CL.you:format(spellName))
self:Flash(spellId)
self:Say(spellId)
local _, _, _, expires = self:UnitDebuff(unit, spellName)
local remaining = expires-GetTime()
self:Bar(spellId, remaining, CL.you:format(spellName))
self:SayCountdown(spellId, remaining)
else
if scheduled then
self:CancelTimer(scheduled)
scheduled = nil
end
if #list == 2 then
self:TargetMessageOld(spellId, list, "orange", "warning")
else
scheduled = self:ScheduleTimer("TargetMessageOld", 0.5, spellId, list, "orange", "warning")
end
end
end
end
end
function mod:StartDebuffScan(args)
key, spellName = args.spellId, args.spellName
players = {}
self:RegisterEvent("UNIT_AURA")
self:ScheduleTimer("UnregisterEvent", 5, "UNIT_AURA")
end
function mod:NecroticVenom(args)
if timeToTransform(self) > 26 then -- skips the one before the transformation
self:Bar(args.spellId, 22)
end
end
function mod:TwistingShadows(args)
twistingShadowsCount = twistingShadowsCount + 1
local next = twistingShadowsCount == 2 and 40 or twistingShadowsCount == 4 and 33 or 22
if timeToTransform(self) > next then
self:CDBar(args.spellId, next)
end
end
end
--[[ Spider Form ]]--
function mod:UNIT_SPELLCAST_SUCCEEDED(_, _, _, spellId)
if spellId == 212364 then -- Feeding Time, there is also 214305, fires about 1.2s later
self:MessageOld(spellId, "red", "info")
self:Bar(214348, 8.2) -- Vile Ambush
if timeToTransform(self) > 51 then
self:Bar(spellId, 51)
end
elseif spellId == 226039 then -- Bird Transform => Roc Form
self:MessageOld("stages", "cyan", "info", -13263, "inv_ravenlordmount") -- Roc Form
twistingShadowsCount = 1
self:CDBar(210864, 8) -- Twisting Shadows
self:CDBar(212707, 15.7) -- Gathering Clouds
self:Bar(210948, 27) -- Dark Storm
self:Bar(215582, self:Mythic() and 63 or 53) -- Raking Talons
self:Bar(210547, self:Mythic() and 70 or 60) -- Razor Wing
if self:Mythic() then
self:Bar(218124, 53) -- Violent Winds
end
self:Bar("stages", 134, -13259, "inv_spidermount") -- Spider Form
elseif spellId == 226055 then -- Spider Transform => Spider Form
self:MessageOld("stages", "cyan", "info", -13259, "inv_spidermount") -- Spider Form
self:Bar(215300, 6) -- Web of Pain
self:Bar(212364, 16) -- Feeding Time
self:Bar("stages", 97, -13263, "inv_ravenlordmount") -- Roc Form
end
end
function mod:WebOfPainApplied(args)
if self:Me(args.destGUID) then
self:MessageOld(args.spellId, "blue", "warning", L.yourLink:format(self:ColorName(args.sourceName)))
local _, _, _, expires = self:UnitDebuff("player", args.spellName, 215300, 215307) -- I think 215307 is the secondary player (the person you're linked to) id?
local remaining = expires-GetTime()
self:Bar(args.spellId, remaining, L.yourLinkShort:format(self:ColorName(args.sourceName)))
elseif self:Me(args.sourceGUID) then
self:MessageOld(args.spellId, "blue", "warning", L.yourLink:format(self:ColorName(args.destName)))
local _, _, _, expires = self:UnitDebuff("player", args.spellName, 215300, 215307) -- I think 215307 is the secondary player (the person you're linked to) id?
local remaining = expires-GetTime()
self:Bar(args.spellId, remaining, L.yourLinkShort:format(self:ColorName(args.destName)))
elseif not self:CheckOption(args.spellId, "ME_ONLY") then
self:MessageOld(args.spellId, "yellow", nil, L.isLinkedWith:format(self:ColorName(args.sourceName), self:ColorName(args.destName)))
end
if self:GetOption("custom_off_webofpain_marker") then -- TODO
webOfPainTargets[args.sourceName] = true
webOfPainTargets[args.destName] = true
if self:Tank(args.sourceName) or self:Tank(args.destName) then -- Tank link
self:CustomIcon(false, args.sourceName, 1)
self:CustomIcon(false, args.destName, 2)
else -- Other link
self:CustomIcon(false, args.sourceName, 3)
self:CustomIcon(false, args.destName, 4)
end
end
end
function mod:WebOfPainRemoved(args)
if self:GetOption("custom_off_webofpain_marker") then -- TODO
self:CustomIcon(false, args.sourceName)
webOfPainTargets[args.sourceName] = nil
self:CustomIcon(false, args.destName)
webOfPainTargets[args.destName] = nil
end
end
function mod:VileAmbush(args)
self:MessageOld(args.spellId, "yellow", "alarm")
end
function mod:GatheringCloudsStart(args)
self:MessageOld(args.spellId, "yellow", "long", CL.casting:format(args.spellName))
self:CastBar(args.spellId, 10.5) -- 2.5s cast + 8s duration = 10.5s total
end
--[[ Roc Form ]]--
function mod:DarkStorm(args)
self:MessageOld(args.spellId, "cyan", "info")
end
function mod:RazorWing(args)
self:MessageOld(args.spellId, "red", "alarm")
self:CastBar(args.spellId, 4.5)
if timeToTransform(self) > 32.9 then
self:Bar(args.spellId, 32.9)
end
end
function mod:RakingTalons(args)
self:MessageOld(args.spellId, "yellow", "long")
if timeToTransform(self) > 32.9 then
self:Bar(args.spellId, 32.9)
end
end
function mod:ViolentWinds(args)
self:MessageOld(args.spellId, "orange", "info")
self:CastBar(args.spellId, 6)
if timeToTransform(self) > 39 then
self:Bar(args.spellId, 39)
end
end
--[[ General ]]--
do
local prev = 0
function mod:PoolDamage(args)
local t = GetTime()
if self:Me(args.destGUID) and t-prev > 1.5 then
prev = t
self:MessageOld(213124, "blue", "alert", CL.underyou:format(args.spellName))
end
end
end