aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Pet/pet_priest.cpp60
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp187
2 files changed, 198 insertions, 49 deletions
diff --git a/src/server/scripts/Pet/pet_priest.cpp b/src/server/scripts/Pet/pet_priest.cpp
index e8304045dbd..a6c9940527e 100644
--- a/src/server/scripts/Pet/pet_priest.cpp
+++ b/src/server/scripts/Pet/pet_priest.cpp
@@ -28,11 +28,31 @@
enum PriestSpells
{
- SPELL_PRIEST_GLYPH_OF_SHADOWFIEND = 58228,
- SPELL_PRIEST_SHADOWFIEND_DEATH = 57989,
- SPELL_PRIEST_LIGHTWELL_CHARGES = 59907,
+ SPELL_PRIEST_ATONEMENT = 81749,
+ SPELL_PRIEST_ATONEMENT_PASSIVE = 195178,
+ SPELL_PRIEST_DIVINE_IMAGE_SPELL_CHECK = 405216,
SPELL_PRIEST_INVOKE_THE_NAARU = 196687,
- SPELL_PRIEST_DIVINE_IMAGE_SPELL_CHECK = 405216
+ SPELL_PRIEST_LIGHTWELL_CHARGES = 59907
+};
+
+// 198236 - Divine Image
+struct npc_pet_pri_divine_image : public PassiveAI
+{
+ npc_pet_pri_divine_image(Creature* creature) : PassiveAI(creature) { }
+
+ void IsSummonedBy(WorldObject* summoner) override
+ {
+ me->CastSpell(me, SPELL_PRIEST_INVOKE_THE_NAARU);
+
+ if (me->ToTempSummon()->IsGuardian() && summoner->IsUnit())
+ static_cast<Guardian*>(me)->SetBonusDamage(summoner->ToUnit()->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_HOLY));
+ }
+
+ void OnDespawn() override
+ {
+ if (Unit* owner = me->GetOwner())
+ owner->RemoveAura(SPELL_PRIEST_DIVINE_IMAGE_SPELL_CHECK);
+ }
};
// 189820 - Lightwell
@@ -55,9 +75,10 @@ struct npc_pet_pri_lightwell : public PassiveAI
};
// 19668 - Shadowfiend
-struct npc_pet_pri_shadowfiend : public PetAI
+// 62982 - Mindbender
+struct npc_pet_pri_shadowfiend_mindbender : public PetAI
{
- npc_pet_pri_shadowfiend(Creature* creature) : PetAI(creature) { }
+ npc_pet_pri_shadowfiend_mindbender(Creature* creature) : PetAI(creature) { }
void IsSummonedBy(WorldObject* summonerWO) override
{
@@ -65,33 +86,14 @@ struct npc_pet_pri_shadowfiend : public PetAI
if (!summoner)
return;
- if (summoner->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOWFIEND))
- DoCastAOE(SPELL_PRIEST_SHADOWFIEND_DEATH);
- }
-};
-
-// 198236 - Divine Image
-struct npc_pet_pri_divine_image : public PassiveAI
-{
- npc_pet_pri_divine_image(Creature* creature) : PassiveAI(creature) { }
-
- void IsSummonedBy(WorldObject* summoner) override
- {
- me->CastSpell(me, SPELL_PRIEST_INVOKE_THE_NAARU);
- if (me->ToTempSummon()->IsGuardian() && summoner->IsUnit())
- static_cast<Guardian*>(me)->SetBonusDamage(summoner->ToUnit()->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_HOLY));
- }
-
- void OnDespawn() override
- {
- if (Unit* owner = me->GetOwner())
- owner->RemoveAura(SPELL_PRIEST_DIVINE_IMAGE_SPELL_CHECK);
+ if (summoner->HasAura(SPELL_PRIEST_ATONEMENT))
+ DoCastSelf(SPELL_PRIEST_ATONEMENT_PASSIVE, TRIGGERED_FULL_MASK);
}
};
void AddSC_priest_pet_scripts()
{
- RegisterCreatureAI(npc_pet_pri_lightwell);
- RegisterCreatureAI(npc_pet_pri_shadowfiend);
RegisterCreatureAI(npc_pet_pri_divine_image);
+ RegisterCreatureAI(npc_pet_pri_lightwell);
+ RegisterCreatureAI(npc_pet_pri_shadowfiend_mindbender);
}
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index a9255e03caa..e4f807e547d 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -77,6 +77,9 @@ enum PriestSpells
SPELL_PRIEST_EMPOWERED_RENEW_HEAL = 391359,
SPELL_PRIEST_EPIPHANY = 414553,
SPELL_PRIEST_EPIPHANY_HIGHLIGHT = 414556,
+ SPELL_PRIEST_ESSENCE_DEVOURER = 415479,
+ SPELL_PRIEST_ESSENCE_DEVOURER_SHADOWFIEND_HEAL = 415673,
+ SPELL_PRIEST_ESSENCE_DEVOURER_MINDBENDER_HEAL = 415676,
SPELL_PRIEST_FLASH_HEAL = 2061,
SPELL_PRIEST_GREATER_HEAL = 289666,
SPELL_PRIEST_FOCUSED_MENDING = 372354,
@@ -106,6 +109,8 @@ enum PriestSpells
SPELL_PRIEST_MASOCHISM_TALENT = 193063,
SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL = 193065,
SPELL_PRIEST_MASTERY_GRACE = 271534,
+ SPELL_PRIEST_MINDBENDER_DISC = 123040,
+ SPELL_PRIEST_MINDBENDER_SHADOW = 200174,
SPELL_PRIEST_MINDGAMES = 375901,
SPELL_PRIEST_MINDGAMES_VENTHYR = 323673,
SPELL_PRIEST_MIND_BOMB_STUN = 226943,
@@ -115,6 +120,10 @@ enum PriestSpells
SPELL_PRIEST_PENANCE_CHANNEL_HEALING = 47757,
SPELL_PRIEST_PENANCE_DAMAGE = 47666,
SPELL_PRIEST_PENANCE_HEALING = 47750,
+ SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA = 123051,
+ SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY = 200010,
+ SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA = 343727,
+ SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY = 262485,
SPELL_PRIEST_POWER_OF_THE_DARK_SIDE = 198069,
SPELL_PRIEST_POWER_OF_THE_DARK_SIDE_TINT = 225795,
SPELL_PRIEST_POWER_WORD_LIFE = 373481,
@@ -164,7 +173,9 @@ enum PriestSpellVisuals
enum PriestSummons
{
- NPC_PRIEST_DIVINE_IMAGE = 198236
+ NPC_PRIEST_DIVINE_IMAGE = 198236,
+ NPC_PRIEST_MINDBENDER = 62982,
+ NPC_PRIEST_SHADOWFIEND = 19668
};
enum MiscSpells
@@ -343,33 +354,20 @@ class spell_pri_atonement : public AuraScript
&& ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 }, { SPELL_PRIEST_SINS_OF_THE_MANY, EFFECT_2 } });
}
- bool CheckProc(ProcEventInfo& eventInfo)
+ static bool CheckProc(ProcEventInfo const& eventInfo)
{
return eventInfo.GetDamageInfo() != nullptr;
}
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
+ void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
{
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- CastSpellExtraArgs args(aurEff);
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount()));
- _appliedAtonements.erase(std::remove_if(_appliedAtonements.begin(), _appliedAtonements.end(), [this, &args](ObjectGuid const& targetGuid)
- {
- if (Unit* target = ObjectAccessor::GetUnit(*GetTarget(), targetGuid))
- {
- if (target->GetExactDist(GetTarget()) < GetEffectInfo(EFFECT_1).CalcValue())
- GetTarget()->CastSpell(target, SPELL_PRIEST_ATONEMENT_HEAL, args);
-
- return false;
- }
- return true;
- }), _appliedAtonements.end());
+ TriggerAtonementHealOnTargets(aurEff, eventInfo);
}
void Register() override
{
DoCheckProc += AuraCheckProcFn(spell_pri_atonement::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_pri_atonement::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_pri_atonement::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
}
std::vector<ObjectGuid> _appliedAtonements;
@@ -384,12 +382,37 @@ public:
void RemoveAtonementTarget(ObjectGuid const& target)
{
- _appliedAtonements.erase(std::remove(_appliedAtonements.begin(), _appliedAtonements.end(), target), _appliedAtonements.end());
+ std::erase(_appliedAtonements, target);
UpdateSinsOfTheManyValue();
}
- void UpdateSinsOfTheManyValue()
+ void TriggerAtonementHealOnTargets(AuraEffect const* atonementEffect, ProcEventInfo const& eventInfo)
+ {
+ Unit* priest = GetUnitOwner();
+ DamageInfo* damageInfo = eventInfo.GetDamageInfo();
+ CastSpellExtraArgs args(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+
+ // Note: atonementEffect holds the correct amount since we passed the effect in the AuraScript that calls this method.
+ args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(damageInfo->GetDamage(), atonementEffect->GetAmount()));
+
+ float distanceLimit = GetEffectInfo(EFFECT_1).CalcValue();
+
+ std::erase_if(_appliedAtonements, [priest, distanceLimit, &args](ObjectGuid const& targetGuid)
+ {
+ if (Unit* target = ObjectAccessor::GetUnit(*priest, targetGuid))
+ {
+ if (target->IsInDist2d(priest, distanceLimit))
+ priest->CastSpell(target, SPELL_PRIEST_ATONEMENT_HEAL, args);
+
+ return false;
+ }
+
+ return true;
+ });
+ }
+
+ void UpdateSinsOfTheManyValue() const
{
// Note: the damage dimish starts at the 6th application as of 10.0.5.
constexpr std::array<float, 20> damageByStack = { 40.0f, 40.0f, 40.0f, 40.0f, 40.0f, 35.0f, 30.0f, 25.0f, 20.0f, 15.0f, 11.0f, 8.0f, 5.0f, 4.0f, 3.0f, 2.5f, 2.0f, 1.5f, 1.25f, 1.0f };
@@ -400,6 +423,37 @@ public:
}
};
+// 195178 - Atonement (Passive)
+class spell_pri_atonement_passive : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_PRIEST_ATONEMENT, EFFECT_0 } });
+ }
+
+ static bool CheckProc(ProcEventInfo const& eventInfo)
+ {
+ return eventInfo.GetDamageInfo() != nullptr;
+ }
+
+ void HandleOnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
+ {
+ Unit* target = GetTarget();
+ Unit* summoner = target->GetOwner();
+ if (!summoner)
+ return;
+
+ if (AuraEffect const* atonementEffect = summoner->GetAuraEffect(SPELL_PRIEST_ATONEMENT, EFFECT_0))
+ if (spell_pri_atonement* script = atonementEffect->GetBase()->GetScript<spell_pri_atonement>())
+ script->TriggerAtonementHealOnTargets(atonementEffect, eventInfo);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pri_atonement_passive::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+};
+
// 194384, 214206 - Atonement
class spell_pri_atonement_triggered : public AuraScript
{
@@ -918,6 +972,21 @@ class spell_pri_epiphany : public AuraScript
}
};
+// 415673 - Essence Devourer (Heal)
+// 415676 - Essence Devourer (Heal)
+class spell_pri_essence_devourer_heal : public SpellScript
+{
+ static void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ Trinity::SelectRandomInjuredTargets(targets, 1, true);
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_pri_essence_devourer_heal::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY);
+ }
+};
+
// 33110 - Prayer of Mending (Heal)
class spell_pri_focused_mending : public SpellScript
{
@@ -1317,6 +1386,81 @@ class spell_pri_penance_or_dark_reprimand_channeled : public AuraScript
}
};
+// 262484 - Power Leech (Passive for Shadowfiend)
+// 284621 - Power Leech (Passive for Mindbender)
+class spell_pri_power_leech_passive : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY,
+ SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA,
+ SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY,
+ SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA,
+ SPELL_PRIEST_ESSENCE_DEVOURER,
+ SPELL_PRIEST_ESSENCE_DEVOURER_SHADOWFIEND_HEAL,
+ SPELL_PRIEST_ESSENCE_DEVOURER_MINDBENDER_HEAL
+ })
+ && ValidateSpellEffect
+ ({
+ { SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY, EFFECT_0 },
+ { SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA, EFFECT_0 },
+ { SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY, EFFECT_0 },
+ { SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA, EFFECT_0 }
+ });
+ }
+
+ static bool CheckProc(ProcEventInfo const& eventInfo)
+ {
+ return eventInfo.GetDamageInfo() != nullptr;
+ }
+
+ void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) const
+ {
+ Unit* target = GetTarget();
+ Player* summoner = Object::ToPlayer(target->GetOwner());
+ if (!summoner)
+ return;
+
+ SpellInfo const* spellInfo = nullptr;
+ int32 divisor = 1;
+
+ if (summoner->GetPrimarySpecialization() != ChrSpecialization::PriestShadow)
+ {
+ if (target->GetEntry() == NPC_PRIEST_SHADOWFIEND)
+ {
+ // Note: divisor is 100 because effect value is 5 and its supposed to restore 0.5%
+ spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_MANA, GetCastDifficulty());
+ divisor = 10;
+ }
+ else
+ {
+ // Note: divisor is 100 because effect value is 20 and its supposed to restore 0.2%
+ spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_POWER_LEECH_MINDBENDER_MANA, GetCastDifficulty());
+ divisor = 100;
+ }
+ }
+ else
+ spellInfo = sSpellMgr->AssertSpellInfo(target->GetEntry() == NPC_PRIEST_SHADOWFIEND
+ ? SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY
+ : SPELL_PRIEST_POWER_LEECH_MINDBENDER_INSANITY, GetCastDifficulty());
+
+ target->CastSpell(summoner, spellInfo->Id, CastSpellExtraArgs(aurEff)
+ .AddSpellMod(SPELLVALUE_BASE_POINT0, spellInfo->GetEffect(EFFECT_0).CalcValue() / divisor));
+
+ // Note: Essence Devourer talent.
+ if (summoner->HasAura(SPELL_PRIEST_ESSENCE_DEVOURER))
+ summoner->CastSpell(nullptr, target->GetEntry() == NPC_PRIEST_SHADOWFIEND ? SPELL_PRIEST_ESSENCE_DEVOURER_SHADOWFIEND_HEAL : SPELL_PRIEST_ESSENCE_DEVOURER_MINDBENDER_HEAL, aurEff);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_power_leech_passive::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pri_power_leech_passive::HandleOnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+};
+
// 198069 - Power of the Dark Side
class spell_pri_power_of_the_dark_side : public AuraScript
{
@@ -2412,6 +2556,7 @@ void AddSC_priest_spell_scripts()
RegisterSpellScript(spell_pri_answered_prayers);
RegisterSpellScript(spell_pri_aq_3p_bonus);
RegisterSpellScript(spell_pri_atonement);
+ RegisterSpellScript(spell_pri_atonement_passive);
RegisterSpellScript(spell_pri_atonement_triggered);
RegisterSpellScript(spell_pri_benediction);
RegisterSpellScript(spell_pri_circle_of_healing);
@@ -2424,6 +2569,7 @@ void AddSC_priest_spell_scripts()
RegisterAreaTriggerAI(areatrigger_pri_divine_star);
RegisterSpellScript(spell_pri_empowered_renew);
RegisterSpellScript(spell_pri_epiphany);
+ RegisterSpellScript(spell_pri_essence_devourer_heal);
RegisterSpellScript(spell_pri_focused_mending);
RegisterSpellScript(spell_pri_guardian_spirit);
RegisterSpellScript(spell_pri_halo_shadow);
@@ -2437,6 +2583,7 @@ void AddSC_priest_spell_scripts()
RegisterSpellScriptWithArgs(spell_pri_penance, "spell_pri_penance", SPELL_PRIEST_PENANCE_CHANNEL_DAMAGE, SPELL_PRIEST_PENANCE_CHANNEL_HEALING);
RegisterSpellScriptWithArgs(spell_pri_penance, "spell_pri_dark_reprimand", SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_DAMAGE, SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_HEALING);
RegisterSpellScript(spell_pri_penance_or_dark_reprimand_channeled);
+ RegisterSpellScript(spell_pri_power_leech_passive);
RegisterSpellScript(spell_pri_power_of_the_dark_side);
RegisterSpellScript(spell_pri_power_of_the_dark_side_damage_bonus);
RegisterSpellScript(spell_pri_power_of_the_dark_side_healing_bonus);