void SCR_UpdateScreen (void) { VID_UpdateGamma(false); if (!scr_initialized) return; if (vid_hidden) return; // unbind everything to start the frame with a clean slate GL_UnbindBuffers (); GL_UnbindTextures (); SCR_CalcRefdef (); // Do 3D drawing first, followed by 2D, and then finally a finish command V_RenderView (); GL_Set2D (); if (r_netgraph.value) R_DrawNetGraph (); if (cl.intermission == 1 && key_dest != key_menu) { Sbar_IntermissionOverlay (); Con_ClearNotify (); } else if (cl.intermission == 2 && key_dest != key_menu) { Sbar_FinaleOverlay (); SCR_CheckDrawCenterString (); Con_ClearNotify (); } if (cls.state == ca_active) { SCR_DrawNet (); SCR_DrawTurtle (); SCR_DrawPause (); if (!cl.intermission) { if (key_dest != key_menu) Draw_Crosshair (); SCR_CheckDrawCenterString (); SCR_DrawSpeed (); SCR_DrawFPS (); Sbar_Draw (); } } SCR_DrawConsole (); M_Draw (); Draw_EndBatching (); VID_Finish (); }
/* =============== SCR_EndLoadingPlaque ================ */ void SCR_EndLoadingPlaque (void) { scr_disabled_for_loading = qfalse; scr_fullupdate = 0; Con_ClearNotify (); CDAudio_Resume(); }
/* =============== SCR_BeginLoadingPlaque ================ */ void SCR_BeginLoadingPlaque (void) { CDAudio_Pause(); S_StopAllSounds (qtrue); if (cls.state != ca_connected) return; if (cls.signon != SIGNONS) return; // redraw with no console and the loading plaque Con_ClearNotify (); scr_centertime_off = 0; scr_con_current = 0; scr_drawloading = qtrue; scr_fullupdate = 0; Sbar_Changed (); SCR_UpdateScreen (); scr_drawloading = qfalse; scr_disabled_for_loading = qtrue; scr_disabled_time = realtime; scr_fullupdate = 0; }
/* ==================== CL_InitCGame Should only be called by CL_StartHunkUsers ==================== */ 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 cgvm = VM_Create("cgame", CL_CgameSystemCalls, VMI_NATIVE); if (!cgvm) { Com_Error(ERR_DROP, "VM_Create on cgame failed"); } 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 // bani - added clc.demoplaying, since some mods need this at init time, and drawactiveframe is too late for them VM_Call(cgvm, CG_INIT, clc.serverMessageSequence, clc.lastExecutedServerCommand, clc.clientNum, clc.demoplaying, qtrue); // 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(); // update the memory usage file CL_UpdateLevelHunkUsage(); }
/* ==================== CL_InitCGame Should only be called by CL_StartHunkUsers ==================== */ void CL_InitCGame( void ) { const char *info; const char *mapname; int t1, t2; vmInterpret_t interpret; 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 if ( cl_connectedToPureServer != 0 ) { // if sv_pure is set we only allow qvms to be loaded interpret = VMI_COMPILED; } else { interpret = Cvar_VariableValue( "vm_cgame" ); } cgvm = VM_Create( "cgame", CL_CgameSystemCalls, interpret ); if ( !cgvm ) { Com_Error( ERR_DROP, "VM_Create on cgame failed" ); } 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 VM_Call( cgvm, CG_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_DPrintf( "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 (); CL_WriteClientLog( va("`~=-----------------=~`\n MAP: %s \n`~=-----------------=~`\n", mapname ) ); }
/* =============== SCR_BeginLoadingPlaque ================ */ void SCR_BeginLoadingPlaque (void) { S_StopAllSounds (true); CDAudio_Stop (); // Stop the CD music if (cls.state != ca_connected) return; if (cls.signon != SIGNONS) return; // redraw with no console and the loading plaque Con_ClearNotify (); // remove all center prints con_lastcenterstring[0] = 0; scr_centerstring[0] = 0; scr_centertime_off = 0; scr_con_current = 0; scr_drawloading = true; Sbar_Changed (); SCR_UpdateScreen (); scr_drawloading = false; scr_disabled_for_loading = true; scr_disabled_time = realtime; SCR_SetTimeout (SCR_DEFTIMEOUT); }
/* =============== SCR_EndLoadingPlaque ================ */ void SCR_EndLoadingPlaque (void) { scr_disabled_for_loading = false; scr_fullupdate = 0; scr_topupdate = 0; Con_ClearNotify (); }
/* ================ SCR_EndLoadingPlaque ================ */ void SCR_EndLoadingPlaque (qboolean clear) { cls.disable_screen = 0; // mattx86: a work-around for notify lines + console + not breaking this function if (clear) Con_ClearNotify (); }
/* * Con_Close */ void Con_Close( void ) { scr_con_current = 0; Con_ClearTyping(); Con_ClearNotify(); Key_ClearStates(); }
/* ----------------------------------------------------------------------------- Function: Parameters: Returns: Notes: ----------------------------------------------------------------------------- */ PUBLIC void Client_PrepRefresh( const char *r_mapname ) { char mapname[ 32 ]; if( ! r_mapname || ! *r_mapname ) { return; } if( g_version->value == SPEAROFDESTINY ) { spritelocation = SODSPRITESDIRNAME; } else { spritelocation = WL6SPRITESDIRNAME; } my_strlcpy( mapname, r_mapname, sizeof( mapname ) ); // skip "maps/" // !@# fix crash bug if you type something short... if ( strlen( mapname ) > 4 && !strcmp( mapname + strlen( mapname ) - 4, ".map" ) ) { mapname[ strlen( mapname ) - 4 ] = '\0'; // cut off ".map" } // register models, pics, and skins R_BeginRegistration( mapname ); if( r_world == NULL ) { return; } Com_Printf( "Map: %s\n", r_world->mapName ); Level_ScanInfoPlane( r_world ); // Spawn items/guards Com_Printf( "Spawning Entities\n" ); PL_Spawn( r_world->pSpawn, r_world ); // Spawn Player Com_Printf( "Caching Textures and Sounds\n" ); Level_PrecacheTextures_Sound( r_world ); // clear any lines of console text Con_ClearNotify(); if( r_world->musicName ) { Sound_StartBGTrack( r_world->musicName, r_world->musicName ); } Player.playstate = ex_playing; }
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 }
/* ============== SCR_CenterPrint Called for important messages that should stay in the center of the screen for a few moments ============== */ void SCR_CenterPrint (char *str) { char *s; char line[64]; int i, j, l; strncpy (scr_centerstring, str, sizeof(scr_centerstring)-1); scr_centertime_off = scr_centertime->value; scr_centertime_start = cl.time; // count the number of lines for centering scr_center_lines = 1; s = str; while (*s) { if (*s == '\n') scr_center_lines++; s++; } // echo it to the console 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"); s = str; do { // scan the width of the line for (l=0 ; l<40 ; l++) if (s[l] == '\n' || !s[l]) break; for (i=0 ; i<(40-l)/2 ; i++) line[i] = ' '; for (j=0 ; j<l ; j++) { line[i++] = s[j]; } line[i] = '\n'; line[i+1] = 0; Com_Printf ("%s", line); while (*s && *s != '\n') s++; if (!*s) break; s++; // skip the \n } while (1); 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"); Con_ClearNotify (); }
/* ================ Con_Resize ================ */ void Con_Resize (console_t *con) { int i, j, width, oldwidth, oldtotallines, numlines, numchars; char tbuf[CON_TEXTSIZE]; //GAJA STRIP width = (vid.width >> 3) - 2; if (width == con_linewidth) return; if (width < 1) // video hasn't been initialized yet { width = 38; con_linewidth = width; con_totallines = CON_TEXTSIZE / con_linewidth; Q_memset (con->text, ' ', CON_TEXTSIZE); } else { oldwidth = con_linewidth; con_linewidth = width; oldtotallines = con_totallines; con_totallines = CON_TEXTSIZE / con_linewidth; numlines = oldtotallines; if (con_totallines < numlines) numlines = con_totallines; numchars = oldwidth; if (con_linewidth < numchars) numchars = con_linewidth; Q_memcpy (tbuf, con->text, CON_TEXTSIZE); Q_memset (con->text, ' ', CON_TEXTSIZE); for (i=0 ; i<numlines ; i++) { for (j=0 ; j<numchars ; j++) { con->text[(con_totallines - 1 - i) * con_linewidth + j] = tbuf[((con->current - i + oldtotallines) % oldtotallines) * oldwidth + j]; } } Con_ClearNotify (); } con->current = con_totallines - 1; con->display = con->current; }
void Con_Close( void ) { if ( !com_cl_running->integer ) { return; } Field_Clear( &g_consoleField ); Con_ClearNotify(); cls.keyCatchers &= ~KEYCATCH_CONSOLE; con.finalFrac = 0; // none visible con.displayFrac = 0; }
/* ================ Con_ToggleChat_f ================ */ void Con_ToggleChat_f (void) { Key_ClearTyping (); if (key_dest == key_console) { if (cls.state == ca_active) key_dest = key_game; } else key_dest = key_console; Con_ClearNotify (); }
/* ================ Con_ToggleConsole_f ================ */ void Con_ToggleConsole_f (void) { // closing a full screen console restarts the demo loop if ( cls.state == CA_DISCONNECTED && Key_GetCatcher( ) == KEYCATCH_CONSOLE ) { CL_StartDemoLoop(); return; } if( con_autoclear->integer ) Field_Clear( &g_consoleField ); g_consoleField.widthInChars = g_console_field_width; Con_ClearNotify (); Key_SetCatcher( Key_GetCatcher( ) ^ KEYCATCH_CONSOLE ); }
/* ================== CL_ScreenShot_f normal screenshot ================== */ void CL_ScreenShot_f( void ) { int i; string checkname; // scan for a free filename for( i = 0; i <= 9999; i++ ) { CL_ScreenshotGetName( i, checkname ); if( !FS_FileExists( checkname )) break; } Con_ClearNotify(); re->ScrShot( checkname, VID_SCREENSHOT ); }
/* ===================== CL_Spawn ===================== */ void CL_Spawn (void) { // first update is the final signon stage cls.state = ca_active; if (cls.demoplayback) host_skipframe = true; if (!cls.demoplayback) VID_SetCaption (va(PROGRAM ": %s", cls.servername)); Con_ClearNotify (); SCR_EndLoadingPlaque (); TP_ExecTrigger ("f_spawn"); }
/* ================ Con_ToggleConsole_f ================ */ void Con_ToggleConsole_f( void ) { con.acLength = 0; if ( con_restricted->integer && ( !keys[ K_CTRL ].down || !keys[ K_SHIFT ].down ) ) { return; } // ydnar: persistent console input is more useful // Arnout: added cvar if ( con_autoclear->integer ) { Field_Clear( &g_consoleField ); } g_consoleField.widthInChars = g_console_field_width; Con_ClearNotify(); // ydnar: multiple console size support if ( cls.keyCatchers & KEYCATCH_CONSOLE ) { cls.keyCatchers &= ~KEYCATCH_CONSOLE; con.desiredFrac = 0.0; } else { cls.keyCatchers |= KEYCATCH_CONSOLE; // short console if ( keys[ K_CTRL ].down ) { con.desiredFrac = ( 5.0 * SMALLCHAR_HEIGHT ) / cls.glconfig.vidHeight; } // full console else if ( keys[ K_ALT ].down ) { con.desiredFrac = 1.0; } // half-screen console else { con.desiredFrac = 0.5; } } }
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 ); cls.state = CA_LOADING; // init for this gamestate VM_Call( CG_INIT, clc.serverCommandSequence ); // reset any CVAR_CHEAT cvars registered by cgame if ( !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 (); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void SCR_BeginLoadingPlaque (void) { S_StopAllSounds (true); if (cls.state != ca_connected && cls.state != ca_active) return; // redraw with no console and the loading plaque Con_ClearNotify (); SCR_CenterStringOff(); scr_drawloading = true; SCR_UpdateScreen (); SCR_UpdateScreen (); scr_disabled_for_loading = true; scr_disabled_time = realtime; }
void SCR_BeginLoadingPlaque (void) { S_StopAllSounds(); if(cls.state != ca_connected || cls.signon != SIGNONS) return; // Redraw with no console and the loading plaque Con_ClearNotify (); scr_centertime_off = 0; scr_con_current = 0; g_menu->AddState(MENU_STATE_LOADING); Video_Frame(); g_menu->RemoveState(MENU_STATE_LOADING); scr_disabled_for_loading = true; scr_disabled_time = realtime; }
/* * Con_ToggleConsole_f */ void Con_ToggleConsole_f( void ) { SCR_EndLoadingPlaque(); // get rid of loading plaque if( cls.state == CA_GETTING_TICKET || cls.state == CA_CONNECTING || cls.state == CA_CONNECTED ) return; Con_ClearTyping(); Con_ClearNotify(); if( cls.key_dest == key_console ) { // close console CL_SetKeyDest( cls.old_key_dest ); } else { // open console CL_SetOldKeyDest( cls.key_dest ); CL_SetKeyDest( key_console ); } }
/* =============== SCR_BeginLoadingPlaque ================ */ void SCR_BeginLoadingPlaque(void) { S_StopAllSounds(true); if (cls.state != ca_active) return; // redraw with no console and the loading plaque Con_ClearNotify(); scr_centertime_off = 0; scr_con_current = 0; scr_drawloading = true; scr_fullupdate = 0; Sbar_Changed(); SCR_UpdateScreen(); scr_drawloading = false; scr_disabled_for_loading = true; scr_disabled_time = realtime; scr_fullupdate = 0; }
void SCR_EndLoadingPlaque(void) { cls.disable_screen = 0; Con_ClearNotify(); }
/* * Called for important messages that should stay * in the center of the screen for a few moments */ void SCR_CenterPrint(char *str) { char *s; char line[64]; int i, j, l; Q_strlcpy(scr_centerstring, str, sizeof(scr_centerstring)); scr_centertime_off = scr_centertime->value; scr_centertime_start = cl.time; /* count the number of lines for centering */ scr_center_lines = 1; s = str; while (*s) { if (*s == '\n') { scr_center_lines++; } s++; } /* echo it to the console */ 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"); s = str; do { /* scan the width of the line */ for (l = 0; l < 40; l++) { if ((s[l] == '\n') || !s[l]) { break; } } for (i = 0; i < (40 - l) / 2; i++) { line[i] = ' '; } for (j = 0; j < l; j++) { line[i++] = s[j]; } line[i] = '\n'; line[i + 1] = 0; Com_Printf("%s", line); while (*s && *s != '\n') { s++; } if (!*s) { break; } s++; /* skip the \n */ } while (1); 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"); Con_ClearNotify(); }
void SCR_CenterPrint (char *str)//, PalIdx_t colour) { char *s, *last, *start, *write_pos, *save_pos; int num_chars; int num_lines; int width; bool done = false; bool spaced; if (!str) { scr_centertime_off = 0; return; } // scr_font = string("medium"); // RWL - commented out // width = viddef.width / 8; // rjr hardcoded yuckiness width = 640 / 8; // rjr hardcoded yuckiness width -= 4; // RWL - commented out /* if (cl.frame.playerstate.remote_type != REMOTE_TYPE_LETTERBOX) { width -= 30; } */ scr_centertime_off = scr_centertime->value; Com_Printf("\n"); num_lines = 0; write_pos = scr_centerstring; scr_center_lines = 0; spaced = false; for(s = start = str, last=NULL, num_chars = 0; !done ; s++) { num_chars++; if ((*s) == ' ') { spaced = true; last = s; scr_centertime_off += 0.2;//give them an extra 0.05 second for each character } if ((*s) == '\n' || (*s) == 0) { last = s; num_chars = width; spaced = true; } if (num_chars >= width) { scr_centertime_off += 0.8;//give them an extra half second for each newline if (!last) { last = s; } if (!spaced) { last++; } save_pos = write_pos; strncpy(write_pos, start, last-start); write_pos += last-start; *write_pos = 0; write_pos++; Com_Printf ("%s\n", save_pos); // RWL - commented out // scr_center_widths[scr_center_lines] = re.StrlenFont(save_pos, scr_font);; scr_center_widths[scr_center_lines] = 640; scr_center_lines++; if ((*s) == NULL || scr_center_lines >= MAX_SCR_LINES) { done = true; } else { s = last; if (spaced) { last++; } start = last; last = NULL; num_chars = 0; spaced = false; } continue; } } // echo it to the console Com_Printf("\n\n"); Con_ClearNotify (); }
/* =============== SCR_EndLoadingPlaque ================ */ void SCR_EndLoadingPlaque (void) { scr_disabled_for_loading = false; Con_ClearNotify (); }
// Call before entering a new level, or after changing dlls void CLQ2_PrepRefresh() { if ( !cl.q2_configstrings[ Q2CS_MODELS + 1 ][ 0 ] ) { return; // no map loaded } // let the render dll load the map char mapname[ 32 ]; String::Cpy( mapname, cl.q2_configstrings[ Q2CS_MODELS + 1 ] + 5 ); // skip "maps/" mapname[ String::Length( mapname ) - 4 ] = 0; // cut off ".bsp" // register models, pics, and skins common->Printf( "Map: %s\r", mapname ); SCR_UpdateScreen(); R_BeginRegistrationAndLoadWorld( mapname ); common->Printf( " \r" ); // precache status bar pics common->Printf( "pics\r" ); SCR_UpdateScreen(); SCRQ2_InitHudShaders(); SCR_TouchPics(); common->Printf( " \r" ); CLQ2_RegisterTEntModels(); clq2_num_weaponmodels = 1; String::Cpy( clq2_weaponmodels[ 0 ], "weapon.md2" ); for ( int i = 1; i < MAX_MODELS_Q2 && cl.q2_configstrings[ Q2CS_MODELS + i ][ 0 ]; i++ ) { char name[ MAX_QPATH ]; String::Cpy( name, cl.q2_configstrings[ Q2CS_MODELS + i ] ); name[ 37 ] = 0; // never go beyond one line if ( name[ 0 ] != '*' ) { common->Printf( "%s\r", name ); } SCR_UpdateScreen(); if ( name[ 0 ] == '#' ) { // special player weapon model if ( clq2_num_weaponmodels < MAX_CLIENTWEAPONMODELS_Q2 ) { String::NCpy( clq2_weaponmodels[ clq2_num_weaponmodels ], cl.q2_configstrings[ Q2CS_MODELS + i ] + 1, sizeof ( clq2_weaponmodels[ clq2_num_weaponmodels ] ) - 1 ); clq2_num_weaponmodels++; } } else { cl.model_draw[ i ] = R_RegisterModel( cl.q2_configstrings[ Q2CS_MODELS + i ] ); if ( name[ 0 ] == '*' ) { cl.model_clip[ i ] = CM_InlineModel( String::Atoi( cl.q2_configstrings[ Q2CS_MODELS + i ] + 1 ) ); } else { cl.model_clip[ i ] = 0; } } if ( name[ 0 ] != '*' ) { common->Printf( " \r" ); } } common->Printf( "images\r" ); SCR_UpdateScreen(); for ( int i = 1; i < MAX_IMAGES_Q2 && cl.q2_configstrings[ Q2CS_IMAGES + i ][ 0 ]; i++ ) { cl.q2_image_precache[ i ] = CLQ2_RegisterPicShader( cl.q2_configstrings[ Q2CS_IMAGES + i ] ); } common->Printf( " \r" ); for ( int i = 0; i < MAX_CLIENTS_Q2; i++ ) { if ( !cl.q2_configstrings[ Q2CS_PLAYERSKINS + i ][ 0 ] ) { continue; } common->Printf( "client %i\r", i ); SCR_UpdateScreen(); CLQ2_ParseClientinfo( i ); common->Printf( " \r" ); } CLQ2_LoadClientinfo( &cl.q2_baseclientinfo, "unnamed\\male/grunt" ); // set sky textures and speed common->Printf( "sky\r" ); SCR_UpdateScreen(); float rotate = String::Atof( cl.q2_configstrings[ Q2CS_SKYROTATE ] ); vec3_t axis; sscanf( cl.q2_configstrings[ Q2CS_SKYAXIS ], "%f %f %f", &axis[ 0 ], &axis[ 1 ], &axis[ 2 ] ); R_SetSky( cl.q2_configstrings[ Q2CS_SKY ], rotate, axis ); common->Printf( " \r" ); R_EndRegistration(); // clear any lines of console text Con_ClearNotify(); SCR_UpdateScreen(); cl.q2_refresh_prepped = true; // start the cd track CDAudio_Play( String::Atoi( cl.q2_configstrings[ Q2CS_CDTRACK ] ), true ); }
/* =================== CL_GetServerCommand Set up argc/argv for the given command =================== */ qboolean CL_GetServerCommand( int serverCommandNumber ) { char *s; char *cmd; static char bigConfigString[BIG_INFO_STRING]; int argc; // if we have irretrievably lost a reliable command, drop the connection if ( serverCommandNumber <= clc.serverCommandSequence - MAX_RELIABLE_COMMANDS ) { // when a demo record was started after the client got a whole bunch of // reliable commands then the client never got those first reliable commands if ( clc.demoplaying ) return qfalse; Com_Error( ERR_DROP, "CL_GetServerCommand: a reliable command was cycled out" ); return qfalse; } if ( serverCommandNumber > clc.serverCommandSequence ) { Com_Error( ERR_DROP, "CL_GetServerCommand: requested a command not received" ); return qfalse; } s = clc.serverCommands[ serverCommandNumber & ( MAX_RELIABLE_COMMANDS - 1 ) ]; clc.lastExecutedServerCommand = serverCommandNumber; Com_DPrintf( "serverCommand: %i : %s\n", serverCommandNumber, s ); rescan: Cmd_TokenizeString( s ); cmd = Cmd_Argv(0); argc = Cmd_Argc(); if ( !strcmp( cmd, "disconnect" ) ) { // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=552 // allow server to indicate why they were disconnected if ( argc >= 2 ) Com_Error( ERR_SERVERDISCONNECT, "Server disconnected - %s", Cmd_Argv( 1 ) ); else Com_Error( ERR_SERVERDISCONNECT, "Server disconnected\n" ); } if ( !strcmp( cmd, "bcs0" ) ) { Com_sprintf( bigConfigString, BIG_INFO_STRING, "cs %s \"%s", Cmd_Argv(1), Cmd_Argv(2) ); return qfalse; } if ( !strcmp( cmd, "bcs1" ) ) { s = Cmd_Argv(2); if( strlen(bigConfigString) + strlen(s) >= BIG_INFO_STRING ) { Com_Error( ERR_DROP, "bcs exceeded BIG_INFO_STRING" ); } strcat( bigConfigString, s ); return qfalse; } if ( !strcmp( cmd, "bcs2" ) ) { s = Cmd_Argv(2); if( strlen(bigConfigString) + strlen(s) + 1 >= BIG_INFO_STRING ) { Com_Error( ERR_DROP, "bcs exceeded BIG_INFO_STRING" ); } strcat( bigConfigString, s ); strcat( bigConfigString, "\"" ); s = bigConfigString; goto rescan; } if ( !strcmp( cmd, "cs" ) ) { CL_ConfigstringModified(); // reparse the string, because CL_ConfigstringModified may have done another Cmd_TokenizeString() Cmd_TokenizeString( s ); return qtrue; } if ( !strcmp( cmd, "map_restart" ) ) { // clear notify lines and outgoing commands before passing // the restart to the cgame Con_ClearNotify(); Com_Memset( cl.cmds, 0, sizeof( cl.cmds ) ); return qtrue; } // the clientLevelShot command is used during development // to generate 128*128 screenshots from the intermission // point of levels for the menu system to use // we pass it along to the cgame to make apropriate adjustments, // but we also clear the console and notify lines here if ( !strcmp( cmd, "clientLevelShot" ) ) { // don't do it if we aren't running the server locally, // otherwise malicious remote servers could overwrite // the existing thumbnails if ( !com_sv_running->integer ) { return qfalse; } // close the console Con_Close(); // take a special screenshot next frame Cbuf_AddText( "wait ; wait ; wait ; wait ; screenshot levelshot\n" ); return qtrue; } // we may want to put a "connect to other server" command here // cgame can now act on the command return qtrue; }