/* CL_ClearState */ void CL_ClearState (void) { int i; S_StopAllSounds (true); Con_DPrintf ("Clearing memory\n"); D_FlushCaches (); Mod_ClearAll (); if (host_hunklevel) // FIXME: check this... Hunk_FreeToLowMark (host_hunklevel); CL_ClearEnts (); 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 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); }