void CG_PredictPlayerState( void ) { int cmdNum, current; playerState_t oldPlayerState; qboolean moved; usercmd_t oldestCmd; usercmd_t latestCmd; vec3_t deltaAngles; pmoveExt_t pmext; // int useCommand = 0; cg.hyperspace = qfalse; // will be set if touching a trigger_teleport // if this is the first frame we must guarantee // predictedPlayerState is valid even if there is some // other error condition if ( !cg.validPPS ) { cg.validPPS = qtrue; cg.predictedPlayerState = cg.snap->ps; } // demo playback just copies the moves if(cg.demoPlayback || (cg.snap->ps.pm_flags & PMF_FOLLOW)) { CG_InterpolatePlayerState( qfalse ); return; } // non-predicting local movement will grab the latest angles if ( cg_nopredict.integer #ifdef ALLOW_GSYNC || cg_synchronousClients.integer #endif // ALLOW_GSYNC ) { cg_pmove.ps = &cg.predictedPlayerState; cg_pmove.pmext = &cg.pmext; cg.pmext.airleft = (cg.waterundertime - cg.time);