From 965b33d16a5e98d334e401e558fde7be9d56acf9 Mon Sep 17 00:00:00 2001
From: Karlis Senko <karlis3p70l1ij@gmail.com>
Date: Sun, 22 Apr 2018 17:40:02 +0300
Subject: [PATCH] Server: add GAMEPLAY_STARTING state (#450)

Fixes issue 2962.
---
 server/CVCMIServer.cpp         | 2 +-
 server/CVCMIServer.h           | 1 +
 server/NetPacksLobbyServer.cpp | 4 ++++
 3 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/server/CVCMIServer.cpp b/server/CVCMIServer.cpp
index bd019c839..e5f9b701b 100644
--- a/server/CVCMIServer.cpp
+++ b/server/CVCMIServer.cpp
@@ -176,7 +176,7 @@ void CVCMIServer::run()
 		}
 	}
 
-	while(state == EServerState::LOBBY)
+	while(state == EServerState::LOBBY || state == EServerState::GAMEPLAY_STARTING)
 		boost::this_thread::sleep(boost::posix_time::milliseconds(50));
 
 	logNetwork->info("Thread handling connections ended");
diff --git a/server/CVCMIServer.h b/server/CVCMIServer.h
index 0dd83da55..2ef4dfef6 100644
--- a/server/CVCMIServer.h
+++ b/server/CVCMIServer.h
@@ -32,6 +32,7 @@ class CBaseForGHApply;
 enum class EServerState : ui8
 {
 	LOBBY,
+	GAMEPLAY_STARTING,
 	GAMEPLAY,
 	GAMEPLAY_ENDED,
 	SHUTDOWN
diff --git a/server/NetPacksLobbyServer.cpp b/server/NetPacksLobbyServer.cpp
index 728fe213a..ce6f5977b 100644
--- a/server/NetPacksLobbyServer.cpp
+++ b/server/NetPacksLobbyServer.cpp
@@ -115,6 +115,9 @@ bool LobbyChatMessage::checkClientPermissions(CVCMIServer * srv) const
 
 bool LobbySetMap::applyOnServer(CVCMIServer * srv)
 {
+	if(srv->state != EServerState::LOBBY)
+		return false;
+
 	srv->updateStartInfoOnMapChange(mapInfo, mapGenOpts);
 	return true;
 }
@@ -172,6 +175,7 @@ bool LobbyStartGame::applyOnServer(CVCMIServer * srv)
 		return false;
 	}
 	// Server will prepare gamestate and we announce StartInfo to clients
+	srv->state = EServerState::GAMEPLAY_STARTING;
 	srv->prepareToStartGame();
 	initializedStartInfo = std::make_shared<StartInfo>(*srv->gh->getStartInfo(true));
 	return true;