From 90b07333926d250d430e745dcbea2b6ab358036a Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sat, 11 May 2019 06:25:03 +0200 Subject: [PATCH] Core/Spells: fixed Pyromaniac talent --- .../custom/custom_2019_05_11_03_world.sql | 7 ++ src/server/scripts/Spells/spell_mage.cpp | 101 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 sql/updates/world/custom/custom_2019_05_11_03_world.sql diff --git a/sql/updates/world/custom/custom_2019_05_11_03_world.sql b/sql/updates/world/custom/custom_2019_05_11_03_world.sql new file mode 100644 index 0000000000..e63499f5b9 --- /dev/null +++ b/sql/updates/world/custom/custom_2019_05_11_03_world.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (-34293); +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `Chance`, `Cooldown`) VALUES +(-34293, 4, 3, 0, 0, 0x00000008, 0x00010000, 5, 2, 0, 0, 100, 0); + +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_mage_pyromaniac'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-34293, 'spell_mage_pyromaniac'); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 7837632b18..4eb73890fe 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -86,6 +86,7 @@ enum MageSpells SPELL_MAGE_MIRROR_IMAGE_TRIGGERED_FROST = 58832, SPELL_MAGE_PERMAFROST = 91394, SPELL_MAGE_PYROBLAST = 11366, + SPELL_MAGE_PYROMANIAC_TRIGGERED = 83582, SPELL_MAGE_SCORCH = 2948, SPELL_MAGE_SLOW = 31589, SPELL_MAGE_SQUIRREL_FORM = 32813, @@ -2127,6 +2128,105 @@ class spell_mage_fingers_of_frost_charges : public AuraScript } }; +// -34293 - Pyromaniac +class spell_mage_pyromaniac : public AuraScript +{ + PrepareAuraScript(spell_mage_pyromaniac); + + bool Load() override + { + _buffActive = false; + return true; + } + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_PYROMANIAC_TRIGGERED }); + } + + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 1 * IN_MILLISECONDS; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* target = GetTarget(); + + _dotTargetGuids.insert(eventInfo.GetProcTarget()->GetGUID()); + + // Pyomaniac is active already so there is no need to iterate through potential targets + if (_buffActive) + return; + + uint8 dotTargetCount = 0; + GuidSet _targetGuids = _dotTargetGuids; + for (ObjectGuid guid : _targetGuids) + { + if (Unit* dotTarget = ObjectAccessor::GetUnit(*target, guid)) + { + std::list _dotAuraEffects = dotTarget->GetAuraEffectsByType(SPELL_AURA_PERIODIC_DAMAGE); + for (AuraEffect const* dotEff : _dotAuraEffects) + if (dotEff->GetCasterGUID() == target->GetGUID() && dotEff->GetSpellInfo()->SpellFamilyFlags[2] & 0x00000008) + dotTargetCount++; + } + else + _dotTargetGuids.erase(guid); + } + + if (dotTargetCount >= 3) + { + target->CastCustomSpell(SPELL_MAGE_PYROMANIAC_TRIGGERED, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), target, true, nullptr, aurEff); + _buffActive = true; + } + } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + // Buff is not active right now so there is no need to check targets + if (!_buffActive) + return; + + Unit* target = GetTarget(); + GuidSet _targetGuids = _dotTargetGuids; + for (ObjectGuid guid : _targetGuids) + { + bool _next = false; + if (Unit* dotTarget = ObjectAccessor::GetUnit(*target, guid)) + { + uint8 dotTargetCount = 0; + std::list _dotAuraEffects = dotTarget->GetAuraEffectsByType(SPELL_AURA_PERIODIC_DAMAGE); + for (AuraEffect const* dotEff : _dotAuraEffects) + if (dotEff->GetCasterGUID() == target->GetGUID() && dotEff->GetSpellInfo()->SpellFamilyFlags[2] & 0x00000008) + dotTargetCount++; + + if (!dotTargetCount) + _dotTargetGuids.erase(guid); + } + else + _dotTargetGuids.erase(guid); + } + + if (_dotTargetGuids.size() < 3) + { + target->RemoveAurasDueToSpell(SPELL_MAGE_PYROMANIAC_TRIGGERED); + _buffActive = false; + } + } + + void Register() override + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_mage_pyromaniac::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_mage_pyromaniac::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_pyromaniac::HandlePeriodic, EFFECT_0, SPELL_AURA_DUMMY); + } +private: + GuidSet _dotTargetGuids; + bool _buffActive; +}; + void AddSC_mage_spell_scripts() { RegisterAuraScript(spell_mage_arcane_potency); @@ -2164,6 +2264,7 @@ void AddSC_mage_spell_scripts() new spell_mage_polymorph(); new spell_mage_polymorph_cast_visual(); new spell_mage_pyroblast(); + RegisterAuraScript(spell_mage_pyromaniac); new spell_mage_replenish_mana(); new spell_mage_ring_of_frost(); new spell_mage_ring_of_frost_freeze();