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-03-24 01:50:28 +02:00
SPELL_DRUID_ECLIPSE_DUMMY = 79577 ,
SPELL_DRUID_ECLIPSE_LUNAR_AURA = 48518 ,
SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT = 326055 ,
SPELL_DRUID_ECLIPSE_OOC = 329910 ,
SPELL_DRUID_ECLIPSE_SOLAR_AURA = 48517 ,
SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT = 326053 ,
2021-02-23 21:05:39 +02:00
SPELL_DRUID_EXHILARATE = 28742 ,
SPELL_DRUID_FERAL_CHARGE_BEAR = 16979 ,
SPELL_DRUID_FERAL_CHARGE_CAT = 49376 ,
2021-04-11 22:16:41 +03:00
SPELL_DRUID_FORM_AQUATIC_PASSIVE = 276012 ,
2021-02-23 21:05:39 +02:00
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 ,
2018-06-05 04:01:27 +03:00
SPELL_DRUID_GROWL = 6795 ,
2021-02-23 21:05:39 +02:00
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 ,
2021-04-11 22:16:41 +03:00
SPELL_DRUID_PROWL = 5215 ,
2021-02-23 21:05:39 +02:00
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 );
2018-06-05 04:01:27 +03:00
protected :
2021-03-09 00:01:31 +02:00
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 );
}
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 );
}
};
2018-06-05 04:01:27 +03:00
// 50334 - Berserk
2021-03-09 00:01:31 +02:00
class spell_dru_berserk : public spell_dru_base_transformer
{
2018-06-05 04:01:27 +03:00
PrepareSpellScript ( spell_dru_berserk );
bool Validate ( SpellInfo const * spellInfo ) override
{
if ( ! spell_dru_base_transformer :: Validate ( spellInfo ))
return false ;
return ValidateSpellInfo ({ SPELL_DRUID_MANGLE , SPELL_DRUID_THRASH_BEAR , SPELL_DRUID_GROWL });
}
void ResetCooldowns ()
{
GetCaster () -> GetSpellHistory () -> ResetCooldown ( SPELL_DRUID_MANGLE );
GetCaster () -> GetSpellHistory () -> ResetCooldown ( SPELL_DRUID_THRASH_BEAR );
GetCaster () -> GetSpellHistory () -> ResetCooldown ( SPELL_DRUID_GROWL );
}
void Register () override
{
spell_dru_base_transformer :: Register ();
AfterCast += SpellCastFn ( spell_dru_berserk :: ResetCooldowns );
}
2021-03-09 00:01:31 +02:00
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 ())
2017-12-30 20:28:41 +01:00
target -> CastSpell ( attacker , SPELL_DRUID_BRAMBLES_REFLECT , CastSpellExtraArgs ( TRIGGERED_FULL_MASK ). AddSpellMod ( SPELLVALUE_BASE_POINT0 , absorbAmount ));
2021-03-09 00:01:31 +02:00
}
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 ();
2021-04-11 22:16:41 +03:00
uint32 rage = target -> GetMaxPower ( POWER_RAGE ) * ( float ) damageInfo -> GetDamage () / ( float ) target -> GetMaxHealth ();
2021-03-09 00:01:31 +02:00
if ( rage > 0 )
2017-12-30 20:28:41 +01:00
target -> CastSpell ( target , SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE , CastSpellExtraArgs ( TRIGGERED_FULL_MASK ). AddSpellMod ( SPELLVALUE_BASE_POINT0 , rage ));
2021-03-09 00:01:31 +02:00
}
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dru_bristling_fur :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
};
2021-04-11 22:16:41 +03:00
// 768 - CatForm - SPELL_DRUID_CAT_FORM
class spell_dru_cat_form : public AuraScript
{
PrepareAuraScript ( spell_dru_cat_form );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_PROWL });
}
void HandleAfterRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
GetTarget () -> RemoveOwnedAura ( SPELL_DRUID_PROWL );
}
void Register () override
{
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_cat_form :: HandleAfterRemove , EFFECT_0 , SPELL_AURA_MOD_SHAPESHIFT , AURA_EFFECT_HANDLE_REAL );
}
};
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-24 01:50:28 +02:00
class spell_dru_eclipse_common
{
public :
static void SetSpellCount ( Unit * unitOwner , uint32 spellId , uint32 amount )
{
Aura * aura = unitOwner -> GetAura ( spellId );
if ( ! aura )
2017-12-30 20:28:41 +01:00
unitOwner -> CastSpell ( unitOwner , spellId , CastSpellExtraArgs ( TRIGGERED_FULL_MASK ). AddSpellMod ( SPELLVALUE_AURA_STACK , amount ));
2021-03-24 01:50:28 +02:00
else
aura -> SetStackAmount ( amount );
}
};
// 48517 Eclipse (Solar) + 48518 Eclipse (Lunar)
class spell_dru_eclipse_aura : public AuraScript
{
PrepareAuraScript ( spell_dru_eclipse_aura );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_DUMMY });
}
void HandleRemoved ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
AuraEffect const * auraEffDummy = GetTarget () -> GetAuraEffect ( SPELL_DRUID_ECLIPSE_DUMMY , EFFECT_0 );
if ( ! auraEffDummy )
return ;
uint32 spellId = GetSpellInfo () -> Id == SPELL_DRUID_ECLIPSE_SOLAR_AURA ? SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT : SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT ;
spell_dru_eclipse_common :: SetSpellCount ( GetTarget (), spellId , auraEffDummy -> GetAmount ());
}
void Register () override
{
AfterEffectRemove += AuraEffectRemoveFn ( spell_dru_eclipse_aura :: HandleRemoved , EFFECT_0 , SPELL_AURA_ADD_PCT_MODIFIER , AURA_EFFECT_HANDLE_REAL );
}
};
// 79577 - Eclipse - SPELL_DRUID_ECLIPSE_DUMMY
class spell_dru_eclipse_dummy : public AuraScript
{
PrepareAuraScript ( spell_dru_eclipse_dummy );
class InitializeEclipseCountersEvent : public BasicEvent
{
public :
InitializeEclipseCountersEvent ( Unit * owner , uint32 count ) : BasicEvent (), _owner ( owner ), _count ( count ) { }
bool Execute ( uint64 , uint32 ) override
{
spell_dru_eclipse_common :: SetSpellCount ( _owner , SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT , _count );
spell_dru_eclipse_common :: SetSpellCount ( _owner , SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT , _count );
return true ;
}
private :
Unit * _owner ;
uint32 _count ;
};
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT ,
SPELL_DRUID_ECLIPSE_SOLAR_AURA , SPELL_DRUID_ECLIPSE_LUNAR_AURA });
}
void HandleProc ( ProcEventInfo & eventInfo )
{
if ( SpellInfo const * spellInfo = eventInfo . GetSpellInfo ())
{
if ( spellInfo -> SpellFamilyFlags & flag128 ( 0x4 , 0x0 , 0x0 , 0x0 )) // Starfire
OnSpellCast ( SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_SOLAR_AURA );
else if ( spellInfo -> SpellFamilyFlags & flag128 ( 0x1 , 0x0 , 0x0 , 0x0 )) // Wrath
OnSpellCast ( SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_LUNAR_AURA );
}
}
void HandleApply ( AuraEffect const * aurEff , AuraEffectHandleModes /*mode*/ )
{
// counters are applied with a delay
GetTarget () -> m_Events . AddEventAtOffset ( new InitializeEclipseCountersEvent ( GetTarget (), aurEff -> GetAmount ()), 1 s );
}
void HandleRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
GetTarget () -> RemoveAura ( SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT );
GetTarget () -> RemoveAura ( SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT );
}
void OnOwnerOutOfCombat ( bool isNowInCombat )
{
if ( ! isNowInCombat )
GetTarget () -> CastSpell ( GetTarget (), SPELL_DRUID_ECLIPSE_OOC , TRIGGERED_FULL_MASK );
}
void Register () override
{
AfterEffectApply += AuraEffectApplyFn ( spell_dru_eclipse_dummy :: HandleApply , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
AfterEffectRemove += AuraEffectApplyFn ( spell_dru_eclipse_dummy :: HandleRemove , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
OnProc += AuraProcFn ( spell_dru_eclipse_dummy :: HandleProc );
OnEnterLeaveCombat += AuraEnterLeaveCombatFn ( spell_dru_eclipse_dummy :: OnOwnerOutOfCombat );
}
private :
void OnSpellCast ( uint32 cntSpellId , uint32 otherCntSpellId , uint32 eclipseAuraSpellId )
{
Unit * target = GetTarget ();
if ( Aura * aura = target -> GetAura ( cntSpellId ))
{
uint32 remaining = aura -> GetStackAmount ();
if ( remaining == 0 )
return ;
if ( remaining > 1 )
aura -> SetStackAmount ( remaining - 1 );
else
{
// cast eclipse
target -> CastSpell ( target , eclipseAuraSpellId , TRIGGERED_FULL_MASK );
// Remove stacks from other one as well
// reset remaining power on other spellId
target -> RemoveAura ( cntSpellId );
target -> RemoveAura ( otherCntSpellId );
}
}
}
};
// 329910 - Eclipse out of combat - SPELL_DRUID_ECLIPSE_OOC
class spell_dru_eclipse_ooc : public AuraScript
{
PrepareAuraScript ( spell_dru_eclipse_ooc );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_ECLIPSE_DUMMY , SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT , SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT });
}
void Tick ( AuraEffect const * /*aurEff*/ )
{
Unit * owner = GetTarget ();
AuraEffect const * auraEffDummy = owner -> GetAuraEffect ( SPELL_DRUID_ECLIPSE_DUMMY , EFFECT_0 );
if ( ! auraEffDummy )
return ;
if ( ! owner -> IsInCombat () && ( ! owner -> HasAura ( SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT ) || ! owner -> HasAura ( SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT )))
{
// Restore 2 stacks to each spell when out of combat
spell_dru_eclipse_common :: SetSpellCount ( owner , SPELL_DRUID_ECLIPSE_SOLAR_SPELL_CNT , auraEffDummy -> GetAmount ());
spell_dru_eclipse_common :: SetSpellCount ( owner , SPELL_DRUID_ECLIPSE_LUNAR_SPELL_CNT , auraEffDummy -> GetAmount ());
}
}
void Register () override
{
OnEffectPeriodic += AuraEffectPeriodicFn ( spell_dru_eclipse_ooc :: Tick , EFFECT_0 , SPELL_AURA_PERIODIC_DUMMY );
}
};
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 })
2021-09-04 15:13:15 +02:00
&& sSpellMgr -> AssertSpellInfo ( SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE , DIFFICULTY_NONE ) -> GetEffects (). size () > EFFECT_1 ;
2021-02-23 21:05:39 +02:00
}
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 ;
}
2017-12-30 20:28:41 +01:00
target -> CastSpell ( target , triggerspell , aurEff );
2016-05-13 01:13:19 +02:00
}
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 ());
2021-03-15 21:03:06 +01:00
spellMod -> op = SpellModOp :: PeriodicHealingAndDamage ;
2017-03-18 14:25:26 +01:00
spellMod -> type = SPELLMOD_FLAT ;
spellMod -> spellId = GetId ();
2021-09-04 15:13:15 +02:00
spellMod -> mask = aurEff -> GetSpellEffectInfo (). 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*/ )
{
2017-12-14 11:42:42 -03:00
if ( ! aurEff -> GetTotalTicks ())
{
amount = 0 ;
return ;
}
2017-03-18 14:25:26 +01:00
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 ))
2017-12-30 20:28:41 +01:00
eventInfo . GetActor () -> CastSpell ( nullptr , spellId , aurEff );
2021-02-22 23:10:49 +02:00
}
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-12-30 20:28:41 +01:00
void OnRemoveEffect ( Unit * target , AuraEffect const * aurEff , uint32 stack )
2010-08-18 00:20:23 +06:00
{
2017-03-18 14:25:26 +01:00
if ( Unit * caster = GetCaster ())
2011-01-31 14:51:42 +01:00
{
2017-03-18 14:25:26 +01:00
// 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 ())
{
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( aurEff );
args . OriginalCaster = GetCasterGUID ();
args . AddSpellBP0 ( m -> Amount * stack / 2 );
caster -> CastSpell ( caster , SPELL_DRUID_LIFEBLOOM_ENERGIZE , args );
2017-03-18 14:25:26 +01:00
}
2011-01-31 14:51:42 +01:00
}
2018-01-17 13:01:18 -03:00
target -> CastSpell ( target , SPELL_DRUID_LIFEBLOOM_FINAL_HEAL , { aurEff , GetCasterGUID () });
2017-12-30 20:28:41 +01:00
}
void AfterRemove ( AuraEffect const * aurEff , AuraEffectHandleModes /*mode*/ )
{
// Final heal only on duration end
if ( GetTargetApplication () -> GetRemoveMode () != AURA_REMOVE_BY_EXPIRE )
return ;
// final heal
OnRemoveEffect ( GetTarget (), aurEff , GetStackAmount ());
2017-03-18 14:25:26 +01:00
}
void HandleDispel ( DispelInfo * dispelInfo )
{
if ( Unit * target = GetUnitOwner ())
if ( AuraEffect const * aurEff = GetEffect ( EFFECT_1 ))
2017-12-30 20:28:41 +01:00
OnRemoveEffect ( target , aurEff , dispelInfo -> GetRemovedCharges ()); // final heal
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 ();
2017-12-30 20:28:41 +01:00
HealInfo * healInfo = eventInfo . GetHealInfo ();
if ( ! healInfo || ! healInfo -> GetHeal ())
return ;
CastSpellExtraArgs args ( aurEff );
2018-01-13 20:38:32 -03:00
args . AddSpellMod ( SPELLVALUE_BASE_POINT0 , CalculatePct ( healInfo -> GetHeal (), aurEff -> GetAmount ()));
2017-12-30 20:28:41 +01:00
GetTarget () -> CastSpell ( eventInfo . GetProcTarget (), SPELL_DRUID_LIVING_SEED_PROC , args );
2017-03-18 14:25:26 +01:00
}
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 ();
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( aurEff );
2018-01-13 20:38:32 -03:00
args . AddSpellMod ( SPELLVALUE_BASE_POINT0 , aurEff -> GetAmount ());
2017-12-30 20:28:41 +01:00
GetTarget () -> CastSpell ( GetTarget (), SPELL_DRUID_LIVING_SEED_HEAL , args );
2017-03-18 14:25:26 +01:00
}
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 ))
2017-12-30 20:28:41 +01:00
target -> CastSpell ( nullptr , SPELL_DRUID_BALANCE_T10_BONUS_PROC , true );
2021-02-22 23:10:49 +02:00
}
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 ();
2017-12-30 20:28:41 +01:00
target -> CastSpell ( target , SPELL_DRUID_SAVAGE_ROAR , { aurEff , GetCasterGUID () });
2017-03-18 14:25:26 +01:00
}
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-12-30 20:28:41 +01:00
GetTarget () -> CastSpell ( GetTarget (), sSpellMgr -> GetSpellWithRank ( SPELL_DRUID_STAMPEDE_CAT_RANK_1 , GetSpellInfo () -> GetRank ()), aurEff );
GetTarget () -> CastSpell ( GetTarget (), SPELL_DRUID_STAMPEDE_CAT_STATE , aurEff );
2017-03-18 14:25:26 +01:00
}
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-12-30 20:28:41 +01:00
GetTarget () -> CastSpell ( GetTarget (), sSpellMgr -> GetSpellWithRank ( SPELL_DRUID_STAMPEDE_BAER_RANK_1 , GetSpellInfo () -> GetRank ()), 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 ();
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( aurEff );
args . AddSpellMod ( SPELLVALUE_BASE_POINT0 , target -> CountPctFromMaxHealth ( aurEff -> GetAmount ()));
target -> CastSpell ( target , SPELL_DRUID_SURVIVAL_INSTINCTS , args );
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 ();
2017-12-30 20:28:41 +01:00
eventInfo . GetActor () -> CastSpell ( eventInfo . GetProcTarget (), SPELL_DRUID_BLESSING_OF_THE_CLAW , 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 ());
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( aurEff );
2018-01-13 20:38:32 -03:00
args . AddSpellBP0 ( amount );
2017-12-30 20:28:41 +01:00
caster -> CastSpell ( nullptr , SPELL_DRUID_EXHILARATE , args );
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 ();
2017-12-30 20:28:41 +01:00
eventInfo . GetActor () -> CastSpell ( nullptr , SPELL_DRUID_INFUSION , 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 ());
2017-12-15 03:40:36 -03:00
ASSERT ( spellInfo -> GetMaxTicks () > 0 );
2021-02-22 23:10:49 +02:00
amount /= spellInfo -> GetMaxTicks ();
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( aurEff );
2018-01-13 20:38:32 -03:00
args . AddSpellMod ( SPELLVALUE_BASE_POINT0 , amount );
2017-12-30 20:28:41 +01:00
caster -> CastSpell ( target , SPELL_DRUID_LANGUISH , args );
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 ();
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( aurEff );
2018-01-13 20:38:32 -03:00
args . AddSpellMod ( SPELLVALUE_BASE_POINT0 , eventInfo . GetHealInfo () -> GetHeal ());
2017-12-30 20:28:41 +01:00
eventInfo . GetActor () -> CastSpell ( nullptr , SPELL_DRUID_REJUVENATION_T10_PROC , args );
2021-02-22 23:10:49 +02:00
}
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
{
2021-04-11 22:16:41 +03:00
return ValidateSpellInfo ({ SPELL_DRUID_FORM_STAG , SPELL_DRUID_FORM_AQUATIC_PASSIVE , SPELL_DRUID_FORM_AQUATIC , SPELL_DRUID_FORM_FLIGHT , SPELL_DRUID_FORM_SWIFT_FLIGHT });
2021-03-09 00:01:31 +02:00
}
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 ();
}
2021-03-08 23:58:40 +01:00
void AfterRemove ( AuraEffect const * aurEff , AuraEffectHandleModes /*mode*/ )
2021-03-09 00:01:31 +02:00
{
if ( triggeredSpellId == m_scriptSpellId )
return ;
Player * player = GetTarget () -> ToPlayer ();
if ( triggeredSpellId ) // Apply new form
2017-12-30 20:28:41 +01:00
player -> CastSpell ( player , triggeredSpellId , aurEff );
2021-03-09 00:01:31 +02:00
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
2021-04-11 22:16:41 +03:00
if ( player -> HasSpell ( SPELL_DRUID_FORM_AQUATIC_PASSIVE ) && player -> IsInWater ()) // Aquatic form
2021-03-04 23:56:43 +01:00
return SPELL_DRUID_FORM_AQUATIC ;
2018-07-22 18:34:39 +02:00
2021-03-08 23:58:40 +01:00
if ( ! player -> IsInCombat () && player -> GetSkillValue ( SKILL_RIDING ) >= 225 && CheckLocationForForm ( player , difficulty , requiresOutdoor , SPELL_DRUID_FORM_FLIGHT ) == SPELL_CAST_OK ) // Flight form
2021-03-04 23:56:43 +01:00
return player -> GetSkillValue ( SKILL_RIDING ) >= 300 ? SPELL_DRUID_FORM_SWIFT_FLIGHT : SPELL_DRUID_FORM_FLIGHT ;
2018-07-22 18:34:39 +02:00
2021-04-11 22:16:41 +03:00
if ( ! player -> IsInWater () && CheckLocationForForm ( player , difficulty , requiresOutdoor , SPELL_DRUID_FORM_STAG ) == SPELL_CAST_OK ) // Stag form
2021-03-04 23:56:43 +01:00
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
2018-04-07 00:21:51 +02:00
if ( requireOutdoors && ! targetPlayer -> IsOutdoors ())
2021-03-04 23:56:43 +01:00
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-04-11 22:16:41 +03:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DRUID_FORM_AQUATIC_PASSIVE , SPELL_DRUID_FORM_AQUATIC , SPELL_DRUID_FORM_STAG });
}
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-04-11 22:16:41 +03:00
uint32 spellId = ( player -> HasSpell ( SPELL_DRUID_FORM_AQUATIC_PASSIVE ) && player -> IsInWater ()) ? SPELL_DRUID_FORM_AQUATIC : SPELL_DRUID_FORM_STAG ;
2016-09-25 20:48:31 -03:00
2021-04-11 22:16:41 +03:00
SpellInfo const * spellInfo = sSpellMgr -> GetSpellInfo ( spellId , GetCastDifficulty ());
2021-02-22 23:10:49 +02:00
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-03-08 23:58:40 +01: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
2017-12-30 20:28:41 +01:00
player -> CastSpell ( player , triggeredSpellId , aurEff );
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
2021-04-11 22:16:41 +03:00
class spell_dru_tiger_dash : public spell_dru_base_transformer
{
protected :
bool ToCatForm () const override { return true ; }
};
// 252216 - Tiger Dash (Aura)
class spell_dru_tiger_dash_aura : public AuraScript
2021-03-04 23:56:43 +01:00
{
2021-04-11 22:16:41 +03:00
PrepareAuraScript ( spell_dru_tiger_dash_aura );
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-04-11 22:16:41 +03:00
OnEffectPeriodic += AuraEffectPeriodicFn ( spell_dru_tiger_dash_aura :: 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
{
2021-09-04 15:13:15 +02:00
if ( spellInfo -> GetEffects (). size () <= EFFECT_2 || spellInfo -> GetEffect ( EFFECT_2 ). IsEffect () || spellInfo -> GetEffect ( EFFECT_2 ). CalcValue () <= 0 )
2017-03-18 14:25:26 +01:00
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
2021-09-04 15:13:15 +02:00
uint32 const maxTargets = uint32 ( GetEffectInfo ( 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)
2021-09-04 15:13:15 +02:00
float damage = caster -> CalculateSpellDamage ( GetUnitOwner (), aurEff -> GetSpellEffectInfo ());
2017-06-02 14:12:53 -03:00
// 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 );
2021-04-11 22:16:41 +03:00
RegisterAuraScript ( spell_dru_cat_form );
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-03-24 01:50:28 +02:00
RegisterAuraScript ( spell_dru_eclipse_aura );
RegisterAuraScript ( spell_dru_eclipse_dummy );
RegisterAuraScript ( spell_dru_eclipse_ooc );
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-04-11 22:16:41 +03:00
RegisterSpellAndAuraScriptPair ( spell_dru_tiger_dash , spell_dru_tiger_dash_aura );
2014-01-26 01:02:20 +01:00
new spell_dru_wild_growth ();
2010-08-06 19:46:02 +02:00
}