/* ============== CG_StartCamera ============== */ void CG_StartCamera( const char *name, qboolean startBlack ) { char lname[MAX_QPATH]; //if ( cg.predictedPlayerState.stats[STAT_HEALTH] <= 0 ) // don't allow camera to start if you're dead // return; COM_StripExtension(name, lname); //----(SA) added strcat( lname, ".camera" ); if (trap_loadCamera(CAM_PRIMARY, va("cameras/%s", lname))) { cg.cameraMode = qtrue; // camera on in cgame if(startBlack) CG_Fade(0, 0, 0, 255, cg.time, 0); // go black trap_Cvar_Set( "cg_letterbox", "1" ); // go letterbox //trap_SendClientCommand("startCamera"); // camera on in game trap_startCamera(CAM_PRIMARY, cg.time); // camera on in client } else { //----(SA) removed check for cams in main dir cg.cameraMode = qfalse; // camera off in cgame trap_SendClientCommand("stopCamera"); // camera off in game trap_stopCamera(CAM_PRIMARY); // camera off in client CG_Fade(0, 0, 0, 0, cg.time, 0); // ensure fadeup trap_Cvar_Set( "cg_letterbox", "0" ); CG_Printf ("Unable to load camera %s\n",lname); } }
/* ============== CG_StartCamera ============== */ void CG_StartCamera(const char *name, qboolean startBlack) { char lname[MAX_QPATH]; COM_StripExtension(name, lname, sizeof(lname)); strcat(lname, ".camera"); if (trap_loadCamera(CAM_PRIMARY, va("cameras/%s", lname))) { cg.cameraMode = qtrue; // camera on in cgame if (startBlack) { CG_Fade(0, 0, 0, 255, cg.time, 0); // go black } trap_Cvar_Set("cg_letterbox", "1"); // go letterbox //trap_SendClientCommand("startCamera"); // camera on in game trap_startCamera(CAM_PRIMARY, cg.time); // camera on in client } else { // removed check for cams in main dir cg.cameraMode = qfalse; // camera off in cgame trap_SendClientCommand("stopCamera"); // camera off in game trap_stopCamera(CAM_PRIMARY); // camera off in client CG_Fade(0, 0, 0, 0, cg.time, 0); // ensure fadeup trap_Cvar_Set("cg_letterbox", "0"); CG_Printf("Unable to load camera %s\n", lname); } }
/* ============== CG_StopCamera ============== */ void CG_StopCamera( void ) { cg.cameraMode = qfalse; // camera off in cgame trap_SendClientCommand("stopCamera"); // camera off in game trap_stopCamera(CAM_PRIMARY); // camera off in client trap_Cvar_Set( "cg_letterbox", "0" ); // fade back into world CG_Fade(0, 0, 0, 255, 0, 0); CG_Fade(0, 0, 0, 0, cg.time + 500, 2000); }
/* ============== CG_StartCamera ============== */ void CG_StartCamera( const char *name, qboolean startBlack ) { char lname[MAX_QPATH]; if ( cgs.gametype != GT_SINGLE_PLAYER ) { return; } COM_StripExtension( name, lname ); //----(SA) added strcat( lname, ".camera" ); if ( trap_loadCamera( CAM_PRIMARY, va( "cameras/%s", lname ) ) ) { cg.cameraMode = qtrue; if ( startBlack ) { CG_Fade( 0, 0, 0, 255, 0 ); // go black } trap_Cvar_Set( "cg_letterbox", "1" ); // go letterbox trap_SendClientCommand( "startCamera" ); trap_startCamera( CAM_PRIMARY, cg.time ); } else { //----(SA) temp until radiant stores cameras in own directory // check cameras dir then main dir if ( trap_loadCamera( CAM_PRIMARY, name ) ) { cg.cameraMode = qtrue; trap_SendClientCommand( "startCamera" ); trap_startCamera( CAM_PRIMARY, cg.time ); return; } //----(SA) end (remove when radiant stores cameras...) trap_SendClientCommand( "stopCamera" ); CG_Fade( 0, 0, 0, 0, 0 ); // ensure fadeup trap_Cvar_Set( "cg_letterbox", "0" ); cg.cameraMode = qfalse; CG_Printf( "Unable to load camera %s\n",lname ); } }
/* ===================== CG_ParseScreenFade ===================== */ static void CG_ParseScreenFade( void ) { const char *info; char *token; float fadealpha; int fadestart, fadeduration; info = CG_ConfigString( CS_SCREENFADE ); token = COM_Parse( &info ); fadealpha = atof( token ); token = COM_Parse( &info ); fadestart = atoi( token ); token = COM_Parse( &info ); fadeduration = atoi( token ); CG_Fade( 0, 0, 0, (int)( fadealpha * 255.0f ), fadestart, fadeduration ); }
static void CG_Fade_f( void ) { int r, g, b, a; float time; if ( trap_Argc() < 6 ) { return; } r = atof( CG_Argv( 1 ) ); g = atof( CG_Argv( 2 ) ); b = atof( CG_Argv( 3 ) ); a = atof( CG_Argv( 4 ) ); time = atof( CG_Argv( 5 ) ) * 1000; CG_Fade( r, g, b, a, time ); }
static void CG_Fade_f( void ) { int r, g, b, a; float duration; if ( trap_Argc() < 6 ) { return; } r = atof(CG_Argv(1)); g = atof(CG_Argv(2)); b = atof(CG_Argv(3)); a = atof(CG_Argv(4)); duration = atof(CG_Argv(5)) * 1000; CG_Fade(r, g, b, a, cg.time, duration); }
/* =============== CG_CalcViewValues Sets cg.refdef view values =============== */ static int CG_CalcViewValues( void ) { playerState_t *ps; memset( &cg.refdef, 0, sizeof( cg.refdef ) ); // calculate size of 3D view CG_CalcVrect(); ps = &cg.predictedPlayerState; if ( cg.cameraMode ) { vec3_t origin, angles; float fov = 90; float x; if ( trap_getCameraInfo( CAM_PRIMARY, cg.time, &origin, &angles, &fov ) ) { VectorCopy( origin, cg.refdef.vieworg ); angles[ROLL] = 0; angles[PITCH] = -angles[PITCH]; // (SA) compensate for reversed pitch (this makes the game match the editor, however I'm guessing the real fix is to be done there) VectorCopy( angles, cg.refdefViewAngles ); AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); x = cg.refdef.width / tan( fov / 360 * M_PI ); cg.refdef.fov_y = atan2( cg.refdef.height, x ); cg.refdef.fov_y = cg.refdef.fov_y * 360 / M_PI; cg.refdef.fov_x = fov; trap_SendClientCommand( va( "setCameraOrigin %f %f %f", origin[0], origin[1], origin[2] ) ); return 0; } else { cg.cameraMode = qfalse; // camera off in cgame trap_Cvar_Set( "cg_letterbox", "0" ); trap_SendClientCommand( "stopCamera" ); // camera off in game trap_stopCamera( CAM_PRIMARY ); // camera off in client CG_Fade( 0, 0, 0, 255, 0, 0 ); // go black CG_Fade( 0, 0, 0, 0, cg.time + 200, 1500 ); // then fadeup } } // intermission view if ( ps->pm_type == PM_INTERMISSION ) { VectorCopy( ps->origin, cg.refdef.vieworg ); VectorCopy( ps->viewangles, cg.refdefViewAngles ); AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); return CG_CalcFov(); } cg.bobcycle = ( ps->bobCycle & 128 ) >> 7; cg.bobfracsin = fabs( sin( ( ps->bobCycle & 127 ) / 127.0 * M_PI ) ); cg.xyspeed = sqrt( ps->velocity[0] * ps->velocity[0] + ps->velocity[1] * ps->velocity[1] ); VectorCopy( ps->origin, cg.refdef.vieworg ); VectorCopy( ps->viewangles, cg.refdefViewAngles ); // add error decay if ( cg_errorDecay.value > 0 ) { int t; float f; t = cg.time - cg.predictedErrorTime; f = ( cg_errorDecay.value - t ) / cg_errorDecay.value; if ( f > 0 && f < 1 ) { VectorMA( cg.refdef.vieworg, f, cg.predictedError, cg.refdef.vieworg ); } else { cg.predictedErrorTime = 0; } } // Ridah, lock the viewangles if the game has told us to if ( ps->viewlocked ) { /* if (ps->viewlocked == 4) { centity_t *tent; tent = &cg_entities[ps->viewlocked_entNum]; VectorCopy (tent->currentState.apos.trBase, cg.refdefViewAngles); } else */ BG_EvaluateTrajectory( &cg_entities[ps->viewlocked_entNum].currentState.apos, cg.time, cg.refdefViewAngles ); if ( ps->viewlocked == 2 ) { cg.refdefViewAngles[0] += crandom(); cg.refdefViewAngles[1] += crandom(); } } // done. if ( cg.renderingThirdPerson ) { // back away from character CG_OffsetThirdPersonView(); } else { // offset for local bobbing and kicks CG_OffsetFirstPersonView(); // Ridah, lock the viewangles if the game has told us to if ( ps->viewlocked == 4 ) { vec3_t fwd; AngleVectors( cg.refdefViewAngles, fwd, NULL, NULL ); VectorMA( cg_entities[ps->viewlocked_entNum].currentState.pos.trBase, 16, fwd, cg.refdef.vieworg ); } else if ( ps->viewlocked ) { vec3_t fwd; float oldZ; // set our position to be behind it oldZ = cg.refdef.vieworg[2]; AngleVectors( cg.refdefViewAngles, fwd, NULL, NULL ); VectorMA( cg_entities[ps->viewlocked_entNum].currentState.pos.trBase, -34, fwd, cg.refdef.vieworg ); cg.refdef.vieworg[2] = oldZ; } // done. } // position eye relative to origin AnglesToAxis( cg.refdefViewAngles, cg.refdef.viewaxis ); if ( cg.hyperspace ) { cg.refdef.rdflags |= RDF_NOWORLDMODEL | RDF_HYPERSPACE; } // field of view return CG_CalcFov(); }
static void CG_ServerCommand( void ) { const char *cmd; char text[MAX_SAY_TEXT]; cmd = CG_Argv( 0 ); if ( !cmd[0] ) { // server claimed the command return; } if ( !strcmp( cmd, "startCam" ) ) { CG_StartCamera( CG_Argv( 1 ), atoi( CG_Argv( 2 ) ) ); return; } if ( !strcmp( cmd, "stopCam" ) ) { CG_StopCamera(); return; } if ( !strcmp( cmd, "mvspd" ) ) { CG_RequestMoveSpeed( CG_Argv( 1 ) ); return; } if ( !strcmp( cmd, "dp" ) ) { // dynamite print (what a hack :( CG_CenterPrint( va( "%s %d %s", CG_translateString( "dynamitetimer" ), atoi( CG_Argv( 1 ) ), CG_translateString( "seconds" ) ), SCREEN_HEIGHT - ( SCREEN_HEIGHT * 0.25 ), SMALLCHAR_WIDTH ); return; } if ( !strcmp( cmd, "cp" ) ) { CG_CenterPrint( CG_Argv( 1 ), SCREEN_HEIGHT - ( SCREEN_HEIGHT * 0.25 ), SMALLCHAR_WIDTH ); return; } if ( !strcmp( cmd, "cs" ) ) { CG_ConfigStringModified(); return; } if ( !strcmp( cmd, "print" ) ) { CG_Printf( "%s", CG_Argv( 1 ) ); #ifdef MISSIONPACK cmd = CG_Argv( 1 ); // yes, this is obviously a hack, but so is the way we hear about // votes passing or failing if ( !Q_stricmpn( cmd, "vote failed", 11 ) || !Q_stricmpn( cmd, "team vote failed", 16 ) ) { trap_S_StartLocalSound( cgs.media.voteFailed, CHAN_ANNOUNCER ); } else if ( !Q_stricmpn( cmd, "vote passed", 11 ) || !Q_stricmpn( cmd, "team vote passed", 16 ) ) { trap_S_StartLocalSound( cgs.media.votePassed, CHAN_ANNOUNCER ); } #endif return; } if ( !strcmp( cmd, "chat" ) ) { if ( !cg_teamChatsOnly.integer ) { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_Printf( "%s\n", text ); } return; } if ( !strcmp( cmd, "tchat" ) ) { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_AddToTeamChat( text ); CG_Printf( "%s\n", text ); return; } // NERVE - SMF - limbo chat if ( !strcmp( cmd, "lchat" ) ) { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); // CG_AddToLimboChat( text ); trap_UI_LimboChat( text ); CG_Printf( "%s\n", text ); return; } // -NERVE - SMF if ( !strcmp( cmd, "vchat" ) ) { // CG_VoiceChat( SAY_ALL ); return; } if ( !strcmp( cmd, "vtchat" ) ) { // CG_VoiceChat( SAY_TEAM ); return; } if ( !strcmp( cmd, "vtell" ) ) { // CG_VoiceChat( SAY_TELL ); return; } if ( !strcmp( cmd, "scores" ) ) { CG_ParseScores(); return; } if ( !strcmp( cmd, "tinfo" ) ) { CG_ParseTeamInfo(); return; } if ( !strcmp( cmd, "map_restart" ) ) { CG_MapRestart(); return; } if ( Q_stricmp( cmd, "remapShader" ) == 0 ) { if ( trap_Argc() == 4 ) { trap_R_RemapShader( CG_Argv( 1 ), CG_Argv( 2 ), CG_Argv( 3 ) ); } } // loaddeferred can be both a servercmd and a consolecmd if ( !strcmp( cmd, "loaddeferred" ) ) { // spelling fixed (SA) CG_LoadDeferredPlayers(); return; } // clientLevelShot is sent before taking a special screenshot for // the menu system during development if ( !strcmp( cmd, "clientLevelShot" ) ) { cg.levelShot = qtrue; return; } // NERVE - SMF if ( !Q_stricmp( cmd, "oid" ) ) { CG_ObjectivePrint( CG_Argv( 2 ), SMALLCHAR_WIDTH, atoi( CG_Argv( 1 ) ) ); return; } // -NERVE - SMF // // music // // loops \/ if ( !strcmp( cmd, "mu_start" ) ) { // has optional parameter for fade-up time int fadeTime = 0; // default to instant start Q_strncpyz( text, CG_Argv( 2 ), MAX_SAY_TEXT ); if ( text && strlen( text ) ) { fadeTime = atoi( text ); } trap_S_StartBackgroundTrack( CG_Argv( 1 ), CG_Argv( 1 ), fadeTime ); return; } // plays once then back to whatever the loop was \/ if ( !strcmp( cmd, "mu_play" ) ) { // has optional parameter for fade-up time int fadeTime = 0; // default to instant start Q_strncpyz( text, CG_Argv( 2 ), MAX_SAY_TEXT ); if ( text && strlen( text ) ) { fadeTime = atoi( text ); } trap_S_StartBackgroundTrack( CG_Argv( 1 ), "onetimeonly", fadeTime ); return; } if ( !strcmp( cmd, "mu_stop" ) ) { // has optional parameter for fade-down time int fadeTime = 0; // default to instant stop Q_strncpyz( text, CG_Argv( 1 ), MAX_SAY_TEXT ); if ( text && strlen( text ) ) { fadeTime = atoi( text ); } trap_S_FadeBackgroundTrack( 0.0f, fadeTime, 0 ); trap_S_StartBackgroundTrack( "", "", -2 ); // '-2' for 'queue looping track' (QUEUED_PLAY_LOOPED) return; } if ( !strcmp( cmd, "mu_fade" ) ) { trap_S_FadeBackgroundTrack( atof( CG_Argv( 1 ) ), atoi( CG_Argv( 2 ) ), 0 ); return; } if ( !strcmp( cmd, "snd_fade" ) ) { trap_S_FadeAllSound( atof( CG_Argv( 1 ) ), atoi( CG_Argv( 2 ) ) ); return; } if ( !strcmp( cmd, "rockandroll" ) ) { // map loaded, game is ready to begin. CG_Fade( 0, 0, 0, 255, cg.time, 0 ); // go black trap_UI_Popup( "pregame" ); // start pregame menu trap_Cvar_Set( "cg_norender", "1" ); // don't render the world until the player clicks in and the 'playerstart' func has been called (g_main in G_UpdateCvars() ~ilne 949) trap_S_FadeAllSound( 1.0f, 1000 ); // fade sound up return; } // ensure a file gets into a build (mainly for scripted music calls) if ( !strcmp( cmd, "addToBuild" ) ) { fileHandle_t f; if ( !cg_buildScript.integer ) { return; } // just open the file so it gets copied to the build dir //CG_FileTouchForBuild(CG_Argv(1)); trap_FS_FOpenFile( CG_Argv( 1 ), &f, FS_READ ); trap_FS_FCloseFile( f ); return; } CG_Printf( "Unknown client game command: %s\n", cmd ); }