From f9a8b76c0f912cea66eacf71162a3090fda698d8 Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Sun, 19 Jan 2014 11:44:43 +0100 Subject: 0.1.6 --- src/cgame/cg_buildable.c | 164 +++++++++++++++++++++++++++++---------------- src/cgame/cg_consolecmds.c | 1 + src/cgame/cg_draw.c | 13 ++-- src/cgame/cg_local.h | 35 +++++----- src/cgame/cg_main.c | 45 +++++++------ src/cgame/cg_players.c | 28 +++++++- src/cgame/cg_scanner.c | 72 +++++++++++++++----- src/cgame/cg_servercmds.c | 35 +++++++--- src/cgame/cg_tutorial.c | 91 +++++++++---------------- src/cgame/cg_view.c | 12 ++++ src/cgame/cg_weapons.c | 12 +++- 11 files changed, 318 insertions(+), 190 deletions(-) (limited to 'src/cgame') diff --git a/src/cgame/cg_buildable.c b/src/cgame/cg_buildable.c index b1d40b0..0c851b0 100644 --- a/src/cgame/cg_buildable.c +++ b/src/cgame/cg_buildable.c @@ -683,7 +683,7 @@ void CG_InitBuildables( void ) } } - cg.buildablesFraction = (float)i / (float)( BA_NUM_BUILDABLES - 1 ); + cg.buildablesFraction = (float)i / (float)( CUBOID_FIRST - 1 ); trap_UpdateScreen( ); } @@ -1024,19 +1024,20 @@ void CG_GhostBuildable( buildable_t buildable, vec3_t dims ) if(BG_Buildable(buildable, NULL)->cuboid) { - qhandle_t shader, ashader; - - CG_Cuboid_Send(); //NOTE: CG_Cuboid_Send has its own timer so we don't spam server with commands every frame - - if(cg.forbidCuboids) - shader=cgs.media.cuboidYellowBuildShader; - else if(ps->stats[STAT_BUILDABLE]&SB_VALID_TOGGLEBIT) - shader=cgs.media.cuboidGreenBuildShader; - else - shader=cgs.media.cuboidRedBuildShader; - CG_DrawCuboid(entity_origin,dims,shader,0); - CG_DrawCuboidAxis(entity_origin,dims,cg_cuboidResizeAxis.integer,cgs.media.cuboidAxis); - return; + qhandle_t shader, ashader; + + CG_Cuboid_Send( ); //NOTE: CG_Cuboid_Send has its own timer so we don't spam server with commands every frame + + if( cg.waitForCB ) + shader = cgs.media.cuboidYellowBuildShader; + else if( cg.cuboidValid && ps->stats[ STAT_BUILDABLE ] & SB_VALID_TOGGLEBIT ) + shader = cgs.media.cuboidGreenBuildShader; + else + shader = cgs.media.cuboidRedBuildShader; + + CG_DrawCuboid( entity_origin, dims, shader, 0 ); + CG_DrawCuboidAxis( entity_origin, dims, cg_cuboidResizeAxis.integer, cgs.media.cuboidAxis ); + return; } VectorCopy(ps->viewangles,viewangles); @@ -1896,7 +1897,16 @@ void CG_Buildable( centity_t *cent ) CG_PositionEntityOnTag( &turretBarrel, &ent, ent.hModel, "tag_turret" ); VectorCopy( cent->lerpOrigin, turretBarrel.lightingOrigin ); - AnglesToAxis( es->angles2, flatAxis ); + + { + vec3_t interpolated; + int i; + + for( i = 0; i < 3 ; i++ ) + interpolated[ i ] = LerpAngle( es->angles2[ i ], cent->nextState.angles2[ i ], cg.frameInterpolation ); + + AnglesToAxis( interpolated, flatAxis ); + } RotatePointAroundVector( turretBarrel.axis[ 0 ], xNormal, flatAxis[ 0 ], -rotAngle ); RotatePointAroundVector( turretBarrel.axis[ 1 ], xNormal, flatAxis[ 1 ], -rotAngle ); @@ -2090,32 +2100,36 @@ Send the cuboid selection via commands. */ void CG_Cuboid_Send(void) { - static qboolean init=qfalse; + static qboolean init = qfalse; static int lastupdate; static vec3_t lastcuboid; - if(!BG_Buildable(cg.predictedPlayerState.stats[STAT_BUILDABLE]&~SB_VALID_TOGGLEBIT,NULL)->cuboid) - return; + if( !BG_Buildable( cg.predictedPlayerState.stats[ STAT_BUILDABLE ] &~ SB_VALID_TOGGLEBIT, NULL)->cuboid) + return; - if(!init) + if( !init ) { - lastupdate=cg.time; - VectorCopy(cg.cuboidSelection,lastcuboid); - init=qtrue; + lastupdate = cg.time; + VectorCopy( cg.cuboidSelection, lastcuboid ); + init = qtrue; } - if(lastupdate+100>cg.time) - return; + if( lastupdate + 100 > cg.time ) + return; - if(!VectorCompareEpsilon(lastcuboid,cg.cuboidSelection,1e-3)) + if( !VectorCompareEpsilon( lastcuboid, cg.cuboidSelection, 1e-3 ) ) { - cg.latestCBNumber++; - cg.latestCBNumber%=100; - trap_SendClientCommand(va("cb %i %f %f %f\n",cg.latestCBNumber,cg.cuboidSelection[0],cg.cuboidSelection[1],cg.cuboidSelection[2])); - cg.forbidCuboids=qtrue; //wait for response + cg.latestCBNumber++; + cg.latestCBNumber %= 100; + trap_SendClientCommand( va("cb %i %f %f %f\n", + cg.latestCBNumber, + cg.cuboidSelection[ 0 ], + cg.cuboidSelection[ 1 ], + cg.cuboidSelection[ 2 ] ) ); + cg.waitForCB = qtrue; //wait for response } - lastupdate=cg.time; - VectorCopy(cg.cuboidSelection,lastcuboid); + lastupdate = cg.time; + VectorCopy( cg.cuboidSelection, lastcuboid ); } /* @@ -2127,47 +2141,55 @@ Server responded to our cb with either cb2 or cb3. */ void CG_Cuboid_Response(void) { - // cb2 : server sets client-side cuboid - // cb3 : server agrees on player's cuboid - // cb3 : server doesnt agree on player's cuboid and corrects it - static qboolean init = qfalse; + // cb2 : server sets client-side cuboid + // cb3 : server agrees on player's cuboid + // cb4 : server disagrees on player's cuboid + int offs; if( !BG_Buildable( cg.predictedPlayerState.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT, NULL )->cuboid ) return; if( !Q_stricmp( CG_Argv( 0 ), "cb2" ) && trap_Argc( ) == 4 ) { - cg.cuboidSelection[ 0 ] = atof( CG_Argv( 1 ) ); - cg.cuboidSelection[ 1 ] = atof( CG_Argv( 2 ) ); - cg.cuboidSelection[ 2 ] = atof( CG_Argv( 3 ) ); - return; + if( trap_Argc( ) == 4 || + ( offs = 1, trap_Argc() == 5 && atoi( CG_Argv( 1 ) ) == cg.latestCBNumber ) ) + { + cg.cuboidValid = qtrue; + cg.cuboidSelection[ 0 ] = atof( CG_Argv( 1 + offs ) ); + cg.cuboidSelection[ 1 ] = atof( CG_Argv( 2 + offs ) ); + cg.cuboidSelection[ 2 ] = atof( CG_Argv( 3 + offs ) ); + return; + } } else if( !Q_stricmp( CG_Argv( 0 ), "cb3" ) ) { if( trap_Argc( ) == 2 ) { if( atoi( CG_Argv( 1 ) ) == cg.latestCBNumber ) - cg.forbidCuboids = qfalse; + cg.waitForCB = qfalse; + cg.cuboidValid = qtrue; return; } - else if( trap_Argc() == 5) + } + else if( !Q_stricmp( CG_Argv( 0 ), "cb4" ) ) + { + if( trap_Argc() == 2 ) { - cg.cuboidSelection[ 0 ] = atof( CG_Argv( 2 ) ); - cg.cuboidSelection[ 1 ] = atof( CG_Argv( 3 ) ); - cg.cuboidSelection[ 2 ] = atof( CG_Argv( 4 ) ); if( atoi( CG_Argv( 1 ) ) == cg.latestCBNumber ) - { - cg.forbidCuboids = qfalse; + { + cg.waitForCB = qfalse; + cg.cuboidValid = qfalse; + if( cg.lastCuboidError + 250 < cg.time ) { trap_S_StartLocalSound( cgs.media.cuboidErrorSound, CHAN_LOCAL_SOUND ); cg.lastCuboidError = cg.time; - } + } } - return; + return; } } - Com_Printf( "^3warning: wrong cb2/cb3 from server\n" ); + Com_Printf( "^3warning: wrong cb from server\n" ); } /* @@ -2237,7 +2259,6 @@ void CG_CuboidRotate_f(void) break; } trap_S_StartLocalSound( cgs.media.cuboidRotateSound, CHAN_LOCAL_SOUND ); - CG_Cuboid_Send( ); } /* @@ -2257,7 +2278,7 @@ void CG_CuboidAxis_f(void) axis = cg_cuboidResizeAxis.integer; if( !BG_Buildable( cg.predictedPlayerState.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT, NULL )->cuboid) return; - if( !CG_Argv( 1 ) ) + if( trap_Argc( ) < 2 ) { Com_Printf( "cuboidAxis next|0|1|2 : set axis on which you want to resize your cuboid selection (0 - X, 1 - Y, 2 - Z)\n" ); return; @@ -2270,22 +2291,53 @@ void CG_CuboidAxis_f(void) trap_S_StartLocalSound( cgs.media.cuboidAxisChangeSound, CHAN_LOCAL_SOUND ); } +/* +====================== +CG_CuboidSize_f + +Set the cuboid selection +Syntax: + cuboidAxis x y z +====================== +*/ +void CG_CuboidSize_f(void) +{ + int axis; + + if( trap_Argc( ) < 4 ) + { + Com_Printf( "cuboidAxis x y z : set the cuboid selection\n" ); + return; + } + + VectorSet( cg.cuboidSelection, + atof( CG_Argv( 1 ) ), + atof( CG_Argv( 2 ) ), + atof( CG_Argv( 3 ) ) ); + + trap_S_StartLocalSound( cgs.media.cuboidResizeSoundA, CHAN_LOCAL_SOUND ); +} + /* ====================== CG_CuboidAttack_f Replaces +attack/-attack. If building a cuboid and the selection is somehow invalid, play an error sound. -Otherwise send the normal +attack / -attack; +Otherwise send the normal +attack / -attack. ====================== */ void CG_CuboidAttack_f(void) { - if( BG_Buildable( cg.predictedPlayerState.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT, NULL )->cuboid && - cg.forbidCuboids ) + if( BG_Buildable( cg.predictedPlayerState.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT, NULL )->cuboid ) { - trap_S_StartLocalSound( cgs.media.cuboidErrorSound, CHAN_LOCAL_SOUND ); - return; + if( cg.waitForCB ) + return; + else if( !cg.cuboidValid ) + { + trap_S_StartLocalSound( cgs.media.cuboidErrorSound, CHAN_LOCAL_SOUND ); + return; + } } trap_SendClientCommand( va( "%s", CG_Argv(0) ) ); } diff --git a/src/cgame/cg_consolecmds.c b/src/cgame/cg_consolecmds.c index 0f1a3cf..cf3996d 100644 --- a/src/cgame/cg_consolecmds.c +++ b/src/cgame/cg_consolecmds.c @@ -195,6 +195,7 @@ static consoleCommand_t commands[ ] = { "clientlist", CG_ClientList_f }, { "cuboidAxis", CG_CuboidAxis_f }, { "cuboidRotate", CG_CuboidRotate_f }, + { "cuboidSize", CG_CuboidSize_f }, { "destroyTestPS", CG_DestroyTestPS_f }, { "destroyTestTS", CG_DestroyTestTS_f }, { "nextframe", CG_TestModelNextFrame_f }, diff --git a/src/cgame/cg_draw.c b/src/cgame/cg_draw.c index 84c49a5..aa6df3d 100644 --- a/src/cgame/cg_draw.c +++ b/src/cgame/cg_draw.c @@ -2468,7 +2468,7 @@ CG_DrawTutorial static void CG_DrawTutorial( rectDef_t *rect, float text_x, float text_y, vec4_t color, float scale, int textalign, int textvalign, int textStyle ) { - if( !cg_tutorial.integer && !cg_modTutorial.integer ) + if( !cg_tutorial.integer ) return; UI_DrawTextBlock( rect, text_x, text_y, color, scale, textalign, textvalign, textStyle, CG_TutorialText( ) ); @@ -2630,6 +2630,8 @@ static void CG_ScanForCrosshairEntity( void ) CG_Trace( &trace, start, vec3_origin, vec3_origin, end, cg.snap->ps.clientNum, CONTENTS_SOLID|CONTENTS_BODY ); + cg.crosshairDistance = Distance( start, trace.endpos ); + // if the player is in fog, don't show it content = trap_CM_PointContents( trace.endpos, 0 ); if( content & CONTENTS_FOG ) @@ -3108,6 +3110,9 @@ static void CG_DrawLighting( void ) CG_DrawPic( 0, 0, 640, 480, cgs.media.whiteShader ); trap_R_SetColor( NULL ); } + + if( BG_UpgradeIsActive( UP_NIGHTVISION, cg.predictedPlayerState.stats ) ) + CG_DrawPic( 0, 0, 640, 480, cgs.media.basivisionShader ); } /* @@ -3525,9 +3530,9 @@ void CG_DrawSplash( void ) trap_R_SetColor( color ); ts = 0.33f; - tw = UI_Text_Width( MODVER_TITLE, ts ); - th = UI_Text_Height( MODVER_TITLE, ts ); - UI_Text_Paint( x + w/2 - tw/2, y + h + th, ts, color, MODVER_TITLE, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE ); + tw = UI_Text_Width( SPLASH_VERSION, ts ); + th = UI_Text_Height( SPLASH_VERSION, ts ); + UI_Text_Paint( x + w/2 - tw/2, y + h + th, ts, color, SPLASH_VERSION, 0, 0, ITEM_TEXTSTYLE_SHADOWEDMORE ); } color[ 3 ] = ( t > 3.0f ) ? 4.0f - t : 1.0f; diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h index a8316c5..4893060 100644 --- a/src/cgame/cg_local.h +++ b/src/cgame/cg_local.h @@ -809,6 +809,7 @@ typedef struct weaponInfoMode_s qhandle_t impactParticleSystem; qhandle_t impactMark; qhandle_t impactMarkSize; + qboolean impactMarkAlphaFade; sfxHandle_t impactSound[ 4 ]; //random impact sound sfxHandle_t impactFleshSound[ 4 ]; //random impact sound } weaponInfoMode_t; @@ -1056,6 +1057,7 @@ typedef struct int lastKillTime; // crosshair client ID + float crosshairDistance; int crosshairBuildable; int crosshairClientNum; int crosshairClientTime; @@ -1184,9 +1186,10 @@ typedef struct int nextWeaponClickTime; vec3_t cuboidSelection; - qboolean forbidCuboids; //if true then dont let player build a cuboid - int latestCBNumber; //wait for this number from server before building a cuboid - int lastCuboidError; //last time error sound was played + qboolean waitForCB; + qboolean cuboidValid; + int latestCBNumber; // for syncing with the server + int lastCuboidError; // last time an error sound was played qhandle_t announcerStack[ MAX_ANNOUNCER_STACK ]; int announcerStackPos; @@ -1371,6 +1374,10 @@ typedef struct qhandle_t alienHatchPS; sfxHandle_t alienHatchSound; sfxHandle_t alienFailedHatchSound; + + qhandle_t basivisionShader; + qhandle_t basivisionBlipShader; + qhandle_t basivisionFlareShader; } cgMedia_t; typedef struct @@ -1582,10 +1589,6 @@ extern vmCvar_t cg_disableCommandDialogs; extern vmCvar_t cg_disableScannerPlane; extern vmCvar_t cg_tutorial; -extern vmCvar_t cg_modTutorial; -extern vmCvar_t cg_modTutorialReference; -extern vmCvar_t cg_lastModVersion; - extern vmCvar_t cg_painBlendUpRate; extern vmCvar_t cg_painBlendDownRate; extern vmCvar_t cg_painBlendMax; @@ -1627,6 +1630,10 @@ extern vmCvar_t cg_fuelInfoX; extern vmCvar_t cg_fuelInfoY; extern vmCvar_t cg_fuelInfoScale; +extern vmCvar_t cg_announcer; + +extern vmCvar_t cg_cameraShakeMagnitude; + // // cg_main.c // @@ -1748,6 +1755,7 @@ void CG_HumanBuildableExplosion( vec3_t origin, vec3_t dir ); void CG_AlienBuildableExplosion( vec3_t origin, vec3_t dir ); void CG_CuboidAxis_f(void); void CG_CuboidRotate_f(void); +void CG_CuboidSize_f(void); void CG_Cuboid_Send(void); void CG_Cuboid_Response(void); void CG_CuboidResize( qboolean enlarge ); @@ -2185,15 +2193,4 @@ typedef enum // mod version data -#define MODVER_CURRENT 6 -#define MODVER_C2_0_1_5 6 -#define MODVER_C2_0_1_4 5 -#define MODVER_C2_0_1_3 4 -#define MODVER_C2_0_1_2 3 -#define MODVER_C2_0_1_1 2 -#define MODVER_C2_0_1_0 1 -#define MODVER_TITLE "0.1.5 (Sep 12)" - - - - +#define SPLASH_VERSION "0.1.6 (Jan 14)" diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c index c1c7a0d..ff3d567 100644 --- a/src/cgame/cg_main.c +++ b/src/cgame/cg_main.c @@ -192,10 +192,6 @@ vmCvar_t cg_disableCommandDialogs; vmCvar_t cg_disableScannerPlane; vmCvar_t cg_tutorial; -vmCvar_t cg_modTutorial; -vmCvar_t cg_modTutorialReference; -vmCvar_t cg_lastModVersion; - vmCvar_t cg_painBlendUpRate; vmCvar_t cg_painBlendDownRate; vmCvar_t cg_painBlendMax; @@ -237,6 +233,10 @@ vmCvar_t cg_fuelInfoX; vmCvar_t cg_fuelInfoY; vmCvar_t cg_fuelInfoScale; +vmCvar_t cg_announcer; + +vmCvar_t cg_cameraShakeMagnitude; + typedef struct { vmCvar_t *vmCvar; @@ -366,27 +366,26 @@ static cvarTable_t cvarTable[ ] = { &pmove_fixed, "pmove_fixed", "0", 0}, { &pmove_msec, "pmove_msec", "8", 0}, { &cg_noTaunt, "cg_noTaunt", "0", CVAR_ARCHIVE}, - + { &cg_voice, "voice", "default", CVAR_USERINFO|CVAR_ARCHIVE}, { &cg_emoticons, "cg_emoticons", "1", CVAR_LATCH|CVAR_ARCHIVE}, { &cg_chatTeamPrefix, "cg_chatTeamPrefix", "1", CVAR_ARCHIVE }, - + { &cg_cuboidResizeAxis, "cg_cuboidResizeAxis", "2", 0 }, { &cg_cuboidResizeRate, "cg_cuboidResizeRate", "5", CVAR_ARCHIVE }, { &cg_cuboidPSQuality, "cg_cuboidPSQuality", "3", CVAR_ARCHIVE }, - + { &cg_cuboidInfoX, "cg_cuboidInfoX" ,"0", CVAR_ARCHIVE }, { &cg_cuboidInfoY, "cg_cuboidInfoY" ,"150", CVAR_ARCHIVE }, - - { &cg_modTutorial, "cg_modTutorial", "1", CVAR_ARCHIVE }, - { &cg_modTutorialReference, "cg_modTutorialReference", "0", CVAR_ARCHIVE }, - { &cg_lastModVersion, "cg_lastModVersion", "0", CVAR_ARCHIVE }, - + { &cg_fuelInfoX, "cg_fuelInfoX" ,"0", CVAR_ARCHIVE }, { &cg_fuelInfoY, "cg_fuelInfoY" ,"150", CVAR_ARCHIVE }, - { &cg_fuelInfoScale, "cg_fuelInfoScale" ,"0.5", CVAR_ARCHIVE } + { &cg_fuelInfoScale, "cg_fuelInfoScale" ,"0.5", CVAR_ARCHIVE }, + { &cg_announcer, "cg_announcer", "1", CVAR_ARCHIVE }, + + { &cg_cameraShakeMagnitude, "cg_cameraShakeMagnitude", "1", CVAR_ARCHIVE } }; static int cvarTableSize = sizeof( cvarTable ) / sizeof( cvarTable[0] ); @@ -819,26 +818,30 @@ static void CG_RegisterGraphics( void ) cgs.media.greenBuildShader = trap_R_RegisterShader("gfx/misc/greenbuild" ); cgs.media.redBuildShader = trap_R_RegisterShader("gfx/misc/redbuild" ); cgs.media.humanSpawningShader = trap_R_RegisterShader("models/buildables/telenode/rep_cyl" ); - + for( i = 0; i < CUBOID_CRACK_TEXTURES - 1; i++ ) cgs.media.cuboidCracks[ i ] = trap_R_RegisterShader( va( "models/cuboid/cracks_%i", i ) ); - + cgs.media.cuboidModel = trap_R_RegisterModel( "models/cuboid/cuboid.md3" ); cgs.media.cuboidRedBuildShader = trap_R_RegisterShader( "gfx/cuboid/build_red" ); cgs.media.cuboidYellowBuildShader = trap_R_RegisterShader( "gfx/cuboid/build_yellow" ); cgs.media.cuboidGreenBuildShader = trap_R_RegisterShader( "gfx/cuboid/build_green" ); cgs.media.cuboidAxis = trap_R_RegisterShader( "gfx/cuboid/build_axis" ); cgs.media.cuboidAlienPrebuild = trap_R_RegisterShader( "gfx/cuboid/prebuild_alien" ); - - cg.forbidCuboids=qfalse; - cg.latestCBNumber=0; - + + cg.waitForCB = qfalse; + cg.cuboidValid = qfalse; + cg.latestCBNumber = 0; + for( i = 0; i < 15; i++ ) cgs.media.splashLogo[ i ] = trap_R_RegisterShader( va( "cuboid/logo_%i.tga", i ) ); cgs.media.splashLeft = trap_R_RegisterShader( "cuboid/logo_left.tga" ); cgs.media.splashRight = trap_R_RegisterShader( "cuboid/logo_right.tga" ); - - + + cgs.media.basivisionShader = trap_R_RegisterShader( "gfx/2d/basivision" ); + cgs.media.basivisionBlipShader = trap_R_RegisterShader( "gfx/2d/basivisionBlip" ); + cgs.media.basivisionFlareShader = trap_R_RegisterShader( "gfx/2d/basivisionFlare" ); + for( i = 0; i < 8; i++ ) cgs.media.buildWeaponTimerPie[ i ] = trap_R_RegisterShader( buildWeaponTimerPieShaders[ i ] ); diff --git a/src/cgame/cg_players.c b/src/cgame/cg_players.c index 99f9f9e..63464e1 100644 --- a/src/cgame/cg_players.c +++ b/src/cgame/cg_players.c @@ -1428,9 +1428,35 @@ static void CG_PlayerUpgrades( centity_t *cent, refEntity_t *torso ) held = es->modelindex; active = es->modelindex2; - + jetjump = ( cent->jetPackJumpTime + 100 > cg.time && !( active & ( 1 << UP_JETPACK ) ) ); + if( es->number == cg.snap->ps.clientNum ) + { + static int lastTime=0; + static float last=0.0f; + + if( active & ( 1 << UP_NIGHTVISION ) ) + { + float dt, cur, target; + dt = 0.001f * ( cg.time - lastTime ); + target = sqrt( cg.crosshairDistance * 3.0f ); + cur = last + ( target - last ) * dt * 15.0f; + + last = cur; + lastTime = cg.time; + + cur = pow( cur, 2 ); + trap_R_AddAdditiveLightToScene( cent->lerpOrigin, cur, 1, 1, 1 ); + } + else + { + lastTime = cg.time; + last = 0.0f; + } + } + + if( held & ( 1 << UP_JETPACK ) ) { memset( &jetpack, 0, sizeof( jetpack ) ); diff --git a/src/cgame/cg_scanner.c b/src/cgame/cg_scanner.c index 3941956..821c8bf 100644 --- a/src/cgame/cg_scanner.c +++ b/src/cgame/cg_scanner.c @@ -62,9 +62,9 @@ void CG_UpdateEntityPositions( void ) !( cent->currentState.eFlags & EF_DEAD ) ) { if( BG_Buildable(cent->currentState.modelindex,NULL)->cuboid ) - if( !BG_CuboidAttributes(cent->currentState.modelindex)->detectable ) - continue; //forget about undetectable cuboids - + if( !BG_CuboidAttributes(cent->currentState.modelindex)->detectable ) + continue; //forget about undetectable cuboids + // add to list of item positions (for creep) if( cent->currentState.modelindex2 == TEAM_ALIENS ) { @@ -216,6 +216,29 @@ static void CG_DrawDir( rectDef_t *rect, vec3_t origin, vec4_t colour ) trap_R_SetColor( NULL ); } +/* +============= +CG_BasivisionBlip +============= +*/ +void CG_BasivisionBlip( vec3_t origin, float size, qhandle_t shader, float flareSize, qhandle_t flare ) +{ + float x, y, s; + + if( !CG_WorldToScreen( origin, &x, &y ) ) + return; + + size = size * 1000 / Distance( origin, entityPositions.origin ); + + if( shader ) + CG_DrawPic( x - ( size * cgDC.aspectScale ) / 2, y - size / 2, size * cgDC.aspectScale, size, + cgs.media.basivisionBlipShader ); + + if( flare ) + CG_DrawPic( x - ( flareSize * cgDC.aspectScale ) / 2, y - flareSize / 2, flareSize * cgDC.aspectScale, flareSize, + cgs.media.basivisionFlareShader ); +} + /* ============= CG_AlienSense @@ -231,24 +254,39 @@ void CG_AlienSense( rectDef_t *rect ) VectorCopy( entityPositions.origin, origin ); - //draw human buildables - for( i = 0; i < entityPositions.numHumanBuildables; i++ ) + if( BG_UpgradeIsActive( UP_NIGHTVISION, cg.predictedPlayerState.stats ) ) { - VectorClear( relOrigin ); - VectorSubtract( entityPositions.humanBuildablePos[ i ], origin, relOrigin ); - - if( VectorLength( relOrigin ) < ALIENSENSE_RANGE ) - CG_DrawDir( rect, relOrigin, buildable ); + for( i = 0; i < entityPositions.numHumanBuildables; i++ ) + CG_BasivisionBlip( entityPositions.humanBuildablePos[ i ], + 0, 0, + 150, cgs.media.basivisionBlipShader ); + + for( i = 0; i < entityPositions.numHumanClients; i++ ) + CG_BasivisionBlip( entityPositions.humanClientPos[ i ], + 60, cgs.media.basivisionBlipShader, + 80, cgs.media.basivisionFlareShader ); } - - //draw human clients - for( i = 0; i < entityPositions.numHumanClients; i++ ) + else { - VectorClear( relOrigin ); - VectorSubtract( entityPositions.humanClientPos[ i ], origin, relOrigin ); + //draw human buildables + for( i = 0; i < entityPositions.numHumanBuildables; i++ ) + { + VectorClear( relOrigin ); + VectorSubtract( entityPositions.humanBuildablePos[ i ], origin, relOrigin ); + + if( VectorLength( relOrigin ) < ALIENSENSE_RANGE ) + CG_DrawDir( rect, relOrigin, buildable ); + } - if( VectorLength( relOrigin ) < ALIENSENSE_RANGE ) - CG_DrawDir( rect, relOrigin, client ); + //draw human clients + for( i = 0; i < entityPositions.numHumanClients; i++ ) + { + VectorClear( relOrigin ); + VectorSubtract( entityPositions.humanClientPos[ i ], origin, relOrigin ); + + if( VectorLength( relOrigin ) < ALIENSENSE_RANGE ) + CG_DrawDir( rect, relOrigin, client ); + } } } diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c index 2a71b62..cf820c0 100644 --- a/src/cgame/cg_servercmds.c +++ b/src/cgame/cg_servercmds.c @@ -634,8 +634,8 @@ void CG_Menu( int menu, int arg ) case MN_B_CUBOID_MODE1: longMsg = "On this map noone is allowed to build a cuboid before reaching " - "stage 2 to prevent players from cheating."; - shortMsg = "Cuboids are disabled on stage 1"; + "Stage 2 to prevent players from cheating."; + shortMsg = "Cuboids are disabled on Stage 1"; break; case MN_B_CUBOID_MODE2: @@ -650,6 +650,14 @@ void CG_Menu( int menu, int arg ) shortMsg = "Buildable density is too high here"; break; + case MN_B_INVALIDSIZE: + longMsg = "You cannot build a cuboid of the selected size." + "Most likely the size is too big, too small or " + "invalid. Keep changing it until the preview " + "turns green."; + shortMsg = "Invalid cuboid size"; + break; + //=============================== case MN_H_NOBP: @@ -1274,12 +1282,13 @@ void CG_ProcessAnnouncer( void ) if( last + ANNOUNCER_DELAY > cg.time ) return; - + cg.announcerStackPos++; cg.announcerStackPos %= MAX_ANNOUNCER_STACK; - - trap_S_StartLocalSound( cg.announcerStack[ cg.announcerStackPos ], CHAN_VOICE ); - + + if( cg_announcer.integer ) + trap_S_StartLocalSound( cg.announcerStack[ cg.announcerStackPos ], CHAN_VOICE ); + last = cg.time; } @@ -1293,12 +1302,15 @@ Play an announcer sound static void CG_Announce( void ) { const char *event, *soundName; - + + if( !cg_announcer.integer ) + return; + if( trap_Argc( ) != 2 ) return; - + event = CG_Argv( 1 ); - + if( !Q_stricmp( event, "votenow" ) || !Q_stricmp( event, "votecancelled" ) || !Q_stricmp( event, "votefailed" ) || @@ -1347,8 +1359,9 @@ static void CG_GameCmds_f( void ) static consoleCommand_t svcommands[ ] = { { "announce", CG_Announce }, - { "cb2", CG_Cuboid_Response }, // set local cuboid - { "cb3", CG_Cuboid_Response }, // set local cuboid and print a "limit exceeded" warning + { "cb2", CG_Cuboid_Response }, + { "cb3", CG_Cuboid_Response }, + { "cb4", CG_Cuboid_Response }, { "chat", CG_Chat_f }, { "clientLevelShot", CG_ClientLevelShot_f }, { "cmds", CG_GameCmds_f }, diff --git a/src/cgame/cg_tutorial.c b/src/cgame/cg_tutorial.c index f68d070..212db33 100644 --- a/src/cgame/cg_tutorial.c +++ b/src/cgame/cg_tutorial.c @@ -639,21 +639,6 @@ const char *CG_TutorialText( void ) playerState_t *ps; static char text[ MAX_TUTORIAL_TEXT ]; static int refreshBindings = 0; - static qboolean checkedUpdate = qfalse; - - // force mod tutorial if new version - if( !checkedUpdate ) - { - trap_Cvar_Update( &cg_lastModVersion ); - - if( cg_lastModVersion.integer < MODVER_CURRENT ) - { - trap_Cvar_Set( "cg_modTutorial", "1" ); - trap_Cvar_Set( "cg_modTutorialReference", va( "%i", cg_lastModVersion.integer ) ); - trap_Cvar_Set( "cg_lastModVersion", va( "%i", MODVER_CURRENT ) ); - } - checkedUpdate = qtrue; - } if( refreshBindings == 0 ) CG_GetBindings( ); @@ -663,14 +648,11 @@ const char *CG_TutorialText( void ) text[ 0 ] = '\0'; ps = &cg.snap->ps; - if( cg_modTutorial.integer ) - { - CG_NewText( text, ps ); - - if( !cg_tutorial.integer ) - return text; - } - + CG_NewText( text, ps ); + + if( !cg_tutorial.integer ) + return text; + if( !cg.intermissionStarted && !cg.demoPlayback ) { if( ps->persistant[ PERS_SPECSTATE ] != SPECTATOR_NOT || @@ -800,38 +782,31 @@ static void CG_CuboidText( char *text, playerState_t *ps ) static void CG_NewText( char *text, playerState_t *ps ) { - int reference; - - reference = cg_modTutorialReference.integer; - if( !cg.intermissionStarted && !cg.demoPlayback ) { if( ps->persistant[ PERS_SPECSTATE ] == SPECTATOR_NOT && !( ps->pm_flags & PMF_FOLLOW ) && ps->stats[ STAT_HEALTH ] > 0 ) { - if( reference >= MODVER_C2_0_1_0 ) + if( BG_InventoryContainsUpgrade( UP_JETPACK, ps->stats ) ) { - if( BG_InventoryContainsUpgrade( UP_JETPACK, ps->stats ) ) + if( ps->stats[ STAT_FUEL ] > JETPACK_FUEL_JUMP ) { - if( ps->stats[ STAT_FUEL ] > JETPACK_FUEL_JUMP ) - { - Q_strcat( text, MAX_TUTORIAL_TEXT, - va( "Press %s to perform a jetpack-aided jump. It uses fuel instead of stamina\n", - CG_KeyNameForCommand( "+moveup" ) ) ); - } - if( ps->stats[ STAT_FUEL ] <= JETPACK_FUEL_LOW ) - { - Q_strcat( text, MAX_TUTORIAL_TEXT, - va( "You are running low on jet fuel. Find an Armoury and press %s to refuel\n", - CG_KeyNameForCommand( "buy ammo" ) ) ); - } - else if( ps->stats[ STAT_FUEL ] <= 0 ) - { - Q_strcat( text, MAX_TUTORIAL_TEXT, - va( "You are out of jet fuel. You can no longer fly. Find an Armoury and press %s to refuel\n", - CG_KeyNameForCommand( "buy ammo" ) ) ); - } + Q_strcat( text, MAX_TUTORIAL_TEXT, + va( "Press %s to perform a jetpack-aided jump. It uses fuel instead of stamina\n", + CG_KeyNameForCommand( "+moveup" ) ) ); + } + if( ps->stats[ STAT_FUEL ] <= JETPACK_FUEL_LOW ) + { + Q_strcat( text, MAX_TUTORIAL_TEXT, + va( "You are running low on jet fuel. Find an Armoury and press %s to refuel\n", + CG_KeyNameForCommand( "buy ammo" ) ) ); + } + else if( ps->stats[ STAT_FUEL ] <= 0 ) + { + Q_strcat( text, MAX_TUTORIAL_TEXT, + va( "You are out of jet fuel. You can no longer fly. Find an Armoury and press %s to refuel\n", + CG_KeyNameForCommand( "buy ammo" ) ) ); } } @@ -840,22 +815,18 @@ static void CG_NewText( char *text, playerState_t *ps ) case WP_ABUILD: case WP_ABUILD2: case WP_HBUILD: - if( reference >= MODVER_C2_0_1_0 ) - { - CG_CuboidText( text, ps ); - if( ps->weapon == WP_ABUILD2 ) - Q_strcat( text, MAX_TUTORIAL_TEXT, - "Spitting at a human has a chance of impregnating him\n" - "with an alien egg. After a certain amount of time,\n" - "the egg can be spawned from by aliens, killing the human.\n" ); - } + CG_CuboidText( text, ps ); + if( ps->weapon == WP_ABUILD2 ) + Q_strcat( text, MAX_TUTORIAL_TEXT, + "Spitting at a human has a chance of impregnating him\n" + "with an alien egg. After a certain amount of time,\n" + "the egg can be spawned from by aliens, killing the human.\n" ); break; case WP_ALEVEL4: - if( reference >= MODVER_C2_0_1_0 ) - Q_strcat( text, MAX_TUTORIAL_TEXT, - va( "Press %s to drop a Tyrant Bomb. It can be regerated by touching a Booster.\n", - CG_KeyNameForCommand( "+button2" ) ) ); + Q_strcat( text, MAX_TUTORIAL_TEXT, + va( "Press %s to drop a Tyrant Bomb. It can be regerated by touching a Booster.\n", + CG_KeyNameForCommand( "+button2" ) ) ); break; } } diff --git a/src/cgame/cg_view.c b/src/cgame/cg_view.c index 4b2b254..97b7582 100644 --- a/src/cgame/cg_view.c +++ b/src/cgame/cg_view.c @@ -578,6 +578,18 @@ void CG_OffsetFirstPersonView( void ) origin[ 2 ] += cg.predictedPlayerState.viewheight; return; } + // camera shake effect + else if( cg.snap->ps.stats[ STAT_SHAKE ] > 0 ) + { + float fac, mag; + + fac = (float) cg.snap->ps.stats[ STAT_SHAKE ] * + cg_cameraShakeMagnitude.value * 0.15f; + + angles[ 0 ] += crandom() * fac; + angles[ 1 ] += crandom() * fac; + angles[ 2 ] += crandom() * fac; + } // add angles based on damage kick if( cg.damageTime ) diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c index f844f81..7e22baf 100644 --- a/src/cgame/cg_weapons.c +++ b/src/cgame/cg_weapons.c @@ -414,6 +414,11 @@ static qboolean CG_ParseWeaponModeSection( weaponInfoMode_t *wim, char **text_p continue; } + else if( !Q_stricmp( token, "impactMarkAlphaFade" ) ) + { + wim->impactMarkAlphaFade = qtrue; + continue; + } else if( !Q_stricmp( token, "}" ) ) return qtrue; //reached the end of this weapon section else @@ -1253,6 +1258,10 @@ static qboolean CG_WeaponSelectable( weapon_t weapon ) if( !BG_InventoryContainsWeapon( weapon, cg.snap->ps.stats ) ) return qfalse; + // needed for basilisk nightvision + if( BG_Weapon( weapon )->team != TEAM_HUMANS ) + return qfalse; + return qtrue; } @@ -1742,7 +1751,8 @@ void CG_MissileHitWall( weapon_t weaponNum, weaponMode_t weaponMode, int clientN // impact mark // if( radius > 0.0f ) - CG_ImpactMark( mark, origin, dir, random( ) * 360, 1, 1, 1, 1, qfalse, radius, qfalse ); + CG_ImpactMark( mark, origin, dir, random( ) * 360, 1, 1, 1, 1, + weapon->wim[ weaponMode ].impactMarkAlphaFade, radius, qfalse ); } -- cgit