diff options
author | Robingad <robingad@rambler.ru> | 2022-01-27 23:18:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-27 22:18:46 +0100 |
commit | 3e725e1d2521547ea651ef2b4e01c980c9b5ff3e (patch) | |
tree | 40575fe4c28c4d785669680aac0c9308bc97070a /src | |
parent | 2b7545378a53a0bc9b11a5a73ebf7b2f7aee7a7b (diff) |
Scripts/Spells: Fix shaman Earthquake (#27620)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 6 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 86 |
3 files changed, 92 insertions, 1 deletions
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index b8ef1260655..0d008288186 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -607,6 +607,7 @@ class TC_GAME_API Spell CurrentSpellTypes GetCurrentContainer() const; WorldObject* GetCaster() const { return m_caster; } + ObjectGuid GetOriginalCasterGUID() const { return m_originalCasterGUID; } Unit* GetOriginalCaster() const { return m_originalCaster; } SpellInfo const* GetSpellInfo() const { return m_spellInfo; } Difficulty GetCastDifficulty() const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 334a666a3bf..2ecedc3c058 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4655,6 +4655,12 @@ void SpellMgr::LoadSpellInfoCorrections() }); }); + // Earthquake + ApplySpellFix({ 61882 }, [](SpellInfo* spellInfo) + { + spellInfo->NegativeEffects[EFFECT_2] = true; + }); + for (SpellInfo const& s : mSpellInfoMap) { SpellInfo* spellInfo = &const_cast<SpellInfo&>(s); diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index cd992ba6831..43d112ca4dc 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -45,6 +45,9 @@ enum ShamanSpells SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE = 218558, SPELL_SHAMAN_CHAINED_HEAL = 70809, SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE = 187878, + SPELL_SHAMAN_EARTHQUAKE = 61882, + SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN = 77505, + SPELL_SHAMAN_EARTHQUAKE_TICK = 77478, SPELL_SHAMAN_EARTH_SHIELD_HEAL = 204290, SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE = 170374, SPELL_SHAMAN_EARTHEN_RAGE_PERIODIC = 170377, @@ -55,8 +58,8 @@ enum ShamanSpells SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE = 344645, SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE = 173183, SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY = 173184, - SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166, SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD = 120588, + SPELL_SHAMAN_ELEMENTAL_MASTERY = 16166, SPELL_SHAMAN_ENERGY_SURGE = 40465, SPELL_SHAMAN_EXHAUSTION = 57723, SPELL_SHAMAN_FLAME_SHOCK = 8050, @@ -456,6 +459,85 @@ class spell_sha_earthen_rage_proc_aura : public AuraScript } }; +// 61882 - Earthquake +// 8382 - AreaTriggerId +struct areatrigger_sha_earthquake : AreaTriggerAI +{ + areatrigger_sha_earthquake(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger), _refreshTimer(0s), _period(1s) { } + + void OnCreate() override + { + if (Unit* caster = at->GetCaster()) + if (AuraEffect const* earthquake = caster->GetAuraEffect(SPELL_SHAMAN_EARTHQUAKE, EFFECT_1)) + _period = Milliseconds(earthquake->GetPeriod()); + } + + void OnUpdate(uint32 diff) override + { + _refreshTimer -= Milliseconds(diff); + while (_refreshTimer <= 0s) + { + if (Unit* caster = at->GetCaster()) + caster->CastSpell(at->GetPosition(), SPELL_SHAMAN_EARTHQUAKE_TICK, CastSpellExtraArgs(TRIGGERED_FULL_MASK) + .SetOriginalCaster(at->GetGUID())); + + _refreshTimer += _period; + } + } + + // Each target can only be stunned once by each earthquake - keep track of who we already stunned + bool AddStunnedTarget(ObjectGuid const& guid) + { + return _stunnedUnits.insert(guid).second; + } + +private: + Milliseconds _refreshTimer; + Milliseconds _period; + GuidUnorderedSet _stunnedUnits; +}; + +// 77478 - Earthquake tick +class spell_sha_earthquake_tick : public SpellScript +{ + PrepareSpellScript(spell_sha_earthquake_tick); + + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN }) && spellInfo->GetEffects().size() > EFFECT_1; + } + + void HandleDamageCalc(SpellEffIndex /*effIndex*/) + { + SetEffectValue(GetCaster()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE) * 0.391f); + } + + void HandleOnHit() + { + if (Unit* target = GetHitUnit()) + { + if (roll_chance_i(GetEffectInfo(EFFECT_1).CalcValue())) + { + std::vector<AreaTrigger*> areaTriggers = GetCaster()->GetAreaTriggers(SPELL_SHAMAN_EARTHQUAKE); + auto itr = std::find_if(areaTriggers.begin(), areaTriggers.end(), [&](AreaTrigger const* at) + { + return at->GetGUID() == GetSpell()->GetOriginalCasterGUID(); + }); + if (itr != areaTriggers.end()) + if (areatrigger_sha_earthquake* eq = CAST_AI(areatrigger_sha_earthquake, (*itr)->AI())) + if (eq->AddStunnedTarget(target->GetGUID())) + GetCaster()->CastSpell(target, SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN, true); + } + } + } + + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_sha_earthquake_tick::HandleDamageCalc, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnHit += SpellHitFn(spell_sha_earthquake_tick::HandleOnHit); + } +}; + // 117014 - Elemental Blast // 120588 - Elemental Blast Overload class spell_sha_elemental_blast : public SpellScript @@ -1606,6 +1688,8 @@ void AddSC_shaman_spell_scripts() RegisterAuraScript(spell_sha_earth_shield); RegisterAuraScript(spell_sha_earthen_rage_passive); RegisterAuraScript(spell_sha_earthen_rage_proc_aura); + RegisterAreaTriggerAI(areatrigger_sha_earthquake); + RegisterSpellScript(spell_sha_earthquake_tick); RegisterSpellScript(spell_sha_elemental_blast); RegisterSpellScript(spell_sha_flametongue_weapon); RegisterAuraScript(spell_sha_flametongue_weapon_aura); |