/* ===================== CL_ClearState ===================== */ void CL_ClearState (void) { int i; extern float scr_centertime_off; S_StopAllSounds (true); Com_DPrintf ("Clearing memory\n"); if (!com_serveractive) { Host_ClearMemory (); } CL_ClearTEnts (); CL_ClearDlights (); CL_ClearParticles (); CL_ClearNails (); for (i = 0; i < UPDATE_BACKUP; i++) Q_free (cl.frames[i].packet_entities.entities); // 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_lightstyle, 0, sizeof(cl_lightstyle)); memset (cl_entities, 0, sizeof(cl_entities)); cl_entframecount = 2; // so that cl_entframecount - 1 != 0 cl.viewheight = DEFAULT_VIEWHEIGHT; cl.minpitch = -70; cl.maxpitch = 80; V_NewMap (); // make sure no centerprint messages are left from previous level scr_centertime_off = 0; // // 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; }
/* ================ CL_InitParticles ================ */ void CL_InitParticles( void ) { int i; cl_particles = Mem_Alloc( cls.mempool, sizeof( particle_t ) * GI->max_particles ); CL_ClearParticles (); // this is used for EF_BRIGHTFIELD for( i = 0; i < NUMVERTEXNORMALS; i++ ) { cl_avelocities[i][0] = Com_RandomLong( 0, 255 ) * 0.01f; cl_avelocities[i][1] = Com_RandomLong( 0, 255 ) * 0.01f; cl_avelocities[i][2] = Com_RandomLong( 0, 255 ) * 0.01f; } tracerred = Cvar_Get( "tracerred", "0.8", 0, "tracer red component weight ( 0 - 1.0 )" ); tracergreen = Cvar_Get( "tracergreen", "0.8", 0, "tracer green component weight ( 0 - 1.0 )" ); tracerblue = Cvar_Get( "tracerblue", "0.4", 0, "tracer blue component weight ( 0 - 1.0 )" ); traceralpha = Cvar_Get( "traceralpha", "0.5", 0, "tracer alpha amount ( 0 - 1.0 )" ); tracerspeed = Cvar_Get( "tracerspeed", "6000", 0, "tracer speed" ); tracerlength = Cvar_Get( "tracerlength", "0.8", 0, "tracer length factor" ); traceroffset = Cvar_Get( "traceroffset", "30", 0, "tracer starting offset" ); }
/* ================== NQD_ParseServerData ================== */ static void NQD_ParseServerData (void) { char *str; int i; int nummodels, numsounds; char mapname[MAX_QPATH]; int cs2; qbool gpl_map; #ifdef GLQUAKE extern qbool r_gpl_map; #endif Com_DPrintf ("Serverdata packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number i = MSG_ReadLong (); if (i != NQ_PROTOCOL_VERSION) Host_Error ("Server returned version %i, not %i", i, NQ_PROTOCOL_VERSION); // parse maxclients nq_maxclients = MSG_ReadByte (); if (nq_maxclients < 1 || nq_maxclients > NQ_MAX_CLIENTS) Host_Error ("Bad maxclients (%u) from server", nq_maxclients); // parse gametype cl.gametype = MSG_ReadByte() ? GAME_DEATHMATCH : GAME_COOP; // parse signon message str = MSG_ReadString (); strlcpy (cl.levelname, str, sizeof(cl.levelname)); // separate the printfs so the server message can have a color Com_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Com_Printf ("%c%s\n", 2, str); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models for (nummodels=1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels == MAX_MODELS) Host_Error ("Server sent too many model precaches"); strlcpy (cl.model_name[nummodels], str, sizeof(cl.model_name[0])); Mod_TouchModel (str); } // precache sounds for (numsounds=1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds == MAX_SOUNDS) Host_Error ("Server sent too many sound precaches"); strlcpy (cl.sound_name[numsounds], str, sizeof(cl.sound_name[0])); S_TouchSound (str); } // // now we try to load everything else until a cache allocation fails // cl.clipmodels[1] = CM_LoadMap (cl.model_name[1], true, NULL, &cl.map_checksum2); COM_StripExtension (COM_SkipPath(cl.model_name[1]), mapname); cs2 = Com_TranslateMapChecksum (mapname, cl.map_checksum2); gpl_map = (cl.map_checksum2 != cs2); cl.map_checksum2 = cs2; #ifdef GLQUAKE r_gpl_map = gpl_map; #endif for (i = 1; i < nummodels; i++) { cl.model_precache[i] = Mod_ForName (cl.model_name[i], false, i == 1); if (cl.model_precache[i] == NULL) Host_Error ("Model %s not found", cl.model_name[i]); if (cl.model_name[i][0] == '*') cl.clipmodels[i] = CM_InlineModel(cl.model_name[i]); } for (i=1 ; i<numsounds ; i++) { cl.sound_precache[i] = S_PrecacheSound (cl.sound_name[i]); } // local state if (!cl.model_precache[1]) Host_Error ("NQD_ParseServerData: NULL worldmodel"); COM_StripExtension (COM_SkipPath (cl.model_name[1]), mapname); Cvar_ForceSet (&host_mapname, mapname); CL_ClearParticles (); CL_FindModelNumbers (); R_NewMap (cl.model_precache[1]); TP_NewMap (); Hunk_Check (); // make sure nothing is hurt nq_signon = 0; nq_num_entities = 0; nq_drawpings = false; // unless we have the ProQuake extension cl.servertime_works = true; cl.allow_fbskins = true; r_refdef2.allow_cheats = true; // why not cls.state = ca_onserver; }
/* ============== CL_ClearEffects ============== */ void CL_ClearEffects (void) { CL_ClearParticles (); CL_ClearDlights (); CL_ClearLightStyles (); }