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_DEATHKNIGHT and SPELLFAMILY_GENERIC spells used by deathknight players.
* Ordered alphabetically using scriptname.
* Scriptnames of files in this file should be prefixed with "spell_dk_".
*/
2012-02-19 16:57:07 +01:00
#include "ScriptMgr.h"
2017-05-24 21:30:43 +02:00
#include "Containers.h"
#include "ObjectMgr.h"
2023-01-26 18:38:10 +01:00
#include "ObjectAccessor.h"
2017-05-24 21:30:43 +02:00
#include "Player.h"
2023-01-26 18:38:10 +01:00
#include "Spell.h"
2012-02-19 16:57:07 +01:00
#include "SpellAuraEffects.h"
2015-02-17 01:01:44 +01:00
#include "SpellHistory.h"
2017-05-24 21:30:43 +02:00
#include "SpellScript.h"
2021-03-15 23:53:30 +02:00
#include <numeric>
2010-07-24 22:41:42 +02:00
2010-08-18 00:20:23 +06:00
enum DeathKnightSpells
{
2015-01-12 23:49:19 +00:00
SPELL_DK_ARMY_FLESH_BEAST_TRANSFORM = 127533 ,
SPELL_DK_ARMY_GEIST_TRANSFORM = 127534 ,
SPELL_DK_ARMY_NORTHREND_SKELETON_TRANSFORM = 127528 ,
SPELL_DK_ARMY_SKELETON_TRANSFORM = 127527 ,
SPELL_DK_ARMY_SPIKED_GHOUL_TRANSFORM = 127525 ,
SPELL_DK_ARMY_SUPER_ZOMBIE_TRANSFORM = 127526 ,
2017-06-20 23:45:58 +02:00
SPELL_DK_BLOOD = 137008 ,
2014-06-15 19:36:30 +02:00
SPELL_DK_BLOOD_PLAGUE = 55078 ,
2013-07-23 16:28:23 +02:00
SPELL_DK_BLOOD_SHIELD_ABSORB = 77535 ,
2017-06-20 23:45:58 +02:00
SPELL_DK_BLOOD_SHIELD_MASTERY = 77513 ,
2013-01-11 04:18:02 +01:00
SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999 ,
2014-07-24 16:14:25 +02:00
SPELL_DK_DEATH_AND_DECAY_DAMAGE = 52212 ,
2013-01-11 04:18:02 +01:00
SPELL_DK_DEATH_COIL_DAMAGE = 47632 ,
2017-06-20 23:45:58 +02:00
SPELL_DK_DEATH_GRIP_DUMMY = 243912 ,
SPELL_DK_DEATH_GRIP_JUMP = 49575 ,
SPELL_DK_DEATH_GRIP_TAUNT = 51399 ,
2013-01-11 04:18:02 +01:00
SPELL_DK_DEATH_STRIKE_HEAL = 45470 ,
2017-06-20 23:45:58 +02:00
SPELL_DK_DEATH_STRIKE_OFFHAND = 66188 ,
SPELL_DK_FESTERING_WOUND = 194310 ,
SPELL_DK_FROST = 137006 ,
2023-01-26 18:38:10 +01:00
SPELL_DK_FROST_FEVER = 55095 ,
2022-10-07 20:56:46 +02:00
SPELL_DK_FROST_SCYTHE = 207230 ,
2015-01-12 23:49:19 +00:00
SPELL_DK_GLYPH_OF_FOUL_MENAGERIE = 58642 ,
SPELL_DK_GLYPH_OF_THE_GEIST = 58640 ,
SPELL_DK_GLYPH_OF_THE_SKELETON = 146652 ,
2016-09-25 20:48:31 -03:00
SPELL_DK_MARK_OF_BLOOD_HEAL = 206945 ,
SPELL_DK_NECROSIS_EFFECT = 216974 ,
2017-06-20 23:45:58 +02:00
SPELL_DK_RAISE_DEAD_SUMMON = 52150 ,
SPELL_DK_RECENTLY_USED_DEATH_STRIKE = 180612 ,
2013-01-11 04:18:02 +01:00
SPELL_DK_RUNIC_POWER_ENERGIZE = 49088 ,
2016-09-25 20:48:31 -03:00
SPELL_DK_RUNIC_RETURN = 61258 ,
2017-06-20 23:45:58 +02:00
SPELL_DK_SLUDGE_BELCHER = 207313 ,
SPELL_DK_SLUDGE_BELCHER_SUMMON = 212027 ,
2021-03-15 23:53:30 +02:00
SPELL_DK_DEATH_STRIKE_ENABLER = 89832 , // Server Side
2017-06-20 23:45:58 +02:00
SPELL_DK_TIGHTENING_GRASP = 206970 ,
SPELL_DK_TIGHTENING_GRASP_SLOW = 143375 ,
SPELL_DK_UNHOLY = 137007 ,
SPELL_DK_UNHOLY_VIGOR = 196263 ,
SPELL_DK_VOLATILE_SHIELDING = 207188 ,
SPELL_DK_VOLATILE_SHIELDING_DAMAGE = 207194
2013-01-11 04:18:02 +01:00
};
2016-09-25 20:48:31 -03:00
enum Misc
{
NPC_DK_DANCING_RUNE_WEAPON = 27893
};
2016-05-13 01:13:19 +02:00
// 70656 - Advantage (T10 4P Melee Bonus)
2021-03-05 23:23:56 +02:00
class spell_dk_advantage_t10_4p : public AuraScript
2016-05-13 01:13:19 +02:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_advantage_t10_4p );
2016-05-13 01:13:19 +02:00
2021-03-05 23:23:56 +02:00
bool CheckProc ( ProcEventInfo & eventInfo )
2016-05-13 01:13:19 +02:00
{
2021-03-05 23:23:56 +02:00
if ( Unit * caster = eventInfo . GetActor ())
2016-05-13 01:13:19 +02:00
{
2021-03-05 23:23:56 +02:00
Player * player = caster -> ToPlayer ();
2019-07-01 21:36:32 +02:00
if ( ! player || caster -> GetClass () != CLASS_DEATH_KNIGHT )
2021-03-05 23:23:56 +02:00
return false ;
2016-05-13 01:13:19 +02:00
2021-03-05 23:23:56 +02:00
for ( uint8 i = 0 ; i < player -> GetMaxPower ( POWER_RUNES ); ++ i )
if ( player -> GetRuneCooldown ( i ) == 0 )
return false ;
2016-05-13 01:13:19 +02:00
2021-03-05 23:23:56 +02:00
return true ;
2016-05-13 01:13:19 +02:00
}
2021-03-05 23:23:56 +02:00
return false ;
}
2016-05-13 01:13:19 +02:00
2021-03-05 23:23:56 +02:00
void Register () override
2016-05-13 01:13:19 +02:00
{
2021-03-05 23:23:56 +02:00
DoCheckProc += AuraCheckProcFn ( spell_dk_advantage_t10_4p :: CheckProc );
2016-05-13 01:13:19 +02:00
}
};
2015-01-12 23:49:19 +00:00
// 48707 - Anti-Magic Shell
2021-03-05 23:23:56 +02:00
class spell_dk_anti_magic_shell : public AuraScript
2010-12-30 02:03:46 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_anti_magic_shell );
2010-12-30 02:03:46 +01:00
2021-03-05 23:23:56 +02:00
public :
spell_dk_anti_magic_shell ()
{
absorbPct = 0 ;
maxHealth = 0 ;
absorbedAmount = 0 ;
}
2015-01-12 23:49:19 +00:00
2021-09-04 15:13:15 +02:00
bool Validate ( SpellInfo const * spellInfo ) override
2021-03-05 23:23:56 +02:00
{
2021-09-04 15:13:15 +02:00
return ValidateSpellInfo ({ SPELL_DK_RUNIC_POWER_ENERGIZE , SPELL_DK_VOLATILE_SHIELDING }) && spellInfo -> GetEffects (). size () > EFFECT_1 ;
2021-03-05 23:23:56 +02:00
}
2015-01-12 23:49:19 +00:00
2021-03-05 23:23:56 +02:00
bool Load () override
{
2021-09-04 15:13:15 +02:00
absorbPct = GetEffectInfo ( EFFECT_1 ). CalcValue ( GetCaster ());
2021-03-05 23:23:56 +02:00
maxHealth = GetCaster () -> GetMaxHealth ();
absorbedAmount = 0 ;
return true ;
}
2015-01-12 23:49:19 +00:00
2021-03-05 23:23:56 +02:00
void CalculateAmount ( AuraEffect const * /*aurEff*/ , int32 & amount , bool & /*canBeRecalculated*/ )
{
amount = CalculatePct ( maxHealth , absorbPct );
}
2011-01-22 17:21:24 +01:00
2021-03-05 23:23:56 +02:00
void Trigger ( AuraEffect * aurEff , DamageInfo & /*dmgInfo*/ , uint32 & absorbAmount )
{
absorbedAmount += absorbAmount ;
2015-01-12 23:49:19 +00:00
2021-03-05 23:23:56 +02:00
if ( ! GetTarget () -> HasAura ( SPELL_DK_VOLATILE_SHIELDING ))
{
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( aurEff );
2018-01-13 20:38:32 -03:00
args . AddSpellMod ( SPELLVALUE_BASE_POINT0 , CalculatePct ( absorbAmount , 2 * absorbAmount * 100 / maxHealth ));
2017-12-30 20:28:41 +01:00
GetTarget () -> CastSpell ( GetTarget (), SPELL_DK_RUNIC_POWER_ENERGIZE , args );
2021-03-05 23:23:56 +02:00
}
}
2010-12-30 02:03:46 +01:00
2021-03-05 23:23:56 +02:00
void HandleEffectRemove ( AuraEffect const * /*aurEff*/ , AuraEffectHandleModes /*mode*/ )
{
if ( AuraEffect const * volatileShielding = GetTarget () -> GetAuraEffect ( SPELL_DK_VOLATILE_SHIELDING , EFFECT_1 ))
2010-12-30 02:03:46 +01:00
{
2017-12-30 20:28:41 +01:00
CastSpellExtraArgs args ( volatileShielding );
args . AddSpellMod ( SPELLVALUE_BASE_POINT0 , CalculatePct ( absorbedAmount , volatileShielding -> GetAmount ()));
GetTarget () -> CastSpell ( nullptr , SPELL_DK_VOLATILE_SHIELDING_DAMAGE , args );
2010-12-30 02:03:46 +01:00
}
2021-03-05 23:23:56 +02:00
}
void Register () override
{
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dk_anti_magic_shell :: CalculateAmount , EFFECT_0 , SPELL_AURA_SCHOOL_ABSORB );
AfterEffectAbsorb += AuraEffectAbsorbFn ( spell_dk_anti_magic_shell :: Trigger , EFFECT_0 );
AfterEffectRemove += AuraEffectRemoveFn ( spell_dk_anti_magic_shell :: HandleEffectRemove , EFFECT_0 , SPELL_AURA_SCHOOL_ABSORB , AURA_EFFECT_HANDLE_REAL );
}
private :
int32 absorbPct ;
int32 maxHealth ;
uint32 absorbedAmount ;
2010-12-30 02:03:46 +01:00
};
2017-06-20 23:45:58 +02:00
static uint32 const ArmyTransforms []
2015-01-12 23:49:19 +00:00
{
SPELL_DK_ARMY_FLESH_BEAST_TRANSFORM ,
SPELL_DK_ARMY_GEIST_TRANSFORM ,
SPELL_DK_ARMY_NORTHREND_SKELETON_TRANSFORM ,
SPELL_DK_ARMY_SKELETON_TRANSFORM ,
SPELL_DK_ARMY_SPIKED_GHOUL_TRANSFORM ,
SPELL_DK_ARMY_SUPER_ZOMBIE_TRANSFORM
};
// 127517 - Army Transform
/// 6.x, does this belong here or in spell_generic? where do we cast this? sniffs say this is only cast when caster has glyph of foul menagerie.
2021-03-05 23:23:56 +02:00
class spell_dk_army_transform : public SpellScript
2010-12-30 02:03:46 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_army_transform );
2010-12-30 02:03:46 +01:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_GLYPH_OF_FOUL_MENAGERIE });
}
2010-12-30 02:03:46 +01:00
2021-03-05 23:23:56 +02:00
bool Load () override
{
return GetCaster () -> IsGuardian ();
}
2010-12-30 02:03:46 +01:00
2021-03-05 23:23:56 +02:00
SpellCastResult CheckCast ()
{
if ( Unit * owner = GetCaster () -> GetOwner ())
if ( owner -> HasAura ( SPELL_DK_GLYPH_OF_FOUL_MENAGERIE ))
return SPELL_CAST_OK ;
2010-12-30 02:03:46 +01:00
2021-03-05 23:23:56 +02:00
return SPELL_FAILED_SPELL_UNAVAILABLE ;
}
2011-01-22 17:21:24 +01:00
2021-03-05 23:23:56 +02:00
void HandleDummy ( SpellEffIndex /*effIndex*/ )
{
GetCaster () -> CastSpell ( GetCaster (), Trinity :: Containers :: SelectRandomContainerElement ( ArmyTransforms ), true );
}
2010-12-30 02:03:46 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnCheckCast += SpellCheckCastFn ( spell_dk_army_transform :: CheckCast );
OnEffectHitTarget += SpellEffectFn ( spell_dk_army_transform :: HandleDummy , EFFECT_0 , SPELL_EFFECT_DUMMY );
}
2010-12-30 02:03:46 +01:00
};
2015-01-12 23:49:19 +00:00
// 50842 - Blood Boil
2021-03-05 23:23:56 +02:00
class spell_dk_blood_boil : public SpellScript
2013-01-11 04:18:02 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_blood_boil );
2013-01-11 04:18:02 +01:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_BLOOD_PLAGUE });
}
2013-01-22 00:20:16 +01:00
2021-03-05 23:23:56 +02:00
void HandleEffect ()
{
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DK_BLOOD_PLAGUE , true );
}
2013-01-22 00:20:16 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnHit += SpellHitFn ( spell_dk_blood_boil :: HandleEffect );
}
2013-01-22 00:20:16 +01:00
};
2016-09-25 20:48:31 -03:00
// 49028 - Dancing Rune Weapon
/// 7.1.5
2021-03-05 23:23:56 +02:00
class spell_dk_dancing_rune_weapon : public AuraScript
2016-09-25 20:48:31 -03:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_dancing_rune_weapon );
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
if ( ! sObjectMgr -> GetCreatureTemplate ( NPC_DK_DANCING_RUNE_WEAPON ))
return false ;
return true ;
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
// This is a port of the old switch hack in Unit.cpp, it's not correct
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & eventInfo )
{
PreventDefaultAction ();
Unit * caster = GetCaster ();
if ( ! caster )
return ;
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
Unit * drw = nullptr ;
for ( Unit * controlled : caster -> m_Controlled )
{
if ( controlled -> GetEntry () == NPC_DK_DANCING_RUNE_WEAPON )
2016-09-25 20:48:31 -03:00
{
2021-03-05 23:23:56 +02:00
drw = controlled ;
break ;
2016-09-25 20:48:31 -03:00
}
2021-03-05 23:23:56 +02:00
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
if ( ! drw || ! drw -> GetVictim ())
return ;
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
SpellInfo const * spellInfo = eventInfo . GetSpellInfo ();
if ( ! spellInfo )
return ;
DamageInfo * damageInfo = eventInfo . GetDamageInfo ();
if ( ! damageInfo || ! damageInfo -> GetDamage ())
return ;
int32 amount = static_cast < int32 > ( damageInfo -> GetDamage ()) / 2 ;
SpellNonMeleeDamage log ( drw , drw -> GetVictim (), spellInfo , { spellInfo -> GetSpellXSpellVisualId ( drw ), 0 }, spellInfo -> GetSchoolMask ());
log . damage = amount ;
2018-01-13 06:45:21 -03:00
Unit :: DealDamage ( drw , drw -> GetVictim (), amount , nullptr , SPELL_DIRECT_DAMAGE , spellInfo -> GetSchoolMask (), spellInfo , true );
2021-03-05 23:23:56 +02:00
drw -> SendSpellNonMeleeDamageLog ( & log );
}
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dk_dancing_rune_weapon :: HandleProc , EFFECT_1 , SPELL_AURA_DUMMY );
}
2016-09-25 20:48:31 -03:00
};
2015-01-12 23:49:19 +00:00
// 43265 - Death and Decay
2021-03-05 23:23:56 +02:00
class spell_dk_death_and_decay : public SpellScript
2013-07-20 01:18:42 +02:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_death_and_decay );
2013-07-20 01:18:42 +02:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_TIGHTENING_GRASP , SPELL_DK_TIGHTENING_GRASP_SLOW });
}
2013-07-20 01:18:42 +02:00
2021-03-05 23:23:56 +02:00
void HandleDummy ()
{
if ( GetCaster () -> HasAura ( SPELL_DK_TIGHTENING_GRASP ))
if ( WorldLocation const * pos = GetExplTargetDest ())
2017-12-30 20:28:41 +01:00
GetCaster () -> CastSpell ( * pos , SPELL_DK_TIGHTENING_GRASP_SLOW , true );
2021-03-05 23:23:56 +02:00
}
2017-06-20 23:45:58 +02:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnCast += SpellCastFn ( spell_dk_death_and_decay :: HandleDummy );
}
};
2013-07-20 01:18:42 +02:00
2021-03-05 23:23:56 +02:00
// 43265 - Death and Decay (Aura)
class spell_dk_death_and_decay_AuraScript : public AuraScript
{
PrepareAuraScript ( spell_dk_death_and_decay_AuraScript );
2013-07-20 01:18:42 +02:00
2021-03-05 23:23:56 +02:00
void HandleDummyTick ( AuraEffect const * aurEff )
2013-07-20 01:18:42 +02:00
{
2021-03-05 23:23:56 +02:00
if ( Unit * caster = GetCaster ())
2017-12-30 20:28:41 +01:00
caster -> CastSpell ( GetTarget (), SPELL_DK_DEATH_AND_DECAY_DAMAGE , aurEff );
2013-07-20 01:18:42 +02:00
}
2014-07-24 16:14:25 +02:00
2021-03-05 23:23:56 +02:00
void Register () override
2014-07-24 16:14:25 +02:00
{
2021-03-05 23:23:56 +02:00
OnEffectPeriodic += AuraEffectPeriodicFn ( spell_dk_death_and_decay_AuraScript :: HandleDummyTick , EFFECT_2 , SPELL_AURA_PERIODIC_DUMMY );
2014-07-24 16:14:25 +02:00
}
2021-03-05 23:23:56 +02:00
};
2014-07-24 16:14:25 +02:00
2015-01-12 23:49:19 +00:00
// 47541 - Death Coil
2021-03-05 23:23:56 +02:00
class spell_dk_death_coil : public SpellScript
2011-05-06 22:08:43 -03:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_death_coil );
2011-05-06 22:08:43 -03:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spell*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_DEATH_COIL_DAMAGE , SPELL_DK_UNHOLY , SPELL_DK_UNHOLY_VIGOR });
}
2011-01-22 17:21:24 +01:00
2021-03-05 23:23:56 +02:00
void HandleDummy ( SpellEffIndex /*effIndex*/ )
{
Unit * caster = GetCaster ();
caster -> CastSpell ( GetHitUnit (), SPELL_DK_DEATH_COIL_DAMAGE , true );
if ( AuraEffect const * unholyAura = caster -> GetAuraEffect ( SPELL_DK_UNHOLY , EFFECT_6 )) // can be any effect, just here to send SPELL_FAILED_DONT_REPORT on failure
2017-12-30 20:28:41 +01:00
caster -> CastSpell ( caster , SPELL_DK_UNHOLY_VIGOR , unholyAura );
2021-03-05 23:23:56 +02:00
}
2011-01-22 17:21:24 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dk_death_coil :: HandleDummy , EFFECT_0 , SPELL_EFFECT_DUMMY );
}
2011-01-22 17:21:24 +01:00
};
2013-01-11 04:18:02 +01:00
// 52751 - Death Gate
2021-03-05 23:23:56 +02:00
class spell_dk_death_gate : public SpellScript
2011-03-04 23:53:11 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_death_gate );
2011-03-04 23:53:11 +01:00
2021-03-05 23:23:56 +02:00
SpellCastResult CheckClass ()
{
2019-07-01 21:36:32 +02:00
if ( GetCaster () -> GetClass () != CLASS_DEATH_KNIGHT )
2011-03-04 23:53:11 +01:00
{
2021-03-05 23:23:56 +02:00
SetCustomCastResultMessage ( SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT );
return SPELL_FAILED_CUSTOM_ERROR ;
}
2011-03-04 23:53:11 +01:00
2021-03-05 23:23:56 +02:00
return SPELL_CAST_OK ;
}
2011-03-04 23:53:11 +01:00
2021-03-05 23:23:56 +02:00
void HandleScript ( SpellEffIndex effIndex )
{
PreventHitDefaultEffect ( effIndex );
if ( Unit * target = GetHitUnit ())
target -> CastSpell ( target , GetEffectValue (), false );
}
2011-03-04 23:53:11 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnCheckCast += SpellCheckCastFn ( spell_dk_death_gate :: CheckClass );
OnEffectHitTarget += SpellEffectFn ( spell_dk_death_gate :: HandleScript , EFFECT_0 , SPELL_EFFECT_SCRIPT_EFFECT );
}
2011-03-04 23:53:11 +01:00
};
2017-06-20 23:45:58 +02:00
// 49576 - Death Grip Initial
2021-03-05 23:23:56 +02:00
class spell_dk_death_grip_initial : public SpellScript
2013-01-11 04:18:02 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_death_grip_initial );
2013-01-11 04:18:02 +01:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo (
2013-01-11 04:18:02 +01:00
{
2021-03-05 23:23:56 +02:00
SPELL_DK_DEATH_GRIP_DUMMY ,
SPELL_DK_DEATH_GRIP_JUMP ,
SPELL_DK_BLOOD ,
SPELL_DK_DEATH_GRIP_TAUNT
});
}
2017-06-20 23:45:58 +02:00
2021-03-05 23:23:56 +02:00
SpellCastResult CheckCast ()
{
Unit * caster = GetCaster ();
// Death Grip should not be castable while jumping/falling
if ( caster -> HasUnitState ( UNIT_STATE_JUMPING ) || caster -> HasUnitMovementFlag ( MOVEMENTFLAG_FALLING ))
return SPELL_FAILED_MOVING ;
2013-01-11 04:18:02 +01:00
2021-03-05 23:23:56 +02:00
return SPELL_CAST_OK ;
}
2017-06-20 23:45:58 +02:00
2021-03-05 23:23:56 +02:00
void HandleDummy ( SpellEffIndex /*effIndex*/ )
{
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DK_DEATH_GRIP_DUMMY , true );
GetHitUnit () -> CastSpell ( GetCaster (), SPELL_DK_DEATH_GRIP_JUMP , true );
if ( GetCaster () -> HasAura ( SPELL_DK_BLOOD ))
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DK_DEATH_GRIP_TAUNT , true );
}
2013-01-11 04:18:02 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnCheckCast += SpellCheckCastFn ( spell_dk_death_grip_initial :: CheckCast );
OnEffectHitTarget += SpellEffectFn ( spell_dk_death_grip_initial :: HandleDummy , EFFECT_0 , SPELL_EFFECT_SCRIPT_EFFECT );
}
2013-01-11 04:18:02 +01:00
};
// 48743 - Death Pact
2021-03-05 23:23:56 +02:00
class spell_dk_death_pact : public AuraScript
2011-01-22 17:21:24 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_death_pact );
2010-08-18 00:20:23 +06:00
2021-03-05 23:23:56 +02:00
void HandleCalcAmount ( AuraEffect const * /*aurEff*/ , int32 & amount , bool & /*canBeRecalculated*/ )
{
if ( Unit * caster = GetCaster ())
amount = int32 ( caster -> CountPctFromMaxHealth ( amount ));
}
2011-01-22 17:21:24 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dk_death_pact :: HandleCalcAmount , EFFECT_1 , SPELL_AURA_SCHOOL_HEAL_ABSORB );
}
2010-08-18 00:20:23 +06:00
};
2013-07-25 15:34:36 +02:00
// 49998 - Death Strike
2021-03-05 23:23:56 +02:00
class spell_dk_death_strike : public SpellScript
2010-08-18 00:20:23 +06:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_death_strike );
2010-08-18 00:20:23 +06:00
2021-03-15 23:53:30 +02:00
bool Validate ( SpellInfo const * spellInfo ) override
2021-03-05 23:23:56 +02:00
{
return ValidateSpellInfo (
{
2021-03-15 23:53:30 +02:00
SPELL_DK_DEATH_STRIKE_ENABLER ,
2021-03-05 23:23:56 +02:00
SPELL_DK_DEATH_STRIKE_HEAL ,
SPELL_DK_BLOOD_SHIELD_MASTERY ,
SPELL_DK_BLOOD_SHIELD_ABSORB ,
SPELL_DK_FROST ,
SPELL_DK_DEATH_STRIKE_OFFHAND
2021-03-15 23:53:30 +02:00
})
2021-09-04 15:13:15 +02:00
&& spellInfo -> GetEffects (). size () > EFFECT_2 ;
2021-03-05 23:23:56 +02:00
}
2011-01-22 17:21:24 +01:00
2021-03-15 23:53:30 +02:00
void HandleDummy ( SpellEffIndex /*effIndex*/ )
2021-03-05 23:23:56 +02:00
{
Unit * caster = GetCaster ();
2013-07-23 14:55:05 +02:00
2021-03-15 23:53:30 +02:00
if ( AuraEffect * enabler = caster -> GetAuraEffect ( SPELL_DK_DEATH_STRIKE_ENABLER , EFFECT_0 , GetCaster () -> GetGUID ()))
{
// Heals you for 25% of all damage taken in the last 5 sec,
2021-09-04 15:13:15 +02:00
int32 heal = CalculatePct ( enabler -> CalculateAmount ( GetCaster ()), GetEffectInfo ( EFFECT_1 ). CalcValue ( GetCaster ()));
2021-03-15 23:53:30 +02:00
// minimum 7.0% of maximum health.
2021-09-04 15:13:15 +02:00
int32 pctOfMaxHealth = CalculatePct ( GetEffectInfo ( EFFECT_2 ). CalcValue ( GetCaster ()), caster -> GetMaxHealth ());
2021-03-15 23:53:30 +02:00
heal = std :: max ( heal , pctOfMaxHealth );
2017-12-30 20:28:41 +01:00
caster -> CastSpell ( caster , SPELL_DK_DEATH_STRIKE_HEAL , CastSpellExtraArgs ( TRIGGERED_FULL_MASK ). AddSpellMod ( SPELLVALUE_BASE_POINT0 , heal ));
2017-06-20 23:45:58 +02:00
2021-03-15 23:53:30 +02:00
if ( AuraEffect const * aurEff = caster -> GetAuraEffect ( SPELL_DK_BLOOD_SHIELD_MASTERY , EFFECT_0 ))
2017-12-30 20:28:41 +01:00
caster -> CastSpell ( caster , SPELL_DK_BLOOD_SHIELD_ABSORB , CastSpellExtraArgs ( TRIGGERED_FULL_MASK ). AddSpellMod ( SPELLVALUE_BASE_POINT0 , CalculatePct ( heal , aurEff -> GetAmount ())));
2021-03-15 23:53:30 +02:00
if ( caster -> HasAura ( SPELL_DK_FROST ))
caster -> CastSpell ( GetHitUnit (), SPELL_DK_DEATH_STRIKE_OFFHAND , true );
}
2021-03-05 23:23:56 +02:00
}
2010-08-18 00:20:23 +06:00
2021-03-05 23:23:56 +02:00
void TriggerRecentlyUsedDeathStrike ()
{
GetCaster () -> CastSpell ( GetCaster (), SPELL_DK_RECENTLY_USED_DEATH_STRIKE , true );
}
2011-01-22 17:21:24 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
2021-03-15 23:53:30 +02:00
OnEffectLaunch += SpellEffectFn ( spell_dk_death_strike :: HandleDummy , EFFECT_1 , SPELL_EFFECT_DUMMY );
2021-03-05 23:23:56 +02:00
AfterCast += SpellCastFn ( spell_dk_death_strike :: TriggerRecentlyUsedDeathStrike );
}
2010-08-18 00:20:23 +06:00
};
2021-03-15 23:53:30 +02:00
// 89832 - Death Strike Enabler - SPELL_DK_DEATH_STRIKE_ENABLER
class spell_dk_death_strike_enabler : public AuraScript
{
PrepareAuraScript ( spell_dk_death_strike_enabler );
// Amount of seconds we calculate damage over
constexpr static uint8 LAST_SECONDS = 5 ;
bool CheckProc ( ProcEventInfo & eventInfo )
{
return eventInfo . GetDamageInfo () != nullptr ;
}
void Update ( AuraEffect * /*aurEff*/ )
{
// Move backwards all datas by one from [23][0][0][0][0] -> [0][23][0][0][0]
std :: move_backward ( _damagePerSecond . begin (), std :: next ( _damagePerSecond . begin (), LAST_SECONDS - 1 ), _damagePerSecond . end ());
_damagePerSecond [ 0 ] = 0 ;
}
void HandleCalcAmount ( AuraEffect const * /*aurEff*/ , int32 & amount , bool & canBeRecalculated )
{
canBeRecalculated = true ;
amount = int32 ( std :: accumulate ( _damagePerSecond . begin (), _damagePerSecond . end (), 0u ));
}
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & eventInfo )
{
_damagePerSecond [ 0 ] += eventInfo . GetDamageInfo () -> GetDamage ();
}
void Register () override
{
DoCheckProc += AuraCheckProcFn ( spell_dk_death_strike_enabler :: CheckProc );
OnEffectProc += AuraEffectProcFn ( spell_dk_death_strike_enabler :: HandleProc , EFFECT_0 , SPELL_AURA_PERIODIC_DUMMY );
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dk_death_strike_enabler :: HandleCalcAmount , EFFECT_0 , SPELL_AURA_PERIODIC_DUMMY );
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn ( spell_dk_death_strike_enabler :: Update , EFFECT_0 , SPELL_AURA_PERIODIC_DUMMY );
}
private :
std :: array < uint32 , LAST_SECONDS > _damagePerSecond = { };
};
2015-01-12 23:49:19 +00:00
// 85948 - Festering Strike
2021-03-05 23:23:56 +02:00
class spell_dk_festering_strike : public SpellScript
2021-03-15 23:53:30 +02:00
{
PrepareSpellScript ( spell_dk_festering_strike );
2013-07-23 14:55:05 +02:00
2021-03-15 23:53:30 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_FESTERING_WOUND });
}
2013-07-23 14:55:05 +02:00
2021-03-15 23:53:30 +02:00
void HandleScriptEffect ( SpellEffIndex /*effIndex*/ )
{
2017-12-30 20:28:41 +01:00
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DK_FESTERING_WOUND , CastSpellExtraArgs ( TRIGGERED_FULL_MASK ). AddSpellMod ( SPELLVALUE_AURA_STACK , GetEffectValue ()));
2021-03-15 23:53:30 +02:00
}
2013-07-23 14:55:05 +02:00
2021-03-15 23:53:30 +02:00
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dk_festering_strike :: HandleScriptEffect , EFFECT_2 , SPELL_EFFECT_DUMMY );
}
};
2013-07-23 16:28:23 +02:00
2013-01-11 04:18:02 +01:00
// 47496 - Explode, Ghoul spell for Corpse Explosion
2021-03-05 23:23:56 +02:00
class spell_dk_ghoul_explode : public SpellScript
2010-12-27 20:14:54 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_ghoul_explode );
2015-01-28 21:58:08 +01:00
2021-09-04 15:13:15 +02:00
bool Validate ( SpellInfo const * spellInfo ) override
2021-03-05 23:23:56 +02:00
{
2021-09-04 15:13:15 +02:00
return ValidateSpellInfo ({ SPELL_DK_CORPSE_EXPLOSION_TRIGGERED }) && spellInfo -> GetEffects (). size () > EFFECT_2 ;
2021-03-05 23:23:56 +02:00
}
2010-12-27 20:14:54 +01:00
2021-03-05 23:23:56 +02:00
void HandleDamage ( SpellEffIndex /*effIndex*/ )
{
2021-09-04 15:13:15 +02:00
SetHitDamage ( GetCaster () -> CountPctFromMaxHealth ( GetEffectInfo ( EFFECT_2 ). CalcValue ( GetCaster ())));
2021-03-05 23:23:56 +02:00
}
2011-01-22 17:21:24 +01:00
2021-03-05 23:23:56 +02:00
void Suicide ( SpellEffIndex /*effIndex*/ )
{
if ( Unit * unitTarget = GetHitUnit ())
2010-12-27 20:14:54 +01:00
{
2021-03-05 23:23:56 +02:00
// Corpse Explosion (Suicide)
unitTarget -> CastSpell ( unitTarget , SPELL_DK_CORPSE_EXPLOSION_TRIGGERED , true );
2010-12-27 20:14:54 +01:00
}
2021-03-05 23:23:56 +02:00
}
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dk_ghoul_explode :: HandleDamage , EFFECT_0 , SPELL_EFFECT_SCHOOL_DAMAGE );
OnEffectHitTarget += SpellEffectFn ( spell_dk_ghoul_explode :: Suicide , EFFECT_1 , SPELL_EFFECT_SCHOOL_DAMAGE );
}
2010-12-27 20:14:54 +01:00
};
2019-04-16 07:49:39 +00:00
// 69961 - Glyph of Scourge Strike
class spell_dk_glyph_of_scourge_strike_script : public SpellScript
{
PrepareSpellScript ( spell_dk_glyph_of_scourge_strike_script );
void HandleScriptEffect ( SpellEffIndex /*effIndex*/ )
{
Unit * caster = GetCaster ();
Unit * target = GetHitUnit ();
Unit :: AuraEffectList const & mPeriodic = target -> GetAuraEffectsByType ( SPELL_AURA_PERIODIC_DAMAGE );
for ( Unit :: AuraEffectList :: const_iterator i = mPeriodic . begin (); i != mPeriodic . end (); ++ i )
{
AuraEffect const * aurEff = * i ;
SpellInfo const * spellInfo = aurEff -> GetSpellInfo ();
// search our Blood Plague and Frost Fever on target
if ( spellInfo -> SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && spellInfo -> SpellFamilyFlags [ 2 ] & 0x2 &&
aurEff -> GetCasterGUID () == caster -> GetGUID ())
{
uint32 countMin = aurEff -> GetBase () -> GetMaxDuration ();
uint32 countMax = spellInfo -> GetMaxDuration ();
// this Glyph
countMax += 9000 ;
if ( countMin < countMax )
{
aurEff -> GetBase () -> SetDuration ( aurEff -> GetBase () -> GetDuration () + 3000 );
aurEff -> GetBase () -> SetMaxDuration ( countMin + 3000 );
}
}
}
}
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dk_glyph_of_scourge_strike_script :: HandleScriptEffect , EFFECT_0 , SPELL_EFFECT_SCRIPT_EFFECT );
}
};
2023-01-26 18:38:10 +01:00
// 49184 - Howling Blast
class spell_dk_howling_blast : public SpellScript
{
PrepareSpellScript ( spell_dk_howling_blast );
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_FROST_FEVER });
}
void HandleFrostFever ( SpellEffIndex /*effIndex*/ )
{
GetCaster () -> CastSpell ( GetHitUnit (), SPELL_DK_FROST_FEVER );
}
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dk_howling_blast :: HandleFrostFever , EFFECT_0 , SPELL_EFFECT_SCHOOL_DAMAGE );
}
};
2016-09-25 20:48:31 -03:00
// 206940 - Mark of Blood
2021-03-05 23:23:56 +02:00
class spell_dk_mark_of_blood : public AuraScript
2016-09-25 20:48:31 -03:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_mark_of_blood );
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_MARK_OF_BLOOD_HEAL });
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & eventInfo )
{
PreventDefaultAction ();
if ( Unit * caster = GetCaster ())
caster -> CastSpell ( eventInfo . GetProcTarget (), SPELL_DK_MARK_OF_BLOOD_HEAL , true );
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dk_mark_of_blood :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
2016-09-25 20:48:31 -03:00
};
// 207346 - Necrosis
2021-03-05 23:23:56 +02:00
class spell_dk_necrosis : public AuraScript
2016-09-25 20:48:31 -03:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_necrosis );
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_NECROSIS_EFFECT });
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & eventInfo )
{
PreventDefaultAction ();
GetTarget () -> CastSpell ( eventInfo . GetProcTarget (), SPELL_DK_NECROSIS_EFFECT , true );
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnEffectProc += AuraEffectProcFn ( spell_dk_necrosis :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
2016-09-25 20:48:31 -03:00
};
2015-01-12 23:49:19 +00:00
// 121916 - Glyph of the Geist (Unholy)
/// 6.x, does this belong here or in spell_generic? apply this in creature_template_addon? sniffs say this is always cast on raise dead.
2021-03-05 23:23:56 +02:00
class spell_dk_pet_geist_transform : public SpellScript
2014-06-11 19:59:50 +02:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_pet_geist_transform );
2017-06-20 23:45:58 +02:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_GLYPH_OF_THE_GEIST });
}
2014-06-11 19:59:50 +02:00
2021-03-05 23:23:56 +02:00
bool Load () override
{
return GetCaster () -> IsPet ();
}
2014-06-11 19:59:50 +02:00
2021-03-05 23:23:56 +02:00
SpellCastResult CheckCast ()
{
if ( Unit * owner = GetCaster () -> GetOwner ())
if ( owner -> HasAura ( SPELL_DK_GLYPH_OF_THE_GEIST ))
return SPELL_CAST_OK ;
2014-06-11 19:59:50 +02:00
2021-03-05 23:23:56 +02:00
return SPELL_FAILED_SPELL_UNAVAILABLE ;
}
2014-06-11 19:59:50 +02:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnCheckCast += SpellCheckCastFn ( spell_dk_pet_geist_transform :: CheckCast );
}
2014-06-11 19:59:50 +02:00
};
2015-01-12 23:49:19 +00:00
// 147157 Glyph of the Skeleton (Unholy)
/// 6.x, does this belong here or in spell_generic? apply this in creature_template_addon? sniffs say this is always cast on raise dead.
2021-03-05 23:23:56 +02:00
class spell_dk_pet_skeleton_transform : public SpellScript
2013-07-25 18:06:21 +02:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_pet_skeleton_transform );
2013-07-25 18:06:21 +02:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_GLYPH_OF_THE_SKELETON });
}
2013-07-25 18:06:21 +02:00
2021-03-05 23:23:56 +02:00
SpellCastResult CheckCast ()
{
if ( Unit * owner = GetCaster () -> GetOwner ())
if ( owner -> HasAura ( SPELL_DK_GLYPH_OF_THE_SKELETON ))
return SPELL_CAST_OK ;
2013-07-25 18:06:21 +02:00
2021-03-05 23:23:56 +02:00
return SPELL_FAILED_SPELL_UNAVAILABLE ;
}
2013-07-25 18:06:21 +02:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnCheckCast += SpellCheckCastFn ( spell_dk_pet_skeleton_transform :: CheckCast );
}
2014-01-30 02:40:12 +01:00
};
2016-09-25 20:48:31 -03:00
// 61257 - Runic Power Back on Snare/Root
/// 7.1.5
2021-03-05 23:23:56 +02:00
class spell_dk_pvp_4p_bonus : public AuraScript
2016-09-25 20:48:31 -03:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_pvp_4p_bonus );
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_RUNIC_RETURN });
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
bool CheckProc ( ProcEventInfo & eventInfo )
{
SpellInfo const * spellInfo = eventInfo . GetSpellInfo ();
if ( ! spellInfo )
return false ;
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
return ( spellInfo -> GetAllEffectsMechanicMask () & (( 1 << MECHANIC_ROOT ) | ( 1 << MECHANIC_SNARE ))) != 0 ;
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
void HandleProc ( AuraEffect * /*aurEff*/ , ProcEventInfo & eventInfo )
{
PreventDefaultAction ();
eventInfo . GetActionTarget () -> CastSpell ( nullptr , SPELL_DK_RUNIC_RETURN , true );
}
2016-09-25 20:48:31 -03:00
2021-03-05 23:23:56 +02:00
void Register () override
{
DoCheckProc += AuraCheckProcFn ( spell_dk_pvp_4p_bonus :: CheckProc );
OnEffectProc += AuraEffectProcFn ( spell_dk_pvp_4p_bonus :: HandleProc , EFFECT_0 , SPELL_AURA_DUMMY );
}
2016-09-25 20:48:31 -03:00
};
2014-01-30 02:40:12 +01:00
// 46584 - Raise Dead
2021-03-05 23:23:56 +02:00
class spell_dk_raise_dead : public SpellScript
2014-01-30 02:40:12 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareSpellScript ( spell_dk_raise_dead );
2014-01-30 02:40:12 +01:00
2021-03-05 23:23:56 +02:00
bool Validate ( SpellInfo const * /*spellInfo*/ ) override
{
return ValidateSpellInfo ({ SPELL_DK_RAISE_DEAD_SUMMON , SPELL_DK_SLUDGE_BELCHER , SPELL_DK_SLUDGE_BELCHER_SUMMON });
}
2017-06-20 23:45:58 +02:00
2021-03-05 23:23:56 +02:00
void HandleDummy ( SpellEffIndex /*effIndex*/ )
{
uint32 spellId = SPELL_DK_RAISE_DEAD_SUMMON ;
if ( GetCaster () -> HasAura ( SPELL_DK_SLUDGE_BELCHER ))
spellId = SPELL_DK_SLUDGE_BELCHER_SUMMON ;
2014-01-30 02:40:12 +01:00
2021-03-05 23:23:56 +02:00
GetCaster () -> CastSpell ( nullptr , spellId , true );
}
2014-01-30 02:40:12 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
OnEffectHitTarget += SpellEffectFn ( spell_dk_raise_dead :: HandleDummy , EFFECT_0 , SPELL_EFFECT_DUMMY );
}
2014-01-30 02:40:12 +01:00
};
2022-10-07 20:56:46 +02:00
// 59057 - Rime
class spell_dk_rime : public AuraScript
{
PrepareAuraScript ( spell_dk_rime );
bool Validate ( SpellInfo const * spellInfo ) override
{
return spellInfo -> GetEffects (). size () > EFFECT_1 && ValidateSpellInfo ({ SPELL_DK_FROST_SCYTHE });
}
bool CheckProc ( AuraEffect const * /*aurEff*/ , ProcEventInfo & eventInfo )
{
float chance = static_cast < float > ( GetSpellInfo () -> GetEffect ( EFFECT_1 ). CalcValue ( GetTarget ()));
if ( eventInfo . GetSpellInfo () -> Id == SPELL_DK_FROST_SCYTHE )
chance /= 2.f ;
return roll_chance_f ( chance );
}
void Register () override
{
DoCheckEffectProc += AuraCheckEffectProcFn ( spell_dk_rime :: CheckProc , EFFECT_0 , SPELL_AURA_PROC_TRIGGER_SPELL );
}
};
2013-01-20 04:30:17 +01:00
// 55233 - Vampiric Blood
2021-03-05 23:23:56 +02:00
class spell_dk_vampiric_blood : public AuraScript
2013-01-20 04:30:17 +01:00
{
2021-03-05 23:23:56 +02:00
PrepareAuraScript ( spell_dk_vampiric_blood );
2013-01-20 04:30:17 +01:00
2021-03-05 23:23:56 +02:00
void CalculateAmount ( AuraEffect const * /*aurEff*/ , int32 & amount , bool & /*canBeRecalculated*/ )
{
amount = GetUnitOwner () -> CountPctFromMaxHealth ( amount );
}
2013-01-20 04:30:17 +01:00
2021-03-05 23:23:56 +02:00
void Register () override
{
DoEffectCalcAmount += AuraEffectCalcAmountFn ( spell_dk_vampiric_blood :: CalculateAmount , EFFECT_1 , SPELL_AURA_MOD_INCREASE_HEALTH_2 );
}
2013-01-20 04:30:17 +01:00
};
2010-08-18 00:20:23 +06:00
void AddSC_deathknight_spell_scripts ()
{
2020-08-20 16:03:47 +02:00
RegisterSpellScript ( spell_dk_advantage_t10_4p );
RegisterSpellScript ( spell_dk_anti_magic_shell );
2021-03-05 23:23:56 +02:00
RegisterSpellScript ( spell_dk_army_transform );
RegisterSpellScript ( spell_dk_blood_boil );
2020-08-20 16:03:47 +02:00
RegisterSpellScript ( spell_dk_dancing_rune_weapon );
2021-03-05 23:23:56 +02:00
RegisterSpellAndAuraScriptPair ( spell_dk_death_and_decay , spell_dk_death_and_decay_AuraScript );
RegisterSpellScript ( spell_dk_death_coil );
RegisterSpellScript ( spell_dk_death_gate );
RegisterSpellScript ( spell_dk_death_grip_initial );
2020-08-20 16:03:47 +02:00
RegisterSpellScript ( spell_dk_death_pact );
2021-03-05 23:23:56 +02:00
RegisterSpellScript ( spell_dk_death_strike );
2020-08-20 16:03:47 +02:00
RegisterSpellScript ( spell_dk_death_strike_enabler );
2021-03-05 23:23:56 +02:00
RegisterSpellScript ( spell_dk_festering_strike );
RegisterSpellScript ( spell_dk_ghoul_explode );
2019-04-16 07:49:39 +00:00
RegisterSpellScript ( spell_dk_glyph_of_scourge_strike_script );
2023-01-26 18:38:10 +01:00
RegisterSpellScript ( spell_dk_howling_blast );
2020-08-20 16:03:47 +02:00
RegisterSpellScript ( spell_dk_mark_of_blood );
RegisterSpellScript ( spell_dk_necrosis );
2021-03-05 23:23:56 +02:00
RegisterSpellScript ( spell_dk_pet_geist_transform );
RegisterSpellScript ( spell_dk_pet_skeleton_transform );
2020-08-20 16:03:47 +02:00
RegisterSpellScript ( spell_dk_pvp_4p_bonus );
2021-03-05 23:23:56 +02:00
RegisterSpellScript ( spell_dk_raise_dead );
2022-10-07 20:56:46 +02:00
RegisterSpellScript ( spell_dk_rime );
2020-08-20 16:03:47 +02:00
RegisterSpellScript ( spell_dk_vampiric_blood );
2010-08-06 19:46:02 +02:00
}