diff options
author | Ovahlord <dreadkiller@gmx.de> | 2024-06-06 21:16:06 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-06-06 21:16:06 +0200 |
commit | 04a0d57f2bbacc09440468f6553017ddbed8d25e (patch) | |
tree | 35c5faedadc963b11ab83cc0d35cc5b4a2a99f4c /src | |
parent | 59501586ce6379aff1bbb6f408b4ac86771c2129 (diff) |
Scripts/Spells: wiped all class spell scripts
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 950 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_druid.cpp | 2109 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_hunter.cpp | 808 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 1534 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_paladin.cpp | 1578 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 3231 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_rogue.cpp | 1041 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 1943 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 1036 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warrior.cpp | 822 |
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); } |