void CL_InitCGame( void ) { const char *info; const char *mapname; int t1, t2; t1 = Sys_Milliseconds(); // put away the console Con_Close(); // find the current mapname info = cl.gameState.stringData + cl.gameState.stringOffsets[ CS_SERVERINFO ]; mapname = Info_ValueForKey( info, "mapname" ); Com_sprintf( cl.mapname, sizeof( cl.mapname ), "maps/%s.bsp", mapname ); // load the dll or bytecode //OJKFIXME: pure servers CL_BindCGame(); cls.state = CA_LOADING; // init for this gamestate // use the lastExecutedServerCommand instead of the serverCommandSequence // otherwise server commands sent just before a gamestate are dropped CGVM_Init( clc.serverMessageSequence, clc.lastExecutedServerCommand, clc.clientNum ); // reset any CVAR_CHEAT cvars registered by cgame if ( !clc.demoplaying && !cl_connectedToCheatServer ) Cvar_SetCheatState(); // we will send a usercmd this frame, which // will cause the server to send us the first snapshot cls.state = CA_PRIMED; t2 = Sys_Milliseconds(); Com_Printf( "CL_InitCGame: %5.2f seconds\n", (t2-t1)/1000.0 ); // have the renderer touch all its images, so they are present // on the card even if the driver does deferred loading re->EndRegistration(); // make sure everything is paged in // if (!Sys_LowPhysicalMemory()) { Com_TouchMemory(); } // clear anything that got printed Con_ClearNotify (); #ifdef _DONETPROFILE_ ClReadProf().Reset(); #endif }
/* ==================== CL_ShutdonwCGame ==================== */ void CL_ShutdownCGame( qboolean delayFreeVM ) { Key_SetCatcher( Key_GetCatcher( ) & ~KEYCATCH_CGAME ); if ( !cls.cgameStarted ) return; cls.cgameStarted = qfalse; // CL_UnbindCGame(); #ifdef _DONETPROFILE_ ClReadProf().ShowTotals(); #endif }
/* ===================== CL_ParseCommandString Command strings are just saved off until cgame asks for them when it transitions a snapshot ===================== */ void CL_ParseCommandString( msg_t *msg ) { char *s; int seq; int index; #ifdef _DONETPROFILE_ int startBytes,endBytes; startBytes=msg->readcount; #endif seq = MSG_ReadLong( msg ); s = MSG_ReadString( msg ); #ifdef _DONETPROFILE_ endBytes=msg->readcount; ClReadProf().AddField("svc_serverCommand",endBytes-startBytes); #endif // see if we have already executed stored it off if ( clc.serverCommandSequence >= seq ) { return; } clc.serverCommandSequence = seq; index = seq & (MAX_RELIABLE_COMMANDS-1); Q_strncpyz( clc.serverCommands[ index ], s, sizeof( clc.serverCommands[ index ] ) ); }
/* ===================== CL_ParseCommandString Command strings are just saved off until cgame asks for them when it transitions a snapshot ===================== */ void CL_ParseCommandString( msg_t *msg ) { char *s; int seq; int index; #ifdef _DONETPROFILE_ int startBytes,endBytes; startBytes=msg->readcount; #endif seq = MSG_ReadLong( msg ); s = MSG_ReadString( msg ); #ifdef _DONETPROFILE_ endBytes=msg->readcount; ClReadProf().AddField("svc_serverCommand",endBytes-startBytes); #endif // see if we have already executed stored it off if ( clc.serverCommandSequence >= seq ) { return; } clc.serverCommandSequence = seq; index = seq & (MAX_RELIABLE_COMMANDS-1); /* if (s[0] == 'c' && s[1] == 's' && s[2] == ' ' && s[3] == '0' && s[4] == ' ') { //yes.. we seem to have an incoming server info. char *f = strstr(s, "g_debugMelee"); if (f) { while (*f && *f != '\\') { //find the \ after it f++; } if (*f == '\\') { //got it int i = 0; f++; while (*f && *f != '\\' && i < 128) { hiddenCvarVal[i] = *f; i++; f++; } hiddenCvarVal[i] = 0; //don't worry about backing over beginning of string I guess, //we already know we successfully strstr'd the initial string //which exceeds this length. //MSG_ReadString appears to just return a static buffer so I //can stomp over its contents safely. f--; *f = '\"'; f--; *f = ' '; f--; *f = '0'; f--; *f = ' '; f--; *f = 's'; f--; *f = 'c'; //the normal configstring gets to start here... s = f; } } } */ Q_strncpyz( clc.serverCommands[ index ], s, sizeof( clc.serverCommands[ index ] ) ); }