- Improve game_restart:
* differing screen resolutions and network settings are now honoured when changing fs_game * Fix hunk memory leak on game_restart * Move cls.state and cls.servername to clc so connection state is fully preserved over game_restart * Revert back to previous fs_game after disconnecting from a server that triggered a game_restart * Fix error dialog popping up after every game_restart if an error happened previously (reported by Ensiform) - Fixed that not all commands added by CL_Init() would be removed by CL_Shutdown()
This commit is contained in:
parent
adc143e050
commit
dee3724a13
17 changed files with 354 additions and 191 deletions
|
@ -338,7 +338,7 @@ void QDECL Com_Error( int code, const char *fmt, ... ) {
|
|||
longjmp (abortframe, -1);
|
||||
} else {
|
||||
VM_Forced_Unload_Start();
|
||||
CL_Shutdown (va("Client fatal crashed: %s", com_errorMessage));
|
||||
CL_Shutdown (va("Client fatal crashed: %s", com_errorMessage), qtrue);
|
||||
SV_Shutdown (va("Server fatal crashed: %s", com_errorMessage));
|
||||
VM_Forced_Unload_Done();
|
||||
}
|
||||
|
@ -363,7 +363,7 @@ void Com_Quit_f( void ) {
|
|||
char *p = Cmd_Args( );
|
||||
if ( !com_errorEntered ) {
|
||||
SV_Shutdown (p[0] ? p : "Server quit");
|
||||
CL_Shutdown (p[0] ? p : "Client quit");
|
||||
CL_Shutdown (p[0] ? p : "Client quit", qtrue);
|
||||
Com_Shutdown ();
|
||||
FS_Shutdown(qtrue);
|
||||
}
|
||||
|
@ -2386,34 +2386,46 @@ Change to a new mod properly with cleaning up cvars before switching.
|
|||
==================
|
||||
*/
|
||||
|
||||
void Com_GameRestart(int checksumFeed, qboolean clientRestart)
|
||||
void Com_GameRestart(int checksumFeed, qboolean disconnect)
|
||||
{
|
||||
// make sure no recursion can be triggered
|
||||
if(!com_gameRestarting && com_fullyInitialized)
|
||||
{
|
||||
int clWasRunning = com_cl_running->integer;
|
||||
|
||||
com_gameRestarting = qtrue;
|
||||
|
||||
if(clientRestart)
|
||||
{
|
||||
CL_Disconnect(qfalse);
|
||||
CL_ShutdownAll();
|
||||
}
|
||||
|
||||
// Kill server if we have one
|
||||
if(com_sv_running->integer)
|
||||
SV_Shutdown("Game directory changed");
|
||||
|
||||
if(clWasRunning)
|
||||
{
|
||||
if(disconnect)
|
||||
CL_Disconnect(qfalse);
|
||||
|
||||
CL_Shutdown("Game directory changed", disconnect);
|
||||
}
|
||||
|
||||
FS_Restart(checksumFeed);
|
||||
|
||||
// Clean out any user and VM created cvars
|
||||
Cvar_Restart(qtrue);
|
||||
Com_ExecuteCfg();
|
||||
|
||||
// shut down sound system before restart
|
||||
CL_Snd_Shutdown();
|
||||
|
||||
if(clientRestart)
|
||||
if(disconnect)
|
||||
{
|
||||
// We don't want to change any network settings if gamedir
|
||||
// change was triggered by a connect to server because the
|
||||
// new network settings might make the connection fail.
|
||||
NET_Restart_f();
|
||||
}
|
||||
|
||||
if(clWasRunning)
|
||||
{
|
||||
CL_Init();
|
||||
CL_StartHunkUsers(qfalse);
|
||||
}
|
||||
|
||||
com_gameRestarting = qfalse;
|
||||
}
|
||||
|
@ -2761,6 +2773,7 @@ void Com_Init( char *commandLine ) {
|
|||
com_maxfpsMinimized = Cvar_Get( "com_maxfpsMinimized", "0", CVAR_ARCHIVE );
|
||||
com_abnormalExit = Cvar_Get( "com_abnormalExit", "0", CVAR_ROM );
|
||||
com_busyWait = Cvar_Get("com_busyWait", "0", CVAR_ARCHIVE);
|
||||
Cvar_Get("com_errorMessage", "", CVAR_ROM | CVAR_NORESTART);
|
||||
|
||||
com_introPlayed = Cvar_Get( "com_introplayed", "0", CVAR_ARCHIVE);
|
||||
|
||||
|
|
|
@ -3875,19 +3875,16 @@ FS_ConditionalRestart
|
|||
restart if necessary
|
||||
=================
|
||||
*/
|
||||
qboolean FS_ConditionalRestart(int checksumFeed)
|
||||
qboolean FS_ConditionalRestart(int checksumFeed, qboolean disconnect)
|
||||
{
|
||||
if(fs_gamedirvar->modified)
|
||||
{
|
||||
Com_GameRestart(checksumFeed, qfalse);
|
||||
Com_GameRestart(checksumFeed, disconnect);
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
else if(checksumFeed != fs_checksumFeed)
|
||||
{
|
||||
FS_Restart(checksumFeed);
|
||||
return qtrue;
|
||||
}
|
||||
|
||||
return qfalse;
|
||||
}
|
||||
|
|
|
@ -597,7 +597,7 @@ qboolean FS_Initialized( void );
|
|||
void FS_InitFilesystem ( void );
|
||||
void FS_Shutdown( qboolean closemfp );
|
||||
|
||||
qboolean FS_ConditionalRestart( int checksumFeed );
|
||||
qboolean FS_ConditionalRestart(int checksumFeed, qboolean disconnect);
|
||||
void FS_Restart( int checksumFeed );
|
||||
// shutdown and restart the filesystem so changes to fs_gamedir can take effect
|
||||
|
||||
|
@ -813,7 +813,7 @@ void QDECL Com_Printf( const char *fmt, ... ) __attribute__ ((format (printf,
|
|||
void QDECL Com_DPrintf( const char *fmt, ... ) __attribute__ ((format (printf, 1, 2)));
|
||||
void QDECL Com_Error( int code, const char *fmt, ... ) __attribute__ ((format (printf, 2, 3)));
|
||||
void Com_Quit_f( void );
|
||||
void Com_GameRestart(int checksumFeed, qboolean clientRestart);
|
||||
void Com_GameRestart(int checksumFeed, qboolean disconnect);
|
||||
|
||||
int Com_Milliseconds( void ); // will be journaled properly
|
||||
unsigned Com_BlockChecksum( const void *buffer, int length );
|
||||
|
@ -868,6 +868,7 @@ extern int time_backend; // renderer backend time
|
|||
extern int com_frameTime;
|
||||
|
||||
extern qboolean com_errorEntered;
|
||||
extern qboolean com_fullyInitialized;
|
||||
|
||||
extern fileHandle_t com_journalFile;
|
||||
extern fileHandle_t com_journalDataFile;
|
||||
|
@ -957,7 +958,7 @@ void CL_InitKeyCommands( void );
|
|||
|
||||
void CL_Init( void );
|
||||
void CL_Disconnect( qboolean showMainMenu );
|
||||
void CL_Shutdown( char *finalmsg );
|
||||
void CL_Shutdown(char *finalmsg, qboolean disconnect);
|
||||
void CL_Frame( int msec );
|
||||
qboolean CL_GameCommand( void );
|
||||
void CL_KeyEvent (int key, qboolean down, unsigned time);
|
||||
|
@ -987,12 +988,15 @@ void CL_ForwardCommandToServer( const char *string );
|
|||
void CL_CDDialog( void );
|
||||
// bring up the "need a cd to play" dialog
|
||||
|
||||
void CL_ShutdownAll( void );
|
||||
// shutdown all the client stuff
|
||||
|
||||
void CL_FlushMemory( void );
|
||||
// dump all memory on an error
|
||||
|
||||
void CL_ShutdownAll(qboolean shutdownRef);
|
||||
// shutdown client
|
||||
|
||||
void CL_InitRef(void);
|
||||
// initialize renderer interface
|
||||
|
||||
void CL_StartHunkUsers( qboolean rendererOnly );
|
||||
// start all the client stuff using the hunk
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue