From: Rudolf Polzer Date: Sat, 12 Nov 2011 18:33:12 +0000 (+0100) Subject: code to run engine physics (except not) X-Git-Tag: xonotic-v0.6.0~74^2~100^2~99 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=8173d9d133b8302f6f4eee1775ca978be635756e;p=xonotic%2Fxonotic-data.pk3dir.git code to run engine physics (except not) --- diff --git a/qcsrc/client/csqc_builtins.qc b/qcsrc/client/csqc_builtins.qc index 6ef34f35e..35cf6b19b 100644 --- a/qcsrc/client/csqc_builtins.qc +++ b/qcsrc/client/csqc_builtins.qc @@ -120,8 +120,8 @@ void (string s, ...) print = #339; void (float scale) setsensitivityscale = #346; -void (float framenum) RetrieveMovementFrame = #345; -void () DefaultPlayerPhysics = #347; +float (float framenum) getinputstate = #345; +void (entity e) runstandardplayerphysics = #347; string (float playernum, string key) getplayerkey = #348; void (string cmdname) registercmd = #352; diff --git a/qcsrc/common/csqcmodel.qc b/qcsrc/common/csqcmodel.qc index 2e7c9c3c8..a178e6c1c 100644 --- a/qcsrc/common/csqcmodel.qc +++ b/qcsrc/common/csqcmodel.qc @@ -84,6 +84,53 @@ void CSQCModel_Draw() InterpolateOrigin_Do(); } + +vector player_org, player_vel; +float player_sequence, player_pmflags; +float pmoveframe; +.float pmove_flags; +void Unpredict() +{ + self.origin = player_org; + self.velocity = player_vel; + pmoveframe = player_sequence+1; //+1 because the recieved frame has the move already done (server side) + self.pmove_flags = player_pmflags; + if (pmoveframe < clientcommandframe-128) + pmoveframe = clientcommandframe-128; // don't want to loop infinitely +} + +void PredictTo(float endframe) +{ + if(servercommandframe >= player_sequence+63) + { + player_sequence = servercommandframe+63; // freeze laggers + return; + } + + Unpredict(); + + if (getstatf(STAT_HEALTH) <= 0) + { + pmoveframe = clientcommandframe; + getinputstate(pmoveframe-1); + return; + } + + while(pmoveframe < endframe) + { + if (!getinputstate(pmoveframe)) + { + break; + } + runstandardplayerphysics(self); + + pmoveframe++; + } + + //add in anything that was applied after (for low packet rate protocols) + input_angles = view_angles; +} + entity csqcmodel_me; float autocvar_chase_active; float autocvar_chase_back; @@ -95,11 +142,9 @@ void CSQCModel_SetCamera() entity oldself; oldself = self; self = csqcmodel_me; - InterpolateOrigin_Do(); + PredictTo(clientcommandframe); self = oldself; - // TODO run prediction - org = csqcmodel_me.origin + csqcmodel_me.view_ofs; ang = R_SetView3fv(VF_ANGLES); @@ -125,7 +170,10 @@ void CSQCModel_Read() float sf; sf = ReadShort(); - InterpolateOrigin_Undo(); + if(self.entnum == player_localentnum) + Unpredict(); + else + InterpolateOrigin_Undo(); #define PROPERTY(flag,r,w,f) \ if(sf & flag) \ @@ -137,15 +185,26 @@ void CSQCModel_Read() #undef PROPERTY_SCALED #undef PROPERTY - // is this me? + // interpolation if(self.entnum == player_localentnum) + { + vector o, v; + o = self.origin; + v = self.velocity; csqcmodel_me = self; - - // interpolation - InterpolateOrigin_Note(); + PredictTo(servercommandframe + 1); + player_pmflags = self.pmove_flags; + player_org = o; + player_vel = v; + player_sequence = servercommandframe; + Unpredict(); + } + else + InterpolateOrigin_Note(); // draw it - self.renderflags = RF_EXTERNALMODEL; + if(self.entnum <= maxclients) + self.renderflags = RF_EXTERNALMODEL; self.drawmask = MASK_NORMAL; self.predraw = CSQCModel_Draw; }