/* ============== CG_ParseFog float near dist float far dist float density float[3] r,g,b int time ============== */ static void CG_ParseFog( void ) { const char *info; char *token; float ne, fa, r, g, b, density; int time; info = CG_ConfigString( CS_FOGVARS ); token = COM_Parse( &info ); ne = atof( token ); token = COM_Parse( &info ); if ( !token || !token[0] ) { // set to 'no fog' // 'FOG_MAP' is not registered, so it will always make fog go away trap_R_SetFog( FOG_CMD_SWITCHFOG, FOG_MAP, (int)ne, 0, 0, 0, 0 ); return; } fa = atof( token ); token = COM_Parse( &info ); density = atof( token ); token = COM_Parse( &info ); r = atof( token ); token = COM_Parse( &info ); g = atof( token ); token = COM_Parse( &info ); b = atof( token ); token = COM_Parse( &info ); time = atoi( token ); trap_R_SetFog( FOG_SERVER, (int)ne, (int)fa, r, g, b, density ); trap_R_SetFog( FOG_CMD_SWITCHFOG, FOG_SERVER, time, 0, 0, 0, 0 ); }
/* ================ CG_Respawn A respawn happened this snapshot ================ */ void CG_Respawn( qboolean revived ) { int bank; cg.serverRespawning = qfalse; // Arnout: just in case // no error decay on player movement cg.thisFrameTeleport = qtrue; // need to reset client-side weapon animations cg.predictedPlayerState.weapAnim = ( ( cg.predictedPlayerState.weapAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | PM_IdleAnimForWeapon(cg.snap->ps.weapon); // reset weapon animations cg.predictedPlayerState.weaponstate = WEAPON_READY; // hmm, set this? what to? // display weapons available cg.weaponSelectTime = cg.time; cg.cursorHintIcon = 0; cg.cursorHintTime = 0; cg.cameraMode = qfalse; //----(SA) get out of camera for sure // select the weapon the server says we are using cg.weaponSelect = cg.snap->ps.weapon; // DHM - Nerve :: Clear even more things on respawn cg.zoomedBinoc = qfalse; cg.zoomedScope = qfalse; cg.zoomTime = 0; cg.zoomval = 0; trap_SendConsoleCommand( "-zoom\n" ); cg.binocZoomTime = 0; // clear pmext memset( &cg.pmext, 0, sizeof(cg.pmext) ); cg.pmext.bAutoReload = (cg_autoReload.integer > 0); cg.pmext.sprintTime = SPRINTTIME; if( !revived ) { cgs.limboLoadoutSelected = qfalse; // set lastWeapSelInBank to the current weapon CG_WeaponIndex(cg.weaponSelect, &bank, NULL); cg.lastWeapSelInBank[bank] = cg.weaponSelect; } if( cg.predictedPlayerState.stats[STAT_PLAYER_CLASS] == PC_COVERTOPS ) { cg.pmext.silencedSideArm = 1; } cg.proneMovingTime = 0; // reset fog to world fog (if present) trap_R_SetFog(FOG_CMD_SWITCHFOG, FOG_MAP,20,0,0,0,0); // dhm - end }
/* ============== CG_DrawSkyBoxPortal ============== */ void CG_DrawSkyBoxPortal( void ) { static float lastfov = 90; // for transitions back from zoomed in modes refdef_t backuprefdef; float fov_x; float fov_y; float x; char *cstr; char *token; float zoomFov; float f; static qboolean foginited = qfalse; // only set the portal fog values once if ( !( cstr = (char *)CG_ConfigString( CS_SKYBOXORG ) ) || !strlen( cstr ) ) { // no skybox in this map return; } // if they are waiting at the mission stats screen, show the stats if ( cg_gameType.integer == GT_SINGLE_PLAYER ) { if ( strlen( cg_missionStats.string ) > 1 ) { return; } } backuprefdef = cg.refdef; if ( cg_skybox.integer ) { token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring\n" ); } cg.refdef.vieworg[0] = atof( token ); token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring\n" ); } cg.refdef.vieworg[1] = atof( token ); token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring\n" ); } cg.refdef.vieworg[2] = atof( token ); token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring\n" ); } fov_x = atoi( token ); if ( !fov_x ) { fov_x = 90; } // setup fog the first time, ignore this part of the configstring after that token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog state\n" ); } else { vec4_t fogColor; int fogStart, fogEnd; if ( atoi( token ) ) { // this camera has fog if ( 1 ) { token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog[0]\n" ); } fogColor[0] = atof( token ); token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog[1]\n" ); } fogColor[1] = atof( token ); token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { CG_Error( "CG_DrawSkyBoxPortal: error parsing skybox configstring. No fog[2]\n" ); } fogColor[2] = atof( token ); token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { fogStart = 0; } else { fogStart = atoi( token ); } token = COM_ParseExt( &cstr, qfalse ); if ( !token || !token[0] ) { fogEnd = 0; } else { fogEnd = atoi( token ); } trap_R_SetFog( FOG_PORTALVIEW, fogStart, fogEnd, fogColor[0], fogColor[1], fogColor[2], 1.1 ); foginited = qtrue; } } else { if ( !foginited ) { trap_R_SetFog( FOG_PORTALVIEW, 0,0,0,0,0,0 ); // init to null foginited = qtrue; } } } //----(SA) end if ( cg.predictedPlayerState.pm_type == PM_INTERMISSION ) { // if in intermission, use a fixed value fov_x = 90; } else { // user selectable if ( cgs.dmflags & DF_FIXED_FOV ) { // dmflag to prevent wide fov for all clients fov_x = 90; } else { fov_x = cg_fov.value; if ( fov_x < 1 ) { fov_x = 1; } else if ( fov_x > 160 ) { fov_x = 160; } } // account for zooms if ( cg.zoomval ) { zoomFov = cg.zoomval; // (SA) use user scrolled amount if ( zoomFov < 1 ) { zoomFov = 1; } else if ( zoomFov > 160 ) { zoomFov = 160; } } else { zoomFov = lastfov; } // do smooth transitions for the binocs if ( cg.zoomedBinoc ) { // binoc zooming in f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME; if ( f > 1.0 ) { fov_x = zoomFov; } else { fov_x = fov_x + f * ( zoomFov - fov_x ); } lastfov = fov_x; } else if ( cg.zoomval ) { // zoomed by sniper/snooper fov_x = cg.zoomval; lastfov = fov_x; } else { // binoc zooming out f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME; if ( f <= 1.0 ) { fov_x = zoomFov + f * ( fov_x - zoomFov ); } } } if ( cg.weaponSelect == WP_SNOOPERSCOPE ) { cg.refdef.rdflags |= RDF_SNOOPERVIEW; } else { cg.refdef.rdflags &= ~RDF_SNOOPERVIEW; } if ( cg.snap->ps.persistant[PERS_HWEAPON_USE] ) { fov_x = 55; } x = cg.refdef.width / tan( fov_x / 360 * M_PI ); fov_y = atan2( cg.refdef.height, x ); fov_y = fov_y * 360 / M_PI; cg.refdef.fov_x = fov_x; cg.refdef.fov_y = fov_y; cg.refdef.rdflags |= RDF_SKYBOXPORTAL; cg.refdef.rdflags |= RDF_DRAWSKYBOX; } else { // end if(cg_skybox.integer) cg.refdef.rdflags |= RDF_SKYBOXPORTAL; cg.refdef.rdflags &= ~RDF_DRAWSKYBOX; } cg.refdef.time = cg.time; // draw the skybox trap_R_RenderScene( &cg.refdef ); cg.refdef = backuprefdef; }
/* ================ CG_Respawn A respawn happened this snapshot ================ */ void CG_Respawn(qboolean revived) { static int oldTeam = -1; static int oldCls = -1; cg.serverRespawning = qfalse; // just in case // no error decay on player movement cg.thisFrameTeleport = qtrue; // need to reset client-side weapon animations cg.predictedPlayerState.weapAnim = ((cg.predictedPlayerState.weapAnim & ANIM_TOGGLEBIT) ^ ANIM_TOGGLEBIT) | PM_IdleAnimForWeapon(cg.snap->ps.weapon); // reset weapon animations cg.predictedPlayerState.weaponstate = WEAPON_READY; // hmm, set this? what to? // display weapons available cg.weaponSelectTime = cg.time; cg.cursorHintIcon = 0; cg.cursorHintTime = 0; // select the weapon the server says we are using cg.weaponSelect = cg.snap->ps.weapon; // clear even more things on respawn cg.zoomedBinoc = qfalse; cg.zoomedScope = qfalse; cg.zoomTime = 0; cg.zoomval = 0; trap_SendConsoleCommand("-zoom\n"); cg.binocZoomTime = 0; // ensure scoped weapons are reset after revive if (revived) { if (cg.snap->ps.weapon == WP_FG42SCOPE) { CG_FinishWeaponChange(WP_FG42SCOPE, WP_FG42); } if (cg.snap->ps.weapon == WP_GARAND_SCOPE) { CG_FinishWeaponChange(WP_GARAND_SCOPE, WP_GARAND); } if (cg.snap->ps.weapon == WP_K43_SCOPE) { CG_FinishWeaponChange(WP_K43_SCOPE, WP_K43); } } // clear pmext memset(&cg.pmext, 0, sizeof(cg.pmext)); cg.pmext.bAutoReload = (cg_autoReload.integer > 0); cg.pmext.sprintTime = SPRINTTIME; if (!revived) { cgs.limboLoadoutSelected = qfalse; } // Saves the state of sidearm (riflenade weapon is considered as one too) // Puts the silencer on if class is COVERTOPS // Puts riflenade on if current weapon is riflenade weapon if (cg.predictedPlayerState.stats[STAT_PLAYER_CLASS] == PC_COVERTOPS) { cg.pmext.silencedSideArm = 1; } else if (cg.predictedPlayerState.weapon == WP_GPG40 || cg.predictedPlayerState.weapon == WP_M7) { cg.pmext.silencedSideArm = 2; } cg.proneMovingTime = 0; // reset fog to world fog (if present) trap_R_SetFog(FOG_CMD_SWITCHFOG, FOG_MAP, 20, 0, 0, 0, 0); // try to exec a cfg file if it is found if (!revived) { if ((cgs.clientinfo[cg.clientNum].team == TEAM_AXIS || cgs.clientinfo[cg.clientNum].team == TEAM_ALLIES) && (cgs.clientinfo[cg.clientNum].cls != oldCls)) { CG_execFile(va("autoexec_%s", BG_ClassnameForNumberFilename(cgs.clientinfo[cg.clientNum].cls))); oldCls = cgs.clientinfo[cg.clientNum].cls; } if (cgs.clientinfo[cg.clientNum].team != oldTeam) { CG_execFile(va("autoexec_%s", BG_TeamnameForNumber(cgs.clientinfo[cg.clientNum].team))); oldTeam = cgs.clientinfo[cg.clientNum].team; } } }