1
0

avoid crash on remove caster when in a spell attack

This commit is contained in:
Emagi 2024-12-01 06:29:13 -05:00
parent 9be94fe396
commit 14bb60caf8
2 changed files with 6 additions and 8 deletions

View File

@ -45,20 +45,18 @@ SpellProcess::~SpellProcess(){
void SpellProcess::RemoveCaster(Spawn* caster, bool lock_spell_process){ void SpellProcess::RemoveCaster(Spawn* caster, bool lock_spell_process){
if(lock_spell_process) if(lock_spell_process)
MSpellProcess.lock_shared(); MSpellProcess.lock();
MutexList<LuaSpell*>::iterator active_spells_itr = active_spells.begin(); MutexList<LuaSpell*>::iterator active_spells_itr = active_spells.begin();
while(active_spells_itr.Next()){ while(active_spells_itr.Next()){
LuaSpell* spell = active_spells_itr->value; LuaSpell* spell = active_spells_itr->value;
spell->MSpellTargets.writelock(__FUNCTION__, __LINE__);
if(spell->caster == caster) { if(spell->caster == caster) {
spell->caster = nullptr; spell->caster = nullptr;
} }
if(spell->initial_target == caster->GetID()) if(spell->initial_target == caster->GetID())
spell->initial_target = 0; spell->initial_target = 0;
spell->MSpellTargets.releasewritelock(__FUNCTION__, __LINE__);
} }
if(lock_spell_process) if(lock_spell_process)
MSpellProcess.unlock_shared(); MSpellProcess.unlock();
} }
void SpellProcess::RemoveAllSpells(bool reload_spells){ void SpellProcess::RemoveAllSpells(bool reload_spells){

View File

@ -1519,6 +1519,10 @@ void ZoneServer::DeleteSpawns(bool delete_all) {
lua_interface->SetLuaUserDataStale(spawn); lua_interface->SetLuaUserDataStale(spawn);
if (spellProcess) {
spellProcess->RemoveCaster(spawn, true);
}
if(movementMgr != nullptr) { if(movementMgr != nullptr) {
movementMgr->RemoveMob((Entity*)spawn); movementMgr->RemoveMob((Entity*)spawn);
} }
@ -6721,10 +6725,6 @@ void ZoneServer::RemoveSpawnSupportFunctions(Spawn* spawn, bool lock_spell_proce
if(spawn->IsEntity()) if(spawn->IsEntity())
RemoveSpellTimersFromSpawn((Entity*)spawn, true, true, true, lock_spell_process); 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 if(!shutdown) { // in case of shutdown, DeleteData(true) handles the cleanup later via DeleteSpawnScriptTimers
StopSpawnScriptTimer(spawn, ""); StopSpawnScriptTimer(spawn, "");
} }