Behold, the function that contains the source of the strafe jumping feature/bug, and included a hidden fix provided from Quake III (the fix is under the comment
// proper way (avoids strafe jump maxspeed bug), but feels bad):
Handles user intended acceleration
static void PM_Accelerate( vec3_t wishdir, float wishspeed, float accel )
// q2 style
float addspeed, accelspeed, currentspeed;
currentspeed = DotProduct( pm->ps->velocity, wishdir );
addspeed = wishspeed - currentspeed;
if( addspeed <= 0 )
accelspeed = accel * pml.frametime * wishspeed;
if( accelspeed > addspeed )
accelspeed = addspeed;
for( i = 0; i < 3; i++ )
pm->ps->velocity[ i ] += accelspeed * wishdir[ i ];
// proper way (avoids strafe jump maxspeed bug), but feels bad
VectorScale( wishdir, wishspeed, wishVelocity );
VectorSubtract( wishVelocity, pm->ps->velocity, pushDir );
pushLen = VectorNormalize( pushDir );
canPush = accel * pml.frametime * wishspeed;
if( canPush > pushLen )
canPush = pushLen;
VectorMA( pm->ps->velocity, canPush, pushDir, pm->ps->velocity );
First thing I’m thinking is adding a game side cvar for strafe jumping which would switch between the two approaches (so that masochists and sadists would still have the option for their server to have the classical strafe jumping bug for their servers).
Second thing is to have a simplified jump that would yield the same end results as the old strafe jumping, where there would be a bit of an acceleration after each jump forward. The question is should this occur from the first jump, or only on repeated jumps, or should it be enabled/disabled as @romdos suggested with sprint (which is probably what I’m leaning towards, but would also mean that aliens would have to make use of such a sprint as well).
The cvar could have multiple options, like at least: 0) No accelerated jumping, 1) Classical strafe jumping, 2) Simplified accelerated jumping. If it pays to have multiple kinds of simplified accelerated jumping to choose from, we could include them as options in the cvar as well.
Note that this has not been implemented on the GrangerLab server yet, but it is on the TODO, I think this is something worth exploring. Feel free to add any further thoughts/considerations/suggestions on this concept.