network.c
changeset 4716 d9ca1be9d04b
parent 4417 629dddc17a65
child 4826 63b1eb7c966b
--- a/network.c	Tue Oct 03 16:05:11 2006 +0000
+++ b/network.c	Tue Oct 03 16:15:34 2006 +0000
@@ -286,6 +286,42 @@
 	return GetString(buf, network_error_strings[err]);
 }
 
+/* Count the number of active clients connected */
+static uint NetworkCountPlayers(void)
+{
+	NetworkClientState *cs;
+	uint count = 0;
+
+	FOR_ALL_CLIENTS(cs) {
+		NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
+		if (ci->client_playas > 0 && ci->client_playas <= MAX_PLAYERS) count++;
+	}
+
+	return count;
+}
+
+static bool _min_players_paused = false;
+
+/* Check if the minimum number of players has been reached and pause or unpause the game as appropriate */
+void CheckMinPlayers(void)
+{
+	if (!_network_dedicated) return;
+
+	if (NetworkCountPlayers() < _network_min_players) {
+		if (_min_players_paused) return;
+
+		_min_players_paused = true;
+		DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
+		NetworkServer_HandleChat(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0, "Game paused (not enough players)", NETWORK_SERVER_INDEX);
+	} else {
+		if (!_min_players_paused) return;
+
+		_min_players_paused = false;
+		DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
+		NetworkServer_HandleChat(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0, "Game unpaused (enough players)", NETWORK_SERVER_INDEX);
+	}
+}
+
 // Find all IP-aliases for this host
 static void NetworkFindIPs(void)
 {
@@ -626,6 +662,8 @@
 	cs->status = STATUS_INACTIVE;
 	cs->index = NETWORK_EMPTY_INDEX;
 	ci->client_index = NETWORK_EMPTY_INDEX;
+
+	CheckMinPlayers();
 }
 
 // A client wants to connect to a server
@@ -1041,6 +1079,9 @@
 	// if the server is dedicated ... add some other script
 	if (_network_dedicated) IConsoleCmdExec("exec scripts/on_dedicated.scr 0");
 
+	_min_players_paused = false;
+	CheckMinPlayers();
+
 	/* Try to register us to the master server */
 	_network_last_advertise_frame = 0;
 	_network_need_advertise = true;