diff options
-rw-r--r-- | sql/updates/world/master/2024_06_27_00_world.sql | 8 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp | 6 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 70 |
4 files changed, 82 insertions, 4 deletions
diff --git a/sql/updates/world/master/2024_06_27_00_world.sql b/sql/updates/world/master/2024_06_27_00_world.sql new file mode 100644 index 00000000000..3a20188dfe4 --- /dev/null +++ b/sql/updates/world/master/2024_06_27_00_world.sql @@ -0,0 +1,8 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (77616); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(77616,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x7,0x1,0x0,0x0,0x0,0,0,0,0); -- Dark Simulacrum + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_dk_dark_simulacrum','spell_dk_dark_simulacrum_buff'); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(77606,'spell_dk_dark_simulacrum'), +(77616,'spell_dk_dark_simulacrum_buff'); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index babba2adba3..5e123b642df 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -778,7 +778,7 @@ enum SpellAttr9 : uint32 SPELL_ATTR9_NEXT_MODAL_SPELL_REQUIRES_SAME_UNIT_TARGET = 0x00010000, // TITLE Next modal spell requires same unit target DESCRIPTION Prevents automatically casting the spell from SpellClassOptions::ModalNextSpell after current spell if target was changed (client only) SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT = 0x00020000, // TITLE AutoCast Off By Default SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT = 0x00040000, // TITLE Ignore School Lockout - SPELL_ATTR9_UNK19 = 0x00080000, // TITLE Unknown attribute 19@Attr9 + SPELL_ATTR9_ALLOW_DARK_SIMULACRUM = 0x00080000, // TITLE Allow Dark Simulacrum SPELL_ATTR9_UNK20 = 0x00100000, // TITLE Unknown attribute 20@Attr9 SPELL_ATTR9_UNK21 = 0x00200000, // TITLE Unknown attribute 21@Attr9 SPELL_ATTR9_UNK22 = 0x00400000, // TITLE Unknown attribute 22@Attr9 diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp index 0b46ee533fe..e6fb8369fe9 100644 --- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp +++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp @@ -1454,7 +1454,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr9>::ToString(SpellAttr9 value) case SPELL_ATTR9_NEXT_MODAL_SPELL_REQUIRES_SAME_UNIT_TARGET: return { "SPELL_ATTR9_NEXT_MODAL_SPELL_REQUIRES_SAME_UNIT_TARGET", "Next modal spell requires same unit target", "Prevents automatically casting the spell from SpellClassOptions::ModalNextSpell after current spell if target was changed (client only)" }; case SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT: return { "SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT", "AutoCast Off By Default", "" }; case SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT: return { "SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT", "Ignore School Lockout", "" }; - case SPELL_ATTR9_UNK19: return { "SPELL_ATTR9_UNK19", "Unknown attribute 19@Attr9", "" }; + case SPELL_ATTR9_ALLOW_DARK_SIMULACRUM: return { "SPELL_ATTR9_ALLOW_DARK_SIMULACRUM", "Allow Dark Simulacrum", "" }; case SPELL_ATTR9_UNK20: return { "SPELL_ATTR9_UNK20", "Unknown attribute 20@Attr9", "" }; case SPELL_ATTR9_UNK21: return { "SPELL_ATTR9_UNK21", "Unknown attribute 21@Attr9", "" }; case SPELL_ATTR9_UNK22: return { "SPELL_ATTR9_UNK22", "Unknown attribute 22@Attr9", "" }; @@ -1498,7 +1498,7 @@ TC_API_EXPORT SpellAttr9 EnumUtils<SpellAttr9>::FromIndex(size_t index) case 16: return SPELL_ATTR9_NEXT_MODAL_SPELL_REQUIRES_SAME_UNIT_TARGET; case 17: return SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT; case 18: return SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT; - case 19: return SPELL_ATTR9_UNK19; + case 19: return SPELL_ATTR9_ALLOW_DARK_SIMULACRUM; case 20: return SPELL_ATTR9_UNK20; case 21: return SPELL_ATTR9_UNK21; case 22: return SPELL_ATTR9_UNK22; @@ -1539,7 +1539,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr9>::ToIndex(SpellAttr9 value) case SPELL_ATTR9_NEXT_MODAL_SPELL_REQUIRES_SAME_UNIT_TARGET: return 16; case SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT: return 17; case SPELL_ATTR9_IGNORE_SCHOOL_LOCKOUT: return 18; - case SPELL_ATTR9_UNK19: return 19; + case SPELL_ATTR9_ALLOW_DARK_SIMULACRUM: return 19; case SPELL_ATTR9_UNK20: return 20; case SPELL_ATTR9_UNK21: return 21; case SPELL_ATTR9_UNK22: return 22; diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 31a8e5c65cf..0254f2abbdb 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -49,6 +49,8 @@ enum DeathKnightSpells SPELL_DK_BLOOD_SHIELD_MASTERY = 77513, SPELL_DK_BREATH_OF_SINDRAGOSA = 152279, SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999, + SPELL_DK_DARK_SIMULACRUM_BUFF = 77616, + SPELL_DK_DARK_SIMULACRUM_SPELLPOWER_BUFF = 94984, SPELL_DK_DEATH_AND_DECAY_DAMAGE = 52212, SPELL_DK_DEATH_COIL_DAMAGE = 47632, SPELL_DK_DEATH_GRIP_DUMMY = 243912, @@ -324,6 +326,72 @@ class spell_dk_dancing_rune_weapon : public AuraScript } }; +// 77606 - Dark Simulacrum +class spell_dk_dark_simulacrum : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_DARK_SIMULACRUM_BUFF, SPELL_DK_DARK_SIMULACRUM_SPELLPOWER_BUFF }); + } + + bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const + { + Spell const* procSpell = eventInfo.GetProcSpell(); + if (!procSpell) + return false; + + if (!GetTarget()->IsPlayer()) + return procSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR9_ALLOW_DARK_SIMULACRUM); + + if (!procSpell->HasPowerTypeCost(POWER_MANA)) + return false; + + // filter out spells not castable by mind controlled players (teleports, summons, item creations (healthstones)) + if (procSpell->GetSpellInfo()->HasAttribute(SPELL_ATTR1_NO_AUTOCAST_AI)) + return false; + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const + { + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(caster, SPELL_DK_DARK_SIMULACRUM_BUFF, CastSpellExtraArgs() + .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR) + .SetTriggeringSpell(eventInfo.GetProcSpell()) + .AddSpellMod(SPELLVALUE_BASE_POINT0, eventInfo.GetSpellInfo()->Id)); + + caster->CastSpell(caster, SPELL_DK_DARK_SIMULACRUM_SPELLPOWER_BUFF, CastSpellExtraArgs() + .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR) + .SetTriggeringSpell(eventInfo.GetProcSpell()) + .AddSpellMod(SPELLVALUE_BASE_POINT0, GetTarget()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC)) + .AddSpellMod(SPELLVALUE_BASE_POINT1, GetTarget()->SpellBaseHealingBonusDone(SPELL_SCHOOL_MASK_MAGIC))); + } + + void Register() override + { + DoCheckEffectProc += AuraCheckEffectProcFn(spell_dk_dark_simulacrum::CheckProc, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_dk_dark_simulacrum::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + +// 77616 - Dark Simulacrum +class spell_dk_dark_simulacrum_buff : public AuraScript +{ + bool CheckProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const + { + return uint32(aurEff->GetAmount()) == eventInfo.GetSpellInfo()->Id; + } + + void Register() override + { + DoCheckEffectProc += AuraCheckEffectProcFn(spell_dk_dark_simulacrum_buff::CheckProc, EFFECT_0, SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED); + } +}; + // 43265 - Death and Decay (Aura) class spell_dk_death_and_decay : public AuraScript { @@ -951,6 +1019,8 @@ void AddSC_deathknight_spell_scripts() RegisterSpellScript(spell_dk_blinding_sleet); RegisterSpellScript(spell_dk_blood_boil); RegisterSpellScript(spell_dk_dancing_rune_weapon); + RegisterSpellScript(spell_dk_dark_simulacrum); + RegisterSpellScript(spell_dk_dark_simulacrum_buff); RegisterSpellScript(spell_dk_death_and_decay); RegisterSpellScript(spell_dk_death_coil); RegisterSpellScript(spell_dk_death_gate); |