aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2024-06-06 21:16:06 +0200
committerOvahlord <dreadkiller@gmx.de>2024-06-06 21:16:06 +0200
commit04a0d57f2bbacc09440468f6553017ddbed8d25e (patch)
tree35c5faedadc963b11ab83cc0d35cc5b4a2a99f4c /src
parent59501586ce6379aff1bbb6f408b4ac86771c2129 (diff)
Scripts/Spells: wiped all class spell scripts
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp950
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp2109
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp808
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp1534
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp1578
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp3231
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp1041
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp1943
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp1036
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp822
10 files changed, 0 insertions, 15052 deletions
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 077f574a5ee..778a7f54772 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -21,958 +21,8 @@
* Scriptnames of files in this file should be prefixed with "spell_dk_".
*/
-#include "AreaTrigger.h"
-#include "AreaTriggerAI.h"
#include "ScriptMgr.h"
-#include "Containers.h"
-#include "ObjectMgr.h"
-#include "Player.h"
-#include "Spell.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-#include <numeric>
-
-enum DeathKnightSpells
-{
- 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,
- SPELL_DK_BLINDING_SLEET_SLOW = 317898,
- SPELL_DK_BLOOD = 137008,
- SPELL_DK_BLOOD_PLAGUE = 55078,
- SPELL_DK_BLOOD_SHIELD_ABSORB = 77535,
- SPELL_DK_BLOOD_SHIELD_MASTERY = 77513,
- SPELL_DK_BREATH_OF_SINDRAGOSA = 152279,
- SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999,
- SPELL_DK_DEATH_AND_DECAY_DAMAGE = 52212,
- SPELL_DK_DEATH_COIL_DAMAGE = 47632,
- SPELL_DK_DEATH_GRIP_DUMMY = 243912,
- SPELL_DK_DEATH_GRIP_JUMP = 49575,
- SPELL_DK_DEATH_GRIP_TAUNT = 51399,
- SPELL_DK_DEATH_STRIKE_HEAL = 45470,
- SPELL_DK_DEATH_STRIKE_OFFHAND = 66188,
- SPELL_DK_FESTERING_WOUND = 194310,
- SPELL_DK_FROST = 137006,
- SPELL_DK_FROST_FEVER = 55095,
- SPELL_DK_FROST_SCYTHE = 207230,
- SPELL_DK_FROST_SHIELD = 207203,
- SPELL_DK_GLYPH_OF_FOUL_MENAGERIE = 58642,
- SPELL_DK_GLYPH_OF_THE_GEIST = 58640,
- SPELL_DK_GLYPH_OF_THE_SKELETON = 146652,
- SPELL_DK_KILLING_MACHINE_PROC = 51124,
- SPELL_DK_MARK_OF_BLOOD_HEAL = 206945,
- SPELL_DK_NECROSIS_EFFECT = 216974,
- SPELL_DK_OBLITERATION = 281238,
- SPELL_DK_OBLITERATION_RUNE_ENERGIZE = 281327,
- SPELL_DK_PILLAR_OF_FROST = 51271,
- SPELL_DK_RAISE_DEAD_SUMMON = 52150,
- SPELL_DK_RECENTLY_USED_DEATH_STRIKE = 180612,
- SPELL_DK_RUNIC_POWER_ENERGIZE = 49088,
- SPELL_DK_RUNIC_RETURN = 61258,
- SPELL_DK_SLUDGE_BELCHER = 207313,
- SPELL_DK_SLUDGE_BELCHER_SUMMON = 212027,
- SPELL_DK_DEATH_STRIKE_ENABLER = 89832, // Server Side
- SPELL_DK_TIGHTENING_GRASP = 206970,
- //SPELL_DK_TIGHTENING_GRASP_SLOW = 143375, // dropped in BfA
- SPELL_DK_UNHOLY = 137007,
- SPELL_DK_UNHOLY_GROUND_HASTE = 374271,
- SPELL_DK_UNHOLY_GROUND_TALENT = 374265,
- SPELL_DK_UNHOLY_VIGOR = 196263,
- SPELL_DK_VOLATILE_SHIELDING = 207188,
- SPELL_DK_VOLATILE_SHIELDING_DAMAGE = 207194
-};
-
-enum Misc
-{
- NPC_DK_DANCING_RUNE_WEAPON = 27893
-};
-
-// 70656 - Advantage (T10 4P Melee Bonus)
-class spell_dk_advantage_t10_4p : public AuraScript
-{
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (Unit* caster = eventInfo.GetActor())
- {
- Player* player = caster->ToPlayer();
- if (!player || caster->GetClass() != CLASS_DEATH_KNIGHT)
- return false;
-
- for (uint8 i = 0; i < player->GetMaxPower(POWER_RUNES); ++i)
- if (player->GetRuneCooldown(i) == 0)
- return false;
-
- return true;
- }
-
- return false;
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_dk_advantage_t10_4p::CheckProc);
- }
-};
-
-// 48707 - Anti-Magic Shell
-class spell_dk_anti_magic_shell : public AuraScript
-{
-public:
- spell_dk_anti_magic_shell()
- {
- absorbPct = 0;
- maxHealth = 0;
- absorbedAmount = 0;
- }
-
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_DK_RUNIC_POWER_ENERGIZE, SPELL_DK_VOLATILE_SHIELDING })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- bool Load() override
- {
- absorbPct = GetEffectInfo(EFFECT_1).CalcValue(GetCaster());
- maxHealth = GetCaster()->GetMaxHealth();
- absorbedAmount = 0;
- return true;
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- amount = CalculatePct(maxHealth, absorbPct);
-
- if (Player const* player = GetUnitOwner()->ToPlayer())
- AddPct(amount, player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) + player->GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY));
- }
-
- void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
- {
- absorbedAmount += absorbAmount;
-
- if (!GetTarget()->HasAura(SPELL_DK_VOLATILE_SHIELDING))
- {
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(absorbAmount, 2 * absorbAmount * 100 / maxHealth));
- GetTarget()->CastSpell(GetTarget(), SPELL_DK_RUNIC_POWER_ENERGIZE, args);
- }
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (AuraEffect const* volatileShielding = GetTarget()->GetAuraEffect(SPELL_DK_VOLATILE_SHIELDING, EFFECT_1))
- {
- CastSpellExtraArgs args(volatileShielding);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(absorbedAmount, volatileShielding->GetAmount()));
- GetTarget()->CastSpell(nullptr, SPELL_DK_VOLATILE_SHIELDING_DAMAGE, args);
- }
- }
-
- 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;
-};
-
-static uint32 const ArmyTransforms[]
-{
- 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.
-class spell_dk_army_transform : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_GLYPH_OF_FOUL_MENAGERIE });
- }
-
- bool Load() override
- {
- return GetCaster()->IsGuardian();
- }
-
- SpellCastResult CheckCast()
- {
- if (Unit* owner = GetCaster()->GetOwner())
- if (owner->HasAura(SPELL_DK_GLYPH_OF_FOUL_MENAGERIE))
- return SPELL_CAST_OK;
-
- return SPELL_FAILED_SPELL_UNAVAILABLE;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetCaster(), Trinity::Containers::SelectRandomContainerElement(ArmyTransforms), true);
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_dk_army_transform::CheckCast);
- OnEffectHitTarget += SpellEffectFn(spell_dk_army_transform::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 207167 - Blinding Sleet
-class spell_dk_blinding_sleet : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_BLINDING_SLEET_SLOW });
- }
-
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
- GetTarget()->CastSpell(GetTarget(), SPELL_DK_BLINDING_SLEET_SLOW, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_dk_blinding_sleet::HandleOnRemove, EFFECT_0, SPELL_AURA_MOD_CONFUSE, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 50842 - Blood Boil
-class spell_dk_blood_boil : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_BLOOD_PLAGUE });
- }
-
- void HandleEffect()
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_DK_BLOOD_PLAGUE, true);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_dk_blood_boil::HandleEffect);
- }
-};
-
-// 49028 - Dancing Rune Weapon
-/// 7.1.5
-class spell_dk_dancing_rune_weapon : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sObjectMgr->GetCreatureTemplate(NPC_DK_DANCING_RUNE_WEAPON))
- return false;
- return true;
- }
-
- // 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;
-
- Unit* drw = nullptr;
- for (Unit* controlled : caster->m_Controlled)
- {
- if (controlled->GetEntry() == NPC_DK_DANCING_RUNE_WEAPON)
- {
- drw = controlled;
- break;
- }
- }
-
- if (!drw || !drw->GetVictim())
- return;
-
- 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) }, spellInfo->GetSchoolMask());
- log.damage = amount;
- Unit::DealDamage(drw, drw->GetVictim(), amount, nullptr, SPELL_DIRECT_DAMAGE, spellInfo->GetSchoolMask(), spellInfo, true);
- drw->SendSpellNonMeleeDamageLog(&log);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dk_dancing_rune_weapon::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 43265 - Death and Decay (Aura)
-class spell_dk_death_and_decay : public AuraScript
-{
- void HandleDummyTick(AuraEffect const* aurEff)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget(), SPELL_DK_DEATH_AND_DECAY_DAMAGE, aurEff);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_death_and_decay::HandleDummyTick, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 47541 - Death Coil
-class spell_dk_death_coil : public SpellScript
-{
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_DEATH_COIL_DAMAGE, SPELL_DK_UNHOLY, SPELL_DK_UNHOLY_VIGOR });
- }
-
- 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
- caster->CastSpell(caster, SPELL_DK_UNHOLY_VIGOR, unholyAura);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 52751 - Death Gate
-class spell_dk_death_gate : public SpellScript
-{
- SpellCastResult CheckClass()
- {
- if (GetCaster()->GetClass() != CLASS_DEATH_KNIGHT)
- {
- SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_BE_DEATH_KNIGHT);
- return SPELL_FAILED_CUSTOM_ERROR;
- }
-
- return SPELL_CAST_OK;
- }
-
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- if (Unit* target = GetHitUnit())
- target->CastSpell(target, GetEffectValue(), false);
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_dk_death_gate::CheckClass);
- OnEffectHitTarget += SpellEffectFn(spell_dk_death_gate::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-// 49576 - Death Grip Initial
-class spell_dk_death_grip_initial : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_DK_DEATH_GRIP_DUMMY,
- SPELL_DK_DEATH_GRIP_JUMP,
- SPELL_DK_BLOOD,
- SPELL_DK_DEATH_GRIP_TAUNT
- });
- }
-
- 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;
-
- return SPELL_CAST_OK;
- }
-
- 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);
- }
-
- 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);
- }
-};
-
-// 48743 - Death Pact
-class spell_dk_death_pact : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
- }
-
- void HandleCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- if (Unit* caster = GetCaster())
- amount = int32(caster->CountPctFromMaxHealth(GetEffectInfo(EFFECT_2).CalcValue(caster)));
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_death_pact::HandleCalcAmount, EFFECT_1, SPELL_AURA_SCHOOL_HEAL_ABSORB);
- }
-};
-
-// 49998 - Death Strike
-class spell_dk_death_strike : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo(
- {
- SPELL_DK_DEATH_STRIKE_ENABLER,
- SPELL_DK_DEATH_STRIKE_HEAL,
- SPELL_DK_BLOOD_SHIELD_MASTERY,
- SPELL_DK_BLOOD_SHIELD_ABSORB,
- SPELL_DK_FROST,
- SPELL_DK_DEATH_STRIKE_OFFHAND
- })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
-
- 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,
- int32 heal = CalculatePct(enabler->CalculateAmount(GetCaster()), GetEffectInfo(EFFECT_1).CalcValue(GetCaster()));
- // minimum 7.0% of maximum health.
- int32 pctOfMaxHealth = CalculatePct(GetEffectInfo(EFFECT_2).CalcValue(GetCaster()), caster->GetMaxHealth());
- heal = std::max(heal, pctOfMaxHealth);
-
- caster->CastSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, heal));
-
- if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_BLOOD_SHIELD_MASTERY, EFFECT_0))
- caster->CastSpell(caster, SPELL_DK_BLOOD_SHIELD_ABSORB, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(heal, aurEff->GetAmount())));
-
- if (caster->HasAura(SPELL_DK_FROST))
- caster->CastSpell(GetHitUnit(), SPELL_DK_DEATH_STRIKE_OFFHAND, true);
- }
- }
-
- void TriggerRecentlyUsedDeathStrike()
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_DK_RECENTLY_USED_DEATH_STRIKE, true);
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_dk_death_strike::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
- AfterCast += SpellCastFn(spell_dk_death_strike::TriggerRecentlyUsedDeathStrike);
- }
-};
-
-// 89832 - Death Strike Enabler - SPELL_DK_DEATH_STRIKE_ENABLER
-class spell_dk_death_strike_enabler : public AuraScript
-{
- // 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 = { };
-};
-
-// 85948 - Festering Strike
-class spell_dk_festering_strike : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_FESTERING_WOUND });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_DK_FESTERING_WOUND, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, GetEffectValue()));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_dk_festering_strike::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 47496 - Explode, Ghoul spell for Corpse Explosion
-class spell_dk_ghoul_explode : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_DK_CORPSE_EXPLOSION_TRIGGERED }) && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
- }
-
- void HandleDamage(SpellEffIndex /*effIndex*/)
- {
- SetHitDamage(GetCaster()->CountPctFromMaxHealth(GetEffectInfo(EFFECT_2).CalcValue(GetCaster())));
- }
-
- void Suicide(SpellEffIndex /*effIndex*/)
- {
- if (Unit* unitTarget = GetHitUnit())
- {
- // Corpse Explosion (Suicide)
- unitTarget->CastSpell(unitTarget, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED, true);
- }
- }
-
- 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);
- }
-};
-
-// 69961 - Glyph of Scourge Strike
-class spell_dk_glyph_of_scourge_strike_script : public SpellScript
-{
- 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);
- }
-};
-
-// 49184 - Howling Blast
-class spell_dk_howling_blast : public SpellScript
-{
- 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);
- }
-};
-
-// 206940 - Mark of Blood
-class spell_dk_mark_of_blood : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_MARK_OF_BLOOD_HEAL });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- if (Unit* caster = GetCaster())
- caster->CastSpell(eventInfo.GetProcTarget(), SPELL_DK_MARK_OF_BLOOD_HEAL, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dk_mark_of_blood::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 207346 - Necrosis
-class spell_dk_necrosis : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_NECROSIS_EFFECT });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_DK_NECROSIS_EFFECT, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dk_necrosis::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 207256 - Obliteration
-class spell_dk_obliteration : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_OBLITERATION, SPELL_DK_OBLITERATION_RUNE_ENERGIZE, SPELL_DK_KILLING_MACHINE_PROC })
- && ValidateSpellEffect({ { SPELL_DK_OBLITERATION, EFFECT_1 } });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- Unit* target = GetTarget();
- target->CastSpell(target, SPELL_DK_KILLING_MACHINE_PROC, aurEff);
-
- if (AuraEffect const* oblitaration = target->GetAuraEffect(SPELL_DK_OBLITERATION, EFFECT_1))
- if (roll_chance_i(oblitaration->GetAmount()))
- target->CastSpell(target, SPELL_DK_OBLITERATION_RUNE_ENERGIZE, aurEff);
- }
-
- void Register() override
- {
- AfterEffectProc += AuraEffectProcFn(spell_dk_obliteration::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 207200 - Permafrost
-class spell_dk_permafrost : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_FROST_SHIELD });
- }
-
- void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()));
- GetTarget()->CastSpell(GetTarget(), SPELL_DK_FROST_SHIELD, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dk_permafrost::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 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.
-class spell_dk_pet_geist_transform : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_GLYPH_OF_THE_GEIST });
- }
-
- bool Load() override
- {
- return GetCaster()->IsPet();
- }
-
- SpellCastResult CheckCast()
- {
- if (Unit* owner = GetCaster()->GetOwner())
- if (owner->HasAura(SPELL_DK_GLYPH_OF_THE_GEIST))
- return SPELL_CAST_OK;
-
- return SPELL_FAILED_SPELL_UNAVAILABLE;
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_dk_pet_geist_transform::CheckCast);
- }
-};
-
-// 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.
-class spell_dk_pet_skeleton_transform : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_GLYPH_OF_THE_SKELETON });
- }
-
- SpellCastResult CheckCast()
- {
- if (Unit* owner = GetCaster()->GetOwner())
- if (owner->HasAura(SPELL_DK_GLYPH_OF_THE_SKELETON))
- return SPELL_CAST_OK;
-
- return SPELL_FAILED_SPELL_UNAVAILABLE;
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_dk_pet_skeleton_transform::CheckCast);
- }
-};
-
-// 61257 - Runic Power Back on Snare/Root
-/// 7.1.5
-class spell_dk_pvp_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_RUNIC_RETURN });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
- if (!spellInfo)
- return false;
-
- return (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))) != 0;
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- eventInfo.GetActionTarget()->CastSpell(nullptr, SPELL_DK_RUNIC_RETURN, true);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_dk_pvp_4p_bonus::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_dk_pvp_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 46584 - Raise Dead
-class spell_dk_raise_dead : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_RAISE_DEAD_SUMMON, SPELL_DK_SLUDGE_BELCHER, SPELL_DK_SLUDGE_BELCHER_SUMMON });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- uint32 spellId = SPELL_DK_RAISE_DEAD_SUMMON;
- if (GetCaster()->HasAura(SPELL_DK_SLUDGE_BELCHER))
- spellId = SPELL_DK_SLUDGE_BELCHER_SUMMON;
-
- GetCaster()->CastSpell(nullptr, spellId, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_dk_raise_dead::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 59057 - Rime
-class spell_dk_rime : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, 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);
- }
-};
-
-// 242057 - Rune Empowered
-class spell_dk_t20_2p_rune_empowered : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DK_PILLAR_OF_FROST, SPELL_DK_BREATH_OF_SINDRAGOSA });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo)
- {
- Spell const* procSpell = procInfo.GetProcSpell();
- if (!procSpell)
- return;
-
- Aura* pillarOfFrost = GetTarget()->GetAura(SPELL_DK_PILLAR_OF_FROST);
- if (!pillarOfFrost)
- return;
-
- _runicPowerSpent += procSpell->GetPowerTypeCostAmount(POWER_RUNIC_POWER).value_or(0);
- // Breath of Sindragosa special case
- SpellInfo const* breathOfSindragosa = sSpellMgr->AssertSpellInfo(SPELL_DK_BREATH_OF_SINDRAGOSA, DIFFICULTY_NONE);
- if (procSpell->IsTriggeredByAura(breathOfSindragosa))
- {
- auto powerItr = std::find_if(breathOfSindragosa->PowerCosts.begin(), breathOfSindragosa->PowerCosts.end(),
- [](SpellPowerEntry const* power) { return power->PowerType == POWER_RUNIC_POWER && power->PowerPctPerSecond > 0.0f; });
- if (powerItr != breathOfSindragosa->PowerCosts.end())
- _runicPowerSpent += CalculatePct(GetTarget()->GetMaxPower(POWER_RUNIC_POWER), (*powerItr)->PowerPctPerSecond);
- }
-
- if (_runicPowerSpent >= 600)
- {
- pillarOfFrost->SetDuration(pillarOfFrost->GetDuration() + 1000);
- _runicPowerSpent -= 600;
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dk_t20_2p_rune_empowered::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
- int32 _runicPowerSpent = 0;
-};
-
-// 55233 - Vampiric Blood
-class spell_dk_vampiric_blood : public AuraScript
-{
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- amount = GetUnitOwner()->CountPctFromMaxHealth(amount);
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH_2);
- }
-};
-
-// 43265 - Death and Decay
-struct at_dk_death_and_decay : AreaTriggerAI
-{
- at_dk_death_and_decay(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
-
- void OnUnitEnter(Unit* unit) override
- {
- if (Unit* caster = at->GetCaster())
- {
- if (caster == unit)
- {
- if (caster->HasAura(SPELL_DK_UNHOLY_GROUND_TALENT))
- caster->CastSpell(caster, SPELL_DK_UNHOLY_GROUND_HASTE);
- }
- }
- }
-
- void OnUnitExit(Unit* unit) override
- {
- unit->RemoveAurasDueToSpell(SPELL_DK_UNHOLY_GROUND_HASTE);
- }
-};
void AddSC_deathknight_spell_scripts()
{
- RegisterSpellScript(spell_dk_advantage_t10_4p);
- RegisterSpellScript(spell_dk_anti_magic_shell);
- RegisterSpellScript(spell_dk_army_transform);
- RegisterSpellScript(spell_dk_blinding_sleet);
- RegisterSpellScript(spell_dk_blood_boil);
- RegisterSpellScript(spell_dk_dancing_rune_weapon);
- RegisterSpellScript(spell_dk_death_and_decay);
- RegisterSpellScript(spell_dk_death_coil);
- RegisterSpellScript(spell_dk_death_gate);
- RegisterSpellScript(spell_dk_death_grip_initial);
- RegisterSpellScript(spell_dk_death_pact);
- RegisterSpellScript(spell_dk_death_strike);
- RegisterSpellScript(spell_dk_death_strike_enabler);
- RegisterSpellScript(spell_dk_festering_strike);
- RegisterSpellScript(spell_dk_ghoul_explode);
- RegisterSpellScript(spell_dk_glyph_of_scourge_strike_script);
- RegisterSpellScript(spell_dk_howling_blast);
- RegisterSpellScript(spell_dk_mark_of_blood);
- RegisterSpellScript(spell_dk_necrosis);
- RegisterSpellScript(spell_dk_obliteration);
- RegisterSpellScript(spell_dk_permafrost);
- RegisterSpellScript(spell_dk_pet_geist_transform);
- RegisterSpellScript(spell_dk_pet_skeleton_transform);
- RegisterSpellScript(spell_dk_pvp_4p_bonus);
- RegisterSpellScript(spell_dk_raise_dead);
- RegisterSpellScript(spell_dk_rime);
- RegisterSpellScript(spell_dk_t20_2p_rune_empowered);
- RegisterSpellScript(spell_dk_vampiric_blood);
-
- RegisterAreaTriggerAI(at_dk_death_and_decay);
}
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index ceea646a319..e1b54838ce7 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -22,2116 +22,7 @@
*/
#include "ScriptMgr.h"
-#include "CellImpl.h"
-#include "Containers.h"
-#include "DB2Stores.h"
-#include "GridNotifiersImpl.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "Spell.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-
-enum DruidSpells
-{
- SPELL_DRUID_ABUNDANCE = 207383,
- SPELL_DRUID_ABUNDANCE_EFFECT = 207640,
- SPELL_DRUID_BALANCE_T10_BONUS = 70718,
- SPELL_DRUID_BALANCE_T10_BONUS_PROC = 70721,
- SPELL_DRUID_BEAR_FORM = 5487,
- 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,
- 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,
- SPELL_DRUID_CAT_FORM = 768,
- SPELL_DRUID_CULTIVATION = 200390,
- SPELL_DRUID_CULTIVATION_HEAL = 200389,
- SPELL_DRUID_CURIOUS_BRAMBLEPATCH = 330670,
- SPELL_DRUID_EARTHWARDEN_AURA = 203975,
- 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,
- SPELL_DRUID_EFFLORESCENCE_AURA = 81262,
- SPELL_DRUID_EFFLORESCENCE_HEAL = 81269,
- SPELL_DRUID_EMBRACE_OF_THE_DREAM_EFFECT = 392146,
- SPELL_DRUID_EMBRACE_OF_THE_DREAM_HEAL = 392147,
- SPELL_DRUID_ENTANGLING_ROOTS = 339,
- SPELL_DRUID_EXHILARATE = 28742,
- SPELL_DRUID_FORM_AQUATIC_PASSIVE = 276012,
- 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,
- SPELL_DRUID_GALACTIC_GUARDIAN_AURA = 213708,
- SPELL_DRUID_GERMINATION = 155675,
- SPELL_DRUID_GLYPH_OF_STARS = 114301,
- SPELL_DRUID_GLYPH_OF_STARS_VISUAL = 114302,
- SPELL_DRUID_GORE_PROC = 93622,
- SPELL_DRUID_GROWL = 6795,
- SPELL_DRUID_IDOL_OF_FERAL_SHADOWS = 34241,
- SPELL_DRUID_IDOL_OF_WORSHIP = 60774,
- SPELL_DRUID_INCARNATION = 117679,
- SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE = 102543,
- SPELL_DRUID_INCARNATION_TREE_OF_LIFE = 33891,
- SPELL_DRUID_INNER_PEACE = 197073,
- SPELL_DRUID_INNERVATE = 29166,
- SPELL_DRUID_INNERVATE_RANK_2 = 326228,
- SPELL_DRUID_INFUSION = 37238,
- SPELL_DRUID_LANGUISH = 71023,
- SPELL_DRUID_LIFEBLOOM_FINAL_HEAL = 33778,
- SPELL_DRUID_LUNAR_INSPIRATION_OVERRIDE = 155627,
- SPELL_DRUID_MANGLE = 33917,
- SPELL_DRUID_MASS_ENTANGLEMENT = 102359,
- SPELL_DRUID_MOONFIRE_DAMAGE = 164812,
- SPELL_DRUID_POWER_OF_THE_ARCHDRUID = 392302,
- SPELL_DRUID_PROWL = 5215,
- SPELL_DRUID_REGROWTH = 8936,
- SPELL_DRUID_REJUVENATION = 774,
- SPELL_DRUID_REJUVENATION_GERMINATION = 155777,
- SPELL_DRUID_REJUVENATION_T10_PROC = 70691,
- SPELL_DRUID_RESTORATION_T10_2P_BONUS = 70658,
- SPELL_DRUID_SAVAGE_ROAR = 62071,
- SPELL_DRUID_SHOOTING_STARS = 202342,
- SPELL_DRUID_SHOOTING_STARS_DAMAGE = 202497,
- SPELL_DRUID_SKULL_BASH_CHARGE = 221514,
- SPELL_DRUID_SKULL_BASH_INTERRUPT = 93985,
- SPELL_DRUID_SPRING_BLOSSOMS = 207385,
- SPELL_DRUID_SPRING_BLOSSOMS_HEAL = 207386,
- SPELL_DRUID_SUNFIRE_DAMAGE = 164815,
- SPELL_DRUID_SURVIVAL_INSTINCTS = 50322,
- SPELL_DRUID_TRAVEL_FORM = 783,
- SPELL_DRUID_TREE_OF_LIFE = 33891,
- SPELL_DRUID_THRASH_BEAR = 77758,
- SPELL_DRUID_THRASH_BEAR_AURA = 192090,
- SPELL_DRUID_THRASH_CAT = 106830,
- SPELL_DRUID_YSERAS_GIFT_HEAL_PARTY = 145110,
- SPELL_DRUID_YSERAS_GIFT_HEAL_SELF = 145109
-};
-
-// 774 - Rejuvenation
-// 155777 - Rejuvenation (Germination)
-class spell_dru_abundance : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_ABUNDANCE, SPELL_DRUID_ABUNDANCE_EFFECT });
- }
-
- void HandleOnApplyOrReapply(AuraEffect const* aurEff, AuraEffectHandleModes mode) const
- {
- Unit* caster = GetCaster();
- if (!caster || !caster->HasAura(SPELL_DRUID_ABUNDANCE))
- return;
-
- // Note: caster only casts Abundance when first applied on the target, otherwise that given stack is refreshed.
- if (mode & AURA_EFFECT_HANDLE_REAL)
- caster->CastSpell(caster, SPELL_DRUID_ABUNDANCE_EFFECT, CastSpellExtraArgs().SetTriggeringAura(aurEff));
- else if (Aura* abundanceAura = caster->GetAura(SPELL_DRUID_ABUNDANCE_EFFECT))
- abundanceAura->RefreshDuration();
- }
-
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- if (Aura* abundanceEffect = caster->GetAura(SPELL_DRUID_ABUNDANCE_EFFECT))
- abundanceEffect->ModStackAmount(-1);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_dru_abundance::HandleOnApplyOrReapply, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_abundance::HandleOnRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-class spell_dru_base_transformer : public SpellScript
-{
-protected:
- 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
-{
- 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);
- }
-};
-
-// 50334 - Berserk
-class spell_dru_berserk : public spell_dru_base_transformer
-{
- 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);
- }
-
-protected:
- bool ToCatForm() const override { return false; }
-};
-
-// 203953 - Brambles - SPELL_DRUID_BRAMBLES_PASSIVE
-class spell_dru_brambles : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_BRAMBLES_REFLECT, SPELL_DRUID_BRAMBLES_DAMAGE_AURA });
- }
-
- void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& /*absorbAmount*/)
- {
- // Prevent Removal
- PreventDefaultAction();
- }
-
- void HandleAfterAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount)
- {
- // reflect back damage to the attacker
- Unit* target = GetTarget();
- if (Unit* attacker = dmgInfo.GetAttacker())
- target->CastSpell(attacker, SPELL_DRUID_BRAMBLES_REFLECT, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, absorbAmount));
- }
-
- 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
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- // BristlingFurRage = 100 * Damage / MaxHealth.
- if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
- {
- Unit* target = GetTarget();
- uint32 rage = target->GetMaxPower(POWER_RAGE) * (float)damageInfo->GetDamage() / (float)target->GetMaxHealth();
- if (rage > 0)
- target->CastSpell(target, SPELL_DRUID_BRISTLING_FUR_GAIN_RAGE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, rage));
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dru_bristling_fur::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 768 - CatForm - SPELL_DRUID_CAT_FORM
-class spell_dru_cat_form : public AuraScript
-{
- 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);
- }
-};
-
-// 774 - Rejuvenation
-// 155777 - Rejuventation (Germination)
-class spell_dru_cultivation : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_CULTIVATION_HEAL })
- && ValidateSpellEffect({ { SPELL_DRUID_CULTIVATION, EFFECT_0 } });
- }
-
- void HandleOnTick(AuraEffect const* aurEff) const
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- Unit* target = GetTarget();
- if (AuraEffect const* cultivationEffect = caster->GetAuraEffect(SPELL_DRUID_CULTIVATION, EFFECT_0))
- if (target->HealthBelowPct(cultivationEffect->GetAmount()))
- caster->CastSpell(target, SPELL_DRUID_CULTIVATION_HEAL, CastSpellExtraArgs().SetTriggeringAura(aurEff));
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_cultivation::HandleOnTick, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
- }
-};
-
-// 1850 - Dash
-class spell_dru_dash : public AuraScript
-{
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- // do not set speed if not in cat form
- if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT_FORM)
- amount = 0;
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED);
- }
-};
-
-// 203974 - Earthwarden
-class spell_dru_earthwarden : public AuraScript
-{
- 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);
- }
-};
-
-class spell_dru_eclipse_common
-{
-public:
- static void SetSpellCount(Unit* unitOwner, uint32 spellId, uint32 amount)
- {
- Aura* aura = unitOwner->GetAura(spellId);
- if (!aura)
- unitOwner->CastSpell(unitOwner, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, amount));
- else
- aura->SetStackAmount(amount);
- }
-};
-
-// 48517 Eclipse (Solar) + 48518 Eclipse (Lunar)
-class spell_dru_eclipse_aura : public AuraScript
-{
- 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
-{
- 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()), 1s);
- }
-
- 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
-{
- 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);
- }
-};
-
-// 145205 - Efflorescence
-class spell_dru_efflorescence : public SpellScript
-{
- void RemoveOldAreaTrigger(SpellEffIndex /*effIndex*/) const
- {
- // if caster has any Efflorescence areatrigger, we remove it.
- GetCaster()->RemoveAreaTrigger(GetSpellInfo()->Id);
- }
-
- void InitSummon()
- {
- for (SpellLogEffectGenericVictimParams const& summonedObject : GetSpell()->GetExecuteLogEffectTargets(SPELL_EFFECT_SUMMON, &SpellLogEffect::GenericVictimTargets))
- if (Unit* summon = ObjectAccessor::GetCreature(*GetCaster(), summonedObject.Victim))
- summon->CastSpell(summon, SPELL_DRUID_EFFLORESCENCE_AURA,
- CastSpellExtraArgs().SetTriggeringSpell(GetSpell()));
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_dru_efflorescence::RemoveOldAreaTrigger, EFFECT_2, SPELL_EFFECT_CREATE_AREATRIGGER);
- AfterCast += SpellCastFn(spell_dru_efflorescence::InitSummon);
- }
-};
-
-// 81262 - Efflorescence (Dummy)
-class spell_dru_efflorescence_dummy : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_EFFLORESCENCE_HEAL });
- }
-
- void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) const
- {
- Unit* target = GetTarget();
- Unit* summoner = target->GetOwner();
- if (!summoner)
- return;
-
- summoner->CastSpell(target, SPELL_DRUID_EFFLORESCENCE_HEAL, TRIGGERED_DONT_REPORT_CAST_ERROR);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_efflorescence_dummy::HandlePeriodicDummy, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 81269 - Efflorescence (Heal)
-class spell_dru_efflorescence_heal : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& targets) const
- {
- // Efflorescence became a smart heal which prioritizes players and their pets in their group before any unit outside their group.
- Trinity::SelectRandomInjuredTargets(targets, 3, true, GetCaster());
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_efflorescence_heal::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 392124 - Embrace of the Dream
-class spell_dru_embrace_of_the_dream : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo ({ SPELL_DRUID_EMBRACE_OF_THE_DREAM_EFFECT })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
- }
-
- bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
- {
- return roll_chance_i(GetEffectInfo(EFFECT_2).CalcValue(GetCaster()));
- }
-
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_EMBRACE_OF_THE_DREAM_EFFECT,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR)
- .SetTriggeringAura(aurEff)
- .SetTriggeringSpell(eventInfo.GetProcSpell()));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_embrace_of_the_dream::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_dru_embrace_of_the_dream::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 392146 - Embrace of the Dream (Selector)
-class spell_dru_embrace_of_the_dream_effect : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_DRUID_EMBRACE_OF_THE_DREAM_HEAL,
- SPELL_DRUID_REGROWTH,
- SPELL_DRUID_REJUVENATION,
- SPELL_DRUID_REJUVENATION_GERMINATION
- });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets) const
- {
- targets.remove_if([&](WorldObject const* target)
- {
- Unit const* unitTarget = target->ToUnit();
- return !unitTarget || !unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, flag128(0x50, 0, 0, 0), GetCaster()->GetGUID());
- });
- }
-
- void HandleEffect(SpellEffIndex /*effIndex*/) const
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_DRUID_EMBRACE_OF_THE_DREAM_HEAL,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR)
- .SetTriggeringSpell(GetSpell()));
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_embrace_of_the_dream_effect::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- OnEffectHitTarget += SpellEffectFn(spell_dru_embrace_of_the_dream_effect::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 339 - Entangling Roots
-// 102359 - Mass Entanglement
-class spell_dru_entangling_roots : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_CURIOUS_BRAMBLEPATCH });
- }
-
- void HandleCuriousBramblepatch(WorldObject*& target)
- {
- if (!GetCaster()->HasAura(SPELL_DRUID_CURIOUS_BRAMBLEPATCH))
- target = nullptr;
- }
-
- void HandleCuriousBramblepatchAOE(std::list<WorldObject*>& targets)
- {
- if (!GetCaster()->HasAura(SPELL_DRUID_CURIOUS_BRAMBLEPATCH))
- targets.clear();
- }
-
- void Register() override
- {
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dru_entangling_roots::HandleCuriousBramblepatch, EFFECT_1, TARGET_UNIT_TARGET_ENEMY);
- if (m_scriptSpellId == SPELL_DRUID_MASS_ENTANGLEMENT)
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_entangling_roots::HandleCuriousBramblepatchAOE, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
- }
-};
-
-class spell_dru_entangling_roots_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_ENTANGLING_ROOTS, SPELL_DRUID_MASS_ENTANGLEMENT });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo())
- {
- // dont subtract dmg caused by roots from dmg required to break root
- if (spellInfo->Id == SPELL_DRUID_ENTANGLING_ROOTS || spellInfo->Id == SPELL_DRUID_MASS_ENTANGLEMENT)
- return false;
- }
- return true;
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_dru_entangling_roots_aura::CheckProc);
- }
-};
-
-// 22568 - Ferocious Bite
-class spell_dru_ferocious_bite : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE, EFFECT_1 } });
- }
-
- void HandleHitTargetBurn(SpellEffIndex /*effIndex*/)
- {
- int32 newValue = int32(float(GetEffectValue()) * _damageMultiplier);
- SetEffectValue(newValue);
- }
-
- void HandleHitTargetDmg(SpellEffIndex /*effIndex*/)
- {
- int32 newValue = int32(float(GetHitDamage()) * (1.0f + _damageMultiplier));
- SetHitDamage(newValue);
- }
-
- void HandleLaunchTarget(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
-
- int32 maxExtraConsumedPower = GetEffectValue();
-
- if (AuraEffect* auraEffect = caster->GetAuraEffect(SPELL_DRUID_INCARNATION_KING_OF_THE_JUNGLE, EFFECT_1))
- {
- float multiplier = 1.0f + float(auraEffect->GetAmount()) / 100.0f;
- maxExtraConsumedPower = int32(float(maxExtraConsumedPower) * multiplier);
- SetEffectValue(maxExtraConsumedPower);
- }
-
- _damageMultiplier = std::min<float>(caster->GetPower(POWER_ENERGY), maxExtraConsumedPower) / maxExtraConsumedPower;
- }
-
- void Register() override
- {
- OnEffectLaunchTarget += SpellEffectFn(spell_dru_ferocious_bite::HandleLaunchTarget, EFFECT_1, SPELL_EFFECT_POWER_BURN);
- OnEffectHitTarget += SpellEffectFn(spell_dru_ferocious_bite::HandleHitTargetBurn, EFFECT_1, SPELL_EFFECT_POWER_BURN);
- OnEffectHitTarget += SpellEffectFn(spell_dru_ferocious_bite::HandleHitTargetDmg, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-
-private:
- float _damageMultiplier = 0.0f;
-};
-
-// 37336 - Druid Forms Trinket
-class spell_dru_forms_trinket : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- 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
- });
- }
-
- 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;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Unit* target = eventInfo.GetActor();
- uint32 triggerspell = 0;
-
- switch (target->GetShapeshiftForm())
- {
- case FORM_BEAR_FORM:
- case FORM_DIRE_BEAR_FORM:
- triggerspell = SPELL_DRUID_FORMS_TRINKET_BEAR;
- break;
- case FORM_CAT_FORM:
- triggerspell = SPELL_DRUID_FORMS_TRINKET_CAT;
- break;
- case FORM_MOONKIN_FORM:
- triggerspell = SPELL_DRUID_FORMS_TRINKET_MOONKIN;
- break;
- case FORM_NONE:
- triggerspell = SPELL_DRUID_FORMS_TRINKET_NONE;
- break;
- case FORM_TREE_OF_LIFE:
- triggerspell = SPELL_DRUID_FORMS_TRINKET_TREE;
- break;
- default:
- return;
- }
-
- target->CastSpell(target, triggerspell, aurEff);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_dru_forms_trinket::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_dru_forms_trinket::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 203964 - Galactic Guardian
-class spell_dru_galactic_guardian : public AuraScript
-{
- 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);
- }
-};
-
-// 774 - Rejuvenation
-class spell_dru_germination : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_REJUVENATION, SPELL_DRUID_GERMINATION, SPELL_DRUID_REJUVENATION_GERMINATION });
- }
-
- void PickRejuvenationVariant(WorldObject*& target) const
- {
- Unit* caster = GetCaster();
-
- // Germination talent.
- if (caster->HasAura(SPELL_DRUID_GERMINATION))
- {
- Unit* unitTarget = target->ToUnit();
- Aura* rejuvenationAura = unitTarget->GetAura(SPELL_DRUID_REJUVENATION, caster->GetGUID());
- Aura* germinationAura = unitTarget->GetAura(SPELL_DRUID_REJUVENATION_GERMINATION, caster->GetGUID());
-
- // if target doesn't have Rejuventation, cast passes through.
- if (!rejuvenationAura)
- return;
-
- // if target has Rejuvenation, but not Germination, or Germination has lower remaining duration than Rejuvenation, then cast Germination
- if (germinationAura && germinationAura->GetDuration() >= rejuvenationAura->GetDuration())
- return;
-
- caster->CastSpell(target, SPELL_DRUID_REJUVENATION_GERMINATION,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR)
- .SetTriggeringSpell(GetSpell()));
-
- // prevent aura refresh (but cast must still happen to consume mana)
- target = nullptr;
- }
- }
-
- void Register() override
- {
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dru_germination::PickRejuvenationVariant, EFFECT_0, TARGET_UNIT_TARGET_ALLY);
- }
-};
-
-// 24858 - Moonkin Form
-class spell_dru_glyph_of_stars : public AuraScript
-{
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_GLYPH_OF_STARS, SPELL_DRUID_GLYPH_OF_STARS_VISUAL });
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (target->HasAura(SPELL_DRUID_GLYPH_OF_STARS))
- target->CastSpell(target, SPELL_DRUID_GLYPH_OF_STARS_VISUAL, true);
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_GLYPH_OF_STARS_VISUAL);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_dru_glyph_of_stars::OnApply, EFFECT_1, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_dru_glyph_of_stars::OnRemove, EFFECT_1, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 210706 - Gore
-class spell_dru_gore : public AuraScript
-{
- 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);
- }
-};
-
-// 99 - Incapacitating Roar
-class spell_dru_incapacitating_roar : public spell_dru_base_transformer
-{
-protected:
- bool ToCatForm() const override { return false; }
-};
-
-// 29166 - Innervate
-class spell_dru_innervate : public SpellScript
-{
- SpellCastResult CheckCast()
- {
- Player* target = Object::ToPlayer(GetExplTargetUnit());
- if (!target)
- return SPELL_FAILED_BAD_TARGETS;
-
- ChrSpecializationEntry const* spec = target->GetPrimarySpecializationEntry();
- if (!spec || spec->GetRole() != ChrSpecializationRole::Healer)
- return SPELL_FAILED_BAD_TARGETS;
-
- return SPELL_CAST_OK;
- }
-
- void HandleRank2()
- {
- Unit* caster = GetCaster();
- if (caster != GetHitUnit())
- if (AuraEffect const* innervateR2 = caster->GetAuraEffect(SPELL_DRUID_INNERVATE_RANK_2, EFFECT_0))
- caster->CastSpell(caster, SPELL_DRUID_INNERVATE,
- CastSpellExtraArgs(TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD | TRIGGERED_IGNORE_CAST_IN_PROGRESS)
- .SetTriggeringSpell(GetSpell())
- .AddSpellMod(SPELLVALUE_BASE_POINT0, -innervateR2->GetAmount()));
-
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_dru_innervate::CheckCast);
- OnHit += SpellHitFn(spell_dru_innervate::HandleRank2);
- }
-};
-
-// 117679 - Incarnation (Passive)
-class spell_dru_incarnation : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_INCARNATION_TREE_OF_LIFE });
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_INCARNATION_TREE_OF_LIFE);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_incarnation::OnRemove, EFFECT_0, SPELL_AURA_IGNORE_SPELL_COOLDOWN, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 33891 - Incarnation: Tree of Life (Talent, Shapeshift)
-class spell_dru_incarnation_tree_of_life : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_INCARNATION });
- }
-
- void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
- {
- if (!GetTarget()->HasAura(SPELL_DRUID_INCARNATION))
- GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_INCARNATION, true);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_dru_incarnation_tree_of_life::AfterApply, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 740 - Tranquility
-class spell_dru_inner_peace : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_INNER_PEACE })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_4 } })
- && spellInfo->GetEffect(EFFECT_3).IsAura(SPELL_AURA_MECHANIC_IMMUNITY_MASK)
- && spellInfo->GetEffect(EFFECT_4).IsAura(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
- }
-
- void PreventEffect(WorldObject*& target) const
- {
- // Note: Inner Peace talent.
- if (!GetCaster()->HasAura(SPELL_DRUID_INNER_PEACE))
- target = nullptr;
- }
-
- void Register() override
- {
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dru_inner_peace::PreventEffect, EFFECT_3, TARGET_UNIT_CASTER);
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dru_inner_peace::PreventEffect, EFFECT_4, TARGET_UNIT_CASTER);
- }
-};
-
-// 40442 - Druid Tier 6 Trinket
-class spell_dru_item_t6_trinket : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_DRUID_BLESSING_OF_REMULOS,
- SPELL_DRUID_BLESSING_OF_ELUNE,
- SPELL_DRUID_BLESSING_OF_CENARIUS
- });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
- if (!spellInfo)
- return;
-
- uint32 spellId;
- int32 chance;
-
- // Starfire
- if (spellInfo->SpellFamilyFlags[0] & 0x00000004)
- {
- spellId = SPELL_DRUID_BLESSING_OF_REMULOS;
- chance = 25;
- }
- // Rejuvenation
- else if (spellInfo->SpellFamilyFlags[0] & 0x00000010)
- {
- spellId = SPELL_DRUID_BLESSING_OF_ELUNE;
- chance = 25;
- }
- // Mangle (Bear) and Mangle (Cat)
- else if (spellInfo->SpellFamilyFlags[1] & 0x00000440)
- {
- spellId = SPELL_DRUID_BLESSING_OF_CENARIUS;
- chance = 40;
- }
- else
- return;
-
- if (roll_chance_i(chance))
- eventInfo.GetActor()->CastSpell(nullptr, spellId, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dru_item_t6_trinket::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 33763 - Lifebloom
-class spell_dru_lifebloom : public AuraScript
-{
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_LIFEBLOOM_FINAL_HEAL });
- }
-
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- // Final heal only on duration end
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE || GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL)
- GetCaster()->CastSpell(GetUnitOwner(), SPELL_DRUID_LIFEBLOOM_FINAL_HEAL, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lifebloom::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 155580 - Lunar Inspiration
-class spell_dru_lunar_inspiration : public AuraScript
-{
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_LUNAR_INSPIRATION_OVERRIDE });
- }
-
- void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_LUNAR_INSPIRATION_OVERRIDE, true);
- }
-
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_LUNAR_INSPIRATION_OVERRIDE);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_dru_lunar_inspiration::AfterApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_lunar_inspiration::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 392315 - Luxuriant Soil
-class spell_dru_luxuriant_soil : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_REJUVENATION });
- }
-
- static bool CheckProc(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
- {
- return roll_chance_i(aurEff->GetAmount());
- }
-
- void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
- {
- Unit* rejuvCaster = GetTarget();
-
- // let's use the ProcSpell's max. range.
- float spellRange = eventInfo.GetSpellInfo()->GetMaxRange();
-
- std::vector<Unit*> targetList;
- Trinity::WorldObjectSpellAreaTargetCheck check(spellRange, rejuvCaster, rejuvCaster, rejuvCaster, eventInfo.GetSpellInfo(), TARGET_CHECK_ALLY, nullptr, TARGET_OBJECT_TYPE_UNIT);
- Trinity::UnitListSearcher searcher(rejuvCaster, targetList, check);
- Cell::VisitAllObjects(rejuvCaster, searcher, spellRange);
-
- if (targetList.empty())
- return;
-
- rejuvCaster->CastSpell(Trinity::Containers::SelectRandomContainerElement(targetList), SPELL_DRUID_REJUVENATION, TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_POWER_AND_REAGENT_COST | TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_luxuriant_soil::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_dru_luxuriant_soil::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 8921 - Moonfire
-class spell_dru_moonfire : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_MOONFIRE_DAMAGE });
- }
-
- void HandleOnHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_DRUID_MOONFIRE_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_dru_moonfire::HandleOnHit, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 16864 - Omen of Clarity
-class spell_dru_omen_of_clarity : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_BALANCE_T10_BONUS, SPELL_DRUID_BALANCE_T10_BONUS_PROC });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
- {
- Unit* target = GetTarget();
- if (target->HasAura(SPELL_DRUID_BALANCE_T10_BONUS))
- target->CastSpell(nullptr, SPELL_DRUID_BALANCE_T10_BONUS_PROC, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dru_omen_of_clarity::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 392303 - Power of the Archdruid
-class spell_dru_power_of_the_archdruid : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_DRUID_POWER_OF_THE_ARCHDRUID, EFFECT_0 } });
- }
-
- static bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
- {
- return eventInfo.GetActor()->HasAuraEffect(SPELL_DRUID_POWER_OF_THE_ARCHDRUID, EFFECT_0);
- }
-
- static void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
- {
- Unit* druid = eventInfo.GetActor();
- Unit const* procTarget = eventInfo.GetActionTarget();
-
- // range is EFFECT_0's BasePoints.
- float spellRange = aurEff->GetAmount();
-
- std::vector<Unit*> targetList;
- Trinity::WorldObjectSpellAreaTargetCheck checker(spellRange, procTarget, druid, druid, eventInfo.GetSpellInfo(), TARGET_CHECK_ALLY, nullptr, TARGET_OBJECT_TYPE_UNIT);
- Trinity::UnitListSearcher searcher(procTarget, targetList, checker);
- Cell::VisitAllObjects(procTarget, searcher, spellRange);
- std::erase(targetList, procTarget);
-
- if (targetList.empty())
- return;
-
- AuraEffect const* powerOfTheArchdruidEffect = druid->GetAuraEffect(SPELL_DRUID_POWER_OF_THE_ARCHDRUID, EFFECT_0);
-
- // max. targets is SPELL_DRUID_POWER_OF_THE_ARCHDRUID's EFFECT_0 BasePoints.
- int32 maxTargets = powerOfTheArchdruidEffect->GetAmount();
-
- Trinity::Containers::RandomResize(targetList, maxTargets);
-
- for (Unit* chosenTarget : targetList)
- druid->CastSpell(chosenTarget, eventInfo.GetProcSpell()->GetSpellInfo()->Id, aurEff);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_power_of_the_archdruid::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_dru_power_of_the_archdruid::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 5215 - Prowl
-class spell_dru_prowl : public spell_dru_base_transformer
-{
-protected:
- bool ToCatForm() const override { return true; }
-};
-
-// 1079 - Rip
-class spell_dru_rip : public AuraScript
-{
- bool Load() override
- {
- Unit* caster = GetCaster();
- return caster && caster->GetTypeId() == TYPEID_PLAYER;
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
-
- if (Unit* caster = GetCaster())
- {
- // 0.01 * $AP * cp
- int32 cp = caster->GetPower(POWER_COMBO_POINTS);
-
- // 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();
-
- amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp));
- }
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_rip::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
- }
-};
-
-// 52610 - Savage Roar
-class spell_dru_savage_roar : public SpellScript
-{
- SpellCastResult CheckCast()
- {
- Unit* caster = GetCaster();
- if (caster->GetShapeshiftForm() != FORM_CAT_FORM)
- return SPELL_FAILED_ONLY_SHAPESHIFT;
-
- return SPELL_CAST_OK;
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_dru_savage_roar::CheckCast);
- }
-};
-
-class spell_dru_savage_roar_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_SAVAGE_ROAR });
- }
-
- void AfterApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->CastSpell(target, SPELL_DRUID_SAVAGE_ROAR, CastSpellExtraArgs(aurEff)
- .SetOriginalCaster(GetCasterGUID()));
- }
-
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SAVAGE_ROAR);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_dru_savage_roar_aura::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_savage_roar_aura::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 164815 - Sunfire
-// 164812 - Moonfire
-class spell_dru_shooting_stars : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_SHOOTING_STARS, SPELL_DRUID_SHOOTING_STARS_DAMAGE });
- }
-
- void OnTick(AuraEffect const* /*aurEff*/)
- {
- if (Unit* caster = GetCaster())
- if (AuraEffect const* shootingStars = caster->GetAuraEffect(SPELL_DRUID_SHOOTING_STARS, EFFECT_0))
- if (roll_chance_i(shootingStars->GetAmount()))
- caster->CastSpell(GetTarget(), SPELL_DRUID_SHOOTING_STARS_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_shooting_stars::OnTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
- }
-};
-
-// 106839 - Skull Bash
-class spell_dru_skull_bash : public SpellScript
-{
- 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);
- }
-};
-
-// 81269 - Efflorescence (Heal)
-class spell_dru_spring_blossoms : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_SPRING_BLOSSOMS, SPELL_DRUID_SPRING_BLOSSOMS_HEAL });
- }
-
- void HandleOnHit(SpellEffIndex /*effIndex*/) const
- {
- if (GetCaster()->HasAura(SPELL_DRUID_SPRING_BLOSSOMS))
- GetCaster()->CastSpell(GetHitUnit(), SPELL_DRUID_SPRING_BLOSSOMS_HEAL, TRIGGERED_DONT_REPORT_CAST_ERROR);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_dru_spring_blossoms::HandleOnHit, EFFECT_0, SPELL_EFFECT_HEAL);
- }
-};
-
-// 106898 - Stampeding Roar
-class spell_dru_stampeding_roar : public spell_dru_base_transformer
-{
-protected:
- bool ToCatForm() const override { return false; }
-};
-
-// 50286 - Starfall (Dummy)
-class spell_dru_starfall_dummy : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Trinity::Containers::RandomResize(targets, 2);
- }
-
- 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())
- {
- if (SpellInfo const* spellInfo = GetTriggeringSpell())
- caster->RemoveAurasDueToSpell(spellInfo->Id);
- return;
- }
-
- // Any effect which causes you to lose control of your character will supress the starfall effect.
- if (caster->HasUnitState(UNIT_STATE_CONTROLLED))
- return;
-
- caster->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_starfall_dummy::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
- OnEffectHitTarget += SpellEffectFn(spell_dru_starfall_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 340694 - Sudden Ambush
-// 384667 - Sudden Ambush
-class spell_dru_sudden_ambush : public AuraScript
-{
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& procInfo)
- {
- Spell const* procSpell = procInfo.GetProcSpell();
- if (!procSpell)
- return false;
-
- Optional<int32> comboPoints = procSpell->GetPowerTypeCostAmount(POWER_COMBO_POINTS);
- if (!comboPoints)
- return false;
-
- return roll_chance_i(*comboPoints * aurEff->GetAmount());
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_dru_sudden_ambush::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 93402 - Sunfire
-class spell_dru_sunfire : public SpellScript
-{
- void HandleOnHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_DRUID_SUNFIRE_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_dru_sunfire::HandleOnHit, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 61336 - Survival Instincts
-class spell_dru_survival_instincts : public AuraScript
-{
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_SURVIVAL_INSTINCTS });
- }
-
- void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_SURVIVAL_INSTINCTS, true);
- }
-
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_DRUID_SURVIVAL_INSTINCTS);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_dru_survival_instincts::AfterApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_survival_instincts::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 40121 - Swift Flight Form (Passive)
-class spell_dru_swift_flight_passive : public AuraScript
-{
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
- {
- if (Player* caster = GetCaster()->ToPlayer())
- if (caster->GetSkillValue(SKILL_RIDING) >= 375)
- amount = 310;
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_swift_flight_passive::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
- }
-};
-
-// 28744 - Regrowth
-class spell_dru_t3_6p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_BLESSING_OF_THE_CLAW });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_BLESSING_OF_THE_CLAW, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dru_t3_6p_bonus::HandleProc, EFFECT_0, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
- }
-};
-
-// 28719 - Healing Touch
-class spell_dru_t3_8p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_EXHILARATE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Spell const* spell = eventInfo.GetProcSpell();
- if (!spell)
- return;
-
- Unit* caster = eventInfo.GetActor();
- std::vector<SpellPowerCost> const& costs = spell->GetPowerCost();
- auto m = std::find_if(costs.begin(), costs.end(), [](SpellPowerCost const& cost) { return cost.Power == POWER_MANA; });
- if (m == costs.end())
- return;
-
- int32 amount = CalculatePct(m->Amount, aurEff->GetAmount());
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(amount);
- caster->CastSpell(nullptr, SPELL_DRUID_EXHILARATE, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dru_t3_8p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 37288 - Mana Restore
-// 37295 - Mana Restore
-class spell_dru_t4_2p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_INFUSION });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- eventInfo.GetActor()->CastSpell(nullptr, SPELL_DRUID_INFUSION, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dru_t4_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 70723 - Item - Druid T10 Balance 4P Bonus
-class spell_dru_t10_balance_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_LANGUISH });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- 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());
-
- ASSERT(spellInfo->GetMaxTicks() > 0);
- amount /= spellInfo->GetMaxTicks();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, amount);
- caster->CastSpell(target, SPELL_DRUID_LANGUISH, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_dru_t10_balance_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 70691 - Item T10 Restoration 4P Bonus
-class spell_dru_t10_restoration_4p_bonus : public SpellScript
-{
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- 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());
-
- if (tempTargets.empty())
- {
- targets.clear();
- FinishCast(SPELL_FAILED_DONT_REPORT);
- return;
- }
-
- Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets);
- targets.clear();
- targets.push_back(target);
- }
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_t10_restoration_4p_bonus::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 70664 - Druid T10 Restoration 4P Bonus (Rejuvenation)
-class spell_dru_t10_restoration_4p_bonus_dummy : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_REJUVENATION_T10_PROC });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- 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();
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, eventInfo.GetHealInfo()->GetHeal());
- eventInfo.GetActor()->CastSpell(nullptr, SPELL_DRUID_REJUVENATION_T10_PROC, args);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_dru_t10_restoration_4p_bonus_dummy::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_dru_t10_restoration_4p_bonus_dummy::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 77758 - Thrash
-class spell_dru_thrash : public SpellScript
-{
- 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
-{
- 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 AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_FORM_STAG, SPELL_DRUID_FORM_AQUATIC_PASSIVE, SPELL_DRUID_FORM_AQUATIC, SPELL_DRUID_FORM_FLIGHT, SPELL_DRUID_FORM_SWIFT_FLIGHT });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- // If it stays 0, it removes Travel Form dummy in AfterRemove.
- triggeredSpellId = 0;
-
- // We should only handle aura interrupts.
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_INTERRUPT)
- return;
-
- // Check what form is appropriate
- triggeredSpellId = GetFormSpellId(GetTarget()->ToPlayer(), GetCastDifficulty(), true);
-
- // If chosen form is current aura, just don't remove it.
- if (triggeredSpellId == m_scriptSpellId)
- PreventDefaultAction();
- }
-
- void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (triggeredSpellId == m_scriptSpellId)
- return;
-
- Player* player = GetTarget()->ToPlayer();
-
- if (triggeredSpellId) // Apply new form
- player->CastSpell(player, triggeredSpellId, aurEff);
- else // If not set, simply remove Travel Form dummy
- player->RemoveAura(SPELL_DRUID_TRAVEL_FORM);
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_dru_travel_form::OnRemove, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_travel_form::AfterRemove, EFFECT_0, SPELL_AURA_MOD_SHAPESHIFT, AURA_EFFECT_HANDLE_REAL);
- }
-
-public:
- static uint32 GetFormSpellId(Player const* player, Difficulty difficulty, bool requiresOutdoor)
- {
- // Check what form is appropriate
- if (player->HasSpell(SPELL_DRUID_FORM_AQUATIC_PASSIVE) && player->IsInWater()) // Aquatic form
- return SPELL_DRUID_FORM_AQUATIC;
-
- if (!player->IsInCombat() && player->GetSkillValue(SKILL_RIDING) >= 225 && CheckLocationForForm(player, difficulty, requiresOutdoor, SPELL_DRUID_FORM_FLIGHT) == SPELL_CAST_OK) // Flight form
- return player->GetSkillValue(SKILL_RIDING) >= 300 ? SPELL_DRUID_FORM_SWIFT_FLIGHT : SPELL_DRUID_FORM_FLIGHT;
-
- if (!player->IsInWater() && CheckLocationForForm(player, difficulty, requiresOutdoor, SPELL_DRUID_FORM_STAG) == SPELL_CAST_OK) // Stag form
- return SPELL_DRUID_FORM_STAG;
-
- return 0;
- }
-
-private:
- static SpellCastResult CheckLocationForForm(Player const* targetPlayer, Difficulty difficulty, bool requireOutdoors, uint32 spell_id)
- {
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id, difficulty);
-
- if (requireOutdoors && !targetPlayer->IsOutdoors())
- return SPELL_FAILED_ONLY_OUTDOORS;
-
- return spellInfo->CheckLocation(targetPlayer->GetMapId(), targetPlayer->GetZoneId(), targetPlayer->GetAreaId(), targetPlayer);
- }
-
- uint32 triggeredSpellId = 0;
-};
-
-// 783 - Travel Form (dummy)
-class spell_dru_travel_form_dummy : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_FORM_AQUATIC_PASSIVE, SPELL_DRUID_FORM_AQUATIC, SPELL_DRUID_FORM_STAG });
- }
-
- SpellCastResult CheckCast()
- {
- Player* player = GetCaster()->ToPlayer();
- if (!player)
- return SPELL_FAILED_CUSTOM_ERROR;
-
- uint32 spellId = (player->HasSpell(SPELL_DRUID_FORM_AQUATIC_PASSIVE) && player->IsInWater()) ? SPELL_DRUID_FORM_AQUATIC : SPELL_DRUID_FORM_STAG;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetCastDifficulty());
- return spellInfo->CheckLocation(player->GetMapId(), player->GetZoneId(), player->GetAreaId(), player);
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_dru_travel_form_dummy::CheckCast);
- }
-};
-
-class spell_dru_travel_form_dummy_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_FORM_STAG, SPELL_DRUID_FORM_AQUATIC, SPELL_DRUID_FORM_FLIGHT, SPELL_DRUID_FORM_SWIFT_FLIGHT });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Player* player = GetTarget()->ToPlayer();
-
- // Outdoor check already passed - Travel Form (dummy) has SPELL_ATTR0_OUTDOORS_ONLY attribute.
- uint32 triggeredSpellId = spell_dru_travel_form::GetFormSpellId(player, GetCastDifficulty(), false);
-
- player->CastSpell(player, triggeredSpellId, aurEff);
- }
-
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- // 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);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_dru_travel_form_dummy_aura::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_dru_travel_form_dummy_aura::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 252216 - Tiger Dash
-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
-{
- void HandlePeriodic(AuraEffect const* aurEff)
- {
- if (AuraEffect* effRunSpeed = GetEffect(EFFECT_0))
- {
- int32 reduction = aurEff->GetAmount();
- effRunSpeed->ChangeAmount(effRunSpeed->GetAmount() - reduction);
- }
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_tiger_dash_aura::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 48438 - Wild Growth
-class spell_dru_wild_growth : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 }, { SPELL_DRUID_TREE_OF_LIFE, EFFECT_2 } });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets) const
- {
- Unit* caster = GetCaster();
- int32 maxTargets = GetEffectInfo(EFFECT_1).CalcValue(caster);
-
- if (AuraEffect const* treeOfLife = caster->GetAuraEffect(SPELL_DRUID_TREE_OF_LIFE, EFFECT_2))
- maxTargets += treeOfLife->GetAmount();
-
- // Note: Wild Growth became a smart heal which prioritizes players and their pets in their group before any unit outside their group.
- Trinity::SelectRandomInjuredTargets(targets, maxTargets, true, caster);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_wild_growth::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-class spell_dru_wild_growth_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_DRUID_RESTORATION_T10_2P_BONUS });
- }
-
- void HandleTickUpdate(AuraEffect* aurEff)
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- // calculate from base damage, not from aurEff->GetAmount() (already modified)
- float damage = caster->CalculateSpellDamage(GetUnitOwner(), aurEff->GetSpellEffectInfo());
-
- // 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_aura::HandleTickUpdate, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
- }
-};
-
-// 145108 - Ysera's Gift
-class spell_dru_yseras_gift : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_DRUID_YSERAS_GIFT_HEAL_SELF,
- SPELL_DRUID_YSERAS_GIFT_HEAL_PARTY
- });
- }
-
- void HandleEffectPeriodic(AuraEffect const* aurEff)
- {
- int32 healAmount = int32(GetTarget()->CountPctFromMaxHealth(aurEff->GetAmount()));
-
- if (!GetTarget()->IsFullHealth())
- GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_YSERAS_GIFT_HEAL_SELF, CastSpellExtraArgs(aurEff).AddSpellBP0(healAmount));
- else
- GetTarget()->CastSpell(GetTarget(), SPELL_DRUID_YSERAS_GIFT_HEAL_PARTY, CastSpellExtraArgs(aurEff).AddSpellBP0(healAmount));
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_dru_yseras_gift::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 145110 - Ysera's Gift (heal)
-class spell_dru_yseras_gift_group_heal : public SpellScript
-{
- void SelectTargets(std::list<WorldObject*>& targets)
- {
- Trinity::SelectRandomInjuredTargets(targets, 1, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dru_yseras_gift_group_heal::SelectTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID);
- }
-};
void AddSC_druid_spell_scripts()
{
- RegisterSpellScript(spell_dru_abundance);
- RegisterSpellScript(spell_dru_barkskin);
- RegisterSpellScript(spell_dru_berserk);
- RegisterSpellScript(spell_dru_brambles);
- RegisterSpellScript(spell_dru_bristling_fur);
- RegisterSpellScript(spell_dru_cat_form);
- RegisterSpellScript(spell_dru_cultivation);
- RegisterSpellScript(spell_dru_dash);
- RegisterSpellScript(spell_dru_earthwarden);
- RegisterSpellScript(spell_dru_eclipse_aura);
- RegisterSpellScript(spell_dru_eclipse_dummy);
- RegisterSpellScript(spell_dru_eclipse_ooc);
- RegisterSpellScript(spell_dru_efflorescence);
- RegisterSpellScript(spell_dru_efflorescence_dummy);
- RegisterSpellScript(spell_dru_efflorescence_heal);
- RegisterSpellScript(spell_dru_embrace_of_the_dream);
- RegisterSpellScript(spell_dru_embrace_of_the_dream_effect);
- RegisterSpellAndAuraScriptPair(spell_dru_entangling_roots, spell_dru_entangling_roots_aura);
- RegisterSpellScript(spell_dru_ferocious_bite);
- RegisterSpellScript(spell_dru_forms_trinket);
- RegisterSpellScript(spell_dru_galactic_guardian);
- RegisterSpellScript(spell_dru_germination);
- RegisterSpellScript(spell_dru_glyph_of_stars);
- RegisterSpellScript(spell_dru_gore);
- RegisterSpellScript(spell_dru_incapacitating_roar);
- RegisterSpellScript(spell_dru_incarnation);
- RegisterSpellScript(spell_dru_incarnation_tree_of_life);
- RegisterSpellScript(spell_dru_inner_peace);
- RegisterSpellScript(spell_dru_innervate);
- RegisterSpellScript(spell_dru_item_t6_trinket);
- RegisterSpellScript(spell_dru_lifebloom);
- RegisterSpellScript(spell_dru_lunar_inspiration);
- RegisterSpellScript(spell_dru_luxuriant_soil);
- RegisterSpellScript(spell_dru_moonfire);
- RegisterSpellScript(spell_dru_omen_of_clarity);
- RegisterSpellScript(spell_dru_power_of_the_archdruid);
- RegisterSpellScript(spell_dru_prowl);
- RegisterSpellScript(spell_dru_rip);
- RegisterSpellAndAuraScriptPair(spell_dru_savage_roar, spell_dru_savage_roar_aura);
- RegisterSpellScript(spell_dru_shooting_stars);
- RegisterSpellScript(spell_dru_skull_bash);
- RegisterSpellScript(spell_dru_spring_blossoms);
- RegisterSpellScript(spell_dru_stampeding_roar);
- RegisterSpellScript(spell_dru_starfall_dummy);
- RegisterSpellScript(spell_dru_sudden_ambush);
- RegisterSpellScript(spell_dru_sunfire);
- RegisterSpellScript(spell_dru_survival_instincts);
- RegisterSpellScript(spell_dru_swift_flight_passive);
- RegisterSpellScript(spell_dru_t3_6p_bonus);
- RegisterSpellScript(spell_dru_t3_8p_bonus);
- RegisterSpellScript(spell_dru_t4_2p_bonus);
- RegisterSpellScript(spell_dru_t10_balance_4p_bonus);
- RegisterSpellScript(spell_dru_t10_restoration_4p_bonus);
- RegisterSpellScript(spell_dru_t10_restoration_4p_bonus_dummy);
- RegisterSpellScript(spell_dru_thrash);
- RegisterSpellScript(spell_dru_thrash_aura);
- RegisterSpellScript(spell_dru_travel_form);
- RegisterSpellAndAuraScriptPair(spell_dru_travel_form_dummy, spell_dru_travel_form_dummy_aura);
- RegisterSpellAndAuraScriptPair(spell_dru_tiger_dash, spell_dru_tiger_dash_aura);
- RegisterSpellAndAuraScriptPair(spell_dru_wild_growth, spell_dru_wild_growth_aura);
- RegisterSpellScript(spell_dru_yseras_gift);
- RegisterSpellScript(spell_dru_yseras_gift_group_heal);
}
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 6947b847131..d1f231563b4 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -22,815 +22,7 @@
*/
#include "ScriptMgr.h"
-#include "CellImpl.h"
-#include "GridNotifiersImpl.h"
-#include "Pet.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-
-enum HunterSpells
-{
- SPELL_HUNTER_A_MURDER_OF_CROWS_DAMAGE = 131900,
- SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_1 = 131637,
- SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_2 = 131951,
- SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_3 = 131952,
- SPELL_HUNTER_ASPECT_CHEETAH_SLOW = 186258,
- SPELL_HUNTER_ASPECT_OF_THE_TURTLE_PACIFY_AURA = 205769,
- SPELL_HUNTER_EXHILARATION = 109304,
- SPELL_HUNTER_EXHILARATION_PET = 128594,
- SPELL_HUNTER_EXHILARATION_R2 = 231546,
- SPELL_HUNTER_EXPLOSIVE_SHOT_DAMAGE = 212680,
- SPELL_HUNTER_LATENT_POISON_STACK = 378015,
- SPELL_HUNTER_LATENT_POISON_DAMAGE = 378016,
- SPELL_HUNTER_LATENT_POISON_INJECTORS_STACK = 336903,
- SPELL_HUNTER_LATENT_POISON_INJECTORS_DAMAGE = 336904,
- SPELL_HUNTER_LONE_WOLF = 155228,
- SPELL_HUNTER_MASTERS_CALL_TRIGGERED = 62305,
- SPELL_HUNTER_MISDIRECTION = 34477,
- SPELL_HUNTER_MISDIRECTION_PROC = 35079,
- SPELL_HUNTER_MULTI_SHOT_FOCUS = 213363,
- SPELL_HUNTER_PET_LAST_STAND_TRIGGERED = 53479,
- SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,
- SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF = 55711,
- SPELL_HUNTER_POSTHASTE_INCREASE_SPEED = 118922,
- SPELL_HUNTER_POSTHASTE_TALENT = 109215,
- SPELL_HUNTER_RAPID_FIRE_DAMAGE = 257045,
- SPELL_HUNTER_RAPID_FIRE_ENERGIZE = 263585,
- SPELL_HUNTER_STEADY_SHOT_FOCUS = 77443,
- SPELL_HUNTER_T9_4P_GREATNESS = 68130,
- SPELL_HUNTER_T29_2P_MARKSMANSHIP_DAMAGE = 394371,
- SPELL_ROAR_OF_SACRIFICE_TRIGGERED = 67481
-};
-
-enum MiscSpells
-{
- SPELL_DRAENEI_GIFT_OF_THE_NAARU = 59543,
-};
-
-// 131894 - A Murder of Crows
-class spell_hun_a_murder_of_crows : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_HUNTER_A_MURDER_OF_CROWS_DAMAGE,
- SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_1,
- SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_2,
- SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_3
- });
- }
-
- void HandleDummyTick(AuraEffect const* /*aurEff*/)
- {
- Unit* target = GetTarget();
-
- if (Unit* caster = GetCaster())
- caster->CastSpell(target, SPELL_HUNTER_A_MURDER_OF_CROWS_DAMAGE, true);
-
- target->CastSpell(target, SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_1, true);
- target->CastSpell(target, SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_2, true);
- target->CastSpell(target, SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_3, true);
- target->CastSpell(target, SPELL_HUNTER_A_MURDER_OF_CROWS_VISUAL_3, true); // not a mistake, it is intended to cast twice
- }
-
- void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH)
- if (Unit* caster = GetCaster())
- caster->GetSpellHistory()->ResetCooldown(GetId(), true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_a_murder_of_crows::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- OnEffectRemove += AuraEffectRemoveFn(spell_hun_a_murder_of_crows::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 186257 - Aspect of the Cheetah
-class spell_hun_aspect_cheetah : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_HUNTER_ASPECT_CHEETAH_SLOW
- });
- }
-
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
- GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_ASPECT_CHEETAH_SLOW, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_hun_aspect_cheetah::HandleOnRemove, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 186265 - Aspect of the Turtle
-class spell_hun_aspect_of_the_turtle : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_ASPECT_OF_THE_TURTLE_PACIFY_AURA });
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_ASPECT_OF_THE_TURTLE_PACIFY_AURA, true);
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_HUNTER_ASPECT_OF_THE_TURTLE_PACIFY_AURA);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_hun_aspect_of_the_turtle::OnApply, EFFECT_0, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_hun_aspect_of_the_turtle::OnRemove, EFFECT_0, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 378750 - Cobra Sting
-class spell_hun_cobra_sting : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- bool RollProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*procInfo*/)
- {
- return roll_chance_i(GetEffect(EFFECT_1)->GetAmount());
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_hun_cobra_sting::RollProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 109304 - Exhilaration
-class spell_hun_exhilaration : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_EXHILARATION_R2, SPELL_HUNTER_LONE_WOLF });
- }
-
- void HandleOnHit()
- {
- if (GetCaster()->HasAura(SPELL_HUNTER_EXHILARATION_R2) && !GetCaster()->HasAura(SPELL_HUNTER_LONE_WOLF))
- GetCaster()->CastSpell(nullptr, SPELL_HUNTER_EXHILARATION_PET, true);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_hun_exhilaration::HandleOnHit);
- }
-};
-
-// 212431 - Explosive Shot
-class spell_hun_explosive_shot : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_EXPLOSIVE_SHOT_DAMAGE });
- }
-
- void HandlePeriodic(AuraEffect const* /*aurEff*/)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget(), SPELL_HUNTER_EXPLOSIVE_SHOT_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_explosive_shot::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 212658 - Hunting Party
-class spell_hun_hunting_party : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_HUNTER_EXHILARATION,
- SPELL_HUNTER_EXHILARATION_PET
- });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_HUNTER_EXHILARATION, -Seconds(aurEff->GetAmount()));
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_HUNTER_EXHILARATION_PET, -Seconds(aurEff->GetAmount()));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_hun_hunting_party::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 53478 - Last Stand Pet
-class spell_hun_last_stand_pet : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_PET_LAST_STAND_TRIGGERED });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellBP0(caster->CountPctFromMaxHealth(30));
- caster->CastSpell(caster, SPELL_HUNTER_PET_LAST_STAND_TRIGGERED, args);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_hun_last_stand_pet::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 378016 - Latent Poison
-class spell_hun_latent_poison_damage : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_LATENT_POISON_STACK });
- }
-
- void CalculateDamage()
- {
- if (Aura* stack = GetHitUnit()->GetAura(SPELL_HUNTER_LATENT_POISON_STACK, GetCaster()->GetGUID()))
- {
- SetHitDamage(GetHitDamage() * stack->GetStackAmount());
- stack->Remove();
- }
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_hun_latent_poison_damage::CalculateDamage);
- }
-};
-
-// 19434 - Aimed Shot
-// 186270 - Raptor Strike
-// 217200 - Barbed Shot
-// 259387 - Mongoose Bite
-class spell_hun_latent_poison_trigger : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_LATENT_POISON_STACK, SPELL_HUNTER_LATENT_POISON_DAMAGE });
- }
-
- void TriggerDamage()
- {
- if (GetHitUnit()->HasAura(SPELL_HUNTER_LATENT_POISON_STACK, GetCaster()->GetGUID()))
- GetCaster()->CastSpell(GetHitUnit(), SPELL_HUNTER_LATENT_POISON_DAMAGE, GetSpell());
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_hun_latent_poison_trigger::TriggerDamage);
- }
-};
-
-// 336904 - Latent Poison Injectors
-class spell_hun_latent_poison_injectors_damage : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_LATENT_POISON_INJECTORS_STACK });
- }
-
- void CalculateDamage()
- {
- if (Aura* stack = GetHitUnit()->GetAura(SPELL_HUNTER_LATENT_POISON_INJECTORS_STACK, GetCaster()->GetGUID()))
- {
- SetHitDamage(GetHitDamage() * stack->GetStackAmount());
- stack->Remove();
- }
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_hun_latent_poison_injectors_damage::CalculateDamage);
- }
-};
-
-// 186270 - Raptor Strike
-// 259387 - Mongoose Bite
-class spell_hun_latent_poison_injectors_trigger : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_LATENT_POISON_INJECTORS_STACK, SPELL_HUNTER_LATENT_POISON_INJECTORS_DAMAGE });
- }
-
- void TriggerDamage()
- {
- if (GetHitUnit()->HasAura(SPELL_HUNTER_LATENT_POISON_INJECTORS_STACK, GetCaster()->GetGUID()))
- GetCaster()->CastSpell(GetHitUnit(), SPELL_HUNTER_LATENT_POISON_INJECTORS_DAMAGE, GetSpell());
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_hun_latent_poison_injectors_trigger::TriggerDamage);
- }
-};
-
-// 53271 - Masters Call
-class spell_hun_masters_call : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } })
- && ValidateSpellInfo({ SPELL_HUNTER_MASTERS_CALL_TRIGGERED, uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- SpellCastResult DoCheckCast()
- {
- Guardian* pet = GetCaster()->ToPlayer()->GetGuardianPet();
- ASSERT(pet); // checked in Spell::CheckCast
-
- if (!pet->IsPet() || !pet->IsAlive())
- return SPELL_FAILED_NO_PET;
-
- // Do a mini Spell::CheckCasterAuras on the pet, no other way of doing this
- SpellCastResult result = SPELL_CAST_OK;
- uint32 const unitflag = pet->m_unitData->Flags;
- if (!pet->GetCharmerGUID().IsEmpty())
- result = SPELL_FAILED_CHARMED;
- else if (unitflag & UNIT_FLAG_STUNNED)
- result = SPELL_FAILED_STUNNED;
- else if (unitflag & UNIT_FLAG_FLEEING)
- result = SPELL_FAILED_FLEEING;
- else if (unitflag & UNIT_FLAG_CONFUSED)
- result = SPELL_FAILED_CONFUSED;
-
- if (result != SPELL_CAST_OK)
- return result;
-
- Unit* target = GetExplTargetUnit();
- if (!target)
- return SPELL_FAILED_BAD_TARGETS;
-
- if (!pet->IsWithinLOSInMap(target))
- return SPELL_FAILED_LINE_OF_SIGHT;
-
- return SPELL_CAST_OK;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->ToPlayer()->GetPet()->CastSpell(GetHitUnit(), GetEffectValue(), true);
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- GetHitUnit()->CastSpell(nullptr, SPELL_HUNTER_MASTERS_CALL_TRIGGERED, true);
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_hun_masters_call::DoCheckCast);
-
- OnEffectHitTarget += SpellEffectFn(spell_hun_masters_call::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnEffectHitTarget += SpellEffectFn(spell_hun_masters_call::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-// 34477 - Misdirection
-class spell_hun_misdirection : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_MISDIRECTION_PROC });
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEFAULT || GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_INTERRUPT)
- return;
-
- if (!GetTarget()->HasAura(SPELL_HUNTER_MISDIRECTION_PROC))
- GetTarget()->GetThreatManager().UnregisterRedirectThreat(SPELL_HUNTER_MISDIRECTION);
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, aurEff);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectProc += AuraEffectProcFn(spell_hun_misdirection::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 35079 - Misdirection (Proc)
-class spell_hun_misdirection_proc : public AuraScript
-{
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->GetThreatManager().UnregisterRedirectThreat(SPELL_HUNTER_MISDIRECTION);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_proc::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 2643 - Multi-Shot
-class spell_hun_multi_shot : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_MULTI_SHOT_FOCUS });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleOnHit()
- {
- // We need to check hunter's spec because it doesn't generate focus on other specs than MM
- if (GetCaster()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::HunterMarksmanship)
- GetCaster()->CastSpell(GetCaster(), SPELL_HUNTER_MULTI_SHOT_FOCUS, true);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_hun_multi_shot::HandleOnHit);
- }
-};
-
-// 55709 - Pet Heart of the Phoenix
-class spell_hun_pet_heart_of_the_phoenix : public SpellScript
-{
- bool Load() override
- {
- if (!GetCaster()->IsPet())
- return false;
- return true;
- }
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- if (Unit* owner = caster->GetOwner())
- {
- if (!caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF))
- {
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellBP0(100);
- owner->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, args);
- caster->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF, true);
- }
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_hun_pet_heart_of_the_phoenix::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-// 781 - Disengage
-class spell_hun_posthaste : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_POSTHASTE_TALENT, SPELL_HUNTER_POSTHASTE_INCREASE_SPEED });
- }
-
- void HandleAfterCast()
- {
- if (GetCaster()->HasAura(SPELL_HUNTER_POSTHASTE_TALENT))
- {
- GetCaster()->RemoveMovementImpairingAuras(true);
- GetCaster()->CastSpell(GetCaster(), SPELL_HUNTER_POSTHASTE_INCREASE_SPEED, GetSpell());
- }
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_hun_posthaste::HandleAfterCast);
- }
-};
-
-// 257044 - Rapid Fire
-class spell_hun_rapid_fire : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_RAPID_FIRE_DAMAGE });
- }
-
- void HandlePeriodic(AuraEffect const* /*aurEff*/)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget(), SPELL_HUNTER_RAPID_FIRE_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_hun_rapid_fire::HandlePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 257045 - Rapid Fire Damage
-class spell_hun_rapid_fire_damage : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_RAPID_FIRE_ENERGIZE });
- }
-
- void HandleHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(nullptr, SPELL_HUNTER_RAPID_FIRE_ENERGIZE, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_hun_rapid_fire_damage::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 53480 - Roar of Sacrifice
-class spell_hun_roar_of_sacrifice : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROAR_OF_SACRIFICE_TRIGGERED });
- }
-
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !(damageInfo->GetSchoolMask() & aurEff->GetMiscValue()))
- return false;
-
- if (!GetCaster())
- return false;
-
- return true;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()));
- eventInfo.GetActor()->CastSpell(GetCaster(), SPELL_ROAR_OF_SACRIFICE_TRIGGERED, args);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_hun_roar_of_sacrifice::CheckProc, EFFECT_1, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_hun_roar_of_sacrifice::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 37506 - Scatter Shot
-class spell_hun_scatter_shot : public SpellScript
-{
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Player* caster = GetCaster()->ToPlayer();
- // break Auto Shot and autohit
- caster->InterruptSpell(CURRENT_AUTOREPEAT_SPELL);
- caster->AttackStop();
- caster->SendAttackSwingCancelAttack();
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_hun_scatter_shot::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 56641 - Steady Shot
-class spell_hun_steady_shot : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_STEADY_SHOT_FOCUS });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleOnHit()
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_HUNTER_STEADY_SHOT_FOCUS, true);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_hun_steady_shot::HandleOnHit);
- }
-};
-
-// 1515 - Tame Beast
-class spell_hun_tame_beast : public SpellScript
-{
- static constexpr uint32 CallPetSpellIds[MAX_ACTIVE_PETS] =
- {
- 883,
- 83242,
- 83243,
- 83244,
- 83245,
- };
-
- SpellCastResult CheckCast()
- {
- Player* caster = GetCaster()->ToPlayer();
- if (!caster)
- return SPELL_FAILED_DONT_REPORT;
-
- if (!GetExplTargetUnit())
- return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
-
- if (Creature* target = GetExplTargetUnit()->ToCreature())
- {
- if (target->GetLevelForTarget(caster) > caster->GetLevel())
- return SPELL_FAILED_HIGHLEVEL;
-
- // use SMSG_PET_TAME_FAILURE?
- if (!target->GetCreatureTemplate()->IsTameable(caster->CanTameExoticPets(), target->GetCreatureDifficulty()))
- return SPELL_FAILED_BAD_TARGETS;
-
- if (PetStable const* petStable = caster->GetPetStable())
- {
- if (petStable->CurrentPetIndex)
- return SPELL_FAILED_ALREADY_HAVE_SUMMON;
-
- auto freeSlotItr = std::find_if(petStable->ActivePets.begin(), petStable->ActivePets.end(), [](Optional<PetStable::PetInfo> const& petInfo)
- {
- return !petInfo.has_value();
- });
-
- if (freeSlotItr == petStable->ActivePets.end())
- {
- caster->SendTameFailure(PetTameResult::TooMany);
- return SPELL_FAILED_DONT_REPORT;
- }
-
- // Check for known Call Pet X spells
- std::size_t freeSlotIndex = std::distance(petStable->ActivePets.begin(), freeSlotItr);
- if (!caster->HasSpell(CallPetSpellIds[freeSlotIndex]))
- {
- caster->SendTameFailure(PetTameResult::TooMany);
- return SPELL_FAILED_DONT_REPORT;
- }
- }
-
- if (!caster->GetCharmedGUID().IsEmpty())
- return SPELL_FAILED_ALREADY_HAVE_CHARM;
-
- if (!target->GetOwnerGUID().IsEmpty())
- {
- caster->SendTameFailure(PetTameResult::CreatureAlreadyOwned);
- return SPELL_FAILED_DONT_REPORT;
- }
- }
- else
- return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
-
- return SPELL_CAST_OK;
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_hun_tame_beast::CheckCast);
- }
-};
-
-// 67151 - Item - Hunter T9 4P Bonus (Steady Shot)
-class spell_hun_t9_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_HUNTER_T9_4P_GREATNESS });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (eventInfo.GetActor()->GetTypeId() == TYPEID_PLAYER && eventInfo.GetActor()->ToPlayer()->GetPet())
- return true;
- return false;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Unit* caster = eventInfo.GetActor();
-
- caster->CastSpell(caster->ToPlayer()->GetPet(), SPELL_HUNTER_T9_4P_GREATNESS, aurEff);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_hun_t9_4p_bonus::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_hun_t9_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 394366 - Find The Mark
-class spell_hun_t29_2p_marksmanship_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_HUNTER_T29_2P_MARKSMANSHIP_DAMAGE, EFFECT_0 } })
- && sSpellMgr->AssertSpellInfo(SPELL_HUNTER_T29_2P_MARKSMANSHIP_DAMAGE, DIFFICULTY_NONE)->GetMaxTicks();
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- Unit* caster = eventInfo.GetActor();
- uint32 ticks = sSpellMgr->AssertSpellInfo(SPELL_HUNTER_T29_2P_MARKSMANSHIP_DAMAGE, DIFFICULTY_NONE)->GetMaxTicks();
- uint32 damage = CalculatePct(eventInfo.GetDamageInfo()->GetOriginalDamage(), aurEff->GetAmount()) / ticks;
-
- caster->CastSpell(eventInfo.GetActionTarget(), SPELL_HUNTER_T29_2P_MARKSMANSHIP_DAMAGE, CastSpellExtraArgs(aurEff)
- .SetTriggeringSpell(eventInfo.GetProcSpell())
- .AddSpellMod(SPELLVALUE_BASE_POINT0, damage));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_hun_t29_2p_marksmanship_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
void AddSC_hunter_spell_scripts()
{
- RegisterSpellScript(spell_hun_a_murder_of_crows);
- RegisterSpellScript(spell_hun_aspect_cheetah);
- RegisterSpellScript(spell_hun_aspect_of_the_turtle);
- RegisterSpellScript(spell_hun_cobra_sting);
- RegisterSpellScript(spell_hun_exhilaration);
- RegisterSpellScript(spell_hun_explosive_shot);
- RegisterSpellScript(spell_hun_hunting_party);
- RegisterSpellScript(spell_hun_last_stand_pet);
- RegisterSpellScript(spell_hun_latent_poison_damage);
- RegisterSpellScript(spell_hun_latent_poison_trigger);
- RegisterSpellScript(spell_hun_latent_poison_injectors_damage);
- RegisterSpellScript(spell_hun_latent_poison_injectors_trigger);
- RegisterSpellScript(spell_hun_masters_call);
- RegisterSpellScript(spell_hun_misdirection);
- RegisterSpellScript(spell_hun_misdirection_proc);
- RegisterSpellScript(spell_hun_multi_shot);
- RegisterSpellScript(spell_hun_pet_heart_of_the_phoenix);
- RegisterSpellScript(spell_hun_posthaste);
- RegisterSpellScript(spell_hun_rapid_fire);
- RegisterSpellScript(spell_hun_rapid_fire_damage);
- RegisterSpellScript(spell_hun_roar_of_sacrifice);
- RegisterSpellScript(spell_hun_scatter_shot);
- RegisterSpellScript(spell_hun_steady_shot);
- RegisterSpellScript(spell_hun_tame_beast);
- RegisterSpellScript(spell_hun_t9_4p_bonus);
- RegisterSpellScript(spell_hun_t29_2p_marksmanship_bonus);
}
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index e28d8b88a88..2154ce7af9e 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -21,1542 +21,8 @@
* Scriptnames of files in this file should be prefixed with "spell_mage_".
*/
-#include "AreaTrigger.h"
-#include "AreaTriggerAI.h"
-#include "DB2Stores.h"
-#include "GridNotifiers.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
#include "ScriptMgr.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-#include "TemporarySummon.h"
-
-enum MageSpells
-{
- SPELL_MAGE_ALTER_TIME_AURA = 110909,
- SPELL_MAGE_ALTER_TIME_VISUAL = 347402,
- SPELL_MAGE_ARCANE_ALTER_TIME_AURA = 342246,
- SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE = 321529,
- SPELL_MAGE_ARCANE_BARRAGE_R3 = 321526,
- SPELL_MAGE_ARCANE_CHARGE = 36032,
- SPELL_MAGE_ARCANE_MAGE = 137021,
- SPELL_MAGE_BLAZING_BARRIER_TRIGGER = 235314,
- SPELL_MAGE_BLINK = 1953,
- SPELL_MAGE_BLIZZARD_DAMAGE = 190357,
- SPELL_MAGE_BLIZZARD_SLOW = 12486,
- SPELL_MAGE_CAUTERIZE_DOT = 87023,
- SPELL_MAGE_CAUTERIZED = 87024,
- SPELL_MAGE_CHILLED = 205708,
- SPELL_MAGE_COMET_STORM_DAMAGE = 153596,
- SPELL_MAGE_COMET_STORM_VISUAL = 228601,
- SPELL_MAGE_CONE_OF_COLD = 120,
- SPELL_MAGE_CONE_OF_COLD_SLOW = 212792,
- SPELL_MAGE_CONJURE_REFRESHMENT = 116136,
- SPELL_MAGE_CONJURE_REFRESHMENT_TABLE = 167145,
- SPELL_MAGE_DRAGONHAWK_FORM = 32818,
- SPELL_MAGE_ETHEREAL_BLINK = 410939,
- SPELL_MAGE_EVERWARM_SOCKS = 320913,
- SPELL_MAGE_FEEL_THE_BURN = 383391,
- SPELL_MAGE_FINGERS_OF_FROST = 44544,
- SPELL_MAGE_FIRE_BLAST = 108853,
- SPELL_MAGE_FLURRY_DAMAGE = 228596,
- SPELL_MAGE_FIRESTARTER = 205026,
- SPELL_MAGE_FROST_NOVA = 122,
- SPELL_MAGE_GIRAFFE_FORM = 32816,
- SPELL_MAGE_ICE_BARRIER = 11426,
- SPELL_MAGE_ICE_BLOCK = 45438,
- SPELL_MAGE_IGNITE = 12654,
- SPELL_MAGE_INCANTERS_FLOW = 116267,
- SPELL_MAGE_LIVING_BOMB_EXPLOSION = 44461,
- SPELL_MAGE_LIVING_BOMB_PERIODIC = 217694,
- SPELL_MAGE_MANA_SURGE = 37445,
- SPELL_MAGE_MASTER_OF_TIME = 342249,
- SPELL_MAGE_RADIANT_SPARK_PROC_BLOCKER = 376105,
- SPELL_MAGE_RAY_OF_FROST_BONUS = 208141,
- SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST = 269748,
- SPELL_MAGE_REVERBERATE = 281482,
- SPELL_MAGE_RING_OF_FROST_DUMMY = 91264,
- SPELL_MAGE_RING_OF_FROST_FREEZE = 82691,
- SPELL_MAGE_RING_OF_FROST_SUMMON = 113724,
- SPELL_MAGE_SERPENT_FORM = 32817,
- SPELL_MAGE_SHEEP_FORM = 32820,
- SPELL_MAGE_SHIMMER = 212653,
- SPELL_MAGE_SLOW = 31589,
- SPELL_MAGE_SQUIRREL_FORM = 32813,
- SPELL_MAGE_SUPERNOVA = 157980,
- SPELL_MAGE_WORGEN_FORM = 32819,
- SPELL_PET_NETHERWINDS_FATIGUED = 160455,
- SPELL_MAGE_ICE_LANCE_TRIGGER = 228598,
- SPELL_MAGE_THERMAL_VOID = 155149,
- SPELL_MAGE_ICY_VEINS = 12472,
- SPELL_MAGE_CHAIN_REACTION_DUMMY = 278309,
- SPELL_MAGE_CHAIN_REACTION = 278310,
- SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE = 210833,
- SPELL_MAGE_WINTERS_CHILL = 228358
-};
-
-// 110909 - Alter Time Aura
-// 342246 - Alter Time Aura
-class spell_mage_alter_time_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_MAGE_ALTER_TIME_VISUAL,
- SPELL_MAGE_MASTER_OF_TIME,
- SPELL_MAGE_BLINK,
- });
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* unit = GetTarget();
- _health = unit->GetHealth();
- _pos = unit->GetPosition();
- }
-
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* unit = GetTarget();
- if (unit->GetDistance(_pos) <= 100.0f && GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
- {
- unit->SetHealth(_health);
- unit->NearTeleportTo(_pos);
-
- if (unit->HasAura(SPELL_MAGE_MASTER_OF_TIME))
- {
- SpellInfo const* blink = sSpellMgr->AssertSpellInfo(SPELL_MAGE_BLINK, DIFFICULTY_NONE);
- unit->GetSpellHistory()->ResetCharges(blink->ChargeCategoryId);
- }
- unit->CastSpell(unit, SPELL_MAGE_ALTER_TIME_VISUAL);
- }
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_mage_alter_time_aura::OnApply, EFFECT_0, SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_alter_time_aura::AfterRemove, EFFECT_0, SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS, AURA_EFFECT_HANDLE_REAL);
- }
-
-private:
- uint64 _health = 0;
- Position _pos;
-};
-
-// 127140 - Alter Time Active
-// 342247 - Alter Time Active
-class spell_mage_alter_time_active : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_MAGE_ALTER_TIME_AURA,
- SPELL_MAGE_ARCANE_ALTER_TIME_AURA,
- });
- }
-
- void RemoveAlterTimeAura(SpellEffIndex /*effIndex*/)
- {
- Unit* unit = GetCaster();
- unit->RemoveAura(SPELL_MAGE_ALTER_TIME_AURA, ObjectGuid::Empty, 0, AURA_REMOVE_BY_EXPIRE);
- unit->RemoveAura(SPELL_MAGE_ARCANE_ALTER_TIME_AURA, ObjectGuid::Empty, 0, AURA_REMOVE_BY_EXPIRE);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_mage_alter_time_active::RemoveAlterTimeAura, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 44425 - Arcane Barrage
-class spell_mage_arcane_barrage : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_ARCANE_BARRAGE_R3, SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void ConsumeArcaneCharges()
- {
- Unit* caster = GetCaster();
-
- // Consume all arcane charges
- if (int32 arcaneCharges = -caster->ModifyPower(POWER_ARCANE_CHARGES, -caster->GetMaxPower(POWER_ARCANE_CHARGES), false))
- if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_MAGE_ARCANE_BARRAGE_R3, EFFECT_0, caster->GetGUID()))
- caster->CastSpell(caster, SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE, { SPELLVALUE_BASE_POINT0, arcaneCharges * auraEffect->GetAmount() / 100 });
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
- {
- if (GetHitUnit()->GetGUID() != _primaryTarget)
- SetHitDamage(CalculatePct(GetHitDamage(), GetEffectInfo(EFFECT_1).CalcValue(GetCaster())));
- }
-
- void MarkPrimaryTarget(SpellEffIndex /*effIndex*/)
- {
- _primaryTarget = GetHitUnit()->GetGUID();
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_barrage::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- OnEffectLaunchTarget += SpellEffectFn(spell_mage_arcane_barrage::MarkPrimaryTarget, EFFECT_1, SPELL_EFFECT_DUMMY);
- AfterCast += SpellCastFn(spell_mage_arcane_barrage::ConsumeArcaneCharges);
- }
-
- ObjectGuid _primaryTarget;
-};
-
-// 195302 - Arcane Charge
-class spell_mage_arcane_charge_clear : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_ARCANE_CHARGE });
- }
-
- void RemoveArcaneCharge(SpellEffIndex /*effIndex*/)
- {
- GetHitUnit()->RemoveAurasDueToSpell(SPELL_MAGE_ARCANE_CHARGE);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_charge_clear::RemoveArcaneCharge, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 1449 - Arcane Explosion
-class spell_mage_arcane_explosion : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- if (!ValidateSpellInfo({ SPELL_MAGE_ARCANE_MAGE, SPELL_MAGE_REVERBERATE }))
- return false;
-
- if (!ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }))
- return false;
-
- return spellInfo->GetEffect(EFFECT_1).IsEffect(SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-
- void CheckRequiredAuraForBaselineEnergize(SpellEffIndex effIndex)
- {
- if (!GetUnitTargetCountForEffect(EFFECT_1) || !GetCaster()->HasAura(SPELL_MAGE_ARCANE_MAGE))
- PreventHitDefaultEffect(effIndex);
- }
-
- void HandleReverberate(SpellEffIndex effIndex)
- {
- bool procTriggered = [&]()
- {
- Unit const* caster = GetCaster();
- AuraEffect const* triggerChance = caster->GetAuraEffect(SPELL_MAGE_REVERBERATE, EFFECT_0);
- if (!triggerChance)
- return false;
-
- AuraEffect const* requiredTargets = caster->GetAuraEffect(SPELL_MAGE_REVERBERATE, EFFECT_1);
- if (!requiredTargets)
- return false;
-
- return GetUnitTargetCountForEffect(EFFECT_1) >= requiredTargets->GetAmount() && roll_chance_i(triggerChance->GetAmount());
- }();
-
- if (!procTriggered)
- PreventHitDefaultEffect(effIndex);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_explosion::CheckRequiredAuraForBaselineEnergize, EFFECT_0, SPELL_EFFECT_ENERGIZE);
- OnEffectHitTarget += SpellEffectFn(spell_mage_arcane_explosion::HandleReverberate, EFFECT_2, SPELL_EFFECT_ENERGIZE);
- }
-};
-
-// 235313 - Blazing Barrier
-class spell_mage_blazing_barrier : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_BLAZING_BARRIER_TRIGGER });
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
- if (Unit* caster = GetCaster())
- amount = int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f);
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Unit* caster = eventInfo.GetDamageInfo()->GetVictim();
- Unit* target = eventInfo.GetDamageInfo()->GetAttacker();
-
- if (caster && target)
- caster->CastSpell(target, SPELL_MAGE_BLAZING_BARRIER_TRIGGER, true);
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_blazing_barrier::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectProc += AuraEffectProcFn(spell_mage_blazing_barrier::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 190356 - Blizzard
-// 4658 - AreaTrigger Create Properties
-struct areatrigger_mage_blizzard : AreaTriggerAI
-{
- areatrigger_mage_blizzard(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger), _tickTimer(TICK_PERIOD) { }
-
- static constexpr Milliseconds TICK_PERIOD = Milliseconds(1000);
-
- void OnUpdate(uint32 diff) override
- {
- _tickTimer -= Milliseconds(diff);
-
- while (_tickTimer <= 0s)
- {
- if (Unit* caster = at->GetCaster())
- caster->CastSpell(at->GetPosition(), SPELL_MAGE_BLIZZARD_DAMAGE);
-
- _tickTimer += TICK_PERIOD;
- }
- }
-
-private:
- Milliseconds _tickTimer;
-};
-
-// 190357 - Blizzard (Damage)
-class spell_mage_blizzard_damage : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_BLIZZARD_SLOW });
- }
-
- void HandleSlow(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_BLIZZARD_SLOW, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_blizzard_damage::HandleSlow, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 198063 - Burning Determination
-class spell_mage_burning_determination : public AuraScript
-{
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo())
- if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE)))
- return true;
-
- return false;
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_mage_burning_determination::CheckProc);
- }
-};
-
-// 86949 - Cauterize
-class spell_mage_cauterize : public SpellScript
-{
- void SuppressSpeedBuff(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_mage_cauterize::SuppressSpeedBuff, EFFECT_2, SPELL_EFFECT_TRIGGER_SPELL);
- }
-};
-
-class spell_mage_cauterize_AuraScript : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } }) && ValidateSpellInfo
- ({
- SPELL_MAGE_CAUTERIZE_DOT,
- SPELL_MAGE_CAUTERIZED,
- spellInfo->GetEffect(EFFECT_2).TriggerSpell
- });
- }
-
- void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& /*absorbAmount*/)
- {
- AuraEffect const* effect1 = GetEffect(EFFECT_1);
- if (!effect1 ||
- !GetTargetApplication()->HasEffect(EFFECT_1) ||
- dmgInfo.GetDamage() < GetTarget()->GetHealth() ||
- dmgInfo.GetDamage() > GetTarget()->GetMaxHealth() * 2 ||
- GetTarget()->HasAura(SPELL_MAGE_CAUTERIZED))
- {
- PreventDefaultAction();
- return;
- }
-
- GetTarget()->SetHealth(GetTarget()->CountPctFromMaxHealth(effect1->GetAmount()));
- GetTarget()->CastSpell(GetTarget(), GetEffectInfo(EFFECT_2).TriggerSpell, TRIGGERED_FULL_MASK);
- GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_CAUTERIZE_DOT, TRIGGERED_FULL_MASK);
- GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_CAUTERIZED, TRIGGERED_FULL_MASK);
- }
-
- void Register() override
- {
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_cauterize_AuraScript::HandleAbsorb, EFFECT_0);
- }
-};
-
-// 235219 - Cold Snap
-class spell_mage_cold_snap : public SpellScript
-{
- static uint32 constexpr SpellsToReset[] =
- {
- SPELL_MAGE_CONE_OF_COLD,
- SPELL_MAGE_ICE_BARRIER,
- SPELL_MAGE_ICE_BLOCK,
- };
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(SpellsToReset) && ValidateSpellInfo({ SPELL_MAGE_FROST_NOVA });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- for (uint32 spellId : SpellsToReset)
- GetCaster()->GetSpellHistory()->ResetCooldown(spellId, true);
-
- GetCaster()->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FROST_NOVA, GetCastDifficulty())->ChargeCategoryId);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_mage_cold_snap::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-class CometStormEvent : public BasicEvent
-{
-public:
- CometStormEvent(Unit* caster, ObjectGuid originalCastId, Position const& dest) : _caster(caster), _originalCastId(originalCastId), _dest(dest), _count(0) { }
-
- bool Execute(uint64 time, uint32 /*diff*/) override
- {
- Position destPosition = {_dest.GetPositionX() + frand(-3.0f, 3.0f), _dest.GetPositionY() + frand(-3.0f, 3.0f), _dest.GetPositionZ()};
- _caster->CastSpell(destPosition, SPELL_MAGE_COMET_STORM_VISUAL,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetOriginalCastId(_originalCastId));
- ++_count;
-
- if (_count >= 7)
- return true;
-
- _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(100ms, 275ms));
- return false;
- }
-
-private:
- Unit* _caster;
- ObjectGuid _originalCastId;
- Position _dest;
- uint8 _count;
-};
-
-// 153595 - Comet Storm (launch)
-class spell_mage_comet_storm : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_COMET_STORM_VISUAL });
- }
-
- void EffectHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->m_Events.AddEventAtOffset(new CometStormEvent(GetCaster(), GetSpell()->m_castId, *GetHitDest()), randtime(100ms, 275ms));
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_mage_comet_storm::EffectHit, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 228601 - Comet Storm (damage)
-class spell_mage_comet_storm_damage : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_COMET_STORM_DAMAGE });
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(*GetHitDest(), SPELL_MAGE_COMET_STORM_DAMAGE,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetOriginalCastId(GetSpell()->m_originalCastId));
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_mage_comet_storm_damage::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 120 - Cone of Cold
-class spell_mage_cone_of_cold : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_CONE_OF_COLD_SLOW });
- }
-
- void HandleSlow(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_CONE_OF_COLD_SLOW, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold::HandleSlow, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 190336 - Conjure Refreshment
-class spell_mage_conjure_refreshment : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_MAGE_CONJURE_REFRESHMENT,
- SPELL_MAGE_CONJURE_REFRESHMENT_TABLE
- });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- if (Player* caster = GetCaster()->ToPlayer())
- {
- Group* group = caster->GetGroup();
- if (group)
- caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE, true);
- else
- caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT, true);
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 410939 - Ethereal Blink
-class spell_mage_ethereal_blink : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_BLINK, SPELL_MAGE_SHIMMER });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- PreventDefaultAction();
-
- // this proc only works for players because teleport relocation happens after an ACK
- GetTarget()->CastSpell(*procInfo.GetProcSpell()->m_targets.GetDst(), aurEff->GetSpellEffectInfo().TriggerSpell, CastSpellExtraArgs(aurEff)
- .SetTriggeringSpell(procInfo.GetProcSpell())
- .SetCustomArg(GetTarget()->GetPosition()));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_mage_ethereal_blink::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 410941 - Ethereal Blink
-class spell_mage_ethereal_blink_triggered : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_BLINK, SPELL_MAGE_SHIMMER, SPELL_MAGE_SLOW })
- && ValidateSpellEffect({ { SPELL_MAGE_ETHEREAL_BLINK, EFFECT_3 } });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Position const* src = std::any_cast<Position>(&GetSpell()->m_customArg);
- WorldLocation const* dst = GetExplTargetDest();
- if (!src || !dst)
- {
- targets.clear();
- return;
- }
-
- targets.remove_if([&](WorldObject* target)
- {
- return !target->IsInBetween(*src, *dst, (target->GetCombatReach() + GetCaster()->GetCombatReach()) / 2.0f);
- });
-
- AuraEffect const* reductionEffect = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_2);
- if (!reductionEffect)
- return;
-
- Seconds reduction = Seconds(reductionEffect->GetAmount()) * targets.size();
-
- if (AuraEffect const* cap = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_3))
- if (reduction > Seconds(cap->GetAmount()))
- reduction = Seconds(cap->GetAmount());
-
- if (reduction > 0s)
- {
- GetCaster()->GetSpellHistory()->ModifyCooldown(SPELL_MAGE_BLINK, -reduction);
- GetCaster()->GetSpellHistory()->ModifyCooldown(SPELL_MAGE_SHIMMER, -reduction);
- }
- }
-
- void TriggerSlow(SpellEffIndex /*effIndex*/)
- {
- int32 effectivenessPct = 100;
- if (AuraEffect const* effectivenessEffect = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_1))
- effectivenessPct = effectivenessEffect->GetAmount();
-
- int32 slowPct = sSpellMgr->AssertSpellInfo(SPELL_MAGE_SLOW, DIFFICULTY_NONE)->GetEffect(EFFECT_0).CalcBaseValue(GetCaster(), GetHitUnit());
- ApplyPct(slowPct, effectivenessPct);
-
- GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_SLOW, CastSpellExtraArgs(GetSpell())
- .AddSpellMod(SPELLVALUE_BASE_POINT0, slowPct));
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_ethereal_blink_triggered::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
- OnEffectHitTarget += SpellEffectFn(spell_mage_ethereal_blink_triggered::TriggerSlow, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 383395 - Feel the Burn
-class spell_mage_feel_the_burn : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_FEEL_THE_BURN });
- }
-
- void CalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- if (Unit* caster = GetCaster())
- if (AuraEffect const* valueHolder = caster->GetAuraEffect(SPELL_MAGE_FEEL_THE_BURN, EFFECT_0))
- amount = valueHolder->GetAmount();
-
- canBeRecalculated = false;
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_feel_the_burn::CalcAmount, EFFECT_0, SPELL_AURA_MASTERY);
- }
-};
-
-// 112965 - Fingers of Frost
-class spell_mage_fingers_of_frost : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_FINGERS_OF_FROST });
- }
-
- bool CheckFrostboltProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_MAGE, flag128(0, 0x2000000, 0, 0))
- && roll_chance_i(aurEff->GetAmount());
- }
-
- bool CheckFrozenOrbProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_MAGE, flag128(0, 0, 0x80, 0))
- && roll_chance_i(aurEff->GetAmount());
- }
-
- void Trigger(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- eventInfo.GetActor()->CastSpell(GetTarget(), SPELL_MAGE_FINGERS_OF_FROST, aurEff);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_mage_fingers_of_frost::CheckFrostboltProc, EFFECT_0, SPELL_AURA_DUMMY);
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_mage_fingers_of_frost::CheckFrozenOrbProc, EFFECT_1, SPELL_AURA_DUMMY);
- AfterEffectProc += AuraEffectProcFn(spell_mage_fingers_of_frost::Trigger, EFFECT_0, SPELL_AURA_DUMMY);
- AfterEffectProc += AuraEffectProcFn(spell_mage_fingers_of_frost::Trigger, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 133 - Fireball
-// 11366 - Pyroblast
-class spell_mage_firestarter : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_FIRESTARTER });
- }
-
- void CalcCritChance(Unit const* victim, float& critChance)
- {
- if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
- if (victim->GetHealthPct() >= aurEff->GetAmount())
- critChance = 100.0f;
- }
-
- void Register() override
- {
- OnCalcCritChance += SpellOnCalcCritChanceFn(spell_mage_firestarter::CalcCritChance);
- }
-};
-
-// 321712 - Pyroblast
-class spell_mage_firestarter_dots : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_FIRESTARTER });
- }
-
- void CalcCritChance(AuraEffect const* /*aurEff*/, Unit const* victim, float& critChance)
- {
- if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
- if (victim->GetHealthPct() >= aurEff->GetAmount())
- critChance = 100.0f;
- }
-
- void Register() override
- {
- DoEffectCalcCritChance += AuraEffectCalcCritChanceFn(spell_mage_firestarter_dots::CalcCritChance, EFFECT_ALL, SPELL_AURA_PERIODIC_DAMAGE);
- }
-};
-
-// 205029 - Flame On
-class spell_mage_flame_on : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_FIRE_BLAST })
- && sSpellCategoryStore.HasRecord(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
- amount = -GetPctOf(GetEffectInfo(EFFECT_2).CalcValue() * IN_MILLISECONDS, sSpellCategoryStore.AssertEntry(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)->ChargeRecoveryTime);
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_flame_on::CalculateAmount, EFFECT_1, SPELL_AURA_CHARGE_RECOVERY_MULTIPLIER);
- }
-};
-
-// 44614 - Flurry
-class spell_mage_flurry : public SpellScript
-{
- class FlurryEvent : public BasicEvent
- {
- public:
- FlurryEvent(Unit* caster, ObjectGuid const& target, ObjectGuid const& originalCastId, int32 count)
- : _caster(caster), _target(target), _originalCastId(originalCastId), _count(count) { }
-
- bool Execute(uint64 time, uint32 /*diff*/) override
- {
- Unit* target = ObjectAccessor::GetUnit(*_caster, _target);
-
- if (!target)
- return true;
-
- _caster->CastSpell(target, SPELL_MAGE_FLURRY_DAMAGE, CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetOriginalCastId(_originalCastId));
-
- if (!--_count)
- return true;
-
- _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(300ms, 400ms));
- return false;
- }
-
- private:
- Unit* _caster;
- ObjectGuid _target;
- ObjectGuid _originalCastId;
- int32 _count;
- };
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_FLURRY_DAMAGE });
- }
-
- void EffectHit(SpellEffIndex /*effIndex*/) const
- {
- GetCaster()->m_Events.AddEventAtOffset(new FlurryEvent(GetCaster(), GetHitUnit()->GetGUID(), GetSpell()->m_castId, GetEffectValue() - 1), randtime(300ms, 400ms));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_flurry::EffectHit, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 228354 - Flurry (damage)
-class spell_mage_flurry_damage : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_WINTERS_CHILL });
- }
-
- void HandleDamage(SpellEffIndex /*effIndex*/) const
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_WINTERS_CHILL, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_flurry_damage::HandleDamage, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 116 - Frostbolt
-class spell_mage_frostbolt : public SpellScript
-{
- bool Validate(SpellInfo const* /*spell*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_CHILLED });
- }
-
- void HandleChilled()
- {
- if (Unit* target = GetHitUnit())
- GetCaster()->CastSpell(target, SPELL_MAGE_CHILLED, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_mage_frostbolt::HandleChilled);
- }
-};
-
-// 386737 - Hyper Impact
-class spell_mage_hyper_impact : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_SUPERNOVA });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MAGE_SUPERNOVA, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_mage_hyper_impact::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 11426 - Ice Barrier
-class spell_mage_ice_barrier : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_MAGE_CHILLED
- });
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
- if (Unit* caster = GetCaster())
- amount += int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 10.0f);
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- Unit* caster = eventInfo.GetDamageInfo()->GetVictim();
- Unit* target = eventInfo.GetDamageInfo()->GetAttacker();
-
- if (caster && target)
- caster->CastSpell(target, SPELL_MAGE_CHILLED, true);
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectProc += AuraEffectProcFn(spell_mage_ice_barrier::HandleProc, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- }
-};
-
-// 45438 - Ice Block
-class spell_mage_ice_block : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_EVERWARM_SOCKS });
- }
-
- void PreventStunWithEverwarmSocks(WorldObject*& target)
- {
- if (GetCaster()->HasAura(SPELL_MAGE_EVERWARM_SOCKS))
- target = nullptr;
- }
-
- void PreventEverwarmSocks(WorldObject*& target)
- {
- if (!GetCaster()->HasAura(SPELL_MAGE_EVERWARM_SOCKS))
- target = nullptr;
- }
-
- void Register() override
- {
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_mage_ice_block::PreventStunWithEverwarmSocks, EFFECT_0, TARGET_UNIT_CASTER);
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_mage_ice_block::PreventEverwarmSocks, EFFECT_5, TARGET_UNIT_CASTER);
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_mage_ice_block::PreventEverwarmSocks, EFFECT_6, TARGET_UNIT_CASTER);
- }
-};
-
-// Ice Lance - 30455
-class spell_mage_ice_lance : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_MAGE_ICE_LANCE_TRIGGER,
- SPELL_MAGE_THERMAL_VOID,
- SPELL_MAGE_ICY_VEINS,
- SPELL_MAGE_CHAIN_REACTION_DUMMY,
- SPELL_MAGE_CHAIN_REACTION,
- SPELL_MAGE_FINGERS_OF_FROST
- });
- }
-
- void IndexTarget(SpellEffIndex /*effIndex*/)
- {
- _orderedTargets.push_back(GetHitUnit()->GetGUID());
- }
-
- void HandleOnHit(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- std::ptrdiff_t index = std::distance(_orderedTargets.begin(), std::find(_orderedTargets.begin(), _orderedTargets.end(), target->GetGUID()));
-
- if (index == 0 // only primary target triggers these benefits
- && target->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), caster))
- {
- // Thermal Void
- if (Aura const* thermalVoid = caster->GetAura(SPELL_MAGE_THERMAL_VOID))
- if (!thermalVoid->GetSpellInfo()->GetEffects().empty())
- if (Aura* icyVeins = caster->GetAura(SPELL_MAGE_ICY_VEINS))
- icyVeins->SetDuration(icyVeins->GetDuration() + thermalVoid->GetSpellInfo()->GetEffect(EFFECT_0).CalcValue(caster) * IN_MILLISECONDS);
-
- // Chain Reaction
- if (caster->HasAura(SPELL_MAGE_CHAIN_REACTION_DUMMY))
- caster->CastSpell(caster, SPELL_MAGE_CHAIN_REACTION, true);
- }
-
- // put target index for chain value multiplier into EFFECT_1 base points, otherwise triggered spell doesn't know which damage multiplier to apply
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.AddSpellMod(SPELLVALUE_BASE_POINT1, index);
- caster->CastSpell(target, SPELL_MAGE_ICE_LANCE_TRIGGER, args);
- }
-
- void Register() override
- {
- OnEffectLaunchTarget += SpellEffectFn(spell_mage_ice_lance::IndexTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- OnEffectHitTarget += SpellEffectFn(spell_mage_ice_lance::HandleOnHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-
- std::vector<ObjectGuid> _orderedTargets;
-};
-
-// 228598 - Ice Lance
-class spell_mage_ice_lance_damage : public SpellScript
-{
- void ApplyDamageMultiplier(SpellEffIndex /*effIndex*/)
- {
- SpellValue const* spellValue = GetSpellValue();
- if (spellValue->CustomBasePointsMask & (1 << EFFECT_1))
- {
- int32 originalDamage = GetHitDamage();
- float targetIndex = float(spellValue->EffectBasePoints[EFFECT_1]);
- float multiplier = std::pow(GetEffectInfo().CalcDamageMultiplier(GetCaster(), GetSpell()), targetIndex);
- SetHitDamage(int32(originalDamage * multiplier));
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_ice_lance_damage::ApplyDamageMultiplier, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 12846 - Ignite
-class spell_mage_ignite : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_IGNITE });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- return eventInfo.GetProcTarget() != nullptr;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- SpellInfo const* igniteDot = sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE, GetCastDifficulty());
- int32 pct = aurEff->GetAmount();
-
- ASSERT(igniteDot->GetMaxTicks() > 0);
- int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks());
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, amount);
- GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_IGNITE, args);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_mage_ignite::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_mage_ignite::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 37447 - Improved Mana Gems
-// 61062 - Improved Mana Gems
-class spell_mage_imp_mana_gems : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_MANA_SURGE });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- eventInfo.GetActor()->CastSpell(nullptr, SPELL_MAGE_MANA_SURGE, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_mage_imp_mana_gems::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 1463 - Incanter's Flow
-class spell_mage_incanters_flow : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_INCANTERS_FLOW });
- }
-
- void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
- {
- // Incanter's flow should not cycle out of combat
- if (!GetTarget()->IsInCombat())
- return;
-
- if (Aura* aura = GetTarget()->GetAura(SPELL_MAGE_INCANTERS_FLOW))
- {
- uint32 stacks = aura->GetStackAmount();
-
- // Force always to values between 1 and 5
- if ((modifier == -1 && stacks == 1) || (modifier == 1 && stacks == 5))
- {
- modifier *= -1;
- return;
- }
-
- aura->ModStackAmount(modifier);
- }
- else
- GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_FLOW, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_incanters_flow::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-
-private:
- int8 modifier = 1;
-};
-
-// 44457 - Living Bomb
-class spell_mage_living_bomb : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_PERIODIC });
- }
-
- void HandleDummy(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_LIVING_BOMB_PERIODIC, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT2, 1));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_living_bomb::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 44461 - Living Bomb
-class spell_mage_living_bomb_explosion : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return spellInfo->NeedsExplicitUnitTarget() && ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_PERIODIC });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- targets.remove(GetExplTargetWorldObject());
- }
-
- void HandleSpread(SpellEffIndex /*effIndex*/)
- {
- if (GetSpellValue()->EffectBasePoints[EFFECT_0] > 0)
- GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_LIVING_BOMB_PERIODIC, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT2, 0));
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_living_bomb_explosion::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
- OnEffectHitTarget += SpellEffectFn(spell_mage_living_bomb_explosion::HandleSpread, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 217694 - Living Bomb
-class spell_mage_living_bomb_periodic : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_EXPLOSION });
- }
-
- void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
- return;
-
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget(), SPELL_MAGE_LIVING_BOMB_EXPLOSION, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()));
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_periodic::AfterRemove, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-enum SilvermoonPolymorph
-{
- NPC_AUROSALIA = 18744
-};
-
-/// @todo move out of here and rename - not a mage spell
-// 32826 - Polymorph (Visual)
-class spell_mage_polymorph_visual : public SpellScript
-{
- static const uint32 PolymorhForms[6];
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(PolymorhForms);
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f))
- if (target->GetTypeId() == TYPEID_UNIT)
- target->CastSpell(target, PolymorhForms[urand(0, 5)], true);
- }
-
- void Register() override
- {
- // add dummy effect spell handler to Polymorph visual
- OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_visual::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-uint32 const spell_mage_polymorph_visual::PolymorhForms[6] =
-{
- SPELL_MAGE_SQUIRREL_FORM,
- SPELL_MAGE_GIRAFFE_FORM,
- SPELL_MAGE_SERPENT_FORM,
- SPELL_MAGE_DRAGONHAWK_FORM,
- SPELL_MAGE_WORGEN_FORM,
- SPELL_MAGE_SHEEP_FORM
-};
-
-// 235450 - Prismatic Barrier
-class spell_mage_prismatic_barrier : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_5 } });
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
- if (Unit* caster = GetCaster())
- amount = int32(CalculatePct(caster->GetMaxHealth(), GetEffectInfo(EFFECT_5).CalcValue(caster)));
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_prismatic_barrier::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- }
-};
-
-// 376103 - Radiant Spark
-class spell_mage_radiant_spark : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_RADIANT_SPARK_PROC_BLOCKER });
- }
-
- bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
- {
- return !procInfo.GetProcTarget()->HasAura(SPELL_MAGE_RADIANT_SPARK_PROC_BLOCKER, GetCasterGUID());
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- Aura* vulnerability = procInfo.GetProcTarget()->GetAura(aurEff->GetSpellEffectInfo().TriggerSpell, GetCasterGUID());
- if (vulnerability && vulnerability->GetStackAmount() == vulnerability->CalcMaxStackAmount())
- {
- PreventDefaultAction();
- vulnerability->Remove();
- GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_RADIANT_SPARK_PROC_BLOCKER, true);
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_mage_radiant_spark::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 205021 - Ray of Frost
-class spell_mage_ray_of_frost : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo ({ SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST });
- }
-
- void HandleOnHit()
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(caster, SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_mage_ray_of_frost::HandleOnHit);
- }
-};
-
-class spell_mage_ray_of_frost_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo ({ SPELL_MAGE_RAY_OF_FROST_BONUS, SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST });
- }
-
- void HandleEffectPeriodic(AuraEffect const* aurEff)
- {
- if (Unit* caster = GetCaster())
- {
- if (aurEff->GetTickNumber() > 1) // First tick should deal base damage
- caster->CastSpell(caster, SPELL_MAGE_RAY_OF_FROST_BONUS, true);
- }
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- caster->RemoveAurasDueToSpell(SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_ray_of_frost_aura::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ray_of_frost_aura::OnRemove, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 136511 - Ring of Frost
-class spell_mage_ring_of_frost : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_SUMMON, SPELL_MAGE_RING_OF_FROST_FREEZE })
- && ValidateSpellEffect({ { SPELL_MAGE_RING_OF_FROST_SUMMON, EFFECT_0 } });
- }
-
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
- {
- if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
- GetTarget()->CastSpell(ringOfFrost->GetPosition(), SPELL_MAGE_RING_OF_FROST_FREEZE, true);
- }
-
- void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- std::list<TempSummon*> minions;
- GetTarget()->GetAllMinionsByEntry(minions, sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON, GetCastDifficulty())->GetEffect(EFFECT_0).MiscValue);
-
- // Get the last summoned RoF, save it and despawn older ones
- for (TempSummon* summon : minions)
- {
- if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
- {
- if (summon->GetTimer() > ringOfFrost->GetTimer())
- {
- ringOfFrost->DespawnOrUnsummon();
- _ringOfFrostGUID = summon->GetGUID();
- }
- else
- summon->DespawnOrUnsummon();
- }
- else
- _ringOfFrostGUID = summon->GetGUID();
- }
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_ring_of_frost::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- OnEffectApply += AuraEffectApplyFn(spell_mage_ring_of_frost::Apply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- }
-
-private:
- TempSummon* GetRingOfFrostMinion() const
- {
- if (Creature* creature = ObjectAccessor::GetCreature(*GetOwner(), _ringOfFrostGUID))
- return creature->ToTempSummon();
- return nullptr;
- }
-
- ObjectGuid _ringOfFrostGUID;
-};
-
-// 82691 - Ring of Frost (freeze efect)
-class spell_mage_ring_of_frost_freeze : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_SUMMON, SPELL_MAGE_RING_OF_FROST_FREEZE })
- && ValidateSpellEffect({ { SPELL_MAGE_RING_OF_FROST_SUMMON, EFFECT_0 } });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- WorldLocation const* dest = GetExplTargetDest();
- float outRadius = sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON, GetCastDifficulty())->GetEffect(EFFECT_0).CalcRadius(nullptr, SpellTargetIndex::TargetB);
- float inRadius = 6.5f;
-
- targets.remove_if([dest, outRadius, inRadius](WorldObject* target)
- {
- Unit* unit = target->ToUnit();
- if (!unit)
- return true;
- return unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || unit->GetExactDist(dest) > outRadius || unit->GetExactDist(dest) < inRadius;
- });
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_ring_of_frost_freeze::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
- }
-};
-
-class spell_mage_ring_of_frost_freeze_AuraScript : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_DUMMY });
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
- if (GetCaster())
- GetCaster()->CastSpell(GetTarget(), SPELL_MAGE_RING_OF_FROST_DUMMY, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ring_of_frost_freeze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 157980 - Supernova
-class spell_mage_supernova : public SpellScript
-{
- void HandleDamage(SpellEffIndex /*effIndex*/)
- {
- if (GetExplTargetUnit() == GetHitUnit())
- {
- uint32 damage = GetHitDamage();
- AddPct(damage, GetEffectInfo(EFFECT_0).CalcValue());
- SetHitDamage(damage);
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_mage_supernova::HandleDamage, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 210824 - Touch of the Magi (Aura)
-class spell_mage_touch_of_the_magi_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (damageInfo)
- {
- if (damageInfo->GetAttacker() == GetCaster() && damageInfo->GetVictim() == GetTarget())
- {
- uint32 extra = CalculatePct(damageInfo->GetDamage(), 25);
- if (extra > 0)
- aurEff->ChangeAmount(aurEff->GetAmount() + extra);
- }
- }
- }
-
- void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- int32 amount = aurEff->GetAmount();
- if (!amount || GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
- return;
-
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget(), SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, amount));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_mage_touch_of_the_magi_aura::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_touch_of_the_magi_aura::AfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 33395 Water Elemental's Freeze
-class spell_mage_water_elemental_freeze : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MAGE_FINGERS_OF_FROST });
- }
-
- void HandleImprovedFreeze()
- {
- Unit* owner = GetCaster()->GetOwner();
- if (!owner)
- return;
-
- owner->CastSpell(owner, SPELL_MAGE_FINGERS_OF_FROST, true);
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_mage_water_elemental_freeze::HandleImprovedFreeze);
- }
-};
void AddSC_mage_spell_scripts()
{
- RegisterSpellScript(spell_mage_alter_time_aura);
- RegisterSpellScript(spell_mage_alter_time_active);
- RegisterSpellScript(spell_mage_arcane_barrage);
- RegisterSpellScript(spell_mage_arcane_charge_clear);
- RegisterSpellScript(spell_mage_arcane_explosion);
- RegisterSpellScript(spell_mage_blazing_barrier);
- RegisterAreaTriggerAI(areatrigger_mage_blizzard);
- RegisterSpellScript(spell_mage_blizzard_damage);
- RegisterSpellScript(spell_mage_burning_determination);
- RegisterSpellAndAuraScriptPair(spell_mage_cauterize, spell_mage_cauterize_AuraScript);
- RegisterSpellScript(spell_mage_cold_snap);
- RegisterSpellScript(spell_mage_comet_storm);
- RegisterSpellScript(spell_mage_comet_storm_damage);
- RegisterSpellScript(spell_mage_cone_of_cold);
- RegisterSpellScript(spell_mage_conjure_refreshment);
- RegisterSpellScript(spell_mage_ethereal_blink);
- RegisterSpellScript(spell_mage_ethereal_blink_triggered);
- RegisterSpellScript(spell_mage_feel_the_burn);
- RegisterSpellScript(spell_mage_fingers_of_frost);
- RegisterSpellScript(spell_mage_firestarter);
- RegisterSpellScript(spell_mage_firestarter_dots);
- RegisterSpellScript(spell_mage_flame_on);
- RegisterSpellScript(spell_mage_flurry);
- RegisterSpellScript(spell_mage_flurry_damage);
- RegisterSpellScript(spell_mage_frostbolt);
- RegisterSpellScript(spell_mage_hyper_impact);
- RegisterSpellScript(spell_mage_ice_barrier);
- RegisterSpellScript(spell_mage_ice_block);
- RegisterSpellScript(spell_mage_ice_lance);
- RegisterSpellScript(spell_mage_ice_lance_damage);
- RegisterSpellScript(spell_mage_ignite);
- RegisterSpellScript(spell_mage_imp_mana_gems);
- RegisterSpellScript(spell_mage_incanters_flow);
- RegisterSpellScript(spell_mage_living_bomb);
- RegisterSpellScript(spell_mage_living_bomb_explosion);
- RegisterSpellScript(spell_mage_living_bomb_periodic);
- RegisterSpellScript(spell_mage_polymorph_visual);
- RegisterSpellScript(spell_mage_prismatic_barrier);
- RegisterSpellScript(spell_mage_radiant_spark);
- RegisterSpellAndAuraScriptPair(spell_mage_ray_of_frost, spell_mage_ray_of_frost_aura);
- RegisterSpellScript(spell_mage_ring_of_frost);
- RegisterSpellAndAuraScriptPair(spell_mage_ring_of_frost_freeze, spell_mage_ring_of_frost_freeze_AuraScript);
- RegisterSpellScript(spell_mage_supernova);
- RegisterSpellScript(spell_mage_touch_of_the_magi_aura);
- RegisterSpellScript(spell_mage_water_elemental_freeze);
}
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index f84a7b596f8..1b338e81aee 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -22,1585 +22,7 @@
*/
#include "ScriptMgr.h"
-#include "AreaTrigger.h"
-#include "AreaTriggerAI.h"
-#include "CommonPredicates.h"
-#include "Containers.h"
-#include "DB2Stores.h"
-#include "Group.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "Random.h"
-#include "Spell.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-
-enum PaladinSpells
-{
- SPELL_PALADIN_ARDENT_DEFENDER_HEAL = 66235,
- SPELL_PALADIN_ART_OF_WAR_TRIGGERED = 231843,
- SPELL_PALADIN_AVENGERS_SHIELD = 31935,
- SPELL_PALADIN_AVENGING_WRATH = 31884,
- SPELL_PALADIN_BEACON_OF_LIGHT = 53563,
- SPELL_PALADIN_BEACON_OF_LIGHT_HEAL = 53652,
- SPELL_PALADIN_BLADE_OF_JUSTICE = 184575,
- SPELL_PALADIN_BLINDING_LIGHT_EFFECT = 105421,
- SPELL_PALADIN_CONCENTRACTION_AURA = 19746,
- SPELL_PALADIN_CONSECRATED_GROUND_PASSIVE = 204054,
- SPELL_PALADIN_CONSECRATED_GROUND_SLOW = 204242,
- SPELL_PALADIN_CONSECRATION = 26573,
- SPELL_PALADIN_CONSECRATION_DAMAGE = 81297,
- SPELL_PALADIN_CONSECRATION_PROTECTION_AURA = 188370,
- SPELL_PALADIN_CRUSADING_STRIKES_ENERGIZE = 406834,
- SPELL_PALADIN_DIVINE_PURPOSE_TRIGGERED = 223819,
- SPELL_PALADIN_DIVINE_STEED_HUMAN = 221883,
- SPELL_PALADIN_DIVINE_STEED_DWARF = 276111,
- SPELL_PALADIN_DIVINE_STEED_DRAENEI = 221887,
- SPELL_PALADIN_DIVINE_STEED_DARK_IRON_DWARF = 276112,
- SPELL_PALADIN_DIVINE_STEED_BLOODELF = 221886,
- SPELL_PALADIN_DIVINE_STEED_TAUREN = 221885,
- SPELL_PALADIN_DIVINE_STEED_ZANDALARI_TROLL = 294133,
- SPELL_PALADIN_DIVINE_STEED_LF_DRAENEI = 363608,
- SPELL_PALADIN_DIVINE_STORM_DAMAGE = 224239,
- SPELL_PALADIN_ENDURING_LIGHT = 40471,
- SPELL_PALADIN_ENDURING_JUDGEMENT = 40472,
- SPELL_PALADIN_EYE_FOR_AN_EYE_TRIGGERED = 205202,
- SPELL_PALADIN_FINAL_STAND = 204077,
- SPELL_PALADIN_FINAL_STAND_EFFECT = 204079,
- SPELL_PALADIN_FORBEARANCE = 25771,
- SPELL_PALADIN_GUARDIAN_OF_ANCIENT_KINGS = 86659,
- SPELL_PALADIN_HAMMER_OF_JUSTICE = 853,
- SPELL_PALADIN_HAMMER_OF_THE_RIGHTEOUS_AOE = 88263,
- SPELL_PALADIN_HAND_OF_SACRIFICE = 6940,
- SPELL_PALADIN_HOLY_MENDING = 64891,
- SPELL_PALADIN_HOLY_POWER_ARMOR = 28790,
- SPELL_PALADIN_HOLY_POWER_ATTACK_POWER = 28791,
- SPELL_PALADIN_HOLY_POWER_SPELL_POWER = 28793,
- SPELL_PALADIN_HOLY_POWER_MP5 = 28795,
- SPELL_PALADIN_HOLY_PRISM_AREA_BEAM_VISUAL = 121551,
- SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY = 114871,
- SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY = 114852,
- SPELL_PALADIN_HOLY_PRISM_TARGET_BEAM_VISUAL = 114862,
- SPELL_PALADIN_HOLY_SHOCK = 20473,
- SPELL_PALADIN_HOLY_SHOCK_DAMAGE = 25912,
- SPELL_PALADIN_HOLY_SHOCK_HEALING = 25914,
- SPELL_PALADIN_HOLY_LIGHT = 82326,
- SPELL_PALADIN_INFUSION_OF_LIGHT_ENERGIZE = 356717,
- SPELL_PALADIN_IMMUNE_SHIELD_MARKER = 61988,
- SPELL_PALADIN_ITEM_HEALING_TRANCE = 37706,
- SPELL_PALADIN_JUDGMENT_GAIN_HOLY_POWER = 220637,
- SPELL_PALADIN_JUDGMENT_HOLY_R3 = 231644,
- SPELL_PALADIN_JUDGMENT_HOLY_R3_DEBUFF = 214222,
- SPELL_PALADIN_JUDGMENT_PROT_RET_R3 = 315867,
- SPELL_PALADIN_LIGHT_HAMMER_COSMETIC = 122257,
- SPELL_PALADIN_LIGHT_HAMMER_DAMAGE = 114919,
- SPELL_PALADIN_LIGHT_HAMMER_HEALING = 119952,
- SPELL_PALADIN_LIGHT_HAMMER_PERIODIC = 114918,
- SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790,
- SPELL_PALADIN_RIGHTEOUS_VERDICT_AURA = 267611,
- SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS = 25742,
- SPELL_PALADIN_SHIELD_OF_THE_RIGHTEOUS_ARMOR = 132403,
- SPELL_PALADIN_SHIELD_OF_VENGEANCE_DAMAGE = 184689,
- SPELL_PALADIN_TEMPLAR_VERDICT_DAMAGE = 224266,
- SPELL_PALADIN_T30_2P_HEARTFIRE_DAMAGE = 408399,
- SPELL_PALADIN_T30_2P_HEARTFIRE_HEAL = 408400,
- SPELL_PALADIN_ZEAL_AURA = 269571
-};
-
-enum PaladinCovenantSpells
-{
- SPELL_PALADIN_ASHEN_HALLOW = 316958,
- SPELL_PALADIN_ASHEN_HALLOW_DAMAGE = 317221,
- SPELL_PALADIN_ASHEN_HALLOW_HEAL = 317223,
- SPELL_PALADIN_ASHEN_HALLOW_ALLOW_HAMMER = 330382
-};
-
-enum PaladinSpellVisualKit
-{
- PALADIN_VISUAL_KIT_DIVINE_STORM = 73892
-};
-
-enum PaladinSpellVisual
-{
- PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE = 83731,
- PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE_CRIT = 83881,
- PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL = 83732,
- PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL_CRIT = 83880
-};
-
-enum PaladinSpellLabel
-{
- SPELL_LABEL_PALADIN_T30_2P_HEARTFIRE = 2598
-};
-
-// 31850 - Ardent Defender
-class spell_pal_ardent_defender : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_ARDENT_DEFENDER_HEAL })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void HandleAbsorb(AuraEffect const* aurEff, DamageInfo const& dmgInfo, uint32& absorbAmount)
- {
- PreventDefaultAction();
-
- int32 targetHealthPercent = GetEffectInfo(EFFECT_1).CalcValue(GetTarget());
- uint64 targetHealth = int32(GetTarget()->CountPctFromMaxHealth(targetHealthPercent));
- if (GetTarget()->HealthBelowPct(targetHealthPercent))
- {
- // we are currently below desired health
- // absorb everything and heal up
- GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_ARDENT_DEFENDER_HEAL,
- CastSpellExtraArgs(aurEff)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, int32(targetHealth - GetTarget()->GetHealth())));
- }
- else
- {
- // we are currently above desired health
- // just absorb enough to reach that percentage
- absorbAmount = dmgInfo.GetDamage() - int32(GetTarget()->GetHealth() - targetHealth);
- }
-
- Remove();
- }
-
- void Register() override
- {
- OnEffectAbsorb += AuraEffectAbsorbOverkillFn(spell_pal_ardent_defender::HandleAbsorb, EFFECT_2);
- }
-};
-
-// 267344 - Art of War
-class spell_pal_art_of_war : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_ART_OF_WAR_TRIGGERED, SPELL_PALADIN_BLADE_OF_JUSTICE });
- }
-
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- return roll_chance_i(aurEff->GetAmount());
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
- {
- GetTarget()->GetSpellHistory()->ResetCooldown(SPELL_PALADIN_BLADE_OF_JUSTICE, true);
- GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_ART_OF_WAR_TRIGGERED, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_art_of_war::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pal_art_of_war::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 19042 - Ashen Hallow
-struct areatrigger_pal_ashen_hallow : AreaTriggerAI
-{
- areatrigger_pal_ashen_hallow(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) {}
-
- void RefreshPeriod()
- {
- if (Unit* caster = at->GetCaster())
- {
- if (AuraEffect const* ashen = caster->GetAuraEffect(SPELL_PALADIN_ASHEN_HALLOW, EFFECT_1))
- _period = Milliseconds(ashen->GetPeriod());
- }
- }
-
- void OnCreate(Spell const* /*creatingSpell*/) override
- {
- RefreshPeriod();
- _refreshTimer = _period;
- }
-
- void OnUpdate(uint32 diff) override
- {
- _refreshTimer -= Milliseconds(diff);
-
- while (_refreshTimer <= 0s)
- {
- if (Unit* caster = at->GetCaster())
- {
- caster->CastSpell(at->GetPosition(), SPELL_PALADIN_ASHEN_HALLOW_HEAL);
- caster->CastSpell(at->GetPosition(), SPELL_PALADIN_ASHEN_HALLOW_DAMAGE);
- }
-
- RefreshPeriod();
-
- _refreshTimer += _period;
- }
- }
-
- void OnUnitEnter(Unit* unit) override
- {
- if (unit->GetGUID() == at->GetCasterGuid())
- unit->CastSpell(unit, SPELL_PALADIN_ASHEN_HALLOW_ALLOW_HAMMER, true);
- }
-
- void OnUnitExit(Unit* unit) override
- {
- if (unit->GetGUID() == at->GetCasterGuid())
- unit->RemoveAura(SPELL_PALADIN_ASHEN_HALLOW_ALLOW_HAMMER);
- }
-
-private:
- Milliseconds _refreshTimer;
- Milliseconds _period;
-};
-
-// 248033 - Awakening
-class spell_pal_awakening : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_AVENGING_WRATH })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- return roll_chance_i(aurEff->GetAmount());
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- Milliseconds extraDuration = 0ms;
- if (AuraEffect const* durationEffect = GetEffect(EFFECT_1))
- extraDuration = Seconds(durationEffect->GetAmount());
-
- if (Aura* avengingWrath = GetTarget()->GetAura(SPELL_PALADIN_AVENGING_WRATH))
- {
- avengingWrath->SetDuration(avengingWrath->GetDuration() + extraDuration.count());
- avengingWrath->SetMaxDuration(avengingWrath->GetMaxDuration() + extraDuration.count());
- }
- else
- GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_AVENGING_WRATH,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)
- .SetTriggeringSpell(eventInfo.GetProcSpell())
- .AddSpellMod(SPELLVALUE_DURATION, extraDuration.count()));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_awakening::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pal_awakening::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 1022 - Blessing of Protection
-// 204018 - Blessing of Spellwarding
-class spell_pal_blessing_of_protection : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PALADIN_FORBEARANCE,
- // uncomment when we have serverside only spells
- //SPELL_PALADIN_IMMUNE_SHIELD_MARKER
- }) && spellInfo->ExcludeTargetAuraSpell == SPELL_PALADIN_IMMUNE_SHIELD_MARKER;
- }
-
- SpellCastResult CheckForbearance()
- {
- Unit* target = GetExplTargetUnit();
- if (!target || target->HasAura(SPELL_PALADIN_FORBEARANCE))
- return SPELL_FAILED_TARGET_AURASTATE;
-
- return SPELL_CAST_OK;
- }
-
- void TriggerForbearance()
- {
- if (Unit* target = GetHitUnit())
- {
- GetCaster()->CastSpell(target, SPELL_PALADIN_FORBEARANCE, true);
- GetCaster()->CastSpell(target, SPELL_PALADIN_IMMUNE_SHIELD_MARKER, true);
- }
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_pal_blessing_of_protection::CheckForbearance);
- AfterHit += SpellHitFn(spell_pal_blessing_of_protection::TriggerForbearance);
- }
-};
-
-// 115750 - Blinding Light
-class spell_pal_blinding_light : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_BLINDING_LIGHT_EFFECT });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- GetCaster()->CastSpell(target, SPELL_PALADIN_BLINDING_LIGHT_EFFECT, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pal_blinding_light::HandleDummy, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- }
-};
-
-// 26573 - Consecration
-class spell_pal_consecration : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PALADIN_CONSECRATION_DAMAGE,
- // validate for areatrigger_pal_consecration
- SPELL_PALADIN_CONSECRATION_PROTECTION_AURA,
- SPELL_PALADIN_CONSECRATED_GROUND_PASSIVE,
- SPELL_PALADIN_CONSECRATED_GROUND_SLOW
- });
- }
-
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
- {
- if (AreaTrigger* at = GetTarget()->GetAreaTrigger(SPELL_PALADIN_CONSECRATION))
- GetTarget()->CastSpell(at->GetPosition(), SPELL_PALADIN_CONSECRATION_DAMAGE);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_pal_consecration::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 26573 - Consecration
-// 9228 - AreaTriggerId
-struct areatrigger_pal_consecration : AreaTriggerAI
-{
- areatrigger_pal_consecration(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
-
- void OnUnitEnter(Unit* unit) override
- {
- if (Unit* caster = at->GetCaster())
- {
- // 243597 is also being cast as protection, but CreateObject is not sent, either serverside areatrigger for this aura or unused - also no visual is seen
- if (unit == caster && caster->IsPlayer() && caster->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::PaladinProtection)
- caster->CastSpell(caster, SPELL_PALADIN_CONSECRATION_PROTECTION_AURA);
-
- if (caster->IsValidAttackTarget(unit))
- if (caster->HasAura(SPELL_PALADIN_CONSECRATED_GROUND_PASSIVE))
- caster->CastSpell(unit, SPELL_PALADIN_CONSECRATED_GROUND_SLOW);
- }
- }
-
- void OnUnitExit(Unit* unit) override
- {
- if (at->GetCasterGuid() == unit->GetGUID())
- unit->RemoveAurasDueToSpell(SPELL_PALADIN_CONSECRATION_PROTECTION_AURA, at->GetCasterGuid());
-
- unit->RemoveAurasDueToSpell(SPELL_PALADIN_CONSECRATED_GROUND_SLOW, at->GetCasterGuid());
- }
-};
-
-// 196926 - Crusader Might
-class spell_pal_crusader_might : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_HOLY_SHOCK });
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_HOLY_SHOCK, Milliseconds(aurEff->GetAmount()));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_crusader_might::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 406833 - Crusading Strikes
-class spell_pal_crusading_strikes : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_CRUSADING_STRIKES_ENERGIZE });
- }
-
- void HandleEffectProc(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (GetStackAmount() == 2)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_CRUSADING_STRIKES_ENERGIZE, aurEff);
-
- // this spell has weird proc order dependency set up in db2 data so we do removal manually
- Remove();
- }
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_pal_crusading_strikes::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- }
-};
-
-// 223817 - Divine Purpose
-class spell_pal_divine_purpose : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_DIVINE_PURPOSE_TRIGGERED });
- }
-
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- Spell const* procSpell = eventInfo.GetProcSpell();
- if (!procSpell)
- return false;
-
- if (!procSpell->HasPowerTypeCost(POWER_HOLY_POWER))
- return false;
-
- return roll_chance_i(aurEff->GetAmount());
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_PALADIN_DIVINE_PURPOSE_TRIGGERED,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetTriggeringSpell(eventInfo.GetProcSpell()));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_divine_purpose::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pal_divine_purpose::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 642 - Divine Shield
-class spell_pal_divine_shield : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PALADIN_FINAL_STAND,
- SPELL_PALADIN_FINAL_STAND_EFFECT,
- SPELL_PALADIN_FORBEARANCE,
- // uncomment when we have serverside only spells
- //SPELL_PALADIN_IMMUNE_SHIELD_MARKER
- }) && spellInfo->ExcludeCasterAuraSpell == SPELL_PALADIN_IMMUNE_SHIELD_MARKER;
- }
-
- SpellCastResult CheckForbearance()
- {
- if (GetCaster()->HasAura(SPELL_PALADIN_FORBEARANCE))
- return SPELL_FAILED_TARGET_AURASTATE;
-
- return SPELL_CAST_OK;
- }
-
- void HandleFinalStand()
- {
- if (GetCaster()->HasAura(SPELL_PALADIN_FINAL_STAND))
- GetCaster()->CastSpell(nullptr, SPELL_PALADIN_FINAL_STAND_EFFECT, true);
- }
-
- void TriggerForbearance()
- {
- Unit* caster = GetCaster();
- caster->CastSpell(caster, SPELL_PALADIN_FORBEARANCE, true);
- caster->CastSpell(caster, SPELL_PALADIN_IMMUNE_SHIELD_MARKER, true);
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_pal_divine_shield::CheckForbearance);
- AfterCast += SpellCastFn(spell_pal_divine_shield::HandleFinalStand);
- AfterCast += SpellCastFn(spell_pal_divine_shield::TriggerForbearance);
- }
-};
-
-// 190784 - Divine Steed
-class spell_pal_divine_steed : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PALADIN_DIVINE_STEED_HUMAN,
- SPELL_PALADIN_DIVINE_STEED_DWARF,
- SPELL_PALADIN_DIVINE_STEED_DRAENEI,
- SPELL_PALADIN_DIVINE_STEED_DARK_IRON_DWARF,
- SPELL_PALADIN_DIVINE_STEED_BLOODELF,
- SPELL_PALADIN_DIVINE_STEED_TAUREN,
- SPELL_PALADIN_DIVINE_STEED_ZANDALARI_TROLL,
- SPELL_PALADIN_DIVINE_STEED_LF_DRAENEI
- });
- }
-
- void HandleOnCast()
- {
- Unit* caster = GetCaster();
-
- uint32 spellId = SPELL_PALADIN_DIVINE_STEED_HUMAN;
- switch (caster->GetRace())
- {
- case RACE_HUMAN:
- spellId = SPELL_PALADIN_DIVINE_STEED_HUMAN;
- break;
- case RACE_DWARF:
- spellId = SPELL_PALADIN_DIVINE_STEED_DWARF;
- break;
- case RACE_DRAENEI:
- spellId = SPELL_PALADIN_DIVINE_STEED_DRAENEI;
- break;
- case RACE_LIGHTFORGED_DRAENEI:
- spellId = SPELL_PALADIN_DIVINE_STEED_LF_DRAENEI;
- break;
- case RACE_DARK_IRON_DWARF:
- spellId = SPELL_PALADIN_DIVINE_STEED_DARK_IRON_DWARF;
- break;
- case RACE_BLOODELF:
- spellId = SPELL_PALADIN_DIVINE_STEED_BLOODELF;
- break;
- case RACE_TAUREN:
- spellId = SPELL_PALADIN_DIVINE_STEED_TAUREN;
- break;
- case RACE_ZANDALARI_TROLL:
- spellId = SPELL_PALADIN_DIVINE_STEED_ZANDALARI_TROLL;
- break;
- default:
- break;
- }
-
- caster->CastSpell(caster, spellId, true);
- }
-
- void Register() override
- {
- OnCast += SpellCastFn(spell_pal_divine_steed::HandleOnCast);
- }
-};
-
-// 53385 - Divine Storm
-class spell_pal_divine_storm : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return sSpellVisualKitStore.HasRecord(PALADIN_VISUAL_KIT_DIVINE_STORM);
- }
-
- void HandleOnCast()
- {
- GetCaster()->SendPlaySpellVisualKit(PALADIN_VISUAL_KIT_DIVINE_STORM, 0, 0);
- }
-
- void Register() override
- {
- OnCast += SpellCastFn(spell_pal_divine_storm::HandleOnCast);
- }
-};
-
-// 205191 - Eye for an Eye
-class spell_pal_eye_for_an_eye : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_EYE_FOR_AN_EYE_TRIGGERED });
- }
-
- void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- GetTarget()->CastSpell(eventInfo.GetActor(), SPELL_PALADIN_EYE_FOR_AN_EYE_TRIGGERED, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 234299 - Fist of Justice
-class spell_pal_fist_of_justice : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_HAMMER_OF_JUSTICE });
- }
-
- bool CheckEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- if (Spell const* procSpell = eventInfo.GetProcSpell())
- return procSpell->HasPowerTypeCost(POWER_HOLY_POWER);
-
- return false;
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/)
- {
- int32 value = aurEff->GetAmount() / 10;
-
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_HAMMER_OF_JUSTICE, Seconds(-value));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_fist_of_justice::CheckEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pal_fist_of_justice::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// -85043 - Grand Crusader
-class spell_pal_grand_crusader : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_AVENGERS_SHIELD });
- }
-
- bool CheckProc(ProcEventInfo& /*eventInfo*/)
- {
- return GetTarget()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
- {
- GetTarget()->GetSpellHistory()->ResetCooldown(SPELL_PALADIN_AVENGERS_SHIELD, true);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pal_grand_crusader::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pal_grand_crusader::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 54968 - Glyph of Holy Light
-class spell_pal_glyph_of_holy_light : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- uint32 const maxTargets = GetSpellInfo()->MaxAffectedTargets;
-
- if (targets.size() > maxTargets)
- {
- targets.sort(Trinity::Predicates::HealthPctOrderPred());
- targets.resize(maxTargets);
- }
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_glyph_of_holy_light::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 53595 - Hammer of the Righteous
-struct spell_pal_hammer_of_the_righteous : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PALADIN_CONSECRATION_PROTECTION_AURA,
- SPELL_PALADIN_HAMMER_OF_THE_RIGHTEOUS_AOE
- });
- }
-
- void HandleAoEHit(SpellEffIndex /*effIndex*/)
- {
- if (GetCaster()->HasAura(SPELL_PALADIN_CONSECRATION_PROTECTION_AURA))
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_HAMMER_OF_THE_RIGHTEOUS_AOE);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pal_hammer_of_the_righteous::HandleAoEHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 6940 - Hand of Sacrifice
-class spell_pal_hand_of_sacrifice : public AuraScript
-{
-public:
- spell_pal_hand_of_sacrifice()
- {
- remainingAmount = 0;
- }
-
-private:
- int32 remainingAmount;
-
- bool Load() override
- {
- if (Unit* caster = GetCaster())
- {
- remainingAmount = caster->GetMaxHealth();
- return true;
- }
- return false;
- }
-
- void Split(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & splitAmount)
- {
- remainingAmount -= splitAmount;
-
- if (remainingAmount <= 0)
- {
- GetTarget()->RemoveAura(SPELL_PALADIN_HAND_OF_SACRIFICE);
- }
- }
-
- void Register() override
- {
- OnEffectSplit += AuraEffectSplitFn(spell_pal_hand_of_sacrifice::Split, EFFECT_0);
- }
-};
-
-// 54149 - Infusion of Light
-class spell_pal_infusion_of_light : public AuraScript
-{
- static constexpr flag128 HolyLightSpellClassMask = { 0, 0, 0x400 };
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_INFUSION_OF_LIGHT_ENERGIZE });
- }
-
- bool CheckFlashOfLightProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetProcSpell() && eventInfo.GetProcSpell()->m_appliedMods.find(GetAura()) != eventInfo.GetProcSpell()->m_appliedMods.end();
- }
-
- bool CheckHolyLightProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_PALADIN, HolyLightSpellClassMask);
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_PALADIN_INFUSION_OF_LIGHT_ENERGIZE,
- CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetTriggeringSpell(eventInfo.GetProcSpell()));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_infusion_of_light::CheckFlashOfLightProc, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER);
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_infusion_of_light::CheckFlashOfLightProc, EFFECT_2, SPELL_AURA_ADD_FLAT_MODIFIER);
-
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_infusion_of_light::CheckHolyLightProc, EFFECT_1, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pal_infusion_of_light::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 327193 - Moment of Glory
-class spell_pal_moment_of_glory : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_AVENGERS_SHIELD });
- }
-
- void HandleOnHit()
- {
- GetCaster()->GetSpellHistory()->ResetCooldown(SPELL_PALADIN_AVENGERS_SHIELD);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_pal_moment_of_glory::HandleOnHit);
- }
-};
-
-// 20271/275779/275773 - Judgement (Retribution/Protection/Holy)
-class spell_pal_judgment : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PALADIN_JUDGMENT_PROT_RET_R3,
- SPELL_PALADIN_JUDGMENT_GAIN_HOLY_POWER,
- SPELL_PALADIN_JUDGMENT_HOLY_R3,
- SPELL_PALADIN_JUDGMENT_HOLY_R3_DEBUFF
- });
- }
-
- void HandleOnHit()
- {
- Unit* caster = GetCaster();
-
- if (caster->HasSpell(SPELL_PALADIN_JUDGMENT_PROT_RET_R3))
- caster->CastSpell(caster, SPELL_PALADIN_JUDGMENT_GAIN_HOLY_POWER, GetSpell());
-
- if (caster->HasSpell(SPELL_PALADIN_JUDGMENT_HOLY_R3))
- caster->CastSpell(GetHitUnit(), SPELL_PALADIN_JUDGMENT_HOLY_R3_DEBUFF, GetSpell());
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_pal_judgment::HandleOnHit);
- }
-};
-
-// 114165 - Holy Prism
-class spell_pal_holy_prism : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo ({ SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY, SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY, SPELL_PALADIN_HOLY_PRISM_TARGET_BEAM_VISUAL });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- if (GetCaster()->IsFriendlyTo(GetHitUnit()))
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY, true);
- else
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY , true);
-
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_TARGET_BEAM_VISUAL, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pal_holy_prism::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 114852 - Holy Prism (Damage)
-// 114871 - Holy Prism (Heal)
-class spell_pal_holy_prism_selector : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo ({ SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY, SPELL_PALADIN_HOLY_PRISM_AREA_BEAM_VISUAL });
- }
-
- void SaveTargetGuid(SpellEffIndex /*effIndex*/)
- {
- _targetGUID = GetHitUnit()->GetGUID();
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- uint8 const maxTargets = 5;
-
- if (targets.size() > maxTargets)
- {
- if (GetSpellInfo()->Id == SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY)
- {
- targets.sort(Trinity::Predicates::HealthPctOrderPred());
- targets.resize(maxTargets);
- }
- else
- Trinity::Containers::RandomResize(targets, maxTargets);
- }
-
- _sharedTargets = targets;
- }
-
- void ShareTargets(std::list<WorldObject*>& targets)
- {
- targets = _sharedTargets;
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* initialTarget = ObjectAccessor::GetUnit(*GetCaster(), _targetGUID))
- initialTarget->CastSpell(GetHitUnit(), SPELL_PALADIN_HOLY_PRISM_AREA_BEAM_VISUAL, true);
- }
-
- void Register() override
- {
- if (m_scriptSpellId == SPELL_PALADIN_HOLY_PRISM_TARGET_ENEMY)
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_holy_prism_selector::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY);
- else if (m_scriptSpellId == SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY)
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_holy_prism_selector::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
-
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pal_holy_prism_selector::ShareTargets, EFFECT_2, TARGET_UNIT_DEST_AREA_ENTRY);
-
- OnEffectHitTarget += SpellEffectFn(spell_pal_holy_prism_selector::SaveTargetGuid, EFFECT_0, SPELL_EFFECT_ANY);
- OnEffectHitTarget += SpellEffectFn(spell_pal_holy_prism_selector::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-
-private:
- std::list<WorldObject*> _sharedTargets;
- ObjectGuid _targetGUID;
-};
-
-// 20473 - Holy Shock
-class spell_pal_holy_shock : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PALADIN_HOLY_SHOCK,
- SPELL_PALADIN_HOLY_SHOCK_HEALING,
- SPELL_PALADIN_HOLY_SHOCK_DAMAGE
- });
- }
-
- SpellCastResult CheckCast()
- {
- Unit* caster = GetCaster();
-
- if (Unit* target = GetExplTargetUnit())
- {
- if (!caster->IsFriendlyTo(target))
- {
- if (!caster->IsValidAttackTarget(target))
- return SPELL_FAILED_BAD_TARGETS;
-
- if (!caster->isInFront(target))
- return SPELL_FAILED_UNIT_NOT_INFRONT;
- }
- }
- else
- return SPELL_FAILED_BAD_TARGETS;
-
- return SPELL_CAST_OK;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
-
- if (Unit* unitTarget = GetHitUnit())
- {
- if (caster->IsFriendlyTo(unitTarget))
- caster->CastSpell(unitTarget, SPELL_PALADIN_HOLY_SHOCK_HEALING, GetSpell());
- else
- caster->CastSpell(unitTarget, SPELL_PALADIN_HOLY_SHOCK_DAMAGE, GetSpell());
- }
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_pal_holy_shock::CheckCast);
- OnEffectHitTarget += SpellEffectFn(spell_pal_holy_shock::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 25912 - Holy Shock
-class spell_pal_holy_shock_damage_visual : public SpellScript
-{
- bool Validate(SpellInfo const*) override
- {
- return sSpellVisualStore.HasRecord(PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE)
- && sSpellVisualStore.HasRecord(PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE_CRIT);
- }
-
- void PlayVisual()
- {
- GetCaster()->SendPlaySpellVisual(GetHitUnit(), IsHitCrit() ? PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE_CRIT : PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE, 0, 0, 0.0f, false);
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_pal_holy_shock_damage_visual::PlayVisual);
- }
-};
-
-// 25914 - Holy Shock
-class spell_pal_holy_shock_heal_visual : public SpellScript
-{
- bool Validate(SpellInfo const*) override
- {
- return sSpellVisualStore.HasRecord(PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL)
- && sSpellVisualStore.HasRecord(PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL_CRIT);
- }
-
- void PlayVisual()
- {
- GetCaster()->SendPlaySpellVisual(GetHitUnit(), IsHitCrit() ? PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL_CRIT : PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL, 0, 0, 0.0f, false);
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_pal_holy_shock_heal_visual::PlayVisual);
- }
-};
-
-// 37705 - Healing Discount
-class spell_pal_item_healing_discount : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_ITEM_HEALING_TRANCE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_ITEM_HEALING_TRANCE, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_item_healing_discount::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 40470 - Paladin Tier 6 Trinket
-class spell_pal_item_t6_trinket : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PALADIN_ENDURING_LIGHT,
- SPELL_PALADIN_ENDURING_JUDGEMENT
- });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
- if (!spellInfo)
- return;
-
- uint32 spellId;
- int32 chance;
-
- // Holy Light & Flash of Light
- if (spellInfo->SpellFamilyFlags[0] & 0xC0000000)
- {
- spellId = SPELL_PALADIN_ENDURING_LIGHT;
- chance = 15;
- }
- // Judgements
- else if (spellInfo->SpellFamilyFlags[0] & 0x00800000)
- {
- spellId = SPELL_PALADIN_ENDURING_JUDGEMENT;
- chance = 50;
- }
- else
- return;
-
- if (roll_chance_i(chance))
- eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_item_t6_trinket::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 633 - Lay on Hands
-class spell_pal_lay_on_hands : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PALADIN_FORBEARANCE,
- // uncomment when we have serverside only spells
- //SPELL_PALADIN_IMMUNE_SHIELD_MARKER
- }) && spellInfo->ExcludeTargetAuraSpell == SPELL_PALADIN_IMMUNE_SHIELD_MARKER;
- }
-
- SpellCastResult CheckForbearance()
- {
- Unit* target = GetExplTargetUnit();
- if (!target || target->HasAura(SPELL_PALADIN_FORBEARANCE))
- return SPELL_FAILED_TARGET_AURASTATE;
-
- return SPELL_CAST_OK;
- }
-
- void TriggerForbearance()
- {
- if (Unit* target = GetHitUnit())
- {
- GetCaster()->CastSpell(target, SPELL_PALADIN_FORBEARANCE, true);
- GetCaster()->CastSpell(target, SPELL_PALADIN_IMMUNE_SHIELD_MARKER, true);
- }
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_pal_lay_on_hands::CheckForbearance);
- AfterHit += SpellHitFn(spell_pal_lay_on_hands::TriggerForbearance);
- }
-};
-
-// 53651 - Light's Beacon - Beacon of Light
-class spell_pal_light_s_beacon : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_BEACON_OF_LIGHT, SPELL_PALADIN_BEACON_OF_LIGHT_HEAL });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (!eventInfo.GetActionTarget())
- return false;
- if (eventInfo.GetActionTarget()->HasAura(SPELL_PALADIN_BEACON_OF_LIGHT, eventInfo.GetActor()->GetGUID()))
- return false;
- return true;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- HealInfo* healInfo = eventInfo.GetHealInfo();
- if (!healInfo || !healInfo->GetHeal())
- return;
-
- uint32 heal = CalculatePct(healInfo->GetHeal(), aurEff->GetAmount());
-
- Unit::AuraList const& auras = GetCaster()->GetSingleCastAuras();
- for (Unit::AuraList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
- {
- if ((*itr)->GetId() == SPELL_PALADIN_BEACON_OF_LIGHT)
- {
- std::vector<AuraApplication*> applications;
- (*itr)->GetApplicationVector(applications);
- if (!applications.empty())
- {
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, heal);
- eventInfo.GetActor()->CastSpell(applications.front()->GetTarget(), SPELL_PALADIN_BEACON_OF_LIGHT_HEAL, args);
- }
- return;
- }
- }
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pal_light_s_beacon::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pal_light_s_beacon::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 122773 - Light's Hammer
-class spell_pal_light_hammer_init_summon : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PALADIN_LIGHT_HAMMER_COSMETIC,
- SPELL_PALADIN_LIGHT_HAMMER_PERIODIC
- });
- }
-
- void InitSummon()
- {
- for (SpellLogEffectGenericVictimParams const& summonedObject : GetSpell()->GetExecuteLogEffectTargets(SPELL_EFFECT_SUMMON, &SpellLogEffect::GenericVictimTargets))
- {
- if (Unit* hammer = ObjectAccessor::GetUnit(*GetCaster(), summonedObject.Victim))
- {
- hammer->CastSpell(hammer, SPELL_PALADIN_LIGHT_HAMMER_COSMETIC,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetTriggeringSpell(GetSpell()));
- hammer->CastSpell(hammer, SPELL_PALADIN_LIGHT_HAMMER_PERIODIC,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetTriggeringSpell(GetSpell()));
- }
- }
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_pal_light_hammer_init_summon::InitSummon);
- }
-};
-
-// 114918 - Light's Hammer (Periodic)
-class spell_pal_light_hammer_periodic : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PALADIN_LIGHT_HAMMER_HEALING,
- SPELL_PALADIN_LIGHT_HAMMER_DAMAGE
- });
- }
-
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
- {
- Unit* lightHammer = GetTarget();
- if (Unit* originalCaster = lightHammer->GetOwner())
- {
- originalCaster->CastSpell(lightHammer->GetPosition(), SPELL_PALADIN_LIGHT_HAMMER_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- originalCaster->CastSpell(lightHammer->GetPosition(), SPELL_PALADIN_LIGHT_HAMMER_HEALING, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_pal_light_hammer_periodic::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 204074 - Righteous Protector
-class spell_pal_righteous_protector : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_AVENGING_WRATH, SPELL_PALADIN_GUARDIAN_OF_ANCIENT_KINGS });
- }
-
- bool CheckEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- if (SpellInfo const* procSpell = eventInfo.GetSpellInfo())
- _baseHolyPowerCost = procSpell->CalcPowerCost(POWER_HOLY_POWER, false, eventInfo.GetActor(), eventInfo.GetSchoolMask());
- else
- _baseHolyPowerCost.reset();
-
- return _baseHolyPowerCost.has_value();
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- int32 value = aurEff->GetAmount() * 100 * _baseHolyPowerCost->Amount;
-
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_AVENGING_WRATH, Milliseconds(-value));
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PALADIN_GUARDIAN_OF_ANCIENT_KINGS, Milliseconds(-value));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_righteous_protector::CheckEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pal_righteous_protector::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
- Optional<SpellPowerCost> _baseHolyPowerCost;
-};
-
-// 267610 - Righteous Verdict
-class spell_pal_righteous_verdict : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellEntry*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_RIGHTEOUS_VERDICT_AURA });
- }
-
- void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo)
- {
- procInfo.GetActor()->CastSpell(procInfo.GetActor(), SPELL_PALADIN_RIGHTEOUS_VERDICT_AURA, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_righteous_verdict::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 85804 - Selfless Healer
-class spell_pal_selfless_healer : public AuraScript
-{
- bool CheckEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- if (Spell const* procSpell = eventInfo.GetProcSpell())
- return procSpell->HasPowerTypeCost(POWER_HOLY_POWER);
-
- return false;
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_selfless_healer::CheckEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 53600 - Shield of the Righteous
-class spell_pal_shield_of_the_righteous : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_SHIELD_OF_THE_RIGHTEOUS_ARMOR });
- }
-
- void HandleArmor()
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_PALADIN_SHIELD_OF_THE_RIGHTEOUS_ARMOR, true);
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_pal_shield_of_the_righteous::HandleArmor);
- }
-};
-
-// 184662 - Shield of Vengeance
-class spell_pal_shield_of_vengeance : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_SHIELD_OF_VENGEANCE_DAMAGE }) && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- amount = CalculatePct(GetUnitOwner()->GetMaxHealth(), GetEffectInfo(EFFECT_1).CalcValue());
- if (Player const* player = GetUnitOwner()->ToPlayer())
- AddPct(amount, player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) + player->GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY));
-
- _initialAmount = amount;
- }
-
- void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_SHIELD_OF_VENGEANCE_DAMAGE,
- CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, _initialAmount - aurEff->GetAmount()));
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_shield_of_vengeance::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectRemove += AuraEffectApplyFn(spell_pal_shield_of_vengeance::HandleRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
- }
-
- int32 _initialAmount = 0;
-};
-
-// 85256 - Templar's Verdict
-class spell_pal_templar_s_verdict : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellEntry*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_TEMPLAR_VERDICT_DAMAGE });
- }
-
- void HandleHitTarget(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PALADIN_TEMPLAR_VERDICT_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 28789 - Holy Power
-class spell_pal_t3_6p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PALADIN_HOLY_POWER_ARMOR,
- SPELL_PALADIN_HOLY_POWER_ATTACK_POWER,
- SPELL_PALADIN_HOLY_POWER_SPELL_POWER,
- SPELL_PALADIN_HOLY_POWER_MP5
- });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- uint32 spellId;
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- switch (target->GetClass())
- {
- case CLASS_PALADIN:
- case CLASS_PRIEST:
- case CLASS_SHAMAN:
- case CLASS_DRUID:
- spellId = SPELL_PALADIN_HOLY_POWER_MP5;
- break;
- case CLASS_MAGE:
- case CLASS_WARLOCK:
- spellId = SPELL_PALADIN_HOLY_POWER_SPELL_POWER;
- break;
- case CLASS_HUNTER:
- case CLASS_ROGUE:
- spellId = SPELL_PALADIN_HOLY_POWER_ATTACK_POWER;
- break;
- case CLASS_WARRIOR:
- spellId = SPELL_PALADIN_HOLY_POWER_ARMOR;
- break;
- default:
- return;
- }
-
- caster->CastSpell(target, spellId, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_t3_6p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 64890 - Item - Paladin T8 Holy 2P Bonus
-class spell_pal_t8_2p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_HOLY_MENDING });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- HealInfo* healInfo = eventInfo.GetHealInfo();
- if (!healInfo || !healInfo->GetHeal())
- return;
-
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_HOLY_MENDING, GetCastDifficulty());
- int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount());
-
- ASSERT(spellInfo->GetMaxTicks() > 0);
- amount /= spellInfo->GetMaxTicks();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(amount);
- caster->CastSpell(target, SPELL_PALADIN_HOLY_MENDING, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_t8_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 405547 - Paladin Protection 10.1 Class Set 2pc
-class spell_pal_t30_2p_protection_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_T30_2P_HEARTFIRE_DAMAGE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- PreventDefaultAction();
-
- Unit* caster = procInfo.GetActor();
- uint32 ticks = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_T30_2P_HEARTFIRE_DAMAGE, DIFFICULTY_NONE)->GetMaxTicks();
- uint32 damage = CalculatePct(procInfo.GetDamageInfo()->GetOriginalDamage(), aurEff->GetAmount()) / ticks;
-
- caster->CastSpell(procInfo.GetActionTarget(), SPELL_PALADIN_T30_2P_HEARTFIRE_DAMAGE, CastSpellExtraArgs(aurEff)
- .SetTriggeringSpell(procInfo.GetProcSpell())
- .AddSpellMod(SPELLVALUE_BASE_POINT0, damage));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_t30_2p_protection_bonus::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 408461 - Heartfire
-class spell_pal_t30_2p_protection_bonus_heal : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_T30_2P_HEARTFIRE_HEAL });
- }
-
- bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
- {
- return procInfo.GetDamageInfo() && procInfo.GetSpellInfo() && procInfo.GetSpellInfo()->HasLabel(SPELL_LABEL_PALADIN_T30_2P_HEARTFIRE);
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_T30_2P_HEARTFIRE_HEAL, CastSpellExtraArgs(aurEff)
- .SetTriggeringSpell(procInfo.GetProcSpell())
- .AddSpellMod(SPELLVALUE_BASE_POINT0, procInfo.GetDamageInfo()->GetOriginalDamage()));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_t30_2p_protection_bonus_heal::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pal_t30_2p_protection_bonus_heal::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 269569 - Zeal
-class spell_pal_zeal : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PALADIN_ZEAL_AURA });
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/)
- {
- Unit* target = GetTarget();
- target->CastSpell(target, SPELL_PALADIN_ZEAL_AURA, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, aurEff->GetAmount()));
-
- PreventDefaultAction();
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pal_zeal::HandleEffectProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
void AddSC_paladin_spell_scripts()
{
- RegisterSpellScript(spell_pal_ardent_defender);
- RegisterSpellScript(spell_pal_art_of_war);
- RegisterAreaTriggerAI(areatrigger_pal_ashen_hallow);
- RegisterSpellScript(spell_pal_awakening);
- RegisterSpellScript(spell_pal_blessing_of_protection);
- RegisterSpellScript(spell_pal_blinding_light);
- RegisterSpellScript(spell_pal_crusader_might);
- RegisterSpellScript(spell_pal_crusading_strikes);
- RegisterSpellScript(spell_pal_consecration);
- RegisterAreaTriggerAI(areatrigger_pal_consecration);
- RegisterSpellScript(spell_pal_divine_purpose);
- RegisterSpellScript(spell_pal_divine_shield);
- RegisterSpellScript(spell_pal_divine_steed);
- RegisterSpellScript(spell_pal_divine_storm);
- RegisterSpellScript(spell_pal_eye_for_an_eye);
- RegisterSpellScript(spell_pal_fist_of_justice);
- RegisterSpellScript(spell_pal_glyph_of_holy_light);
- RegisterSpellScript(spell_pal_grand_crusader);
- RegisterSpellScript(spell_pal_hammer_of_the_righteous);
- RegisterSpellScript(spell_pal_hand_of_sacrifice);
- RegisterSpellScript(spell_pal_infusion_of_light);
- RegisterSpellScript(spell_pal_moment_of_glory);
- RegisterSpellScript(spell_pal_judgment);
- RegisterSpellScript(spell_pal_holy_prism);
- RegisterSpellScript(spell_pal_holy_prism_selector);
- RegisterSpellScript(spell_pal_holy_shock);
- RegisterSpellScript(spell_pal_holy_shock_damage_visual);
- RegisterSpellScript(spell_pal_holy_shock_heal_visual);
- RegisterSpellScript(spell_pal_item_healing_discount);
- RegisterSpellScript(spell_pal_item_t6_trinket);
- RegisterSpellScript(spell_pal_lay_on_hands);
- RegisterSpellScript(spell_pal_light_s_beacon);
- RegisterSpellScript(spell_pal_light_hammer_init_summon);
- RegisterSpellScript(spell_pal_light_hammer_periodic);
- RegisterSpellScript(spell_pal_righteous_protector);
- RegisterSpellScript(spell_pal_righteous_verdict);
- RegisterSpellScript(spell_pal_selfless_healer);
- RegisterSpellScript(spell_pal_shield_of_the_righteous);
- RegisterSpellScript(spell_pal_shield_of_vengeance);
- RegisterSpellScript(spell_pal_templar_s_verdict);
- RegisterSpellScript(spell_pal_t3_6p_bonus);
- RegisterSpellScript(spell_pal_t8_2p_bonus);
- RegisterSpellScript(spell_pal_t30_2p_protection_bonus);
- RegisterSpellScript(spell_pal_t30_2p_protection_bonus_heal);
- RegisterSpellScript(spell_pal_zeal);
}
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index eefce2d3e82..9abc2c40af4 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -22,3239 +22,8 @@
*/
#include "ScriptMgr.h"
-#include "AreaTriggerAI.h"
-#include "Containers.h"
-#include "G3DPosition.hpp"
-#include "GridNotifiers.h"
-#include "ListUtils.h"
-#include "Log.h"
-#include "MoveSplineInitArgs.h"
-#include "ObjectAccessor.h"
-#include "PathGenerator.h"
-#include "Player.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-#include "TaskScheduler.h"
-#include "TemporarySummon.h"
-enum PriestSpells
-{
- SPELL_PRIEST_ABYSSAL_REVERIE = 373054,
- SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER = 158624,
- SPELL_PRIEST_ANGELIC_FEATHER_AURA = 121557,
- SPELL_PRIEST_ANSWERED_PRAYERS = 394289,
- SPELL_PRIEST_APOTHEOSIS = 200183,
- SPELL_PRIEST_ARMOR_OF_FAITH = 28810,
- SPELL_PRIEST_ATONEMENT = 81749,
- SPELL_PRIEST_ATONEMENT_EFFECT = 194384,
- SPELL_PRIEST_ATONEMENT_HEAL = 81751,
- SPELL_PRIEST_BENEDICTION = 193157,
- SPELL_PRIEST_BENEVOLENCE = 415416,
- SPELL_PRIEST_BLAZE_OF_LIGHT = 215768,
- SPELL_PRIEST_BLAZE_OF_LIGHT_INCREASE = 355851,
- SPELL_PRIEST_BLAZE_OF_LIGHT_DECREASE = 356084,
- SPELL_PRIEST_BLESSED_HEALING = 70772,
- SPELL_PRIEST_BLESSED_LIGHT = 196813,
- SPELL_PRIEST_BODY_AND_SOUL = 64129,
- SPELL_PRIEST_BODY_AND_SOUL_SPEED = 65081,
- SPELL_PRIEST_CIRCLE_OF_HEALING = 204883,
- SPELL_PRIEST_CRYSTALLINE_REFLECTION = 373457,
- SPELL_PRIEST_CRYSTALLINE_REFLECTION_HEAL = 373462,
- SPELL_PRIEST_CRYSTALLINE_REFLECTION_REFLECT = 373464,
- SPELL_PRIEST_DARK_INDULGENCE = 372972,
- SPELL_PRIEST_DARK_REPRIMAND = 400169,
- SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_DAMAGE = 373129,
- SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_HEALING = 400171,
- SPELL_PRIEST_DARK_REPRIMAND_DAMAGE = 373130,
- SPELL_PRIEST_DARK_REPRIMAND_HEALING = 400187,
- SPELL_PRIEST_DAZZLING_LIGHT = 196810,
- SPELL_PRIEST_DIVINE_AEGIS = 47515,
- SPELL_PRIEST_DIVINE_AEGIS_ABSORB = 47753,
- SPELL_PRIEST_DIVINE_BLESSING = 40440,
- SPELL_PRIEST_DIVINE_HYMN_HEAL = 64844,
- SPELL_PRIEST_DIVINE_IMAGE_SUMMON = 392990,
- SPELL_PRIEST_DIVINE_IMAGE_EMPOWER = 409387,
- SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK = 405963,
- SPELL_PRIEST_DIVINE_SERVICE = 391233,
- SPELL_PRIEST_DIVINE_STAR_HOLY = 110744,
- SPELL_PRIEST_DIVINE_STAR_SHADOW = 122121,
- SPELL_PRIEST_DIVINE_STAR_HOLY_DAMAGE = 122128,
- SPELL_PRIEST_DIVINE_STAR_HOLY_HEAL = 110745,
- SPELL_PRIEST_DIVINE_STAR_SHADOW_DAMAGE = 390845,
- SPELL_PRIEST_DIVINE_STAR_SHADOW_HEAL = 390981,
- SPELL_PRIEST_DIVINE_WRATH = 40441,
- SPELL_PRIEST_EMPOWERED_RENEW_HEAL = 391359,
- SPELL_PRIEST_EPIPHANY = 414553,
- SPELL_PRIEST_EPIPHANY_HIGHLIGHT = 414556,
- SPELL_PRIEST_ESSENCE_DEVOURER = 415479,
- SPELL_PRIEST_ESSENCE_DEVOURER_SHADOWFIEND_HEAL = 415673,
- SPELL_PRIEST_ESSENCE_DEVOURER_MINDBENDER_HEAL = 415676,
- SPELL_PRIEST_FLASH_HEAL = 2061,
- SPELL_PRIEST_FROM_DARKNESS_COMES_LIGHT_AURA = 390617,
- SPELL_PRIEST_GREATER_HEAL = 289666,
- SPELL_PRIEST_FOCUSED_MENDING = 372354,
- SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
- SPELL_PRIEST_HALO_HOLY = 120517,
- SPELL_PRIEST_HALO_SHADOW = 120644,
- SPELL_PRIEST_HALO_HOLY_DAMAGE = 120696,
- SPELL_PRIEST_HALO_HOLY_HEAL = 120692,
- SPELL_PRIEST_HALO_SHADOW_DAMAGE = 390964,
- SPELL_PRIEST_HALO_SHADOW_HEAL = 390971,
- SPELL_PRIEST_HEAL = 2060,
- SPELL_PRIEST_HEALING_LIGHT = 196809,
- SPELL_PRIEST_HEAVENS_WRATH = 421558,
- SPELL_PRIEST_HOLY_FIRE = 14914,
- SPELL_PRIEST_HOLY_MENDING_HEAL = 391156,
- SPELL_PRIEST_HOLY_NOVA = 132157,
- SPELL_PRIEST_HOLY_WORD_CHASTISE = 88625,
- SPELL_PRIEST_HOLY_WORD_SALVATION = 265202,
- SPELL_PRIEST_HOLY_WORD_SANCTIFY = 34861,
- SPELL_PRIEST_HOLY_WORD_SERENITY = 2050,
- SPELL_PRIEST_HOLY_10_1_CLASS_SET_2P_CHOOSER = 411097,
- SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P = 405556,
- SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P_EFFECT = 409479,
- SPELL_PRIEST_INDEMNITY = 373049,
- SPELL_PRIEST_ITEM_EFFICIENCY = 37595,
- SPELL_PRIEST_LEAP_OF_FAITH_EFFECT = 92832,
- SPELL_PRIEST_LEVITATE_EFFECT = 111759,
- SPELL_PRIEST_LIGHT_ERUPTION = 196812,
- SPELL_PRIEST_LIGHTS_WRATH_VISUAL = 215795,
- SPELL_PRIEST_MASOCHISM_TALENT = 193063,
- SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL = 193065,
- SPELL_PRIEST_MASTERY_GRACE = 271534,
- SPELL_PRIEST_MINDBENDER_DISC = 123040,
- SPELL_PRIEST_MINDBENDER_SHADOW = 200174,
- SPELL_PRIEST_MINDGAMES = 375901,
- SPELL_PRIEST_MINDGAMES_VENTHYR = 323673,
- SPELL_PRIEST_MIND_BOMB_STUN = 226943,
- SPELL_PRIEST_MISERY = 238558,
- SPELL_PRIEST_ORACULAR_HEAL = 26170,
- SPELL_PRIEST_PAIN_TRANSFORMATION = 372991,
- SPELL_PRIEST_PAIN_TRANSFORMATION_HEAL = 372994,
- SPELL_PRIEST_PENANCE = 47540,
- SPELL_PRIEST_PENANCE_CHANNEL_DAMAGE = 47758,
- SPELL_PRIEST_PENANCE_CHANNEL_HEALING = 47757,
- SPELL_PRIEST_PENANCE_DAMAGE = 47666,
- SPELL_PRIEST_PENANCE_HEALING = 47750,
- SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA = 123051,
- SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY = 200010,
- SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA = 343727,
- SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY = 262485,
- SPELL_PRIEST_POWER_OF_THE_DARK_SIDE = 198069,
- SPELL_PRIEST_POWER_OF_THE_DARK_SIDE_TINT = 225795,
- SPELL_PRIEST_POWER_WORD_LIFE = 373481,
- SPELL_PRIEST_POWER_WORD_RADIANCE = 194509,
- SPELL_PRIEST_POWER_WORD_SHIELD = 17,
- SPELL_PRIEST_POWER_WORD_SOLACE_ENERGIZE = 129253,
- SPELL_PRIEST_PRAYER_OF_HEALING = 596,
- SPELL_PRIEST_PRAYER_OF_MENDING = 33076,
- SPELL_PRIEST_PRAYER_OF_MENDING_AURA = 41635,
- SPELL_PRIEST_PRAYER_OF_MENDING_HEAL = 33110,
- SPELL_PRIEST_PRAYER_OF_MENDING_JUMP = 155793,
- SPELL_PRIEST_PROTECTIVE_LIGHT_AURA = 193065,
- SPELL_PRIEST_PURGE_THE_WICKED = 204197,
- SPELL_PRIEST_PURGE_THE_WICKED_DUMMY = 204215,
- SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC = 204213,
- SPELL_PRIEST_RAPTURE = 47536,
- SPELL_PRIEST_RENEW = 139,
- SPELL_PRIEST_RENEWED_HOPE = 197469,
- SPELL_PRIEST_RENEWED_HOPE_EFFECT = 197470,
- SPELL_PRIEST_REVEL_IN_PURITY = 373003,
- SPELL_PRIEST_SAY_YOUR_PRAYERS = 391186,
- SPELL_PRIEST_SCHISM = 424509,
- SPELL_PRIEST_SCHISM_AURA = 214621,
- SPELL_PRIEST_SEARING_LIGHT = 196811,
- SPELL_PRIEST_SHADOW_MEND_DAMAGE = 186439,
- SPELL_PRIEST_SHADOW_WORD_DEATH = 32379,
- SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY = 187464,
- SPELL_PRIEST_SHADOW_WORD_PAIN = 589,
- SPELL_PRIEST_SHIELD_DISCIPLINE = 197045,
- SPELL_PRIEST_SHIELD_DISCIPLINE_EFFECT = 47755,
- SPELL_PRIEST_SIN_AND_PUNISHMENT = 87204,
- SPELL_PRIEST_SINS_OF_THE_MANY = 280398,
- SPELL_PRIEST_SMITE = 585,
- SPELL_PRIEST_SPIRIT_OF_REDEMPTION = 27827,
- SPELL_PRIEST_STRENGTH_OF_SOUL = 197535,
- SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT = 197548,
- SPELL_PRIEST_SURGE_OF_LIGHT = 109186,
- SPELL_PRIEST_SURGE_OF_LIGHT_EFFECT = 114255,
- SPELL_PRIEST_TRANQUIL_LIGHT = 196816,
- SPELL_PRIEST_THE_PENITENT_AURA = 200347,
- SPELL_PRIEST_TRAIL_OF_LIGHT_HEAL = 234946,
- SPELL_PRIEST_TRINITY = 214205,
- SPELL_PRIEST_TRINITY_EFFECT = 214206,
- SPELL_PRIEST_ULTIMATE_PENITENCE = 421453,
- SPELL_PRIEST_ULTIMATE_PENITENCE_DAMAGE = 421543,
- SPELL_PRIEST_ULTIMATE_PENITENCE_HEAL = 421544,
- SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290,
- SPELL_PRIEST_VOID_SHIELD = 199144,
- SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145,
- SPELL_PRIEST_WEAKENED_SOUL = 6788,
- SPELL_PVP_RULES_ENABLED_HARDCODED = 134735
-};
-
-enum PriestSpellVisuals
-{
- SPELL_VISUAL_PRIEST_POWER_WORD_RADIANCE = 52872,
- SPELL_VISUAL_PRIEST_PRAYER_OF_MENDING = 38945
-};
-
-enum PriestSummons
-{
- NPC_PRIEST_DIVINE_IMAGE = 198236,
- NPC_PRIEST_MINDBENDER = 62982,
- NPC_PRIEST_SHADOWFIEND = 19668
-};
-
-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;
-};
-
-// 121536 - Angelic Feather talent
-class spell_pri_angelic_feather_trigger : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER });
- }
-
- void HandleEffectDummy(SpellEffIndex /*effIndex*/)
- {
- Position destPos = GetHitDest()->GetPosition();
- float radius = GetEffectInfo().CalcRadius();
-
- // Caster is prioritary
- if (GetCaster()->IsWithinDist2d(&destPos, radius))
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_PRIEST_ANGELIC_FEATHER_AURA, true);
- }
- else
- {
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.CastDifficulty = GetCastDifficulty();
- GetCaster()->CastSpell(destPos, SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER, args);
- }
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_pri_angelic_feather_trigger::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// Angelic Feather areatrigger - created by SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER
-struct areatrigger_pri_angelic_feather : AreaTriggerAI
-{
- areatrigger_pri_angelic_feather(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
-
- // Called when the AreaTrigger has just been initialized, just before added to map
- void OnInitialize() override
- {
- if (Unit* caster = at->GetCaster())
- {
- std::vector<AreaTrigger*> areaTriggers = caster->GetAreaTriggers(SPELL_PRIEST_ANGELIC_FEATHER_AREATRIGGER);
-
- if (areaTriggers.size() >= 3)
- areaTriggers.front()->SetDuration(0);
- }
- }
-
- void OnUnitEnter(Unit* unit) override
- {
- if (Unit* caster = at->GetCaster())
- {
- if (caster->IsFriendlyTo(unit))
- {
- // If target already has aura, increase duration to max 130% of initial duration
- caster->CastSpell(unit, SPELL_PRIEST_ANGELIC_FEATHER_AURA, true);
- at->SetDuration(0);
- }
- }
- }
-};
-
-// 391387 - Answered Prayers
-class spell_pri_answered_prayers : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ANSWERED_PRAYERS, SPELL_PRIEST_APOTHEOSIS })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) const
- {
- Milliseconds extraDuration = 0ms;
- if (AuraEffect const* durationEffect = GetEffect(EFFECT_1))
- extraDuration = Seconds(durationEffect->GetAmount());
-
- Unit* target = eventInfo.GetActor();
-
- Aura* answeredPrayers = target->GetAura(SPELL_PRIEST_ANSWERED_PRAYERS);
-
- // Note: if caster has no aura, we must cast it first.
- if (!answeredPrayers)
- target->CastSpell(target, SPELL_PRIEST_ANSWERED_PRAYERS, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- else
- {
- // Note: there's no BaseValue dummy that we can use as reference, so we hardcode the increasing stack value.
- answeredPrayers->ModStackAmount(1);
-
- // Note: if current stacks match max. stacks, trigger Apotheosis.
- if (answeredPrayers->GetStackAmount() != aurEff->GetAmount())
- return;
-
- answeredPrayers->Remove();
-
- if (Aura* apotheosis = GetTarget()->GetAura(SPELL_PRIEST_APOTHEOSIS))
- {
- apotheosis->SetDuration(apotheosis->GetDuration() + extraDuration.count());
- apotheosis->SetMaxDuration(apotheosis->GetMaxDuration() + extraDuration.count());
- }
- else
- target->CastSpell(target, SPELL_PRIEST_APOTHEOSIS,
- CastSpellExtraArgs(TRIGGERED_FULL_MASK & ~TRIGGERED_CAST_DIRECTLY)
- .AddSpellMod(SPELLVALUE_DURATION, extraDuration.count()));
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_answered_prayers::HandleOnProc, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL);
- }
-};
-
-// 26169 - Oracle Healing Bonus
-class spell_pri_aq_3p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ORACULAR_HEAL });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Unit* caster = eventInfo.GetActor();
- if (caster == eventInfo.GetProcTarget())
- return;
-
- HealInfo* healInfo = eventInfo.GetHealInfo();
- if (!healInfo || !healInfo->GetHeal())
- return;
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(CalculatePct(static_cast<int32>(healInfo->GetHeal()), 10));
- caster->CastSpell(caster, SPELL_PRIEST_ORACULAR_HEAL, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_aq_3p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 81749 - Atonement
-class spell_pri_atonement : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ATONEMENT_HEAL, SPELL_PRIEST_SINS_OF_THE_MANY })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 }, { SPELL_PRIEST_SINS_OF_THE_MANY, EFFECT_2 } });
- }
-
- static bool CheckProc(ProcEventInfo const& eventInfo)
- {
- return eventInfo.GetDamageInfo() != nullptr;
- }
-
- void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
- {
- TriggerAtonementHealOnTargets(aurEff, eventInfo);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pri_atonement::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_atonement::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
- std::vector<ObjectGuid> _appliedAtonements;
-
-public:
- void AddAtonementTarget(ObjectGuid const& target)
- {
- _appliedAtonements.push_back(target);
-
- UpdateSinsOfTheManyValue();
- }
-
- void RemoveAtonementTarget(ObjectGuid const& target)
- {
- std::erase(_appliedAtonements, target);
-
- UpdateSinsOfTheManyValue();
- }
-
- std::vector<ObjectGuid> const& GetAtonementTargets() const
- {
- return _appliedAtonements;
- }
-
- struct TriggerArgs
- {
- SpellInfo const* TriggeredBy = nullptr;
- SpellSchoolMask DamageSchoolMask = SPELL_SCHOOL_MASK_NONE;
- };
-
- void TriggerAtonementHealOnTargets(AuraEffect const* atonementEffect, ProcEventInfo const& eventInfo)
- {
- Unit* priest = GetUnitOwner();
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- CastSpellExtraArgs args(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
-
- // Note: atonementEffect holds the correct amount since we passed the effect in the AuraScript that calls this method.
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(damageInfo->GetDamage(), atonementEffect->GetAmount()));
-
- args.SetCustomArg(TriggerArgs{
- .TriggeredBy = eventInfo.GetSpellInfo(),
- .DamageSchoolMask = eventInfo.GetDamageInfo()->GetSchoolMask() });
-
- float distanceLimit = GetEffectInfo(EFFECT_1).CalcValue();
-
- std::erase_if(_appliedAtonements, [priest, distanceLimit, &args](ObjectGuid const& targetGuid)
- {
- if (Unit* target = ObjectAccessor::GetUnit(*priest, targetGuid))
- {
- if (target->IsInDist2d(priest, distanceLimit))
- priest->CastSpell(target, SPELL_PRIEST_ATONEMENT_HEAL, args);
-
- return false;
- }
-
- return true;
- });
- }
-
- void UpdateSinsOfTheManyValue() const
- {
- // Note: the damage dimish starts at the 6th application as of 10.0.5.
- constexpr std::array<float, 20> damageByStack = { 40.0f, 40.0f, 40.0f, 40.0f, 40.0f, 35.0f, 30.0f, 25.0f, 20.0f, 15.0f, 11.0f, 8.0f, 5.0f, 4.0f, 3.0f, 2.5f, 2.0f, 1.5f, 1.25f, 1.0f };
-
- for (SpellEffIndex effectIndex : { EFFECT_0, EFFECT_1, EFFECT_2 })
- if (AuraEffect* sinOfTheMany = GetUnitOwner()->GetAuraEffect(SPELL_PRIEST_SINS_OF_THE_MANY, effectIndex))
- sinOfTheMany->ChangeAmount(damageByStack[std::min(_appliedAtonements.size(), damageByStack.size() - 1)]);
- }
-};
-
-// 81751 - Atonement (Heal)
-class spell_pri_abyssal_reverie : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_PRIEST_ABYSSAL_REVERIE, EFFECT_0 } });
- }
-
- void CalculateHealingBonus(Unit const* /*victim*/, int32 const& /*healing*/, int32 const& /*flatMod*/, float& pctMod) const
- {
- spell_pri_atonement::TriggerArgs const* args = std::any_cast<spell_pri_atonement::TriggerArgs>(&GetSpell()->m_customArg);
- if (!args || !(args->DamageSchoolMask & SPELL_SCHOOL_MASK_SHADOW))
- return;
-
- if (AuraEffect* const abyssalReverieEffect = GetCaster()->GetAuraEffect(SPELL_PRIEST_ABYSSAL_REVERIE, EFFECT_0))
- AddPct(pctMod, abyssalReverieEffect->GetAmount());
- }
-
- void Register() override
- {
- CalcHealing += SpellCalcHealingFn(spell_pri_abyssal_reverie::CalculateHealingBonus);
- }
-};
-
-// 17 - Power Word: Shield
-// 139 - Renew
-// 2061 - Flash Heal
-// 194509 - Power Word: Radiance
-class spell_pri_atonement_effect : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_ATONEMENT,
- SPELL_PRIEST_ATONEMENT_EFFECT,
- SPELL_PRIEST_TRINITY,
- SPELL_PRIEST_TRINITY_EFFECT,
- SPELL_PRIEST_POWER_WORD_RADIANCE,
- SPELL_PRIEST_POWER_WORD_SHIELD
- }) && ValidateSpellEffect({
- { SPELL_PRIEST_POWER_WORD_RADIANCE, EFFECT_3 },
- { SPELL_PRIEST_INDEMNITY, EFFECT_0 }
- });
- }
-
- bool Load() override
- {
- Unit* caster = GetCaster();
- if (!caster->HasAura(SPELL_PRIEST_ATONEMENT))
- return false;
-
- // only apply Trinity if the Priest has both Trinity and Atonement and the triggering spell is Power Word: Shield.
- if (caster->HasAura(SPELL_PRIEST_TRINITY))
- {
- if (GetSpellInfo()->Id != SPELL_PRIEST_POWER_WORD_SHIELD)
- return false;
-
- _effectSpellId = SPELL_PRIEST_TRINITY_EFFECT;
- }
-
- return true;
- }
-
- void HandleOnHitTarget() const
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.SetTriggeringSpell(GetSpell());
-
- switch (GetSpellInfo()->Id)
- {
- case SPELL_PRIEST_POWER_WORD_SHIELD:
- if (AuraEffect const* indemnity = caster->GetAuraEffect(SPELL_PRIEST_INDEMNITY, EFFECT_0))
- args.AddSpellMod(SPELLVALUE_DURATION,
- (Seconds(indemnity->GetAmount())
- + Milliseconds(Aura::CalcMaxDuration(sSpellMgr->AssertSpellInfo(_effectSpellId, GetCastDifficulty()),
- caster, &GetSpell()->GetPowerCost()))).count());
- break;
- case SPELL_PRIEST_POWER_WORD_RADIANCE:
- // Power Word: Radiance applies Atonement at 60 % (without modifiers) of its total duration.
- args.AddSpellMod(SPELLVALUE_DURATION_PCT, GetEffectInfo(EFFECT_3).CalcValue(caster));
- break;
- default:
- break;
- }
-
- caster->CastSpell(target, _effectSpellId, args);
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_pri_atonement_effect::HandleOnHitTarget);
- }
-
- uint32 _effectSpellId = SPELL_PRIEST_ATONEMENT_EFFECT;
-};
-
-// 194384 - Atonement (Buff), 214206 - Atonement [Trinity] (Buff)
-class spell_pri_atonement_effect_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ATONEMENT });
- }
-
- void HandleOnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- RegisterHelper<&spell_pri_atonement::AddAtonementTarget>();
- }
-
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- RegisterHelper<&spell_pri_atonement::RemoveAtonementTarget>();
- }
-
- template<void(spell_pri_atonement::*func)(ObjectGuid const&)>
- void RegisterHelper()
- {
- if (Unit* caster = GetCaster())
- if (Aura* atonement = caster->GetAura(SPELL_PRIEST_ATONEMENT))
- if (spell_pri_atonement* script = atonement->GetScript<spell_pri_atonement>())
- (script->*func)(GetTarget()->GetGUID());
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_pri_atonement_effect_aura::HandleOnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_pri_atonement_effect_aura::HandleOnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 195178 - Atonement (Passive)
-class spell_pri_atonement_passive : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_PRIEST_ATONEMENT, EFFECT_0 } });
- }
-
- static bool CheckProc(ProcEventInfo const& eventInfo)
- {
- return eventInfo.GetDamageInfo() != nullptr;
- }
-
- void HandleOnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
- {
- Unit* target = GetTarget();
- Unit* summoner = target->GetOwner();
- if (!summoner)
- return;
-
- if (AuraEffect const* atonementEffect = summoner->GetAuraEffect(SPELL_PRIEST_ATONEMENT, EFFECT_0))
- if (spell_pri_atonement* script = atonementEffect->GetBase()->GetScript<spell_pri_atonement>())
- script->TriggerAtonementHealOnTargets(atonementEffect, eventInfo);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_atonement_passive::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 33110 - Prayer of Mending (Heal)
-class spell_pri_benediction : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_RENEW })
- && ValidateSpellEffect({ { SPELL_PRIEST_BENEDICTION, EFFECT_0 } });
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/) const
- {
- if (AuraEffect const* benediction = GetCaster()->GetAuraEffect(SPELL_PRIEST_BENEDICTION, EFFECT_0))
- if (roll_chance_i(benediction->GetAmount()))
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_RENEW, TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_benediction::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_HEAL);
- }
-};
-
-// 215768 - Blaze of Light
-class spell_pri_blaze_of_light : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PRIEST_BLAZE_OF_LIGHT_DECREASE,
- SPELL_PRIEST_BLAZE_OF_LIGHT_INCREASE
- });
- }
-
- void HandleProc(ProcEventInfo& eventInfo)
- {
- Unit* procTarget = eventInfo.GetProcTarget();
- if (!procTarget)
- return;
-
- if (GetTarget()->IsValidAttackTarget(procTarget))
- GetTarget()->CastSpell(procTarget, SPELL_PRIEST_BLAZE_OF_LIGHT_DECREASE, TriggerCastFlags(TRIGGERED_CAST_DIRECTLY | TRIGGERED_IGNORE_CAST_IN_PROGRESS));
- else
- GetTarget()->CastSpell(procTarget, SPELL_PRIEST_BLAZE_OF_LIGHT_INCREASE, TriggerCastFlags(TRIGGERED_CAST_DIRECTLY | TRIGGERED_IGNORE_CAST_IN_PROGRESS));
- }
-
- void Register() override
- {
- OnProc += AuraProcFn(spell_pri_blaze_of_light::HandleProc);
- }
-};
-
-// 204883 - Circle of Healing
-class spell_pri_circle_of_healing : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- // Note: we must remove one since target is always chosen.
- uint32 const maxTargets = uint32(GetSpellInfo()->GetEffect(EFFECT_1).CalcValue(GetCaster()) - 1);
-
- Trinity::SelectRandomInjuredTargets(targets, maxTargets, true);
-
- if (Unit* explicitTarget = GetExplTargetUnit())
- targets.push_front(explicitTarget);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_circle_of_healing::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 17 - Power Word: Shield
-class spell_pri_crystalline_reflection : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_CRYSTALLINE_REFLECTION,
- SPELL_PRIEST_CRYSTALLINE_REFLECTION_HEAL,
- SPELL_PRIEST_CRYSTALLINE_REFLECTION_REFLECT,
- }) && ValidateSpellEffect({ { SPELL_PRIEST_CRYSTALLINE_REFLECTION, EFFECT_0 } });
- }
-
- void HandleOnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- // Crystalline Reflection Heal
- if (caster->HasAura(SPELL_PRIEST_CRYSTALLINE_REFLECTION))
- caster->CastSpell(GetTarget(), SPELL_PRIEST_CRYSTALLINE_REFLECTION_HEAL, CastSpellExtraArgs(aurEff)
- .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR));
- }
-
- void HandleAfterAbsorb(AuraEffect const* /*aurEff*/, DamageInfo const& dmgInfo, uint32 const& absorbAmount) const
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- AuraEffect const* auraEff = caster->GetAuraEffect(SPELL_PRIEST_CRYSTALLINE_REFLECTION, EFFECT_0);
- if (!auraEff)
- return;
-
- Unit* attacker = dmgInfo.GetAttacker();
- if (!attacker)
- return;
-
- CastSpellExtraArgs args(TRIGGERED_DONT_REPORT_CAST_ERROR);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(absorbAmount, auraEff->GetAmount()));
- caster->CastSpell(attacker, SPELL_PRIEST_CRYSTALLINE_REFLECTION_REFLECT, args);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_pri_crystalline_reflection::HandleOnApply, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_crystalline_reflection::HandleAfterAbsorb, EFFECT_0);
- }
-};
-
-// 8092 - Mind Blast
-class spell_pri_dark_indulgence : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_PRIEST_DARK_INDULGENCE, EFFECT_0 } });
- }
-
- void HandleEffectHit(SpellEffIndex /*effIndex*/) const
- {
- AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_PRIEST_DARK_INDULGENCE, EFFECT_0);
- if (!aurEff)
- return;
-
- if (roll_chance_i(aurEff->GetAmount()))
- GetCaster()->CastSpell(GetCaster(), SPELL_PRIEST_POWER_OF_THE_DARK_SIDE, true);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_pri_dark_indulgence::HandleEffectHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-namespace DivineImageHelpers
-{
-Unit* GetSummon(Unit const* owner)
-{
- for (Unit* summon : owner->m_Controlled)
- if (summon->GetEntry() == NPC_PRIEST_DIVINE_IMAGE)
- return summon;
-
- return nullptr;
-}
-
-Optional<uint32> GetSpellToCast(uint32 spellId)
-{
- switch (spellId)
- {
- case SPELL_PRIEST_RENEW:
- return SPELL_PRIEST_TRANQUIL_LIGHT;
- case SPELL_PRIEST_POWER_WORD_SHIELD:
- case SPELL_PRIEST_POWER_WORD_LIFE:
- case SPELL_PRIEST_FLASH_HEAL:
- case SPELL_PRIEST_HEAL:
- case SPELL_PRIEST_GREATER_HEAL:
- case SPELL_PRIEST_HOLY_WORD_SERENITY:
- return SPELL_PRIEST_HEALING_LIGHT;
- case SPELL_PRIEST_PRAYER_OF_MENDING:
- case SPELL_PRIEST_PRAYER_OF_MENDING_HEAL:
- return SPELL_PRIEST_BLESSED_LIGHT;
- case SPELL_PRIEST_PRAYER_OF_HEALING:
- case SPELL_PRIEST_CIRCLE_OF_HEALING:
- case SPELL_PRIEST_HALO_HOLY:
- case SPELL_PRIEST_DIVINE_STAR_HOLY_HEAL:
- case SPELL_PRIEST_DIVINE_HYMN_HEAL:
- case SPELL_PRIEST_HOLY_WORD_SANCTIFY:
- case SPELL_PRIEST_HOLY_WORD_SALVATION:
- return SPELL_PRIEST_DAZZLING_LIGHT;
- case SPELL_PRIEST_SHADOW_WORD_PAIN:
- case SPELL_PRIEST_SMITE:
- case SPELL_PRIEST_HOLY_FIRE:
- case SPELL_PRIEST_SHADOW_WORD_DEATH:
- case SPELL_PRIEST_HOLY_WORD_CHASTISE:
- case SPELL_PRIEST_MINDGAMES:
- case SPELL_PRIEST_MINDGAMES_VENTHYR:
- return SPELL_PRIEST_SEARING_LIGHT;
- case SPELL_PRIEST_HOLY_NOVA:
- return SPELL_PRIEST_LIGHT_ERUPTION;
- default:
- break;
- }
-
- return {};
-}
-
-void Trigger(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
-{
- Unit* target = eventInfo.GetActor();
- if (!target)
- return;
-
- Unit* divineImage = GetSummon(target);
- if (!divineImage)
- return;
-
- Optional<uint32> spellId = GetSpellToCast(eventInfo.GetSpellInfo()->Id);
- if (!spellId)
- return;
-
- divineImage->CastSpell(SpellCastTargets(eventInfo.GetProcSpell()->m_targets), *spellId, aurEff);
-}
-}
-
-// 392988 - Divine Image
-class spell_pri_divine_image : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_DIVINE_IMAGE_SUMMON,
- SPELL_PRIEST_DIVINE_IMAGE_EMPOWER,
- SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK
- });
- }
-
- static void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
- {
- Unit* target = eventInfo.GetActor();
- if (!target)
- return;
-
- // Note: if target has an active Divine Image, we should empower it rather than summoning a new one.
- if (Unit* divineImage = DivineImageHelpers::GetSummon(target))
- {
- // Note: Divine Image now teleports near the target when they cast a Holy Word spell if the Divine Image is further than 15 yards away (Patch 10.1.0).
- if (target->GetDistance(divineImage) > 15.0f)
- divineImage->NearTeleportTo(target->GetRandomNearPosition(3.0f));
-
- if (TempSummon* tempSummon = divineImage->ToTempSummon())
- tempSummon->RefreshTimer();
-
- divineImage->CastSpell(divineImage, SPELL_PRIEST_DIVINE_IMAGE_EMPOWER, eventInfo.GetProcSpell());
- }
- else
- {
- target->CastSpell(target, SPELL_PRIEST_DIVINE_IMAGE_SUMMON, CastSpellExtraArgs()
- .SetTriggeringAura(aurEff)
- .SetTriggeringSpell(eventInfo.GetProcSpell())
- .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DISALLOW_PROC_EVENTS | TRIGGERED_DONT_REPORT_CAST_ERROR));
-
- // Note: Divine Image triggers a cast immediately based on the Holy Word cast.
- DivineImageHelpers::Trigger(aurEff, eventInfo);
- }
-
- target->CastSpell(target, SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK, CastSpellExtraArgs()
- .SetTriggeringAura(aurEff)
- .SetTriggeringSpell(eventInfo.GetProcSpell())
- .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DISALLOW_PROC_EVENTS | TRIGGERED_DONT_REPORT_CAST_ERROR));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_divine_image::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 405216 - Divine Image (Spell Cast Check)
-class spell_pri_divine_image_spell_triggered : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_RENEW,
- SPELL_PRIEST_POWER_WORD_SHIELD,
- SPELL_PRIEST_POWER_WORD_LIFE,
- SPELL_PRIEST_FLASH_HEAL,
- SPELL_PRIEST_HOLY_WORD_SERENITY,
- SPELL_PRIEST_PRAYER_OF_MENDING,
- SPELL_PRIEST_PRAYER_OF_MENDING_HEAL,
- SPELL_PRIEST_PRAYER_OF_HEALING,
- SPELL_PRIEST_CIRCLE_OF_HEALING,
- SPELL_PRIEST_HALO_HOLY,
- SPELL_PRIEST_DIVINE_STAR_HOLY_HEAL,
- SPELL_PRIEST_DIVINE_HYMN_HEAL,
- SPELL_PRIEST_HOLY_WORD_SANCTIFY,
- SPELL_PRIEST_HOLY_WORD_SALVATION,
- SPELL_PRIEST_SMITE,
- SPELL_PRIEST_HOLY_FIRE,
- SPELL_PRIEST_SHADOW_WORD_DEATH,
- SPELL_PRIEST_SHADOW_WORD_PAIN,
- SPELL_PRIEST_MINDGAMES,
- SPELL_PRIEST_MINDGAMES_VENTHYR,
- SPELL_PRIEST_HOLY_WORD_CHASTISE,
- SPELL_PRIEST_HOLY_NOVA,
- SPELL_PRIEST_TRANQUIL_LIGHT,
- SPELL_PRIEST_HEALING_LIGHT,
- SPELL_PRIEST_BLESSED_LIGHT,
- SPELL_PRIEST_DAZZLING_LIGHT,
- SPELL_PRIEST_SEARING_LIGHT,
- SPELL_PRIEST_LIGHT_ERUPTION,
- SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK
- });
- }
-
- static bool CheckProc(ProcEventInfo const& eventInfo)
- {
- return DivineImageHelpers::GetSummon(eventInfo.GetActor()) != nullptr;
- }
-
- void HandleAfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pri_divine_image_spell_triggered::CheckProc);
- OnEffectProc += AuraEffectProcFn(DivineImageHelpers::Trigger, EFFECT_0, SPELL_AURA_DUMMY);
- AfterEffectRemove += AuraEffectRemoveFn(spell_pri_divine_image_spell_triggered::HandleAfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 405963 Divine Image
-// 409387 Divine Image
-class spell_pri_divine_image_stack_timer : public AuraScript
-{
- void TrackStackApplicationTime(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
- {
- GetUnitOwner()->m_Events.AddEventAtOffset([spelId = GetId(), owner = GetUnitOwner()]
- {
- owner->RemoveAuraFromStack(spelId);
- }, Milliseconds(GetMaxDuration()));
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_pri_divine_image_stack_timer::TrackStackApplicationTime, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- }
-};
-
-// 33110 - Prayer of Mending (Heal)
-class spell_pri_divine_service : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_PRAYER_OF_MENDING_AURA })
- && ValidateSpellEffect({ { SPELL_PRIEST_DIVINE_SERVICE, EFFECT_0 } });
- }
-
- void CalculateHealingBonus(Unit const* victim, int32& /*healing*/, int32& /*flatMod*/, float& pctMod) const
- {
- if (AuraEffect const* divineServiceEffect = GetCaster()->GetAuraEffect(SPELL_PRIEST_DIVINE_SERVICE, EFFECT_0))
- if (Aura const* prayerOfMending = victim->GetAura(SPELL_PRIEST_PRAYER_OF_MENDING_AURA, GetCaster()->GetGUID()))
- AddPct(pctMod, int32(divineServiceEffect->GetAmount() * prayerOfMending->GetStackAmount()));
- }
-
- void Register() override
- {
- CalcHealing += SpellCalcHealingFn(spell_pri_divine_service::CalculateHealingBonus);
- }
-};
-
-// 122121 - Divine Star (Shadow)
-class spell_pri_divine_star_shadow : public SpellScript
-{
- void HandleHitTarget(SpellEffIndex effIndex)
- {
- Unit* caster = GetCaster();
-
- if (caster->GetPowerType() != GetEffectInfo().MiscValue)
- PreventHitDefaultEffect(effIndex);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_divine_star_shadow::HandleHitTarget, EFFECT_2, SPELL_EFFECT_ENERGIZE);
- }
-};
-
-// 110744 - Divine Star (Holy)
-// 122121 - Divine Star (Shadow)
-struct areatrigger_pri_divine_star : AreaTriggerAI
-{
- areatrigger_pri_divine_star(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger), _maxTravelDistance(0.0f) { }
-
- void OnInitialize() override
- {
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(at->GetSpellId(), DIFFICULTY_NONE);
- if (!spellInfo)
- return;
-
- if (spellInfo->GetEffects().size() <= EFFECT_1)
- return;
-
- Unit* caster = at->GetCaster();
- if (!caster)
- return;
-
- _casterCurrentPosition = caster->GetPosition();
-
- // Note: max. distance at which the Divine Star can travel to is EFFECT_1's BasePoints yards.
- _maxTravelDistance = float(spellInfo->GetEffect(EFFECT_1).CalcValue(caster));
-
- Position destPos = _casterCurrentPosition;
- at->MovePositionToFirstCollision(destPos, _maxTravelDistance, 0.0f);
-
- PathGenerator firstPath(at);
- firstPath.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), false);
-
- G3D::Vector3 const& endPoint = firstPath.GetPath().back();
-
- // Note: it takes 1000ms to reach EFFECT_1's BasePoints yards, so it takes (1000 / EFFECT_1's BasePoints)ms to run 1 yard.
- at->InitSplines(firstPath.GetPath(), at->GetDistance(endPoint.x, endPoint.y, endPoint.z) * float(1000 / _maxTravelDistance));
- }
-
- void OnUpdate(uint32 diff) override
- {
- _scheduler.Update(diff);
- }
-
- void OnUnitEnter(Unit* unit) override
- {
- HandleUnitEnterExit(unit);
- }
-
- void OnUnitExit(Unit* unit) override
- {
- // Note: this ensures any unit receives a second hit if they happen to be inside the AT when Divine Star starts its return path.
- HandleUnitEnterExit(unit);
- }
-
- void HandleUnitEnterExit(Unit* unit)
- {
- Unit* caster = at->GetCaster();
- if (!caster)
- return;
-
- if (std::find(_affectedUnits.begin(), _affectedUnits.end(), unit->GetGUID()) != _affectedUnits.end())
- return;
-
- constexpr TriggerCastFlags TriggerFlags = TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS;
-
- if (caster->IsValidAttackTarget(unit))
- caster->CastSpell(unit, at->GetSpellId() == SPELL_PRIEST_DIVINE_STAR_SHADOW ? SPELL_PRIEST_DIVINE_STAR_SHADOW_DAMAGE : SPELL_PRIEST_DIVINE_STAR_HOLY_DAMAGE,
- TriggerFlags);
- else if (caster->IsValidAssistTarget(unit))
- caster->CastSpell(unit, at->GetSpellId() == SPELL_PRIEST_DIVINE_STAR_SHADOW ? SPELL_PRIEST_DIVINE_STAR_SHADOW_HEAL : SPELL_PRIEST_DIVINE_STAR_HOLY_HEAL,
- TriggerFlags);
-
- _affectedUnits.push_back(unit->GetGUID());
- }
-
- void OnDestinationReached() override
- {
- Unit* caster = at->GetCaster();
- if (!caster)
- return;
-
- if (at->GetDistance(_casterCurrentPosition) > 0.05f)
- {
- _affectedUnits.clear();
-
- ReturnToCaster();
- }
- else
- at->Remove();
- }
-
- void ReturnToCaster()
- {
- _scheduler.Schedule(0ms, [this](TaskContext task)
- {
- Unit* caster = at->GetCaster();
- if (!caster)
- return;
-
- _casterCurrentPosition = caster->GetPosition();
-
- Movement::PointsArray returnSplinePoints;
-
- returnSplinePoints.push_back(PositionToVector3(at));
- returnSplinePoints.push_back(PositionToVector3(at));
- returnSplinePoints.push_back(PositionToVector3(caster));
- returnSplinePoints.push_back(PositionToVector3(caster));
-
- at->InitSplines(returnSplinePoints, uint32(at->GetDistance(caster) / _maxTravelDistance * 1000));
-
- task.Repeat(250ms);
- });
- }
-
-private:
- TaskScheduler _scheduler;
- Position _casterCurrentPosition;
- std::vector<ObjectGuid> _affectedUnits;
- float _maxTravelDistance;
-};
-
-// 391339 - Empowered Renew
-class spell_pri_empowered_renew : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_RENEW, SPELL_PRIEST_EMPOWERED_RENEW_HEAL })
- && ValidateSpellEffect({ { SPELL_PRIEST_RENEW, EFFECT_0 } })
- && sSpellMgr->AssertSpellInfo(SPELL_PRIEST_RENEW, DIFFICULTY_NONE)->GetEffect(EFFECT_0).IsAura(SPELL_AURA_PERIODIC_HEAL);
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- SpellInfo const* renewSpellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_RENEW, GetCastDifficulty());
- SpellEffectInfo const& renewEffect = renewSpellInfo->GetEffect(EFFECT_0);
- int32 estimatedTotalHeal = AuraEffect::CalculateEstimatedfTotalPeriodicAmount(caster, target, renewSpellInfo, renewEffect, renewEffect.CalcValue(caster), 1);
- int32 healAmount = CalculatePct(estimatedTotalHeal, aurEff->GetAmount());
-
- caster->CastSpell(target, SPELL_PRIEST_EMPOWERED_RENEW_HEAL, CastSpellExtraArgs(aurEff).AddSpellBP0(healAmount));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_empowered_renew::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 414553 - Epiphany
-class spell_pri_epiphany : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_PRAYER_OF_MENDING, SPELL_PRIEST_EPIPHANY_HIGHLIGHT });
- }
-
- static bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- return roll_chance_i(aurEff->GetAmount());
- }
-
- void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) const
- {
- Unit* target = GetTarget();
-
- target->GetSpellHistory()->ResetCooldown(SPELL_PRIEST_PRAYER_OF_MENDING, true);
-
- target->CastSpell(target, SPELL_PRIEST_EPIPHANY_HIGHLIGHT, aurEff);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_epiphany::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pri_epiphany::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 415673 - Essence Devourer (Heal)
-// 415676 - Essence Devourer (Heal)
-class spell_pri_essence_devourer_heal : public SpellScript
-{
- static void FilterTargets(std::list<WorldObject*>& targets)
- {
- Trinity::SelectRandomInjuredTargets(targets, 1, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_essence_devourer_heal::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 246287 - Evangelism
-class spell_pri_evangelism : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_TRINITY,
- SPELL_PRIEST_ATONEMENT_EFFECT,
- SPELL_PRIEST_TRINITY_EFFECT
- });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/) const
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- Aura* atonementAura = caster->HasAura(SPELL_PRIEST_TRINITY)
- ? target->GetAura(SPELL_PRIEST_TRINITY_EFFECT, caster->GetGUID())
- : target->GetAura(SPELL_PRIEST_ATONEMENT_EFFECT, caster->GetGUID());
- if (!atonementAura)
- return;
-
- Milliseconds extraDuration = Seconds(GetEffectValue());
-
- atonementAura->SetDuration(atonementAura->GetDuration() + extraDuration.count());
- atonementAura->SetMaxDuration(atonementAura->GetDuration() + extraDuration.count());
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_evangelism::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-// 33110 - Prayer of Mending (Heal)
-class spell_pri_focused_mending : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_PRIEST_FOCUSED_MENDING, EFFECT_0 } });
- }
-
- void CalculateHealingBonus(Unit* /*victim*/, int32& /*healing*/, int32& /*flatMod*/, float& pctMod) const
- {
- if (AuraEffect const* focusedMendingEffect = GetCaster()->GetAuraEffect(SPELL_PRIEST_FOCUSED_MENDING, EFFECT_0))
- {
- bool const* isEmpoweredByFocusedMending = std::any_cast<bool>(&GetSpell()->m_customArg);
-
- if (isEmpoweredByFocusedMending && *isEmpoweredByFocusedMending)
- AddPct(pctMod, focusedMendingEffect->GetAmount());
- }
- }
-
- void Register() override
- {
- CalcHealing += SpellCalcHealingFn(spell_pri_focused_mending::CalculateHealingBonus);
- }
-};
-
-// 390615 - From Darkness Comes Light (Talent)
-class spell_pri_from_darkness_comes_light : public AuraScript
-{
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_FROM_DARKNESS_COMES_LIGHT_AURA, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_from_darkness_comes_light::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 47788 - Guardian Spirit
-class spell_pri_guardian_spirit : public AuraScript
-{
- uint32 healPct = 0;
-
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL }) && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- bool Load() override
- {
- healPct = GetEffectInfo(EFFECT_1).CalcValue();
- return true;
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
- {
- // Set absorbtion amount to unlimited
- amount = -1;
- }
-
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
- {
- Unit* target = GetTarget();
- if (dmgInfo.GetDamage() < target->GetHealth())
- return;
-
- int32 healAmount = int32(target->CountPctFromMaxHealth(healPct));
- // remove the aura now, we don't want 40% healing bonus
- Remove(AURA_REMOVE_BY_ENEMY_SPELL);
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellBP0(healAmount);
- target->CastSpell(target, SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL, args);
- absorbAmount = dmgInfo.GetDamage();
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_guardian_spirit::CalculateAmount, EFFECT_1, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_pri_guardian_spirit::Absorb, EFFECT_1);
- }
-};
-
-// 421558 - Heaven's Wrath
-class spell_pri_heavens_wrath : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ULTIMATE_PENITENCE });
- }
-
- bool CheckProc(ProcEventInfo const& eventInfo) const
- {
- return !(eventInfo.GetSpellInfo()->Id == SPELL_PRIEST_ULTIMATE_PENITENCE_DAMAGE || eventInfo.GetSpellInfo()->Id == SPELL_PRIEST_ULTIMATE_PENITENCE_HEAL);
- }
-
- void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
- {
- Unit* caster = eventInfo.GetActor();
- if (!caster)
- return;
-
- int32 cdReduction = aurEff->GetAmount();
- caster->GetSpellHistory()->ModifyCooldown(SPELL_PRIEST_ULTIMATE_PENITENCE, Seconds(-cdReduction), true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_heavens_wrath::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 120644 - Halo (Shadow)
-class spell_pri_halo_shadow : public SpellScript
-{
- void HandleHitTarget(SpellEffIndex effIndex)
- {
- Unit* caster = GetCaster();
-
- if (caster->GetPowerType() != GetEffectInfo().MiscValue)
- PreventHitDefaultEffect(effIndex);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_halo_shadow::HandleHitTarget, EFFECT_1, SPELL_EFFECT_ENERGIZE);
- }
-};
-
-// 120517 - Halo (Holy)
-// 120644 - Halo (Shadow)
-struct areatrigger_pri_halo : AreaTriggerAI
-{
- areatrigger_pri_halo(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) {}
-
- void OnUnitEnter(Unit* unit) override
- {
- if (Unit* caster = at->GetCaster())
- {
- if (caster->IsValidAttackTarget(unit))
- caster->CastSpell(unit, at->GetSpellId() == SPELL_PRIEST_HALO_SHADOW ? SPELL_PRIEST_HALO_SHADOW_DAMAGE : SPELL_PRIEST_HALO_HOLY_DAMAGE,
- TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- else if (caster->IsValidAssistTarget(unit))
- caster->CastSpell(unit, at->GetSpellId() == SPELL_PRIEST_HALO_SHADOW ? SPELL_PRIEST_HALO_SHADOW_HEAL : SPELL_PRIEST_HALO_HOLY_HEAL,
- TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
- }
-};
-
-// 391154 - Holy Mending
-class spell_pri_holy_mending : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_RENEW, SPELL_PRIEST_HOLY_MENDING_HEAL });
- }
-
- bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
- {
- return procInfo.GetProcTarget()->HasAura(SPELL_PRIEST_RENEW, procInfo.GetActor()->GetGUID());
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_HOLY_MENDING_HEAL, CastSpellExtraArgs(aurEff));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_holy_mending::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- OnEffectProc += AuraEffectProcFn(spell_pri_holy_mending::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 63733 - Holy Words
-class spell_pri_holy_words : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_PRIEST_HEAL,
- SPELL_PRIEST_FLASH_HEAL,
- SPELL_PRIEST_PRAYER_OF_HEALING,
- SPELL_PRIEST_RENEW,
- SPELL_PRIEST_SMITE,
- SPELL_PRIEST_HOLY_WORD_CHASTISE,
- SPELL_PRIEST_HOLY_WORD_SANCTIFY,
- SPELL_PRIEST_HOLY_WORD_SERENITY
- }) && ValidateSpellEffect(
- {
- { SPELL_PRIEST_HOLY_WORD_SERENITY, EFFECT_1 },
- { SPELL_PRIEST_HOLY_WORD_SANCTIFY, EFFECT_3 },
- { SPELL_PRIEST_HOLY_WORD_CHASTISE, EFFECT_1 }
- });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
- if (!spellInfo)
- return;
-
- uint32 targetSpellId;
- SpellEffIndex cdReductionEffIndex;
- switch (spellInfo->Id)
- {
- case SPELL_PRIEST_HEAL:
- case SPELL_PRIEST_FLASH_HEAL: // reduce Holy Word: Serenity cd by 6 seconds
- targetSpellId = SPELL_PRIEST_HOLY_WORD_SERENITY;
- cdReductionEffIndex = EFFECT_1;
- // cdReduction = sSpellMgr->GetSpellInfo(SPELL_PRIEST_HOLY_WORD_SERENITY, GetCastDifficulty())->GetEffect(EFFECT_1)->CalcValue(player);
- break;
- case SPELL_PRIEST_PRAYER_OF_HEALING: // reduce Holy Word: Sanctify cd by 6 seconds
- targetSpellId = SPELL_PRIEST_HOLY_WORD_SANCTIFY;
- cdReductionEffIndex = EFFECT_2;
- break;
- case SPELL_PRIEST_RENEW: // reuce Holy Word: Sanctify cd by 2 seconds
- targetSpellId = SPELL_PRIEST_HOLY_WORD_SANCTIFY;
- cdReductionEffIndex = EFFECT_3;
- break;
- case SPELL_PRIEST_SMITE: // reduce Holy Word: Chastise cd by 4 seconds
- targetSpellId = SPELL_PRIEST_HOLY_WORD_CHASTISE;
- cdReductionEffIndex = EFFECT_1;
- break;
- default:
- TC_LOG_WARN("spells.priest", "HolyWords aura has been proced by an unknown spell: {}", GetSpellInfo()->Id);
- return;
- }
-
- SpellInfo const* targetSpellInfo = sSpellMgr->AssertSpellInfo(targetSpellId, GetCastDifficulty());
- int32 cdReduction = targetSpellInfo->GetEffect(cdReductionEffIndex).CalcValue(GetTarget());
- GetTarget()->GetSpellHistory()->ModifyCooldown(targetSpellInfo, Seconds(-cdReduction), true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_holy_words::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 265202 - Holy Word: Salvation
-class spell_pri_holy_word_salvation : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_PRAYER_OF_MENDING_AURA,
- SPELL_PRIEST_RENEW
- }) && ValidateSpellEffect({
- { SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, EFFECT_0 },
- { spellInfo->Id, EFFECT_1 }
- }) && spellInfo->GetEffect(EFFECT_1).TargetB.GetTarget() == TARGET_UNIT_SRC_AREA_ALLY;
- }
-
- bool Load() override
- {
- _spellInfoHeal = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, DIFFICULTY_NONE);
- _healEffectDummy = &_spellInfoHeal->GetEffect(EFFECT_0);
- return true;
- }
-
- void HandleApplyBuffs(SpellEffIndex /*effIndex*/) const
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
-
- // amount of Prayer of Mending is SPELL_PRIEST_HOLY_WORD_SALVATION's EFFECT_1.
- args.AddSpellMod(SPELLVALUE_AURA_STACK, GetEffectValue());
-
- int32 basePoints = caster->SpellHealingBonusDone(target, _spellInfoHeal, _healEffectDummy->CalcValue(caster), HEAL, *_healEffectDummy);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, basePoints);
- caster->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_AURA, args);
-
- // a full duration Renew is triggered.
- caster->CastSpell(target, SPELL_PRIEST_RENEW, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetTriggeringSpell(GetSpell()));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_holy_word_salvation::HandleApplyBuffs, EFFECT_1, SPELL_EFFECT_DUMMY);
- }
-
- SpellInfo const* _spellInfoHeal = nullptr;
- SpellEffectInfo const* _healEffectDummy = nullptr;
-};
-
-// 2050 - Holy Word: Serenity
-// 34861 - Holy Word: Sanctify
-class spell_pri_holy_word_salvation_cooldown_reduction : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_HOLY_WORD_SALVATION })
- && ValidateSpellEffect({ { SPELL_PRIEST_HOLY_WORD_SALVATION, EFFECT_2 } });
- }
-
- bool Load() override
- {
- return GetCaster()->HasSpell(SPELL_PRIEST_HOLY_WORD_SALVATION);
- }
-
- void ReduceCooldown() const
- {
- // cooldown reduced by SPELL_PRIEST_HOLY_WORD_SALVATION's Seconds(EFFECT_2).
- int32 cooldownReduction = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_HOLY_WORD_SALVATION, GetCastDifficulty())->GetEffect(EFFECT_2).CalcValue(GetCaster());
-
- GetCaster()->GetSpellHistory()->ModifyCooldown(SPELL_PRIEST_HOLY_WORD_SALVATION, Seconds(-cooldownReduction), true);
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_pri_holy_word_salvation_cooldown_reduction::ReduceCooldown);
- }
-};
-
-// 40438 - Priest Tier 6 Trinket
-class spell_pri_item_t6_trinket : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_DIVINE_BLESSING, SPELL_PRIEST_DIVINE_WRATH });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Unit* caster = eventInfo.GetActor();
- if (eventInfo.GetSpellTypeMask() & PROC_SPELL_TYPE_HEAL)
- caster->CastSpell(nullptr, SPELL_PRIEST_DIVINE_BLESSING, true);
-
- if (eventInfo.GetSpellTypeMask() & PROC_SPELL_TYPE_DAMAGE)
- caster->CastSpell(nullptr, SPELL_PRIEST_DIVINE_WRATH, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_item_t6_trinket::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 92833 - Leap of Faith
-class spell_pri_leap_of_faith_effect_trigger : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_LEAP_OF_FAITH_EFFECT });
- }
-
- void HandleEffectDummy(SpellEffIndex /*effIndex*/)
- {
- Position destPos = GetHitDest()->GetPosition();
-
- SpellCastTargets targets;
- targets.SetDst(destPos);
- targets.SetUnitTarget(GetCaster());
- GetHitUnit()->CastSpell(std::move(targets), GetEffectValue(), GetCastDifficulty());
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_leap_of_faith_effect_trigger::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 1706 - Levitate
-class spell_pri_levitate : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_LEVITATE_EFFECT });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_LEVITATE_EFFECT, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_levitate::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 373178 - Light's Wrath
-class spell_pri_lights_wrath : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void OnPrecast() override
- {
- Aura const* atonement = GetCaster()->GetAura(SPELL_PRIEST_ATONEMENT);
- if (!atonement)
- return;
-
- spell_pri_atonement const* script = atonement->GetScript<spell_pri_atonement>();
- if (!script)
- return;
-
- for (ObjectGuid const& atonementTarget : script->GetAtonementTargets())
- {
- if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), atonementTarget))
- {
- target->CancelSpellMissiles(SPELL_PRIEST_LIGHTS_WRATH_VISUAL, false, false);
- target->CastSpell(GetCaster(), SPELL_PRIEST_LIGHTS_WRATH_VISUAL, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
- }
- }
-
- void CalculateDamageBonus(Unit const* /*victim*/, int32 const& /*damage*/, int32 const& /*flatMod*/, float& pctMod) const
- {
- Aura const* atonement = GetCaster()->GetAura(SPELL_PRIEST_ATONEMENT);
- if (!atonement)
- return;
-
- // Atonement size may have changed when missile hits, we need to take an updated count of Atonement applications.
- if (spell_pri_atonement const* script = atonement->GetScript<spell_pri_atonement>())
- AddPct(pctMod, GetEffectInfo(EFFECT_1).CalcValue(GetCaster()) * script->GetAtonementTargets().size());
- }
-
- void Register() override
- {
- CalcDamage += SpellCalcDamageFn(spell_pri_lights_wrath::CalculateDamageBonus);
- }
-};
-
-// 205369 - Mind Bomb
-class spell_pri_mind_bomb : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_MIND_BOMB_STUN });
- }
-
- void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH || GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
- if (Unit* caster = GetCaster())
- caster->CastSpell(GetTarget()->GetPosition(), SPELL_PRIEST_MIND_BOMB_STUN, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_pri_mind_bomb::RemoveEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 390686 - Painful Punishment
-class spell_pri_painful_punishment : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_SHADOW_WORD_PAIN,
- SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC
- });
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetActionTarget();
- if (!caster || !target)
- return;
-
- int32 additionalDuration = aurEff->GetAmount();
-
- if (Aura* shadowWordPain = target->GetOwnedAura(SPELL_PRIEST_SHADOW_WORD_PAIN, caster->GetGUID()))
- shadowWordPain->SetDuration(shadowWordPain->GetDuration() + additionalDuration);
-
- if (Aura* purgeTheWicked = target->GetOwnedAura(SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC, caster->GetGUID()))
- purgeTheWicked->SetDuration(purgeTheWicked->GetDuration() + additionalDuration);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_painful_punishment::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 372991 - Pain Transformation
-// Triggered by 33206 - Pain Suppression
-class spell_pri_pain_transformation : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_ATONEMENT_EFFECT,
- SPELL_PRIEST_TRINITY,
- SPELL_PRIEST_PAIN_TRANSFORMATION,
- SPELL_PRIEST_PAIN_TRANSFORMATION_HEAL
- });
- }
-
- bool Load() override
- {
- return GetCaster()->HasAura(SPELL_PRIEST_PAIN_TRANSFORMATION) && !GetCaster()->HasAura(SPELL_PRIEST_TRINITY);
- }
-
- void HandleHit(SpellEffIndex /*effIndex*/) const
- {
- CastSpellExtraArgs args(GetSpell());
- args.SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
-
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_PAIN_TRANSFORMATION_HEAL, args);
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_ATONEMENT_EFFECT, args);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_pain_transformation::HandleHit, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- }
-};
-
-// 47540 - Penance
-// 400169 - Dark Reprimand
-class spell_pri_penance : public SpellScript
-{
-public:
- spell_pri_penance(uint32 damageSpellId, uint32 healingSpellId) : _damageSpellId(damageSpellId), _healingSpellId(healingSpellId)
- {
- }
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ _damageSpellId, _healingSpellId });
- }
-
- SpellCastResult CheckCast()
- {
- Unit* caster = GetCaster();
-
- if (Unit* target = GetExplTargetUnit())
- {
- if (!caster->IsFriendlyTo(target))
- {
- if (!caster->IsValidAttackTarget(target))
- return SPELL_FAILED_BAD_TARGETS;
-
- if (!caster->isInFront(target))
- return SPELL_FAILED_UNIT_NOT_INFRONT;
- }
- }
-
- return SPELL_CAST_OK;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
-
- if (Unit* target = GetHitUnit())
- {
- if (caster->IsFriendlyTo(target))
- caster->CastSpell(target, _healingSpellId, CastSpellExtraArgs(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)
- .SetTriggeringSpell(GetSpell()));
- else
- caster->CastSpell(target, _damageSpellId, CastSpellExtraArgs(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)
- .SetTriggeringSpell(GetSpell()));
- }
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_pri_penance::CheckCast);
- OnEffectHitTarget += SpellEffectFn(spell_pri_penance::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-
-private:
- uint32 _damageSpellId;
- uint32 _healingSpellId;
-};
-
-// 47758 - Penance (Channel Damage), 47757 - Penance (Channel Healing)
-// 373129 - Dark Reprimand (Channel Damage), 400171 - Dark Reprimand (Channel Healing)
-class spell_pri_penance_or_dark_reprimand_channeled : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_POWER_OF_THE_DARK_SIDE });
- }
-
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- caster->RemoveAura(SPELL_PRIEST_POWER_OF_THE_DARK_SIDE);
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_pri_penance_or_dark_reprimand_channeled::HandleOnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 114239 - Phantasm
-class spell_pri_phantasm : public SpellScript
-{
- void HandleEffectHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->RemoveMovementImpairingAuras(false);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_pri_phantasm::HandleEffectHit, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 262484 - Power Leech (Passive for Shadowfiend)
-// 284621 - Power Leech (Passive for Mindbender)
-class spell_pri_power_leech_passive : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY,
- SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA,
- SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY,
- SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA,
- SPELL_PRIEST_ESSENCE_DEVOURER,
- SPELL_PRIEST_ESSENCE_DEVOURER_SHADOWFIEND_HEAL,
- SPELL_PRIEST_ESSENCE_DEVOURER_MINDBENDER_HEAL
- })
- && ValidateSpellEffect
- ({
- { SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY, EFFECT_0 },
- { SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA, EFFECT_0 },
- { SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY, EFFECT_0 },
- { SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA, EFFECT_0 }
- });
- }
-
- static bool CheckProc(ProcEventInfo const& eventInfo)
- {
- return eventInfo.GetDamageInfo() != nullptr;
- }
-
- void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) const
- {
- Unit* target = GetTarget();
- Player* summoner = Object::ToPlayer(target->GetOwner());
- if (!summoner)
- return;
-
- SpellInfo const* spellInfo = nullptr;
- int32 divisor = 1;
-
- if (summoner->GetPrimarySpecialization() != ChrSpecialization::PriestShadow)
- {
- if (target->GetEntry() == NPC_PRIEST_SHADOWFIEND)
- {
- // Note: divisor is 100 because effect value is 5 and its supposed to restore 0.5%
- spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA, GetCastDifficulty());
- divisor = 10;
- }
- else
- {
- // Note: divisor is 100 because effect value is 20 and its supposed to restore 0.2%
- spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA, GetCastDifficulty());
- divisor = 100;
- }
- }
- else
- spellInfo = sSpellMgr->AssertSpellInfo(target->GetEntry() == NPC_PRIEST_SHADOWFIEND
- ? SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY
- : SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY, GetCastDifficulty());
-
- target->CastSpell(summoner, spellInfo->Id, CastSpellExtraArgs(aurEff)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, spellInfo->GetEffect(EFFECT_0).CalcValue() / divisor));
-
- // Note: Essence Devourer talent.
- if (summoner->HasAura(SPELL_PRIEST_ESSENCE_DEVOURER))
- summoner->CastSpell(nullptr, target->GetEntry() == NPC_PRIEST_SHADOWFIEND ? SPELL_PRIEST_ESSENCE_DEVOURER_SHADOWFIEND_HEAL : SPELL_PRIEST_ESSENCE_DEVOURER_MINDBENDER_HEAL, aurEff);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pri_power_leech_passive::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_power_leech_passive::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 198069 - Power of the Dark Side
-class spell_pri_power_of_the_dark_side : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_POWER_OF_THE_DARK_SIDE_TINT });
- }
-
- void HandleOnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(caster, SPELL_PRIEST_POWER_OF_THE_DARK_SIDE_TINT, true);
- }
-
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- caster->RemoveAura(SPELL_PRIEST_POWER_OF_THE_DARK_SIDE_TINT);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_pri_power_of_the_dark_side::HandleOnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_pri_power_of_the_dark_side::HandleOnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 47666 - Penance (Damage)
-// 373130 - Dark Reprimand (Damage)
-class spell_pri_power_of_the_dark_side_damage_bonus : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_POWER_OF_THE_DARK_SIDE });
- }
-
- void CalculateDamageBonus(Unit* /*victim*/, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
- {
- if (AuraEffect* powerOfTheDarkSide = GetCaster()->GetAuraEffect(SPELL_PRIEST_POWER_OF_THE_DARK_SIDE, EFFECT_0))
- AddPct(pctMod, powerOfTheDarkSide->GetAmount());
- }
-
- void Register() override
- {
- CalcDamage += SpellCalcDamageFn(spell_pri_power_of_the_dark_side_damage_bonus::CalculateDamageBonus);
- }
-};
-
-// 47750 - Penance (Healing)
-// 400187 - Dark Reprimand (Healing)
-class spell_pri_power_of_the_dark_side_healing_bonus : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_POWER_OF_THE_DARK_SIDE });
- }
-
- void CalculateHealingBonus(Unit* /*victim*/, int32& /*healing*/, int32& /*flatMod*/, float& pctMod) const
- {
- if (AuraEffect* powerOfTheDarkSide = GetCaster()->GetAuraEffect(SPELL_PRIEST_POWER_OF_THE_DARK_SIDE, EFFECT_0))
- AddPct(pctMod, powerOfTheDarkSide->GetAmount());
- }
-
- void Register() override
- {
- CalcHealing += SpellCalcHealingFn(spell_pri_power_of_the_dark_side_healing_bonus::CalculateHealingBonus);
- }
-};
-
-// 194509 - Power Word: Radiance
-class spell_pri_power_word_radiance : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ATONEMENT_EFFECT });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Unit* explTarget = GetExplTargetUnit();
-
- // we must add one since explicit target is always chosen.
- uint32 maxTargets = GetEffectInfo(EFFECT_2).CalcValue(GetCaster()) + 1;
-
- if (targets.size() > maxTargets)
- {
- // priority is: a) no Atonement b) injured c) anything else (excluding explicit target which is always added).
- targets.sort([this, explTarget](WorldObject* lhs, WorldObject* rhs)
- {
- if (lhs == explTarget) // explTarget > anything: always true
- return true;
- if (rhs == explTarget) // anything > explTarget: always false
- return false;
-
- return MakeSortTuple(lhs) > MakeSortTuple(rhs);
- });
-
- targets.resize(maxTargets);
- }
-
- for (WorldObject* target : targets)
- {
- if (target == explTarget)
- continue;
-
- _visualTargets.push_back(target->GetGUID());
- }
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/) const
- {
- for (ObjectGuid const& guid : _visualTargets)
- if (Unit* target = ObjectAccessor::GetUnit(*GetHitUnit(), guid))
- GetHitUnit()->SendPlaySpellVisual(target, SPELL_VISUAL_PRIEST_POWER_WORD_RADIANCE, 0, 0, 70.0f);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_power_word_radiance::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY);
- OnEffectHitTarget += SpellEffectFn(spell_pri_power_word_radiance::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-
-private:
- std::tuple<bool, bool> MakeSortTuple(WorldObject* obj) const
- {
- return std::make_tuple(IsUnitWithNoAtonement(obj), IsUnitInjured(obj));
- }
-
- // Returns true if obj is a unit but has no atonement
- bool IsUnitWithNoAtonement(WorldObject* obj) const
- {
- Unit* unit = obj->ToUnit();
- return unit && !unit->HasAura(SPELL_PRIEST_ATONEMENT_EFFECT, GetCaster()->GetGUID());
- }
-
- // Returns true if obj is a unit and is injured
- static bool IsUnitInjured(WorldObject* obj)
- {
- Unit* unit = obj->ToUnit();
- return unit && !unit->IsFullHealth();
- }
-
- std::vector<ObjectGuid> _visualTargets;
-};
-
-// 17 - Power Word: Shield
-class spell_pri_power_word_shield : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_STRENGTH_OF_SOUL,
- SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT,
- SPELL_PRIEST_ATONEMENT_EFFECT,
- SPELL_PRIEST_TRINITY_EFFECT,
- SPELL_PRIEST_SHIELD_DISCIPLINE,
- SPELL_PRIEST_SHIELD_DISCIPLINE_EFFECT,
- SPELL_PVP_RULES_ENABLED_HARDCODED
- }) && ValidateSpellEffect({
- { SPELL_PRIEST_MASTERY_GRACE, EFFECT_0 },
- { SPELL_PRIEST_RAPTURE, EFFECT_1 },
- { SPELL_PRIEST_BENEVOLENCE, EFFECT_0 },
- { SPELL_PRIEST_DIVINE_AEGIS, EFFECT_1 }
- });
- }
-
- void CalculateAmount(AuraEffect const* auraEffect, int32& amount, bool& canBeRecalculated) const
- {
- canBeRecalculated = false;
-
- if (Unit* caster = GetCaster())
- {
- float modifiedAmount = caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()) * 3.36f;
-
- if (Player* player = caster->ToPlayer())
- {
- AddPct(modifiedAmount, player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE));
-
- // Mastery: Grace (TBD: move into DoEffectCalcDamageAndHealing hook with a new SpellScript and AuraScript).
- if (AuraEffect const* masteryGraceEffect = caster->GetAuraEffect(SPELL_PRIEST_MASTERY_GRACE, EFFECT_0))
- if (GetUnitOwner()->HasAura(SPELL_PRIEST_ATONEMENT_EFFECT) || GetUnitOwner()->HasAura(SPELL_PRIEST_TRINITY_EFFECT))
- AddPct(modifiedAmount, masteryGraceEffect->GetAmount());
-
- switch (player->GetPrimarySpecialization())
- {
- case ChrSpecialization::PriestDiscipline:
- modifiedAmount *= 1.37f;
- break;
- case ChrSpecialization::PriestShadow:
- modifiedAmount *= 1.25f;
- if (caster->HasAura(SPELL_PVP_RULES_ENABLED_HARDCODED))
- modifiedAmount *= 0.8f;
- break;
- default:
- break;
- }
- }
-
- float critChanceDone = caster->SpellCritChanceDone(nullptr, auraEffect, GetSpellInfo()->GetSchoolMask(), GetSpellInfo()->GetAttackType());
- float critChanceTaken = GetUnitOwner()->SpellCritChanceTaken(caster, nullptr, auraEffect, GetSpellInfo()->GetSchoolMask(), critChanceDone, GetSpellInfo()->GetAttackType());
-
- if (roll_chance_f(critChanceTaken))
- {
- modifiedAmount *= 2;
-
- // Divine Aegis
- if (AuraEffect const* divineEff = caster->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_1))
- AddPct(modifiedAmount, divineEff->GetAmount());
- }
-
- // Rapture talent (TBD: move into DoEffectCalcDamageAndHealing hook).
- if (AuraEffect const* raptureEffect = caster->GetAuraEffect(SPELL_PRIEST_RAPTURE, EFFECT_1))
- AddPct(modifiedAmount, raptureEffect->GetAmount());
-
- // Benevolence talent
- if (AuraEffect const* benevolenceEffect = caster->GetAuraEffect(SPELL_PRIEST_BENEVOLENCE, EFFECT_0))
- AddPct(modifiedAmount, benevolenceEffect->GetAmount());
-
- amount = modifiedAmount;
- }
- }
-
- void HandleOnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- // Note: Strength of Soul PvP talent.
- if (caster->HasAura(SPELL_PRIEST_STRENGTH_OF_SOUL))
- caster->CastSpell(GetTarget(), SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT, aurEff);
- }
-
- void HandleOnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
- {
- GetTarget()->RemoveAura(SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT);
-
- // Note: Shield Discipline talent.
- if (Unit* caster = GetCaster())
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL && caster->HasAura(SPELL_PRIEST_SHIELD_DISCIPLINE))
- caster->CastSpell(caster, SPELL_PRIEST_SHIELD_DISCIPLINE_EFFECT, aurEff);
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- AfterEffectApply += AuraEffectApplyFn(spell_pri_power_word_shield::HandleOnApply, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- AfterEffectRemove += AuraEffectRemoveFn(spell_pri_power_word_shield::HandleOnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 47515 - Divine Aegis
-class spell_pri_divine_aegis : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_PRIEST_DIVINE_AEGIS_ABSORB, EFFECT_0 } });
- }
-
- bool CheckProc(ProcEventInfo const& eventInfo) const
- {
- return eventInfo.GetHealInfo() != nullptr;
- }
-
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
- {
- Unit* caster = eventInfo.GetActor();
- if (!caster)
- return;
-
- int32 aegisAmount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount());
-
- CastSpellExtraArgs args(aurEff);
- args.SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, aegisAmount);
- caster->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_DIVINE_AEGIS_ABSORB, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 129250 - Power Word: Solace
-class spell_pri_power_word_solace : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_POWER_WORD_SOLACE_ENERGIZE });
- }
-
- void RestoreMana(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_PRIEST_POWER_WORD_SOLACE_ENERGIZE,
- CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetTriggeringSpell(GetSpell())
- .AddSpellMod(SPELLVALUE_BASE_POINT0, GetEffectValue() / 100));
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_pri_power_word_solace::RestoreMana, EFFECT_1, SPELL_EFFECT_DUMMY);
- }
-};
-
-// Base class used by various Prayer of Mending spells
-class spell_pri_prayer_of_mending_SpellScriptBase : public SpellScript
-{
-public:
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, SPELL_PRIEST_PRAYER_OF_MENDING_AURA })
- && ValidateSpellEffect({ { SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, EFFECT_0 } });
- }
-
- bool Load() override
- {
- _spellInfoHeal = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, DIFFICULTY_NONE);
- _healEffectDummy = &_spellInfoHeal->GetEffect(EFFECT_0);
- return true;
- }
-
- void CastPrayerOfMendingAura(Unit* caster, Unit* target, Unit* visualSender, uint8 stack, bool firstCast) const
- {
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.AddSpellMod(SPELLVALUE_AURA_STACK, stack);
-
- // Note: this line's purpose is to show the correct amount in Points field in SMSG_AURA_UPDATE.
- uint32 basePoints = caster->SpellHealingBonusDone(target, _spellInfoHeal, _healEffectDummy->CalcValue(caster), HEAL, *_healEffectDummy);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, basePoints);
-
- // Note: Focused Mending talent.
- args.SetCustomArg(firstCast);
-
- caster->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_AURA, args);
-
- // Note: the visualSender is the priest if it is first cast or the aura holder when the aura triggers.
- visualSender->SendPlaySpellVisual(target, SPELL_VISUAL_PRIEST_PRAYER_OF_MENDING, 0, 0, 40.0f);
- }
-
-protected:
- SpellInfo const* _spellInfoHeal = nullptr;
- SpellEffectInfo const* _healEffectDummy = nullptr;
-};
-
-// 33076 - Prayer of Mending (Dummy)
-class spell_pri_prayer_of_mending_dummy : public spell_pri_prayer_of_mending_SpellScriptBase
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_PRAYER_OF_MENDING_AURA,
- SPELL_PRIEST_EPIPHANY,
- SPELL_PRIEST_EPIPHANY_HIGHLIGHT
- });
- }
-
- void HandleEffectDummy(SpellEffIndex /*effIndex*/) const
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- // Note: we need to increase BasePoints by 1 since it's 4 as default. Also HACKFIX, we shouldn't reduce it by 1 if the target has the aura already.
- uint8 stackAmount = target->HasAura(SPELL_PRIEST_PRAYER_OF_MENDING_AURA, caster->GetGUID()) ? GetEffectValue() : GetEffectValue() + 1;
-
- CastPrayerOfMendingAura(caster, target, caster, stackAmount, true);
-
- // Note: Epiphany talent.
- if (caster->HasAura(SPELL_PRIEST_EPIPHANY))
- caster->RemoveAurasDueToSpell(SPELL_PRIEST_EPIPHANY_HIGHLIGHT);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_dummy::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 41635 - Prayer of Mending (Aura)
-class spell_pri_prayer_of_mending_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, SPELL_PRIEST_PRAYER_OF_MENDING_JUMP })
- && ValidateSpellEffect({ { SPELL_PRIEST_SAY_YOUR_PRAYERS, EFFECT_0 } });
- }
-
- void HandleHeal(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
- {
- // Note: caster is the priest who cast the spell and target is current holder of the aura.
- Unit* target = GetTarget();
-
- if (Unit* caster = GetCaster())
- {
- CastSpellExtraArgs args(aurEff);
- args.SetCustomArg(_isEmpoweredByFocusedMending);
-
- caster->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_HEAL, args);
-
- // Note: jump is only executed if higher than 1 stack.
- int32 stackAmount = GetStackAmount();
- if (stackAmount > 1)
- {
- args.OriginalCaster = caster->GetGUID();
-
- int32 newStackAmount = stackAmount - 1;
- if (AuraEffect* sayYourPrayers = caster->GetAuraEffect(SPELL_PRIEST_SAY_YOUR_PRAYERS, EFFECT_0))
- if (roll_chance_i(sayYourPrayers->GetAmount()))
- ++newStackAmount;
-
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, newStackAmount);
-
- target->CastSpell(target, SPELL_PRIEST_PRAYER_OF_MENDING_JUMP, args);
- }
-
- Remove();
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_prayer_of_mending_aura::HandleHeal, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
-public:
- void SetEmpoweredByFocusedMending(bool isEmpowered)
- {
- _isEmpoweredByFocusedMending = isEmpowered;
- }
-
-private:
- bool _isEmpoweredByFocusedMending = false;
-};
-
-class spell_pri_prayer_of_mending : public SpellScript
-{
- void HandleEffectDummy(SpellEffIndex /*effIndex*/) const
- {
- Aura* aura = GetHitAura();
- if (!aura)
- return;
-
- spell_pri_prayer_of_mending_aura* script = aura->GetScript<spell_pri_prayer_of_mending_aura>();
- if (!script)
- return;
-
- if (bool const* isEmpoweredByFocusedMending = std::any_cast<bool>(&GetSpell()->m_customArg))
- script->SetEmpoweredByFocusedMending(isEmpoweredByFocusedMending);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- }
-};
-
-// 155793 - Prayer of Mending (Jump)
-class spell_pri_prayer_of_mending_jump : public spell_pri_prayer_of_mending_SpellScriptBase
-{
- static void FilterTargets(std::list<WorldObject*>& targets)
- {
- // Note: priority list is a) players b) non-player units. Also, this spell became smartheal in WoD.
- Trinity::SelectRandomInjuredTargets(targets, 1, true);
- }
-
- void HandleJump(SpellEffIndex /*effIndex*/) const
- {
- if (Unit* origCaster = GetOriginalCaster())
- CastPrayerOfMendingAura(origCaster, GetHitUnit(), GetCaster(), GetEffectValue(), false);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_prayer_of_mending_jump::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
- OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_jump::HandleJump, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 193063 - Protective Light (Aura)
-class spell_pri_protective_light : public AuraScript
-{
- bool CheckEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetProcTarget() == GetCaster();
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_PRIEST_PROTECTIVE_LIGHT_AURA, aurEff);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_protective_light::CheckEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pri_protective_light::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 405554 - Priest Holy 10.1 Class Set 2pc
-class spell_pri_holy_10_1_class_set_2pc : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_HOLY_10_1_CLASS_SET_2P_CHOOSER })
- && ValidateSpellEffect({ { SPELL_PRIEST_PRAYER_OF_MENDING, EFFECT_0 } });
- }
-
- static bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- return roll_chance_i(aurEff->GetAmount());
- }
-
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
- {
- CastSpellExtraArgs args(aurEff);
- args.SetTriggeringSpell(eventInfo.GetProcSpell());
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, sSpellMgr->AssertSpellInfo(SPELL_PRIEST_PRAYER_OF_MENDING, GetCastDifficulty())->GetEffect(EFFECT_0).CalcValue(GetCaster()));
-
- GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_HOLY_10_1_CLASS_SET_2P_CHOOSER, args);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_holy_10_1_class_set_2pc::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pri_holy_10_1_class_set_2pc::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 411097 - Priest Holy 10.1 Class Set 2pc (Chooser)
-class spell_pri_holy_10_1_class_set_2pc_chooser : public spell_pri_prayer_of_mending_SpellScriptBase
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_PRAYER_OF_MENDING_AURA });
- }
-
- static void FilterTargets(std::list<WorldObject*>& targets)
- {
- Trinity::SelectRandomInjuredTargets(targets, 1, true);
- }
-
- void HandleEffectDummy(SpellEffIndex /*effIndex*/) const
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- // Note: we need to increase BasePoints by 1 since it's 4 as default. Also HACKFIX, we shouldn't reduce it by 1 if the target has the aura already.
- uint8 stackAmount = target->HasAura(SPELL_PRIEST_PRAYER_OF_MENDING_AURA, caster->GetGUID()) ? GetEffectValue() : GetEffectValue() + 1;
-
- CastPrayerOfMendingAura(caster, target, caster, stackAmount, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_holy_10_1_class_set_2pc_chooser::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENTRY);
- OnEffectHitTarget += SpellEffectFn(spell_pri_holy_10_1_class_set_2pc_chooser::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 155793 - Prayer of Mending (Jump)
-class spell_pri_holy_10_1_class_set_4pc : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P, SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P_EFFECT });
- }
-
- void HandleEffectDummy(SpellEffIndex /*effIndex*/) const
- {
- if (GetOriginalCaster()->HasAura(SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P))
- GetOriginalCaster()->CastSpell(GetOriginalCaster(), SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P_EFFECT, TRIGGERED_IGNORE_GCD);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_holy_10_1_class_set_4pc::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 41635 - Prayer of Mending (Aura)
-class spell_pri_holy_10_1_class_set_4pc_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P, SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P_EFFECT });
- }
-
- void HandleOnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
- {
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
- return;
-
- if (GetCaster()->HasAura(SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P))
- GetCaster()->CastSpell(GetCaster(), SPELL_PRIEST_HOLY_10_1_CLASS_SET_4P_EFFECT, CastSpellExtraArgs(TRIGGERED_IGNORE_GCD).SetTriggeringAura(aurEff));
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_pri_holy_10_1_class_set_4pc_aura::HandleOnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 204197 - Purge the Wicked
-// Called by Penance - 47540, Dark Reprimand - 400169
-class spell_pri_purge_the_wicked : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC,
- SPELL_PRIEST_PURGE_THE_WICKED_DUMMY
- });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- if (target->HasAura(SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC, caster->GetGUID()))
- caster->CastSpell(target, SPELL_PRIEST_PURGE_THE_WICKED_DUMMY, TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_purge_the_wicked::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 204215 - Purge the Wicked
-class spell_pri_purge_the_wicked_dummy : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC, SPELL_PRIEST_REVEL_IN_PURITY })
- && ValidateSpellEffect({ { SPELL_PRIEST_REVEL_IN_PURITY, EFFECT_1 } });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Unit* caster = GetCaster();
- Unit* explTarget = GetExplTargetUnit();
-
- targets.remove_if([&](WorldObject* object) -> bool
- {
- // Note: we must remove any non-unit target, the explicit target and any other target that may be under any crowd control aura.
- Unit* target = object->ToUnit();
- return !target || target == explTarget || target->HasBreakableByDamageCrowdControlAura();
- });
-
- if (targets.empty())
- return;
-
- // Note: there's no SPELL_EFFECT_DUMMY with BasePoints 1 in any of the spells related to use as reference so we hardcode the value.
- uint32 spreadCount = 1;
-
- // Note: we must sort our list of targets whose priority is 1) aura, 2) distance, and 3) duration.
- targets.sort([&](WorldObject const* lhs, WorldObject const* rhs) -> bool
- {
- Unit const* targetA = lhs->ToUnit();
- Unit const* targetB = rhs->ToUnit();
-
- Aura* auraA = targetA->GetAura(SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC, caster->GetGUID());
- Aura* auraB = targetB->GetAura(SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC, caster->GetGUID());
-
- if (!auraA)
- {
- if (auraB)
- return true;
- return explTarget->GetExactDist(targetA) < explTarget->GetExactDist(targetB);
- }
- if (!auraB)
- return false;
-
- return auraA->GetDuration() < auraB->GetDuration();
- });
-
- // Note: Revel in Purity talent.
- if (caster->HasAura(SPELL_PRIEST_REVEL_IN_PURITY))
- spreadCount += sSpellMgr->AssertSpellInfo(SPELL_PRIEST_REVEL_IN_PURITY, DIFFICULTY_NONE)->GetEffect(EFFECT_1).CalcValue(GetCaster());
-
- if (targets.size() > spreadCount)
- targets.resize(spreadCount);
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
-
- caster->CastSpell(target, SPELL_PRIEST_PURGE_THE_WICKED_PERIODIC, TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_purge_the_wicked_dummy::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
- OnEffectHitTarget += SpellEffectFn(spell_pri_purge_the_wicked_dummy::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 47536 - Rapture
-class spell_pri_rapture : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_POWER_WORD_SHIELD });
- }
-
- void HandleEffectDummy(SpellEffIndex /*effIndex*/)
- {
- _raptureTarget = GetHitUnit()->GetGUID();
- }
-
- void HandleAfterCast()
- {
- Unit* caster = GetCaster();
-
- if (Unit* target = ObjectAccessor::GetUnit(*caster, _raptureTarget))
- caster->CastSpell(target, SPELL_PRIEST_POWER_WORD_SHIELD,
- CastSpellExtraArgs(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_POWER_AND_REAGENT_COST | TRIGGERED_IGNORE_CAST_IN_PROGRESS)
- .SetTriggeringSpell(GetSpell()));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_rapture::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- AfterCast += SpellCastFn(spell_pri_rapture::HandleAfterCast);
- }
-
-private:
- ObjectGuid _raptureTarget;
-};
-
-// 8092 - Mind Blast
-class spell_pri_schism : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_SCHISM,
- SPELL_PRIEST_SCHISM_AURA
- });
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
- {
- if (GetCaster()->HasAura(SPELL_PRIEST_SCHISM))
- GetCaster()->CastSpell(GetHitUnit(), SPELL_PRIEST_SCHISM_AURA, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_pri_schism::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 280391 - Sins of the Many
-class spell_pri_sins_of_the_many : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_SINS_OF_THE_MANY });
- }
-
- void HandleOnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_SINS_OF_THE_MANY, true);
- }
-
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAura(SPELL_PRIEST_SINS_OF_THE_MANY);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_pri_sins_of_the_many::HandleOnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_pri_sins_of_the_many::HandleOnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 20711 - Spirit of Redemption
-class spell_pri_spirit_of_redemption : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_SPIRIT_OF_REDEMPTION });
- }
-
- void HandleAbsorb(AuraEffect const* aurEff, DamageInfo const& /*dmgInfo*/, uint32 const& /*absorbAmount*/) const
- {
- Unit* target = GetTarget();
- target->CastSpell(target, SPELL_PRIEST_SPIRIT_OF_REDEMPTION, aurEff);
- target->SetFullHealth();
- }
-
- void Register() override
- {
- OnEffectAbsorb += AuraEffectAbsorbOverkillFn(spell_pri_spirit_of_redemption::HandleAbsorb, EFFECT_0);
- }
-};
-
-// 314867 - Shadow Covenant
-class spell_pri_shadow_covenant : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets) const
- {
- // remove explicit target (will be readded later)
- Trinity::Containers::Lists::RemoveUnique(targets, GetExplTargetWorldObject());
-
- // we must remove one since explicit target is always added.
- uint32 maxTargets = uint32(GetEffectInfo(EFFECT_2).CalcValue(GetCaster()) - 1);
-
- Trinity::SelectRandomInjuredTargets(targets, maxTargets, true);
-
- if (Unit* explicitTarget = GetExplTargetUnit())
- targets.push_front(explicitTarget);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_shadow_covenant::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 186263 - Shadow Mend
-class spell_pri_shadow_mend : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_ATONEMENT,
- SPELL_PRIEST_ATONEMENT_EFFECT,
- SPELL_PRIEST_TRINITY,
- SPELL_PRIEST_MASOCHISM_TALENT,
- SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL,
- SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY
- });
- }
-
- void HandleEffectHit()
- {
- if (Unit* target = GetHitUnit())
- {
- Unit* caster = GetCaster();
-
- int32 periodicAmount = GetHitHeal() / 20;
- int32 damageForAuraRemoveAmount = periodicAmount * 10;
-
- // Handle Masochism talent
- if (caster->HasAura(SPELL_PRIEST_MASOCHISM_TALENT) && caster->GetGUID() == target->GetGUID())
- caster->CastSpell(caster, SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL, CastSpellExtraArgs(GetSpell()).AddSpellMod(SPELLVALUE_BASE_POINT0, periodicAmount));
- else if (target->IsInCombat() && periodicAmount)
- {
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.SetTriggeringSpell(GetSpell());
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, periodicAmount);
- args.AddSpellMod(SPELLVALUE_BASE_POINT1, damageForAuraRemoveAmount);
- caster->CastSpell(target, SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY, args);
- }
- }
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_pri_shadow_mend::HandleEffectHit);
- }
-};
-
-// 187464 - Shadow Mend (Damage)
-class spell_pri_shadow_mend_periodic_damage : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_SHADOW_MEND_DAMAGE });
- }
-
- void HandleDummyTick(AuraEffect const* aurEff)
- {
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.SetOriginalCaster(GetCasterGUID());
- args.SetTriggeringAura(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount());
- GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_SHADOW_MEND_DAMAGE, args);
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- return eventInfo.GetDamageInfo() != nullptr;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- int32 newAmount = aurEff->GetAmount() - eventInfo.GetDamageInfo()->GetDamage();
-
- aurEff->ChangeAmount(newAmount);
- if (newAmount < 0)
- Remove();
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_pri_shadow_mend_periodic_damage::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- DoCheckProc += AuraCheckProcFn(spell_pri_shadow_mend_periodic_damage::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_shadow_mend_periodic_damage::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 109186 - Surge of Light
-class spell_pri_surge_of_light : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_SMITE,
- SPELL_PRIEST_SURGE_OF_LIGHT_EFFECT
- });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (eventInfo.GetSpellInfo()->Id == SPELL_PRIEST_SMITE)
- return true;
-
- if (eventInfo.GetSpellInfo()->SpellFamilyName == SPELLFAMILY_PRIEST)
- return eventInfo.GetHealInfo();
-
- return false;
- }
-
- void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- if (roll_chance_i(aurEff->GetAmount()))
- GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_SURGE_OF_LIGHT_EFFECT, aurEff);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pri_surge_of_light::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_surge_of_light::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 28809 - Greater Heal
-class spell_pri_t3_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ARMOR_OF_FAITH });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_ARMOR_OF_FAITH, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_t3_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 37594 - Greater Heal Refund
-class spell_pri_t5_heal_2p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_ITEM_EFFICIENCY });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (HealInfo* healInfo = eventInfo.GetHealInfo())
- if (Unit* healTarget = healInfo->GetTarget())
- if (healInfo->GetEffectiveHeal())
- if (healTarget->GetHealth() >= healTarget->GetMaxHealth())
- return true;
-
- return false;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, aurEff);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pri_t5_heal_2p_bonus::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_t5_heal_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 70770 - Item - Priest T10 Healer 2P Bonus
-class spell_pri_t10_heal_2p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_BLESSED_HEALING });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- HealInfo* healInfo = eventInfo.GetHealInfo();
- if (!healInfo || !healInfo->GetHeal())
- return;
-
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_BLESSED_HEALING, GetCastDifficulty());
- int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount());
-
- ASSERT(spellInfo->GetMaxTicks() > 0);
- amount /= spellInfo->GetMaxTicks();
-
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(amount);
- caster->CastSpell(target, SPELL_PRIEST_BLESSED_HEALING, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_pri_t10_heal_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 200128 - Trail of Light
-class spell_pri_trail_of_light : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_TRAIL_OF_LIGHT_HEAL });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (_healQueue.empty() || _healQueue.back() != eventInfo.GetActionTarget()->GetGUID())
- _healQueue.push(eventInfo.GetActionTarget()->GetGUID());
-
- if (_healQueue.size() > 2)
- _healQueue.pop();
-
- if (_healQueue.size() == 2)
- return true;
-
- return false;
- }
-
- void HandleOnProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- Unit* caster = GetTarget();
- Unit* oldTarget = ObjectAccessor::GetUnit(*caster, _healQueue.front());
- if (!oldTarget)
- return;
-
- // Note: old target may not be friendly anymore due to charm and faction change effects.
- if (!caster->IsValidAssistTarget(oldTarget))
- return;
-
- SpellInfo const* healSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_TRAIL_OF_LIGHT_HEAL, DIFFICULTY_NONE);
- if (!healSpellInfo)
- return;
-
- // Note: distance may be greater than the heal's spell range.
- if (!caster->IsWithinDist(oldTarget, healSpellInfo->GetMaxRange(true, caster)))
- return;
-
- uint32 healAmount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount());
-
- caster->CastSpell(oldTarget, SPELL_PRIEST_TRAIL_OF_LIGHT_HEAL, CastSpellExtraArgs(aurEff).AddSpellBP0(healAmount));
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pri_trail_of_light::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_trail_of_light::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
-private:
- std::queue<ObjectGuid> _healQueue;
-};
-
-// 390693 - Train of Thought
-// Called by Flash Heal, Renew, Smite
-class spell_pri_train_of_thought : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_POWER_WORD_SHIELD,
- SPELL_PRIEST_PENANCE
- });
- }
-
- bool CheckEffect0(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
- {
- // Renew & Flash Heal
- return eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_PRIEST, { 0x840 });
- }
-
- bool CheckEffect1(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
- {
- // Smite
- return eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_PRIEST, { 0x80 });
- }
-
- void ReducePowerWordShieldCooldown(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) const
- {
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PRIEST_POWER_WORD_SHIELD, Milliseconds(aurEff->GetAmount()));
- }
-
- void ReducePenanceCooldown(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) const
- {
- GetTarget()->GetSpellHistory()->ModifyCooldown(SPELL_PRIEST_PENANCE, Milliseconds(aurEff->GetAmount()));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_train_of_thought::CheckEffect0, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pri_train_of_thought::ReducePowerWordShieldCooldown, EFFECT_0, SPELL_AURA_DUMMY);
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_train_of_thought::CheckEffect1, EFFECT_1, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_pri_train_of_thought::ReducePenanceCooldown, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 109142 - Twist of Fate (Shadow)
-// 265259 - Twist of Fate (Discipline)
-class spell_pri_twist_of_fate : public AuraScript
-{
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetProcTarget()->GetHealthPct() < aurEff->GetAmount();
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_pri_twist_of_fate::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 15286 - Vampiric Embrace
-class spell_pri_vampiric_embrace : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- // Not proc from Mind Sear
- return !(eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyFlags[1] & 0x80000);
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !damageInfo->GetDamage())
- return;
-
- int32 selfHeal = int32(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount()));
- int32 teamHeal = selfHeal / 2;
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, teamHeal);
- args.AddSpellMod(SPELLVALUE_BASE_POINT1, selfHeal);
- GetTarget()->CastSpell(nullptr, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL, args);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_pri_vampiric_embrace::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_embrace::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 15290 - Vampiric Embrace (heal)
-class spell_pri_vampiric_embrace_target : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& unitList)
- {
- unitList.remove(GetCaster());
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_vampiric_embrace_target::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
- }
-};
-
-// 34914 - Vampiric Touch
-class spell_pri_vampiric_touch : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_PRIEST_SIN_AND_PUNISHMENT, SPELL_PRIEST_SHADOW_WORD_PAIN });
- }
-
- void HandleDispel(DispelInfo* dispelInfo)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(dispelInfo->GetDispeller(), SPELL_PRIEST_SIN_AND_PUNISHMENT, true);
- }
-
- void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- if (caster->HasAura(SPELL_PRIEST_MISERY))
- caster->CastSpell(GetTarget(), SPELL_PRIEST_SHADOW_WORD_PAIN, true);
- }
-
- void Register() override
- {
- AfterDispel += AuraDispelFn(spell_pri_vampiric_touch::HandleDispel);
- OnEffectApply += AuraEffectApplyFn(spell_pri_vampiric_touch::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- }
-};
void AddSC_priest_spell_scripts()
{
- RegisterSpellScript(spell_pri_angelic_feather_trigger);
- RegisterAreaTriggerAI(areatrigger_pri_angelic_feather);
- RegisterSpellScript(spell_pri_abyssal_reverie);
- RegisterSpellScript(spell_pri_answered_prayers);
- RegisterSpellScript(spell_pri_aq_3p_bonus);
- RegisterSpellScript(spell_pri_atonement);
- RegisterSpellScript(spell_pri_atonement_effect);
- RegisterSpellScript(spell_pri_atonement_effect_aura);
- RegisterSpellScript(spell_pri_atonement_passive);
- RegisterSpellScript(spell_pri_benediction);
- RegisterSpellScript(spell_pri_blaze_of_light);
- RegisterSpellScript(spell_pri_circle_of_healing);
- RegisterSpellScript(spell_pri_crystalline_reflection);
- RegisterSpellScript(spell_pri_dark_indulgence);
- RegisterSpellScript(spell_pri_divine_aegis);
- RegisterSpellScript(spell_pri_divine_image);
- RegisterSpellScript(spell_pri_divine_image_spell_triggered);
- RegisterSpellScript(spell_pri_divine_image_stack_timer);
- RegisterSpellScript(spell_pri_divine_service);
- RegisterSpellScript(spell_pri_divine_star_shadow);
- RegisterAreaTriggerAI(areatrigger_pri_divine_star);
- RegisterSpellScript(spell_pri_empowered_renew);
- RegisterSpellScript(spell_pri_epiphany);
- RegisterSpellScript(spell_pri_essence_devourer_heal);
- RegisterSpellScript(spell_pri_evangelism);
- RegisterSpellScript(spell_pri_focused_mending);
- RegisterSpellScript(spell_pri_from_darkness_comes_light);
- RegisterSpellScript(spell_pri_guardian_spirit);
- RegisterSpellScript(spell_pri_halo_shadow);
- RegisterAreaTriggerAI(areatrigger_pri_halo);
- RegisterSpellScript(spell_pri_heavens_wrath);
- RegisterSpellScript(spell_pri_holy_mending);
- RegisterSpellScript(spell_pri_holy_words);
- RegisterSpellScript(spell_pri_holy_word_salvation);
- RegisterSpellScript(spell_pri_holy_word_salvation_cooldown_reduction);
- RegisterSpellScript(spell_pri_item_t6_trinket);
- RegisterSpellScript(spell_pri_leap_of_faith_effect_trigger);
- RegisterSpellScript(spell_pri_levitate);
- RegisterSpellScript(spell_pri_lights_wrath);
- RegisterSpellScript(spell_pri_mind_bomb);
- RegisterSpellScript(spell_pri_painful_punishment);
- RegisterSpellScript(spell_pri_pain_transformation);
- RegisterSpellScriptWithArgs(spell_pri_penance, "spell_pri_penance", SPELL_PRIEST_PENANCE_CHANNEL_DAMAGE, SPELL_PRIEST_PENANCE_CHANNEL_HEALING);
- RegisterSpellScriptWithArgs(spell_pri_penance, "spell_pri_dark_reprimand", SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_DAMAGE, SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_HEALING);
- RegisterSpellScript(spell_pri_penance_or_dark_reprimand_channeled);
- RegisterSpellScript(spell_pri_phantasm);
- RegisterSpellScript(spell_pri_power_leech_passive);
- RegisterSpellScript(spell_pri_power_of_the_dark_side);
- RegisterSpellScript(spell_pri_power_of_the_dark_side_damage_bonus);
- RegisterSpellScript(spell_pri_power_of_the_dark_side_healing_bonus);
- RegisterSpellScript(spell_pri_power_word_radiance);
- RegisterSpellScript(spell_pri_power_word_shield);
- RegisterSpellScript(spell_pri_power_word_solace);
- RegisterSpellScript(spell_pri_prayer_of_mending_dummy);
- RegisterSpellAndAuraScriptPair(spell_pri_prayer_of_mending, spell_pri_prayer_of_mending_aura);
- RegisterSpellScript(spell_pri_prayer_of_mending_jump);
- RegisterSpellScript(spell_pri_protective_light);
- RegisterSpellScript(spell_pri_holy_10_1_class_set_2pc);
- RegisterSpellScript(spell_pri_holy_10_1_class_set_2pc_chooser);
- RegisterSpellScript(spell_pri_holy_10_1_class_set_4pc);
- RegisterSpellScript(spell_pri_holy_10_1_class_set_4pc_aura);
- RegisterSpellScript(spell_pri_purge_the_wicked);
- RegisterSpellScript(spell_pri_purge_the_wicked_dummy);
- RegisterSpellScript(spell_pri_rapture);
- RegisterSpellScript(spell_pri_schism);
- RegisterSpellScript(spell_pri_sins_of_the_many);
- RegisterSpellScript(spell_pri_spirit_of_redemption);
- RegisterSpellScript(spell_pri_shadow_covenant);
- RegisterSpellScript(spell_pri_shadow_mend);
- RegisterSpellScript(spell_pri_shadow_mend_periodic_damage);
- RegisterSpellScript(spell_pri_surge_of_light);
- RegisterSpellScript(spell_pri_trail_of_light);
- RegisterSpellScript(spell_pri_train_of_thought);
- RegisterSpellScript(spell_pri_t3_4p_bonus);
- RegisterSpellScript(spell_pri_t5_heal_2p_bonus);
- RegisterSpellScript(spell_pri_t10_heal_2p_bonus);
- RegisterSpellScript(spell_pri_twist_of_fate);
- RegisterSpellScript(spell_pri_vampiric_embrace);
- RegisterSpellScript(spell_pri_vampiric_embrace_target);
- RegisterSpellScript(spell_pri_vampiric_touch);
}
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 1c25e62f9ce..619676b5b4c 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -22,1048 +22,7 @@
*/
#include "ScriptMgr.h"
-#include "Containers.h"
-#include "DB2Stores.h"
-#include "Item.h"
-#include "Log.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "Spell.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-
-enum RogueSpells
-{
- SPELL_ROGUE_ADRENALINE_RUSH = 13750,
- SPELL_ROGUE_BETWEEN_THE_EYES = 199804,
- SPELL_ROGUE_BLACKJACK_TALENT = 379005,
- SPELL_ROGUE_BLACKJACK = 394119,
- SPELL_ROGUE_BLADE_FLURRY = 13877,
- SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482,
- SPELL_ROGUE_BROADSIDE = 193356,
- SPELL_ROGUE_BURIED_TREASURE = 199600,
- SPELL_ROGUE_CHEAT_DEATH_DUMMY = 31231,
- SPELL_ROGUE_CHEATED_DEATH = 45181,
- SPELL_ROGUE_CHEATING_DEATH = 45182,
- SPELL_ROGUE_DEATH_FROM_ABOVE = 152150,
- SPELL_ROGUE_GRAND_MELEE = 193358,
- SPELL_ROGUE_GRAPPLING_HOOK = 195457,
- SPELL_ROGUE_KILLING_SPREE = 51690,
- SPELL_ROGUE_KILLING_SPREE_TELEPORT = 57840,
- SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG = 57841,
- SPELL_ROGUE_KILLING_SPREE_DMG_BUFF = 61851,
- SPELL_ROGUE_MARKED_FOR_DEATH = 137619,
- SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT = 31665,
- SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE = 31223,
- SPELL_ROGUE_MAIN_GAUCHE = 86392,
- SPELL_ROGUE_PREMEDITATION_PASSIVE = 343160,
- SPELL_ROGUE_PREMEDITATION_AURA = 343173,
- SPELL_ROGUE_PREY_ON_THE_WEAK_TALENT = 131511,
- SPELL_ROGUE_PREY_ON_THE_WEAK = 255909,
- SPELL_ROGUE_RUTHLESS_PRECISION = 193357,
- SPELL_ROGUE_SANCTUARY = 98877,
- SPELL_ROGUE_SKULL_AND_CROSSBONES = 199603,
- SPELL_ROGUE_SHADOW_FOCUS = 108209,
- SPELL_ROGUE_SHADOW_FOCUS_EFFECT = 112942,
- SPELL_ROGUE_SLICE_AND_DICE = 315496,
- SPELL_ROGUE_SPRINT = 2983,
- SPELL_ROGUE_STEALTH = 1784,
- SPELL_ROGUE_STEALTH_STEALTH_AURA = 158185,
- SPELL_ROGUE_STEALTH_SHAPESHIFT_AURA = 158188,
- SPELL_ROGUE_SYMBOLS_OF_DEATH_CRIT_AURA = 227151,
- SPELL_ROGUE_SYMBOLS_OF_DEATH_RANK2 = 328077,
- SPELL_ROGUE_TRUE_BEARING = 193359,
- SPELL_ROGUE_TURN_THE_TABLES_BUFF = 198027,
- SPELL_ROGUE_VANISH = 1856,
- SPELL_ROGUE_VANISH_AURA = 11327,
- SPELL_ROGUE_TRICKS_OF_THE_TRADE = 57934,
- SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
- SPELL_ROGUE_HONOR_AMONG_THIEVES_ENERGIZE = 51699,
- SPELL_ROGUE_T5_2P_SET_BONUS = 37169,
- SPELL_ROGUE_VENOMOUS_WOUNDS = 79134,
-};
-
-/* Returns true if the spell is a finishing move.
- * A finishing move is a spell that cost combo points */
-Optional<int32> GetFinishingMoveCPCost(Spell const* spell)
-{
- if (!spell)
- return { };
-
- return spell->GetPowerTypeCostAmount(POWER_COMBO_POINTS);
-}
-
-/* Return true if the spell is a finishing move.
- * A finishing move is a spell that cost combo points */
-bool IsFinishingMove(Spell const* spell)
-{
- return GetFinishingMoveCPCost(spell).has_value();
-}
-
-// 53 - Backstab
-class spell_rog_backstab : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_3 } });
- }
-
- void HandleHitDamage(SpellEffIndex /*effIndex*/)
- {
- Unit* hitUnit = GetHitUnit();
- if (!hitUnit)
- return;
-
- Unit* caster = GetCaster();
- if (hitUnit->isInBack(caster))
- {
- float currDamage = float(GetHitDamage());
- float newDamage = AddPct(currDamage, float(GetEffectInfo(EFFECT_3).CalcValue(caster)));
- SetHitDamage(newDamage);
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_rog_backstab::HandleHitDamage, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 379005 - Blackjack
-// Called by Sap - 6770 and Blind - 2094
-class spell_rog_blackjack : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_BLACKJACK_TALENT, SPELL_ROGUE_BLACKJACK });
- }
-
- void EffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
- {
- if (Unit* caster = GetCaster())
- if (caster->HasAura(SPELL_ROGUE_BLACKJACK_TALENT))
- caster->CastSpell(GetTarget(), SPELL_ROGUE_BLACKJACK, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectApplyFn(spell_rog_blackjack::EffectRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 13877, 33735, (check 51211, 65956) - Blade Flurry
-class spell_rog_blade_flurry : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- _procTarget = GetTarget()->SelectNearbyTarget(eventInfo.GetProcTarget());
- return _procTarget && eventInfo.GetDamageInfo();
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
- {
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(damageInfo->GetDamage());
- GetTarget()->CastSpell(_procTarget, SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, args);
- }
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_rog_blade_flurry::CheckProc);
- if (m_scriptSpellId == SPELL_ROGUE_BLADE_FLURRY)
- OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry::HandleProc, EFFECT_0, SPELL_AURA_MOD_POWER_REGEN_PERCENT);
- else
- OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE);
- }
-
- Unit* _procTarget = nullptr;
-};
-
-// 31230 - Cheat Death
-class spell_rog_cheat_death : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_CHEAT_DEATH_DUMMY, SPELL_ROGUE_CHEATED_DEATH, SPELL_ROGUE_CHEATING_DEATH })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void HandleAbsorb(AuraEffect const* /*aurEff*/, DamageInfo const& /*dmgInfo*/, uint32& absorbAmount)
- {
- Unit* target = GetTarget();
- if (target->HasAura(SPELL_ROGUE_CHEATED_DEATH))
- {
- absorbAmount = 0;
- return;
- }
-
- PreventDefaultAction();
-
- target->CastSpell(target, SPELL_ROGUE_CHEAT_DEATH_DUMMY, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
- target->CastSpell(target, SPELL_ROGUE_CHEATED_DEATH, TRIGGERED_DONT_REPORT_CAST_ERROR);
- target->CastSpell(target, SPELL_ROGUE_CHEATING_DEATH, TRIGGERED_DONT_REPORT_CAST_ERROR);
-
- target->SetHealth(target->CountPctFromMaxHealth(GetEffectInfo(EFFECT_1).CalcValue(target)));
- }
-
- void Register() override
- {
- OnEffectAbsorb += AuraEffectAbsorbOverkillFn(spell_rog_cheat_death::HandleAbsorb, EFFECT_0);
- }
-};
-
-// 2818 - Deadly Poison
-class spell_rog_deadly_poison : public SpellScript
-{
- bool Load() override
- {
- // at this point CastItem must already be initialized
- return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem();
- }
-
- void HandleBeforeHit(SpellMissInfo missInfo)
- {
- if (missInfo != SPELL_MISS_NONE)
- return;
-
- if (Unit* target = GetHitUnit())
- // Deadly Poison
- if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, flag128(0x10000, 0x80000, 0), GetCaster()->GetGUID()))
- _stackAmount = aurEff->GetBase()->GetStackAmount();
- }
-
- void HandleAfterHit()
- {
- if (_stackAmount < 5)
- return;
-
- Player* player = GetCaster()->ToPlayer();
-
- if (Unit* target = GetHitUnit())
- {
-
- Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
-
- if (item == GetCastItem())
- item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
-
- if (!item)
- return;
-
- // item combat enchantments
- for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
- {
- SpellItemEnchantmentEntry const* enchant = sSpellItemEnchantmentStore.LookupEntry(item->GetEnchantmentId(EnchantmentSlot(slot)));
- if (!enchant)
- continue;
-
- for (uint8 s = 0; s < 3; ++s)
- {
- if (enchant->Effect[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
- continue;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(enchant->EffectArg[s], DIFFICULTY_NONE);
- if (!spellInfo)
- {
- TC_LOG_ERROR("spells", "Player::CastItemCombatSpell Enchant {}, player (Name: {}, {}) cast unknown spell {}", enchant->ID, player->GetName(), player->GetGUID().ToString(), enchant->EffectArg[s]);
- continue;
- }
-
- // Proc only rogue poisons
- if (spellInfo->SpellFamilyName != SPELLFAMILY_ROGUE || spellInfo->Dispel != DISPEL_POISON)
- continue;
-
- // Do not reproc deadly
- if (spellInfo->SpellFamilyFlags & flag128(0x10000))
- continue;
-
- if (spellInfo->IsPositive())
- player->CastSpell(player, enchant->EffectArg[s], item);
- else
- player->CastSpell(target, enchant->EffectArg[s], item);
- }
- }
- }
- }
-
- void Register() override
- {
- BeforeHit += BeforeSpellHitFn(spell_rog_deadly_poison::HandleBeforeHit);
- AfterHit += SpellHitFn(spell_rog_deadly_poison::HandleAfterHit);
- }
-
- uint8 _stackAmount = 0;
-};
-
-// 32645 - Envenom
-class spell_rog_envenom : public SpellScript
-{
- void CalculateDamage(Unit* /*victim*/, int32& /*damage*/, int32& flatMod, float& pctMod) const
- {
- pctMod *= GetSpell()->GetPowerTypeCostAmount(POWER_COMBO_POINTS).value_or(0);
-
- if (AuraEffect const* t5 = GetCaster()->GetAuraEffect(SPELL_ROGUE_T5_2P_SET_BONUS, EFFECT_0))
- flatMod += t5->GetAmount();
- }
-
- void Register() override
- {
- CalcDamage += SpellCalcDamageFn(spell_rog_envenom::CalculateDamage);
- }
-};
-
-// 196819 - Eviscerate
-class spell_rog_eviscerate : public SpellScript
-{
- void CalculateDamage(Unit* /*victim*/, int32& /*damage*/, int32& flatMod, float& pctMod) const
- {
- pctMod *= GetSpell()->GetPowerTypeCostAmount(POWER_COMBO_POINTS).value_or(0);
-
- if (AuraEffect const* t5 = GetCaster()->GetAuraEffect(SPELL_ROGUE_T5_2P_SET_BONUS, EFFECT_0))
- flatMod += t5->GetAmount();
- }
-
- void Register() override
- {
- CalcDamage += SpellCalcDamageFn(spell_rog_eviscerate::CalculateDamage);
- }
-};
-
-// 193358 - Grand Melee
-class spell_rog_grand_melee : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_SLICE_AND_DICE });
- }
-
- bool HandleCheckProc(ProcEventInfo& eventInfo)
- {
- Spell const* procSpell = eventInfo.GetProcSpell();
- return procSpell && procSpell->HasPowerTypeCost(POWER_COMBO_POINTS);
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- Spell const* procSpell = procInfo.GetProcSpell();
- int32 amount = aurEff->GetAmount() * *procSpell->GetPowerTypeCostAmount(POWER_COMBO_POINTS) * 1000;
-
- if (Unit* target = GetTarget())
- {
- if (Aura* aura = target->GetAura(SPELL_ROGUE_SLICE_AND_DICE))
- aura->SetDuration(aura->GetDuration() + amount);
- else
- {
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.AddSpellMod(SPELLVALUE_DURATION, amount);
- target->CastSpell(target, SPELL_ROGUE_SLICE_AND_DICE, args);
- }
- }
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_rog_grand_melee::HandleCheckProc);
- OnEffectProc += AuraEffectProcFn(spell_rog_grand_melee::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 198031 - Honor Among Thieves
-/// 7.1.5
-class spell_rog_honor_among_thieves : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_HONOR_AMONG_THIEVES_ENERGIZE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
-
- Unit* target = GetTarget();
- target->CastSpell(target, SPELL_ROGUE_HONOR_AMONG_THIEVES_ENERGIZE, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_rog_honor_among_thieves::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 51690 - Killing Spree
-class spell_rog_killing_spree_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_ROGUE_KILLING_SPREE_TELEPORT,
- SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG,
- SPELL_ROGUE_KILLING_SPREE_DMG_BUFF
- });
- }
-
- void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_ROGUE_KILLING_SPREE_DMG_BUFF, true);
- }
-
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
- {
- while (!_targets.empty())
- {
- ObjectGuid guid = Trinity::Containers::SelectRandomContainerElement(_targets);
- if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), guid))
- {
- GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_TELEPORT, true);
- GetTarget()->CastSpell(target, SPELL_ROGUE_KILLING_SPREE_WEAPON_DMG, true);
- break;
- }
- else
- _targets.remove(guid);
- }
- }
-
- void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_ROGUE_KILLING_SPREE_DMG_BUFF);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_rog_killing_spree_aura::HandleApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_killing_spree_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- AfterEffectRemove += AuraEffectRemoveFn(spell_rog_killing_spree_aura::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-
-public:
- void AddTarget(Unit* target)
- {
- _targets.push_back(target->GetGUID());
- }
-
-private:
- GuidList _targets;
-};
-
-class spell_rog_killing_spree : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.empty() || GetCaster()->GetVehicleBase())
- FinishCast(SPELL_FAILED_OUT_OF_RANGE);
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- if (Aura* aura = GetCaster()->GetAura(SPELL_ROGUE_KILLING_SPREE))
- if (spell_rog_killing_spree_aura* script = aura->GetScript<spell_rog_killing_spree_aura>())
- script->AddTarget(GetHitUnit());
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_killing_spree::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
- OnEffectHitTarget += SpellEffectFn(spell_rog_killing_spree::HandleDummy, EFFECT_1, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 385627 - Kingsbane
-class spell_rog_kingsbane : public AuraScript
-{
- bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
- {
- return procInfo.GetActionTarget()->HasAura(GetId(), GetCasterGUID());
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_rog_kingsbane::CheckProc, EFFECT_4, SPELL_AURA_PROC_TRIGGER_SPELL);;
- }
-};
-
-// 76806 - Mastery: Main Gauche
-class spell_rog_mastery_main_gauche : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_MAIN_GAUCHE });
- }
-
- bool HandleCheckProc(ProcEventInfo& eventInfo)
- {
- return eventInfo.GetDamageInfo() && eventInfo.GetDamageInfo()->GetVictim();
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- if (Unit* target = GetTarget())
- target->CastSpell(procInfo.GetDamageInfo()->GetVictim(), SPELL_ROGUE_MAIN_GAUCHE, aurEff);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_rog_mastery_main_gauche::HandleCheckProc);
- OnEffectProc += AuraEffectProcFn(spell_rog_mastery_main_gauche::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-class spell_rog_pickpocket : public SpellScript
-{
- SpellCastResult CheckCast()
- {
- if (!GetExplTargetUnit() || !GetCaster()->IsValidAttackTarget(GetExplTargetUnit(), GetSpellInfo()))
- return SPELL_FAILED_BAD_TARGETS;
-
- return SPELL_CAST_OK;
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_rog_pickpocket::CheckCast);
- }
-};
-
-// 131511 - Prey on the Weak
-// Called by Cheap Shot - 1833 and Kidney Shot - 408
-class spell_rog_prey_on_the_weak : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_PREY_ON_THE_WEAK_TALENT, SPELL_ROGUE_PREY_ON_THE_WEAK });
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
- {
- if (Unit* caster = GetCaster())
- if (caster->HasAura(SPELL_ROGUE_PREY_ON_THE_WEAK_TALENT))
- caster->CastSpell(GetTarget(), SPELL_ROGUE_PREY_ON_THE_WEAK, true);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_rog_prey_on_the_weak::OnApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 79096 - Restless Blades
-class spell_rog_restless_blades : public AuraScript
-{
- static uint32 constexpr Spells[] = { SPELL_ROGUE_ADRENALINE_RUSH, SPELL_ROGUE_BETWEEN_THE_EYES, SPELL_ROGUE_SPRINT,
- SPELL_ROGUE_GRAPPLING_HOOK, SPELL_ROGUE_VANISH, SPELL_ROGUE_KILLING_SPREE, SPELL_ROGUE_MARKED_FOR_DEATH, SPELL_ROGUE_DEATH_FROM_ABOVE };
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(Spells);
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- if (Optional<int32> spentCP = GetFinishingMoveCPCost(procInfo.GetProcSpell()))
- {
- int32 cdExtra = -(float(aurEff->GetAmount() * *spentCP) * 0.1f);
-
- SpellHistory* history = GetTarget()->GetSpellHistory();
- for (uint32 spellId : Spells)
- history->ModifyCooldown(spellId, Seconds(cdExtra), true);
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_rog_restless_blades::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 315508 - Roll the Bones
-class spell_rog_roll_the_bones : public SpellScript
-{
- static uint32 constexpr Spells[] = { SPELL_ROGUE_SKULL_AND_CROSSBONES, SPELL_ROGUE_GRAND_MELEE, SPELL_ROGUE_RUTHLESS_PRECISION,
- SPELL_ROGUE_TRUE_BEARING, SPELL_ROGUE_BURIED_TREASURE, SPELL_ROGUE_BROADSIDE };
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(Spells);
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- int32 currentDuration = 0;
- for (uint32 spellId : Spells)
- {
- if (Aura* aura = GetCaster()->GetAura(spellId))
- {
- currentDuration = aura->GetDuration();
- GetCaster()->RemoveAura(aura);
- }
- }
-
- std::vector<uint32> possibleBuffs(std::begin(Spells), std::end(Spells));
- Trinity::Containers::RandomShuffle(possibleBuffs);
-
- // https://www.icy-veins.com/wow/outlaw-rogue-pve-dps-rotation-cooldowns-abilities
- // 1 Roll the Bones buff : 100.0 % chance;
- // 2 Roll the Bones buffs : 19 % chance;
- // 5 Roll the Bones buffs : 1 % chance.
- int32 chance = irand(1, 100);
- int32 numBuffs = 1;
- if (chance <= 1)
- numBuffs = 5;
- else if (chance <= 20)
- numBuffs = 2;
-
- for (int32 i = 0; i < numBuffs; ++i)
- {
- uint32 spellId = possibleBuffs[i];
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.AddSpellMod(SPELLVALUE_DURATION, GetSpellInfo()->GetDuration() + currentDuration);
- GetCaster()->CastSpell(GetCaster(), spellId, args);
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_rog_roll_the_bones::HandleDummy, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- }
-};
-
-// 1943 - Rupture
-class spell_rog_rupture : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_VENOMOUS_WOUNDS });
- }
-
- void OnEffectRemoved(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
- return;
-
- Aura* aura = GetAura();
- Unit* caster = aura->GetCaster();
- if (!caster)
- return;
-
- Aura* auraVenomousWounds = caster->GetAura(SPELL_ROGUE_VENOMOUS_WOUNDS);
- if (!auraVenomousWounds)
- return;
-
- // Venomous Wounds: if unit dies while being affected by rupture, regain energy based on remaining duration
- Optional<SpellPowerCost> cost = GetSpellInfo()->CalcPowerCost(POWER_ENERGY, false, caster, GetSpellInfo()->GetSchoolMask(), nullptr);
- if (!cost)
- return;
-
- float pct = float(aura->GetDuration()) / float(aura->GetMaxDuration());
- int32 extraAmount = float(cost->Amount) * pct;
- caster->ModifyPower(POWER_ENERGY, extraAmount);
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_rog_rupture::OnEffectRemoved, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 14161 - Ruthlessness
-class spell_rog_ruthlessness : public AuraScript
-{
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
- {
- Unit* target = GetTarget();
-
- if (Optional<int32> cost = GetFinishingMoveCPCost(procInfo.GetProcSpell()))
- if (roll_chance_i(aurEff->GetSpellEffectInfo().PointsPerResource * (*cost)))
- target->ModifyPower(POWER_COMBO_POINTS, 1);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_rog_ruthlessness::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 185438 - Shadowstrike
-class spell_rog_shadowstrike : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_PREMEDITATION_AURA, SPELL_ROGUE_SLICE_AND_DICE, SPELL_ROGUE_PREMEDITATION_PASSIVE })
- && ValidateSpellEffect({ { SPELL_ROGUE_PREMEDITATION_PASSIVE, EFFECT_0 } });
- }
-
- SpellCastResult HandleCheckCast()
- {
- // Because the premeditation aura is removed when we're out of stealth,
- // when we reach HandleEnergize the aura won't be there, even if it was when player launched the spell
- _hasPremeditationAura = GetCaster()->HasAura(SPELL_ROGUE_PREMEDITATION_AURA);
- return SPELL_FAILED_SUCCESS;
- }
-
- void HandleEnergize(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- if (_hasPremeditationAura)
- {
- if (caster->HasAura(SPELL_ROGUE_SLICE_AND_DICE))
- if (Aura* premeditationPassive = caster->GetAura(SPELL_ROGUE_PREMEDITATION_PASSIVE))
- if (AuraEffect const* auraEff = premeditationPassive->GetEffect(EFFECT_1))
- SetHitDamage(GetHitDamage() + auraEff->GetAmount());
-
- // Grant 10 seconds of slice and dice
- int32 duration = sSpellMgr->AssertSpellInfo(SPELL_ROGUE_PREMEDITATION_PASSIVE, DIFFICULTY_NONE)->GetEffect(EFFECT_0).CalcValue(GetCaster());
-
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.AddSpellMod(SPELLVALUE_DURATION, duration * IN_MILLISECONDS);
- caster->CastSpell(caster, SPELL_ROGUE_SLICE_AND_DICE, args);
- }
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_rog_shadowstrike::HandleCheckCast);
- OnEffectHitTarget += SpellEffectFn(spell_rog_shadowstrike::HandleEnergize, EFFECT_1, SPELL_EFFECT_ENERGIZE);
- }
-
-private:
- bool _hasPremeditationAura = false;
-};
-
-// 193315 - Sinister Strike
-class spell_rog_sinister_strike : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_T5_2P_SET_BONUS });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- int32 damagePerCombo = GetHitDamage();
- if (AuraEffect const* t5 = GetCaster()->GetAuraEffect(SPELL_ROGUE_T5_2P_SET_BONUS, EFFECT_0))
- damagePerCombo += t5->GetAmount();
-
- int32 finalDamage = damagePerCombo;
- std::vector<SpellPowerCost> const& costs = GetSpell()->GetPowerCost();
- auto c = std::find_if(costs.begin(), costs.end(), [](SpellPowerCost const& cost) { return cost.Power == POWER_COMBO_POINTS; });
- if (c != costs.end())
- finalDamage *= c->Amount;
-
- SetHitDamage(finalDamage);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_rog_sinister_strike::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 1784 - Stealth
-class spell_rog_stealth : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE,
- SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT,
- SPELL_ROGUE_SANCTUARY,
- SPELL_ROGUE_SHADOW_FOCUS,
- SPELL_ROGUE_SHADOW_FOCUS_EFFECT,
- SPELL_ROGUE_STEALTH_STEALTH_AURA,
- SPELL_ROGUE_STEALTH_SHAPESHIFT_AURA
- });
- }
-
- void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
-
- // Master of Subtlety
- if (target->HasAura(SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE))
- target->CastSpell(target, SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT, TRIGGERED_FULL_MASK);
-
- // Shadow Focus
- if (target->HasAura(SPELL_ROGUE_SHADOW_FOCUS))
- target->CastSpell(target, SPELL_ROGUE_SHADOW_FOCUS_EFFECT, TRIGGERED_FULL_MASK);
-
- // Premeditation
- if (target->HasAura(SPELL_ROGUE_PREMEDITATION_PASSIVE))
- target->CastSpell(target, SPELL_ROGUE_PREMEDITATION_AURA, true);
-
- target->CastSpell(target, SPELL_ROGUE_SANCTUARY, TRIGGERED_FULL_MASK);
- target->CastSpell(target, SPELL_ROGUE_STEALTH_STEALTH_AURA, TRIGGERED_FULL_MASK);
- target->CastSpell(target, SPELL_ROGUE_STEALTH_SHAPESHIFT_AURA, TRIGGERED_FULL_MASK);
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
-
- // Master of Subtlety
- if (AuraEffect* masterOfSubtletyPassive = GetTarget()->GetAuraEffect(SPELL_ROGUE_MASTER_OF_SUBTLETY_PASSIVE, EFFECT_0))
- {
- if (Aura* masterOfSubtletyAura = GetTarget()->GetAura(SPELL_ROGUE_MASTER_OF_SUBTLETY_DAMAGE_PERCENT))
- {
- masterOfSubtletyAura->SetMaxDuration(masterOfSubtletyPassive->GetAmount());
- masterOfSubtletyAura->RefreshDuration();
- }
- }
-
- // Premeditation
- target->RemoveAura(SPELL_ROGUE_PREMEDITATION_AURA);
-
- target->RemoveAurasDueToSpell(SPELL_ROGUE_SHADOW_FOCUS_EFFECT);
- target->RemoveAurasDueToSpell(SPELL_ROGUE_STEALTH_STEALTH_AURA);
- target->RemoveAurasDueToSpell(SPELL_ROGUE_STEALTH_SHAPESHIFT_AURA);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_rog_stealth::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_rog_stealth::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 212283 - Symbols of Death
-class spell_rog_symbols_of_death : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_SYMBOLS_OF_DEATH_RANK2, SPELL_ROGUE_SYMBOLS_OF_DEATH_CRIT_AURA });
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
- {
- if (GetCaster()->HasAura(SPELL_ROGUE_SYMBOLS_OF_DEATH_RANK2))
- GetCaster()->CastSpell(GetCaster(), SPELL_ROGUE_SYMBOLS_OF_DEATH_CRIT_AURA, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_rog_symbols_of_death::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- }
-};
-
-// 57934 - Tricks of the Trade
-class spell_rog_tricks_of_the_trade_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC });
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT || !GetTarget()->HasAura(SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC))
- GetTarget()->GetThreatManager().UnregisterRedirectThreat(SPELL_ROGUE_TRICKS_OF_THE_TRADE);
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
-
- Unit* rogue = GetTarget();
- if (ObjectAccessor::GetUnit(*rogue, _redirectTarget))
- rogue->CastSpell(rogue, SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC, aurEff);
- Remove(AURA_REMOVE_BY_DEFAULT);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_aura::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectProc += AuraEffectProcFn(spell_rog_tricks_of_the_trade_aura::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-
- ObjectGuid _redirectTarget;
-public:
- void SetRedirectTarget(ObjectGuid guid) { _redirectTarget = guid; }
-};
-
-// 57934 - Tricks of the Trade
-class spell_rog_tricks_of_the_trade : public SpellScript
-{
- void DoAfterHit()
- {
- if (Aura* aura = GetHitAura())
- if (spell_rog_tricks_of_the_trade_aura* script = aura->GetScript<spell_rog_tricks_of_the_trade_aura>())
- {
- if (Unit* explTarget = GetExplTargetUnit())
- script->SetRedirectTarget(explTarget->GetGUID());
- else
- script->SetRedirectTarget(ObjectGuid::Empty);
- }
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_rog_tricks_of_the_trade::DoAfterHit);
- }
-};
-
-// 59628 - Tricks of the Trade (Proc)
-class spell_rog_tricks_of_the_trade_proc : public AuraScript
-{
- void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->GetThreatManager().UnregisterRedirectThreat(SPELL_ROGUE_TRICKS_OF_THE_TRADE);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_proc::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 198020 - Turn the Tables (PvP Talent)
-class spell_rog_turn_the_tables : public AuraScript
-{
- bool CheckForStun(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetProcSpell() && eventInfo.GetProcSpell()->GetSpellInfo()->HasAura(SPELL_AURA_MOD_STUN);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_rog_turn_the_tables::CheckForStun, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 198023 - Turn the Tables (periodic)
-class spell_rog_turn_the_tables_periodic_check : public AuraScript
-{
- bool Validate(SpellInfo const*) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_TURN_THE_TABLES_BUFF });
- }
-
- void CheckForStun(AuraEffect const* aurEff)
- {
- Unit* target = GetTarget();
- if (!target->HasAuraType(SPELL_AURA_MOD_STUN))
- {
- target->CastSpell(target, SPELL_ROGUE_TURN_THE_TABLES_BUFF, aurEff);
- PreventDefaultAction();
- Remove();
- }
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_rog_turn_the_tables_periodic_check::CheckForStun, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 1856 - Vanish - SPELL_ROGUE_VANISH
-class spell_rog_vanish : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_VANISH_AURA, SPELL_ROGUE_STEALTH_SHAPESHIFT_AURA });
- }
-
- void OnLaunchTarget(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
-
- Unit* target = GetHitUnit();
-
- target->RemoveAurasByType(SPELL_AURA_MOD_STALKED);
- if (target->GetTypeId() != TYPEID_PLAYER)
- return;
-
- if (target->HasAura(SPELL_ROGUE_VANISH_AURA))
- return;
-
- target->CastSpell(target, SPELL_ROGUE_VANISH_AURA, TRIGGERED_FULL_MASK);
- target->CastSpell(target, SPELL_ROGUE_STEALTH_SHAPESHIFT_AURA, TRIGGERED_FULL_MASK);
- }
-
- void Register() override
- {
- OnEffectLaunchTarget += SpellEffectFn(spell_rog_vanish::OnLaunchTarget, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
- }
-};
-
-// 11327 - Vanish
-class spell_rog_vanish_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_ROGUE_STEALTH });
- }
-
- void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_ROGUE_STEALTH, TRIGGERED_FULL_MASK);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_rog_vanish_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 79134 - Venomous Wounds - SPELL_ROGUE_VENOMOUS_WOUNDS
-class spell_rog_venomous_wounds : public AuraScript
-{
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- int32 extraEnergy = aurEff->GetAmount();
- GetTarget()->ModifyPower(POWER_ENERGY, extraEnergy);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_rog_venomous_wounds::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
void AddSC_rogue_spell_scripts()
{
- RegisterSpellScript(spell_rog_backstab);
- RegisterSpellScript(spell_rog_blackjack);
- RegisterSpellScript(spell_rog_blade_flurry);
- RegisterSpellScript(spell_rog_cheat_death);
- RegisterSpellScript(spell_rog_deadly_poison);
- RegisterSpellScript(spell_rog_envenom);
- RegisterSpellScript(spell_rog_eviscerate);
- RegisterSpellScript(spell_rog_grand_melee);
- RegisterSpellScript(spell_rog_honor_among_thieves);
- RegisterSpellAndAuraScriptPair(spell_rog_killing_spree, spell_rog_killing_spree_aura);
- RegisterSpellScript(spell_rog_kingsbane);
- RegisterSpellScript(spell_rog_mastery_main_gauche);
- RegisterSpellScript(spell_rog_pickpocket);
- RegisterSpellScript(spell_rog_prey_on_the_weak);
- RegisterSpellScript(spell_rog_restless_blades);
- RegisterSpellScript(spell_rog_roll_the_bones);
- RegisterSpellScript(spell_rog_rupture);
- RegisterSpellScript(spell_rog_ruthlessness);
- RegisterSpellScript(spell_rog_shadowstrike);
- RegisterSpellScript(spell_rog_sinister_strike);
- RegisterSpellScript(spell_rog_stealth);
- RegisterSpellScript(spell_rog_symbols_of_death);
- RegisterSpellAndAuraScriptPair(spell_rog_tricks_of_the_trade, spell_rog_tricks_of_the_trade_aura);
- RegisterSpellScript(spell_rog_tricks_of_the_trade_proc);
- RegisterSpellScript(spell_rog_turn_the_tables);
- RegisterSpellScript(spell_rog_turn_the_tables_periodic_check);
- RegisterSpellScript(spell_rog_vanish);
- RegisterSpellScript(spell_rog_vanish_aura);
- RegisterSpellScript(spell_rog_venomous_wounds);
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index a48072df244..e50797350d4 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -22,1950 +22,7 @@
*/
#include "ScriptMgr.h"
-#include "AreaTriggerAI.h"
-#include "CellImpl.h"
-#include "Containers.h"
-#include "CreatureAIImpl.h" // for RAND()
-#include "GridNotifiersImpl.h"
-#include "Item.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-#include "TemporarySummon.h"
-
-enum ShamanSpells
-{
- SPELL_SHAMAN_AFTERSHOCK_ENERGIZE = 210712,
- SPELL_SHAMAN_ANCESTRAL_GUIDANCE = 108281,
- SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL = 114911,
- SPELL_SHAMAN_ASCENDANCE_ELEMENTAL = 114050,
- SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT = 114051,
- SPELL_SHAMAN_ASCENDANCE_RESTORATION = 114052,
- SPELL_SHAMAN_CHAIN_LIGHTNING = 188443,
- SPELL_SHAMAN_CHAIN_LIGHTNING_ENERGIZE = 195897,
- SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD = 45297,
- SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE = 218558,
- SPELL_SHAMAN_CHAINED_HEAL = 70809,
- SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE = 187878,
- SPELL_SHAMAN_DOOM_WINDS_LEGENDARY_COOLDOWN = 335904,
- SPELL_SHAMAN_EARTHQUAKE = 61882,
- SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN = 77505,
- SPELL_SHAMAN_EARTHQUAKE_TICK = 77478,
- SPELL_SHAMAN_EARTH_SHIELD_HEAL = 204290,
- SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE = 170374,
- SPELL_SHAMAN_EARTHEN_RAGE_PERIODIC = 170377,
- SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE = 170379,
- SPELL_SHAMAN_ECHOES_OF_GREAT_SUNDERING_LEGENDARY = 336217,
- SPELL_SHAMAN_ECHOES_OF_GREAT_SUNDERING_TALENT = 384088,
- SPELL_SHAMAN_ELECTRIFIED = 64930,
- SPELL_SHAMAN_ELEMENTAL_BLAST = 117014,
- SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT = 118522,
- SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE = 344645,
- SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE = 173183,
- SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY = 173184,
- SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD = 120588,
- SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166,
- SPELL_SHAMAN_ENERGY_SURGE = 40465,
- SPELL_SHAMAN_FLAME_SHOCK = 188389,
- SPELL_SHAMAN_FLAMETONGUE_ATTACK = 10444,
- SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT = 334294,
- SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA = 319778,
- SPELL_SHAMAN_FROST_SHOCK_ENERGIZE = 289439,
- SPELL_SHAMAN_GATHERING_STORMS = 198299,
- SPELL_SHAMAN_GATHERING_STORMS_BUFF = 198300,
- SPELL_SHAMAN_GHOST_WOLF = 2645,
- SPELL_SHAMAN_HEALING_RAIN_VISUAL = 147490,
- SPELL_SHAMAN_HEALING_RAIN_HEAL = 73921,
- SPELL_SHAMAN_ICEFURY = 210714,
- SPELL_SHAMAN_ICEFURY_OVERLOAD = 219271,
- SPELL_SHAMAN_IGNEOUS_POTENTIAL = 279830,
- SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD = 23552,
- SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE = 27635,
- SPELL_SHAMAN_ITEM_MANA_SURGE = 23571,
- SPELL_SHAMAN_LAVA_BEAM = 114074,
- SPELL_SHAMAN_LAVA_BEAM_OVERLOAD = 114738,
- SPELL_SHAMAN_LAVA_BURST = 51505,
- SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE = 71824,
- SPELL_SHAMAN_LAVA_BURST_OVERLOAD = 77451,
- SPELL_SHAMAN_LAVA_SURGE = 77762,
- SPELL_SHAMAN_LIGHTNING_BOLT = 188196,
- SPELL_SHAMAN_LIGHTNING_BOLT_ENERGIZE = 214815,
- SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD = 45284,
- SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_ENERGIZE = 214816,
- SPELL_SHAMAN_LIQUID_MAGMA_HIT = 192231,
- SPELL_SHAMAN_MAELSTROM_CONTROLLER = 343725,
- SPELL_SHAMAN_MASTERY_ELEMENTAL_OVERLOAD = 168534,
- SPELL_SHAMAN_PATH_OF_FLAMES_SPREAD = 210621,
- SPELL_SHAMAN_PATH_OF_FLAMES_TALENT = 201909,
- SPELL_SHAMAN_POWER_SURGE = 40466,
- SPELL_SHAMAN_RESTORATIVE_MISTS = 114083,
- SPELL_SHAMAN_RESTORATIVE_MISTS_INITIAL = 294020,
- SPELL_SHAMAN_RIPTIDE = 61295,
- SPELL_SHAMAN_SPIRIT_WOLF_TALENT = 260878,
- SPELL_SHAMAN_SPIRIT_WOLF_PERIODIC = 260882,
- SPELL_SHAMAN_SPIRIT_WOLF_AURA = 260881,
- SPELL_SHAMAN_STORMKEEPER = 191634,
- SPELL_SHAMAN_STORMSTRIKE = 17364,
- SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF = 394651,
- SPELL_SHAMAN_TIDAL_WAVES = 53390,
- SPELL_SHAMAN_TOTEMIC_POWER_ARMOR = 28827,
- SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER = 28826,
- SPELL_SHAMAN_TOTEMIC_POWER_MP5 = 28824,
- SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER = 28825,
- SPELL_SHAMAN_UNDULATION_PROC = 216251,
- SPELL_SHAMAN_UNLIMITED_POWER_BUFF = 272737,
- SPELL_SHAMAN_VOLCANIC_SURGE = 408572,
- SPELL_SHAMAN_WINDFURY_ATTACK = 25504,
- SPELL_SHAMAN_WINDFURY_ENCHANTMENT = 334302,
- SPELL_SHAMAN_WIND_RUSH = 192082
-};
-
-enum ShamanSpellLabels
-{
- SPELL_LABEL_SHAMAN_WINDFURY_TOTEM = 1038,
-};
-
-enum MiscNpcs
-{
- NPC_HEALING_RAIN_INVISIBLE_STALKER = 73400
-};
-
-// 273221 - Aftershock
-class spell_sha_aftershock : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellEntry*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_AFTERSHOCK_ENERGIZE });
- }
-
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- if (Spell const* procSpell = eventInfo.GetProcSpell())
- if (Optional<int32> cost = procSpell->GetPowerTypeCostAmount(POWER_MAELSTROM))
- return cost > 0 && roll_chance_i(aurEff->GetAmount());
-
- return false;
- }
-
- void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- Spell const* procSpell = eventInfo.GetProcSpell();
- int32 energize = *procSpell->GetPowerTypeCostAmount(POWER_MAELSTROM);
-
- eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHAMAN_AFTERSHOCK_ENERGIZE, CastSpellExtraArgs(energize)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, energize));
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_aftershock::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_sha_aftershock::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 108281 - Ancestral Guidance
-class spell_sha_ancestral_guidance : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (eventInfo.GetHealInfo() && eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL)
- return false;
-
- if (!eventInfo.GetHealInfo() && !eventInfo.GetDamageInfo())
- return false;
-
- return true;
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- int32 bp0 = CalculatePct(int32(eventInfo.GetDamageInfo() ? eventInfo.GetDamageInfo()->GetDamage() : eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount());
- if (bp0)
- {
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, bp0);
- eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL, args);
- }
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_sha_ancestral_guidance::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_sha_ancestral_guidance::HandleEffectProc, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 114911 - Ancestral Guidance Heal
-class spell_sha_ancestral_guidance_heal : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_ANCESTRAL_GUIDANCE });
- }
-
- static void ResizeTargets(std::list<WorldObject*>& targets)
- {
- Trinity::SelectRandomInjuredTargets(targets, 3, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_ancestral_guidance_heal::ResizeTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 114052 - Ascendance (Restoration)
-class spell_sha_ascendance_restoration : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_RESTORATIVE_MISTS });
- }
-
- bool CheckProc(ProcEventInfo& procInfo)
- {
- return procInfo.GetHealInfo() && procInfo.GetHealInfo()->GetOriginalHeal() && procInfo.GetSpellInfo()->Id != SPELL_SHAMAN_RESTORATIVE_MISTS_INITIAL;
- }
-
- void OnProcHeal(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo)
- {
- _healToDistribute += procInfo.GetHealInfo()->GetOriginalHeal();
- }
-
- void HandleEffectPeriodic(AuraEffect const* aurEff)
- {
- if (!_healToDistribute)
- return;
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(_healToDistribute);
- GetTarget()->CastSpell(nullptr, SPELL_SHAMAN_RESTORATIVE_MISTS, args);
- _healToDistribute = 0;
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_sha_ascendance_restoration::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_sha_ascendance_restoration::OnProcHeal, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_ascendance_restoration::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
- }
-
-private:
- uint32 _healToDistribute = 0;
-};
-
-// 188443 - Chain Lightning
-class spell_sha_chain_lightning : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_CHAIN_LIGHTNING_ENERGIZE, SPELL_SHAMAN_MAELSTROM_CONTROLLER })
- && ValidateSpellEffect({ { SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_4 } });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (AuraEffect const* energizeAmount = GetCaster()->GetAuraEffect(SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_4))
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_CHAIN_LIGHTNING_ENERGIZE, CastSpellExtraArgs(energizeAmount)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, energizeAmount->GetAmount() * GetUnitTargetCountForEffect(EFFECT_0)));
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_sha_chain_lightning::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 45297 - Chain Lightning Overload
-class spell_sha_chain_lightning_overload : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE, SPELL_SHAMAN_MAELSTROM_CONTROLLER })
- && ValidateSpellEffect({ { SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_5 } });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (AuraEffect const* energizeAmount = GetCaster()->GetAuraEffect(SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_5))
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE, CastSpellExtraArgs(energizeAmount)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, energizeAmount->GetAmount() * GetUnitTargetCountForEffect(EFFECT_0)));
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_sha_chain_lightning_overload::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 187874 - Crash Lightning
-class spell_sha_crash_lightning : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE, SPELL_SHAMAN_GATHERING_STORMS, SPELL_SHAMAN_GATHERING_STORMS_BUFF });
- }
-
- void CountTargets(std::list<WorldObject*>& targets)
- {
- _targetsHit = targets.size();
- }
-
- void TriggerCleaveBuff()
- {
- if (_targetsHit >= 2)
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE, true);
-
- if (AuraEffect const* gatheringStorms = GetCaster()->GetAuraEffect(SPELL_SHAMAN_GATHERING_STORMS, EFFECT_0))
- {
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, int32(gatheringStorms->GetAmount() * _targetsHit));
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_GATHERING_STORMS_BUFF, args);
- }
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_crash_lightning::CountTargets, EFFECT_0, TARGET_UNIT_CONE_CASTER_TO_DEST_ENEMY);
- AfterCast += SpellCastFn(spell_sha_crash_lightning::TriggerCleaveBuff);
- }
-
- size_t _targetsHit = 0;
-};
-
-// 378270 - Deeply Rooted Elements
-class spell_sha_deeply_rooted_elements : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_LAVA_BURST, SPELL_SHAMAN_STORMSTRIKE, SPELL_SHAMAN_RIPTIDE,
- SPELL_SHAMAN_ASCENDANCE_ELEMENTAL, SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT, SPELL_SHAMAN_ASCENDANCE_RESTORATION })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } })
- && spellInfo->GetEffect(EFFECT_0).IsAura();
- }
-
- bool Load() override
- {
- return GetUnitOwner()->IsPlayer();
- }
-
- template<uint32 requiredSpellId>
- bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
- {
- if (!procInfo.GetSpellInfo())
- return false;
-
- if (procInfo.GetSpellInfo()->Id != requiredSpellId)
- return false;
-
- return roll_chance_i(_procAttempts++ - 2);
- }
-
- template<uint32 ascendanceSpellId>
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- _procAttempts = 0;
-
- Unit* target = eventInfo.GetActor();
-
- int32 duration = GetEffect(EFFECT_0)->GetAmount();
- if (Aura const* ascendanceAura = target->GetAura(ascendanceSpellId))
- duration += ascendanceAura->GetDuration();
-
- target->CastSpell(target, ascendanceSpellId,
- CastSpellExtraArgs(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD | TRIGGERED_IGNORE_CAST_IN_PROGRESS)
- .SetTriggeringAura(aurEff)
- .SetTriggeringSpell(eventInfo.GetProcSpell())
- .AddSpellMod(SPELLVALUE_DURATION, duration));
- }
-
- void Register() override
- {
- if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::ShamanElemental)
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_deeply_rooted_elements::CheckProc<SPELL_SHAMAN_LAVA_BURST>, EFFECT_1, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_sha_deeply_rooted_elements::HandleProc<SPELL_SHAMAN_ASCENDANCE_ELEMENTAL>, EFFECT_1, SPELL_AURA_DUMMY);
- }
-
- if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::ShamanEnhancement)
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_deeply_rooted_elements::CheckProc<SPELL_SHAMAN_STORMSTRIKE>, EFFECT_2, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_sha_deeply_rooted_elements::HandleProc<SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT>, EFFECT_2, SPELL_AURA_DUMMY);
- }
-
- if (!GetAura() || GetUnitOwner()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::ShamanRestoration)
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_deeply_rooted_elements::CheckProc<SPELL_SHAMAN_RIPTIDE>, EFFECT_3, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_sha_deeply_rooted_elements::HandleProc<SPELL_SHAMAN_ASCENDANCE_RESTORATION>, EFFECT_3, SPELL_AURA_DUMMY);
- }
- }
-
- int32 _procAttempts = 0;
-};
-
-// 335902 - Doom Winds
-class spell_sha_doom_winds_legendary : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_DOOM_WINDS_LEGENDARY_COOLDOWN });
- }
-
- bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
- {
- if (GetTarget()->HasAura(SPELL_SHAMAN_DOOM_WINDS_LEGENDARY_COOLDOWN))
- return false;
-
- SpellInfo const* spellInfo = procInfo.GetSpellInfo();
- if (!spellInfo)
- return false;
-
- return spellInfo->HasLabel(SPELL_LABEL_SHAMAN_WINDFURY_TOTEM);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_doom_winds_legendary::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 207778 - Downpour
-class spell_sha_downpour : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Trinity::SelectRandomInjuredTargets(targets, 6, true);
- }
-
- void CountEffectivelyHealedTarget()
- {
- // Cooldown increased for each target effectively healed
- if (GetHitHeal())
- ++_healedTargets;
- }
-
- void HandleCooldown()
- {
- SpellHistory::Duration cooldown = Milliseconds(GetSpellInfo()->RecoveryTime) + Seconds(GetEffectInfo(EFFECT_1).CalcValue() * _healedTargets);
- GetCaster()->GetSpellHistory()->StartCooldown(GetSpellInfo(), 0, GetSpell(), false, cooldown);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_downpour::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- AfterHit += SpellHitFn(spell_sha_downpour::CountEffectivelyHealedTarget);
- AfterCast += SpellCastFn(spell_sha_downpour::HandleCooldown);
- }
-
- int32 _healedTargets = 0;
-};
-
-// 204288 - Earth Shield
-class spell_sha_earth_shield : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_EARTH_SHIELD_HEAL });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (!eventInfo.GetDamageInfo() || !HasEffect(EFFECT_1) || eventInfo.GetDamageInfo()->GetDamage() < GetTarget()->CountPctFromMaxHealth(GetEffect(EFFECT_1)->GetAmount()))
- return false;
- return true;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
-
- GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_EARTH_SHIELD_HEAL, CastSpellExtraArgs(aurEff)
- .SetOriginalCaster(GetCasterGUID()));
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_sha_earth_shield::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_sha_earth_shield::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 8042 - Earth Shock
-class spell_sha_earth_shock : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF, EFFECT_0 } });
- }
-
- void AddScriptedDamageMods()
- {
- if (AuraEffect* t29 = GetCaster()->GetAuraEffect(SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF, EFFECT_0))
- {
- SetHitDamage(CalculatePct(GetHitDamage(), 100 + t29->GetAmount()));
- t29->GetBase()->Remove();
- }
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_sha_earth_shock::AddScriptedDamageMods);
- }
-};
-
-// 170374 - Earthen Rage (Passive)
-class spell_sha_earthen_rage_passive : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_EARTHEN_RAGE_PERIODIC, SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE });
- }
-
- bool CheckProc(ProcEventInfo& procInfo)
- {
- return procInfo.GetSpellInfo() && procInfo.GetSpellInfo()->Id != SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE;
- }
-
- void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- _procTargetGuid = eventInfo.GetProcTarget()->GetGUID();
- eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_SHAMAN_EARTHEN_RAGE_PERIODIC, true);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_sha_earthen_rage_passive::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_sha_earthen_rage_passive::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
- ObjectGuid _procTargetGuid;
-
-public:
- ObjectGuid const& GetProcTargetGuid() const
- {
- return _procTargetGuid;
- }
-};
-
-// 170377 - Earthen Rage (Proc Aura)
-class spell_sha_earthen_rage_proc_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE, SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE });
- }
-
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
- {
- PreventDefaultAction();
- if (Aura const* aura = GetCaster()->GetAura(SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE))
- if (spell_sha_earthen_rage_passive* script = aura->GetScript<spell_sha_earthen_rage_passive>())
- if (Unit* procTarget = ObjectAccessor::GetUnit(*GetCaster(), script->GetProcTargetGuid()))
- GetTarget()->CastSpell(procTarget, SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_earthen_rage_proc_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 61882 - Earthquake
-// 8382 - AreaTriggerId
-struct areatrigger_sha_earthquake : AreaTriggerAI
-{
- areatrigger_sha_earthquake(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger), _refreshTimer(0s), _period(1s), _damageMultiplier(1.0f) { }
-
- void OnCreate(Spell const* creatingSpell) override
- {
- if (Unit* caster = at->GetCaster())
- if (AuraEffect const* earthquake = caster->GetAuraEffect(SPELL_SHAMAN_EARTHQUAKE, EFFECT_1))
- _period = Milliseconds(earthquake->GetPeriod());
-
- if (creatingSpell)
- if (float const* damageMultiplier = std::any_cast<float>(&creatingSpell->m_customArg))
- _damageMultiplier = *damageMultiplier;
- }
-
- void OnUpdate(uint32 diff) override
- {
- _refreshTimer -= Milliseconds(diff);
- while (_refreshTimer <= 0s)
- {
- if (Unit* caster = at->GetCaster())
- caster->CastSpell(at->GetPosition(), SPELL_SHAMAN_EARTHQUAKE_TICK, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(at->GetGUID())
- .AddSpellMod(SPELLVALUE_BASE_POINT0, caster->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE) * 0.213f * _damageMultiplier));
-
- _refreshTimer += _period;
- }
- }
-
- // Each target can only be stunned once by each earthquake - keep track of who we already stunned
- bool AddStunnedTarget(ObjectGuid const& guid)
- {
- return _stunnedUnits.insert(guid).second;
- }
-
-private:
- Milliseconds _refreshTimer;
- Milliseconds _period;
- GuidUnorderedSet _stunnedUnits;
- float _damageMultiplier;
-};
-
-// 61882 - Earthquake
-class spell_sha_earthquake : public SpellScript
-{
- static constexpr std::array<std::pair<uint32, SpellEffIndex>, 3> DamageBuffs =
- { {
- { SPELL_SHAMAN_ECHOES_OF_GREAT_SUNDERING_LEGENDARY, EFFECT_1 },
- { SPELL_SHAMAN_ECHOES_OF_GREAT_SUNDERING_TALENT, EFFECT_0 },
- { SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF, EFFECT_0 }
- } };
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect(DamageBuffs);
- }
-
- void SnapshotDamageMultiplier(SpellEffIndex /*effIndex*/)
- {
- float damageMultiplier = 1.0f;
- for (auto const& [spellId, effect] : DamageBuffs)
- {
- if (AuraEffect* buff = GetCaster()->GetAuraEffect(spellId, effect))
- {
- AddPct(damageMultiplier, buff->GetAmount());
- buff->GetBase()->Remove();
- }
- }
-
- if (damageMultiplier != 1.0f)
- GetSpell()->m_customArg = damageMultiplier;
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_sha_earthquake::SnapshotDamageMultiplier, EFFECT_2, SPELL_EFFECT_CREATE_AREATRIGGER);
- }
-};
-
-// 77478 - Earthquake tick
-class spell_sha_earthquake_tick : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void HandleOnHit()
- {
- if (Unit* target = GetHitUnit())
- {
- if (roll_chance_i(GetEffectInfo(EFFECT_1).CalcValue()))
- {
- std::vector<AreaTrigger*> areaTriggers = GetCaster()->GetAreaTriggers(SPELL_SHAMAN_EARTHQUAKE);
- auto itr = std::find_if(areaTriggers.begin(), areaTriggers.end(), [&](AreaTrigger const* at)
- {
- return at->GetGUID() == GetSpell()->GetOriginalCasterGUID();
- });
- if (itr != areaTriggers.end())
- if (areatrigger_sha_earthquake* eq = CAST_AI(areatrigger_sha_earthquake, (*itr)->AI()))
- if (eq->AddStunnedTarget(target->GetGUID()))
- GetCaster()->CastSpell(target, SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN, true);
- }
- }
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_sha_earthquake_tick::HandleOnHit);
- }
-};
-
-// 117014 - Elemental Blast
-// 120588 - Elemental Blast Overload
-class spell_sha_elemental_blast : public SpellScript
-{
- static constexpr uint32 BuffSpells[] = { SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT, SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE, SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY };
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT,
- SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE,
- SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY,
- SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE,
- SPELL_SHAMAN_MAELSTROM_CONTROLLER
- }) && ValidateSpellEffect({
- { SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_10 },
- { SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF, EFFECT_0 }
- });
- }
-
- void HandleEnergize(SpellEffIndex /*effIndex*/)
- {
- if (AuraEffect const* energizeAmount = GetCaster()->GetAuraEffect(SPELL_SHAMAN_MAELSTROM_CONTROLLER, GetSpellInfo()->Id == SPELL_SHAMAN_ELEMENTAL_BLAST ? EFFECT_9 : EFFECT_10))
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE, CastSpellExtraArgs(energizeAmount)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, energizeAmount->GetAmount()));
- }
-
- void TriggerBuff()
- {
- Unit* caster = GetCaster();
- uint32 spellId = *Trinity::Containers::SelectRandomWeightedContainerElement(BuffSpells, [caster](uint32 buffSpellId)
- {
- return !caster->HasAura(buffSpellId) ? 1.0 : 0.0;
- });
-
- GetCaster()->CastSpell(GetCaster(), spellId, TRIGGERED_FULL_MASK);
- }
-
- void AddScriptedDamageMods()
- {
- if (AuraEffect* t29 = GetCaster()->GetAuraEffect(SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF, EFFECT_0))
- {
- SetHitDamage(CalculatePct(GetHitDamage(), 100 + t29->GetAmount()));
- t29->GetBase()->Remove();
- }
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_sha_elemental_blast::HandleEnergize, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- AfterCast += SpellCastFn(spell_sha_elemental_blast::TriggerBuff);
- OnHit += SpellHitFn(spell_sha_elemental_blast::AddScriptedDamageMods);
- }
-};
-
-// 318038 - Flametongue Weapon
-class spell_sha_flametongue_weapon : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
- {
- Player* player = GetCaster()->ToPlayer();
- uint8 slot = EQUIPMENT_SLOT_MAINHAND;
- if (player->GetPrimarySpecialization() == ChrSpecialization::ShamanEnhancement)
- slot = EQUIPMENT_SLOT_OFFHAND;
-
- Item* targetItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
- if (!targetItem || !targetItem->GetTemplate()->IsWeapon())
- return;
-
- player->CastSpell(targetItem, SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_sha_flametongue_weapon::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 319778 - Flametongue - SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA
-class spell_sha_flametongue_weapon_aura : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_FLAMETONGUE_ATTACK });
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- Unit* attacker = eventInfo.GetActor();
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, std::max(1, int32(attacker->GetTotalAttackPowerValue(BASE_ATTACK) * 0.0264f)));
- attacker->CastSpell(eventInfo.GetActionTarget(), SPELL_SHAMAN_FLAMETONGUE_ATTACK, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_flametongue_weapon_aura::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 73920 - Healing Rain (Aura)
-class spell_sha_healing_rain_aura : public AuraScript
-{
-public:
- void SetVisualDummy(TempSummon* summon)
- {
- _visualDummy = summon->GetGUID();
- _dest = summon->GetPosition();
- }
-
-private:
- void HandleEffectPeriodic(AuraEffect const* aurEff)
- {
- GetTarget()->CastSpell(_dest, SPELL_SHAMAN_HEALING_RAIN_HEAL, aurEff);
- }
-
- void HandleEffecRemoved(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Creature* summon = ObjectAccessor::GetCreature(*GetTarget(), _visualDummy))
- summon->DespawnOrUnsummon();
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_sha_healing_rain_aura::HandleEffecRemoved, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_healing_rain_aura::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
- }
-
- ObjectGuid _visualDummy;
- Position _dest;
-};
-
-// 73920 - Healing Rain
-class spell_sha_healing_rain : public SpellScript
-{
- void InitializeVisualStalker()
- {
- if (Aura* aura = GetHitAura())
- {
- if (WorldLocation const* dest = GetExplTargetDest())
- {
- Milliseconds duration = Milliseconds(GetSpellInfo()->CalcDuration(GetOriginalCaster()));
- TempSummon* summon = GetCaster()->GetMap()->SummonCreature(NPC_HEALING_RAIN_INVISIBLE_STALKER, *dest, nullptr, duration, GetOriginalCaster());
- if (!summon)
- return;
-
- summon->CastSpell(summon, SPELL_SHAMAN_HEALING_RAIN_VISUAL, true);
-
- if (spell_sha_healing_rain_aura* script = aura->GetScript<spell_sha_healing_rain_aura>())
- script->SetVisualDummy(summon);
- }
- }
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_sha_healing_rain::InitializeVisualStalker);
- }
-};
-
-// 73921 - Healing Rain
-class spell_sha_healing_rain_target_limit : public SpellScript
-{
- void SelectTargets(std::list<WorldObject*>& targets)
- {
- Trinity::SelectRandomInjuredTargets(targets, 6, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_healing_rain_target_limit::SelectTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 52042 - Healing Stream Totem
-class spell_sha_healing_stream_totem_heal : public SpellScript
-{
- void SelectTargets(std::list<WorldObject*>& targets)
- {
- Trinity::SelectRandomInjuredTargets(targets, 1, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_healing_stream_totem_heal::SelectTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
- }
-};
-
-// 210714 - Icefury
-class spell_sha_icefury : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_FROST_SHOCK_ENERGIZE });
- }
-
- void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(caster, SPELL_SHAMAN_FROST_SHOCK_ENERGIZE, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_icefury::HandleEffectProc, EFFECT_1, SPELL_AURA_ADD_PCT_MODIFIER);
- }
-};
-
-// 23551 - Lightning Shield T2 Bonus
-class spell_sha_item_lightning_shield : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 23552 - Lightning Shield T2 Bonus
-class spell_sha_item_lightning_shield_trigger : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_item_lightning_shield_trigger::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 23572 - Mana Surge
-class spell_sha_item_mana_surge : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_ITEM_MANA_SURGE });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- return eventInfo.GetProcSpell() != nullptr;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- std::vector<SpellPowerCost> const& costs = eventInfo.GetProcSpell()->GetPowerCost();
- auto m = std::find_if(costs.begin(), costs.end(), [](SpellPowerCost const& cost) { return cost.Power == POWER_MANA; });
- if (m != costs.end())
- {
- int32 mana = CalculatePct(m->Amount, 35);
- if (mana > 0)
- {
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, mana);
- GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_ITEM_MANA_SURGE, args);
- }
- }
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_sha_item_mana_surge::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_sha_item_mana_surge::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 40463 - Shaman Tier 6 Trinket
-class spell_sha_item_t6_trinket : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_SHAMAN_ENERGY_SURGE,
- SPELL_SHAMAN_POWER_SURGE
- });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
- if (!spellInfo)
- return;
-
- uint32 spellId;
- int32 chance;
-
- // Lesser Healing Wave
- if (spellInfo->SpellFamilyFlags[0] & 0x00000080)
- {
- spellId = SPELL_SHAMAN_ENERGY_SURGE;
- chance = 10;
- }
- // Lightning Bolt
- else if (spellInfo->SpellFamilyFlags[0] & 0x00000001)
- {
- spellId = SPELL_SHAMAN_ENERGY_SURGE;
- chance = 15;
- }
- // Stormstrike
- else if (spellInfo->SpellFamilyFlags[1] & 0x00000010)
- {
- spellId = SPELL_SHAMAN_POWER_SURGE;
- chance = 50;
- }
- else
- return;
-
- if (roll_chance_i(chance))
- eventInfo.GetActor()->CastSpell(nullptr, spellId, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_item_t6_trinket::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 70811 - Item - Shaman T10 Elemental 2P Bonus
-class spell_sha_item_t10_elemental_2p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_ELEMENTAL_MASTERY });
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- if (Player* target = GetTarget()->ToPlayer())
- target->GetSpellHistory()->ModifyCooldown(SPELL_SHAMAN_ELEMENTAL_MASTERY, Milliseconds(-aurEff->GetAmount()));
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_item_t10_elemental_2p_bonus::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 189063 - Lightning Vortex (proc 185881 Item - Shaman T18 Elemental 4P Bonus)
-class spell_sha_item_t18_elemental_4p_bonus : public AuraScript
-{
- void DiminishHaste(AuraEffect const* aurEff)
- {
- PreventDefaultAction();
- if (AuraEffect* hasteBuff = GetEffect(EFFECT_0))
- hasteBuff->ChangeAmount(hasteBuff->GetAmount() - aurEff->GetAmount());
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_item_t18_elemental_4p_bonus::DiminishHaste, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 51505 - Lava burst
-class spell_sha_lava_burst : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_PATH_OF_FLAMES_TALENT, SPELL_SHAMAN_PATH_OF_FLAMES_SPREAD, SPELL_SHAMAN_LAVA_SURGE });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* caster = GetCaster())
- if (caster->HasAura(SPELL_SHAMAN_PATH_OF_FLAMES_TALENT))
- caster->CastSpell(GetHitUnit(), SPELL_SHAMAN_PATH_OF_FLAMES_SPREAD, GetSpell());
- }
-
- void EnsureLavaSurgeCanBeImmediatelyConsumed()
- {
- Unit* caster = GetCaster();
-
- if (Aura* lavaSurge = caster->GetAura(SPELL_SHAMAN_LAVA_SURGE))
- {
- if (!GetSpell()->m_appliedMods.count(lavaSurge))
- {
- uint32 chargeCategoryId = GetSpellInfo()->ChargeCategoryId;
-
- // Ensure we have at least 1 usable charge after cast to allow next cast immediately
- if (!caster->GetSpellHistory()->HasCharge(chargeCategoryId))
- caster->GetSpellHistory()->RestoreCharge(chargeCategoryId);
- }
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_sha_lava_burst::HandleScript, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE);
- AfterCast += SpellCastFn(spell_sha_lava_burst::EnsureLavaSurgeCanBeImmediatelyConsumed);
- }
-};
-
-// 285452 - Lava Burst damage
-// 285466 - Lava Burst Overload damage
-class spell_sha_lava_crit_chance : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_FLAME_SHOCK });
- }
-
- void CalcCritChance(Unit const* victim, float& chance)
- {
- Unit* caster = GetCaster();
-
- if (!caster || !victim)
- return;
-
- if (victim->HasAura(SPELL_SHAMAN_FLAME_SHOCK, caster->GetGUID()))
- if (victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE) > -100)
- chance = 100.f;
- }
-
- void Register() override
- {
- OnCalcCritChance += SpellOnCalcCritChanceFn(spell_sha_lava_crit_chance::CalcCritChance);
- }
-};
-
-// 77756 - Lava Surge
-class spell_sha_lava_surge : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_LAVA_SURGE, SPELL_SHAMAN_IGNEOUS_POTENTIAL });
- }
-
- bool CheckProcChance(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- int32 procChance = aurEff->GetAmount();
- if (AuraEffect const* igneousPotential = GetTarget()->GetAuraEffect(SPELL_SHAMAN_IGNEOUS_POTENTIAL, EFFECT_0))
- procChance += igneousPotential->GetAmount();
-
- return roll_chance_i(procChance);
- }
-
- void HandleEffectProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_LAVA_SURGE, true);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_lava_surge::CheckProcChance, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_sha_lava_surge::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 77762 - Lava Surge
-class spell_sha_lava_surge_proc : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_LAVA_BURST });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void ResetCooldown()
- {
- GetCaster()->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_LAVA_BURST, GetCastDifficulty())->ChargeCategoryId);
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_sha_lava_surge_proc::ResetCooldown);
- }
-};
-
-// 188196 - Lightning Bolt
-class spell_sha_lightning_bolt : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_LIGHTNING_BOLT_ENERGIZE, SPELL_SHAMAN_MAELSTROM_CONTROLLER })
- && ValidateSpellEffect({ { SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_0 } });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (AuraEffect const* energizeAmount = GetCaster()->GetAuraEffect(SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_0))
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_LIGHTNING_BOLT_ENERGIZE, CastSpellExtraArgs(energizeAmount)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, energizeAmount->GetAmount()));
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_sha_lightning_bolt::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 45284 - Lightning Bolt Overload
-class spell_sha_lightning_bolt_overload : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_ENERGIZE, SPELL_SHAMAN_MAELSTROM_CONTROLLER })
- && ValidateSpellEffect({ { SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_1 } });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (AuraEffect const* energizeAmount = GetCaster()->GetAuraEffect(SPELL_SHAMAN_MAELSTROM_CONTROLLER, EFFECT_1))
- GetCaster()->CastSpell(GetCaster(), SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_ENERGIZE, CastSpellExtraArgs(energizeAmount)
- .AddSpellMod(SPELLVALUE_BASE_POINT0, energizeAmount->GetAmount()));
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_sha_lightning_bolt_overload::HandleScript, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 192223 - Liquid Magma Totem (erupting hit spell)
-class spell_sha_liquid_magma_totem : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_LIQUID_MAGMA_HIT });
- }
-
- void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
- {
- if (Unit* hitUnit = GetHitUnit())
- GetCaster()->CastSpell(hitUnit, SPELL_SHAMAN_LIQUID_MAGMA_HIT, true);
- }
-
- void HandleTargetSelect(std::list<WorldObject*>& targets)
- {
- // choose one random target from targets
- if (targets.size() > 1)
- {
- WorldObject* selected = Trinity::Containers::SelectRandomContainerElement(targets);
- targets.clear();
- targets.push_back(selected);
- }
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_liquid_magma_totem::HandleTargetSelect, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
- OnEffectHitTarget += SpellEffectFn(spell_sha_liquid_magma_totem::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 168534 - Mastery: Elemental Overload (passive)
-class spell_sha_mastery_elemental_overload : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_SHAMAN_LIGHTNING_BOLT,
- SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD,
- SPELL_SHAMAN_ELEMENTAL_BLAST,
- SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD,
- SPELL_SHAMAN_ICEFURY,
- SPELL_SHAMAN_ICEFURY_OVERLOAD,
- SPELL_SHAMAN_LAVA_BURST,
- SPELL_SHAMAN_LAVA_BURST_OVERLOAD,
- SPELL_SHAMAN_CHAIN_LIGHTNING,
- SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD,
- SPELL_SHAMAN_LAVA_BEAM,
- SPELL_SHAMAN_LAVA_BEAM_OVERLOAD,
- SPELL_SHAMAN_STORMKEEPER
- });
- }
-
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
- if (!spellInfo || !eventInfo.GetProcSpell())
- return false;
-
- if (!GetTriggeredSpellId(spellInfo->Id))
- return false;
-
- float chance = aurEff->GetAmount(); // Mastery % amount
-
- if (spellInfo->Id == SPELL_SHAMAN_CHAIN_LIGHTNING)
- chance /= 3.0f;
-
- if (Aura* stormkeeper = eventInfo.GetActor()->GetAura(SPELL_SHAMAN_STORMKEEPER))
- if (eventInfo.GetProcSpell()->m_appliedMods.find(stormkeeper) != eventInfo.GetProcSpell()->m_appliedMods.end())
- chance = 100.0f;
-
- return roll_chance_f(chance);
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo)
- {
- PreventDefaultAction();
-
- Unit* caster = procInfo.GetActor();
-
- caster->m_Events.AddEventAtOffset([caster,
- targets = CastSpellTargetArg(procInfo.GetProcTarget()),
- overloadSpellId = GetTriggeredSpellId(procInfo.GetSpellInfo()->Id),
- originalCastId = procInfo.GetProcSpell()->m_castId]() mutable
- {
- if (!targets.Targets)
- return;
-
- targets.Targets->Update(caster);
-
- CastSpellExtraArgs args;
- args.OriginalCastId = originalCastId;
- caster->CastSpell(targets, overloadSpellId, args);
- }, 400ms);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_mastery_elemental_overload::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_sha_mastery_elemental_overload::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
- uint32 GetTriggeredSpellId(uint32 triggeringSpellId)
- {
- switch (triggeringSpellId)
- {
- case SPELL_SHAMAN_LIGHTNING_BOLT: return SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD;
- case SPELL_SHAMAN_ELEMENTAL_BLAST: return SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD;
- case SPELL_SHAMAN_ICEFURY: return SPELL_SHAMAN_ICEFURY_OVERLOAD;
- case SPELL_SHAMAN_LAVA_BURST: return SPELL_SHAMAN_LAVA_BURST_OVERLOAD;
- case SPELL_SHAMAN_CHAIN_LIGHTNING: return SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD;
- case SPELL_SHAMAN_LAVA_BEAM: return SPELL_SHAMAN_LAVA_BEAM_OVERLOAD;
- default:
- break;
- }
- return 0;
- }
-};
-
-// 45284 - Lightning Bolt Overload
-// 45297 - Chain Lightning Overload
-// 114738 - Lava Beam Overload
-// 120588 - Elemental Blast Overload
-// 219271 - Icefury Overload
-// 285466 - Lava Burst Overload
-class spell_sha_mastery_elemental_overload_proc : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_MASTERY_ELEMENTAL_OVERLOAD });
- }
-
- void ApplyDamageModifier(SpellEffIndex /*effIndex*/)
- {
- if (AuraEffect const* elementalOverload = GetCaster()->GetAuraEffect(SPELL_SHAMAN_MASTERY_ELEMENTAL_OVERLOAD, EFFECT_1))
- SetHitDamage(CalculatePct(GetHitDamage(), elementalOverload->GetAmount()));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_sha_mastery_elemental_overload_proc::ApplyDamageModifier, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 30884 - Nature's Guardian
-class spell_sha_natures_guardian : public AuraScript
-{
- bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- return eventInfo.GetActionTarget()->HealthBelowPct(aurEff->GetAmount());
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_sha_natures_guardian::CheckProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 210621 - Path of Flames Spread
-class spell_sha_path_of_flames_spread : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_FLAME_SHOCK });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- targets.remove(GetExplTargetUnit());
- Trinity::Containers::RandomResize(targets, [this](WorldObject* target)
- {
- return target->GetTypeId() == TYPEID_UNIT && !target->ToUnit()->HasAura(SPELL_SHAMAN_FLAME_SHOCK, GetCaster()->GetGUID());
- }, 1);
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* mainTarget = GetExplTargetUnit())
- {
- if (Aura* flameShock = mainTarget->GetAura(SPELL_SHAMAN_FLAME_SHOCK, GetCaster()->GetGUID()))
- {
- if (Aura* newAura = GetCaster()->AddAura(SPELL_SHAMAN_FLAME_SHOCK, GetHitUnit()))
- {
- newAura->SetDuration(flameShock->GetDuration());
- newAura->SetMaxDuration(flameShock->GetDuration());
- }
- }
- }
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_path_of_flames_spread::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
- OnEffectHitTarget += SpellEffectFn(spell_sha_path_of_flames_spread::HandleScript, EFFECT_1, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 114083 - Restorative Mists
-// 294020 - Restorative Mists
-class spell_sha_restorative_mists : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- _targetCount = uint32(targets.size());
- }
-
- void HandleHeal(SpellEffIndex /*effIndex*/)
- {
- if (_targetCount)
- SetHitHeal(GetHitHeal() / _targetCount);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sha_restorative_mists::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
- OnEffectHitTarget += SpellEffectFn(spell_sha_restorative_mists::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
- }
-
-private:
- uint32 _targetCount = 0;
-};
-
-// 2645 - Ghost Wolf
-// 260878 - Spirit Wolf
-class spell_sha_spirit_wolf : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_GHOST_WOLF, SPELL_SHAMAN_SPIRIT_WOLF_TALENT, SPELL_SHAMAN_SPIRIT_WOLF_PERIODIC, SPELL_SHAMAN_SPIRIT_WOLF_AURA });
- }
-
- void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (target->HasAura(SPELL_SHAMAN_SPIRIT_WOLF_TALENT) && target->HasAura(SPELL_SHAMAN_GHOST_WOLF))
- target->CastSpell(target, SPELL_SHAMAN_SPIRIT_WOLF_PERIODIC, aurEff);
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_SHAMAN_SPIRIT_WOLF_PERIODIC);
- GetTarget()->RemoveAurasDueToSpell(SPELL_SHAMAN_SPIRIT_WOLF_AURA);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectApplyFn(spell_sha_spirit_wolf::OnApply, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_sha_spirit_wolf::OnRemove, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 51564 - Tidal Waves
-class spell_sha_tidal_waves : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_TIDAL_WAVES });
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, -aurEff->GetAmount());
- args.AddSpellMod(SPELLVALUE_BASE_POINT1, aurEff->GetAmount());
-
- GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_TIDAL_WAVES, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_tidal_waves::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 28823 - Totemic Power
-class spell_sha_t3_6p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_SHAMAN_TOTEMIC_POWER_ARMOR,
- SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER,
- SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER,
- SPELL_SHAMAN_TOTEMIC_POWER_MP5
- });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- uint32 spellId;
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- switch (target->GetClass())
- {
- case CLASS_PALADIN:
- case CLASS_PRIEST:
- case CLASS_SHAMAN:
- case CLASS_DRUID:
- spellId = SPELL_SHAMAN_TOTEMIC_POWER_MP5;
- break;
- case CLASS_MAGE:
- case CLASS_WARLOCK:
- spellId = SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER;
- break;
- case CLASS_HUNTER:
- case CLASS_ROGUE:
- spellId = SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER;
- break;
- case CLASS_WARRIOR:
- spellId = SPELL_SHAMAN_TOTEMIC_POWER_ARMOR;
- break;
- default:
- return;
- }
-
- caster->CastSpell(target, spellId, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_t3_6p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 28820 - Lightning Shield
-class spell_sha_t3_8p_bonus : public AuraScript
-{
- void PeriodicTick(AuraEffect const* /*aurEff*/)
- {
- PreventDefaultAction();
-
- // Need remove self if Lightning Shield not active
- if (!GetTarget()->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, flag128(0x400), GetCaster()->GetGUID()))
- Remove();
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_t3_8p_bonus::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- }
-};
-
-// 64928 - Item - Shaman T8 Elemental 4P Bonus
-class spell_sha_t8_elemental_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_ELECTRIFIED });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !damageInfo->GetDamage())
- return;
-
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_ELECTRIFIED, GetCastDifficulty());
- int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount());
-
- ASSERT(spellInfo->GetMaxTicks() > 0);
- amount /= spellInfo->GetMaxTicks();
-
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(amount);
- caster->CastSpell(target, SPELL_SHAMAN_ELECTRIFIED, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_t8_elemental_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 67228 - Item - Shaman T9 Elemental 4P Bonus (Lava Burst)
-class spell_sha_t9_elemental_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !damageInfo->GetDamage())
- return;
-
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE, GetCastDifficulty());
- int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount());
-
- ASSERT(spellInfo->GetMaxTicks() > 0);
- amount /= spellInfo->GetMaxTicks();
-
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(amount);
- caster->CastSpell(target, SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_t9_elemental_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 70817 - Item - Shaman T10 Elemental 4P Bonus
-class spell_sha_t10_elemental_4p_bonus : public AuraScript
-{
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- // try to find spell Flame Shock on the target
- AuraEffect* flameShock = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, flag128(0x10000000), caster->GetGUID());
- if (!flameShock)
- return;
-
- Aura* flameShockAura = flameShock->GetBase();
-
- int32 maxDuration = flameShockAura->GetMaxDuration();
- int32 newDuration = flameShockAura->GetDuration() + aurEff->GetAmount() * IN_MILLISECONDS;
-
- flameShockAura->SetDuration(newDuration);
- // is it blizzlike to change max duration for FS?
- if (newDuration > maxDuration)
- flameShockAura->SetMaxDuration(newDuration);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_t10_elemental_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 70808 - Item - Shaman T10 Restoration 4P Bonus
-class spell_sha_t10_restoration_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_CHAINED_HEAL });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- HealInfo* healInfo = eventInfo.GetHealInfo();
- if (!healInfo || !healInfo->GetHeal())
- return;
-
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_CHAINED_HEAL, GetCastDifficulty());
- int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount());
-
- ASSERT(spellInfo->GetMaxTicks() > 0);
- amount /= spellInfo->GetMaxTicks();
-
- Unit* caster = eventInfo.GetActor();
- Unit* target = eventInfo.GetProcTarget();
-
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(amount);
- caster->CastSpell(target, SPELL_SHAMAN_CHAINED_HEAL, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_t10_restoration_4p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 260895 - Unlimited Power
-class spell_sha_unlimited_power : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_UNLIMITED_POWER_BUFF });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo)
- {
- Unit* caster = procInfo.GetActor();
- if (Aura* aura = caster->GetAura(SPELL_SHAMAN_UNLIMITED_POWER_BUFF))
- aura->SetStackAmount(aura->GetStackAmount() + 1);
- else
- caster->CastSpell(caster, SPELL_SHAMAN_UNLIMITED_POWER_BUFF, procInfo.GetProcSpell());
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_unlimited_power::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 200071 - Undulation
-class spell_sha_undulation_passive : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_UNDULATION_PROC });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
- {
- if (++_castCounter == 3)
- {
- GetTarget()->CastSpell(GetTarget(), SPELL_SHAMAN_UNDULATION_PROC, true);
- _castCounter = 0;
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_undulation_passive::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
- uint8 _castCounter = 1; // first proc happens after two casts, then one every 3 casts
-};
-
-// 33757 - Windfury Weapon
-class spell_sha_windfury_weapon : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_WINDFURY_ENCHANTMENT });
- }
-
- bool Load() override
- {
- return GetCaster()->IsPlayer();
- }
-
- void HandleEffect(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
-
- if (Item* mainHand = GetCaster()->ToPlayer()->GetWeaponForAttack(BASE_ATTACK, false))
- GetCaster()->CastSpell(mainHand, SPELL_SHAMAN_WINDFURY_ENCHANTMENT, GetSpell());
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_sha_windfury_weapon::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 319773 - Windfury Weapon (proc)
-class spell_sha_windfury_weapon_proc : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_WINDFURY_ATTACK });
- }
-
- void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- for (uint32 i = 0; i < 2; ++i)
- eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHAMAN_WINDFURY_ATTACK, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_sha_windfury_weapon_proc::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 378269 - Windspeaker's Lava Resurgence
-class spell_sha_windspeakers_lava_resurgence : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHAMAN_VOLCANIC_SURGE });
- }
-
- void PreventLavaSurge(SpellEffIndex effIndex)
- {
- if (GetCaster()->HasAura(SPELL_SHAMAN_VOLCANIC_SURGE))
- PreventHitDefaultEffect(effIndex);
- }
-
- void PreventVolcanicSurge(SpellEffIndex effIndex)
- {
- if (!GetCaster()->HasAura(SPELL_SHAMAN_VOLCANIC_SURGE))
- PreventHitDefaultEffect(effIndex);
- }
-
- void Register() override
- {
- OnEffectLaunch += SpellEffectFn(spell_sha_windspeakers_lava_resurgence::PreventLavaSurge, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
- OnEffectLaunch += SpellEffectFn(spell_sha_windspeakers_lava_resurgence::PreventVolcanicSurge, EFFECT_2, SPELL_EFFECT_TRIGGER_SPELL);
- }
-};
-
-// 192078 - Wind Rush Totem (Spell)
-// 12676 - AreaTriggerId
-struct areatrigger_sha_wind_rush_totem : AreaTriggerAI
-{
- static constexpr uint32 REFRESH_TIME = 4500;
-
- areatrigger_sha_wind_rush_totem(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger), _refreshTimer(REFRESH_TIME) { }
-
- void OnUpdate(uint32 diff) override
- {
- _refreshTimer -= diff;
- if (_refreshTimer <= 0)
- {
- if (Unit* caster = at->GetCaster())
- {
- for (ObjectGuid const& guid : at->GetInsideUnits())
- {
- if (Unit* unit = ObjectAccessor::GetUnit(*caster, guid))
- {
- if (!caster->IsFriendlyTo(unit))
- continue;
-
- caster->CastSpell(unit, SPELL_SHAMAN_WIND_RUSH, true);
- }
- }
- }
- _refreshTimer += REFRESH_TIME;
- }
- }
-
- void OnUnitEnter(Unit* unit) override
- {
- if (Unit* caster = at->GetCaster())
- {
- if (!caster->IsFriendlyTo(unit))
- return;
-
- caster->CastSpell(unit, SPELL_SHAMAN_WIND_RUSH, true);
- }
- }
-private:
- int32 _refreshTimer;
-};
void AddSC_shaman_spell_scripts()
{
- RegisterSpellScript(spell_sha_aftershock);
- RegisterSpellScript(spell_sha_ancestral_guidance);
- RegisterSpellScript(spell_sha_ancestral_guidance_heal);
- RegisterSpellScript(spell_sha_ascendance_restoration);
- RegisterSpellScript(spell_sha_chain_lightning);
- RegisterSpellScript(spell_sha_chain_lightning_overload);
- RegisterSpellScript(spell_sha_crash_lightning);
- RegisterSpellScript(spell_sha_deeply_rooted_elements);
- RegisterSpellScript(spell_sha_doom_winds_legendary);
- RegisterSpellScript(spell_sha_downpour);
- RegisterSpellScript(spell_sha_earth_shield);
- RegisterSpellScript(spell_sha_earth_shock);
- RegisterSpellScript(spell_sha_earthen_rage_passive);
- RegisterSpellScript(spell_sha_earthen_rage_proc_aura);
- RegisterAreaTriggerAI(areatrigger_sha_earthquake);
- RegisterSpellScript(spell_sha_earthquake);
- RegisterSpellScript(spell_sha_earthquake_tick);
- RegisterSpellScript(spell_sha_elemental_blast);
- RegisterSpellScript(spell_sha_flametongue_weapon);
- RegisterSpellScript(spell_sha_flametongue_weapon_aura);
- RegisterSpellAndAuraScriptPair(spell_sha_healing_rain, spell_sha_healing_rain_aura);
- RegisterSpellScript(spell_sha_healing_rain_target_limit);
- RegisterSpellScript(spell_sha_healing_stream_totem_heal);
- RegisterSpellScript(spell_sha_icefury);
- RegisterSpellScript(spell_sha_item_lightning_shield);
- RegisterSpellScript(spell_sha_item_lightning_shield_trigger);
- RegisterSpellScript(spell_sha_item_mana_surge);
- RegisterSpellScript(spell_sha_item_t6_trinket);
- RegisterSpellScript(spell_sha_item_t10_elemental_2p_bonus);
- RegisterSpellScript(spell_sha_item_t18_elemental_4p_bonus);
- RegisterSpellScript(spell_sha_lava_burst);
- RegisterSpellScript(spell_sha_lava_crit_chance);
- RegisterSpellScript(spell_sha_lava_surge);
- RegisterSpellScript(spell_sha_lava_surge_proc);
- RegisterSpellScript(spell_sha_lightning_bolt);
- RegisterSpellScript(spell_sha_lightning_bolt_overload);
- RegisterSpellScript(spell_sha_liquid_magma_totem);
- RegisterSpellScript(spell_sha_mastery_elemental_overload);
- RegisterSpellScript(spell_sha_mastery_elemental_overload_proc);
- RegisterSpellScript(spell_sha_natures_guardian);
- RegisterSpellScript(spell_sha_path_of_flames_spread);
- RegisterSpellScript(spell_sha_restorative_mists);
- RegisterSpellScript(spell_sha_spirit_wolf);
- RegisterSpellScript(spell_sha_tidal_waves);
- RegisterSpellScript(spell_sha_t3_6p_bonus);
- RegisterSpellScript(spell_sha_t3_8p_bonus);
- RegisterSpellScript(spell_sha_t8_elemental_4p_bonus);
- RegisterSpellScript(spell_sha_t9_elemental_4p_bonus);
- RegisterSpellScript(spell_sha_t10_elemental_4p_bonus);
- RegisterSpellScript(spell_sha_t10_restoration_4p_bonus);
- RegisterSpellScript(spell_sha_unlimited_power);
- RegisterSpellScript(spell_sha_undulation_passive);
- RegisterSpellScript(spell_sha_windfury_weapon);
- RegisterSpellScript(spell_sha_windfury_weapon_proc);
- RegisterSpellScript(spell_sha_windspeakers_lava_resurgence);
- RegisterAreaTriggerAI(areatrigger_sha_wind_rush_totem);
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index a13eaa70265..3c5b48ae9de 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -22,1043 +22,7 @@
*/
#include "ScriptMgr.h"
-#include "AreaTrigger.h"
-#include "Creature.h"
-#include "GameObject.h"
-#include "ObjectAccessor.h"
-#include "Pet.h"
-#include "Player.h"
-#include "Random.h"
-#include "SpellAuraEffects.h"
-#include "SpellAuras.h"
-#include "SpellMgr.h"
-#include "SpellScript.h"
-
-enum WarlockSpells
-{
- SPELL_WARLOCK_CREATE_HEALTHSTONE = 23517,
- SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
- SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
- SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
- SPELL_WARLOCK_DEVOUR_MAGIC_HEAL = 19658,
- SPELL_WARLOCK_DOOM_ENERGIZE = 193318,
- SPELL_WARLOCK_DRAIN_SOUL_ENERGIZE = 205292,
- SPELL_WARLOCK_GLYPH_OF_DEMON_TRAINING = 56249,
- SPELL_WARLOCK_GLYPH_OF_SOUL_SWAP = 56226,
- SPELL_WARLOCK_GLYPH_OF_SUCCUBUS = 56250,
- SPELL_WARLOCK_IMMOLATE_PERIODIC = 157736,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
- SPELL_WARLOCK_RAIN_OF_FIRE = 5740,
- SPELL_WARLOCK_RAIN_OF_FIRE_DAMAGE = 42223,
- SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE = 27285,
- SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC = 32865,
- SPELL_WARLOCK_SHADOW_BOLT_ENERGIZE = 194192,
- SPELL_WARLOCK_SOULSHATTER_EFFECT = 32835,
- SPELL_WARLOCK_SOUL_SWAP_CD_MARKER = 94229,
- SPELL_WARLOCK_SOUL_SWAP_OVERRIDE = 86211,
- SPELL_WARLOCK_SOUL_SWAP_MOD_COST = 92794,
- SPELL_WARLOCK_SOUL_SWAP_DOT_MARKER = 92795,
- SPELL_WARLOCK_UNSTABLE_AFFLICTION = 30108,
- SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117,
- SPELL_WARLOCK_SHADOWFLAME = 37378,
- SPELL_WARLOCK_FLAMESHADOW = 37379,
- SPELL_WARLOCK_SUMMON_SUCCUBUS = 712,
- SPELL_WARLOCK_SUMMON_INCUBUS = 365349,
- SPELL_WARLOCK_STRENGTHEN_PACT_SUCCUBUS = 366323,
- SPELL_WARLOCK_STRENGTHEN_PACT_INCUBUS = 366325,
- SPELL_WARLOCK_SUCCUBUS_PACT = 365360,
- SPELL_WARLOCK_INCUBUS_PACT = 365355
-};
-
-enum MiscSpells
-{
- SPELL_GEN_REPLENISHMENT = 57669,
- SPELL_PRIEST_SHADOW_WORD_DEATH = 32409
-};
-
-// 710 - Banish
-class spell_warl_banish : public SpellScript
-{
-public:
- spell_warl_banish() {}
-
-private:
- void HandleBanish(SpellMissInfo missInfo)
- {
- if (missInfo != SPELL_MISS_IMMUNE)
- return;
-
- if (Unit* target = GetHitUnit())
- {
- // Casting Banish on a banished target will remove applied aura
- if (Aura * banishAura = target->GetAura(GetSpellInfo()->Id, GetCaster()->GetGUID()))
- banishAura->Remove();
- }
- }
-
- void Register() override
- {
- BeforeHit += BeforeSpellHitFn(spell_warl_banish::HandleBanish);
- }
-};
-
-// 111400 - Burning Rush
-class spell_warl_burning_rush : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- SpellCastResult CheckApplyAura()
- {
- Unit* caster = GetCaster();
-
- if (caster->GetHealthPct() <= float(GetEffectInfo(EFFECT_1).CalcValue(caster)))
- {
- SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_YOU_DONT_HAVE_ENOUGH_HEALTH);
- return SPELL_FAILED_CUSTOM_ERROR;
- }
-
- return SPELL_CAST_OK;
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_warl_burning_rush::CheckApplyAura);
- }
-};
-
-// 111400 - Burning Rush
-class spell_warl_burning_rush_aura : public AuraScript
-{
- void PeriodicTick(AuraEffect const* aurEff)
- {
- if (GetTarget()->GetHealthPct() <= float(aurEff->GetAmount()))
- {
- PreventDefaultAction();
- Remove();
- }
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_burning_rush_aura::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
- }
-};
-
-// 116858 - Chaos Bolt
-class spell_warl_chaos_bolt : public SpellScript
-{
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- // @TODO: Fix for 4.4.0
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- SetHitDamage(GetHitDamage() + CalculatePct(GetHitDamage(), GetCaster()->ToPlayer()->m_activePlayerData->SpellCritPercentage[0]));
- }
-
- void CalcCritChance(Unit const* /*victim*/, float& critChance)
- {
- critChance = 100.0f;
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warl_chaos_bolt::HandleDummy, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- OnCalcCritChance += SpellOnCalcCritChanceFn(spell_warl_chaos_bolt::CalcCritChance);
- }
-};
-
-// 77220 - Mastery: Chaotic Energies
-class spell_warl_chaotic_energies : public AuraScript
-{
- void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount)
- {
- AuraEffect const* effect1 = GetEffect(EFFECT_1);
- if (!effect1 || !GetTargetApplication()->HasEffect(EFFECT_1))
- {
- PreventDefaultAction();
- return;
- }
-
- // You take ${$s2/3}% reduced damage
- float damageReductionPct = float(effect1->GetAmount()) / 3;
- // plus a random amount of up to ${$s2/3}% additional reduced damage
- damageReductionPct += frand(0.0f, damageReductionPct);
-
- absorbAmount = CalculatePct(dmgInfo.GetDamage(), damageReductionPct);
- }
-
- void Register() override
- {
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_warl_chaotic_energies::HandleAbsorb, EFFECT_2);
- }
-};
-
-// 6201 - Create Healthstone
-class spell_warl_create_healthstone : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_CREATE_HEALTHSTONE });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_CREATE_HEALTHSTONE, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warl_create_healthstone::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-// 108416 - Dark Pact
-class spell_warl_dark_pact : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 }, { spellInfo->Id, EFFECT_2 } });
- }
-
- void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
- if (Unit* caster = GetCaster())
- {
- float extraAmount = caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()) * 2.5f;
- int32 absorb = caster->CountPctFromCurHealth(GetEffectInfo(EFFECT_1).CalcValue(caster));
- caster->SetHealth(caster->GetHealth() - absorb);
- amount = CalculatePct(absorb, GetEffectInfo(EFFECT_2).CalcValue(caster)) + extraAmount;
- }
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_dark_pact::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- }
-};
-
-// 48018 - Demonic Circle: Summon
-class spell_warl_demonic_circle_summon : public AuraScript
-{
- void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode)
- {
- // If effect is removed by expire remove the summoned demonic circle too.
- if (!(mode & AURA_EFFECT_HANDLE_REAPPLY))
- GetTarget()->RemoveGameObject(GetId(), true);
-
- GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
- }
-
- void HandleDummyTick(AuraEffect const* /*aurEff*/)
- {
- if (GameObject* circle = GetTarget()->GetGameObject(GetId()))
- {
- // Here we check if player is in demonic circle teleport range, if so add
- // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT.
- // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST.
-
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT, GetCastDifficulty());
-
- if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true)))
- {
- if (!GetTarget()->HasAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST))
- GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true);
- }
- else
- GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
- }
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectApplyFn(spell_warl_demonic_circle_summon::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// 48020 - Demonic Circle: Teleport
-class spell_warl_demonic_circle_teleport : public AuraScript
-{
- void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Player* player = GetTarget()->ToPlayer())
- {
- if (GameObject* circle = player->GetGameObject(SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON))
- {
- player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation());
- player->RemoveMovementImpairingAuras(false);
- }
- }
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 67518, 19505 - Devour Magic
-class spell_warl_devour_magic : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_DEMON_TRAINING, SPELL_WARLOCK_DEVOUR_MAGIC_HEAL })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void OnSuccessfulDispel(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- CastSpellExtraArgs args;
- args.TriggerFlags = TRIGGERED_FULL_MASK;
- args.AddSpellBP0(GetEffectInfo(EFFECT_1).CalcValue(caster));
-
- caster->CastSpell(caster, SPELL_WARLOCK_DEVOUR_MAGIC_HEAL, args);
-
- // Glyph of Felhunter
- if (Unit* owner = caster->GetOwner())
- if (owner->GetAura(SPELL_WARLOCK_GLYPH_OF_DEMON_TRAINING))
- owner->CastSpell(owner, SPELL_WARLOCK_DEVOUR_MAGIC_HEAL, args);
- }
-
- void Register() override
- {
- OnEffectSuccessfulDispel += SpellEffectFn(spell_warl_devour_magic::OnSuccessfulDispel, EFFECT_0, SPELL_EFFECT_DISPEL);
- }
-};
-
-// 603 - Doom
-class spell_warl_doom : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo ({ SPELL_WARLOCK_DOOM_ENERGIZE });
- }
-
- void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(caster, SPELL_WARLOCK_DOOM_ENERGIZE, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_doom::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
- }
-};
-
-// 198590 - Drain Soul
-class spell_warl_drain_soul : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo ({ SPELL_WARLOCK_DRAIN_SOUL_ENERGIZE });
- }
-
- void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
- return;
-
- if (Unit* caster = GetCaster())
- caster->CastSpell(caster, SPELL_WARLOCK_DRAIN_SOUL_ENERGIZE, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectApplyFn(spell_warl_drain_soul::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// 48181 - Haunt
-class spell_warl_haunt : public SpellScript
-{
- void HandleAfterHit()
- {
- if (Aura* aura = GetHitAura())
- if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1))
- aurEff->SetAmount(CalculatePct(GetHitDamage(), aurEff->GetAmount()));
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_warl_haunt::HandleAfterHit);
- }
-};
-
-// 755 - Health Funnel
-class spell_warl_health_funnel : public AuraScript
-{
- void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- Unit* target = GetTarget();
- if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2))
- target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2, true);
- else if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1))
- target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1, true);
- }
-
- void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1);
- target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2);
- }
-
- void OnPeriodic(AuraEffect const* aurEff)
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
- //! HACK for self damage, is not blizz :/
- uint32 damage = caster->CountPctFromMaxHealth(aurEff->GetBaseAmount());
-
- if (Player* modOwner = caster->GetSpellModOwner())
- modOwner->ApplySpellMod(GetSpellInfo(), SpellModOp::PowerCost0, damage);
-
- SpellNonMeleeDamage damageInfo(caster, caster, GetSpellInfo(), GetAura()->GetSpellVisual(), GetSpellInfo()->SchoolMask, GetAura()->GetCastId());
- damageInfo.periodicLog = true;
- damageInfo.damage = damage;
- caster->DealSpellDamage(&damageInfo, false);
- caster->SendSpellNonMeleeDamageLog(&damageInfo);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel::ApplyEffect, EFFECT_0, SPELL_AURA_OBS_MOD_HEALTH, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel::RemoveEffect, EFFECT_0, SPELL_AURA_OBS_MOD_HEALTH, AURA_EFFECT_HANDLE_REAL);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_health_funnel::OnPeriodic, EFFECT_0, SPELL_AURA_OBS_MOD_HEALTH);
- }
-};
-
-// 6262 - Healthstone
-class spell_warl_healthstone_heal : public SpellScript
-{
- void HandleOnHit()
- {
- int32 heal = int32(CalculatePct(GetCaster()->GetCreateHealth(), GetHitHeal()));
- SetHitHeal(heal);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_warl_healthstone_heal::HandleOnHit);
- }
-};
-
-// 348 - Immolate
-class spell_warl_immolate : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_IMMOLATE_PERIODIC});
- }
-
- void HandleOnEffectHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_WARLOCK_IMMOLATE_PERIODIC, GetSpell());
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warl_immolate::HandleOnEffectHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 366330 - Random Sayaad
-class spell_warl_random_sayaad : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARLOCK_SUCCUBUS_PACT,
- SPELL_WARLOCK_INCUBUS_PACT
- });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
-
- caster->RemoveAurasDueToSpell(SPELL_WARLOCK_SUCCUBUS_PACT);
- caster->RemoveAurasDueToSpell(SPELL_WARLOCK_INCUBUS_PACT);
-
- Player* player = GetCaster()->ToPlayer();
- if (!player)
- return;
-
- if (Pet* pet = player->GetPet())
- {
- if (pet->IsPetSayaad())
- pet->DespawnOrUnsummon();
- }
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_warl_random_sayaad::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 366323 - Strengthen Pact - Succubus
-// 366325 - Strengthen Pact - Incubus
-// 366222 - Summon Sayaad
-class spell_warl_sayaad_precast_disorientation : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ PET_SUMMONING_DISORIENTATION });
- }
-
- // Note: this is a special case in which the warlock's minion pet must also cast Summon Disorientation at the beginning since this is only handled by SPELL_EFFECT_SUMMON_PET in Spell::CheckCast.
- void OnPrecast() override
- {
- Player* player = GetCaster()->ToPlayer();
- if (!player)
- return;
-
- if (Pet* pet = player->GetPet())
- pet->CastSpell(pet, PET_SUMMONING_DISORIENTATION, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(pet->GetGUID())
- .SetTriggeringSpell(GetSpell()));
- }
-
- void Register() override
- {
- }
-};
-
-// 6358 - Seduction (Special Ability)
-class spell_warl_seduction : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_SUCCUBUS, SPELL_PRIEST_SHADOW_WORD_DEATH });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
- {
- if (caster->GetOwner() && caster->GetOwner()->HasAura(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS))
- {
- target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(SPELL_PRIEST_SHADOW_WORD_DEATH)); // SW:D shall not be removed.
- target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
- target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
- }
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warl_seduction::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- }
-};
-
-// 27285 - Seed of Corruption
-class spell_warl_seed_of_corruption : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (GetExplTargetUnit())
- targets.remove(GetExplTargetUnit());
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warl_seed_of_corruption::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
- }
-};
-
-// 27243 - Seed of Corruption
-class spell_warl_seed_of_corruption_dummy : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE });
- }
-
- void CalculateBuffer(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- amount = caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()) * GetEffectInfo(EFFECT_0).CalcValue(caster) / 100;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !damageInfo->GetDamage())
- return;
-
- int32 amount = aurEff->GetAmount() - damageInfo->GetDamage();
- if (amount > 0)
- {
- const_cast<AuraEffect*>(aurEff)->SetAmount(amount);
- if (!GetTarget()->HealthBelowPctDamaged(1, damageInfo->GetDamage()))
- return;
- }
-
- Remove();
-
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE, aurEff);
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_seed_of_corruption_dummy::CalculateBuffer, EFFECT_2, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_dummy::HandleProc, EFFECT_2, SPELL_AURA_DUMMY);
- }
-};
-
-// 32863 - Seed of Corruption
-// 36123 - Seed of Corruption
-// 38252 - Seed of Corruption
-// 39367 - Seed of Corruption
-// 44141 - Seed of Corruption
-// 70388 - Seed of Corruption
-// Monster spells, triggered only on amount drop (not on death)
-class spell_warl_seed_of_corruption_generic : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !damageInfo->GetDamage())
- return;
-
- int32 amount = aurEff->GetAmount() - damageInfo->GetDamage();
- if (amount > 0)
- {
- const_cast<AuraEffect*>(aurEff)->SetAmount(amount);
- return;
- }
-
- Remove();
-
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_generic::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 686 - Shadow Bolt
-class spell_warl_shadow_bolt : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo ({ SPELL_WARLOCK_SHADOW_BOLT_ENERGIZE });
- }
-
- void HandleAfterCast()
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_SHADOW_BOLT_ENERGIZE, true);
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_warl_shadow_bolt::HandleAfterCast);
- }
-};
-
-// 86121 - Soul Swap
-class spell_warl_soul_swap : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_WARLOCK_GLYPH_OF_SOUL_SWAP,
- SPELL_WARLOCK_SOUL_SWAP_CD_MARKER,
- SPELL_WARLOCK_SOUL_SWAP_OVERRIDE
- });
- }
-
- void HandleHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_OVERRIDE, true);
- GetHitUnit()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_DOT_MARKER, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warl_soul_swap::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 86211 - Soul Swap Override - Also acts as a dot container
-class spell_warl_soul_swap_override : public AuraScript
-{
- //! Forced to, pure virtual functions must have a body when linking
- void Register() override { }
-
-public:
- void AddDot(uint32 id) { _dotList.push_back(id); }
- std::list<uint32> const GetDotList() const { return _dotList; }
- Unit* GetOriginalSwapSource() const { return _swapCaster; }
- void SetOriginalSwapSource(Unit* victim) { _swapCaster = victim; }
-
-private:
- std::list<uint32> _dotList;
- Unit* _swapCaster = nullptr;
-};
-
-//! Soul Swap Copy Spells - 92795 - Simply copies spell IDs.
-class spell_warl_soul_swap_dot_marker : public SpellScript
-{
- void HandleHit(SpellEffIndex /*effIndex*/)
- {
- Unit* swapVictim = GetCaster();
- Unit* warlock = GetHitUnit();
- if (!warlock || !swapVictim)
- return;
-
- Unit::AuraApplicationMap const& appliedAuras = swapVictim->GetAppliedAuras();
- spell_warl_soul_swap_override* swapSpellScript = nullptr;
- if (Aura* swapOverrideAura = warlock->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE))
- swapSpellScript = swapOverrideAura->GetScript<spell_warl_soul_swap_override>();
-
- if (!swapSpellScript)
- return;
-
- flag128 classMask = GetEffectInfo().SpellClassMask;
-
- for (Unit::AuraApplicationMap::const_iterator itr = appliedAuras.begin(); itr != appliedAuras.end(); ++itr)
- {
- SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
- if (itr->second->GetBase()->GetCaster() == warlock)
- if (spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && (spellProto->SpellFamilyFlags & classMask))
- swapSpellScript->AddDot(itr->first);
- }
-
- swapSpellScript->SetOriginalSwapSource(swapVictim);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warl_soul_swap_dot_marker::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 86213 - Soul Swap Exhale
-class spell_warl_soul_swap_exhale : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_SOUL_SWAP_MOD_COST, SPELL_WARLOCK_SOUL_SWAP_OVERRIDE });
- }
-
- SpellCastResult CheckCast()
- {
- Unit* currentTarget = GetExplTargetUnit();
- Unit* swapTarget = nullptr;
- if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE))
- if (spell_warl_soul_swap_override* swapScript = swapOverride->GetScript<spell_warl_soul_swap_override>())
- swapTarget = swapScript->GetOriginalSwapSource();
-
- // Soul Swap Exhale can't be cast on the same target than Soul Swap
- if (swapTarget && currentTarget && swapTarget == currentTarget)
- return SPELL_FAILED_BAD_TARGETS;
-
- return SPELL_CAST_OK;
- }
-
- void OnEffectHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_MOD_COST, true);
- bool hasGlyph = GetCaster()->HasAura(SPELL_WARLOCK_GLYPH_OF_SOUL_SWAP);
-
- std::list<uint32> dotList;
- Unit* swapSource = nullptr;
- if (Aura const* swapOverride = GetCaster()->GetAura(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE))
- {
- spell_warl_soul_swap_override* swapScript = swapOverride->GetScript<spell_warl_soul_swap_override>();
- if (!swapScript)
- return;
- dotList = swapScript->GetDotList();
- swapSource = swapScript->GetOriginalSwapSource();
- }
-
- if (dotList.empty())
- return;
-
- for (std::list<uint32>::const_iterator itr = dotList.begin(); itr != dotList.end(); ++itr)
- {
- GetCaster()->AddAura(*itr, GetHitUnit());
- if (!hasGlyph && swapSource)
- swapSource->RemoveAurasDueToSpell(*itr);
- }
-
- // Remove Soul Swap Exhale buff
- GetCaster()->RemoveAurasDueToSpell(SPELL_WARLOCK_SOUL_SWAP_OVERRIDE);
-
- if (hasGlyph) // Add a cooldown on Soul Swap if caster has the glyph
- GetCaster()->CastSpell(GetCaster(), SPELL_WARLOCK_SOUL_SWAP_CD_MARKER, false);
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_warl_soul_swap_exhale::CheckCast);
- OnEffectHitTarget += SpellEffectFn(spell_warl_soul_swap_exhale::OnEffectHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
-};
-
-// 29858 - Soulshatter
-class spell_warl_soulshatter : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_SOULSHATTER_EFFECT });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
- if (target->GetThreatManager().IsThreatenedBy(caster, true))
- caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER_EFFECT, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warl_soulshatter::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 366323 - Strengthen Pact - Succubus
-class spell_warl_strengthen_pact_succubus : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARLOCK_SUCCUBUS_PACT,
- SPELL_WARLOCK_SUMMON_SUCCUBUS
- });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
-
- caster->CastSpell(nullptr, SPELL_WARLOCK_SUCCUBUS_PACT, TRIGGERED_FULL_MASK);
- caster->CastSpell(nullptr, SPELL_WARLOCK_SUMMON_SUCCUBUS, TRIGGERED_FULL_MASK);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_warl_strengthen_pact_succubus::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 366325 - Strengthen Pact - Incubus
-class spell_warl_strengthen_pact_incubus : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARLOCK_INCUBUS_PACT,
- SPELL_WARLOCK_SUMMON_INCUBUS
- });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
-
- caster->CastSpell(nullptr, SPELL_WARLOCK_INCUBUS_PACT, TRIGGERED_FULL_MASK);
- caster->CastSpell(nullptr, SPELL_WARLOCK_SUMMON_INCUBUS, TRIGGERED_FULL_MASK);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_warl_strengthen_pact_incubus::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 366222 - Summon Sayaad
-class spell_warl_summon_sayaad : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARLOCK_SUMMON_SUCCUBUS,
- SPELL_WARLOCK_SUMMON_INCUBUS
- });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(nullptr, roll_chance_i(50) ? SPELL_WARLOCK_SUMMON_SUCCUBUS : SPELL_WARLOCK_SUMMON_INCUBUS, TRIGGERED_FULL_MASK);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_warl_summon_sayaad::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 37377 - Shadowflame
-// 39437 - Shadowflame Hellfire and RoF
-template <uint32 Trigger>
-class spell_warl_t4_2p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ Trigger });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Unit* caster = eventInfo.GetActor();
- caster->CastSpell(caster, Trigger, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_warl_t4_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 30108, 34438, 34439, 35183 - Unstable Affliction
-class spell_warl_unstable_affliction : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL });
- }
-
- void HandleDispel(DispelInfo* dispelInfo)
- {
- if (Unit* caster = GetCaster())
- {
- if (AuraEffect const* aurEff = GetEffect(EFFECT_1))
- {
- if (Unit* target = dispelInfo->GetDispeller()->ToUnit())
- {
- int32 bp = aurEff->GetAmount();
- bp = target->SpellDamageBonusTaken(caster, aurEff->GetSpellInfo(), bp, DOT);
- bp *= 9;
-
- // backfire damage and silence
- CastSpellExtraArgs args(aurEff);
- args.AddSpellBP0(bp);
- caster->CastSpell(target, SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, args);
- }
- }
- }
- }
-
- void Register() override
- {
- AfterDispel += AuraDispelFn(spell_warl_unstable_affliction::HandleDispel);
- }
-};
-
-// 5740 - Rain of Fire
-/// Updated 7.1.5
-class spell_warl_rain_of_fire : public AuraScript
-{
- void HandleDummyTick(AuraEffect const* /*aurEff*/)
- {
- std::vector<AreaTrigger*> rainOfFireAreaTriggers = GetTarget()->GetAreaTriggers(SPELL_WARLOCK_RAIN_OF_FIRE);
- GuidUnorderedSet targetsInRainOfFire;
-
- for (AreaTrigger* rainOfFireAreaTrigger : rainOfFireAreaTriggers)
- {
- GuidUnorderedSet const& insideTargets = rainOfFireAreaTrigger->GetInsideUnits();
- targetsInRainOfFire.insert(insideTargets.begin(), insideTargets.end());
- }
-
- for (ObjectGuid insideTargetGuid : targetsInRainOfFire)
- if (Unit* insideTarget = ObjectAccessor::GetUnit(*GetTarget(), insideTargetGuid))
- if (!GetTarget()->IsFriendlyTo(insideTarget))
- GetTarget()->CastSpell(insideTarget, SPELL_WARLOCK_RAIN_OF_FIRE_DAMAGE, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_rain_of_fire::HandleDummyTick, EFFECT_3, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
void AddSC_warlock_spell_scripts()
{
- RegisterSpellScript(spell_warl_banish);
- RegisterSpellAndAuraScriptPair(spell_warl_burning_rush, spell_warl_burning_rush_aura);
- RegisterSpellScript(spell_warl_chaos_bolt);
- RegisterSpellScript(spell_warl_chaotic_energies);
- RegisterSpellScript(spell_warl_create_healthstone);
- RegisterSpellScript(spell_warl_dark_pact);
- RegisterSpellScript(spell_warl_demonic_circle_summon);
- RegisterSpellScript(spell_warl_demonic_circle_teleport);
- RegisterSpellScript(spell_warl_devour_magic);
- RegisterSpellScript(spell_warl_doom);
- RegisterSpellScript(spell_warl_drain_soul);
- RegisterSpellScript(spell_warl_haunt);
- RegisterSpellScript(spell_warl_health_funnel);
- RegisterSpellScript(spell_warl_healthstone_heal);
- RegisterSpellScript(spell_warl_immolate);
- RegisterSpellScript(spell_warl_random_sayaad);
- RegisterSpellScript(spell_warl_sayaad_precast_disorientation);
- RegisterSpellScript(spell_warl_seduction);
- RegisterSpellScript(spell_warl_seed_of_corruption);
- RegisterSpellScript(spell_warl_seed_of_corruption_dummy);
- RegisterSpellScript(spell_warl_seed_of_corruption_generic);
- RegisterSpellScript(spell_warl_shadow_bolt);
- RegisterSpellScript(spell_warl_soul_swap);
- RegisterSpellScript(spell_warl_soul_swap_dot_marker);
- RegisterSpellScript(spell_warl_soul_swap_exhale);
- RegisterSpellScript(spell_warl_soul_swap_override);
- RegisterSpellScript(spell_warl_soulshatter);
- RegisterSpellScript(spell_warl_strengthen_pact_succubus);
- RegisterSpellScript(spell_warl_strengthen_pact_incubus);
- RegisterSpellScript(spell_warl_summon_sayaad);
- RegisterSpellScriptWithArgs(spell_warl_t4_2p_bonus<SPELL_WARLOCK_FLAMESHADOW>, "spell_warl_t4_2p_bonus_shadow");
- RegisterSpellScriptWithArgs(spell_warl_t4_2p_bonus<SPELL_WARLOCK_SHADOWFLAME>, "spell_warl_t4_2p_bonus_fire");
- RegisterSpellScript(spell_warl_unstable_affliction);
- RegisterSpellScript(spell_warl_rain_of_fire);
}
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 34e2f2b0bc3..998964732ff 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -22,829 +22,7 @@
*/
#include "ScriptMgr.h"
-#include "Map.h"
-#include "MoveSpline.h"
-#include "PathGenerator.h"
-#include "Player.h"
-#include "Spell.h"
-#include "SpellMgr.h"
-#include "SpellAuraEffects.h"
-#include "SpellHistory.h"
-#include "SpellScript.h"
-
-enum WarriorSpells
-{
- SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND = 50622,
- SPELL_WARRIOR_BLOODTHIRST_HEAL = 117313,
- SPELL_WARRIOR_CHARGE = 34846,
- SPELL_WARRIOR_CHARGE_EFFECT = 218104,
- SPELL_WARRIOR_CHARGE_EFFECT_BLAZING_TRAIL = 198337,
- SPELL_WARRIOR_CHARGE_PAUSE_RAGE_DECAY = 109128,
- SPELL_WARRIOR_CHARGE_ROOT_EFFECT = 105771,
- SPELL_WARRIOR_CHARGE_SLOW_EFFECT = 236027,
- SPELL_WARRIOR_COLOSSUS_SMASH = 167105,
- SPELL_WARRIOR_COLOSSUS_SMASH_AURA = 208086,
- SPELL_WARRIOR_CRITICAL_THINKING_ENERGIZE = 392776,
- SPELL_WARRIOR_EXECUTE = 20647,
- SPELL_WARRIOR_FUELED_BY_VIOLENCE_HEAL = 383104,
- SPELL_WARRIOR_GLYPH_OF_THE_BLAZING_TRAIL = 123779,
- SPELL_WARRIOR_GLYPH_OF_HEROIC_LEAP = 159708,
- SPELL_WARRIOR_GLYPH_OF_HEROIC_LEAP_BUFF = 133278,
- SPELL_WARRIOR_HEROIC_LEAP_JUMP = 178368,
- SPELL_WARRIOR_IGNORE_PAIN = 190456,
- SPELL_WARRIOR_IN_FOR_THE_KILL = 248621,
- SPELL_WARRIOR_IN_FOR_THE_KILL_HASTE = 248622,
- SPELL_WARRIOR_IMPENDING_VICTORY = 202168,
- SPELL_WARRIOR_IMPENDING_VICTORY_HEAL = 202166,
- SPELL_WARRIOR_IMPROVED_HEROIC_LEAP = 157449,
- SPELL_WARRIOR_MORTAL_STRIKE = 12294,
- SPELL_WARRIOR_MORTAL_WOUNDS = 213667,
- SPELL_WARRIOR_RALLYING_CRY = 97463,
- SPELL_WARRIOR_SHIELD_BLOCK_AURA = 132404,
- SPELL_WARRIOR_SHIELD_CHARGE_EFFECT = 385953,
- SPELL_WARRIOR_SHIELD_SLAM = 23922,
- SPELL_WARRIOR_SHIELD_SLAM_MARKER = 224324,
- SPELL_WARRIOR_SHOCKWAVE = 46968,
- SPELL_WARRIOR_SHOCKWAVE_STUN = 132168,
- SPELL_WARRIOR_STOICISM = 70845,
- SPELL_WARRIOR_STORM_BOLT_STUN = 132169,
- SPELL_WARRIOR_STRATEGIST = 384041,
- SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1 = 12723,
- SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2 = 26654,
- SPELL_WARRIOR_TAUNT = 355,
- SPELL_WARRIOR_TRAUMA_EFFECT = 215537,
- SPELL_WARRIOR_VICTORIOUS = 32216,
- SPELL_WARRIOR_VICTORY_RUSH_HEAL = 118779,
-};
-
-enum WarriorMisc
-{
- SPELL_VISUAL_BLAZING_CHARGE = 26423
-};
-
-// 23881 - Bloodthirst
-class spell_warr_bloodthirst : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_BLOODTHIRST_HEAL });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_WARRIOR_BLOODTHIRST_HEAL, true);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_warr_bloodthirst::HandleDummy, EFFECT_3, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 384036 - Brutal Vitality
-class spell_warr_brutal_vitality : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_IGNORE_PAIN });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- _damageAmount += CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount());
- }
-
- void HandleDummyTick(AuraEffect const* /*aurEff*/)
- {
- if (_damageAmount == 0)
- return;
-
- if (AuraEffect* ignorePainAura = GetTarget()->GetAuraEffect(SPELL_WARRIOR_IGNORE_PAIN, EFFECT_0))
- ignorePainAura->ChangeAmount(ignorePainAura->GetAmount() + _damageAmount);
-
- _damageAmount = 0;
- }
-
- void Register() override
- {
- AfterEffectProc += AuraEffectProcFn(spell_warr_brutal_vitality::HandleProc, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warr_brutal_vitality::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-
-private:
- uint32 _damageAmount = 0;
-};
-
-// 100 - Charge
-class spell_warr_charge : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARRIOR_CHARGE_EFFECT,
- SPELL_WARRIOR_CHARGE_EFFECT_BLAZING_TRAIL
- });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- uint32 spellId = SPELL_WARRIOR_CHARGE_EFFECT;
- if (GetCaster()->HasAura(SPELL_WARRIOR_GLYPH_OF_THE_BLAZING_TRAIL))
- spellId = SPELL_WARRIOR_CHARGE_EFFECT_BLAZING_TRAIL;
-
- GetCaster()->CastSpell(GetHitUnit(), spellId, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warr_charge::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 126661 - Warrior Charge Drop Fire Periodic
-class spell_warr_charge_drop_fire_periodic : public AuraScript
-{
- void DropFireVisual(AuraEffect const* aurEff)
- {
- PreventDefaultAction();
- if (GetTarget()->IsSplineEnabled())
- {
- for (uint32 i = 0; i < 5; ++i)
- {
- int32 timeOffset = 6 * i * aurEff->GetPeriod() / 25;
- Movement::Location loc = GetTarget()->movespline->ComputePosition(timeOffset);
- GetTarget()->SendPlaySpellVisual(Position(loc.x, loc.y, loc.z), SPELL_VISUAL_BLAZING_CHARGE, 0, 0, 1.f, true);
- }
- }
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warr_charge_drop_fire_periodic::DropFireVisual, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- }
-};
-
-// 198337 - Charge Effect (dropping Blazing Trail)
-// 218104 - Charge Effect
-class spell_warr_charge_effect : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARRIOR_CHARGE_PAUSE_RAGE_DECAY,
- SPELL_WARRIOR_CHARGE_ROOT_EFFECT,
- SPELL_WARRIOR_CHARGE_SLOW_EFFECT
- });
- }
-
- void HandleCharge(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
- caster->CastSpell(caster, SPELL_WARRIOR_CHARGE_PAUSE_RAGE_DECAY, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, 0));
- caster->CastSpell(target, SPELL_WARRIOR_CHARGE_ROOT_EFFECT, true);
- caster->CastSpell(target, SPELL_WARRIOR_CHARGE_SLOW_EFFECT, true);
- }
-
- void Register() override
- {
- OnEffectLaunchTarget += SpellEffectFn(spell_warr_charge_effect::HandleCharge, EFFECT_0, SPELL_EFFECT_CHARGE);
- }
-};
-
-// 167105 - Colossus Smash
-// 262161 - Warbreaker
-class spell_warr_colossus_smash : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_COLOSSUS_SMASH_AURA, SPELL_WARRIOR_IN_FOR_THE_KILL, SPELL_WARRIOR_IN_FOR_THE_KILL_HASTE })
- && ValidateSpellEffect({ { SPELL_WARRIOR_IN_FOR_THE_KILL, EFFECT_2 } });
- }
-
- void HandleHit()
- {
- Unit* target = GetHitUnit();
- Unit* caster = GetCaster();
-
- GetCaster()->CastSpell(GetHitUnit(), SPELL_WARRIOR_COLOSSUS_SMASH_AURA, true);
-
- if (caster->HasAura(SPELL_WARRIOR_IN_FOR_THE_KILL))
- {
- if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_IN_FOR_THE_KILL, DIFFICULTY_NONE))
- {
- if (target->HealthBelowPct(spellInfo->GetEffect(EFFECT_2).CalcValue(caster)))
- _bonusHaste = true;
- }
- }
- }
-
- void HandleAfterCast()
- {
- Unit* caster = GetCaster();
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_WARRIOR_IN_FOR_THE_KILL, DIFFICULTY_NONE);
- if (!spellInfo)
- return;
-
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellBP0(spellInfo->GetEffect(EFFECT_0).CalcValue(caster));
- if (_bonusHaste)
- args.AddSpellBP0(spellInfo->GetEffect(EFFECT_1).CalcValue(caster));
- caster->CastSpell(caster, SPELL_WARRIOR_IN_FOR_THE_KILL_HASTE, args);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_warr_colossus_smash::HandleHit);
- AfterCast += SpellCastFn(spell_warr_colossus_smash::HandleAfterCast);
- }
-
-private:
- bool _bonusHaste = false;
-};
-
-// 389306 - Critical Thinking
-class spell_warr_critical_thinking : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_CRITICAL_THINKING_ENERGIZE });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- if (Optional<int32> rageCost = eventInfo.GetProcSpell()->GetPowerTypeCostAmount(POWER_RAGE))
- GetTarget()->CastSpell(nullptr, SPELL_WARRIOR_CRITICAL_THINKING_ENERGIZE, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .AddSpellBP0(CalculatePct(*rageCost, aurEff->GetAmount())));
- }
-
- void Register() override
- {
- AfterEffectProc += AuraEffectProcFn(spell_warr_critical_thinking::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- }
-};
-
-// 236279 - Devastator
-class spell_warr_devastator : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }) && ValidateSpellInfo({ SPELL_WARRIOR_SHIELD_SLAM, SPELL_WARRIOR_SHIELD_SLAM_MARKER });
- }
-
- void OnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
- {
- if (GetTarget()->GetSpellHistory()->HasCooldown(SPELL_WARRIOR_SHIELD_SLAM))
- {
- if (roll_chance_i(GetEffectInfo(EFFECT_1).CalcValue()))
- {
- GetTarget()->GetSpellHistory()->ResetCooldown(SPELL_WARRIOR_SHIELD_SLAM, true);
- GetTarget()->CastSpell(GetTarget(), SPELL_WARRIOR_SHIELD_SLAM_MARKER, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
- }
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_warr_devastator::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 383103 - Fueled by Violence
-class spell_warr_fueled_by_violence : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_FUELED_BY_VIOLENCE_HEAL });
- }
-
- void HandleProc(ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- _nextHealAmount += CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), GetEffectInfo(EFFECT_0).CalcValue(GetTarget()));
- }
-
- void HandlePeriodic(AuraEffect const* /*aurEff*/)
- {
- if (_nextHealAmount == 0)
- return;
-
- Unit* target = GetTarget();
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellBP0(_nextHealAmount);
-
- target->CastSpell(target, SPELL_WARRIOR_FUELED_BY_VIOLENCE_HEAL, args);
- _nextHealAmount = 0;
- }
-
- void Register() override
- {
- OnProc += AuraProcFn(spell_warr_fueled_by_violence::HandleProc);
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_warr_fueled_by_violence::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-
-private:
- uint32 _nextHealAmount = 0;
-};
-
-// 6544 - Heroic leap
-class spell_warr_heroic_leap : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_HEROIC_LEAP_JUMP });
- }
-
- SpellCastResult CheckElevation()
- {
- if (WorldLocation const* dest = GetExplTargetDest())
- {
- if (GetCaster()->HasUnitMovementFlag(MOVEMENTFLAG_ROOT))
- return SPELL_FAILED_ROOTED;
-
- if (GetCaster()->GetMap()->Instanceable())
- {
- float range = GetSpellInfo()->GetMaxRange(true, GetCaster()) * 1.5f;
-
- PathGenerator generatedPath(GetCaster());
- generatedPath.SetPathLengthLimit(range);
-
- bool result = generatedPath.CalculatePath(dest->GetPositionX(), dest->GetPositionY(), dest->GetPositionZ(), false);
- if (generatedPath.GetPathType() & PATHFIND_SHORT)
- return SPELL_FAILED_OUT_OF_RANGE;
- else if (!result || generatedPath.GetPathType() & PATHFIND_NOPATH)
- return SPELL_FAILED_NOPATH;
- }
- else if (dest->GetPositionZ() > GetCaster()->GetPositionZ() + 4.0f)
- return SPELL_FAILED_NOPATH;
-
- return SPELL_CAST_OK;
- }
-
- return SPELL_FAILED_NO_VALID_TARGETS;
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- if (WorldLocation* dest = GetHitDest())
- GetCaster()->CastSpell(*dest, SPELL_WARRIOR_HEROIC_LEAP_JUMP, true);
- }
-
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_warr_heroic_leap::CheckElevation);
- OnEffectHit += SpellEffectFn(spell_warr_heroic_leap::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// Heroic Leap (triggered by Heroic Leap (6544)) - 178368
-class spell_warr_heroic_leap_jump : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_WARRIOR_GLYPH_OF_HEROIC_LEAP,
- SPELL_WARRIOR_GLYPH_OF_HEROIC_LEAP_BUFF,
- SPELL_WARRIOR_IMPROVED_HEROIC_LEAP,
- SPELL_WARRIOR_TAUNT
- });
- }
-
- void AfterJump(SpellEffIndex /*effIndex*/)
- {
- if (GetCaster()->HasAura(SPELL_WARRIOR_GLYPH_OF_HEROIC_LEAP))
- GetCaster()->CastSpell(GetCaster(), SPELL_WARRIOR_GLYPH_OF_HEROIC_LEAP_BUFF, true);
- if (GetCaster()->HasAura(SPELL_WARRIOR_IMPROVED_HEROIC_LEAP))
- GetCaster()->GetSpellHistory()->ResetCooldown(SPELL_WARRIOR_TAUNT, true);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_warr_heroic_leap_jump::AfterJump, EFFECT_1, SPELL_EFFECT_JUMP_DEST);
- }
-};
-
-// 202168 - Impending Victory
-class spell_warr_impending_victory : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_IMPENDING_VICTORY_HEAL });
- }
-
- void HandleAfterCast()
- {
- Unit* caster = GetCaster();
- caster->CastSpell(caster, SPELL_WARRIOR_IMPENDING_VICTORY_HEAL, true);
- caster->RemoveAurasDueToSpell(SPELL_WARRIOR_VICTORIOUS);
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_warr_impending_victory::HandleAfterCast);
- }
-};
-
-// 5246 - Intimidating Shout
-class spell_warr_intimidating_shout : public SpellScript
-{
- void FilterTargets(std::list<WorldObject*>& unitList)
- {
- unitList.remove(GetExplTargetWorldObject());
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
- }
-};
-
-// 70844 - Item - Warrior T10 Protection 4P Bonus
-class spell_warr_item_t10_prot_4p_bonus : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_STOICISM })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
- }
-
- void HandleProc(ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
-
- Unit* target = eventInfo.GetActionTarget();
- int32 bp0 = CalculatePct(target->GetMaxHealth(), GetEffectInfo(EFFECT_1).CalcValue());
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellBP0(bp0);
- target->CastSpell(nullptr, SPELL_WARRIOR_STOICISM, args);
- }
-
- void Register() override
- {
- OnProc += AuraProcFn(spell_warr_item_t10_prot_4p_bonus::HandleProc);
- }
-};
-
-// 12294 - Mortal Strike 7.1.5
-class spell_warr_mortal_strike : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_MORTAL_WOUNDS });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- GetCaster()->CastSpell(target, SPELL_WARRIOR_MORTAL_WOUNDS, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warr_mortal_strike::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 97462 - Rallying Cry
-class spell_warr_rallying_cry : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_RALLYING_CRY });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, int32(GetHitUnit()->CountPctFromMaxHealth(GetEffectValue())));
-
- GetCaster()->CastSpell(GetHitUnit(), SPELL_WARRIOR_RALLYING_CRY, args);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warr_rallying_cry::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 2565 - Shield Block
-class spell_warr_shield_block : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_SHIELD_BLOCK_AURA });
- }
-
- void HandleHitTarget(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(nullptr, SPELL_WARRIOR_SHIELD_BLOCK_AURA, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warr_shield_block::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 385952 - Shield Charge
-class spell_warr_shield_charge : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_SHIELD_CHARGE_EFFECT });
- }
-
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_WARRIOR_SHIELD_CHARGE_EFFECT, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warr_shield_charge::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 46968 - Shockwave
-class spell_warr_shockwave : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return !ValidateSpellInfo({ SPELL_WARRIOR_SHOCKWAVE, SPELL_WARRIOR_SHOCKWAVE_STUN })
- && ValidateSpellEffect({ { spellInfo->Id, EFFECT_3 } });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void HandleStun(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_WARRIOR_SHOCKWAVE_STUN, true);
- ++_targetCount;
- }
-
- // Cooldown reduced by 20 sec if it strikes at least 3 targets.
- void HandleAfterCast()
- {
- if (_targetCount >= uint32(GetEffectInfo(EFFECT_0).CalcValue()))
- GetCaster()->ToPlayer()->GetSpellHistory()->ModifyCooldown(GetSpellInfo()->Id, Seconds(-GetEffectInfo(EFFECT_3).CalcValue()));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warr_shockwave::HandleStun, EFFECT_0, SPELL_EFFECT_DUMMY);
- AfterCast += SpellCastFn(spell_warr_shockwave::HandleAfterCast);
- }
-
- uint32 _targetCount = 0;
-};
-
-// 107570 - Storm Bolt
-class spell_warr_storm_bolt : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARRIOR_STORM_BOLT_STUN
- });
- }
-
- void HandleOnHit(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_WARRIOR_STORM_BOLT_STUN, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_warr_storm_bolt::HandleOnHit, EFFECT_1, SPELL_EFFECT_DUMMY);
- }
-};
-
-// 384041 - Strategist
-class spell_warr_strategist : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_SHIELD_SLAM, SPELL_WARRIOR_SHIELD_SLAM_MARKER })
- && ValidateSpellEffect({ { SPELL_WARRIOR_STRATEGIST, EFFECT_0 } });
- }
-
- static bool CheckProc(AuraEffect const* aurEff, ProcEventInfo const& /*procEvent*/)
- {
- return roll_chance_i(aurEff->GetAmount());
- }
-
- void HandleCooldown(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*procEvent*/) const
- {
- Unit* caster = GetTarget();
- caster->GetSpellHistory()->ResetCooldown(SPELL_WARRIOR_SHIELD_SLAM, true);
- caster->CastSpell(caster, SPELL_WARRIOR_SHIELD_SLAM_MARKER, TRIGGERED_IGNORE_CAST_IN_PROGRESS);
- }
-
- void Register() override
- {
- DoCheckEffectProc += AuraCheckEffectProcFn(spell_warr_strategist::CheckProc, EFFECT_0, SPELL_AURA_DUMMY);
- OnEffectProc += AuraEffectProcFn(spell_warr_strategist::HandleCooldown, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 52437 - Sudden Death
-class spell_warr_sudden_death : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_COLOSSUS_SMASH });
- }
-
- void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- // Remove cooldown on Colossus Smash
- if (Player* player = GetTarget()->ToPlayer())
- player->GetSpellHistory()->ResetCooldown(SPELL_WARRIOR_COLOSSUS_SMASH, true);
- }
-
- void Register() override
- {
- AfterEffectApply += AuraEffectRemoveFn(spell_warr_sudden_death::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); // correct?
- }
-};
-
-// 12328, 18765, 35429 - Sweeping Strikes
-class spell_warr_sweeping_strikes : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2 });
- }
-
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
- return _procTarget != nullptr;
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
- {
- SpellInfo const* spellInfo = damageInfo->GetSpellInfo();
- if (spellInfo && (spellInfo->Id == SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND || (spellInfo->Id == SPELL_WARRIOR_EXECUTE && !_procTarget->HasAuraState(AURA_STATE_WOUNDED_20_PERCENT))))
- {
- // If triggered by Execute (while target is not under 20% hp) or Bladestorm deals normalized weapon damage
- GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2, aurEff);
- }
- else
- {
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, damageInfo->GetDamage());
- GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1, args);
- }
- }
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-
- Unit* _procTarget = nullptr;
-};
-
-// 215538 - Trauma
-class spell_warr_trauma : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_TRAUMA_EFFECT });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
- {
- Unit* target = eventInfo.GetActionTarget();
- //Get 25% of damage from the spell casted (Slam & Whirlwind) plus Remaining Damage from Aura
- int32 damage = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()) / sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_TRAUMA_EFFECT, GetCastDifficulty())->GetMaxTicks());
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, damage);
- GetCaster()->CastSpell(target, SPELL_WARRIOR_TRAUMA_EFFECT, args);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_warr_trauma::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
-};
-
-// 28845 - Cheat Death
-class spell_warr_t3_prot_8p_bonus : public AuraScript
-{
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (eventInfo.GetActionTarget()->HealthBelowPct(20))
- return true;
-
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (damageInfo && damageInfo->GetDamage())
- if (GetTarget()->HealthBelowPctDamaged(20, damageInfo->GetDamage()))
- return true;
-
- return false;
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_warr_t3_prot_8p_bonus::CheckProc);
- }
-};
-
-// 32215 - Victorious State
-class spell_warr_victorious_state : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_WARRIOR_IMPENDING_VICTORY });
- }
-
- void HandleOnProc(AuraEffect* /*aurEff*/, ProcEventInfo& procInfo)
- {
- if (procInfo.GetActor()->GetTypeId() == TYPEID_PLAYER && procInfo.GetActor()->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::WarriorFury)
- PreventDefaultAction();
-
- procInfo.GetActor()->GetSpellHistory()->ResetCooldown(SPELL_WARRIOR_IMPENDING_VICTORY, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_warr_victorious_state::HandleOnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
-};
-
-// 34428 - Victory Rush
-class spell_warr_victory_rush : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_WARRIOR_VICTORIOUS,
- SPELL_WARRIOR_VICTORY_RUSH_HEAL
- });
- }
-
- void HandleHeal()
- {
- Unit* caster = GetCaster();
- caster->CastSpell(caster, SPELL_WARRIOR_VICTORY_RUSH_HEAL, true);
- caster->RemoveAurasDueToSpell(SPELL_WARRIOR_VICTORIOUS);
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_warr_victory_rush::HandleHeal);
- }
-};
void AddSC_warrior_spell_scripts()
{
- RegisterSpellScript(spell_warr_bloodthirst);
- RegisterSpellScript(spell_warr_brutal_vitality);
- RegisterSpellScript(spell_warr_charge);
- RegisterSpellScript(spell_warr_charge_drop_fire_periodic);
- RegisterSpellScript(spell_warr_charge_effect);
- RegisterSpellScript(spell_warr_colossus_smash);
- RegisterSpellScript(spell_warr_critical_thinking);
- RegisterSpellScript(spell_warr_devastator);
- RegisterSpellScript(spell_warr_fueled_by_violence);
- RegisterSpellScript(spell_warr_heroic_leap);
- RegisterSpellScript(spell_warr_heroic_leap_jump);
- RegisterSpellScript(spell_warr_impending_victory);
- RegisterSpellScript(spell_warr_intimidating_shout);
- RegisterSpellScript(spell_warr_item_t10_prot_4p_bonus);
- RegisterSpellScript(spell_warr_mortal_strike);
- RegisterSpellScript(spell_warr_rallying_cry);
- RegisterSpellScript(spell_warr_shield_block);
- RegisterSpellScript(spell_warr_shield_charge);
- RegisterSpellScript(spell_warr_shockwave);
- RegisterSpellScript(spell_warr_storm_bolt);
- RegisterSpellScript(spell_warr_strategist);
- RegisterSpellScript(spell_warr_sudden_death);
- RegisterSpellScript(spell_warr_sweeping_strikes);
- RegisterSpellScript(spell_warr_trauma);
- RegisterSpellScript(spell_warr_t3_prot_8p_bonus);
- RegisterSpellScript(spell_warr_victorious_state);
- RegisterSpellScript(spell_warr_victory_rush);
}