[ioquake3] 20/39: Handle ERR_DROP during Com_GameRestart
Simon McVittie
smcv at debian.org
Sat Nov 5 20:26:23 UTC 2016
This is an automated email from the git hooks/post-receive script.
smcv pushed a commit to branch debian/master
in repository ioquake3.
commit c80f341711aff3fade2c61d3c45b73a543b2997d
Author: Zack Middleton <zturtleman at gmail.com>
Date: Sun Oct 9 19:17:58 2016 -0500
Handle ERR_DROP during Com_GameRestart
If ERR_DROP during Com_GameRestart after shutting down client, Com_Error
needs to restart the client otherwise there is just a black window. Also,
clear the game restarting flag in Com_Error otherwise it's not possible to
run Com_GameRestart again later.
I don't know of a way to trigger ERR_DROP, in FS_Restart for instance,
without engine changes however.
---
code/qcommon/common.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/code/qcommon/common.c b/code/qcommon/common.c
index 6d73a7b..02ada76 100644
--- a/code/qcommon/common.c
+++ b/code/qcommon/common.c
@@ -115,6 +115,7 @@ int com_frameNumber;
qboolean com_errorEntered = qfalse;
qboolean com_fullyInitialized = qfalse;
qboolean com_gameRestarting = qfalse;
+qboolean com_gameClientRestarting = qfalse;
char com_errorMessage[MAXPRINTMSG];
@@ -264,6 +265,7 @@ void QDECL Com_Error( int code, const char *fmt, ... ) {
static int lastErrorTime;
static int errorCount;
int currentTime;
+ qboolean restartClient;
if(com_errorEntered)
Sys_Error("recursive error after: %s", com_errorMessage);
@@ -296,9 +298,17 @@ void QDECL Com_Error( int code, const char *fmt, ... ) {
if (code != ERR_DISCONNECT && code != ERR_NEED_CD)
Cvar_Set("com_errorMessage", com_errorMessage);
+ restartClient = com_gameClientRestarting && !( com_cl_running && com_cl_running->integer );
+
+ com_gameRestarting = qfalse;
+ com_gameClientRestarting = qfalse;
+
if (code == ERR_DISCONNECT || code == ERR_SERVERDISCONNECT) {
VM_Forced_Unload_Start();
SV_Shutdown( "Server disconnected" );
+ if ( restartClient ) {
+ CL_Init();
+ }
CL_Disconnect( qtrue );
CL_FlushMemory( );
VM_Forced_Unload_Done();
@@ -310,6 +320,9 @@ void QDECL Com_Error( int code, const char *fmt, ... ) {
Com_Printf ("********************\nERROR: %s\n********************\n", com_errorMessage);
VM_Forced_Unload_Start();
SV_Shutdown (va("Server crashed: %s", com_errorMessage));
+ if ( restartClient ) {
+ CL_Init();
+ }
CL_Disconnect( qtrue );
CL_FlushMemory( );
VM_Forced_Unload_Done();
@@ -319,6 +332,9 @@ void QDECL Com_Error( int code, const char *fmt, ... ) {
} else if ( code == ERR_NEED_CD ) {
VM_Forced_Unload_Start();
SV_Shutdown( "Server didn't have CD" );
+ if ( restartClient ) {
+ CL_Init();
+ }
if ( com_cl_running && com_cl_running->integer ) {
CL_Disconnect( qtrue );
CL_FlushMemory( );
@@ -2362,16 +2378,14 @@ void Com_GameRestart(int checksumFeed, qboolean disconnect)
// make sure no recursion can be triggered
if(!com_gameRestarting && com_fullyInitialized)
{
- int clWasRunning;
-
com_gameRestarting = qtrue;
- clWasRunning = com_cl_running->integer;
-
+ com_gameClientRestarting = com_cl_running->integer;
+
// Kill server if we have one
if(com_sv_running->integer)
SV_Shutdown("Game directory changed");
- if(clWasRunning)
+ if(com_gameClientRestarting)
{
if(disconnect)
CL_Disconnect(qfalse);
@@ -2393,13 +2407,14 @@ void Com_GameRestart(int checksumFeed, qboolean disconnect)
NET_Restart_f();
}
- if(clWasRunning)
+ if(com_gameClientRestarting)
{
CL_Init();
CL_StartHunkUsers(qfalse);
}
com_gameRestarting = qfalse;
+ com_gameClientRestarting = qfalse;
}
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/ioquake3.git
More information about the Pkg-games-commits
mailing list