summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Angus <tim@ngus.net>2003-07-05 03:04:29 +0000
committerTim Angus <tim@ngus.net>2003-07-05 03:04:29 +0000
commitbeb34e28a4f933107a3fa08a306125a712e885ad (patch)
treef3d146de6fe83dfceeac02c9df83fc662d6a9e05
parent72b7a39be0762a9c604781404f047e2a0653f5f2 (diff)
* Hopefully eliminated all the BG_Find... fallthroughs for the classes
* Introduced a really hacky fix to a model caching bug (ClientInfoChanged)
-rw-r--r--Makefile2
-rw-r--r--src/cgame/cg_event.c8
-rw-r--r--src/cgame/cg_view.c70
-rw-r--r--src/game/bg_misc.c34
-rw-r--r--src/game/g_client.c39
-rw-r--r--src/game/g_cmds.c14
6 files changed, 106 insertions, 61 deletions
diff --git a/Makefile b/Makefile
index 00998654..56878b0d 100644
--- a/Makefile
+++ b/Makefile
@@ -130,7 +130,7 @@ RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O6 -ffast-math -funroll-loops -fomit-fra
else
NEWPGCC=/usr/local/gcc-2.95.2/bin/gcc
CC=$(shell if [ -f $(NEWPGCC) ]; then echo $(NEWPGCC); else echo gcc; fi )
-RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O6 -mcpu=pentiumpro -march=pentium -fomit-frame-pointer -pipe -ffast-math -malign-loops=2 -malign-jumps=2 -malign-functions=2 -fno-strict-aliasing -fstrength-reduce
+RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O6 -mcpu=pentiumpro -march=pentium -fomit-frame-pointer -pipe -ffast-math -falign-loops=2 -falign-jumps=2 -falign-functions=2 -fno-strict-aliasing -fstrength-reduce
endif
LIBEXT=a
diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c
index 857de9d8..017750c7 100644
--- a/src/cgame/cg_event.c
+++ b/src/cgame/cg_event.c
@@ -311,7 +311,10 @@ void CG_EntityEvent( centity_t *cent, vec3_t position )
clientInfo_t *ci;
int steptime, i;
- steptime = BG_FindSteptimeForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] );
+ if( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
+ steptime = 200;
+ else
+ steptime = BG_FindSteptimeForClass( cg.snap->ps.stats[ STAT_PCLASS ] );
es = &cent->currentState;
event = es->event & ~EV_EVENT_BITS;
@@ -442,8 +445,6 @@ void CG_EntityEvent( centity_t *cent, vec3_t position )
float oldStep;
int delta;
int step;
- float steptime;
- playerState_t *ps = &cg.predictedPlayerState;
if( clientNum != cg.predictedPlayerState.clientNum )
break;
@@ -455,7 +456,6 @@ void CG_EntityEvent( centity_t *cent, vec3_t position )
// check for stepping up before a previous step is completed
delta = cg.time - cg.stepTime;
- steptime = BG_FindSteptimeForClass( ps->stats[ STAT_PCLASS ] );
if( delta < steptime )
oldStep = cg.stepChange * ( steptime - delta ) / steptime;
diff --git a/src/cgame/cg_view.c b/src/cgame/cg_view.c
index ac180304..f69984bd 100644
--- a/src/cgame/cg_view.c
+++ b/src/cgame/cg_view.c
@@ -337,7 +337,10 @@ static void CG_StepOffset( void )
else
VectorSet( normal, 0.0f, 0.0f, 1.0f );
- steptime = BG_FindSteptimeForClass( ps->stats[ STAT_PCLASS ] );
+ if( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
+ steptime = 200;
+ else
+ steptime = BG_FindSteptimeForClass( ps->stats[ STAT_PCLASS ] );
// smooth out stair climbing
timeDelta = cg.time - cg.stepTime;
@@ -453,8 +456,13 @@ static void CG_OffsetFirstPersonView( void )
// add angles based on bob
//TA: bob amount is class dependant
- bob2 = BG_FindBobForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] );
- if( bob2 != 0 )
+
+ if( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
+ bob2 = 0.0f;
+ else
+ bob2 = BG_FindBobForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] );
+
+ if( bob2 != 0.0f )
{
// make sure the bob is visible even at low speeds
speed = cg.xyspeed > 200 ? cg.xyspeed : 200;
@@ -788,9 +796,8 @@ static int CG_CalcFov( void )
int a;
float b;
- attribFov = BG_FindFovForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] );
-
- if( cg.predictedPlayerState.pm_type == PM_INTERMISSION )
+ if( cg.predictedPlayerState.pm_type == PM_INTERMISSION ||
+ ( cg.snap->ps.persistant[ PERS_TEAM ] == TEAM_SPECTATOR ) )
{
// if in intermission, use a fixed value
fov_x = 90;
@@ -798,6 +805,7 @@ static int CG_CalcFov( void )
else
{
//TA: don't lock the fov globally - we need to be able to change it
+ attribFov = BG_FindFovForClass( cg.predictedPlayerState.stats[ STAT_PCLASS ] );
fov_x = attribFov;
if ( fov_x < 1 )
@@ -817,35 +825,35 @@ static int CG_CalcFov( void )
fov_x = 180 - temp2;
}
- }
-
- // account for zooms
- zoomFov = cg_zoomFov.value;
- if ( zoomFov < 1 )
- zoomFov = 1;
- else if ( zoomFov > attribFov )
- zoomFov = attribFov;
-
- //TA: only do all the zoom stuff if the client CAN zoom
- if( BG_ClassHasAbility( cg.predictedPlayerState.stats[ STAT_PCLASS ], SCA_CANZOOM ) )
- {
- if ( cg.zoomed )
+
+ // account for zooms
+ zoomFov = cg_zoomFov.value;
+ if ( zoomFov < 1 )
+ zoomFov = 1;
+ else if ( zoomFov > attribFov )
+ zoomFov = attribFov;
+
+ //TA: only do all the zoom stuff if the client CAN zoom
+ if( BG_ClassHasAbility( cg.predictedPlayerState.stats[ STAT_PCLASS ], SCA_CANZOOM ) )
{
- f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME;
+ if ( cg.zoomed )
+ {
+ f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME;
- if ( f > 1.0 )
- fov_x = zoomFov;
+ if ( f > 1.0 )
+ fov_x = zoomFov;
+ else
+ fov_x = fov_x + f * ( zoomFov - fov_x );
+ }
else
- fov_x = fov_x + f * ( zoomFov - fov_x );
- }
- else
- {
- f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME;
+ {
+ f = ( cg.time - cg.zoomTime ) / (float)ZOOM_TIME;
- if ( f > 1.0 )
- fov_x = fov_x;
- else
- fov_x = zoomFov + f * ( fov_x - zoomFov );
+ if ( f > 1.0 )
+ fov_x = fov_x;
+ else
+ fov_x = zoomFov + f * ( fov_x - zoomFov );
+ }
}
}
diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c
index 17d47de5..1b2f9777 100644
--- a/src/game/bg_misc.c
+++ b/src/game/bg_misc.c
@@ -1186,7 +1186,7 @@ classAttributes_t bg_classList[ ] =
PCL_A_B_BASE, //int classnum;
"builder", //char *className;
"Builder", //char *humanName;
- "lucy", //char *modelname;
+ "builder", //char *modelname;
1.0f, //float modelScale;
"default", //char *skinname;
"alien_builder_hud", //char *hudname;
@@ -1216,9 +1216,9 @@ classAttributes_t bg_classList[ ] =
PCL_A_B_LEV1, //int classnum;
"builderupg", //char *classname;
"Advanced Builder", //char *humanname;
- "lucy", //char *modelname;
+ "builder", //char *modelname;
1.0f, //float modelScale;
- "angel", //char *skinname;
+ "advanced", //char *skinname;
"alien_builder_hud", //char *hudname;
( 1 << S2 )|( 1 << S3 ), //int stages
{ -20, -20, -20 }, //vec3_t mins;
@@ -1564,6 +1564,7 @@ char *BG_FindNameForClassNum( int pclass )
return bg_classList[ i ].className;
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindNameForClassNum\n" );
//wimp out
return 0;
}
@@ -1583,6 +1584,7 @@ char *BG_FindHumanNameForClassNum( int pclass )
return bg_classList[ i ].humanName;
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindHumanNameForClassNum\n" );
//wimp out
return 0;
}
@@ -1602,6 +1604,7 @@ char *BG_FindModelNameForClass( int pclass )
return bg_classList[ i ].modelName;
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindModelNameForClass\n" );
//note: must return a valid modelName!
return bg_classList[ 0 ].modelName;
}
@@ -1623,6 +1626,7 @@ float BG_FindModelScaleForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindModelScaleForClass\n" );
return 1.0f;
}
@@ -1641,6 +1645,7 @@ char *BG_FindSkinNameForClass( int pclass )
return bg_classList[ i ].skinName;
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindSkinNameForClass\n" );
//note: must return a valid modelName!
return bg_classList[ 0 ].skinName;
}
@@ -1660,6 +1665,7 @@ char *BG_FindHudNameForClass( int pclass )
return bg_classList[ i ].hudName;
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindHudNameForClass\n" );
//note: must return a valid hudName!
return bg_classList[ 0 ].hudName;
}
@@ -1684,6 +1690,7 @@ qboolean BG_FindStagesForClass( int pclass, stage_t stage )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindStagesForClass\n" );
return qfalse;
}
@@ -1782,6 +1789,7 @@ int BG_FindHealthForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindHealthForClass\n" );
return 100;
}
@@ -1802,6 +1810,7 @@ int BG_FindRegenRateForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindRegenRateForClass\n" );
return 0;
}
@@ -1822,6 +1831,7 @@ int BG_FindFovForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindFovForClass\n" );
return 90;
}
@@ -1842,6 +1852,7 @@ float BG_FindBobForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindBobForClass\n" );
return 0.002;
}
@@ -1862,7 +1873,8 @@ float BG_FindSpeedForClass( int pclass )
}
}
- return 1.0;
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindSpeedForClass\n" );
+ return 1.0f;
}
/*
@@ -1882,7 +1894,8 @@ float BG_FindStickyForClass( int pclass )
}
}
- return 1.0;
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindStickyForClass\n" );
+ return 1.0f;
}
/*
@@ -1902,6 +1915,7 @@ int BG_FindSteptimeForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindSteptimeForClass\n" );
return 200;
}
@@ -1946,6 +1960,7 @@ weapon_t BG_FindStartWeaponForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindStartWeaponForClass\n" );
return WP_NONE;
}
@@ -1966,6 +1981,7 @@ float BG_FindBuildDistForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindBuildDistForClass\n" );
return 0.0f;
}
@@ -2025,6 +2041,7 @@ int BG_FindEvolveTimeForClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindEvolveTimeForClass\n" );
return 5000;
}
@@ -2045,6 +2062,7 @@ int BG_FindValueOfClass( int pclass )
}
}
+ Com_Printf( S_COLOR_YELLOW "WARNING: fallthrough in BG_FindValueOfClass\n" );
return 0;
}
@@ -3529,7 +3547,9 @@ void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean
if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_type == PM_FREEZE )
s->eType = ET_INVISIBLE;
- else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH )
+ else if( ps->stats[STAT_HEALTH] <= GIB_HEALTH )
+ s->eType = ET_INVISIBLE;
+ else if( ps->persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
s->eType = ET_INVISIBLE;
else
s->eType = ET_PLAYER;
@@ -3629,6 +3649,8 @@ void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s
s->eType = ET_INVISIBLE;
else if( ps->stats[STAT_HEALTH] <= GIB_HEALTH )
s->eType = ET_INVISIBLE;
+ else if( ps->persistant[ PERS_TEAM ] == TEAM_SPECTATOR )
+ s->eType = ET_INVISIBLE;
else
s->eType = ET_PLAYER;
diff --git a/src/game/g_client.c b/src/game/g_client.c
index 4c95708a..8e3fdaf1 100644
--- a/src/game/g_client.c
+++ b/src/game/g_client.c
@@ -1041,6 +1041,15 @@ void ClientUserinfoChanged( int clientNum )
Com_sprintf( buffer, MAX_QPATH, "%s/%s", BG_FindModelNameForClass( PCL_H_BSUIT ),
BG_FindSkinNameForClass( PCL_H_BSUIT ) );
}
+ else if( client->pers.pclass == PCL_NONE )
+ {
+ //This looks hacky and frankly it is. The clientInfo string needs to hold different
+ //model details to that of the spawning class or the info change will not be
+ //registered and an axis appears instead of the player model. There is zero chance
+ //the player can spawn with the battlesuit, hence this choice.
+ Com_sprintf( buffer, MAX_QPATH, "%s/%s", BG_FindModelNameForClass( PCL_H_BSUIT ),
+ BG_FindSkinNameForClass( PCL_H_BSUIT ) );
+ }
else
{
Com_sprintf( buffer, MAX_QPATH, "%s/%s", BG_FindModelNameForClass( client->pers.pclass ),
@@ -1048,13 +1057,18 @@ void ClientUserinfoChanged( int clientNum )
}
Q_strncpyz( model, buffer, sizeof( model ) );
- //model segmentation
- Com_sprintf( filename, sizeof( filename ), "models/players/%s/animation.cfg",
- BG_FindModelNameForClass( client->pers.pclass ) );
- if( G_NonSegModel( filename ) )
- client->ps.persistant[ PERS_STATE ] |= PS_NONSEGMODEL;
- else
- client->ps.persistant[ PERS_STATE ] &= ~PS_NONSEGMODEL;
+ //don't bother setting model type if spectating
+ if( client->pers.pclass != PCL_NONE )
+ {
+ //model segmentation
+ Com_sprintf( filename, sizeof( filename ), "models/players/%s/animation.cfg",
+ BG_FindModelNameForClass( client->pers.pclass ) );
+
+ if( G_NonSegModel( filename ) )
+ client->ps.persistant[ PERS_STATE ] |= PS_NONSEGMODEL;
+ else
+ client->ps.persistant[ PERS_STATE ] &= ~PS_NONSEGMODEL;
+ }
// wallwalk follow
s = Info_ValueForKey( userinfo, "cg_wwFollow" );
@@ -1402,14 +1416,19 @@ void ClientSpawn( gentity_t *ent, gentity_t *spawn )
hModifier = ALIENSTAGE3_HLTH_MODIFIER;
}
- client->pers.maxHealth = client->ps.stats[ STAT_MAX_HEALTH ] =
- (int)( (float)BG_FindHealthForClass( ent->client->pers.pclass ) * hModifier );
+ if( client->sess.sessionTeam != TEAM_SPECTATOR )
+ client->pers.maxHealth = client->ps.stats[ STAT_MAX_HEALTH ] =
+ (int)( (float)BG_FindHealthForClass( ent->client->pers.pclass ) * hModifier );
+ else
+ client->pers.maxHealth = client->ps.stats[ STAT_MAX_HEALTH ] = 100;
// clear entity values
if( ent->client->pers.pclass == PCL_H_BASE )
weapon = client->pers.pitem;
- else
+ else if( client->sess.sessionTeam != TEAM_SPECTATOR )
weapon = BG_FindStartWeaponForClass( ent->client->pers.pclass );
+ else
+ weapon = WP_NONE;
BG_FindAmmoForWeapon( weapon, &ammo, &clips, &maxClips );
BG_packWeapon( weapon, client->ps.stats );
diff --git a/src/game/g_cmds.c b/src/game/g_cmds.c
index a95f45ea..888743f2 100644
--- a/src/game/g_cmds.c
+++ b/src/game/g_cmds.c
@@ -1824,15 +1824,11 @@ void Cmd_Test_f( gentity_t *ent )
if( !CheatsOk( ent ) )
return;
-/* ent->client->ps.stats[ STAT_STATE ] |= SS_KNOCKEDOVER;
- ent->client->lastKnockedOverTime = level.time;
- G_AddPredictableEvent( ent, EV_KNOCKOVER, 0 );
- VectorCopy( ent->client->ps.viewangles, ent->client->ps.grapplePoint );
-
- ent->client->ps.legsAnim =
- ( ( ent->client->ps.legsAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | BOTH_DEATH1;
- ent->client->ps.torsoAnim =
- ( ( ent->client->ps.torsoAnim & ANIM_TOGGLEBIT ) ^ ANIM_TOGGLEBIT ) | BOTH_DEATH1;*/
+ G_Printf( "%d %d %d\n",
+ ent->client->sess.sessionTeam,
+ ent->client->ps.stats[ STAT_PTEAM ],
+ ent->client->ps.persistant[ PERS_TEAM ]
+ );
}
/*