- // move up
- // FIXME: don't link?
- SV_PushEntity (ent, upmove, vec3_origin);
-
- // move forward
- ent->v->velocity[0] = oldvel[0];
- ent->v->velocity[1] = oldvel[1];
- ent->v->velocity[2] = 0;
- clip = SV_FlyMove (ent, sv.frametime, stepnormal);
- ent->v->velocity[2] += oldvel[2];
-
- // check for stuckness, possibly due to the limited precision of floats
- // in the clipping hulls
- if (clip
- && fabs(oldorg[1] - ent->v->origin[1]) < 0.03125
- && fabs(oldorg[0] - ent->v->origin[0]) < 0.03125)
- // stepping up didn't make any progress
- clip = SV_TryUnstick (ent, oldvel);
-
- // extra friction based on view angle
- if (clip & 2 && sv_wallfriction.integer)
- SV_WallFriction (ent, stepnormal);
+ // check for stuckness, possibly due to the limited precision of floats
+ // in the clipping hulls
+ if (clip
+ && fabs(originalmove_origin[1] - ent->v->origin[1]) < 0.03125
+ && fabs(originalmove_origin[0] - ent->v->origin[0]) < 0.03125)
+ {
+ //Con_Printf("wall\n");
+ // stepping up didn't make any progress, revert to original move
+ VectorCopy(originalmove_origin, ent->v->origin);
+ VectorCopy(originalmove_velocity, ent->v->velocity);
+ //clip = originalmove_clip;
+ ent->v->flags = originalmove_flags;
+ ent->v->groundentity = originalmove_groundentity;
+ // now try to unstick if needed
+ //clip = SV_TryUnstick (ent, oldvel);
+ return;
+ }
+
+ //Con_Printf("step - ");
+
+ // extra friction based on view angle
+ if (clip & 2 && sv_wallfriction.integer)
+ SV_WallFriction (ent, stepnormal);
+ }
+ // skip out if stepdown is enabled, moving downward, not in water, and the move started onground and ended offground
+ else if (!(sv_gameplayfix_stepdown.integer && ent->v->waterlevel < 2 && start_velocity[2] < (1.0 / 32.0) && oldonground && !((int)ent->v->flags & FL_ONGROUND)))
+ return;