aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2023_04_04_01_world.sql13
-rw-r--r--src/server/game/Spells/SpellScript.h2
-rw-r--r--src/server/scripts/Spells/spell_item.cpp112
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);
}