aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannibalRoG <edreisantafe@gmail.com>2017-03-11 15:55:21 +0100
committerShauren <shauren.trinity@gmail.com>2017-03-11 15:55:21 +0100
commita36f34af3dfa2d6e790b514247766b6cc99de596 (patch)
tree33b4256b1de63383720c0930ea4863122f931c41
parent8434e87478f96f5ef5853a909208ed55ad4b5928 (diff)
Core/Spells: Fix Priest spell Power Word: Shield
Closes #19199
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp188
1 files changed, 75 insertions, 113 deletions
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 023967ceeac..c6b88a3c5d4 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -30,6 +30,7 @@
enum PriestSpells
{
SPELL_PRIEST_ABSOLUTION = 33167,
+ SPELL_PRIEST_BODY_AND_SOUL = 64129,
SPELL_PRIEST_BODY_AND_SOUL_DISPEL = 64136,
SPELL_PRIEST_BODY_AND_SOUL_SPEED = 65081,
SPELL_PRIEST_CURE_DISEASE = 528,
@@ -56,14 +57,22 @@ enum PriestSpells
SPELL_PRIEST_PENANCE_R1_HEAL = 47757,
SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201,
SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
+ SPELL_PRIEST_RENEWED_HOPE = 197469,
+ SPELL_PRIEST_RENEWED_HOPE_EFFECT = 197470,
SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903,
SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904,
SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
+ SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE = 197045,
+ SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE = 47755,
+ SPELL_PRIEST_STRENGTH_OF_SOUL = 197535,
+ SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT = 197548,
SPELL_PRIEST_THE_PENITENT_AURA = 200347,
SPELL_PRIEST_TWIN_DISCIPLINES_RANK_1 = 47586,
SPELL_PRIEST_T9_HEALING_2P = 67201,
SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290,
- SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085
+ SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085,
+ SPELL_PRIEST_VOID_SHIELD = 199144,
+ SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145
};
enum PriestSpellIcons
@@ -867,7 +876,7 @@ class spell_pri_penance : public SpellScriptLoader
{
if (!caster->IsValidAttackTarget(target))
return SPELL_FAILED_BAD_TARGETS;
-
+
if (!caster->isInFront(target))
return SPELL_FAILED_UNIT_NOT_INFRONT;
}
@@ -932,6 +941,70 @@ class spell_pri_phantasm : public SpellScriptLoader
}
};
+// 17 - Power Word: Shield
+class spell_pri_power_word_shield : public SpellScriptLoader
+{
+public:
+ spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { }
+
+ class spell_pri_power_word_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_power_word_shield_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*auraEffect*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+
+ if (Player* player = GetCaster()->ToPlayer())
+ {
+ int32 playerMastery = player->GetRatingBonusValue(CR_MASTERY);
+ int32 playerSpellPower = player->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY);
+ int32 playerVersatileDamage = player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE);
+
+ //Formula taken from SpellWork
+ amount = (int32)((playerSpellPower * 5.5f) + playerMastery) * (1 + playerVersatileDamage);
+ }
+ }
+
+ void OnApply(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);
+ }
+
+ 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
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectApply += AuraEffectApplyFn(spell_pri_power_word_shield_AuraScript::OnApply, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_pri_power_word_shield_AuraScript::HandleOnRemove, EFFECT_0, AuraType::SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const override
+ {
+ return new spell_pri_power_word_shield_AuraScript();
+ }
+};
+
// 33110 - Prayer of Mending Heal
class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
{
@@ -1216,117 +1289,6 @@ class spell_pri_vampiric_touch : public SpellScriptLoader
}
};
-// 17 - Power Word: Shield
-class spell_pri_power_word_shield : public SpellScriptLoader
-{
-public:
- spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { }
-
- enum spell_enum
- {
- SPELL_PRIEST_BODY_AND_SOUL = 64129,
- SPELL_PRIEST_BODY_AND_SOUL_ACTIVE = 65081,
- SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE = 197045,
- SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE = 47755,
- SPELL_PRIEST_STRENGHT_OF_SOUL = 197535,
- SPELL_PRIEST_STRENGHT_OF_SOUL_EFFECT = 197548,
- SPELL_PRIEST_RENEWED_HOPE = 197469,
- SPELL_PRIEST_RENEWED_HOPE_EFFECT = 197470,
- SPELL_PRIEST_VOID_SHIELD = 199144,
- SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145
- };
-
- class spell_pri_power_word_shield_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_pri_power_word_shield_SpellScript);
-
- void HandleAfterCast()
- {
- if (Player* player = GetCaster()->ToPlayer())
- {
- if (player->HasAura(SPELL_PRIEST_BODY_AND_SOUL))
- player->CastSpell(player, SPELL_PRIEST_BODY_AND_SOUL_ACTIVE, true);
- if (player->HasAura(SPELL_PRIEST_VOID_SHIELD) && GetHitUnit()->GetGUID() == player->GetGUID())
- player->CastSpell(player, SPELL_PRIEST_VOID_SHIELD_EFFECT, true);
- if (player->HasAura(SPELL_PRIEST_STRENGHT_OF_SOUL))
- player->CastSpell(player, SPELL_PRIEST_STRENGHT_OF_SOUL_EFFECT, true);
- if (player->HasAura(SPELL_PRIEST_RENEWED_HOPE))
- player->CastSpell(player, SPELL_PRIEST_RENEWED_HOPE_EFFECT, true);
- }
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_pri_power_word_shield_SpellScript::HandleAfterCast);
- }
- };
-
- class spell_pri_power_word_shield_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_pri_power_word_shield_AuraScript);
-
- void CalculateAmount(const AuraEffect* /*auraEffect*/, int32& amount, bool& /*canBeRecalculated*/)
- {
- if (Player* player = GetCaster()->ToPlayer())
- {
- int32 playerMastery = player->GetRatingBonusValue(CombatRating::CR_MASTERY) + 1;
- int32 playerSpellPower = player->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY);
- int32 playerVersatileDamage = player->GetRatingBonusValue(CombatRating::CR_VERSATILITY_DAMAGE_DONE);
-
- amount = (int32)((playerSpellPower * 5.5f) + playerMastery) * (1 + playerVersatileDamage);
- }
- }
-
- void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
- {
- if (Player* player = GetCaster()->ToPlayer())
- {
- if (AuraEffect* powerWordShieldAuraEffect = aurEff->GetBase()->GetEffect(EFFECT_0))
- {
- int32 absorbEstimation = dmgInfo.GetDamage() + absorbAmount;
- int32 maxAmountToAbsorb = powerWordShieldAuraEffect->CalculateAmount(player);
-
- if (absorbEstimation > maxAmountToAbsorb)
- absorbAmount = maxAmountToAbsorb; //Complete the max absorb amount
- else
- absorbAmount += (int32)dmgInfo.GetDamage(); //Increase the amount absorbed
- }
- }
- }
-
- void HandleOnRemove(const AuraEffect* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (Player* player = GetCaster()->ToPlayer())
- {
- int32 effectDuration = aurEff->GetBase()->GetDuration();
-
- if (player->HasAura(SPELL_PRIEST_STRENGHT_OF_SOUL_EFFECT))
- player->RemoveAura(SPELL_PRIEST_STRENGHT_OF_SOUL_EFFECT);
-
- if (effectDuration > 0 && player->HasAura(SPELL_PRIEST_SHIELD_DISCIPLINE_PASSIVE))
- player->CastSpell(player, SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE, true);
- }
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::Absorb, EFFECT_0);
- AfterEffectRemove += AuraEffectRemoveFn(spell_pri_power_word_shield_AuraScript::HandleOnRemove, EFFECT_0, AuraType::SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_pri_power_word_shield_SpellScript();
- }
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_pri_power_word_shield_AuraScript();
- }
-};
-
void AddSC_priest_spell_scripts()
{
new spell_pri_body_and_soul();