/* ================ Host_EndGame ================ */ void Host_EndGame( const char *message, ... ) { va_list argptr; static char string[MAX_SYSPATH]; va_start( argptr, message ); Q_vsprintf( string, message, argptr ); va_end( argptr ); MsgDev( D_INFO, "Host_EndGame: %s\n", string ); if( SV_Active()) { Q_snprintf( host.finalmsg, sizeof( host.finalmsg ), "Host_EndGame: %s", string ); SV_Shutdown( false ); return; } if( host.type == HOST_DEDICATED ) Sys_Break( "Host_EndGame: %s\n", string ); // dedicated servers exit SV_Shutdown( false ); CL_Disconnect(); // recreate world if needs CL_ClearEdicts (); // release all models Mod_ClearAll( true ); Host_AbortCurrentFrame (); }
/* ===================== CL_ClearState ===================== */ void CL_ClearState (void) { int i; // STRIP S_StopAllSounds (true); Con_DPrintf ("Clearing memory\n"); //D_FlushCaches (); Mod_ClearAll (); if (host_hunklevel) // FIXME: check this... Hunk_FreeToLowMark (host_hunklevel); CL_ClearTEnts (); // wipe the entire cl structure memset (&cl, 0, sizeof(cl)); SZ_Clear (&cls.netchan.message); // clear other arrays memset (cl_efrags, 0, sizeof(cl_efrags)); memset (cl_dlights, 0, sizeof(cl_dlights)); memset (cl_lightstyle, 0, sizeof(cl_lightstyle)); // // allocate the efrags and chain together into a free list // cl.free_efrags = cl_efrags; for (i=0 ; i<MAX_EFRAGS-1 ; i++) cl.free_efrags[i].entnext = &cl.free_efrags[i+1]; cl.free_efrags[i].entnext = NULL; }
void VID_Close() { Sys_Thread_LockMutex(display_mutex); #ifndef GLQUAKE VID_SW_FreeBuffers(); #endif Skin_Shutdown(); Mod_ClearAll(); SCR_Shutdown(); Sbar_Shutdown(); M_VidShutdown(); Draw_Shutdown(); CSTC_PictureShutdown(); if (display) { R_Shutdown(); Sys_Video_Close(display); display = 0; } Sys_Thread_UnlockMutex(display_mutex); }
/* ================ Host_ClearMemory This clears all the memory used by the server, but does not reinitialize anything. ================ */ void Host_ClearMemory (void) { Con_DPrintf ("Clearing memory\n"); Mod_ClearAll (); if (host_hunklevel) Hunk_FreeToLowMark (host_hunklevel); memset (&sv, 0, sizeof(sv)); }
/* ================ Host_ClearMemory This clears all the memory used by both the client and server, but does not reinitialize anything. ================ */ void Host_ClearMemory (void) { Con_DPrintf ("Clearing memory\n"); D_FlushCaches (); Mod_ClearAll (); /* host_hunklevel MUST be set at this point */ Hunk_FreeToLowMark (host_hunklevel); cls.signon = 0; memset (&sv, 0, sizeof(sv)); memset (&cl, 0, sizeof(cl)); }
/* ================ Host_ClearMemory This clears all the memory used by both the client and server, but does not reinitialize anything. ================ */ void Host_ClearMemory (void) { Con_DPrintf ("Clearing memory\n"); D_FlushCaches (); Mod_ClearAll (); /* host_hunklevel MUST be set at this point */ Hunk_FreeToLowMark (host_hunklevel); cls.signon = 0; if (sv.edicts) free(sv.edicts); // ericw -- sv.edicts switched to use malloc() memset (&sv, 0, sizeof(sv)); memset (&cl, 0, sizeof(cl)); }
//Free hunk memory up to host_hunklevel //Can only be called when changing levels! void Host_ClearMemory (void) { // FIXME, move to CL_ClearState D_FlushCaches (); // FIXME, move to CL_ClearState Mod_ClearAll (); CM_InvalidateMap (); // any data previously allocated on hunk is no longer valid Hunk_FreeToLowMark (host_hunklevel); }
/* =============== Host_ClearMemory Free hunk memory up to host_hunklevel Can only be called when changing levels! =============== */ void Host_ClearMemory () { // FIXME, move to CL_ClearState if (!dedicated) D_FlushCaches (); // FIXME, move to CL_ClearState #ifndef SERVERONLY if (!dedicated) Mod_ClearAll (); #endif CM_InvalidateMap (); // any data previously allocated on hunk is no longer valid Hunk_FreeToLowMark (host_hunklevel); }
void CL_ClearState (void) { int i; S_StopAllSounds (); // wipe the entire cl structure if (cl.serverinfo) Info_Destroy (cl.serverinfo); memset (&cl, 0, sizeof (cl)); r_data->force_fullscreen = 0; cl.maxclients = MAX_CLIENTS; // Note: we should probably hack around this and give diff values for // diff gamedirs cl.fpd = FPD_DEFAULT; cl.fbskins = FBSKINS_DEFAULT; for (i = 0; i < UPDATE_BACKUP; i++) cl.frames[i].packet_entities.entities = qw_entstates.frame[i]; cl.serverinfo = Info_ParseString ("", MAX_INFO_STRING, 0); CL_Init_Entity (&cl.viewent); Sys_MaskPrintf (SYS_DEV, "Clearing memory\n"); if (viddef.flush_caches) viddef.flush_caches (); Mod_ClearAll (); if (host_hunklevel) // FIXME: check this... Hunk_FreeToLowMark (host_hunklevel); CL_ClearEnts (); CL_ClearTEnts (); r_funcs->R_ClearState (); SZ_Clear (&cls.netchan.message); if (centerprint) dstring_clearstr (centerprint); }
/* =============== CL_ChangeGame This is experiment. Use with precaution =============== */ qboolean CL_ChangeGame( const char *gamefolder, qboolean bReset ) { if( Host_IsDedicated() ) return false; if( Q_stricmp( host.gamefolder, gamefolder )) { kbutton_t *mlook, *jlook; qboolean mlook_active = false, jlook_active = false; string mapname, maptitle; int maxEntities; mlook = (kbutton_t *)clgame.dllFuncs.KB_Find( "in_mlook" ); jlook = (kbutton_t *)clgame.dllFuncs.KB_Find( "in_jlook" ); if( mlook && ( mlook->state & 1 )) mlook_active = true; if( jlook && ( jlook->state & 1 )) jlook_active = true; // so reload all images (remote connect) Mod_ClearAll( true ); R_ShutdownImages(); FS_LoadGameInfo( (bReset) ? host.gamefolder : gamefolder ); R_InitImages(); // save parms maxEntities = clgame.maxEntities; Q_strncpy( mapname, clgame.mapname, MAX_STRING ); Q_strncpy( maptitle, clgame.maptitle, MAX_STRING ); Com_ResetLibraryError(); if( !CL_LoadProgs( va( "%s/%s", GI->dll_path, GI->client_lib))) Sys_Warn( "Can't initialize client library\n%s", Com_GetLibraryError() ); // restore parms clgame.maxEntities = maxEntities; Q_strncpy( clgame.mapname, mapname, MAX_STRING ); Q_strncpy( clgame.maptitle, maptitle, MAX_STRING ); // invalidate fonts so we can reloading them again Q_memset( &cls.creditsFont, 0, sizeof( cls.creditsFont )); SCR_InstallParticlePalette(); SCR_LoadCreditsFont(); Con_InvalidateFonts(); SCR_RegisterTextures (); CL_FreeEdicts (); SCR_VidInit (); if( cls.key_dest == key_game ) // restore mouse state clgame.dllFuncs.IN_ActivateMouse(); // restore mlook state if( mlook_active ) Cmd_ExecuteString( "+mlook\n", src_command ); if( jlook_active ) Cmd_ExecuteString( "+jlook\n", src_command ); return true; } return false; }
/* ================= Host_Error ================= */ void Host_Error( const char *error, ... ) { static char hosterror1[MAX_SYSPATH]; static char hosterror2[MAX_SYSPATH]; static qboolean recursive = false; va_list argptr; if( host.mouse_visible && !CL_IsInMenu( )) { // hide VGUI mouse #ifdef XASH_SDL SDL_ShowCursor( false ); #endif host.mouse_visible = false; } va_start( argptr, error ); Q_vsprintf( hosterror1, error, argptr ); va_end( argptr ); CL_WriteMessageHistory (); // before Q_error call if( host.framecount < 3 ) { Sys_Error( "Host_InitError: %s", hosterror1 ); } else if( host.framecount == host.errorframe ) { Sys_Error( "Host_MultiError: %s", hosterror2 ); return; } else { if( host.developer > 0 ) { UI_SetActiveMenu( false ); Key_SetKeyDest( key_console ); Msg( "^1Host_Error: ^7%s", hosterror1 ); } else MSGBOX2( hosterror1 ); } // host is shutting down. don't invoke infinite loop if( host.state == HOST_SHUTDOWN ) return; if( recursive ) { Msg( "Host_RecursiveError: %s", hosterror2 ); Sys_Error( hosterror1 ); return; // don't multiple executes } recursive = true; Q_strncpy( hosterror2, hosterror1, MAX_SYSPATH ); host.errorframe = host.framecount; // to avoid multple calls per frame Q_sprintf( host.finalmsg, "Server crashed: %s", hosterror1 ); // clear cmd buffer to prevent execution of any commands Cbuf_Clear(); SV_Shutdown( false ); CL_Drop(); // drop clients // recreate world if required CL_ClearEdicts (); // release all models Mod_ClearAll( false ); recursive = false; Host_AbortCurrentFrame(); }