aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-04-04 23:57:57 +0200
committerShauren <shauren.trinity@gmail.com>2023-04-04 23:57:57 +0200
commit122d41eb067eecd76debc35778164ee163cda813 (patch)
tree858352c4ed90050ae1fe5a5db6690c5ead52d49f /src
parenta8dbfc8a642db116054b99a854d8c7a8c646a04d (diff)
Scripts/Spells: Added proc requirements to a few auras that have SPELL_ATTR3_CAN_PROC_FROM_PROCS attribute
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellScript.h2
-rw-r--r--src/server/scripts/Spells/spell_item.cpp112
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);
}