seta cl_forcemyplayermodel "" "set to the model file name you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
seta cl_forcemyplayerskin 0 "set to the skin number you want to show yourself as (requires server to have sv_use_csqc_players 1; does not affect how enemies look with cl_forceplayermodels)"
seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (requires server to have sv_use_csqc_players 1, and is ignored in teamplay; does not affect how enemies look with cl_forceplayermodels)"
-seta cl_movement_errorcompensation 0 "try to compensate for prediction errors and reduce preceived lag (requires server to have sv_use_csqc_players 1)"
+seta cl_movement_errorcompensation 1 "try to compensate for prediction errors and reduce preceived lag (requires server to have sv_use_csqc_players 1)"
// debug cvars for keyhunt attaching
set _angles "0 0 0"
return csqcplayer_predictionerrorv * (csqcplayer_predictionerrortime - time) * csqcplayer_predictionerrorfactor;
}
-void CSQCPlayer_SetPredictionError(vector o, vector v)
+void CSQCPlayer_SetPredictionError(vector o, vector v, float onground_diff)
{
- if(!autocvar_cl_movement_errorcompensation)
+ // 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)
{
- csqcplayer_predictionerrorfactor = 0;
+ print(sprintf("ONGROUND MISMATCH: %d x=%v v=%v\n", onground_diff, o, v));
+ return;
+ }
+ */
+ if(vlen(o) > 32 || vlen(v) > 192)
+ {
+ //print(sprintf("TOO BIG: x=%v v=%v\n", o, v));
return;
}
- // 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
- if(vlen(o) > 32 || vlen(v) > 128)
+ if(!autocvar_cl_movement_errorcompensation)
+ {
+ csqcplayer_predictionerrorfactor = 0;
return;
+ }
csqcplayer_predictionerroro = CSQCPlayer_GetPredictionErrorO() + o;
csqcplayer_predictionerrorv = CSQCPlayer_GetPredictionErrorV() + v;
v = v0;
csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED;
CSQCPlayer_PredictTo(servercommandframe + 1, FALSE);
- CSQCPlayer_SetPredictionError(self.origin - o, self.velocity - v);
+ CSQCPlayer_SetPredictionError(self.origin - o, self.velocity - v, pmove_onground - !!(self.pmove_flags & PMF_ONGROUND));
self.origin = o;
self.velocity = v;
spot = vehicles_findgoodexit(spot);
setorigin(self.owner , spot);
self.owner.velocity = (v_up + v_forward * 0.25) * 750;
+ self.owner.oldvelocity = self.owner.velocity;
}
else
{
- self.owner.velocity = '0 0 0';
+ self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed;
+ self.owner.oldvelocity = self.owner.velocity;
spot = self.origin - v_forward * 200 + '0 0 64';
spot = vehicles_findgoodexit(spot);
setorigin(self.owner , spot);
spot = vehicles_findgoodexit(spot);
setorigin(self.owner , spot);
self.owner.velocity = (v_up + v_forward * 0.25) * 750;
+ self.owner.oldvelocity = self.owner.velocity;
}
else
{
- self.owner.velocity = '0 0 0';
+ self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed;
+ self.owner.oldvelocity = self.owner.velocity;
spot = self.origin - v_forward * 200 + '0 0 64';
spot = vehicles_findgoodexit(spot);
setorigin(self.owner , spot);
spot = vehicles_findgoodexit(spot);
setorigin(self.owner , spot);
self.owner.velocity = (v_up + v_forward * 0.25) * 750;
+ self.owner.oldvelocity = self.owner.velocity;
}
else
{
- self.owner.velocity = '0 0 0';
+ self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed;
+ self.owner.oldvelocity = self.owner.velocity;
spot = self.origin - v_forward * 200 + '0 0 64';
spot = vehicles_findgoodexit(spot);
setorigin(self.owner , spot);