summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cgame/cg_predict.c5
-rw-r--r--src/cgame/cg_weapons.c2
-rw-r--r--src/game/bg_pmove.c64
-rw-r--r--src/game/bg_public.h2
-rw-r--r--src/game/g_active.c20
-rw-r--r--src/game/g_local.h2
-rw-r--r--src/game/g_weapon.c54
7 files changed, 101 insertions, 48 deletions
diff --git a/src/cgame/cg_predict.c b/src/cgame/cg_predict.c
index 6ded046c..602efa0b 100644
--- a/src/cgame/cg_predict.c
+++ b/src/cgame/cg_predict.c
@@ -399,7 +399,7 @@ to ease the jerk.
=================
*/
void CG_PredictPlayerState( void ) {
- int cmdNum, current;
+ int cmdNum, current, i;
playerState_t oldPlayerState;
qboolean moved;
usercmd_t oldestCmd;
@@ -564,7 +564,8 @@ void CG_PredictPlayerState( void ) {
// don't predict gauntlet firing, which is only supposed to happen
// when it actually inflicts damage
- cg_pmove.gauntletHit = qfalse;
+ for( i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++ )
+ cg_pmove.autoWeaponHit[ i ] = qfalse;
if ( cg_pmove.pmove_fixed ) {
cg_pmove.cmd.serverTime = ((cg_pmove.cmd.serverTime + pmove_msec.integer-1) / pmove_msec.integer) * pmove_msec.integer;
diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c
index cc1f835e..470d1603 100644
--- a/src/cgame/cg_weapons.c
+++ b/src/cgame/cg_weapons.c
@@ -1200,7 +1200,7 @@ void CG_DrawWeaponSelect( void ) {
x = 10;
y = 10;
- for ( i = WP_GAUNTLET; i < WP_NUM_WEAPONS; i++ ) {
+ for ( i = WP_NONE + 1; i < WP_NUM_WEAPONS; i++ ) {
if( !BG_gotWeapon( i, cg.snap->ps.stats ) )
continue;
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index 091a5032..50791ad4 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -71,7 +71,7 @@ static void PM_AddSmoothOp( vec3_t rotAxis, float rotAngle )
//this happens often because groundtrace is called twice a frame
for( i = 0; i < MAXSMOOTHS; i++ )
{
- if( wcl[ pm->ps->clientNum ].sList[ i ].time >= pm->cmd.serverTime - 10 )
+ if( wcl[ pm->ps->clientNum ].sList[ i ].time >= pm->cmd.serverTime - 50 )
return;
/*if( VectorCompare( sList[ i ].rotAxis, rotAxis ) )
@@ -2121,15 +2121,10 @@ PM_TorsoAnimation
==============
*/
-static void PM_TorsoAnimation( void ) {
- if ( pm->ps->weaponstate == WEAPON_READY ) {
- if ( pm->ps->weapon == WP_GAUNTLET ) {
- PM_ContinueTorsoAnim( TORSO_STAND2 );
- } else {
- PM_ContinueTorsoAnim( TORSO_STAND );
- }
- return;
- }
+static void PM_TorsoAnimation( void )
+{
+ if ( pm->ps->weaponstate == WEAPON_READY )
+ PM_ContinueTorsoAnim( TORSO_STAND );
}
@@ -2241,38 +2236,41 @@ static void PM_Weapon( void ) {
return;
}
- if ( pm->ps->weaponstate == WEAPON_RAISING ) {
+ if ( pm->ps->weaponstate == WEAPON_RAISING )
+ {
pm->ps->weaponstate = WEAPON_READY;
- if ( pm->ps->weapon == WP_GAUNTLET ) {
- PM_StartTorsoAnim( TORSO_STAND2 );
- } else {
- PM_StartTorsoAnim( TORSO_STAND );
- }
+ PM_StartTorsoAnim( TORSO_STAND );
return;
}
if( pm->ps->weapon == WP_SCANNER )
return; //doesn't actually do anything
- // check for fire
- if ( ! (pm->cmd.buttons & BUTTON_ATTACK) ) {
- pm->ps->weaponTime = 0;
- pm->ps->weaponstate = WEAPON_READY;
- return;
- }
-
// start the animation even if out of ammo
- if ( pm->ps->weapon == WP_GAUNTLET ) {
- // the guantlet only "fires" when it actually hits something
- if ( !pm->gauntletHit ) {
- pm->ps->weaponTime = 0;
- pm->ps->weaponstate = WEAPON_READY;
- return;
- }
- PM_StartTorsoAnim( TORSO_ATTACK2 );
- } else {
- PM_StartTorsoAnim( TORSO_ATTACK );
+
+ switch( pm->ps->weapon )
+ {
+ case WP_VENOM:
+ if( !pm->autoWeaponHit[ WP_VENOM ] )
+ {
+ pm->ps->weaponTime = 0;
+ pm->ps->weaponstate = WEAPON_READY;
+ return;
+ }
+ break;
+
+ default:
+ // check for fire
+ if ( !( pm->cmd.buttons & BUTTON_ATTACK ) )
+ {
+ pm->ps->weaponTime = 0;
+ pm->ps->weaponstate = WEAPON_READY;
+ return;
+ }
+ break;
}
+
+ PM_StartTorsoAnim( TORSO_ATTACK );
BG_unpackAmmoArray( pm->ps->weapon, pm->ps->ammo, pm->ps->powerups, &ammo, &clips, &maxclips );
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 1e9ab8b5..a4b16110 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -194,7 +194,7 @@ typedef struct {
int tracemask; // collide against these types of surfaces
int debugLevel; // if set, diagnostic output will be printed
qboolean noFootsteps; // if the game is setup for no footsteps by the server
- qboolean gauntletHit; // true if a gauntlet attack would actually hit something
+ qboolean autoWeaponHit[ 32 ]; //FIXME: TA: remind myself later this might be a problem
int framecount;
diff --git a/src/game/g_active.c b/src/game/g_active.c
index 246c68fb..66c9c279 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -822,14 +822,18 @@ void ClientThink_real( gentity_t *ent ) {
memset (&pm, 0, sizeof(pm));
- //TA: gauntlet is a NULL weapon to be given to builder classes
- // check for the hit-scan gauntlet, don't let the action
- // go through as an attack unless it actually hits something
- /*if ( client->ps.weapon == WP_GAUNTLET && !( ucmd->buttons & BUTTON_TALK ) &&
- ( ucmd->buttons & BUTTON_ATTACK ) && client->ps.weaponTime <= 0 ) {
- pm.gauntletHit = CheckGauntletAttack( ent );
- }*/
- pm.gauntletHit = qfalse;
+ if( !( ucmd->buttons & BUTTON_TALK ) && client->ps.weaponTime <= 0 )
+ {
+ switch( client->ps.weapon )
+ {
+ case WP_VENOM:
+ pm.autoWeaponHit[ WP_VENOM ] = CheckVenomAttack( ent );
+ break;
+
+ default:
+ break;
+ }
+ }
if ( ent->flags & FL_FORCE_GESTURE ) {
ent->flags &= ~FL_FORCE_GESTURE;
diff --git a/src/game/g_local.h b/src/game/g_local.h
index f0087b26..34d7bbfd 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -620,7 +620,7 @@ void ShineTorch( gentity_t *self );
qboolean LogAccuracyHit( gentity_t *target, gentity_t *attacker );
void CalcMuzzlePoint( gentity_t *ent, vec3_t forward, vec3_t right, vec3_t up, vec3_t muzzlePoint );
void SnapVectorTowards( vec3_t v, vec3_t to );
-qboolean CheckGauntletAttack( gentity_t *ent );
+qboolean CheckVenomAttack( gentity_t *ent );
void Weapon_HookFree (gentity_t *ent);
void Weapon_HookThink (gentity_t *ent);
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index ad637897..98f39453 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -604,13 +604,63 @@ void Weapon_Hbuild_Fire( gentity_t *ent )
}
///////build weapons
+//=====
+//VENOM
+//=====
+
+/*
+===============
+CheckVenomAttack
+===============
+*/
+qboolean CheckVenomAttack( gentity_t *ent ) {
+ trace_t tr;
+ vec3_t end;
+ gentity_t *tent;
+ gentity_t *traceEnt;
+ int damage;
+
+ // set aiming directions
+ AngleVectors (ent->client->ps.viewangles, forward, right, up);
+
+ CalcMuzzlePoint( ent, forward, right, up, muzzle );
+
+ VectorMA (muzzle, 32, forward, end);
+
+ trap_Trace (&tr, muzzle, NULL, NULL, end, ent->s.number, MASK_SHOT);
+ if ( tr.surfaceFlags & SURF_NOIMPACT ) {
+ return qfalse;
+ }
+
+ traceEnt = &g_entities[ tr.entityNum ];
+
+ // send blood impact
+ if ( traceEnt->takedamage && traceEnt->client ) {
+ tent = G_TempEntity( tr.endpos, EV_MISSILE_HIT );
+ tent->s.otherEntityNum = traceEnt->s.number;
+ tent->s.eventParm = DirToByte( tr.plane.normal );
+ tent->s.weapon = ent->s.weapon;
+ }
+
+ if( !traceEnt->takedamage)
+ return qfalse;
+ if( traceEnt->biteam == PTE_DROIDS )
+ return qfalse;
+ if( traceEnt->client && traceEnt->client->ps.stats[ STAT_PTEAM ] == PTE_DROIDS )
+ return qfalse;
+
+ G_Damage( traceEnt, ent, ent, forward, tr.endpos, 50, 0, MOD_VENOM );
+
+ return qtrue;
+}
+
/*
===============
Weapon_Venom_Fire
===============
*/
void Weapon_Venom_Fire( gentity_t *ent ) {
- trace_t tr;
+/* trace_t tr;
vec3_t end;
gentity_t *tent;
gentity_t *traceEnt;
@@ -640,7 +690,7 @@ void Weapon_Venom_Fire( gentity_t *ent ) {
if ( traceEnt->takedamage) {
G_Damage( traceEnt, ent, ent, forward, tr.endpos, 50, 0, MOD_VENOM );
}
-
+*/
}
//======================================================================