/* 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); } } } }
/* =================== PM_AirMove =================== */ void PM_AirMove (void) { int i; vec3_t wishvel; float fmove, smove; vec3_t wishdir; float wishspeed; float maxspeed; fmove = pm->cmd.forwardmove; smove = pm->cmd.sidemove; //!!!!! pitch should be 1/3 so this isn't needed??! #if 0 pml.forward[2] = 0; pml.right[2] = 0; VectorNormalize (pml.forward); VectorNormalize (pml.right); #endif for (i=0 ; i<2 ; i++) wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; wishvel[2] = 0; PM_AddCurrents (wishvel); VectorCopy (wishvel, wishdir); wishspeed = VectorNormalize(wishdir); // // clamp to server defined max speed // maxspeed = (pm->s.pm_flags & PMF_DUCKED) ? pm_duckspeed : pm_maxspeed; if (wishspeed > maxspeed) { VectorScale (wishvel, maxspeed/wishspeed, wishvel); wishspeed = maxspeed; } if ( pml.ladder ) { PM_Accelerate (wishdir, wishspeed, pm_accelerate); if (!wishvel[2]) { if (pml.velocity[2] > 0) { pml.velocity[2] -= pm->s.gravity * pml.frametime; if (pml.velocity[2] < 0) pml.velocity[2] = 0; } else { pml.velocity[2] += pm->s.gravity * pml.frametime; if (pml.velocity[2] > 0) pml.velocity[2] = 0; } } PM_StepSlideMove (); } else if ( pm->groundentity ) { // walking on ground pml.velocity[2] = 0; //!!! this is before the accel PM_Accelerate (wishdir, wishspeed, pm_accelerate); // PGM -- fix for negative trigger_gravity fields // pml.velocity[2] = 0; if(pm->s.gravity > 0) pml.velocity[2] = 0; else pml.velocity[2] -= pm->s.gravity * pml.frametime; // PGM if (!pml.velocity[0] && !pml.velocity[1]) return; PM_StepSlideMove (); } else { // not on ground, so little effect on velocity if (pm_airaccelerate) PM_AirAccelerate (wishdir, wishspeed, pm_accelerate); else PM_Accelerate (wishdir, wishspeed, 1); // add gravity pml.velocity[2] -= pm->s.gravity * pml.frametime; PM_StepSlideMove (); } }
void PM_AirMove (void) { int i; vec3_t wishvel; float fmove, smove; vec3_t wishdir; float wishspeed; float maxspeed; fmove = pm->cmd.forwardmove; smove = pm->cmd.sidemove; for (i=0 ; i<2 ; i++) wishvel[i] = pml.forward[i]*fmove + pml.right[i]*smove; wishvel[2] = 0; PM_AddCurrents (wishvel); VectorCopy (wishvel, wishdir); wishspeed = VectorNormalize(wishdir); /* clamp to server defined max speed */ maxspeed = (pm->s.pm_flags & PMF_DUCKED) ? pm_duckspeed : pm_maxspeed; if (wishspeed > maxspeed) { VectorScale (wishvel, maxspeed/wishspeed, wishvel); wishspeed = maxspeed; } if ( pml.ladder ) { PM_Accelerate (wishdir, wishspeed, pm_accelerate); if (!wishvel[2]) { if (pml.velocity[2] > 0) { pml.velocity[2] -= pm->s.gravity * pml.frametime; if (pml.velocity[2] < 0) pml.velocity[2] = 0; } else { pml.velocity[2] += pm->s.gravity * pml.frametime; if (pml.velocity[2] > 0) pml.velocity[2] = 0; } } PM_StepSlideMove (); } else if ( pm->groundentity ) { /* walking on ground */ pml.velocity[2] = 0; PM_Accelerate (wishdir, wishspeed, pm_accelerate); if(pm->s.gravity > 0) pml.velocity[2] = 0; else pml.velocity[2] -= pm->s.gravity * pml.frametime; if (!pml.velocity[0] && !pml.velocity[1]) return; PM_StepSlideMove (); } else { /* not on ground, so little effect on velocity */ if (pm_airaccelerate) PM_AirAccelerate (wishdir, wishspeed, pm_accelerate); else PM_Accelerate (wishdir, wishspeed, 1); /* add gravity */ pml.velocity[2] -= pm->s.gravity * pml.frametime; PM_StepSlideMove (); } }
/* =================== PM_AirMove =================== */ void PM_AirMove (void) { int i; vec3_t wishvel; float fmove, smove; vec3_t wishdir; float wishspeed; 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 (pmove.waterjumptime) // Con_Printf ("am->%f, %f, %f\n", pmove.velocity[0], pmove.velocity[1], pmove.velocity[2]); if ( onground != -1) { pmove.velocity[2] = 0; PM_Accelerate (wishdir, wishspeed, movevars.accelerate); pmove.velocity[2] -= movevars.entgravity * movevars.gravity * frametime; PM_GroundMove (); } 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; PM_FlyMove (); } //Con_Printf("airmove:vec: %4.2f %4.2f %4.2f\n", // pmove.velocity[0], // pmove.velocity[1], // pmove.velocity[2]); // // if (pmove.waterjumptime) // Con_Printf ("<-am%f, %f, %f\n", pmove.velocity[0], pmove.velocity[1], pmove.velocity[2]); }