aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/CreatureAI.h8
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rw-r--r--src/server/game/Spells/Spell.cpp9
-rw-r--r--src/server/game/Spells/Spell.h7
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp9
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
+}