diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/SpellScript.h | 2 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_item.cpp | 112 |
2 files changed, 113 insertions, 1 deletions
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); } |