pg damage = 15, radius = 20 points = damage * ( 1.0 - dist / radius ); points dist frames until landing ------------------------------------------- 0.696 19.072 10 1.9752 17.3664 9 3.2904 15.6128 8 4.6416 13.8112 7 6.0288 11.9616 6 7.452 10.064 5 8.9112 8.1184 4 10.4064 6.1248 3 11.9376 4.0832 2 13.5048 1.9936 1 (list of all dists less than 20 while coming down from a jump) points is passed to G_Damage as damage knockback = damage; if ( knockback > 200 ) { knockback = 200; } ... if ( !targ->client->ps.pm_time ) { int t; t = knockback * 2; if ( t < 50 ) { t = 50; } if ( t > 200 ) { t = 200; } targ->client->ps.pm_time = t; targ->client->ps.pm_flags |= PMF_TIME_KNOCKBACK; } all points values * 2 are less than 50 so t = 50 at 8 ms per frame, PMF_TIME_KNOCKBACK will be set for 6 frames so in order for PMF_TIME_KNOCKBACK to still be set when PMF_TIME_LAND gets set you need to land within 6 frames of getting pg knockback the following notes don't change the fact that you have a 6 frame window points is cast to an int when it is passed to G_Damage dist is always an integer for two reasons: when a missile explodes its position is snapped (toward the direction it came from to make sure it doesn't end up outside the map) dist is calculated from a player's r.absmin/max, which is calculated in SV_LinkEntity from r.currentOrigin and r.mins/maxs r.mins/maxs are integral to begin with and r.currentOrigin is snapped after Pmove by BG_PlayerStateToEntityState additionally, r.absmins/max are padded by 1 unit