diff options
author | RoG_Hannibal <edreisantafe@gmail.com> | 2017-02-12 21:46:00 -0500 |
---|---|---|
committer | tkrokli <tkrokli@users.noreply.github.com> | 2017-02-13 03:46:00 +0100 |
commit | d2dba9a5e0f94ba0891087bebbba87d2b756677b (patch) | |
tree | 2ba639288bf958a6577820ee56544beb6b62504d | |
parent | b98132bded1cfd80e827f236302558d719f4edc5 (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
-rw-r--r-- | sql/updates/world/master/2017_02_13_00_world.sql | 4 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 211 |
2 files changed, 135 insertions, 80 deletions
diff --git a/sql/updates/world/master/2017_02_13_00_world.sql b/sql/updates/world/master/2017_02_13_00_world.sql new file mode 100644 index 00000000000..e821a26c9be --- /dev/null +++ b/sql/updates/world/master/2017_02_13_00_world.sql @@ -0,0 +1,4 @@ +-- Class: Priest, spec: All +-- Spell: Power Word: Shield +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_pri_power_word_shield'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (17, 'spell_pri_power_word_shield'); 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(); |