Scripts/Spells: Implemented Dark Simulacrum and its related attribute SPELL_ATTR9_ALLOW_DARK_SIMULACRUM

This commit is contained in:
Shauren
2024-06-27 12:58:44 +02:00
parent cb335c3274
commit a33864ce2d
4 changed files with 82 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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