diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-04-19 23:56:59 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-04-19 23:56:59 +0200 |
commit | c8ebf077c7b934eeb33466cd11a92ba00b931a3d (patch) | |
tree | f9de91bafeb7c6e566a113052e0e42465ce41d87 | |
parent | 25a1d436c832653034994c53d58aa0d4d9e9bb91 (diff) |
Scripts/Spells: Added proc requirements to a few auras that have SPELL_ATTR3_CAN_PROC_FROM_PROCS attribute
-rw-r--r-- | sql/updates/world/master/2023_04_19_00_world.sql | 46 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 9 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_azerite.cpp | 174 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 33 |
4 files changed, 261 insertions, 1 deletions
diff --git a/sql/updates/world/master/2023_04_19_00_world.sql b/sql/updates/world/master/2023_04_19_00_world.sql new file mode 100644 index 00000000000..f7564c8e3ac --- /dev/null +++ b/sql/updates/world/master/2023_04_19_00_world.sql @@ -0,0 +1,46 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (279387,279426,279449,279582,279685,279752,279900,279921,279955,280163,280403,280408,280409,280411,280778,281238,207256,281712,281720,281842,285469,285471,285495,285499,286579,287650,287700,288084,288304,288571); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(279387,0x00,10,0x00000000,0x00000000,0x00000000,0x00000400,0x0,0x0,0x4,0x2,0x0,0x0,0x0,0,0,0,0), -- Inspiring Vanguard +(279426,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Butcher Cut +(279449,0x00,107,0x00400000,0x00000000,0x00000020,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Essence Sever +(279582,0x00,107,0x00001000,0x00000040,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Revolving Blades +(279685,0x00,3,0x00000000,0x00004000,0x00000000,0x00000000,0x0,0x0,0x4,0x2,0x0,0x0,0x0,0,0,0,0), -- Frigid Grasp +(279752,0x00,8,0x00000000,0x00000000,0x00000000,0x00000100,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Blade In The Shadows +(279900,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Unstable Flames +(279921,0x00,53,0x00100000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Open Palm Strikes +(279955,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Azerite Globules +(280163,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Barrage Of Many Bombs +(280403,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Tidal Surge +(280408,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Blood Rite +(280409,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x4,0x2,0x0,0x0,0x0,0,0,0,0), -- Blood Rite +(280411,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Incite the Pack +(280778,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Glory in Battle +(281238,0x00,15,0x00200000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x4,0x2,0x0,0x0,0x0,0,0,0,0), -- Obliteration +(207256,0x00,15,0x00000000,0x00040006,0x04000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Obliteration +(281712,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Cut of Death +(281720,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Vile Bile +(281842,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Tradewinds +(285469,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Thunder Jolt +(285471,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Frozen Flow +(285495,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Moon Touched +(285499,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Gurubashi Pride +(286579,0x00,8,0x00000000,0x01000000,0x00000000,0x00000000,0x0,0x0,0x4,0x2,0x0,0x0,0x0,0,0,0,0), -- Nothing Personal +(287650,0x00,8,0x00000000,0x00040000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x402,0x0,0x0,0,0,0,0), -- Echoing Blades +(287700,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0), -- Superior Stratagem +(288084,0x00,4,0x00000000,0x00000400,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x402,0x0,0x0,0,0,0,0), -- Cold Steel, Hot Blood +(288304,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x3,0x2,0x403,0x0,0x0,0,0,0,0), -- Gift of Wind +(288571,0x00,9,0x00000000,0x00000000,0x00010000,0x00000001,0x0,0x0,0x1,0x2,0x403,0x0,0x0,0,0,0,0); -- Primeval Intuition + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell','spell_item_blood_rite','spell_dk_obliteration','spell_item_tradewinds','spell_item_bastion_of_might','spell_item_echoing_blades','spell_item_echoing_blades_damage'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(280409,'spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell'), +(280409,'spell_item_blood_rite'), +(280412,'spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell'), +(280413,'spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell'), +(207256,'spell_dk_obliteration'), +(281843,'spell_item_tradewinds'), +(281843,'spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell'), +(287379,'spell_item_bastion_of_might'), +(287379,'spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell'), +(287650,'spell_item_echoing_blades'), +(287653,'spell_item_echoing_blades_damage'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 4d93cf5fefa..67c03d45b08 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4674,6 +4674,15 @@ void SpellMgr::LoadSpellInfoCorrections() }); }); + ApplySpellFix({ 265057 }, [](SpellInfo* spellInfo) + { + ApplySpellEffectFix(spellInfo, EFFECT_0, [](SpellEffectInfo* spellEffectInfo) + { + // Fix incorrect spell id (it has self in TriggerSpell) + spellEffectInfo->TriggerSpell = 16403; + }); + }); + // Ray of Frost (Fingers of Frost charges) ApplySpellFix({ 269748 }, [](SpellInfo* spellInfo) { diff --git a/src/server/scripts/Spells/spell_azerite.cpp b/src/server/scripts/Spells/spell_azerite.cpp index 2ae6f3494a1..f3c44809adc 100644 --- a/src/server/scripts/Spells/spell_azerite.cpp +++ b/src/server/scripts/Spells/spell_azerite.cpp @@ -22,8 +22,36 @@ #include "Spell.h" #include "SpellAuraEffects.h" #include "SpellInfo.h" +#include "SpellMgr.h" #include "SpellScript.h" +class spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell : public AuraScript +{ + PrepareAuraScript(spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell); + + bool Validate(SpellInfo const* spellInfo) override + { + return spellInfo->GetEffects().size() > EFFECT_1 && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_1).TriggerSpell }); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + if (Unit* caster = GetCaster()) + { + if (AuraEffect const* trait = caster->GetAuraEffect(GetEffectInfo(EFFECT_1).TriggerSpell, EFFECT_0)) + { + amount = trait->GetAmount(); + canBeRecalculated = false; + } + } + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_RATING); + } +}; + // 270658 - Azerite Fortification class spell_item_azerite_fortification : public AuraScript { @@ -313,6 +341,146 @@ class spell_item_divine_right : public AuraScript } }; +// 280409 - Blood Rite +class spell_item_blood_rite : public AuraScript +{ + PrepareAuraScript(spell_item_blood_rite); + + void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& /*procInfo*/) + { + RefreshDuration(); + } + + void Register() override + { + AfterEffectProc += AuraEffectProcFn(spell_item_blood_rite::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } +}; + +// 281843 - Tradewinds +class spell_item_tradewinds : public AuraScript +{ + PrepareAuraScript(spell_item_tradewinds); + + enum + { + SPELL_TRADEWINDS_ALLY_BUFF = 281844 + }; + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TRADEWINDS_ALLY_BUFF }); + } + + void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (AuraEffect const* trait = GetTarget()->GetAuraEffect(GetEffectInfo(EFFECT_1).TriggerSpell, EFFECT_1)) + GetTarget()->CastSpell(nullptr, SPELL_TRADEWINDS_ALLY_BUFF, + CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_BASE_POINT0, trait->GetAmount())); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_item_tradewinds::HandleRemove, EFFECT_0, SPELL_AURA_MOD_RATING, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 287379 - Bastion of Might +class spell_item_bastion_of_might : public SpellScript +{ + PrepareSpellScript(spell_item_bastion_of_might); + + enum + { + SPELL_WARRIOR_IGNORE_PAIN = 190456 + }; + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARRIOR_IGNORE_PAIN }); + } + + void TriggerIgnorePain() + { + GetCaster()->CastSpell(GetCaster(), SPELL_WARRIOR_IGNORE_PAIN, GetSpell()); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_item_bastion_of_might::TriggerIgnorePain); + } +}; + +// 287650 - Echoing Blades +class spell_item_echoing_blades : public AuraScript +{ + PrepareAuraScript(spell_item_echoing_blades); + + void PrepareProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetProcSpell()) + { + if (eventInfo.GetProcSpell()->m_castId != _lastFanOfKnives) + GetEffect(EFFECT_0)->RecalculateAmount(); + + _lastFanOfKnives = eventInfo.GetProcSpell()->m_castId; + } + } + + bool CheckFanOfKnivesCounter(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + return aurEff->GetAmount() > 0; + } + + void ReduceCounter(AuraEffect* aurEff, ProcEventInfo& /*procInfo*/) + { + aurEff->SetAmount(aurEff->GetAmount() - 1); + } + + void Register() override + { + DoPrepareProc += AuraProcFn(spell_item_echoing_blades::PrepareProc); + DoCheckEffectProc += AuraCheckEffectProcFn(spell_item_echoing_blades::CheckFanOfKnivesCounter, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + AfterEffectProc += AuraEffectProcFn(spell_item_echoing_blades::ReduceCounter, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + + ObjectGuid _lastFanOfKnives; +}; + +// 287653 - Echoing Blades +class spell_item_echoing_blades_damage : public SpellScript +{ + PrepareSpellScript(spell_item_echoing_blades_damage); + + enum + { + SPELL_ECHOING_BLADES_TRAIT = 287649 + }; + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_ECHOING_BLADES_TRAIT }) + && sSpellMgr->AssertSpellInfo(SPELL_ECHOING_BLADES_TRAIT, DIFFICULTY_NONE)->GetEffects().size() > EFFECT_2; + } + + void CalculateDamage(SpellEffIndex /*effIndex*/) + { + if (AuraEffect const* trait = GetCaster()->GetAuraEffect(SPELL_ECHOING_BLADES_TRAIT, EFFECT_2)) + SetHitDamage(trait->GetAmount() * 2); + } + + void ForceCritical(Unit const* /*victim*/, float& critChance) + { + critChance = 100.0f; + } + + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_item_echoing_blades_damage::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnCalcCritChance += SpellOnCalcCritChanceFn(spell_item_echoing_blades_damage::ForceCritical); + } +}; + // 277253 - Heart of Azeroth class spell_item_heart_of_azeroth : public AuraScript { @@ -349,6 +517,7 @@ class spell_item_heart_of_azeroth : public AuraScript void AddSC_azerite_item_spell_scripts() { + RegisterSpellScript(spell_azerite_gen_aura_calc_from_2nd_effect_triggered_spell); RegisterSpellScript(spell_item_azerite_fortification); RegisterSpellScript(spell_item_strength_in_numbers); RegisterSpellScript(spell_item_blessed_portents); @@ -359,6 +528,11 @@ void AddSC_azerite_item_spell_scripts() RegisterSpellScript(spell_item_orbital_precision); RegisterSpellScript(spell_item_blur_of_talons); RegisterSpellScript(spell_item_divine_right); + RegisterSpellScript(spell_item_blood_rite); + RegisterSpellScript(spell_item_tradewinds); + RegisterSpellScript(spell_item_bastion_of_might); + RegisterSpellScript(spell_item_echoing_blades); + RegisterSpellScript(spell_item_echoing_blades_damage); RegisterSpellScript(spell_item_heart_of_azeroth); } diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 18220f6ce32..904d83d1ecc 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -24,11 +24,11 @@ #include "ScriptMgr.h" #include "Containers.h" #include "ObjectMgr.h" -#include "ObjectAccessor.h" #include "Player.h" #include "Spell.h" #include "SpellAuraEffects.h" #include "SpellHistory.h" +#include "SpellMgr.h" #include "SpellScript.h" #include <numeric> @@ -59,8 +59,11 @@ enum DeathKnightSpells SPELL_DK_GLYPH_OF_FOUL_MENAGERIE = 58642, SPELL_DK_GLYPH_OF_THE_GEIST = 58640, SPELL_DK_GLYPH_OF_THE_SKELETON = 146652, + SPELL_DK_KILLING_MACHINE_PROC = 51124, SPELL_DK_MARK_OF_BLOOD_HEAL = 206945, SPELL_DK_NECROSIS_EFFECT = 216974, + SPELL_DK_OBLITERATION = 281238, + SPELL_DK_OBLITERATION_RUNE_ENERGIZE = 281327, SPELL_DK_RAISE_DEAD_SUMMON = 52150, SPELL_DK_RECENTLY_USED_DEATH_STRIKE = 180612, SPELL_DK_RUNIC_POWER_ENERGIZE = 49088, @@ -705,6 +708,33 @@ class spell_dk_necrosis : public AuraScript } }; +// 207256 - Obliteration +class spell_dk_obliteration : public AuraScript +{ + PrepareAuraScript(spell_dk_obliteration); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_OBLITERATION, SPELL_DK_OBLITERATION_RUNE_ENERGIZE, SPELL_DK_KILLING_MACHINE_PROC }) + && sSpellMgr->AssertSpellInfo(SPELL_DK_OBLITERATION, DIFFICULTY_NONE)->GetEffects().size() > EFFECT_1; + } + + void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) + { + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_DK_KILLING_MACHINE_PROC, aurEff); + + if (AuraEffect const* oblitaration = target->GetAuraEffect(SPELL_DK_OBLITERATION, EFFECT_1)) + if (roll_chance_i(oblitaration->GetAmount())) + target->CastSpell(target, SPELL_DK_OBLITERATION_RUNE_ENERGIZE, aurEff); + } + + void Register() override + { + AfterEffectProc += AuraEffectProcFn(spell_dk_obliteration::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + // 121916 - Glyph of the Geist (Unholy) /// 6.x, does this belong here or in spell_generic? apply this in creature_template_addon? sniffs say this is always cast on raise dead. class spell_dk_pet_geist_transform : public SpellScript @@ -881,6 +911,7 @@ void AddSC_deathknight_spell_scripts() RegisterSpellScript(spell_dk_howling_blast); RegisterSpellScript(spell_dk_mark_of_blood); RegisterSpellScript(spell_dk_necrosis); + RegisterSpellScript(spell_dk_obliteration); RegisterSpellScript(spell_dk_pet_geist_transform); RegisterSpellScript(spell_dk_pet_skeleton_transform); RegisterSpellScript(spell_dk_pvp_4p_bonus); |