diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Pet/pet_priest.cpp | 60 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 187 |
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); |