diff options
author | Ovah <dreadkiller@gmx.de> | 2020-10-03 00:48:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-03 00:48:32 +0200 |
commit | 77aa058504e1ee99b560176d70bcf452c7e3d4f7 (patch) | |
tree | aff058c699d92d7c138fba3aea435913b1a434e9 /src | |
parent | 53cb57b864d6b67bd2807cdb1eff93487502fb73 (diff) |
Core/Spells: unify OnSpellCastInterrupt and OnSuccessfulSpellCast hooks into OnSpellCastFinished (#25522)
* added support for calling the hook when completing a channeled spell as well
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/CreatureAI.h | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 7 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp | 9 |
5 files changed, 21 insertions, 14 deletions
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 19c10c6c737..56ab1fa03b0 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -31,6 +31,7 @@ class GameObject; class PlayerAI; class WorldObject; struct Position; +enum SpellFinishReason : uint8; typedef std::vector<AreaBoundary const*> CreatureBoundary; @@ -144,11 +145,8 @@ class TC_GAME_API CreatureAI : public UnitAI // Called when spell hits a target virtual void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* /*spellInfo*/) { } - // Called when a spell cast gets interrupted - virtual void OnSpellCastInterrupt(SpellInfo const* /*spell*/) { } - - // Called when a spell cast has been successfully finished - virtual void OnSuccessfulSpellCast(SpellInfo const* /*spell*/) { } + // Called when a spell either finishes, interrupts or cancels a spell cast + virtual void OnSpellCastFinished(SpellInfo const* /*spell*/, SpellFinishReason /*reason*/) { } // Should return true if the NPC is currently being escorted virtual bool IsEscorted() const { return false; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 78c79a7d173..cced18421de 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3022,7 +3022,7 @@ void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool wi } if (GetTypeId() == TYPEID_UNIT && IsAIEnabled()) - ToCreature()->AI()->OnSpellCastInterrupt(spell->GetSpellInfo()); + ToCreature()->AI()->OnSpellCastFinished(spell->GetSpellInfo(), SPELL_FINISHED_CANCELED); } } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 534a45d4e3d..088b46ea6a4 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3501,10 +3501,10 @@ void Spell::_cast(bool skipCheck) Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_CAST, hitMask, this, nullptr, nullptr); - // Call CreatureAI hook OnSuccessfulSpellCast + // Call CreatureAI hook OnSpellCastFinished if (Creature* caster = m_originalCaster->ToCreature()) if (caster->IsAIEnabled()) - caster->AI()->OnSuccessfulSpellCast(GetSpellInfo()); + caster->AI()->OnSpellCastFinished(GetSpellInfo(), SPELL_FINISHED_SUCCESSFUL_CAST); } template <class Container> @@ -3821,6 +3821,11 @@ void Spell::update(uint32 difftime) { SendChannelUpdate(0); finish(); + + // We call the hook here instead of in Spell::finish because we only want to call it for completed channeling. Everything else is handled by interrupts + if (Creature* creatureCaster = m_caster->ToCreature()) + if (creatureCaster->IsAIEnabled()) + creatureCaster->AI()->OnSpellCastFinished(m_spellInfo, SPELL_FINISHED_CHANNELING_COMPLETE); } break; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 320cfdd94f0..e78bbcbfffe 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -113,6 +113,13 @@ enum SpellRangeFlag SPELL_RANGE_RANGED = 2 //hunter range and ranged weapon }; +enum SpellFinishReason : uint8 +{ + SPELL_FINISHED_SUCCESSFUL_CAST = 0, // spell has sucessfully launched + SPELL_FINISHED_CANCELED = 1, // spell has been canceled (interrupts) + SPELL_FINISHED_CHANNELING_COMPLETE = 2 // spell channeling has been finished +}; + struct TC_GAME_API SpellDestination { SpellDestination(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index f7a49f7a0e7..22adbf3e4dc 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -1344,12 +1344,9 @@ struct npc_shambling_horror_icc : public ScriptedAI DoMeleeAttackIfReady(); } - void OnSpellCastInterrupt(SpellInfo const* spell) override + void OnSpellCastFinished(SpellInfo const* spell, SpellFinishReason reason) override { - ScriptedAI::OnSpellCastInterrupt(spell); - - // When enrage is interrupted, reschedule the event - if (spell->Id == ENRAGE) + if (reason == SPELL_FINISHED_CANCELED && spell->Id == ENRAGE) _events.RescheduleEvent(EVENT_ENRAGE, 1s); } @@ -2895,4 +2892,4 @@ void AddSC_boss_the_lich_king() // Achievements new achievement_been_waiting_long_time(); new achievement_neck_deep_in_vile(); -}
\ No newline at end of file +} |