Scripts/Spells: Added proc requirements to a few auras that have SPELL_ATTR3_CAN_PROC_FROM_PROCS attribute

This commit is contained in:
Shauren
2023-04-04 23:57:57 +02:00
parent a8dbfc8a64
commit 122d41eb06
3 changed files with 126 additions and 1 deletions

View File

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

View File

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

View File

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