diff --git a/source/WorldServer/SpellProcess.cpp b/source/WorldServer/SpellProcess.cpp index 2cd81ec..1a68e6e 100644 --- a/source/WorldServer/SpellProcess.cpp +++ b/source/WorldServer/SpellProcess.cpp @@ -43,7 +43,9 @@ SpellProcess::~SpellProcess(){ RemoveAllSpells(); } -void SpellProcess::RemoveCaster(Spawn* caster){ +void SpellProcess::RemoveCaster(Spawn* caster, bool lock_spell_process){ + if(lock_spell_process) + MSpellProcess.lock_shared(); MutexList::iterator active_spells_itr = active_spells.begin(); while(active_spells_itr.Next()){ LuaSpell* spell = active_spells_itr->value; @@ -55,6 +57,8 @@ void SpellProcess::RemoveCaster(Spawn* caster){ spell->initial_target = 0; spell->MSpellTargets.releasewritelock(__FUNCTION__, __LINE__); } + if(lock_spell_process) + MSpellProcess.unlock_shared(); } void SpellProcess::RemoveAllSpells(bool reload_spells){ diff --git a/source/WorldServer/SpellProcess.h b/source/WorldServer/SpellProcess.h index f2f6723..34e5785 100644 --- a/source/WorldServer/SpellProcess.h +++ b/source/WorldServer/SpellProcess.h @@ -158,7 +158,7 @@ public: ~SpellProcess(); /// Remove dead pointers for casters when the Spawn is deconstructed - void RemoveCaster(Spawn* caster); + void RemoveCaster(Spawn* caster, bool lock_spell_process = true); /// Remove all spells from the SpellProcess void RemoveAllSpells(bool reload_spells = false); diff --git a/source/WorldServer/zoneserver.cpp b/source/WorldServer/zoneserver.cpp index 9fd8e4d..f08eb50 100644 --- a/source/WorldServer/zoneserver.cpp +++ b/source/WorldServer/zoneserver.cpp @@ -6720,7 +6720,11 @@ void ZoneServer::RemoveSpawnSupportFunctions(Spawn* spawn, bool lock_spell_proce } if(spawn->IsEntity()) RemoveSpellTimersFromSpawn((Entity*)spawn, true, true, true, lock_spell_process); - + + if (spellProcess) { + spellProcess->RemoveCaster(spawn, lock_spell_process); + } + if(!shutdown) { // in case of shutdown, DeleteData(true) handles the cleanup later via DeleteSpawnScriptTimers StopSpawnScriptTimer(spawn, ""); }