/* PlayerMove Returns with origin, angles, and velocity modified in place. Numtouch and touchindex[] will be set if any of the physents were contacted during the move. */ void PlayerMove (void) { frametime = pmove.cmd.msec * 0.001; pmove.numtouch = 0; AngleVectors (pmove.angles, forward, right, up); if (pmove.spectator) { SpectatorMove (); return; } NudgePosition (); // take angles directly from command VectorCopy (pmove.cmd.angles, pmove.angles); // set onground, watertype, and waterlevel PM_CategorizePosition (); if (waterlevel == 2) CheckWaterJump (); if (pmove.velocity[2] < 0) pmove.waterjumptime = 0; if (pmove.cmd.buttons & BUTTON_JUMP) JumpButton (); else pmove.oldbuttons &= ~BUTTON_JUMP; PM_Friction (); if (waterlevel >= 2) PM_WaterMove (); else if (pmove.flying) PM_FlymodeMove (); else PM_AirMove (); // set onground, watertype, and waterlevel for final spot PM_CategorizePosition (); }
//Used when cl_nopred is 1 to determine whether we are on ground, otherwise stepup smoothing code produces ugly jump physics void CL_CategorizePosition (void) { if (cl.spectator && cl.playernum == cl.viewplayernum) { cl.onground = false; // in air return; } VectorClear (pmove.velocity); VectorCopy (cl.simorg, pmove.origin); pmove.numtouch = 0; PM_CategorizePosition (); cl.onground = pmove.onground; }
/* ================== CL_CategorizePosition Used when cl_nopred is 1 to determine whether we are on ground, otherwise stepup smoothing code produces ugly jump physics ================== */ void CL_CategorizePosition (void) { if (cl.spectator && cam_curtarget == CAM_NOTARGET) { cl.onground = false; // in air cl.waterlevel = 0; return; } VectorClear (cl.pmove.velocity); VectorCopy (cl.simorg, cl.pmove.origin); cl.pmove.numtouch = 0; PM_CategorizePosition (&cl.pmove); cl.onground = cl.pmove.onground; cl.waterlevel = cl.pmove.waterlevel; }
/* PM_AirMove */ void PM_AirMove (void) { int i; vec3_t wishvel; float fmove, smove; vec3_t wishdir; float wishspeed; vec3_t original; fmove = pmove.cmd.forwardmove; smove = pmove.cmd.sidemove; forward[2] = 0; right[2] = 0; VectorNormalize (forward); VectorNormalize (right); for (i = 0; i < 2; i++) wishvel[i] = forward[i] * fmove + right[i] * smove; wishvel[2] = 0; VectorCopy (wishvel, wishdir); wishspeed = VectorNormalize (wishdir); // // clamp to server defined max speed // if (wishspeed > movevars.maxspeed) { VectorScale (wishvel, movevars.maxspeed / wishspeed, wishvel); wishspeed = movevars.maxspeed; } if (onground != -1) { pmove.velocity[2] = 0; PM_Accelerate (wishdir, wishspeed, movevars.accelerate); pmove.velocity[2] -= movevars.entgravity * movevars.gravity * frametime; PM_GroundMove (); } else if (pmove.flying) { PM_AirAccelerate (wishdir, wishspeed, movevars.accelerate); PM_FlyMove (); } else { // not on ground, so little effect on velocity PM_AirAccelerate (wishdir, wishspeed, movevars.accelerate); // add gravity pmove.velocity[2] -= movevars.entgravity * movevars.gravity * frametime; if (!PM_FlyMove ()) { // the move didn't get blocked PM_CategorizePosition (); if (onground != -1) // but we're on ground now { // This is a hack to fix the jumping bug VectorCopy (pmove.origin, original); // Calculate correct velocity if (!PM_FlyMove ()) { // This shouldn't probably happen (?) if (pmove.velocity[2] < 0) pmove.velocity[2] = 0; } VectorCopy (original, pmove.origin); } } } }