fix(Spell/Core): Prayer of Mending Heal not smart Healing [TC Cherry Pick] (#8753)

Co-authored by @Keader
This commit is contained in:
acidmanifesto
2021-11-04 13:24:24 -04:00
committed by GitHub
parent 98f28456bb
commit 8ac01da463
3 changed files with 93 additions and 5 deletions

View File

@@ -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:

View File

@@ -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<Acore::MostHPMissingGroupInRange> 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()))

View File

@@ -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())