2010-07-24 22:41:42 +02:00
/*
2020-01-02 06:44:10 +01:00
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
2010-07-24 22:41:42 +02:00
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Scripts for spells with SPELLFAMILY_DRUID and SPELLFAMILY_GENERIC spells used by druid players.
* Ordered alphabetically using scriptname.
* Scriptnames of files in this file should be prefixed with "spell_dru_".
*/
2012-02-19 16:57:07 +01:00
#include "ScriptMgr.h"
2017-06-02 23:53:24 +02:00
#include "Containers.h"
2018-07-22 19:44:27 +02:00
#include "Map.h"
2017-06-02 23:53:24 +02:00
#include "Player.h"
2017-08-13 12:03:43 +02:00
#include "Spell.h"
2010-08-18 00:20:23 +06:00
#include "SpellAuraEffects.h"
2015-02-17 01:01:44 +01:00
#include "SpellHistory.h"
2017-06-02 23:53:24 +02:00
#include "SpellMgr.h"
#include "SpellScript.h"
2010-07-24 22:41:42 +02:00
2010-08-18 00:20:23 +06:00
enum DruidSpells
{
2021-02-23 21:05:39 +02:00
SPELL_DRUID_BALANCE_T10_BONUS = 70718 ,
SPELL_DRUID_BALANCE_T10_BONUS_PROC = 70721 ,
2021-03-09 00:01:31 +02:00
SPELL_DRUID_BEAR_FORM = 5487 ,
2021-02-23 21:05:39 +02:00
SPELL_DRUID_BLESSING_OF_CENARIUS = 40452 ,
SPELL_DRUID_BLESSING_OF_ELUNE = 40446 ,
SPELL_DRUID_BLESSING_OF_REMULOS = 40445 ,
SPELL_DRUID_BLESSING_OF_THE_CLAW = 28750 ,
2021-03-09 00:01:31 +02:00
SPELL_DRUID_BLOOD_FRENZY_AURA = 203962 ,
SPELL_DRUID_BLOOD_FRENZY_RAGE_GAIN = 203961 ,
SPELL_DRUID_BRAMBLES_DAMAGE_AURA = 213709 ,
SPELL_DRUID_BRAMBLES_PASSIVE = 203953 ,
SPELL_DRUID_BRAMBLES_REFLECT = 203958 ,
SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE = 204031 ,
2021-02-23 21:05:39 +02:00
SPELL_DRUID_CAT_FORM = 768 ,
2021-03-09 00:01:31 +02:00
SPELL_DRUID_EARTHWARDEN_AURA = 203975 ,
2021-02-23 21:05:39 +02:00
SPELL_DRUID_EXHILARATE = 28742 ,
SPELL_DRUID_FERAL_CHARGE_BEAR = 16979 ,
SPELL_DRUID_FERAL_CHARGE_CAT = 49376 ,
SPELL_DRUID_FORM_AQUATIC = 1066 ,
SPELL_DRUID_FORM_FLIGHT = 33943 ,
SPELL_DRUID_FORM_STAG = 165961 ,
SPELL_DRUID_FORM_SWIFT_FLIGHT = 40120 ,
SPELL_DRUID_FORMS_TRINKET_BEAR = 37340 ,
SPELL_DRUID_FORMS_TRINKET_CAT = 37341 ,
SPELL_DRUID_FORMS_TRINKET_MOONKIN = 37343 ,
SPELL_DRUID_FORMS_TRINKET_NONE = 37344 ,
SPELL_DRUID_FORMS_TRINKET_TREE = 37342 ,
2021-03-09 00:01:31 +02:00
SPELL_DRUID_GALACTIC_GUARDIAN_AURA = 213708 ,
2021-02-23 21:05:39 +02:00
SPELL_DRUID_GORE_PROC = 93622 ,
SPELL_DRUID_IDOL_OF_FERAL_SHADOWS = 34241 ,
SPELL_DRUID_IDOL_OF_WORSHIP = 60774 ,
SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE = 102543 ,
SPELL_DRUID_INFUSION = 37238 ,
SPELL_DRUID_LANGUISH = 71023 ,
SPELL_DRUID_LIFEBLOOM_ENERGIZE = 64372 ,
SPELL_DRUID_LIFEBLOOM_FINAL_HEAL = 33778 ,
SPELL_DRUID_LIVING_SEED_HEAL = 48503 ,
SPELL_DRUID_LIVING_SEED_PROC = 48504 ,
SPELL_DRUID_MANGLE = 33917 ,
SPELL_DRUID_MOONFIRE_DAMAGE = 164812 ,
SPELL_DRUID_REJUVENATION_T10_PROC = 70691 ,
SPELL_DRUID_RESTORATION_T10_2P_BONUS = 70658 ,
SPELL_DRUID_SAVAGE_ROAR = 62071 ,
SPELL_DRUID_SKULL_BASH_CHARGE = 221514 ,
SPELL_DRUID_SKULL_BASH_INTERRUPT = 93985 ,
SPELL_DRUID_STAMPEDE_BAER_RANK_1 = 81016 ,
SPELL_DRUID_STAMPEDE_CAT_RANK_1 = 81021 ,
SPELL_DRUID_STAMPEDE_CAT_STATE = 109881 ,
SPELL_DRUID_SUNFIRE_DAMAGE = 164815 ,
SPELL_DRUID_SURVIVAL_INSTINCTS = 50322 ,
SPELL_DRUID_TRAVEL_FORM = 783 ,
2021-03-09 00:01:31 +02:00
SPELL_DRUID_THRASH_BEAR = 77758 ,
SPELL_DRUID_THRASH_BEAR_AURA = 192090 ,
SPELL_DRUID_THRASH_CAT = 106830 ,
2021-02-22 23:10:49 +02:00
};
class RaidCheck
{
public :
explicit RaidCheck ( Unit const * caster ) : _caster ( caster ) { }
bool operator ()( WorldObject * obj ) const
{
if ( Unit * target = obj -> ToUnit ())
return ! _caster -> IsInRaidWith ( target );
return true ;
}
private :
Unit const * _caster ;
2013-01-14 20:28:32 +01:00
};
2021-03-09 00:01:31 +02:00
class spell_dru_base_transformer : public SpellScript
{
PrepareSpellScript ( spell_dru_base_transformer );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ GetShapeshiftFormSpell () });
}
void HandleOnCast ()
{
// Change into cat form
if ( GetCaster () -> GetShapeshiftForm () != GetShapeshiftForm ())
GetCaster () -> CastSpell ( GetCaster (), GetShapeshiftFormSpell (), true );
}
void Register () override
{
BeforeCast += SpellCastFn ( spell_dru_base_transformer :: HandleOnCast );
}
protected :
virtual bool ToCatForm () const = 0 ;
ShapeshiftForm GetShapeshiftForm () const { return ToCatForm () ? FORM_CAT_FORM : FORM_BEAR_FORM ; }
uint32 GetShapeshiftFormSpell () const { return ToCatForm () ? SPELL_DRUID_CAT_FORM : SPELL_DRUID_BEAR_FORM ; }
};
// 22812 - Barkskin
class spell_dru_barkskin : public AuraScript
{
PrepareAuraScript ( spell_dru_barkskin );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_BRAMBLES_PASSIVE });
}
void HandlePeriodic ( AuraEffect const * /*aurEff*/ )
{
Unit * target = GetTarget ();
if ( target -> HasAura ( SPELL_DRUID_BRAMBLES_PASSIVE ))
target -> CastSpell ( target , SPELL_DRUID_BRAMBLES_DAMAGE_AURA , true );
}
void Register () override
{
OnEffectPeriodic += AuraEffectPeriodicFn ( spell_dru_barkskin :: HandlePeriodic , EFFECT_2 , SPELL_AURA_PERIODIC_DUMMY );
}
};
// 77758 - Berserk
class spell_dru_berserk : public spell_dru_base_transformer
{
protected :
bool ToCatForm () const override { return false ; }
};
// 203953 - Brambles - SPELL_DRUID_BRAMBLES_PASSIVE
class spell_dru_brambles : public AuraScript
{
PrepareAuraScript ( spell_dru_brambles );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_BRAMBLES_REFLECT , SPELL_DRUID_BRAMBLES_DAMAGE_AURA });
}
void HandleAbsorb ( AuraEffect * /*aurEff*/ , DamageInfo & /*dmgInfo*/ , uint32 & /*absorbAmount*/ )
{
// Prevent Removal
PreventDefaultAction ();
}
void HandleAfterAbsorb ( AuraEffect * /*aurEff*/ , DamageInfo & dmgInfo , uint32 & absorbAmount )
{
// reflect back damage to the attacker
Unit * target = GetTarget ();
if ( Unit * attacker = dmgInfo . GetAttacker ())
target -> CastCustomSpell ( SPELL_DRUID_BRAMBLES_REFLECT , SPELLVALUE_BASE_POINT0 , absorbAmount , attacker , TRIGGERED_FULL_MASK );
}
void Register () override
{
OnEffectAbsorb += AuraEffectAbsorbFn ( spell_dru_brambles :: HandleAbsorb , EFFECT_0 );
AfterEffectAbsorb += AuraEffectAbsorbFn ( spell_dru_brambles :: HandleAfterAbsorb , EFFECT_0 );
}
};
// 155835 - Bristling Fur
class spell_dru_bristling_fur : public AuraScript
{
PrepareAuraScript ( spell_dru_bristling_fur );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE });
}
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & eventInfo )
{
// BristlingFurRage = 100 * Damage / MaxHealth.
if ( DamageInfo * damageInfo = eventInfo . GetDamageInfo ())
{
Unit * target = GetTarget ();
uint32 rage = 100.0f * ( float ) damageInfo -> GetDamage () / ( float ) target -> GetMaxHealth ();
if ( rage > 0 )
target -> CastCustomSpell ( SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE , SPELLVALUE_BASE_POINT0 , rage , target , TRIGGERED_FULL_MASK );
}
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_bristling_fur :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
2013-08-01 22:02:14 +02:00
// 1850 - Dash
class spell_dru_dash : public SpellScriptLoader
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_dash () : SpellScriptLoader ( "spell_dru_dash" ) { }
2013-08-01 22:02:14 +02:00
2017-03-18 14:25:26 +01:00
class spell_dru_dash_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_dash_AuraScript );
2013-08-01 22:02:14 +02:00
2017-03-18 14:25:26 +01:00
void CalculateAmount ( AuraEffect const * /*aurEff*/ , int32 & amount , bool & /*canBeRecalculated*/ )
2013-08-01 22:02:14 +02:00
{
2017-03-18 14:25:26 +01:00
// do not set speed if not in cat form
if ( GetUnitOwner () -> GetShapeshiftForm () != FORM_CAT_FORM )
amount = 0 ;
2013-08-01 22:02:14 +02:00
}
2017-03-18 14:25:26 +01:00
void Register () override
2013-08-01 22:02:14 +02:00
{
2017-03-18 14:25:26 +01:00
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dru_dash_AuraScript :: CalculateAmount , EFFECT_0 , SPELL_AURA_MOD_INCREASE_SPEED );
2013-08-01 22:02:14 +02:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_dash_AuraScript ();
}
2013-08-01 22:02:14 +02:00
};
2021-03-09 00:01:31 +02:00
// 203974 - Earthwarden
class spell_dru_earthwarden : public AuraScript
{
PrepareAuraScript ( spell_dru_earthwarden );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_THRASH_CAT , SPELL_DRUID_THRASH_BEAR , SPELL_DRUID_EARTHWARDEN_AURA });
}
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & /*eventInfo*/ )
{
Unit * target = GetTarget ();
target -> CastSpell ( target , SPELL_DRUID_EARTHWARDEN_AURA , true );
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_earthwarden :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
2021-02-23 21:05:39 +02:00
// 22568 - Ferocious Bite
class spell_dru_ferocious_bite : public SpellScript
{
PrepareSpellScript ( spell_dru_ferocious_bite );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE })
&& sSpellMgr -> AssertSpellInfo ( SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE , DIFFICULTY_NONE ) -> GetEffect ( EFFECT_1 );
}
void HandleHitTargetBurn ( SpellEffIndex /*effIndex*/ )
{
int32 newValue = int32 ( float ( GetEffectValue ()) * _damageMultiplier );
SetEffectValue ( newValue );
}
void HandleHitTargetDmg ( SpellEffIndex /*effIndex*/ )
{
int32 newValue = int32 ( float ( GetHitDamage ()) * ( 1.0f + _damageMultiplier ));
SetHitDamage ( newValue );
}
void HandleLaunchTarget ( SpellEffIndex /*effIndex*/ )
{
Unit * caster = GetCaster ();
int32 maxExtraConsumedPower = GetEffectValue ();
if ( AuraEffect * auraEffect = caster -> GetAuraEffect ( SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE , EFFECT_1 ))
{
float multiplier = 1.0f + float ( auraEffect -> GetAmount ()) / 100.0f ;
maxExtraConsumedPower = int32 ( float ( maxExtraConsumedPower ) * multiplier );
SetEffectValue ( maxExtraConsumedPower );
}
_damageMultiplier = std :: min < float > ( caster -> GetPower ( POWER_ENERGY ), maxExtraConsumedPower ) / maxExtraConsumedPower ;
}
void Register () override
{
OnEffectLaunchTarget += SpellEffectFn ( spell_dru_ferocious_bite :: HandleLaunchTarget , EFFECT_1 , SPELL_EFFECT_POWER_BURN );
OnEffectHitTarget += SpellEffectFn ( spell_dru_ferocious_bite :: HandleHitTargetBurn , EFFECT_1 , SPELL_EFFECT_POWER_BURN );
OnEffectHitTarget += SpellEffectFn ( spell_dru_ferocious_bite :: HandleHitTargetDmg , EFFECT_0 , SPELL_EFFECT_SCHOOL_DAMAGE );
}
private :
float _damageMultiplier = 0.0f ;
};
2017-03-18 14:25:26 +01:00
// -33943 - Flight Form
class spell_dru_flight_form : public SpellScriptLoader
2013-01-14 20:28:32 +01:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_flight_form () : SpellScriptLoader ( "spell_dru_flight_form" ) { }
2013-01-14 20:28:32 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_flight_form_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_flight_form_SpellScript );
2013-01-14 20:28:32 +01:00
2017-03-18 14:25:26 +01:00
SpellCastResult CheckCast ()
{
Unit * caster = GetCaster ();
if ( caster -> IsInDisallowedMountForm ())
return SPELL_FAILED_NOT_SHAPESHIFT ;
2013-01-14 20:28:32 +01:00
2017-03-18 14:25:26 +01:00
return SPELL_CAST_OK ;
}
2013-01-14 20:28:32 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
2013-01-14 20:28:32 +01:00
{
2017-03-18 14:25:26 +01:00
OnCheckCast += SpellCheckCastFn ( spell_dru_flight_form_SpellScript :: CheckCast );
2013-01-14 20:28:32 +01:00
}
2017-03-18 14:25:26 +01:00
};
SpellScript * GetSpellScript () const override
{
return new spell_dru_flight_form_SpellScript ();
}
2012-09-17 18:17:23 +02:00
};
2016-05-13 01:13:19 +02:00
// 37336 - Druid Forms Trinket
class spell_dru_forms_trinket : public SpellScriptLoader
{
public :
spell_dru_forms_trinket () : SpellScriptLoader ( "spell_dru_forms_trinket" ) { }
class spell_dru_forms_trinket_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_forms_trinket_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo (
{
SPELL_DRUID_FORMS_TRINKET_BEAR ,
SPELL_DRUID_FORMS_TRINKET_CAT ,
SPELL_DRUID_FORMS_TRINKET_MOONKIN ,
SPELL_DRUID_FORMS_TRINKET_NONE ,
SPELL_DRUID_FORMS_TRINKET_TREE
});
2016-05-13 01:13:19 +02:00
}
bool CheckProc ( ProcEventInfo & eventInfo )
{
Unit * target = eventInfo . GetActor ();
switch ( target -> GetShapeshiftForm ())
{
case FORM_BEAR_FORM :
case FORM_DIRE_BEAR_FORM :
case FORM_CAT_FORM :
case FORM_MOONKIN_FORM :
case FORM_NONE :
case FORM_TREE_OF_LIFE :
return true ;
default :
break ;
}
return false ;
}
2021-02-13 12:59:43 +01:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
2016-05-13 01:13:19 +02:00
{
PreventDefaultAction ();
Unit * target = eventInfo . GetActor ();
uint32 triggerspell = 0 ;
switch ( target -> GetShapeshiftForm ())
{
case FORM_BEAR_FORM :
case FORM_DIRE_BEAR_FORM :
triggerspell = SPELL_DRUID_FORMS_TRINKET_BEAR ;
break ;
case FORM_CAT_FORM :
triggerspell = SPELL_DRUID_FORMS_TRINKET_CAT ;
break ;
case FORM_MOONKIN_FORM :
triggerspell = SPELL_DRUID_FORMS_TRINKET_MOONKIN ;
break ;
case FORM_NONE :
triggerspell = SPELL_DRUID_FORMS_TRINKET_NONE ;
break ;
case FORM_TREE_OF_LIFE :
triggerspell = SPELL_DRUID_FORMS_TRINKET_TREE ;
break ;
default :
return ;
}
target -> CastSpell ( target , triggerspell , true , nullptr , aurEff );
}
void Register () override
{
DoCheckProc += AuraCheckProcFn ( spell_dru_forms_trinket_AuraScript :: CheckProc );
OnEffectProc += AuraEffectProcFn ( spell_dru_forms_trinket_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_PROC_TRIGGER_SPELL );
}
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_forms_trinket_AuraScript ();
}
};
2021-03-09 00:01:31 +02:00
// 203964 - Galactic Guardian
class spell_dru_galactic_guardian : public AuraScript
{
PrepareAuraScript ( spell_dru_galactic_guardian );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_GALACTIC_GUARDIAN_AURA });
}
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & eventInfo )
{
if ( DamageInfo * damageInfo = eventInfo . GetDamageInfo ())
{
Unit * target = GetTarget ();
// free automatic moonfire on target
target -> CastSpell ( damageInfo -> GetVictim (), SPELL_DRUID_MOONFIRE_DAMAGE , true );
// Cast aura
target -> CastSpell ( damageInfo -> GetVictim (), SPELL_DRUID_GALACTIC_GUARDIAN_AURA , true );
}
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_galactic_guardian :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
2021-02-17 23:25:10 +02:00
// 210706 - Gore
class spell_dru_gore : public AuraScript
{
PrepareAuraScript ( spell_dru_gore );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_GORE_PROC , SPELL_DRUID_MANGLE });
}
bool CheckEffectProc ( AuraEffect const * aurEff , ProcEventInfo & /*eventInfo*/ )
{
return roll_chance_i ( aurEff -> GetAmount ());
}
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & /*procInfo*/ )
{
Unit * owner = GetTarget ();
owner -> CastSpell ( owner , SPELL_DRUID_GORE_PROC );
owner -> GetSpellHistory () -> ResetCooldown ( SPELL_DRUID_MANGLE , true );
}
void Register () override
{
DoCheckEffectProc += AuraCheckEffectProcFn ( spell_dru_gore :: CheckEffectProc , EFFECT_0 , SPELL_AURA_DUMMY );
OnEffectProc += AuraEffectProcFn ( spell_dru_gore :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
2017-03-18 14:25:26 +01:00
// 34246 - Idol of the Emerald Queen
// 60779 - Idol of Lush Moss
class spell_dru_idol_lifebloom : public SpellScriptLoader
2013-07-21 15:28:03 +02:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_idol_lifebloom () : SpellScriptLoader ( "spell_dru_idol_lifebloom" ) { }
2013-07-21 15:28:03 +02:00
2017-03-18 14:25:26 +01:00
class spell_dru_idol_lifebloom_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_idol_lifebloom_AuraScript );
2013-07-21 15:28:03 +02:00
2017-03-18 14:25:26 +01:00
void HandleEffectCalcSpellMod ( AuraEffect const * aurEff , SpellModifier *& spellMod )
{
if ( ! spellMod )
2013-07-21 15:28:03 +02:00
{
2017-03-18 14:25:26 +01:00
spellMod = new SpellModifier ( GetAura ());
spellMod -> op = SPELLMOD_DOT ;
spellMod -> type = SPELLMOD_FLAT ;
spellMod -> spellId = GetId ();
spellMod -> mask = GetSpellInfo () -> GetEffect ( aurEff -> GetEffIndex ()) -> SpellClassMask ;
2013-07-21 15:28:03 +02:00
}
2017-03-18 14:25:26 +01:00
spellMod -> value = aurEff -> GetAmount () / 7 ;
}
2013-07-21 15:28:03 +02:00
2017-03-18 14:25:26 +01:00
void Register () override
{
DoEffectCalcSpellMod += AuraEffectCalcSpellModFn ( spell_dru_idol_lifebloom_AuraScript :: HandleEffectCalcSpellMod , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
2013-07-21 15:28:03 +02:00
2017-03-18 14:25:26 +01:00
AuraScript * GetAuraScript () const override
{
return new spell_dru_idol_lifebloom_AuraScript ();
}
};
2013-07-21 15:28:03 +02:00
2021-03-09 00:01:31 +02:00
// 99 - Incapacitating Roar
class spell_dru_incapacitating_roar : public spell_dru_base_transformer
{
protected :
bool ToCatForm () const override { return false ; }
};
2017-03-18 14:25:26 +01:00
// 29166 - Innervate
class spell_dru_innervate : public SpellScriptLoader
{
public :
spell_dru_innervate () : SpellScriptLoader ( "spell_dru_innervate" ) { }
class spell_dru_innervate_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_innervate_AuraScript );
void CalculateAmount ( AuraEffect const * aurEff , int32 & amount , bool & /*canBeRecalculated*/ )
{
if ( Unit * caster = GetCaster ())
amount = int32 ( CalculatePct ( caster -> GetCreatePowers ( POWER_MANA ), amount ) / aurEff -> GetTotalTicks ());
else
amount = 0 ;
}
2013-07-21 15:28:03 +02:00
2017-03-18 14:25:26 +01:00
void Register () override
2013-07-21 15:28:03 +02:00
{
2017-03-18 14:25:26 +01:00
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dru_innervate_AuraScript :: CalculateAmount , EFFECT_0 , SPELL_AURA_PERIODIC_ENERGIZE );
2013-07-21 15:28:03 +02:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_innervate_AuraScript ();
}
2013-07-21 15:28:03 +02:00
};
2021-02-22 23:10:49 +02:00
// 40442 - Druid Tier 6 Trinket
class spell_dru_item_t6_trinket : public SpellScriptLoader
{
public :
spell_dru_item_t6_trinket () : SpellScriptLoader ( "spell_dru_item_t6_trinket" ) { }
class spell_dru_item_t6_trinket_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_item_t6_trinket_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({
SPELL_DRUID_BLESSING_OF_REMULOS ,
SPELL_DRUID_BLESSING_OF_ELUNE ,
SPELL_DRUID_BLESSING_OF_CENARIUS
});
}
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
{
PreventDefaultAction ();
SpellInfo const * spellInfo = eventInfo . GetSpellInfo ();
if ( ! spellInfo )
return ;
uint32 spellId ;
int32 chance ;
// Starfire
if ( spellInfo -> SpellFamilyFlags [ 0 ] & 0x00000004 )
{
spellId = SPELL_DRUID_BLESSING_OF_REMULOS ;
chance = 25 ;
}
// Rejuvenation
else if ( spellInfo -> SpellFamilyFlags [ 0 ] & 0x00000010 )
{
spellId = SPELL_DRUID_BLESSING_OF_ELUNE ;
chance = 25 ;
}
// Mangle (Bear) and Mangle (Cat)
else if ( spellInfo -> SpellFamilyFlags [ 1 ] & 0x00000440 )
{
spellId = SPELL_DRUID_BLESSING_OF_CENARIUS ;
chance = 40 ;
}
else
return ;
if ( roll_chance_i ( chance ))
eventInfo . GetActor () -> CastSpell ( nullptr , spellId , true , nullptr , aurEff );
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_item_t6_trinket_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_item_t6_trinket_AuraScript ();
}
};
2017-03-18 14:25:26 +01:00
// 33763 - Lifebloom
class spell_dru_lifebloom : public SpellScriptLoader
2010-07-24 22:41:42 +02:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_lifebloom () : SpellScriptLoader ( "spell_dru_lifebloom" ) { }
class spell_dru_lifebloom_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_lifebloom_AuraScript );
bool Validate ( SpellInfo const * /*spell*/ ) override
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_LIFEBLOOM_FINAL_HEAL , SPELL_DRUID_LIFEBLOOM_ENERGIZE });
2017-03-18 14:25:26 +01:00
}
2010-08-18 00:20:23 +06:00
2017-03-18 14:25:26 +01:00
void AfterRemove ( AuraEffect const * aurEff , AuraEffectHandleModes /*mode*/ )
2010-08-18 00:20:23 +06:00
{
2017-03-18 14:25:26 +01:00
// Final heal only on duration end
if ( GetTargetApplication () -> GetRemoveMode () != AURA_REMOVE_BY_EXPIRE )
return ;
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
// final heal
int32 stack = GetStackAmount ();
int32 healAmount = aurEff -> GetAmount ();
if ( Unit * caster = GetCaster ())
2011-01-31 14:51:42 +01:00
{
2017-03-18 14:25:26 +01:00
healAmount = caster -> SpellHealingBonusDone ( GetTarget (), GetSpellInfo (), healAmount , HEAL , aurEff -> GetSpellEffectInfo (), stack );
healAmount = GetTarget () -> SpellHealingBonusTaken ( caster , GetSpellInfo (), healAmount , HEAL , aurEff -> GetSpellEffectInfo (), stack );
GetTarget () -> CastCustomSpell ( GetTarget (), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL , & healAmount , nullptr , nullptr , true , nullptr , aurEff , GetCasterGUID ());
// restore mana
2017-05-21 23:18:43 +02:00
std :: vector < SpellPowerCost > costs = GetSpellInfo () -> CalcPowerCost ( caster , GetSpellInfo () -> GetSchoolMask ());
auto m = std :: find_if ( costs . begin (), costs . end (), []( SpellPowerCost const & cost ) { return cost . Power == POWER_MANA ; });
2017-03-18 14:25:26 +01:00
if ( m != costs . end ())
{
int32 returnMana = m -> Amount * stack / 2 ;
caster -> CastCustomSpell ( caster , SPELL_DRUID_LIFEBLOOM_ENERGIZE , & returnMana , nullptr , nullptr , true , nullptr , aurEff , GetCasterGUID ());
}
return ;
2011-01-31 14:51:42 +01:00
}
2017-03-18 14:25:26 +01:00
GetTarget () -> CastCustomSpell ( GetTarget (), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL , & healAmount , nullptr , nullptr , true , nullptr , aurEff , GetCasterGUID ());
}
void HandleDispel ( DispelInfo * dispelInfo )
{
if ( Unit * target = GetUnitOwner ())
2011-01-31 14:51:42 +01:00
{
2017-03-18 14:25:26 +01:00
if ( AuraEffect const * aurEff = GetEffect ( EFFECT_1 ))
{
// final heal
int32 healAmount = aurEff -> GetAmount ();
if ( Unit * caster = GetCaster ())
2010-08-18 00:20:23 +06:00
{
2017-03-18 14:25:26 +01:00
healAmount = caster -> SpellHealingBonusDone ( target , GetSpellInfo (), healAmount , HEAL , aurEff -> GetSpellEffectInfo (), dispelInfo -> GetRemovedCharges ());
healAmount = target -> SpellHealingBonusTaken ( caster , GetSpellInfo (), healAmount , HEAL , aurEff -> GetSpellEffectInfo (), dispelInfo -> GetRemovedCharges ());
target -> CastCustomSpell ( target , SPELL_DRUID_LIFEBLOOM_FINAL_HEAL , & healAmount , nullptr , nullptr , true , nullptr , nullptr , GetCasterGUID ());
// restore mana
2017-05-21 23:18:43 +02:00
std :: vector < SpellPowerCost > costs = GetSpellInfo () -> CalcPowerCost ( caster , GetSpellInfo () -> GetSchoolMask ());
auto m = std :: find_if ( costs . begin (), costs . end (), []( SpellPowerCost const & cost ) { return cost . Power == POWER_MANA ; });
2017-03-18 14:25:26 +01:00
if ( m != costs . end ())
2011-01-31 14:51:42 +01:00
{
2017-03-18 14:25:26 +01:00
int32 returnMana = m -> Amount * dispelInfo -> GetRemovedCharges () / 2 ;
caster -> CastCustomSpell ( caster , SPELL_DRUID_LIFEBLOOM_ENERGIZE , & returnMana , nullptr , nullptr , true , nullptr , nullptr , GetCasterGUID ());
2011-01-31 14:51:42 +01:00
}
2017-03-18 14:25:26 +01:00
return ;
2010-08-18 00:20:23 +06:00
}
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
target -> CastCustomSpell ( target , SPELL_DRUID_LIFEBLOOM_FINAL_HEAL , & healAmount , nullptr , nullptr , true , nullptr , nullptr , GetCasterGUID ());
}
2011-01-31 14:51:42 +01:00
}
2017-03-18 14:25:26 +01:00
}
2010-08-18 00:20:23 +06:00
2017-03-18 14:25:26 +01:00
void Register () override
2010-08-18 00:20:23 +06:00
{
2017-03-18 14:25:26 +01:00
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_lifebloom_AuraScript :: AfterRemove , EFFECT_1 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
AfterDispel += AuraDispelFn ( spell_dru_lifebloom_AuraScript :: HandleDispel );
2010-08-18 00:20:23 +06:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_lifebloom_AuraScript ();
}
2010-08-18 00:20:23 +06:00
};
2017-03-18 14:25:26 +01:00
// -48496 - Living Seed
class spell_dru_living_seed : public SpellScriptLoader
2013-07-22 19:46:21 +02:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_living_seed () : SpellScriptLoader ( "spell_dru_living_seed" ) { }
2013-07-22 19:46:21 +02:00
2017-03-18 14:25:26 +01:00
class spell_dru_living_seed_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_living_seed_AuraScript );
2013-07-22 19:46:21 +02:00
2017-03-18 14:25:26 +01:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_LIVING_SEED_PROC });
2017-03-18 14:25:26 +01:00
}
2013-07-22 19:46:21 +02:00
2021-02-13 12:59:43 +01:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
2017-03-18 14:25:26 +01:00
{
PreventDefaultAction ();
int32 amount = CalculatePct ( eventInfo . GetHealInfo () -> GetHeal (), aurEff -> GetAmount ());
GetTarget () -> CastCustomSpell ( SPELL_DRUID_LIVING_SEED_PROC , SPELLVALUE_BASE_POINT0 , amount , eventInfo . GetProcTarget (), true , nullptr , aurEff );
}
2013-07-22 19:46:21 +02:00
2017-03-18 14:25:26 +01:00
void Register () override
2013-07-22 19:46:21 +02:00
{
2017-03-18 14:25:26 +01:00
OnEffectProc += AuraEffectProcFn ( spell_dru_living_seed_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
2013-07-22 19:46:21 +02:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_living_seed_AuraScript ();
}
2013-07-22 19:46:21 +02:00
};
2017-03-18 14:25:26 +01:00
// 48504 - Living Seed (Proc)
class spell_dru_living_seed_proc : public SpellScriptLoader
2013-01-20 04:30:17 +01:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_living_seed_proc () : SpellScriptLoader ( "spell_dru_living_seed_proc" ) { }
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_living_seed_proc_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_living_seed_proc_AuraScript );
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_LIVING_SEED_HEAL });
2017-03-18 14:25:26 +01:00
}
2013-01-20 04:30:17 +01:00
2021-02-13 12:59:43 +01:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & /*eventInfo*/ )
2017-03-18 14:25:26 +01:00
{
PreventDefaultAction ();
GetTarget () -> CastCustomSpell ( SPELL_DRUID_LIVING_SEED_HEAL , SPELLVALUE_BASE_POINT0 , aurEff -> GetAmount (), GetTarget (), true , nullptr , aurEff );
}
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
2013-01-20 04:30:17 +01:00
{
2017-03-18 14:25:26 +01:00
OnEffectProc += AuraEffectProcFn ( spell_dru_living_seed_proc_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
2013-01-20 04:30:17 +01:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_living_seed_proc_AuraScript ();
}
2013-01-20 04:30:17 +01:00
};
2017-03-18 14:25:26 +01:00
// 8921 - Moonfire
class spell_dru_moonfire : public SpellScriptLoader
2013-01-20 04:30:17 +01:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_moonfire () : SpellScriptLoader ( "spell_dru_moonfire" ) { }
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_moonfire_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_moonfire_SpellScript );
2013-01-20 04:30:17 +01:00
2021-03-09 00:01:31 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_MOONFIRE_DAMAGE });
}
2017-03-18 14:25:26 +01:00
void HandleOnHit ( SpellEffIndex /*effIndex*/ )
{
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DRUID_MOONFIRE_DAMAGE , true );
}
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
2013-01-20 04:30:17 +01:00
{
2017-03-18 14:25:26 +01:00
OnEffectHitTarget += SpellEffectFn ( spell_dru_moonfire_SpellScript :: HandleOnHit , EFFECT_0 , SPELL_EFFECT_DUMMY );
2013-01-20 04:30:17 +01:00
}
2017-03-18 14:25:26 +01:00
};
SpellScript * GetSpellScript () const override
{
return new spell_dru_moonfire_SpellScript ();
}
2013-01-20 04:30:17 +01:00
};
2021-02-22 23:10:49 +02:00
// 16864 - Omen of Clarity
class spell_dru_omen_of_clarity : public SpellScriptLoader
{
public :
spell_dru_omen_of_clarity () : SpellScriptLoader ( "spell_dru_omen_of_clarity" ) { }
class spell_dru_omen_of_clarity_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_omen_of_clarity_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_BALANCE_T10_BONUS , SPELL_DRUID_BALANCE_T10_BONUS_PROC });
}
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & /*eventInfo*/ )
{
Unit * target = GetTarget ();
if ( target -> HasAura ( SPELL_DRUID_BALANCE_T10_BONUS ))
target -> CastSpell ( nullptr , SPELL_DRUID_BALANCE_T10_BONUS_PROC , true , nullptr );
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_omen_of_clarity_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_PROC_TRIGGER_SPELL );
}
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_omen_of_clarity_AuraScript ();
}
};
2017-03-18 14:25:26 +01:00
// -16972 - Predatory Strikes
class spell_dru_predatory_strikes : public SpellScriptLoader
2010-12-27 20:14:54 +01:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_predatory_strikes () : SpellScriptLoader ( "spell_dru_predatory_strikes" ) { }
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_predatory_strikes_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_predatory_strikes_AuraScript );
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
void UpdateAmount ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
if ( Player * target = GetTarget () -> ToPlayer ())
target -> UpdateAttackPowerAndDamage ();
}
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
2010-12-27 20:14:54 +01:00
{
2017-03-18 14:25:26 +01:00
AfterEffectApply += AuraEffectApplyFn ( spell_dru_predatory_strikes_AuraScript :: UpdateAmount , EFFECT_ALL , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK );
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_predatory_strikes_AuraScript :: UpdateAmount , EFFECT_ALL , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK );
2010-12-27 20:14:54 +01:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_predatory_strikes_AuraScript ();
}
2010-12-27 20:14:54 +01:00
};
2021-02-16 00:04:04 +02:00
// 5215 - Prowl
2021-03-09 00:01:31 +02:00
class spell_dru_prowl : public spell_dru_base_transformer
2021-02-16 00:04:04 +02:00
{
2021-03-09 00:01:31 +02:00
protected :
bool ToCatForm () const override { return true ; }
2021-02-16 00:04:04 +02:00
};
2017-03-18 14:25:26 +01:00
// 1079 - Rip
class spell_dru_rip : public SpellScriptLoader
2012-05-28 04:07:51 +02:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_rip () : SpellScriptLoader ( "spell_dru_rip" ) { }
class spell_dru_rip_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_rip_AuraScript );
2012-05-28 04:07:51 +02:00
2017-03-18 14:25:26 +01:00
bool Load () override
2012-05-28 04:07:51 +02:00
{
2017-03-18 14:25:26 +01:00
Unit * caster = GetCaster ();
return caster && caster -> GetTypeId () == TYPEID_PLAYER ;
}
2012-05-28 04:07:51 +02:00
2017-03-18 14:25:26 +01:00
void CalculateAmount ( AuraEffect const * /*aurEff*/ , int32 & amount , bool & canBeRecalculated )
{
canBeRecalculated = false ;
2012-05-28 04:07:51 +02:00
2017-03-18 14:25:26 +01:00
if ( Unit * caster = GetCaster ())
2012-05-28 04:07:51 +02:00
{
2017-03-18 14:25:26 +01:00
// 0.01 * $AP * cp
uint32 cp = caster -> ToPlayer () -> GetComboPoints ();
2012-05-28 04:07:51 +02:00
2017-03-18 14:25:26 +01:00
// Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs
if ( AuraEffect const * auraEffIdolOfFeralShadows = caster -> GetAuraEffect ( SPELL_DRUID_IDOL_OF_FERAL_SHADOWS , EFFECT_0 ))
amount += cp * auraEffIdolOfFeralShadows -> GetAmount ();
// Idol of Worship. Can't be handled as SpellMod due its dependency from CPs
else if ( AuraEffect const * auraEffIdolOfWorship = caster -> GetAuraEffect ( SPELL_DRUID_IDOL_OF_WORSHIP , EFFECT_0 ))
amount += cp * auraEffIdolOfWorship -> GetAmount ();
2012-06-15 14:07:10 -04:00
2017-03-18 14:25:26 +01:00
amount += int32 ( CalculatePct ( caster -> GetTotalAttackPowerValue ( BASE_ATTACK ), cp ));
2012-05-28 04:07:51 +02:00
}
2017-03-18 14:25:26 +01:00
}
2012-05-28 04:07:51 +02:00
2017-03-18 14:25:26 +01:00
void Register () override
2012-05-28 04:07:51 +02:00
{
2017-03-18 14:25:26 +01:00
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dru_rip_AuraScript :: CalculateAmount , EFFECT_0 , SPELL_AURA_PERIODIC_DAMAGE );
2012-05-28 04:07:51 +02:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_rip_AuraScript ();
}
2012-05-28 04:07:51 +02:00
};
2017-03-18 14:25:26 +01:00
// 52610 - Savage Roar
class spell_dru_savage_roar : public SpellScriptLoader
2013-01-20 04:30:17 +01:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_savage_roar () : SpellScriptLoader ( "spell_dru_savage_roar" ) { }
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_savage_roar_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_savage_roar_SpellScript );
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
SpellCastResult CheckCast ()
{
Unit * caster = GetCaster ();
if ( caster -> GetShapeshiftForm () != FORM_CAT_FORM )
return SPELL_FAILED_ONLY_SHAPESHIFT ;
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
return SPELL_CAST_OK ;
}
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
{
OnCheckCast += SpellCheckCastFn ( spell_dru_savage_roar_SpellScript :: CheckCast );
}
};
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_savage_roar_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_savage_roar_AuraScript );
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
2013-01-20 04:30:17 +01:00
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_SAVAGE_ROAR });
2013-01-20 04:30:17 +01:00
}
2010-12-27 20:14:54 +01:00
2017-03-18 14:25:26 +01:00
void AfterApply ( AuraEffect const * aurEff , AuraEffectHandleModes /*mode*/ )
2010-12-30 02:03:46 +01:00
{
2017-03-18 14:25:26 +01:00
Unit * target = GetTarget ();
target -> CastSpell ( target , SPELL_DRUID_SAVAGE_ROAR , true , nullptr , aurEff , GetCasterGUID ());
}
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
void AfterRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
GetTarget () -> RemoveAurasDueToSpell ( SPELL_DRUID_SAVAGE_ROAR );
}
2014-09-25 21:10:00 +02:00
2017-03-18 14:25:26 +01:00
void Register () override
{
AfterEffectApply += AuraEffectApplyFn ( spell_dru_savage_roar_AuraScript :: AfterApply , EFFECT_1 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_savage_roar_AuraScript :: AfterRemove , EFFECT_1 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
}
};
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
SpellScript * GetSpellScript () const override
{
return new spell_dru_savage_roar_SpellScript ();
}
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
AuraScript * GetAuraScript () const override
{
return new spell_dru_savage_roar_AuraScript ();
}
};
2011-01-31 14:51:42 +01:00
2021-02-22 23:10:49 +02:00
// 106839 - Skull Bash
class spell_dru_skull_bash : public SpellScript
{
PrepareSpellScript ( spell_dru_skull_bash );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_SKULL_BASH_CHARGE , SPELL_DRUID_SKULL_BASH_INTERRUPT });
}
void HandleDummy ( SpellEffIndex /*effIndex*/ )
{
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DRUID_SKULL_BASH_CHARGE , true );
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DRUID_SKULL_BASH_INTERRUPT , true );
}
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dru_skull_bash :: HandleDummy , EFFECT_0 , SPELL_EFFECT_DUMMY );
}
};
2017-03-18 14:25:26 +01:00
// -78892 - Stampede
class spell_dru_stampede : public SpellScriptLoader
{
public :
spell_dru_stampede () : SpellScriptLoader ( "spell_dru_stampede" ) { }
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_stampede_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_stampede_AuraScript );
2011-01-31 14:51:42 +01:00
2017-03-18 14:25:26 +01:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
2010-12-27 20:14:54 +01:00
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo (
{
SPELL_DRUID_STAMPEDE_BAER_RANK_1 ,
SPELL_DRUID_STAMPEDE_CAT_RANK_1 ,
SPELL_DRUID_STAMPEDE_CAT_STATE ,
SPELL_DRUID_FERAL_CHARGE_CAT ,
SPELL_DRUID_FERAL_CHARGE_BEAR
});
2010-12-27 20:14:54 +01:00
}
2012-06-03 02:35:00 +02:00
2021-02-13 12:59:43 +01:00
void HandleEffectCatProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
2012-06-03 02:35:00 +02:00
{
2017-03-18 14:25:26 +01:00
PreventDefaultAction ();
if ( GetTarget () -> GetShapeshiftForm () != FORM_CAT_FORM || eventInfo . GetDamageInfo () -> GetSpellInfo () -> Id != SPELL_DRUID_FERAL_CHARGE_CAT )
return ;
2012-06-03 02:35:00 +02:00
2017-03-18 14:25:26 +01:00
GetTarget () -> CastSpell ( GetTarget (), sSpellMgr -> GetSpellWithRank ( SPELL_DRUID_STAMPEDE_CAT_RANK_1 , GetSpellInfo () -> GetRank ()), true , nullptr , aurEff );
GetTarget () -> CastSpell ( GetTarget (), SPELL_DRUID_STAMPEDE_CAT_STATE , true , nullptr , aurEff );
}
2012-06-03 02:35:00 +02:00
2021-02-13 12:59:43 +01:00
void HandleEffectBearProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
2012-06-03 02:35:00 +02:00
{
2017-03-18 14:25:26 +01:00
PreventDefaultAction ();
if ( GetTarget () -> GetShapeshiftForm () != FORM_BEAR_FORM || eventInfo . GetDamageInfo () -> GetSpellInfo () -> Id != SPELL_DRUID_FERAL_CHARGE_BEAR )
return ;
2012-06-03 02:35:00 +02:00
2017-03-18 14:25:26 +01:00
GetTarget () -> CastSpell ( GetTarget (), sSpellMgr -> GetSpellWithRank ( SPELL_DRUID_STAMPEDE_BAER_RANK_1 , GetSpellInfo () -> GetRank ()), true , nullptr , aurEff );
2012-06-03 02:35:00 +02:00
}
2017-03-18 14:25:26 +01:00
void Register () override
2012-06-03 02:35:00 +02:00
{
2017-03-18 14:25:26 +01:00
OnEffectProc += AuraEffectProcFn ( spell_dru_stampede_AuraScript :: HandleEffectCatProc , EFFECT_0 , SPELL_AURA_DUMMY );
OnEffectProc += AuraEffectProcFn ( spell_dru_stampede_AuraScript :: HandleEffectBearProc , EFFECT_1 , SPELL_AURA_DUMMY );
2012-06-03 02:35:00 +02:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_stampede_AuraScript ();
}
2012-06-03 02:35:00 +02:00
};
2021-03-09 00:01:31 +02:00
// 106898 - Stampeding Roar
class spell_dru_stampeding_roar : public spell_dru_base_transformer
{
protected :
bool ToCatForm () const override { return false ; }
};
2013-07-25 15:05:16 +02:00
// 50286 - Starfall (Dummy)
2012-09-17 18:17:23 +02:00
class spell_dru_starfall_dummy : public SpellScriptLoader
2011-10-06 18:20:57 +02:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_starfall_dummy () : SpellScriptLoader ( "spell_dru_starfall_dummy" ) { }
2011-10-06 18:20:57 +02:00
2017-03-18 14:25:26 +01:00
class spell_dru_starfall_dummy_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_starfall_dummy_SpellScript );
void FilterTargets ( std :: list < WorldObject *>& targets )
2011-10-06 18:20:57 +02:00
{
2017-03-23 00:11:58 +01:00
Trinity :: Containers :: RandomResize ( targets , 2 );
2017-03-18 14:25:26 +01:00
}
2011-10-06 18:20:57 +02:00
2017-03-18 14:25:26 +01:00
void HandleDummy ( SpellEffIndex /*effIndex*/ )
{
Unit * caster = GetCaster ();
// Shapeshifting into an animal form or mounting cancels the effect
if ( caster -> GetCreatureType () == CREATURE_TYPE_BEAST || caster -> IsMounted ())
2011-10-06 18:20:57 +02:00
{
2017-03-18 14:25:26 +01:00
if ( SpellInfo const * spellInfo = GetTriggeringSpell ())
caster -> RemoveAurasDueToSpell ( spellInfo -> Id );
return ;
2012-02-18 12:12:49 +01:00
}
2011-10-06 18:20:57 +02:00
2017-03-18 14:25:26 +01:00
// Any effect which causes you to lose control of your character will supress the starfall effect.
if ( caster -> HasUnitState ( UNIT_STATE_CONTROLLED ))
return ;
2012-02-18 12:12:49 +01:00
2017-03-18 14:25:26 +01:00
caster -> CastSpell ( GetHitUnit (), uint32 ( GetEffectValue ()), true );
}
2012-02-18 12:12:49 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
2012-02-18 12:12:49 +01:00
{
2017-03-18 14:25:26 +01:00
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn ( spell_dru_starfall_dummy_SpellScript :: FilterTargets , EFFECT_0 , TARGET_UNIT_SRC_AREA_ENEMY );
OnEffectHitTarget += SpellEffectFn ( spell_dru_starfall_dummy_SpellScript :: HandleDummy , EFFECT_0 , SPELL_EFFECT_DUMMY );
2012-02-18 12:12:49 +01:00
}
2017-03-18 14:25:26 +01:00
};
SpellScript * GetSpellScript () const override
{
return new spell_dru_starfall_dummy_SpellScript ();
}
2012-02-18 12:12:49 +01:00
};
2017-03-18 14:25:26 +01:00
// 93402 - Sunfire
class spell_dru_sunfire : public SpellScriptLoader
2013-07-26 22:13:11 +02:00
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_sunfire () : SpellScriptLoader ( "spell_dru_sunfire" ) { }
2013-07-26 22:13:11 +02:00
2017-03-18 14:25:26 +01:00
class spell_dru_sunfire_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_sunfire_SpellScript );
2013-07-26 22:13:11 +02:00
2017-03-18 14:25:26 +01:00
void HandleOnHit ( SpellEffIndex /*effIndex*/ )
{
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DRUID_SUNFIRE_DAMAGE , true );
}
2013-07-26 22:13:11 +02:00
2017-03-18 14:25:26 +01:00
void Register () override
2013-07-26 22:13:11 +02:00
{
2017-03-18 14:25:26 +01:00
OnEffectHitTarget += SpellEffectFn ( spell_dru_sunfire_SpellScript :: HandleOnHit , EFFECT_0 , SPELL_EFFECT_DUMMY );
2013-07-26 22:13:11 +02:00
}
2017-03-18 14:25:26 +01:00
};
SpellScript * GetSpellScript () const override
{
return new spell_dru_sunfire_SpellScript ();
}
2013-07-26 22:13:11 +02:00
};
2013-01-12 02:16:30 +01:00
// 61336 - Survival Instincts
2012-06-03 02:35:00 +02:00
class spell_dru_survival_instincts : public SpellScriptLoader
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_survival_instincts () : SpellScriptLoader ( "spell_dru_survival_instincts" ) { }
2012-06-03 02:35:00 +02:00
2017-03-18 14:25:26 +01:00
class spell_dru_survival_instincts_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_survival_instincts_AuraScript );
2012-06-03 02:35:00 +02:00
2017-03-18 14:25:26 +01:00
bool Validate ( SpellInfo const * /*spell*/ ) override
2012-06-03 02:35:00 +02:00
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_SURVIVAL_INSTINCTS });
2012-06-03 02:35:00 +02:00
}
2017-03-18 14:25:26 +01:00
void AfterApply ( AuraEffect const * aurEff , AuraEffectHandleModes /*mode*/ )
2012-06-03 02:35:00 +02:00
{
2017-03-18 14:25:26 +01:00
Unit * target = GetTarget ();
int32 bp0 = target -> CountPctFromMaxHealth ( aurEff -> GetAmount ());
target -> CastCustomSpell ( target , SPELL_DRUID_SURVIVAL_INSTINCTS , & bp0 , nullptr , nullptr , true );
2012-06-03 02:35:00 +02:00
}
2017-03-18 14:25:26 +01:00
void AfterRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
2012-07-13 18:42:28 +03:00
{
2017-03-18 14:25:26 +01:00
GetTarget () -> RemoveAurasDueToSpell ( SPELL_DRUID_SURVIVAL_INSTINCTS );
}
2012-07-13 18:42:28 +03:00
2017-03-18 14:25:26 +01:00
void Register () override
2012-07-13 18:42:28 +03:00
{
2017-03-18 14:25:26 +01:00
AfterEffectApply += AuraEffectApplyFn ( spell_dru_survival_instincts_AuraScript :: AfterApply , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK );
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_survival_instincts_AuraScript :: AfterRemove , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK );
2012-07-13 18:42:28 +03:00
}
2017-03-18 14:25:26 +01:00
};
2016-02-13 23:56:11 +01:00
2017-03-18 14:25:26 +01:00
AuraScript * GetAuraScript () const override
{
return new spell_dru_survival_instincts_AuraScript ();
}
};
2016-02-13 23:56:11 +01:00
2017-03-18 14:25:26 +01:00
// 40121 - Swift Flight Form (Passive)
class spell_dru_swift_flight_passive : public SpellScriptLoader
{
public :
spell_dru_swift_flight_passive () : SpellScriptLoader ( "spell_dru_swift_flight_passive" ) { }
2016-02-13 23:56:11 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_swift_flight_passive_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_swift_flight_passive_AuraScript );
2016-02-13 23:56:11 +01:00
2017-03-18 14:25:26 +01:00
bool Load () override
2016-02-13 23:56:11 +01:00
{
2017-03-18 14:25:26 +01:00
return GetCaster () -> GetTypeId () == TYPEID_PLAYER ;
2016-02-13 23:56:11 +01:00
}
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
void CalculateAmount ( AuraEffect const * /*aurEff*/ , int32 & amount , bool & /*canBeRecalculated*/ )
2013-01-20 04:30:17 +01:00
{
2017-03-18 14:25:26 +01:00
if ( Player * caster = GetCaster () -> ToPlayer ())
if ( caster -> GetSkillValue ( SKILL_RIDING ) >= 375 )
amount = 310 ;
}
2013-01-20 04:30:17 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
2013-01-20 04:30:17 +01:00
{
2017-03-18 14:25:26 +01:00
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dru_swift_flight_passive_AuraScript :: CalculateAmount , EFFECT_1 , SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED );
2013-01-20 04:30:17 +01:00
}
2017-03-18 14:25:26 +01:00
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_swift_flight_passive_AuraScript ();
}
2013-01-20 04:30:17 +01:00
};
2016-09-25 20:48:31 -03:00
// 28744 - Regrowth
class spell_dru_t3_6p_bonus : public SpellScriptLoader
{
public :
spell_dru_t3_6p_bonus () : SpellScriptLoader ( "spell_dru_t3_6p_bonus" ) { }
class spell_dru_t3_6p_bonus_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_t3_6p_bonus_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_BLESSING_OF_THE_CLAW });
2016-09-25 20:48:31 -03:00
}
2021-02-13 12:59:43 +01:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
2016-09-25 20:48:31 -03:00
{
PreventDefaultAction ();
2016-11-19 03:05:44 -03:00
eventInfo . GetActor () -> CastSpell ( eventInfo . GetProcTarget (), SPELL_DRUID_BLESSING_OF_THE_CLAW , true , nullptr , aurEff );
2016-09-25 20:48:31 -03:00
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_t3_6p_bonus_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_OVERRIDE_CLASS_SCRIPTS );
}
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_t3_6p_bonus_AuraScript ();
}
};
// 28719 - Healing Touch
class spell_dru_t3_8p_bonus : public SpellScriptLoader
{
public :
spell_dru_t3_8p_bonus () : SpellScriptLoader ( "spell_dru_t3_8p_bonus" ) { }
class spell_dru_t3_8p_bonus_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_t3_8p_bonus_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_EXHILARATE });
2016-09-25 20:48:31 -03:00
}
2021-02-13 12:59:43 +01:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
2016-09-25 20:48:31 -03:00
{
PreventDefaultAction ();
2017-08-13 12:03:43 +02:00
Spell const * spell = eventInfo . GetProcSpell ();
if ( ! spell )
2016-09-25 20:48:31 -03:00
return ;
Unit * caster = eventInfo . GetActor ();
2017-08-13 12:03:43 +02:00
std :: vector < SpellPowerCost > const & costs = spell -> GetPowerCost ();
2017-05-21 23:18:43 +02:00
auto m = std :: find_if ( costs . begin (), costs . end (), []( SpellPowerCost const & cost ) { return cost . Power == POWER_MANA ; });
2016-09-25 20:48:31 -03:00
if ( m == costs . end ())
return ;
int32 amount = CalculatePct ( m -> Amount , aurEff -> GetAmount ());
2020-08-14 17:06:03 +02:00
caster -> CastCustomSpell ( SPELL_DRUID_EXHILARATE , SPELLVALUE_BASE_POINT0 , amount , nullptr , true , nullptr , aurEff );
2016-09-25 20:48:31 -03:00
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_t3_8p_bonus_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_t3_8p_bonus_AuraScript ();
}
};
// 37288 - Mana Restore
// 37295 - Mana Restore
class spell_dru_t4_2p_bonus : public SpellScriptLoader
{
public :
spell_dru_t4_2p_bonus () : SpellScriptLoader ( "spell_dru_t4_2p_bonus" ) { }
class spell_dru_t4_2p_bonus_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_t4_2p_bonus_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
2017-06-02 23:53:24 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_INFUSION });
2016-09-25 20:48:31 -03:00
}
2021-02-13 12:59:43 +01:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
2016-09-25 20:48:31 -03:00
{
PreventDefaultAction ();
2020-08-14 17:06:03 +02:00
eventInfo . GetActor () -> CastSpell ( nullptr , SPELL_DRUID_INFUSION , true , nullptr , aurEff );
2016-09-25 20:48:31 -03:00
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_t4_2p_bonus_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_t4_2p_bonus_AuraScript ();
}
};
2021-02-22 23:10:49 +02:00
// 70723 - Item - Druid T10 Balance 4P Bonus
class spell_dru_t10_balance_4p_bonus : public SpellScriptLoader
2018-07-22 18:34:39 +02:00
{
public :
2021-02-22 23:10:49 +02:00
spell_dru_t10_balance_4p_bonus () : SpellScriptLoader ( "spell_dru_t10_balance_4p_bonus" ) { }
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
class spell_dru_t10_balance_4p_bonus_AuraScript : public AuraScript
2018-07-22 18:34:39 +02:00
{
2021-02-22 23:10:49 +02:00
PrepareAuraScript ( spell_dru_t10_balance_4p_bonus_AuraScript );
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
2018-07-22 18:34:39 +02:00
{
2021-02-22 23:10:49 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_LANGUISH });
}
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
{
PreventDefaultAction ();
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
DamageInfo * damageInfo = eventInfo . GetDamageInfo ();
if ( ! damageInfo || ! damageInfo -> GetDamage ())
return ;
Unit * caster = eventInfo . GetActor ();
Unit * target = eventInfo . GetProcTarget ();
SpellInfo const * spellInfo = sSpellMgr -> AssertSpellInfo ( SPELL_DRUID_LANGUISH , GetCastDifficulty ());
int32 amount = CalculatePct ( static_cast < int32 > ( damageInfo -> GetDamage ()), aurEff -> GetAmount ());
amount /= spellInfo -> GetMaxTicks ();
// Add remaining ticks to damage done
amount += target -> GetRemainingPeriodicAmount ( caster -> GetGUID (), SPELL_DRUID_LANGUISH , SPELL_AURA_PERIODIC_DAMAGE );
caster -> CastCustomSpell ( SPELL_DRUID_LANGUISH , SPELLVALUE_BASE_POINT0 , amount , target , true , nullptr , aurEff );
2018-07-22 18:34:39 +02:00
}
void Register () override
{
2021-02-22 23:10:49 +02:00
OnEffectProc += AuraEffectProcFn ( spell_dru_t10_balance_4p_bonus_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
2018-07-22 18:34:39 +02:00
}
};
2021-02-22 23:10:49 +02:00
AuraScript * GetAuraScript () const override
2018-07-22 18:34:39 +02:00
{
2021-02-22 23:10:49 +02:00
return new spell_dru_t10_balance_4p_bonus_AuraScript ();
}
};
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
// 70691 - Item T10 Restoration 4P Bonus
class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
{
public :
spell_dru_t10_restoration_4p_bonus () : SpellScriptLoader ( "spell_dru_t10_restoration_4p_bonus" ) { }
class spell_dru_t10_restoration_4p_bonus_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_t10_restoration_4p_bonus_SpellScript );
2018-07-22 18:34:39 +02:00
bool Load () override
{
return GetCaster () -> GetTypeId () == TYPEID_PLAYER ;
}
2021-02-22 23:10:49 +02:00
void FilterTargets ( std :: list < WorldObject *>& targets )
2018-07-22 18:34:39 +02:00
{
2021-02-22 23:10:49 +02:00
if ( ! GetCaster () -> ToPlayer () -> GetGroup ())
{
targets . clear ();
targets . push_back ( GetCaster ());
}
else
{
targets . remove ( GetExplTargetUnit ());
std :: list < Unit *> tempTargets ;
for ( std :: list < WorldObject *>:: const_iterator itr = targets . begin (); itr != targets . end (); ++ itr )
if (( * itr ) -> GetTypeId () == TYPEID_PLAYER && GetCaster () -> IsInRaidWith (( * itr ) -> ToUnit ()))
tempTargets . push_back (( * itr ) -> ToUnit ());
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
if ( tempTargets . empty ())
{
targets . clear ();
FinishCast ( SPELL_FAILED_DONT_REPORT );
return ;
}
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
Unit * target = Trinity :: Containers :: SelectRandomContainerElement ( tempTargets );
targets . clear ();
targets . push_back ( target );
}
2018-07-22 18:34:39 +02:00
}
2021-02-22 23:10:49 +02:00
void Register () override
2018-07-22 18:34:39 +02:00
{
2021-02-22 23:10:49 +02:00
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn ( spell_dru_t10_restoration_4p_bonus_SpellScript :: FilterTargets , EFFECT_0 , TARGET_UNIT_DEST_AREA_ALLY );
2018-07-22 18:34:39 +02:00
}
2021-02-22 23:10:49 +02:00
};
2018-07-22 18:34:39 +02:00
2021-02-22 23:10:49 +02:00
SpellScript * GetSpellScript () const override
{
return new spell_dru_t10_restoration_4p_bonus_SpellScript ();
}
};
// 70664 - Druid T10 Restoration 4P Bonus (Rejuvenation)
class spell_dru_t10_restoration_4p_bonus_dummy : public SpellScriptLoader
{
public :
spell_dru_t10_restoration_4p_bonus_dummy () : SpellScriptLoader ( "spell_dru_t10_restoration_4p_bonus_dummy" ) { }
class spell_dru_t10_restoration_4p_bonus_dummy_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_t10_restoration_4p_bonus_dummy_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
2018-07-22 18:34:39 +02:00
{
2021-02-22 23:10:49 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_REJUVENATION_T10_PROC });
2018-07-22 18:34:39 +02:00
}
2021-02-22 23:10:49 +02:00
bool CheckProc ( ProcEventInfo & eventInfo )
2018-07-22 18:34:39 +02:00
{
2021-02-22 23:10:49 +02:00
SpellInfo const * spellInfo = eventInfo . GetSpellInfo ();
if ( ! spellInfo || spellInfo -> Id == SPELL_DRUID_REJUVENATION_T10_PROC )
return false ;
HealInfo * healInfo = eventInfo . GetHealInfo ();
if ( ! healInfo || ! healInfo -> GetHeal ())
return false ;
Player * caster = eventInfo . GetActor () -> ToPlayer ();
if ( ! caster )
return false ;
return caster -> GetGroup () || caster != eventInfo . GetProcTarget ();
2018-07-22 18:34:39 +02:00
}
2021-02-22 23:10:49 +02:00
void HandleProc ( AuraEffect * aurEff , ProcEventInfo & eventInfo )
{
PreventDefaultAction ();
int32 amount = static_cast < int32 > ( eventInfo . GetHealInfo () -> GetHeal ());
eventInfo . GetActor () -> CastCustomSpell ( SPELL_DRUID_REJUVENATION_T10_PROC , SPELLVALUE_BASE_POINT0 , amount , nullptr , true , nullptr , aurEff );
}
void Register () override
{
DoCheckProc += AuraCheckProcFn ( spell_dru_t10_restoration_4p_bonus_dummy_AuraScript :: CheckProc );
OnEffectProc += AuraEffectProcFn ( spell_dru_t10_restoration_4p_bonus_dummy_AuraScript :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
2018-07-22 18:34:39 +02:00
AuraScript * GetAuraScript () const override
{
2021-02-22 23:10:49 +02:00
return new spell_dru_t10_restoration_4p_bonus_dummy_AuraScript ();
2018-07-22 18:34:39 +02:00
}
2021-03-09 00:01:31 +02:00
};
// 77758 - Thrash
class spell_dru_thrash : public SpellScript
{
PrepareSpellScript ( spell_dru_thrash );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_THRASH_BEAR_AURA });
}
void HandleOnHitTarget ( SpellEffIndex /*effIndex*/ )
{
if ( Unit * hitUnit = GetHitUnit ())
{
Unit * caster = GetCaster ();
caster -> CastSpell ( hitUnit , SPELL_DRUID_THRASH_BEAR_AURA , TRIGGERED_FULL_MASK );
}
}
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dru_thrash :: HandleOnHitTarget , EFFECT_0 , SPELL_EFFECT_SCHOOL_DAMAGE );
}
};
// 192090 - Thrash (Aura) - SPELL_DRUID_THRASH_BEAR_AURA
class spell_dru_thrash_aura : public AuraScript
{
PrepareAuraScript ( spell_dru_thrash_aura );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_BLOOD_FRENZY_AURA , SPELL_DRUID_BLOOD_FRENZY_RAGE_GAIN });
}
void HandlePeriodic ( AuraEffect const * /*aurEff*/ )
{
if ( Unit * caster = GetCaster ())
if ( caster -> HasAura ( SPELL_DRUID_BLOOD_FRENZY_AURA ))
caster -> CastSpell ( caster , SPELL_DRUID_BLOOD_FRENZY_RAGE_GAIN , true );
}
void Register () override
{
OnEffectPeriodic += AuraEffectPeriodicFn ( spell_dru_thrash_aura :: HandlePeriodic , EFFECT_0 , SPELL_AURA_PERIODIC_DAMAGE );
}
};
// 1066 - Aquatic Form
// 33943 - Flight Form
// 40120 - Swift Flight Form
// 165961 - Stag Form
class spell_dru_travel_form : public SpellScriptLoader
{
public :
spell_dru_travel_form () : SpellScriptLoader ( "spell_dru_travel_form" ) { }
class spell_dru_travel_form_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_travel_form_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_FORM_STAG , SPELL_DRUID_FORM_AQUATIC , SPELL_DRUID_FORM_FLIGHT , SPELL_DRUID_FORM_SWIFT_FLIGHT });
}
bool Load () override
{
return GetCaster () -> GetTypeId () == TYPEID_PLAYER ;
}
void OnRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
// If it stays 0, it removes Travel Form dummy in AfterRemove.
triggeredSpellId = 0 ;
// We should only handle aura interrupts.
if ( GetTargetApplication () -> GetRemoveMode () != AURA_REMOVE_BY_INTERRUPT )
return ;
// Check what form is appropriate
triggeredSpellId = spell_dru_travel_form :: GetFormSpellId ( GetTarget () -> ToPlayer (), GetCastDifficulty (), true );
// If chosen form is current aura, just don't remove it.
if ( triggeredSpellId == m_scriptSpellId )
PreventDefaultAction ();
}
void AfterRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
if ( triggeredSpellId == m_scriptSpellId )
return ;
Player * player = GetTarget () -> ToPlayer ();
if ( triggeredSpellId ) // Apply new form
player -> AddAura ( triggeredSpellId , player );
else // If not set, simply remove Travel Form dummy
player -> RemoveAura ( SPELL_DRUID_TRAVEL_FORM );
}
void Register () override
{
OnEffectRemove += AuraEffectRemoveFn ( spell_dru_travel_form_AuraScript :: OnRemove , EFFECT_0 , SPELL_AURA_MOD_SHAPESHIFT , AURA_EFFECT_HANDLE_REAL );
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_travel_form_AuraScript :: AfterRemove , EFFECT_0 , SPELL_AURA_MOD_SHAPESHIFT , AURA_EFFECT_HANDLE_REAL );
}
private :
uint32 triggeredSpellId = 0 ;
};
AuraScript * GetAuraScript () const override
{
return new spell_dru_travel_form_AuraScript ();
}
2018-07-22 18:34:39 +02:00
2021-03-04 23:56:43 +01:00
static uint32 GetFormSpellId ( Player const * player , Difficulty difficulty , bool requiresOutdoor )
2018-07-22 18:34:39 +02:00
{
2021-03-04 23:56:43 +01:00
// Check what form is appropriate
if ( player -> IsInWater ()) // Aquatic form
return SPELL_DRUID_FORM_AQUATIC ;
2018-07-22 18:34:39 +02:00
2021-03-04 23:56:43 +01:00
if ( player -> GetSkillValue ( SKILL_RIDING ) >= 225 && CheckLocationForForm ( player , difficulty , requiresOutdoor , SPELL_DRUID_FORM_FLIGHT ) == SPELL_CAST_OK ) // Flight form
return player -> GetSkillValue ( SKILL_RIDING ) >= 300 ? SPELL_DRUID_FORM_SWIFT_FLIGHT : SPELL_DRUID_FORM_FLIGHT ;
2018-07-22 18:34:39 +02:00
2021-03-04 23:56:43 +01:00
if ( CheckLocationForForm ( player , difficulty , requiresOutdoor , SPELL_DRUID_FORM_STAG ) == SPELL_CAST_OK ) // Stag form
return SPELL_DRUID_FORM_STAG ;
2018-07-22 18:34:39 +02:00
2021-03-04 23:56:43 +01:00
return 0 ;
}
2018-07-22 18:34:39 +02:00
2021-03-04 23:56:43 +01:00
private :
static SpellCastResult CheckLocationForForm ( Player const * targetPlayer , Difficulty difficulty , bool requireOutdoors , uint32 spell_id )
{
SpellInfo const * spellInfo = sSpellMgr -> GetSpellInfo ( spell_id , difficulty );
2018-07-22 18:34:39 +02:00
2021-03-04 23:56:43 +01:00
if ( requireOutdoors && ! targetPlayer -> GetMap () -> IsOutdoors ( targetPlayer -> GetPhaseShift (), targetPlayer -> GetPositionX (), targetPlayer -> GetPositionY (), targetPlayer -> GetPositionZ ()))
return SPELL_FAILED_ONLY_OUTDOORS ;
2018-07-22 18:34:39 +02:00
2021-03-04 23:56:43 +01:00
return spellInfo -> CheckLocation ( targetPlayer -> GetMapId (), targetPlayer -> GetZoneId (), targetPlayer -> GetAreaId (), targetPlayer );
2018-07-22 18:34:39 +02:00
}
};
2021-02-22 23:10:49 +02:00
// 783 - Travel Form (dummy)
class spell_dru_travel_form_dummy : public SpellScriptLoader
2016-09-25 20:48:31 -03:00
{
2021-02-22 23:10:49 +02:00
public :
spell_dru_travel_form_dummy () : SpellScriptLoader ( "spell_dru_travel_form_dummy" ) { }
2016-09-25 20:48:31 -03:00
2021-02-22 23:10:49 +02:00
class spell_dru_travel_form_dummy_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_travel_form_dummy_SpellScript );
2016-09-25 20:48:31 -03:00
2021-02-22 23:10:49 +02:00
SpellCastResult CheckCast ()
{
Player * player = GetCaster () -> ToPlayer ();
if ( ! player )
return SPELL_FAILED_CUSTOM_ERROR ;
2016-09-25 20:48:31 -03:00
2021-02-22 23:10:49 +02:00
if ( player -> GetSkillValue ( SKILL_RIDING ) < 75 )
return SPELL_FAILED_APPRENTICE_RIDING_REQUIREMENT ;
2016-09-25 20:48:31 -03:00
2021-02-22 23:10:49 +02:00
SpellInfo const * spellInfo = sSpellMgr -> GetSpellInfo ( player -> IsInWater () ? SPELL_DRUID_FORM_AQUATIC : SPELL_DRUID_FORM_STAG , GetCastDifficulty ());
return spellInfo -> CheckLocation ( player -> GetMapId (), player -> GetZoneId (), player -> GetAreaId (), player );
2016-09-25 20:48:31 -03:00
}
2021-02-22 23:10:49 +02:00
void Register () override
2016-09-25 20:48:31 -03:00
{
2021-02-22 23:10:49 +02:00
OnCheckCast += SpellCheckCastFn ( spell_dru_travel_form_dummy_SpellScript :: CheckCast );
}
};
2016-09-25 20:48:31 -03:00
2021-02-22 23:10:49 +02:00
class spell_dru_travel_form_dummy_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_travel_form_dummy_AuraScript );
2016-09-25 20:48:31 -03:00
2021-02-22 23:10:49 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
2016-09-25 20:48:31 -03:00
{
2021-02-22 23:10:49 +02:00
return ValidateSpellInfo ({ SPELL_DRUID_FORM_STAG , SPELL_DRUID_FORM_AQUATIC , SPELL_DRUID_FORM_FLIGHT , SPELL_DRUID_FORM_SWIFT_FLIGHT });
2016-09-25 20:48:31 -03:00
}
2012-07-13 18:42:28 +03:00
2017-03-18 14:25:26 +01:00
bool Load () override
2012-08-16 19:55:01 +01:00
{
2017-03-18 14:25:26 +01:00
return GetCaster () -> GetTypeId () == TYPEID_PLAYER ;
}
2012-08-16 19:55:01 +01:00
2021-02-22 23:10:49 +02:00
void OnApply ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
2017-03-18 14:25:26 +01:00
{
2021-02-22 23:10:49 +02:00
Player * player = GetTarget () -> ToPlayer ();
2021-03-04 23:56:43 +01:00
// Outdoor check already passed - Travel Form (dummy) has SPELL_ATTR0_OUTDOORS_ONLY attribute.
2021-03-09 00:01:31 +02:00
uint32 triggeredSpellId = spell_dru_travel_form :: GetFormSpellId ( player , GetCastDifficulty (), false );
2012-08-16 19:55:01 +01:00
2021-02-22 23:10:49 +02:00
player -> AddAura ( triggeredSpellId , player );
2017-03-18 14:25:26 +01:00
}
2012-07-13 18:42:28 +03:00
2021-02-22 23:10:49 +02:00
void AfterRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
2012-08-16 19:55:01 +01:00
{
2021-02-22 23:10:49 +02:00
// No need to check remove mode, it's safe for auras to remove each other in AfterRemove hook.
GetTarget () -> RemoveAura ( SPELL_DRUID_FORM_STAG );
GetTarget () -> RemoveAura ( SPELL_DRUID_FORM_AQUATIC );
GetTarget () -> RemoveAura ( SPELL_DRUID_FORM_FLIGHT );
GetTarget () -> RemoveAura ( SPELL_DRUID_FORM_SWIFT_FLIGHT );
2012-08-16 19:55:01 +01:00
}
2017-03-18 14:25:26 +01:00
2021-02-22 23:10:49 +02:00
void Register () override
2016-09-25 20:48:31 -03:00
{
2021-02-22 23:10:49 +02:00
OnEffectApply += AuraEffectApplyFn ( spell_dru_travel_form_dummy_AuraScript :: OnApply , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_travel_form_dummy_AuraScript :: AfterRemove , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
}
};
2014-01-26 01:02:20 +01:00
2021-02-22 23:10:49 +02:00
SpellScript * GetSpellScript () const override
2017-03-18 14:25:26 +01:00
{
2021-02-22 23:10:49 +02:00
return new spell_dru_travel_form_dummy_SpellScript ();
2017-03-18 14:25:26 +01:00
}
2014-01-26 01:02:20 +01:00
2021-02-22 23:10:49 +02:00
AuraScript * GetAuraScript () const override
{
return new spell_dru_travel_form_dummy_AuraScript ();
}
2021-03-04 23:56:43 +01:00
};
2021-03-09 00:01:31 +02:00
// 252216 - Tiger Dash
class spell_dru_tiger_dash : public AuraScript
2021-03-04 23:56:43 +01:00
{
2021-03-09 00:01:31 +02:00
PrepareAuraScript ( spell_dru_tiger_dash );
2021-03-04 23:56:43 +01:00
2021-03-09 00:01:31 +02:00
void HandlePeriodic ( AuraEffect const * aurEff )
2021-03-04 23:56:43 +01:00
{
2021-03-09 00:01:31 +02:00
if ( AuraEffect * effRunSpeed = GetEffect ( EFFECT_0 ))
2021-03-04 23:56:43 +01:00
{
2021-03-09 00:01:31 +02:00
int32 reduction = aurEff -> GetAmount ();
effRunSpeed -> ChangeAmount ( effRunSpeed -> GetAmount () - reduction );
2021-03-04 23:56:43 +01:00
}
2021-03-09 00:01:31 +02:00
}
2021-03-04 23:56:43 +01:00
2021-03-09 00:01:31 +02:00
void Register () override
2021-03-04 23:56:43 +01:00
{
2021-03-09 00:01:31 +02:00
OnEffectPeriodic += AuraEffectPeriodicFn ( spell_dru_tiger_dash :: HandlePeriodic , EFFECT_1 , SPELL_AURA_PERIODIC_DUMMY );
2021-03-04 23:56:43 +01:00
}
2014-01-26 01:02:20 +01:00
};
2014-04-21 16:34:52 +02:00
// 48438 - Wild Growth
2014-01-26 01:02:20 +01:00
class spell_dru_wild_growth : public SpellScriptLoader
{
2017-03-18 14:25:26 +01:00
public :
spell_dru_wild_growth () : SpellScriptLoader ( "spell_dru_wild_growth" ) { }
2014-01-26 01:02:20 +01:00
2017-03-18 14:25:26 +01:00
class spell_dru_wild_growth_SpellScript : public SpellScript
{
PrepareSpellScript ( spell_dru_wild_growth_SpellScript );
2014-01-26 01:02:20 +01:00
2017-03-18 14:25:26 +01:00
bool Validate ( SpellInfo const * spellInfo ) override
{
SpellEffectInfo const * effect2 = spellInfo -> GetEffect ( EFFECT_2 );
if ( ! effect2 || effect2 -> IsEffect () || effect2 -> CalcValue () <= 0 )
return false ;
return true ;
}
2014-01-26 01:02:20 +01:00
2017-03-18 14:25:26 +01:00
void FilterTargets ( std :: list < WorldObject *>& targets )
{
targets . remove_if ( RaidCheck ( GetCaster ()));
2014-01-27 23:01:37 +01:00
2017-03-18 14:25:26 +01:00
uint32 const maxTargets = uint32 ( GetSpellInfo () -> GetEffect ( EFFECT_2 ) -> CalcValue ( GetCaster ()));
2014-01-27 23:01:37 +01:00
2017-03-18 14:25:26 +01:00
if ( targets . size () > maxTargets )
2014-01-27 23:01:37 +01:00
{
2017-03-18 14:25:26 +01:00
targets . sort ( Trinity :: HealthPctOrderPred ());
targets . resize ( maxTargets );
2014-01-26 01:02:20 +01:00
}
2017-03-18 14:25:26 +01:00
_targets = targets ;
}
2014-01-27 23:01:37 +01:00
2017-03-18 14:25:26 +01:00
void SetTargets ( std :: list < WorldObject *>& targets )
{
targets = _targets ;
}
2014-01-26 01:02:20 +01:00
2017-03-18 14:25:26 +01:00
void Register () override
2014-01-26 01:02:20 +01:00
{
2017-03-18 14:25:26 +01:00
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn ( spell_dru_wild_growth_SpellScript :: FilterTargets , EFFECT_0 , TARGET_UNIT_DEST_AREA_ALLY );
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn ( spell_dru_wild_growth_SpellScript :: SetTargets , EFFECT_1 , TARGET_UNIT_DEST_AREA_ALLY );
2014-01-26 01:02:20 +01:00
}
2017-03-18 14:25:26 +01:00
std :: list < WorldObject *> _targets ;
};
2017-06-02 14:12:53 -03:00
class spell_dru_wild_growth_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dru_wild_growth_AuraScript );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_RESTORATION_T10_2P_BONUS });
}
void HandleTickUpdate ( AuraEffect * aurEff )
{
Unit * caster = GetCaster ();
if ( ! caster )
return ;
// calculate from base damage, not from aurEff->GetAmount() (already modified)
float damage = caster -> CalculateSpellDamage ( GetUnitOwner (), GetSpellInfo (), aurEff -> GetEffIndex ());
// Wild Growth = first tick gains a 6% bonus, reduced by 2% each tick
float reduction = 2.f ;
if ( AuraEffect * bonus = caster -> GetAuraEffect ( SPELL_DRUID_RESTORATION_T10_2P_BONUS , EFFECT_0 ))
reduction -= CalculatePct ( reduction , bonus -> GetAmount ());
reduction *= ( aurEff -> GetTickNumber () - 1 );
AddPct ( damage , 6.f - reduction );
aurEff -> SetAmount ( int32 ( damage ));
}
void Register () override
{
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn ( spell_dru_wild_growth_AuraScript :: HandleTickUpdate , EFFECT_0 , SPELL_AURA_PERIODIC_HEAL );
}
};
2017-03-18 14:25:26 +01:00
SpellScript * GetSpellScript () const override
{
return new spell_dru_wild_growth_SpellScript ();
}
2017-06-02 14:12:53 -03:00
AuraScript * GetAuraScript () const override
{
return new spell_dru_wild_growth_AuraScript ();
}
2014-01-26 01:02:20 +01:00
};
2010-08-18 00:20:23 +06:00
void AddSC_druid_spell_scripts ()
{
2021-03-09 00:01:31 +02:00
RegisterAuraScript ( spell_dru_barkskin );
RegisterSpellScript ( spell_dru_berserk );
RegisterAuraScript ( spell_dru_brambles );
RegisterAuraScript ( spell_dru_bristling_fur );
2013-01-20 04:30:17 +01:00
new spell_dru_dash ();
2021-03-09 00:01:31 +02:00
RegisterAuraScript ( spell_dru_earthwarden );
2021-02-23 21:05:39 +02:00
RegisterSpellScript ( spell_dru_ferocious_bite );
2017-03-18 14:25:26 +01:00
new spell_dru_flight_form ();
2016-05-13 01:13:19 +02:00
new spell_dru_forms_trinket ();
2021-03-09 00:01:31 +02:00
RegisterAuraScript ( spell_dru_galactic_guardian );
2021-02-17 23:25:10 +02:00
RegisterAuraScript ( spell_dru_gore );
2013-01-20 04:30:17 +01:00
new spell_dru_idol_lifebloom ();
2021-03-09 00:01:31 +02:00
RegisterSpellScript ( spell_dru_incapacitating_roar );
2013-01-20 04:30:17 +01:00
new spell_dru_innervate ();
2021-02-22 23:10:49 +02:00
new spell_dru_item_t6_trinket ();
2012-09-17 18:17:23 +02:00
new spell_dru_lifebloom ();
2013-01-22 00:20:16 +01:00
new spell_dru_living_seed ();
new spell_dru_living_seed_proc ();
2017-03-18 14:25:26 +01:00
new spell_dru_moonfire ();
2016-09-25 20:48:31 -03:00
new spell_dru_omen_of_clarity ();
2012-09-17 18:17:23 +02:00
new spell_dru_predatory_strikes ();
2021-02-16 00:04:04 +02:00
RegisterSpellScript ( spell_dru_prowl );
2013-01-20 04:30:17 +01:00
new spell_dru_rip ();
2012-09-17 18:17:23 +02:00
new spell_dru_savage_roar ();
2021-02-22 23:10:49 +02:00
RegisterSpellScript ( spell_dru_skull_bash );
2013-07-26 22:13:11 +02:00
new spell_dru_stampede ();
2021-03-09 00:01:31 +02:00
RegisterSpellScript ( spell_dru_stampeding_roar );
2017-03-18 14:25:26 +01:00
new spell_dru_starfall_dummy ();
new spell_dru_sunfire ();
2012-06-03 02:35:00 +02:00
new spell_dru_survival_instincts ();
2012-09-17 18:17:23 +02:00
new spell_dru_swift_flight_passive ();
2016-09-25 20:48:31 -03:00
new spell_dru_t3_6p_bonus ();
new spell_dru_t3_8p_bonus ();
new spell_dru_t4_2p_bonus ();
new spell_dru_t10_balance_4p_bonus ();
2012-09-17 18:17:23 +02:00
new spell_dru_t10_restoration_4p_bonus ();
2016-09-25 20:48:31 -03:00
new spell_dru_t10_restoration_4p_bonus_dummy ();
2021-03-09 00:01:31 +02:00
RegisterSpellScript ( spell_dru_thrash );
RegisterAuraScript ( spell_dru_thrash_aura );
2021-02-22 23:10:49 +02:00
new spell_dru_travel_form ();
new spell_dru_travel_form_dummy ();
2021-03-09 00:01:31 +02:00
RegisterAuraScript ( spell_dru_tiger_dash );
2014-01-26 01:02:20 +01:00
new spell_dru_wild_growth ();
2010-08-06 19:46:02 +02:00
}