X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcsqcmodellib%2Fcl_player.qc;h=4aa8fdf92cdb89886784437e1ba471ca5b8b0d49;hb=4524af86ee6190c8d7f7cd7ccc068650809a0ce7;hp=dc9627d9e8173fcc86a9c3a45408d71e101f0b6d;hpb=35ec955eb2193b7b96c8236903f8f81f198a6b83;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/csqcmodellib/cl_player.qc b/qcsrc/csqcmodellib/cl_player.qc index dc9627d9e..4aa8fdf92 100644 --- a/qcsrc/csqcmodellib/cl_player.qc +++ b/qcsrc/csqcmodellib/cl_player.qc @@ -20,7 +20,7 @@ * IN THE SOFTWARE. */ -var float autocvar_cl_predictionerrorcompensation = 0; +var float autocvar_cl_movement_errorcompensation = 0; // engine stuff .float pmove_flags; @@ -31,28 +31,59 @@ float pmove_onground; // weird engine flag we shouldn't really use but have to f #define REFDEFFLAG_TELEPORTED 1 #define REFDEFFLAG_JUMPING 2 -entity csqcplayer; vector csqcplayer_origin, csqcplayer_velocity; float csqcplayer_sequence, player_pmflags; float csqcplayer_moveframe; -vector csqcplayer_predictionerror; +vector csqcplayer_predictionerroro; +vector csqcplayer_predictionerrorv; float csqcplayer_predictionerrortime; +float csqcplayer_predictionerrorfactor; -vector CSQCPlayer_GetPredictionError() +vector CSQCPlayer_GetPredictionErrorO() { - if(!autocvar_cl_predictionerrorcompensation) + if(time >= csqcplayer_predictionerrortime) return '0 0 0'; - if(time < csqcplayer_predictionerrortime) - return csqcplayer_predictionerror * (csqcplayer_predictionerrortime - time) * autocvar_cl_predictionerrorcompensation; - return '0 0 0'; + return csqcplayer_predictionerroro * (csqcplayer_predictionerrortime - time) * csqcplayer_predictionerrorfactor; } -void CSQCPlayer_SetPredictionError(vector v) +vector CSQCPlayer_GetPredictionErrorV() { - if(!autocvar_cl_predictionerrorcompensation) + if(time >= csqcplayer_predictionerrortime) + return '0 0 0'; + return csqcplayer_predictionerrorv * (csqcplayer_predictionerrortime - time) * csqcplayer_predictionerrorfactor; +} + +void CSQCPlayer_SetPredictionError(vector o, vector v, float onground_diff) +{ + // error too big to compensate, we LIKELY hit a teleport or a + // jumppad, or it's a jump time disagreement that'll get fixed + // next frame + + // FIXME we sometimes have disagreement in order of jump velocity. Do not act on them! + /* + // commented out as this one did not help + if(onground_diff) + { + print(sprintf("ONGROUND MISMATCH: %d x=%v v=%v\n", onground_diff, o, v)); return; - csqcplayer_predictionerror = (csqcplayer_predictionerrortime - time) * autocvar_cl_predictionerrorcompensation * csqcplayer_predictionerror + v; - csqcplayer_predictionerrortime = time + 1.0 / autocvar_cl_predictionerrorcompensation; + } + */ + if(vlen(o) > 32 || vlen(v) > 192) + { + //print(sprintf("TOO BIG: x=%v v=%v\n", o, v)); + return; + } + + if(!autocvar_cl_movement_errorcompensation) + { + csqcplayer_predictionerrorfactor = 0; + return; + } + + csqcplayer_predictionerroro = CSQCPlayer_GetPredictionErrorO() + o; + csqcplayer_predictionerrorv = CSQCPlayer_GetPredictionErrorV() + v; + csqcplayer_predictionerrorfactor = autocvar_cl_movement_errorcompensation / ticrate; + csqcplayer_predictionerrortime = time + 1.0 / csqcplayer_predictionerrorfactor; } void CSQCPlayer_Unpredict() @@ -92,15 +123,21 @@ void CSQCPlayer_SavePrediction() csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED; } -void CSQCPlayer_PredictTo(float endframe) +void CSQCPlayer_PredictTo(float endframe, float apply_error) { CSQCPlayer_Unpredict(); + if(apply_error) + { + self.origin += CSQCPlayer_GetPredictionErrorO(); + self.velocity += CSQCPlayer_GetPredictionErrorV(); + } CSQCPlayer_SetMinsMaxs(); csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED; - // FIXME do we really NEED this? dead players have servercommandframe - // == 0 and thus won't predict +#if 0 + // we don't need this + // darkplaces makes servercommandframe == 0 in these cases anyway if (getstatf(STAT_HEALTH) <= 0) { csqcplayer_moveframe = clientcommandframe; @@ -108,6 +145,7 @@ void CSQCPlayer_PredictTo(float endframe) print("the Weird code path got hit\n"); return; } +#endif if(csqcplayer_moveframe >= endframe) { @@ -183,11 +221,12 @@ void CSQCPlayer_SetCamera() { vector o, v; o = self.origin; + v = v0; csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED; - CSQCPlayer_PredictTo(servercommandframe + 1); - CSQCPlayer_SetPredictionError(o - self.origin); + CSQCPlayer_PredictTo(servercommandframe + 1, FALSE); + CSQCPlayer_SetPredictionError(self.origin - o, self.velocity - v, pmove_onground - !!(self.pmove_flags & PMF_ONGROUND)); self.origin = o; - self.velocity = v0; + self.velocity = v; // get crouch state from the server if(getstati(STAT_VIEWHEIGHT) == PL_VIEW_OFS_z) @@ -203,7 +242,7 @@ void CSQCPlayer_SetCamera() CSQCPlayer_SavePrediction(); } - CSQCPlayer_PredictTo(clientcommandframe + 1); + CSQCPlayer_PredictTo(clientcommandframe + 1, TRUE); CSQCPlayer_SetMinsMaxs();