From 8ac01da46399b86fb75f86245401a805d7acfd8d Mon Sep 17 00:00:00 2001 From: acidmanifesto Date: Thu, 4 Nov 2021 13:24:24 -0400 Subject: [PATCH] fix(Spell/Core): Prayer of Mending Heal not smart Healing [TC Cherry Pick] (#8753) Co-authored by @Keader --- .../game/Grids/Notifiers/GridNotifiers.h | 50 +++++++++++++++++++ .../game/Spells/Auras/SpellAuraEffects.cpp | 7 ++- src/server/scripts/Spells/spell_priest.cpp | 41 +++++++++++++-- 3 files changed, 93 insertions(+), 5 deletions(-) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index ebb584d90..96ff66059 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -22,6 +22,7 @@ #include "CreatureAI.h" #include "DynamicObject.h" #include "GameObject.h" +#include "Group.h" #include "Object.h" #include "ObjectGridLoader.h" #include "Optional.h" @@ -1351,6 +1352,55 @@ namespace Acore float m_fRange; }; + 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 AllDeadCreaturesInRange { public: diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 48c8d3100..3133aea22 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6914,7 +6914,12 @@ void AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(AuraApplication* aurA { float radius = GetSpellInfo()->Effects[GetEffIndex()].CalcRadius(caster); - if (Unit* triggerTarget = target->GetNextRandomRaidMemberOrPet(radius)) + Unit* triggerTarget = nullptr; + Acore::MostHPMissingGroupInRange u_check(target, radius, 0); + Acore::UnitLastSearcher searcher(target, triggerTarget, u_check); + Cell::VisitAllObjects(target, searcher, radius); + + if (triggerTarget) { target->CastCustomSpell(triggerTarget, GetId(), &value, nullptr, nullptr, true, nullptr, this, GetCasterGUID()); 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 e7091cc6b..3ee1e1cb7 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -47,7 +47,10 @@ enum PriestSpells SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085, SPELL_GENERIC_ARENA_DAMPENING = 74410, - SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411 + SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411, + SPELL_PRIEST_TWIN_DISCIPLINE_R1 = 47586, + SPELL_PRIEST_SPIRITUAL_HEALING_R1 = 14898, + SPELL_PRIEST_DIVINE_PROVIDENCE_R1 = 47562 }; enum PriestSpellIcons @@ -832,22 +835,47 @@ public: { PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript); + 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_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); + OnEffectLaunchTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); } }; @@ -872,6 +900,11 @@ public: 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*/) { if (Unit* caster = GetCaster())