aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Nascimento <keader.android@gmail.com>2021-10-25 19:31:58 -0300
committerGitHub <noreply@github.com>2021-10-25 19:31:58 -0300
commit1403de8dafbadb92dfd16c47b63156f9216a2bdd (patch)
treef423f497baa5ce56b24f6a07672fa8b6b429d709
parentb0eaa938c9fcbbd5ec16a564b8bc2e2a5570f7de (diff)
Core/Spells: Fixed Prayer of Mending (#27105)
Closes #3770
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h39
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp7
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp37
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();