Index: src/game/g_local.h =================================================================== --- src/game/g_local.h (revision 802) +++ src/game/g_local.h (working copy) @@ -347,6 +347,9 @@ // 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 @@ int medKitIncrementTime; int lastCreepSlowTime; // time until creep can be removed - int pouncePayload; // amount of damage pounce attack will do qboolean allowedToPounce; qboolean charging; Index: src/game/g_active.c =================================================================== --- src/game/g_active.c (revision 802) +++ src/game/g_active.c (working copy) @@ -526,13 +526,8 @@ 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 ) @@ -1144,6 +1139,7 @@ } pm.ps = &client->ps; + pm.pmext = &client->pmext; pm.cmd = *ucmd; if( pm.ps->pm_type == PM_DEAD ) Index: src/game/bg_pmove.c =================================================================== --- src/game/bg_pmove.c (revision 802) +++ src/game/bg_pmove.c (working copy) @@ -552,6 +552,9 @@ pm->ps->pm_flags |= PMF_BACKWARDS_JUMP; } + pm->pmext->pouncePayload = pm->ps->stats[ STAT_MISC ]; + pm->ps->stats[ STAT_MISC ] = 0; + return qtrue; } Index: src/game/g_weapon.c =================================================================== --- src/game/g_weapon.c (revision 802) +++ src/game/g_weapon.c (working copy) @@ -1303,8 +1303,11 @@ 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 ); Index: src/game/g_client.c =================================================================== --- src/game/g_client.c (revision 802) +++ src/game/g_client.c (working copy) @@ -1230,6 +1230,7 @@ // 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 Index: src/game/bg_public.h =================================================================== --- src/game/bg_public.h (revision 802) +++ src/game/bg_public.h (working copy) @@ -149,12 +149,17 @@ #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