aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoG_Hannibal <edreisantafe@gmail.com>2017-02-12 21:46:00 -0500
committertkrokli <tkrokli@users.noreply.github.com>2017-02-13 03:46:00 +0100
commitd2dba9a5e0f94ba0891087bebbba87d2b756677b (patch)
tree2ba639288bf958a6577820ee56544beb6b62504d /src
parentb98132bded1cfd80e827f236302558d719f4edc5 (diff)
Core/Spells: fix Priest spell Penance and Power Word: Shield (#19033)
- fix talent "The Penitent" for the spell Penance - re-write Power Word: Shield Closes #18520
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp211
1 files changed, 131 insertions, 80 deletions
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 0e0e8858fa5..023967ceeac 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -59,6 +59,7 @@ enum PriestSpells
SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903,
SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904,
SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
+ 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,
@@ -386,6 +387,7 @@ class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader
}
};
+// 24191 - Improved Power Word Shield
class spell_pri_improved_power_word_shield : public SpellScriptLoader
{
public:
@@ -842,17 +844,17 @@ class spell_pri_penance : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
- if (Unit* unitTarget = GetHitUnit())
+ if (Unit* target = GetHitUnit())
{
- if (!unitTarget->IsAlive())
+ if (!target->IsAlive())
return;
uint8 rank = GetSpellInfo()->GetRank();
- if (caster->IsFriendlyTo(unitTarget))
- caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank), false);
+ if (caster->IsFriendlyTo(target))
+ caster->CastSpell(target, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_HEAL, rank), false);
else
- caster->CastSpell(unitTarget, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank), false);
+ caster->CastSpell(target, sSpellMgr->GetSpellWithRank(SPELL_PRIEST_PENANCE_R1_DAMAGE, rank), false);
}
}
@@ -860,13 +862,26 @@ class spell_pri_penance : public SpellScriptLoader
{
Player* caster = GetCaster()->ToPlayer();
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
+ {
+ //Support for modifications of this spell in Legion with The Penitent talent (7.1.5)
+ if(!caster->HasAura(SPELL_PRIEST_THE_PENITENT_AURA))
+ return SPELL_FAILED_BAD_TARGETS;
+
+ if (!caster->isInFront(target))
+ return SPELL_FAILED_UNIT_NOT_INFRONT;
+ }
+ }
+
return SPELL_CAST_OK;
}
@@ -917,81 +932,6 @@ 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);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED))
- return false;
- if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1))
- return false;
- return true;
- }
-
- void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
- {
- canBeRecalculated = false;
- if (Unit* caster = GetCaster())
- {
- // +87% from sp bonus
- float bonus = 0.87f;
-
- // Borrowed Time
- if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1))
- bonus += CalculatePct(1.0f, borrowedTime->GetAmount());
-
- bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
-
- // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
- // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
- bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
- bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
-
- amount += int32(bonus);
-
- // Twin Disciplines
- if (AuraEffect const* twinDisciplines = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_TWIN_DISCIPLINES_RANK_1, EFFECT_1))
- AddPct(amount, twinDisciplines->GetAmount());
-
- // Focused Power
- amount *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
- }
- }
-
- void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
- {
- Unit* target = GetTarget();
- if (dmgInfo.GetAttacker() == target)
- return;
-
- if (AuraEffect const* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))
- {
- int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
- target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
- }
- }
-
- void Register() override
- {
- DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0);
- }
- };
-
- 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
{
@@ -1276,6 +1216,117 @@ 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();