From 52d38ca175f31de3ce798ff0d4c8c5b93f2ed963 Mon Sep 17 00:00:00 2001
From: Image <image.emagi@gmail.com>
Date: Sun, 18 Apr 2021 06:52:22 -0400
Subject: [PATCH] found another deadlock location, AddTimer is now restricted
 to 10ms or higher

---
 EQ2/source/WorldServer/LuaFunctions.cpp              | 3 +++
 EQ2/source/WorldServer/Zone/mob_movement_manager.cpp | 3 +--
 EQ2/source/WorldServer/zoneserver.cpp                | 3 ++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/EQ2/source/WorldServer/LuaFunctions.cpp b/EQ2/source/WorldServer/LuaFunctions.cpp
index ae076eec7..ce5efa450 100644
--- a/EQ2/source/WorldServer/LuaFunctions.cpp
+++ b/EQ2/source/WorldServer/LuaFunctions.cpp
@@ -3396,6 +3396,9 @@ int EQ2Emu_lua_AddTimer(lua_State* state) {
 	Spawn* player = lua_interface->GetSpawn(state, 5);
 
 	SpawnScriptTimer* timer = new SpawnScriptTimer;
+	if ( time < 10)
+		time = 10;
+	
 	timer->timer = Timer::GetCurrentTime2() + time;
 	timer->function = function;
 	timer->spawn = spawn->GetID();
diff --git a/EQ2/source/WorldServer/Zone/mob_movement_manager.cpp b/EQ2/source/WorldServer/Zone/mob_movement_manager.cpp
index 14ba618d5..84103ef38 100644
--- a/EQ2/source/WorldServer/Zone/mob_movement_manager.cpp
+++ b/EQ2/source/WorldServer/Zone/mob_movement_manager.cpp
@@ -778,10 +778,9 @@ void MobMovementManager::DisruptNavigation(Entity* who)
 	if (!who->IsRunning()) {
 		who->MCommandMutex.writelock();
 		ent.second.Commands.clear();
-		MobListMutex.releasereadlock();
 		who->MCommandMutex.releasewritelock();
-		return;
 	}
+	MobListMutex.releasereadlock();
 }
 
 /**
diff --git a/EQ2/source/WorldServer/zoneserver.cpp b/EQ2/source/WorldServer/zoneserver.cpp
index f570917db..3aa62444a 100644
--- a/EQ2/source/WorldServer/zoneserver.cpp
+++ b/EQ2/source/WorldServer/zoneserver.cpp
@@ -3778,7 +3778,8 @@ void ZoneServer::CheckSpawnScriptTimers(){
 		set<SpawnScriptTimer*>::iterator itr;
 		for (itr = spawn_script_timers.begin(); itr != spawn_script_timers.end(); itr++) {
 			timer = *itr;
-			if(timer->current_count < timer->max_count && current_time >= timer->timer){
+			if(remove_spawn_script_timers_list.count(timer) == 0 && 
+				timer->current_count < timer->max_count && current_time >= timer->timer){
 				timer->current_count++;	
 				call_timers.push_back(timer);
 			}