rendered paste bodyIndex: src/server/sv_main.c
===================================================================
--- src/server/sv_main.c (revision 5360)
+++ src/server/sv_main.c (working copy)
@@ -62,6 +62,8 @@
void Master_Shutdown(void);
+qboolean abandon = qfalse; /* shutdown server when all clients disconnect and don't accept new connections */
+qboolean killserver = qfalse; /* will initiate shutdown once abandon is set */
/*============================================================================ */
@@ -85,6 +87,16 @@
drop->player->inuse = qfalse;
drop->state = cs_zombie; /* become free in a few seconds */
drop->name[0] = 0;
+
+ if (abandon) {
+ int count = 0;
+ int i;
+ for (i = 0; i < sv_maxclients->value; i++)
+ if (svs.clients[i].state >= cs_connected)
+ count++;
+ if (count == 0)
+ killserver = qtrue;
+ }
}
@@ -742,6 +754,12 @@
/* TODO: send a heartbeat to the master if needed */
Master_Heartbeat();
+
+ if (abandon && killserver) {
+ abandon = qfalse;
+ killserver = qfalse;
+ SV_Shutdown("Server disconnected\n", qfalse);
+ }
}
/*============================================================================ */
@@ -922,8 +940,6 @@
Netchan_Transmit(&cl->netchan, net_message.cursize, net_message.data);
}
-
-
/**
* @brief Called when each game quits, before Sys_Quit or Sys_Error
*/
@@ -952,3 +968,13 @@
if (sv_maxclients)
sv_maxclients->flags &= ~CVAR_LATCH;
}
+
+/*
+ * @brief Will eventually shutdown the server once all clients have disconnected
+ */
+void SV_ShutdownWhenEmpty()
+{
+ abandon = qtrue;
+ /* pretend server is already dead, otherwise clients may try and reconnect */
+ Com_SetServerState(ss_dead);
+}
Index: src/qcommon/qcommon.h
===================================================================
--- src/qcommon/qcommon.h (revision 5360)
+++ src/qcommon/qcommon.h (working copy)
@@ -325,6 +325,7 @@
void SV_Init(void);
void SV_Shutdown(char *finalmsg, qboolean reconnect);
+void SV_ShutdownWhenEmpty(void);
void SV_Frame(int msec);
#endif /* QCOMMON_DEFINED */
Index: src/client/cl_main.c
===================================================================
--- src/client/cl_main.c (revision 5360)
+++ src/client/cl_main.c (working copy)
@@ -511,7 +511,8 @@
*/
void CL_Disconnect_f(void)
{
- Com_Drop();
+ SV_ShutdownWhenEmpty();
+ CL_Drop();
}