--------------------------------------------------------------------------------
-- 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