Scripts/Spells: Implement Divine Image (#29034)

Co-authored-by: Shauren <shauren.trinity@gmail.com>
This commit is contained in:
Teleqraph
2023-08-10 11:00:06 +02:00
committed by GitHub
parent 0d8221d558
commit 6e42596374
3 changed files with 277 additions and 1 deletions

View File

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

View File

@@ -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);
}

View File

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