void QDECL Com_Error( int code, const char *fmt, ... ) { va_list argptr; // when we are running automated scripts, make sure we // know if anything failed if ( com_buildScript && com_buildScript->integer ) { code = ERR_FATAL; } if ( com_errorEntered ) { Sys_Error( "recursive error after: %s", com_errorMessage ); } com_errorEntered = qtrue; //reset some game stuff here // SCR_UnprecacheScreenshot(); va_start (argptr,fmt); Q_vsnprintf (com_errorMessage, sizeof(com_errorMessage), fmt, argptr); va_end (argptr); if ( code != ERR_DISCONNECT ) { Cvar_Get("com_errorMessage", "", CVAR_ROM); //give com_errorMessage a default so it won't come back to life after a resetDefaults Cvar_Set("com_errorMessage", com_errorMessage); } SG_Shutdown(); // close any file pointers if ( code == ERR_DISCONNECT ) { SV_Shutdown("Disconnect", qtrue); CL_Disconnect(); CL_FlushMemory(); CL_StartHunkUsers(); com_errorEntered = qfalse; throw ("DISCONNECTED\n"); } else if ( code == ERR_DROP ) { // If loading/saving caused the crash/error - delete the temp file SG_WipeSavegame("current"); // delete file SV_Shutdown (va("Server crashed: %s\n", com_errorMessage), qtrue); CL_Disconnect(); CL_FlushMemory(); CL_StartHunkUsers(); Com_Printf (S_COLOR_RED"********************\n"S_COLOR_MAGENTA"ERROR: %s\n"S_COLOR_RED"********************\n", com_errorMessage); com_errorEntered = qfalse; throw ("DROPPED\n"); } else { CL_Shutdown (); SV_Shutdown (va(S_COLOR_RED"Server fatal crashed: %s\n", com_errorMessage), qtrue); } Com_Shutdown (); Sys_Error ("%s", com_errorMessage); }
void NORETURN QDECL Com_Error( int code, const char *fmt, ... ) { va_list argptr; static int lastErrorTime; static int errorCount; int currentTime; if ( com_errorEntered ) { Sys_Error( "recursive error after: %s", com_errorMessage ); } com_errorEntered = qtrue; // when we are running automated scripts, make sure we // know if anything failed if ( com_buildScript && com_buildScript->integer ) { code = ERR_FATAL; } // if we are getting a solid stream of ERR_DROP, do an ERR_FATAL currentTime = Sys_Milliseconds(); if ( currentTime - lastErrorTime < 100 ) { if ( ++errorCount > 3 ) { code = ERR_FATAL; } } else { errorCount = 0; } lastErrorTime = currentTime; #ifdef JK2_MODE SCR_UnprecacheScreenshot(); #endif va_start (argptr,fmt); Q_vsnprintf (com_errorMessage, sizeof(com_errorMessage), fmt, argptr); va_end (argptr); if ( code != ERR_DISCONNECT ) { Cvar_Get("com_errorMessage", "", CVAR_ROM); //give com_errorMessage a default so it won't come back to life after a resetDefaults Cvar_Set("com_errorMessage", com_errorMessage); } SG_Shutdown(); // close any file pointers if ( code == ERR_DISCONNECT || code == ERR_DROP ) { throw code; } else { SV_Shutdown (va("Server fatal crashed: %s\n", com_errorMessage)); CL_Shutdown (); } Com_Shutdown (); Sys_Error ("%s", com_errorMessage); }