aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp187
1 files changed, 110 insertions, 77 deletions
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index fb32333a9a5..0677fc396ea 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -85,6 +85,7 @@ enum PriestSpells
SPELL_PRIEST_PRAYER_OF_MENDING_AURA = 41635,
SPELL_PRIEST_PRAYER_OF_MENDING_HEAL = 33110,
SPELL_PRIEST_PRAYER_OF_MENDING_JUMP = 155793,
+ SPELL_PRIEST_WEAKENED_SOUL = 6788
};
enum MiscSpells
@@ -725,100 +726,132 @@ private:
};
// 17 - Power Word: Shield
-class spell_pri_power_word_shield : public SpellScriptLoader
+class spell_pri_power_word_shield : public SpellScript
{
-public:
- spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { }
+ PrepareSpellScript(spell_pri_power_word_shield);
- class spell_pri_power_word_shield_AuraScript : public AuraScript
+ bool Validate(SpellInfo const* /*spellInfo*/) override
{
- PrepareAuraScript(spell_pri_power_word_shield_AuraScript);
+ return ValidateSpellInfo({ SPELL_PRIEST_WEAKENED_SOUL });
+ }
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo
- ({
- SPELL_PRIEST_BODY_AND_SOUL,
- SPELL_PRIEST_BODY_AND_SOUL_SPEED,
- SPELL_PRIEST_STRENGTH_OF_SOUL,
- SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT,
- SPELL_PRIEST_RENEWED_HOPE,
- SPELL_PRIEST_RENEWED_HOPE_EFFECT,
- SPELL_PRIEST_VOID_SHIELD,
- SPELL_PRIEST_VOID_SHIELD_EFFECT,
- SPELL_PRIEST_ATONEMENT,
- SPELL_PRIEST_TRINITY,
- SPELL_PRIEST_ATONEMENT_TRIGGERED,
- SPELL_PRIEST_ATONEMENT_TRIGGERED_TRINITY,
- SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE,
- SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE,
- SPELL_PRIEST_RAPTURE,
- SPELL_PRIEST_MASTERY_GRACE
- });
- }
+ SpellCastResult CheckCast()
+ {
+ Unit* caster = GetCaster();
- void CalculateAmount(AuraEffect const* /*auraEffect*/, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
+ if (Unit* target = GetExplTargetUnit())
+ if (!caster->HasAura(SPELL_PRIEST_RAPTURE))
+ if (target->HasAura(SPELL_PRIEST_WEAKENED_SOUL, caster->GetGUID()))
+ return SPELL_FAILED_BAD_TARGETS;
- if (Unit* caster = GetCaster())
- {
- float amountF = caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()) * 1.65f;
+ return SPELL_CAST_OK;
+ }
- if (Player* player = caster->ToPlayer())
- {
- AddPct(amountF, player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE));
+ void HandleEffectHit()
+ {
+ Unit* caster = GetCaster();
- if (AuraEffect const* mastery = caster->GetAuraEffect(SPELL_PRIEST_MASTERY_GRACE, EFFECT_0))
- if (GetUnitOwner()->HasAura(SPELL_PRIEST_ATONEMENT_TRIGGERED) || GetUnitOwner()->HasAura(SPELL_PRIEST_ATONEMENT_TRIGGERED_TRINITY))
- AddPct(amountF, mastery->GetAmount());
- }
+ if (Unit* target = GetHitUnit())
+ if (!caster->HasAura(SPELL_PRIEST_RAPTURE))
+ caster->CastSpell(target, SPELL_PRIEST_WEAKENED_SOUL, true);
+ }
- if (AuraEffect const* rapture = caster->GetAuraEffect(SPELL_PRIEST_RAPTURE, EFFECT_1))
- AddPct(amountF, rapture->GetAmount());
+ void Register() override
+ {
+ OnCheckCast += SpellCheckCastFn(spell_pri_power_word_shield::CheckCast);
+ AfterHit += SpellHitFn(spell_pri_power_word_shield::HandleEffectHit);
+ }
+};
- amount = amountF;
- }
- }
+class spell_pri_power_word_shield_aura : public AuraScript
+{
+ PrepareAuraScript(spell_pri_power_word_shield_aura);
- void HandleOnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetTarget();
- if (!caster)
- return;
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_PRIEST_BODY_AND_SOUL,
+ SPELL_PRIEST_BODY_AND_SOUL_SPEED,
+ SPELL_PRIEST_STRENGTH_OF_SOUL,
+ SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT,
+ SPELL_PRIEST_RENEWED_HOPE,
+ SPELL_PRIEST_RENEWED_HOPE_EFFECT,
+ SPELL_PRIEST_VOID_SHIELD,
+ SPELL_PRIEST_VOID_SHIELD_EFFECT,
+ SPELL_PRIEST_ATONEMENT,
+ SPELL_PRIEST_TRINITY,
+ SPELL_PRIEST_ATONEMENT_TRIGGERED,
+ SPELL_PRIEST_ATONEMENT_TRIGGERED_TRINITY,
+ SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE,
+ SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE,
+ SPELL_PRIEST_RAPTURE,
+ SPELL_PRIEST_MASTERY_GRACE
+ });
+ }
- if (caster->HasAura(SPELL_PRIEST_BODY_AND_SOUL))
- caster->CastSpell(target, SPELL_PRIEST_BODY_AND_SOUL_SPEED, true);
- if (caster->HasAura(SPELL_PRIEST_STRENGTH_OF_SOUL))
- caster->CastSpell(target, SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT, true);
- if (caster->HasAura(SPELL_PRIEST_RENEWED_HOPE))
- caster->CastSpell(target, SPELL_PRIEST_RENEWED_HOPE_EFFECT, true);
- if (caster->HasAura(SPELL_PRIEST_VOID_SHIELD) && caster == target)
- caster->CastSpell(target, SPELL_PRIEST_VOID_SHIELD_EFFECT, true);
- if (caster->HasAura(SPELL_PRIEST_ATONEMENT))
- caster->CastSpell(target, caster->HasAura(SPELL_PRIEST_TRINITY) ? SPELL_PRIEST_ATONEMENT_TRIGGERED_TRINITY : SPELL_PRIEST_ATONEMENT_TRIGGERED, true);
- }
+ void CalculateAmount(AuraEffect const* /*auraEffect*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
- void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ if (Unit* caster = GetCaster())
{
- GetTarget()->RemoveAura(SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT);
- if (Unit* caster = GetCaster())
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL && caster->HasAura(SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE))
- caster->CastSpell(caster, SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE, true);
- }
+ float amountF = caster->SpellBaseDamageBonusDone(GetSpellInfo()->GetSchoolMask()) * 1.65f;
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- AfterEffectApply += AuraEffectApplyFn(spell_pri_power_word_shield_AuraScript::HandleOnApply, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- AfterEffectRemove += AuraEffectRemoveFn(spell_pri_power_word_shield_AuraScript::HandleOnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
+ if (Player* player = caster->ToPlayer())
+ {
+ AddPct(amountF, player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE));
+
+ if (AuraEffect const* mastery = caster->GetAuraEffect(SPELL_PRIEST_MASTERY_GRACE, EFFECT_0))
+ if (GetUnitOwner()->HasAura(SPELL_PRIEST_ATONEMENT_TRIGGERED) || GetUnitOwner()->HasAura(SPELL_PRIEST_ATONEMENT_TRIGGERED_TRINITY))
+ AddPct(amountF, mastery->GetAmount());
+ }
+
+ if (AuraEffect const* rapture = caster->GetAuraEffect(SPELL_PRIEST_RAPTURE, EFFECT_1))
+ AddPct(amountF, rapture->GetAmount());
+
+ amount = amountF;
}
- };
+ }
- AuraScript* GetAuraScript() const override
+ void HandleOnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* caster = GetCaster();
+ Unit* target = GetTarget();
+
+ if (!caster)
+ return;
+
+ if (caster->HasAura(SPELL_PRIEST_BODY_AND_SOUL))
+ caster->CastSpell(target, SPELL_PRIEST_BODY_AND_SOUL_SPEED, true);
+
+ if (caster->HasAura(SPELL_PRIEST_STRENGTH_OF_SOUL))
+ caster->CastSpell(target, SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT, true);
+
+ if (caster->HasAura(SPELL_PRIEST_RENEWED_HOPE))
+ caster->CastSpell(target, SPELL_PRIEST_RENEWED_HOPE_EFFECT, true);
+
+ if (caster->HasAura(SPELL_PRIEST_VOID_SHIELD) && caster == target)
+ caster->CastSpell(target, SPELL_PRIEST_VOID_SHIELD_EFFECT, true);
+
+ if (caster->HasAura(SPELL_PRIEST_ATONEMENT))
+ caster->CastSpell(target, caster->HasAura(SPELL_PRIEST_TRINITY) ? SPELL_PRIEST_ATONEMENT_TRIGGERED_TRINITY : SPELL_PRIEST_ATONEMENT_TRIGGERED, true);
+ }
+
+ void HandleOnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->RemoveAura(SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT);
+
+ if (Unit* caster = GetCaster())
+ if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL && caster->HasAura(SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE))
+ caster->CastSpell(caster, SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE, true);
+ }
+
+ void Register() override
{
- return new spell_pri_power_word_shield_AuraScript();
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_aura::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ AfterEffectApply += AuraEffectApplyFn(spell_pri_power_word_shield_aura::HandleOnApply, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_pri_power_word_shield_aura::HandleOnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
}
};
@@ -1438,7 +1471,7 @@ void AddSC_priest_spell_scripts()
RegisterSpellScript(spell_pri_mind_bomb);
new spell_pri_penance();
RegisterSpellScript(spell_pri_power_word_radiance);
- new spell_pri_power_word_shield();
+ RegisterSpellAndAuraScriptPair(spell_pri_power_word_shield, spell_pri_power_word_shield_aura);
RegisterSpellScript(spell_pri_prayer_of_mending);
RegisterSpellScript(spell_pri_prayer_of_mending_aura);
RegisterSpellScript(spell_pri_prayer_of_mending_jump);