]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
code to run engine physics (except not)
authorRudolf Polzer <divverent@xonotic.org>
Sat, 12 Nov 2011 18:33:12 +0000 (19:33 +0100)
committerRudolf Polzer <divverent@xonotic.org>
Sat, 12 Nov 2011 18:33:12 +0000 (19:33 +0100)
qcsrc/client/csqc_builtins.qc
qcsrc/common/csqcmodel.qc

index 6ef34f35eab5fa8109e2eda628b889ace10a431d..35cf6b19bcd6aa87308efbd243064b98269c3bc7 100644 (file)
@@ -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;
index 2e7c9c3c8e638faca529dd493971fd45a24532cf..a178e6c1c30324214c9c36acb3eb3d619bed4971 100644 (file)
@@ -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;
 }