]> 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 452703e66dfb89befd992a7664ef972b6d136360..8679502ec62bb0868cae7e7a6375b69f5de866d1 100644 (file)
@@ -24,10 +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_TELEPORTED 16
+#define PMF_ONGROUND 8
+#define REFDEFFLAG_TELEPORTED 1
+#define REFDEFFLAG_JUMPING 2
 
 entity csqcplayer;
 vector csqcplayer_origin, csqcplayer_velocity;
@@ -124,6 +127,8 @@ float CSQCPlayer_IsLocalPlayer()
        return (self == csqcplayer);
 }
 
+void(entity e) V_CalcRefdef = #640; // DP_CSQC_V_CALCREFDEF
+
 void CSQCPlayer_SetCamera()
 {
        if(csqcplayer)
@@ -137,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
                {
@@ -157,33 +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);
+
+               // FIXME support svc_setview?
 
                if(checkextension("DP_CSQC_V_CALCREFDEF"))
                {
-                       // set teleport bit
-                       if(csqcplayer.csqcmodel_teleported)
+                       var float refdefflags = 0;
+
+                       if(self.csqcmodel_teleported)
                        {
-                               csqcplayer.pmove_flags |= PMF_TELEPORTED;
-                               csqcplayer.csqcmodel_teleported = 0;
+                               refdefflags |= REFDEFFLAG_TELEPORTED;
+                               self.csqcmodel_teleported = 0;
                        }
-                       else
-                               csqcplayer.pmove_flags &~= PMF_TELEPORTED;
 
-                       V_CalcRefdef(csqcplayer);
+                       if(input_buttons & 4)
+                               refdefflags |= REFDEFFLAG_JUMPING;
+
+                       V_CalcRefdef(self);
                }
                else
-                       R_SetView3fv(VF_ORIGIN, csqcplayer.origin + csqcplayer.view_ofs);
+                       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;