diff options
author | Lucas Nascimento <keader.android@gmail.com> | 2021-10-25 19:31:58 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-25 19:31:58 -0300 |
commit | 1403de8dafbadb92dfd16c47b63156f9216a2bdd (patch) | |
tree | f423f497baa5ce56b24f6a07672fa8b6b429d709 | |
parent | b0eaa938c9fcbbd5ec16a564b8bc2e2a5570f7de (diff) |
Core/Spells: Fixed Prayer of Mending (#27105)
Closes #3770
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 39 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 7 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 37 |
3 files changed, 77 insertions, 6 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index ed2edd41f62..65fb265c9d9 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -23,6 +23,7 @@ #include "CreatureAI.h" #include "DynamicObject.h" #include "GameObject.h" +#include "Group.h" #include "Player.h" #include "Spell.h" #include "SpellInfo.h" @@ -874,6 +875,44 @@ namespace Trinity bool i_excludeSelf; }; + class MostHPMissingGroupInRange + { + public: + MostHPMissingGroupInRange(Unit const* obj, float range, uint32 hp) : i_obj(obj), i_range(range), i_hp(hp) { } + + bool operator()(Unit* u) + { + if (i_obj == u) + return false; + + Player* player = nullptr; + if (u->GetTypeId() == TYPEID_PLAYER) + player = u->ToPlayer(); + else if (u->IsPet() && u->GetOwner()) + player = u->GetOwner()->ToPlayer(); + + if (!player) + return false; + + Group* group = player->GetGroup(); + if (!group || !group->IsMember(i_obj->IsPet() ? i_obj->GetOwnerGUID() : i_obj->GetGUID())) + return false; + + if (u->IsAlive() && !i_obj->IsHostileTo(u) && i_obj->IsWithinDistInMap(u, i_range) && u->GetMaxHealth() - u->GetHealth() > i_hp) + { + i_hp = u->GetMaxHealth() - u->GetHealth(); + return true; + } + + return false; + } + + private: + Unit const* i_obj; + float i_range; + uint32 i_hp; + }; + class FriendlyCCedInRange { public: diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 3728b3c2b81..470964e0c35 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5762,7 +5762,12 @@ void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurA { float radius = GetSpellEffectInfo().CalcRadius(caster); - if (Unit* triggerTarget = target->GetNextRandomRaidMemberOrPet(radius)) + Unit* triggerTarget = nullptr; + Trinity::MostHPMissingGroupInRange u_check(target, radius, 0); + Trinity::UnitLastSearcher<Trinity::MostHPMissingGroupInRange> searcher(target, triggerTarget, u_check); + Cell::VisitAllObjects(target, searcher, radius); + + if (triggerTarget) { target->CastSpell(triggerTarget, GetId(), args); if (Aura* aura = triggerTarget->GetAura(GetId(), GetCasterGUID())) diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index e6e743c5d8f..ba55c1cbc7a 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -74,6 +74,9 @@ enum PriestSpells SPELL_PRIEST_LIGHTWELL_RENEW_R4 = 28276, SPELL_PRIEST_LIGHTWELL_RENEW_R5 = 48084, SPELL_PRIEST_LIGHTWELL_RENEW_R6 = 48085, + SPELL_PRIEST_TWIN_DISCIPLINE_R1 = 47586, + SPELL_PRIEST_SPIRITUAL_HEALING_R1 = 14898, + SPELL_PRIEST_DIVINE_PROVIDENCE_R1 = 47562 }; enum PriestSpellIcons @@ -953,22 +956,41 @@ class spell_pri_prayer_of_mending_heal : public SpellScript { PrepareSpellScript(spell_pri_prayer_of_mending_heal); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_PRIEST_T9_HEALING_2P, + SPELL_PRIEST_TWIN_DISCIPLINE_R1, + SPELL_PRIEST_SPIRITUAL_HEALING_R1, + SPELL_PRIEST_DIVINE_PROVIDENCE_R1 + }); + } + void HandleHeal(SpellEffIndex /*effIndex*/) { if (Unit* caster = GetOriginalCaster()) { + int32 heal = GetEffectValue(); if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0)) - { - int32 heal = GetHitHeal(); AddPct(heal, aurEff->GetAmount()); - SetHitHeal(heal); - } + + if (AuraEffect* aurEff = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_TWIN_DISCIPLINE_R1, EFFECT_0)) + AddPct(heal, aurEff->GetAmount()); + + if (AuraEffect* aurEff = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_SPIRITUAL_HEALING_R1, EFFECT_0)) + AddPct(heal, aurEff->GetAmount()); + + if (AuraEffect* aurEff = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_DIVINE_PROVIDENCE_R1, EFFECT_0)) + AddPct(heal, aurEff->GetAmount()); + + SetEffectValue(heal); } } void Register() override { - OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + OnEffectLaunchTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); } }; @@ -982,6 +1004,11 @@ class spell_pri_renew : public AuraScript return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_PRIEST_EMPOWERED_RENEW }); + } + void HandleApplyEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { Unit* caster = GetCaster(); |