aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2023_08_10_00_world.sql23
-rw-r--r--src/server/scripts/Pet/pet_priest.cpp27
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp228
3 files changed, 277 insertions, 1 deletions
diff --git a/sql/updates/world/master/2023_08_10_00_world.sql b/sql/updates/world/master/2023_08_10_00_world.sql
new file mode 100644
index 00000000000..bad67175e1a
--- /dev/null
+++ b/sql/updates/world/master/2023_08_10_00_world.sql
@@ -0,0 +1,23 @@
+DELETE FROM `spell_proc` WHERE `SpellId` IN (392988, 405216);
+INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
+(392988,0x00,6,0x10200400,0x00000000,0x00000020,0x00000000,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0,0,0,0), -- Divine Image
+(405216,0x00,6,0x10309EC1,0x00020002,0x00508024,0x00620044,0x0,0x0,0x7,0x4,0x403,0x0,0x0,0,0,0,0); -- Divine Image
+
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_pri_divine_image','spell_pri_divine_image_spell_triggered','spell_pri_divine_image_stack_timer');
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(392988,'spell_pri_divine_image'),
+(405216,'spell_pri_divine_image_spell_triggered'),
+(405963,'spell_pri_divine_image_stack_timer'),
+(409387,'spell_pri_divine_image_stack_timer');
+
+UPDATE `creature_template` SET `unit_flags`=0x2000000,`BaseAttackTime`=2000,`ScriptName`='npc_pet_pri_divine_image' WHERE `entry`=198236;
+
+DELETE FROM `creature_template_addon` WHERE `entry`=198236;
+INSERT INTO `creature_template_addon` (`entry`,`AnimTier`,`SheathState`) VALUES
+(198236,2,0);
+
+DELETE FROM `creature_template_difficulty` WHERE `Entry`=198236 AND `DifficultyID`!=0;
+
+DELETE FROM `creature_template_movement` WHERE `CreatureId`=198236;
+INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES
+(198236, 2, 0, 1, 1, 0, 0, NULL);
diff --git a/src/server/scripts/Pet/pet_priest.cpp b/src/server/scripts/Pet/pet_priest.cpp
index 7dae5899a51..e8304045dbd 100644
--- a/src/server/scripts/Pet/pet_priest.cpp
+++ b/src/server/scripts/Pet/pet_priest.cpp
@@ -24,14 +24,18 @@
#include "Creature.h"
#include "PassiveAI.h"
#include "PetAI.h"
+#include "TemporarySummon.h"
enum PriestSpells
{
SPELL_PRIEST_GLYPH_OF_SHADOWFIEND = 58228,
SPELL_PRIEST_SHADOWFIEND_DEATH = 57989,
- SPELL_PRIEST_LIGHTWELL_CHARGES = 59907
+ SPELL_PRIEST_LIGHTWELL_CHARGES = 59907,
+ SPELL_PRIEST_INVOKE_THE_NAARU = 196687,
+ SPELL_PRIEST_DIVINE_IMAGE_SPELL_CHECK = 405216
};
+// 189820 - Lightwell
struct npc_pet_pri_lightwell : public PassiveAI
{
npc_pet_pri_lightwell(Creature* creature) : PassiveAI(creature)
@@ -50,6 +54,7 @@ struct npc_pet_pri_lightwell : public PassiveAI
}
};
+// 19668 - Shadowfiend
struct npc_pet_pri_shadowfiend : public PetAI
{
npc_pet_pri_shadowfiend(Creature* creature) : PetAI(creature) { }
@@ -65,8 +70,28 @@ struct npc_pet_pri_shadowfiend : public PetAI
}
};
+// 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);
+ }
+};
+
void AddSC_priest_pet_scripts()
{
RegisterCreatureAI(npc_pet_pri_lightwell);
RegisterCreatureAI(npc_pet_pri_shadowfiend);
+ RegisterCreatureAI(npc_pet_pri_divine_image);
}
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 2eb0317f804..7cb20ed60cd 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -36,6 +36,7 @@
#include "SpellMgr.h"
#include "SpellScript.h"
#include "TaskScheduler.h"
+#include "TemporarySummon.h"
enum PriestSpells
{
@@ -50,14 +51,21 @@ enum PriestSpells
SPELL_PRIEST_ATONEMENT_TRIGGERED_TRINITY = 214206,
SPELL_PRIEST_BENEDICTION = 193157,
SPELL_PRIEST_BLESSED_HEALING = 70772,
+ SPELL_PRIEST_BLESSED_LIGHT = 196813,
SPELL_PRIEST_BODY_AND_SOUL = 64129,
SPELL_PRIEST_BODY_AND_SOUL_SPEED = 65081,
+ SPELL_PRIEST_CIRCLE_OF_HEALING = 204883,
SPELL_PRIEST_DARK_REPRIMAND = 400169,
SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_DAMAGE = 373129,
SPELL_PRIEST_DARK_REPRIMAND_CHANNEL_HEALING = 400171,
SPELL_PRIEST_DARK_REPRIMAND_DAMAGE = 373130,
SPELL_PRIEST_DARK_REPRIMAND_HEALING = 400187,
+ SPELL_PRIEST_DAZZLING_LIGHT = 196810,
SPELL_PRIEST_DIVINE_BLESSING = 40440,
+ SPELL_PRIEST_DIVINE_HYMN_HEAL = 64844,
+ SPELL_PRIEST_DIVINE_IMAGE_SUMMON = 392990,
+ SPELL_PRIEST_DIVINE_IMAGE_EMPOWER = 409387,
+ SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK = 405963,
SPELL_PRIEST_DIVINE_SERVICE = 391233,
SPELL_PRIEST_DIVINE_STAR_HOLY = 110744,
SPELL_PRIEST_DIVINE_STAR_SHADOW = 122121,
@@ -68,6 +76,7 @@ enum PriestSpells
SPELL_PRIEST_DIVINE_WRATH = 40441,
SPELL_PRIEST_EMPOWERED_RENEW_HEAL = 391359,
SPELL_PRIEST_FLASH_HEAL = 2061,
+ SPELL_PRIEST_GREATER_HEAL = 289666,
SPELL_PRIEST_FOCUSED_MENDING = 372354,
SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
SPELL_PRIEST_HALO_HOLY = 120517,
@@ -77,17 +86,24 @@ enum PriestSpells
SPELL_PRIEST_HALO_SHADOW_DAMAGE = 390964,
SPELL_PRIEST_HALO_SHADOW_HEAL = 390971,
SPELL_PRIEST_HEAL = 2060,
+ SPELL_PRIEST_HEALING_LIGHT = 196809,
+ SPELL_PRIEST_HOLY_FIRE = 14914,
SPELL_PRIEST_HOLY_MENDING_HEAL = 391156,
+ SPELL_PRIEST_HOLY_NOVA = 132157,
SPELL_PRIEST_HOLY_WORD_CHASTISE = 88625,
+ SPELL_PRIEST_HOLY_WORD_SALVATION = 265202,
SPELL_PRIEST_HOLY_WORD_SANCTIFY = 34861,
SPELL_PRIEST_HOLY_WORD_SERENITY = 2050,
SPELL_PRIEST_HOLY_10_1_CLASS_SET_2P_CHOOSER = 411097,
SPELL_PRIEST_ITEM_EFFICIENCY = 37595,
SPELL_PRIEST_LEAP_OF_FAITH_EFFECT = 92832,
SPELL_PRIEST_LEVITATE_EFFECT = 111759,
+ SPELL_PRIEST_LIGHT_ERUPTION = 196812,
SPELL_PRIEST_MASOCHISM_TALENT = 193063,
SPELL_PRIEST_MASOCHISM_PERIODIC_HEAL = 193065,
SPELL_PRIEST_MASTERY_GRACE = 271534,
+ SPELL_PRIEST_MINDGAMES = 375901,
+ SPELL_PRIEST_MINDGAMES_VENTHYR = 323673,
SPELL_PRIEST_MIND_BOMB_STUN = 226943,
SPELL_PRIEST_ORACULAR_HEAL = 26170,
SPELL_PRIEST_PENANCE = 47540,
@@ -97,6 +113,7 @@ enum PriestSpells
SPELL_PRIEST_PENANCE_HEALING = 47750,
SPELL_PRIEST_POWER_OF_THE_DARK_SIDE = 198069,
SPELL_PRIEST_POWER_OF_THE_DARK_SIDE_TINT = 225795,
+ SPELL_PRIEST_POWER_WORD_LIFE = 373481,
SPELL_PRIEST_POWER_WORD_SHIELD = 17,
SPELL_PRIEST_POWER_WORD_SOLACE_ENERGIZE = 129253,
SPELL_PRIEST_PRAYER_OF_HEALING = 596,
@@ -109,7 +126,9 @@ enum PriestSpells
SPELL_PRIEST_RENEWED_HOPE_EFFECT = 197470,
SPELL_PRIEST_REVEL_IN_PURITY = 373003,
SPELL_PRIEST_SAY_YOUR_PRAYERS = 391186,
+ SPELL_PRIEST_SEARING_LIGHT = 196811,
SPELL_PRIEST_SHADOW_MEND_DAMAGE = 186439,
+ SPELL_PRIEST_SHADOW_WORD_DEATH = 32379,
SPELL_PRIEST_SHADOW_MEND_PERIODIC_DUMMY = 187464,
SPELL_PRIEST_SHADOW_WORD_PAIN = 589,
SPELL_PRIEST_SHIELD_DISCIPLINE_ENERGIZE = 47755,
@@ -119,6 +138,7 @@ enum PriestSpells
SPELL_PRIEST_SPIRIT_OF_REDEMPTION = 27827,
SPELL_PRIEST_STRENGTH_OF_SOUL = 197535,
SPELL_PRIEST_STRENGTH_OF_SOUL_EFFECT = 197548,
+ SPELL_PRIEST_TRANQUIL_LIGHT = 196816,
SPELL_PRIEST_THE_PENITENT_AURA = 200347,
SPELL_PRIEST_TRAIL_OF_LIGHT_HEAL = 234946,
SPELL_PRIEST_TRINITY = 214205,
@@ -126,12 +146,18 @@ enum PriestSpells
SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085,
SPELL_PRIEST_VOID_SHIELD = 199144,
SPELL_PRIEST_VOID_SHIELD_EFFECT = 199145,
+ SPELL_PRIEST_PRAYER_OF_MENDING = 33076,
SPELL_PRIEST_PRAYER_OF_MENDING_AURA = 41635,
SPELL_PRIEST_PRAYER_OF_MENDING_HEAL = 33110,
SPELL_PRIEST_PRAYER_OF_MENDING_JUMP = 155793,
SPELL_PRIEST_WEAKENED_SOUL = 6788
};
+enum PriestPets
+{
+ NPC_PRIEST_DIVINE_IMAGE = 198236
+};
+
enum MiscSpells
{
SPELL_GEN_REPLENISHMENT = 57669
@@ -446,6 +472,205 @@ class spell_pri_divine_hymn : public SpellScript
}
};
+namespace DivineImageHelpers
+{
+Unit* GetSummon(Unit const* owner)
+{
+ for (Unit* summon : owner->m_Controlled)
+ if (summon->GetEntry() == NPC_PRIEST_DIVINE_IMAGE)
+ return summon;
+
+ return nullptr;
+}
+
+Optional<uint32> GetSpellToCast(uint32 spellId)
+{
+ switch (spellId)
+ {
+ case SPELL_PRIEST_RENEW:
+ return SPELL_PRIEST_TRANQUIL_LIGHT;
+ case SPELL_PRIEST_POWER_WORD_SHIELD:
+ case SPELL_PRIEST_POWER_WORD_LIFE:
+ case SPELL_PRIEST_FLASH_HEAL:
+ case SPELL_PRIEST_HEAL:
+ case SPELL_PRIEST_GREATER_HEAL:
+ case SPELL_PRIEST_HOLY_WORD_SERENITY:
+ return SPELL_PRIEST_HEALING_LIGHT;
+ case SPELL_PRIEST_PRAYER_OF_MENDING:
+ case SPELL_PRIEST_PRAYER_OF_MENDING_HEAL:
+ return SPELL_PRIEST_BLESSED_LIGHT;
+ case SPELL_PRIEST_PRAYER_OF_HEALING:
+ case SPELL_PRIEST_CIRCLE_OF_HEALING:
+ case SPELL_PRIEST_HALO_HOLY:
+ case SPELL_PRIEST_DIVINE_STAR_HOLY_HEAL:
+ case SPELL_PRIEST_DIVINE_HYMN_HEAL:
+ case SPELL_PRIEST_HOLY_WORD_SANCTIFY:
+ case SPELL_PRIEST_HOLY_WORD_SALVATION:
+ return SPELL_PRIEST_DAZZLING_LIGHT;
+ case SPELL_PRIEST_SHADOW_WORD_PAIN:
+ case SPELL_PRIEST_SMITE:
+ case SPELL_PRIEST_HOLY_FIRE:
+ case SPELL_PRIEST_SHADOW_WORD_DEATH:
+ case SPELL_PRIEST_HOLY_WORD_CHASTISE:
+ case SPELL_PRIEST_MINDGAMES:
+ case SPELL_PRIEST_MINDGAMES_VENTHYR:
+ return SPELL_PRIEST_SEARING_LIGHT;
+ case SPELL_PRIEST_HOLY_NOVA:
+ return SPELL_PRIEST_LIGHT_ERUPTION;
+ default:
+ break;
+ }
+
+ return {};
+}
+
+void Trigger(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
+{
+ Unit* target = eventInfo.GetActor();
+ if (!target)
+ return;
+
+ Unit* divineImage = GetSummon(target);
+ if (!divineImage)
+ return;
+
+ Optional<uint32> spellId = GetSpellToCast(eventInfo.GetSpellInfo()->Id);
+ if (!spellId)
+ return;
+
+ divineImage->CastSpell(SpellCastTargets(eventInfo.GetProcSpell()->m_targets), *spellId, aurEff);
+}
+}
+
+// 392988 - Divine Image
+class spell_pri_divine_image : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_PRIEST_DIVINE_IMAGE_SUMMON,
+ SPELL_PRIEST_DIVINE_IMAGE_EMPOWER,
+ SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK
+ });
+ }
+
+ static void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
+ {
+ Unit* target = eventInfo.GetActor();
+ if (!target)
+ return;
+
+ // Note: if target has an active Divine Image, we should empower it rather than summoning a new one.
+ if (Unit* divineImage = DivineImageHelpers::GetSummon(target))
+ {
+ // Note: Divine Image now teleports near the target when they cast a Holy Word spell if the Divine Image is further than 15 yards away (Patch 10.1.0).
+ if (target->GetDistance(divineImage) > 15.0f)
+ divineImage->NearTeleportTo(target->GetRandomNearPosition(3.0f));
+
+ if (TempSummon* tempSummon = divineImage->ToTempSummon())
+ tempSummon->RefreshTimer();
+
+ divineImage->CastSpell(divineImage, SPELL_PRIEST_DIVINE_IMAGE_EMPOWER, eventInfo.GetProcSpell());
+ }
+ else
+ {
+ target->CastSpell(target, SPELL_PRIEST_DIVINE_IMAGE_SUMMON, CastSpellExtraArgs()
+ .SetTriggeringAura(aurEff)
+ .SetTriggeringSpell(eventInfo.GetProcSpell())
+ .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DISALLOW_PROC_EVENTS | TRIGGERED_DONT_REPORT_CAST_ERROR));
+
+ // cause immediate proc
+ DivineImageHelpers::Trigger(aurEff, eventInfo);
+ }
+
+ target->CastSpell(target, SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK, CastSpellExtraArgs()
+ .SetTriggeringAura(aurEff)
+ .SetTriggeringSpell(eventInfo.GetProcSpell())
+ .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DISALLOW_PROC_EVENTS | TRIGGERED_DONT_REPORT_CAST_ERROR));
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pri_divine_image::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+};
+
+// 405216 - Divine Image (Spell Cast Check)
+class spell_pri_divine_image_spell_triggered : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_PRIEST_RENEW,
+ SPELL_PRIEST_POWER_WORD_SHIELD,
+ SPELL_PRIEST_POWER_WORD_LIFE,
+ SPELL_PRIEST_FLASH_HEAL,
+ SPELL_PRIEST_HOLY_WORD_SERENITY,
+ SPELL_PRIEST_PRAYER_OF_MENDING,
+ SPELL_PRIEST_PRAYER_OF_MENDING_HEAL,
+ SPELL_PRIEST_PRAYER_OF_HEALING,
+ SPELL_PRIEST_CIRCLE_OF_HEALING,
+ SPELL_PRIEST_HALO_HOLY,
+ SPELL_PRIEST_DIVINE_STAR_HOLY_HEAL,
+ SPELL_PRIEST_DIVINE_HYMN_HEAL,
+ SPELL_PRIEST_HOLY_WORD_SANCTIFY,
+ SPELL_PRIEST_HOLY_WORD_SALVATION,
+ SPELL_PRIEST_SMITE,
+ SPELL_PRIEST_HOLY_FIRE,
+ SPELL_PRIEST_SHADOW_WORD_DEATH,
+ SPELL_PRIEST_SHADOW_WORD_PAIN,
+ SPELL_PRIEST_MINDGAMES,
+ SPELL_PRIEST_MINDGAMES_VENTHYR,
+ SPELL_PRIEST_HOLY_WORD_CHASTISE,
+ SPELL_PRIEST_HOLY_NOVA,
+ SPELL_PRIEST_TRANQUIL_LIGHT,
+ SPELL_PRIEST_HEALING_LIGHT,
+ SPELL_PRIEST_BLESSED_LIGHT,
+ SPELL_PRIEST_DAZZLING_LIGHT,
+ SPELL_PRIEST_SEARING_LIGHT,
+ SPELL_PRIEST_LIGHT_ERUPTION,
+ SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK
+ });
+ }
+
+ static bool CheckProc(ProcEventInfo const& eventInfo)
+ {
+ return DivineImageHelpers::GetSummon(eventInfo.GetActor()) != nullptr;
+ }
+
+ void HandleAfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ GetTarget()->RemoveAurasDueToSpell(SPELL_PRIEST_DIVINE_IMAGE_EMPOWER_STACK);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_divine_image_spell_triggered::CheckProc);
+ OnEffectProc += AuraEffectProcFn(DivineImageHelpers::Trigger, EFFECT_0, SPELL_AURA_DUMMY);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_pri_divine_image_spell_triggered::HandleAfterRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+};
+
+// 405963 Divine Image
+// 409387 Divine Image
+class spell_pri_divine_image_stack_timer : public AuraScript
+{
+ void TrackStackApplicationTime(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ GetUnitOwner()->m_Events.AddEventAtOffset([spelId = GetId(), owner = GetUnitOwner()]
+ {
+ owner->RemoveAuraFromStack(spelId);
+ }, Milliseconds(GetMaxDuration()));
+ }
+
+ void Register() override
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_pri_divine_image_stack_timer::TrackStackApplicationTime, EFFECT_0, SPELL_AURA_ANY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ }
+};
+
// 122121 - Divine Star (Shadow)
class spell_pri_divine_star_shadow : public SpellScript
{
@@ -2038,6 +2263,9 @@ void AddSC_priest_spell_scripts()
RegisterSpellScript(spell_pri_atonement_triggered);
RegisterSpellScript(spell_pri_circle_of_healing);
RegisterSpellScript(spell_pri_divine_hymn);
+ RegisterSpellScript(spell_pri_divine_image);
+ RegisterSpellScript(spell_pri_divine_image_spell_triggered);
+ RegisterSpellScript(spell_pri_divine_image_stack_timer);
RegisterSpellScript(spell_pri_divine_star_shadow);
RegisterAreaTriggerAI(areatrigger_pri_divine_star);
RegisterSpellScript(spell_pri_empowered_renew);