summaryrefslogtreecommitdiff
path: root/src/cgame
diff options
context:
space:
mode:
Diffstat (limited to 'src/cgame')
-rw-r--r--src/cgame/cg_buildable.c164
-rw-r--r--src/cgame/cg_consolecmds.c1
-rw-r--r--src/cgame/cg_draw.c13
-rw-r--r--src/cgame/cg_local.h35
-rw-r--r--src/cgame/cg_main.c45
-rw-r--r--src/cgame/cg_players.c28
-rw-r--r--src/cgame/cg_scanner.c72
-rw-r--r--src/cgame/cg_servercmds.c35
-rw-r--r--src/cgame/cg_tutorial.c91
-rw-r--r--src/cgame/cg_view.c12
-rw-r--r--src/cgame/cg_weapons.c12
11 files changed, 318 insertions, 190 deletions
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 <a> <b> <c> : server sets client-side cuboid
- // cb3 <echo> : server agrees on player's cuboid
- // cb3 <echo> <a> <b> <c> : server doesnt agree on player's cuboid and corrects it
- static qboolean init = qfalse;
+ // cb2 <a> <b> <c> : server sets client-side cuboid
+ // cb3 <echo> : server agrees on player's cuboid
+ // cb4 <echo> : 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;
@@ -2272,20 +2293,51 @@ void CG_CuboidAxis_f(void)
/*
======================
+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 )
{
@@ -218,6 +218,29 @@ static void CG_DrawDir( rectDef_t *rect, vec3_t origin, vec4_t colour )
/*
=============
+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 );
}