]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/csqcmodel/cl_player.qc
Merge branch 'master' into divVerent/csqcmodel
[xonotic/xonotic-data.pk3dir.git] / qcsrc / csqcmodel / cl_player.qc
index 14c3b66c78833466b06ba20a83b0c141bad8b771..8679502ec62bb0868cae7e7a6375b69f5de866d1 100644 (file)
@@ -24,8 +24,13 @@ var float autocvar_cl_predictionerrorcompensation = 0;
 var float autocvar_chase_active;
 var float autocvar_chase_back;
 
+// engine stuff
 .float pmove_flags;
+float pmove_onground; // weird engine flag we shouldn't really use but have to for now
 #define PMF_DUCKED 4
+#define PMF_ONGROUND 8
+#define REFDEFFLAG_TELEPORTED 1
+#define REFDEFFLAG_JUMPING 2
 
 entity csqcplayer;
 vector csqcplayer_origin, csqcplayer_velocity;
@@ -122,6 +127,8 @@ float CSQCPlayer_IsLocalPlayer()
        return (self == csqcplayer);
 }
 
+void(entity e) V_CalcRefdef = #640; // DP_CSQC_V_CALCREFDEF
+
 void CSQCPlayer_SetCamera()
 {
        if(csqcplayer)
@@ -135,6 +142,23 @@ void CSQCPlayer_SetCamera()
                {
                        InterpolateOrigin_Do();
                        self.view_ofs = '0 0 1' * getstati(STAT_VIEWHEIGHT);
+
+                       // get crouch state from the server
+                       if(getstati(STAT_VIEWHEIGHT) == PL_VIEW_OFS_z)
+                               self.pmove_flags &~= PMF_DUCKED;
+                       else if(getstati(STAT_VIEWHEIGHT) == PL_CROUCH_VIEW_OFS_z)
+                               self.pmove_flags |= PMF_DUCKED;
+
+                       // get onground state from the server
+                       if(pmove_onground)
+                               self.pmove_flags |= PMF_ONGROUND;
+                       else
+                               self.pmove_flags &~= PMF_ONGROUND;
+
+                       CSQCPlayer_SetMinsMaxs();
+
+                       // override it back just in case
+                       self.view_ofs = '0 0 1' * getstati(STAT_VIEWHEIGHT);
                }
                else
                {
@@ -155,35 +179,45 @@ void CSQCPlayer_SetCamera()
                                else if(getstati(STAT_VIEWHEIGHT) == PL_CROUCH_VIEW_OFS_z)
                                        self.pmove_flags |= PMF_DUCKED;
 
+                               // get onground state from the server
+                               if(pmove_onground)
+                                       self.pmove_flags |= PMF_ONGROUND;
+                               else
+                                       self.pmove_flags &~= PMF_ONGROUND;
+
                                CSQCPlayer_SavePrediction();
                        }
                        CSQCPlayer_PredictTo(clientcommandframe);
-               }
 
-               self = oldself;
+                       CSQCPlayer_SetMinsMaxs();
+               }
 
                // relink
-               setorigin(csqcplayer, csqcplayer.origin);
+               setorigin(self, self.origin);
 
-               org = csqcplayer.origin + self.view_ofs + CSQCPlayer_GetPredictionError();
-               ang = R_SetView3fv(VF_ANGLES);
+               // FIXME support svc_setview?
 
-               // simulate missing engine features
-               if(autocvar_chase_active)
+               if(checkextension("DP_CSQC_V_CALCREFDEF"))
                {
-                       float dist;
-                       vector chase_dest;
-                       dist = -autocvar_chase_back - 8;
-                       makevectors(ang);
-                       chase_dest = org + v_forward * dist;
-                       traceline(org, chase_dest, MOVE_NOMONSTERS, csqcplayer);
-                       org = trace_endpos + 8 * v_forward + 4 * trace_plane_normal;
-               }
+                       var float refdefflags = 0;
+
+                       if(self.csqcmodel_teleported)
+                       {
+                               refdefflags |= REFDEFFLAG_TELEPORTED;
+                               self.csqcmodel_teleported = 0;
+                       }
+
+                       if(input_buttons & 4)
+                               refdefflags |= REFDEFFLAG_JUMPING;
 
-               R_SetView3fv(VF_ORIGIN, org);
-               R_SetView3fv(VF_ANGLES, ang);
+                       V_CalcRefdef(self);
+               }
+               else
+                       R_SetView3fv(VF_ORIGIN, self.origin + self.view_ofs);
 
                { CSQCPLAYER_HOOK_POSTCAMERASETUP }
+
+               self = oldself;
        }
 }
 
@@ -207,10 +241,13 @@ float CSQCPlayer_PreUpdate()
 
 float CSQCPlayer_PostUpdate()
 {
+       /*
        if(self.entnum == player_localentnum)
                self.renderflags |= RF_EXTERNALMODEL;
        else
                self.renderflags &~= RF_EXTERNALMODEL;
+       */
+
        if(self.entnum != player_localentnum)
                return 0;
        csqcplayer_status = CSQCPLAYERSTATUS_FROMSERVER;