summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/bg_pmove.c3
-rw-r--r--src/game/bg_public.h7
-rw-r--r--src/game/g_active.c8
-rw-r--r--src/game/g_client.c2
-rw-r--r--src/game/g_local.h4
-rw-r--r--src/game/g_weapon.c22
6 files changed, 32 insertions, 14 deletions
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index 4afdfaac..80ee0138 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -552,6 +552,9 @@ static qboolean PM_CheckPounce( void )
pm->ps->pm_flags |= PMF_BACKWARDS_JUMP;
}
+ pm->pmext->pouncePayload = pm->ps->stats[ STAT_MISC ];
+ pm->ps->stats[ STAT_MISC ] = 0;
+
return qtrue;
}
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 2b723421..69a44072 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -149,12 +149,17 @@ typedef enum
#define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK|PMF_TIME_WALLJUMP)
+typedef struct
+{
+ int pouncePayload;
+} pmoveExt_t;
+
#define MAXTOUCH 32
typedef struct
{
// state (in / out)
playerState_t *ps;
-
+ pmoveExt_t *pmext;
// command (in)
usercmd_t cmd;
int tracemask; // collide against these types of surfaces
diff --git a/src/game/g_active.c b/src/game/g_active.c
index b0fdb56f..a496c226 100644
--- a/src/game/g_active.c
+++ b/src/game/g_active.c
@@ -519,13 +519,8 @@ void ClientTimerActions( gentity_t *ent, int msec )
if( !( ucmd->buttons & BUTTON_ATTACK2 ) )
{
- if( client->ps.stats[ STAT_MISC ] > 0 )
- {
+ if( client->pmext.pouncePayload > 0 )
client->allowedToPounce = qtrue;
- client->pouncePayload = client->ps.stats[ STAT_MISC ];
- }
-
- client->ps.stats[ STAT_MISC ] = 0;
}
if( client->ps.stats[ STAT_MISC ] > pounceSpeed )
@@ -1137,6 +1132,7 @@ void ClientThink_real( gentity_t *ent )
}
pm.ps = &client->ps;
+ pm.pmext = &client->pmext;
pm.cmd = *ucmd;
if( pm.ps->pm_type == PM_DEAD )
diff --git a/src/game/g_client.c b/src/game/g_client.c
index fcbc8f3b..284ac2f3 100644
--- a/src/game/g_client.c
+++ b/src/game/g_client.c
@@ -762,6 +762,7 @@ void respawn( gentity_t *ent )
SpawnCorpse( ent );
//TA: Clients can't respawn - they must go thru the class cmd
+ ent->client->pers.classSelection = PCL_NONE;
ClientSpawn( ent, NULL, NULL, NULL );
}
@@ -1230,6 +1231,7 @@ void ClientBegin( int clientNum )
// world to the new position
flags = client->ps.eFlags;
memset( &client->ps, 0, sizeof( client->ps ) );
+ memset( &client->pmext, 0, sizeof( client->pmext ) );
client->ps.eFlags = flags;
// locate ent at a spawn point
diff --git a/src/game/g_local.h b/src/game/g_local.h
index cbe9401d..07a32ab2 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -347,6 +347,9 @@ struct gclient_s
// ps MUST be the first element, because the server expects it
playerState_t ps; // communicated by server to clients
+ // exported into pmove, but not communicated to clients
+ pmoveExt_t pmext;
+
// the rest of the structure is private to game
clientPersistant_t pers;
clientSession_t sess;
@@ -418,7 +421,6 @@ struct gclient_s
int medKitIncrementTime;
int lastCreepSlowTime; // time until creep can be removed
- int pouncePayload; // amount of damage pounce attack will do
qboolean allowedToPounce;
qboolean charging;
diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c
index d57f259f..18c3b8fc 100644
--- a/src/game/g_weapon.c
+++ b/src/game/g_weapon.c
@@ -579,9 +579,16 @@ void LCChargeFire( gentity_t *ent, qboolean secondary )
gentity_t *m;
if( secondary )
- m = fire_luciferCannon( ent, muzzle, forward, LCANNON_SECONDARY_DAMAGE, LCANNON_SECONDARY_RADIUS );
+ {
+ m = fire_luciferCannon( ent, muzzle, forward, LCANNON_SECONDARY_DAMAGE,
+ LCANNON_SECONDARY_RADIUS );
+ ent->client->ps.weaponTime = LCANNON_REPEAT;
+ }
else
+ {
m = fire_luciferCannon( ent, muzzle, forward, ent->client->ps.stats[ STAT_MISC ], LCANNON_RADIUS );
+ ent->client->ps.weaponTime = LCANNON_CHARGEREPEAT;
+ }
ent->client->ps.stats[ STAT_MISC ] = 0;
}
@@ -1260,15 +1267,15 @@ qboolean CheckPounceAttack( gentity_t *ent )
VectorSet( mins, -LEVEL3_POUNCE_WIDTH, -LEVEL3_POUNCE_WIDTH, -LEVEL3_POUNCE_WIDTH );
VectorSet( maxs, LEVEL3_POUNCE_WIDTH, LEVEL3_POUNCE_WIDTH, LEVEL3_POUNCE_WIDTH );
- if( !ent->client->allowedToPounce )
- return qfalse;
-
if( ent->client->ps.groundEntityNum != ENTITYNUM_NONE )
{
ent->client->allowedToPounce = qfalse;
- return qfalse;
+ ent->client->pmext.pouncePayload = 0;
}
+ if( !ent->client->allowedToPounce )
+ return qfalse;
+
if( ent->client->ps.weaponTime )
return qfalse;
@@ -1303,7 +1310,10 @@ qboolean CheckPounceAttack( gentity_t *ent )
if( !traceEnt->takedamage )
return qfalse;
- damage = (int)( ( (float)ent->client->pouncePayload / (float)LEVEL3_POUNCE_SPEED ) * LEVEL3_POUNCE_DMG );
+ damage = (int)( ( (float)ent->client->pmext.pouncePayload
+ / (float)LEVEL3_POUNCE_SPEED ) * LEVEL3_POUNCE_DMG );
+
+ ent->client->pmext.pouncePayload = 0;
G_Damage( traceEnt, ent, ent, forward, tr.endpos, damage,
DAMAGE_NO_KNOCKBACK|DAMAGE_NO_LOCDAMAGE, MOD_LEVEL3_POUNCE );