diff options
-rw-r--r-- | sql/updates/world/master/2023_04_04_01_world.sql | 13 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.h | 2 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_item.cpp | 112 |
3 files changed, 126 insertions, 1 deletions
diff --git a/sql/updates/world/master/2023_04_04_01_world.sql b/sql/updates/world/master/2023_04_04_01_world.sql new file mode 100644 index 00000000000..34ac9d59de4 --- /dev/null +++ b/sql/updates/world/master/2023_04_04_01_world.sql @@ -0,0 +1,13 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (225281,225292,225294,225297,225298,225366); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(225281,0x00,53,0x04000000,0x00000000,0x00008000,0x00000000,0x0,0x0,0x2,0x2,0x403,0x0,0x0,0,0,0,0), -- Fragile Echoes +(225292,0x00,11,0x00000080,0x00000000,0x00010000,0x00000000,0x0,0x0,0x2,0x2,0x403,0x0,0x0,0,0,0,0), -- Fragile Echoes +(225294,0x00,6,0x00000001,0x00100000,0x00000000,0x00000000,0x0,0x0,0x6,0x2,0x403,0x0,0x0,0,0,0,0), -- Fragile Echoes +(225297,0x00,10,0x40000000,0x00000000,0x00000400,0x00000000,0x0,0x0,0x2,0x2,0x403,0x0,0x0,0,0,0,0), -- Fragile Echoes +(225298,0x00,7,0x00000050,0x00000000,0x00000000,0x00000000,0x4400,0x0,0x2,0x2,0x403,0x0,0x0,0,0,0,0), -- Fragile Echoes +(225366,0x00,6,0x00001800,0x00000000,0x00000000,0x00000000,0x0,0x0,0x2,0x2,0x403,0x0,0x0,0,0,0,0); -- Fragile Echoes + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_item_amalgams_seventh_spine','spell_item_amalgams_seventh_spine_mana_restore'); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(215266,'spell_item_amalgams_seventh_spine'), +(215267,'spell_item_amalgams_seventh_spine_mana_restore'); diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 3c7d47760e6..038020536cc 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -159,7 +159,7 @@ class TC_GAME_API _SpellScript virtual void Register() = 0; // Function called on server startup, if returns false script won't be used in core // use for: dbc/template data presence/correctness checks - virtual bool Validate(SpellInfo const* /*spellInfo*/) { return true; } + virtual bool Validate([[maybe_unused]] SpellInfo const* spellInfo) { return true; } // Function called when script is created, if returns false script will be unloaded afterwards // use for: initializing local script variables (DO NOT USE CONSTRUCTOR FOR THIS PURPOSE!) virtual bool Load() { return true; } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index a1673dbcd29..3e42cfce83c 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -4478,6 +4478,115 @@ class spell_item_eggnog : public SpellScript } }; +enum AmalgamsSeventhSpine +{ + SPELL_FRAGILE_ECHOES_MONK = 225281, + SPELL_FRAGILE_ECHOES_SHAMAN = 225292, + SPELL_FRAGILE_ECHOES_PRIEST_DISCIPLINE = 225294, + SPELL_FRAGILE_ECHOES_PALADIN = 225297, + SPELL_FRAGILE_ECHOES_DRUID = 225298, + SPELL_FRAGILE_ECHOES_PRIEST_HOLY = 225366, + SPELL_FRAGILE_ECHO_ENERGIZE = 215270, +}; + +// 215266 +class spell_item_amalgams_seventh_spine : public AuraScript +{ + PrepareAuraScript(spell_item_amalgams_seventh_spine); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ + SPELL_FRAGILE_ECHOES_MONK, + SPELL_FRAGILE_ECHOES_SHAMAN, + SPELL_FRAGILE_ECHOES_PRIEST_DISCIPLINE, + SPELL_FRAGILE_ECHOES_PALADIN, + SPELL_FRAGILE_ECHOES_DRUID, + SPELL_FRAGILE_ECHOES_PRIEST_HOLY + }); + } + + void ForcePeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + // simulate heartbeat timer + isPeriodic = true; + amplitude = 5000; + } + + void UpdateSpecAura(AuraEffect const* aurEff) + { + PreventDefaultAction(); + Player* target = GetTarget()->ToPlayer(); + if (!target) + return; + + auto updateAuraIfInCorrectSpec = [&](TalentSpecialization spec, AmalgamsSeventhSpine aura) + { + if (target->GetPrimarySpecialization() != uint32(spec)) + target->RemoveAurasDueToSpell(aura); + else if (!target->HasAura(aura)) + target->CastSpell(target, aura, aurEff); + }; + + switch (target->GetClass()) + { + case CLASS_MONK: + updateAuraIfInCorrectSpec(TALENT_SPEC_MONK_MISTWEAVER, SPELL_FRAGILE_ECHOES_MONK); + break; + case CLASS_SHAMAN: + updateAuraIfInCorrectSpec(TALENT_SPEC_SHAMAN_RESTORATION, SPELL_FRAGILE_ECHOES_SHAMAN); + break; + case CLASS_PRIEST: + updateAuraIfInCorrectSpec(TALENT_SPEC_PRIEST_DISCIPLINE, SPELL_FRAGILE_ECHOES_PRIEST_DISCIPLINE); + updateAuraIfInCorrectSpec(TALENT_SPEC_PRIEST_HOLY, SPELL_FRAGILE_ECHOES_PRIEST_HOLY); + break; + case CLASS_PALADIN: + updateAuraIfInCorrectSpec(TALENT_SPEC_PALADIN_HOLY, SPELL_FRAGILE_ECHOES_PALADIN); + break; + case CLASS_DRUID: + updateAuraIfInCorrectSpec(TALENT_SPEC_DRUID_RESTORATION, SPELL_FRAGILE_ECHOES_DRUID); + break; + default: + break; + } + } + + void Register() override + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_item_amalgams_seventh_spine::ForcePeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_item_amalgams_seventh_spine::UpdateSpecAura, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + +// 215267 +class spell_item_amalgams_seventh_spine_mana_restore : public AuraScript +{ + PrepareAuraScript(spell_item_amalgams_seventh_spine_mana_restore); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FRAGILE_ECHO_ENERGIZE }); + } + + void TriggerManaRestoration(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + Unit* caster = GetCaster(); + if (!caster) + return; + + if (AuraEffect const* trinketEffect = caster->GetAuraEffect(aurEff->GetSpellEffectInfo().TriggerSpell, EFFECT_0)) + caster->CastSpell(caster, SPELL_FRAGILE_ECHO_ENERGIZE, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_BASE_POINT0, trinketEffect->GetAmount())); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_item_amalgams_seventh_spine_mana_restore::TriggerManaRestoration, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + // 277253 - Heart of Azeroth class spell_item_heart_of_azeroth : public AuraScript { @@ -4652,5 +4761,8 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_crazy_alchemists_potion); RegisterSpellScript(spell_item_eggnog); + RegisterSpellScript(spell_item_amalgams_seventh_spine); + RegisterSpellScript(spell_item_amalgams_seventh_spine_mana_restore); + RegisterSpellScript(spell_item_heart_of_azeroth); } |