[7663] Cleanup spell interrupt code. Author: VladimirMangos

--HG--
branch : trunk
This commit is contained in:
megamage
2009-04-13 17:36:37 -05:00
parent 3a2e58f81a
commit df35e1ad2b
3 changed files with 12 additions and 50 deletions
+2 -12
View File
@@ -3825,18 +3825,8 @@ void AuraEffect::HandleAuraModSilence(bool apply, bool Real)
m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED); m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED);
// Stop cast only spells vs PreventionType == SPELL_PREVENTION_TYPE_SILENCE // Stop cast only spells vs PreventionType == SPELL_PREVENTION_TYPE_SILENCE
for (uint32 i = CURRENT_MELEE_SPELL; i < CURRENT_MAX_SPELL;i++) for (uint32 i = CURRENT_MELEE_SPELL; i < CURRENT_MAX_SPELL;i++)
{ if (m_target->m_currentSpells[i] && m_target->m_currentSpells[i]->m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE)
Spell* currentSpell = m_target->m_currentSpells[i]; m_target->InterruptSpell(i,false); // Stop spells on prepare or casting state
if (currentSpell && currentSpell->m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE)
{
uint32 state = currentSpell->getState();
// Stop spells on prepare or casting state
if ( state == SPELL_STATE_PREPARING || state == SPELL_STATE_CASTING )
{
currentSpell->cancel();
}
}
}
switch (GetId()) switch (GetId())
{ {
+4 -8
View File
@@ -380,15 +380,11 @@ void WorldSession::HandleCancelAuraOpcode( WorldPacket& recvPacket)
return; return;
// channeled spell case (it currently casted then) // channeled spell case (it currently casted then)
if(IsChanneledSpell(spellInfo)) if (IsChanneledSpell(spellInfo))
{ {
if(Spell* spell = _player->m_currentSpells[CURRENT_CHANNELED_SPELL]) if (_player->m_currentSpells[CURRENT_CHANNELED_SPELL] &&
{ _player->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id==spellId)
if(spell->m_spellInfo->Id==spellId) _player->InterruptSpell(CURRENT_CHANNELED_SPELL);
{
spell->cancel();
}
}
return; return;
} }
+6 -30
View File
@@ -3477,40 +3477,16 @@ bool Unit::IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled, bool skip
void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id) void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id)
{ {
// generic spells are interrupted if they are not finished or delayed // generic spells are interrupted if they are not finished or delayed
Spell *spell = m_currentSpells[CURRENT_GENERIC_SPELL]; if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id==spell_id))
if (spell && (!spell_id || spell->m_spellInfo->Id==spell_id)) InterruptSpell(CURRENT_GENERIC_SPELL,withDelayed);
{
m_currentSpells[CURRENT_GENERIC_SPELL] = NULL;
if ( (spell->getState() != SPELL_STATE_FINISHED) &&
(withDelayed || spell->getState() != SPELL_STATE_DELAYED) )
spell->cancel();
spell->SetReferencedFromCurrent(false);
}
spell = m_currentSpells[CURRENT_AUTOREPEAT_SPELL];
// autorepeat spells are interrupted if they are not finished or delayed // autorepeat spells are interrupted if they are not finished or delayed
if (spell && (!spell_id || spell->m_spellInfo->Id==spell_id)) if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id==spell_id))
{ InterruptSpell(CURRENT_AUTOREPEAT_SPELL,withDelayed);
m_currentSpells[CURRENT_AUTOREPEAT_SPELL] = NULL;
// send disable autorepeat packet in any case
if(GetTypeId()==TYPEID_PLAYER)
((Player*)this)->SendAutoRepeatCancel();
if ( (spell->getState() != SPELL_STATE_FINISHED) &&
(withDelayed || spell->getState() != SPELL_STATE_DELAYED) )
spell->cancel();
spell->SetReferencedFromCurrent(false);
}
// channeled spells are interrupted if they are not finished, even if they are delayed // channeled spells are interrupted if they are not finished, even if they are delayed
spell = m_currentSpells[CURRENT_CHANNELED_SPELL]; if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id==spell_id))
if (spell && (!spell_id || spell->m_spellInfo->Id==spell_id)) InterruptSpell(CURRENT_CHANNELED_SPELL,true);
{
m_currentSpells[CURRENT_CHANNELED_SPELL] = NULL;
if (spell->getState() != SPELL_STATE_FINISHED)
spell->cancel();
spell->SetReferencedFromCurrent(false);
}
} }
Spell* Unit::FindCurrentSpellBySpellId(uint32 spell_id) const Spell* Unit::FindCurrentSpellBySpellId(uint32 spell_id) const