]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
better crouch handling
authorRudolf Polzer <divverent@xonotic.org>
Mon, 14 Nov 2011 14:48:35 +0000 (15:48 +0100)
committerRudolf Polzer <divverent@xonotic.org>
Mon, 14 Nov 2011 14:48:35 +0000 (15:48 +0100)
qcsrc/common/constants.qh
qcsrc/csqcmodel/cl_player.qc
qcsrc/csqcmodel/settings.qh
qcsrc/server/autocvars.qh
qcsrc/server/constants.qh
qcsrc/server/miscfunctions.qc

index 02530c2da34ba0f003abd2ae8137c51d3ce90e2a..010f17be791771aea36ab0b3acc29cadd54a9d3a 100644 (file)
@@ -720,3 +720,29 @@ float HUD_MENU_ENABLE              = 0;
 #define SERVERFLAG_ALLOW_FULLBRIGHT 1
 #define SERVERFLAG_TEAMPLAY 2
 #define SERVERFLAG_PLAYERSTATS 4
+
+var vector autocvar_sv_player_maxs = '16 16 45';
+var vector autocvar_sv_player_mins = '-16 -16 -24';
+var vector autocvar_sv_player_viewoffset = '0 0 20';
+var vector autocvar_sv_player_crouch_maxs = '16 16 25';
+var vector autocvar_sv_player_crouch_mins = '-16 -16 -24';
+var vector autocvar_sv_player_crouch_viewoffset = '0 0 20';
+var vector autocvar_sv_player_headsize = '24 24 12';
+
+#define PL_VIEW_OFS autocvar_sv_player_viewoffset
+#define PL_MIN autocvar_sv_player_mins
+#define PL_MAX autocvar_sv_player_maxs
+#define PL_CROUCH_VIEW_OFS autocvar_sv_player_crouch_viewoffset
+#define PL_CROUCH_MIN autocvar_sv_player_crouch_mins
+#define PL_CROUCH_MAX autocvar_sv_player_crouch_maxs
+#define PL_HEAD autocvar_sv_player_headsize
+
+// helpers
+#define PL_VIEW_OFS_z autocvar_sv_player_viewoffset_z
+#define PL_MIN_z autocvar_sv_player_mins_z
+#define PL_MAX_z autocvar_sv_player_maxs_z
+#define PL_CROUCH_VIEW_OFS_z autocvar_sv_player_crouch_viewoffset_z
+#define PL_CROUCH_MIN_z autocvar_sv_player_mins_z
+#define PL_HEAD_x autocvar_sv_player_headsize_x
+#define PL_HEAD_y autocvar_sv_player_headsize_y
+#define PL_HEAD_z autocvar_sv_player_headsize_z
index 3ee4afa130be823ed580f5f61293faadd1b143e7..29b0ed9c30190a3ed06fa144b66278b3968bc4de 100644 (file)
@@ -25,6 +25,7 @@ var float autocvar_chase_active;
 var float autocvar_chase_back;
 
 .float pmove_flags;
+#define PMF_DUCKED 4
 
 entity csqcplayer;
 vector csqcplayer_origin, csqcplayer_velocity;
@@ -62,6 +63,22 @@ void CSQCPlayer_Unpredict()
        self.pmove_flags = player_pmflags;
 }
 
+void CSQCPlayer_SetMinsMaxs()
+{
+       if(self.pmove_flags & PMF_DUCKED)
+       {
+               self.mins = PL_CROUCH_MIN;
+               self.maxs = PL_CROUCH_MAX;
+               self.view_ofs = PL_CROUCH_VIEW_OFS;
+       }
+       else
+       {
+               self.mins = PL_MIN;
+               self.maxs = PL_MAX;
+               self.view_ofs = PL_VIEW_OFS;
+       }
+}
+
 void CSQCPlayer_SavePrediction()
 {
        player_pmflags = self.pmove_flags;
@@ -74,6 +91,7 @@ void CSQCPlayer_SavePrediction()
 void CSQCPlayer_PredictTo(float endframe)
 {
        CSQCPlayer_Unpredict();
+       CSQCPlayer_SetMinsMaxs();
 
        csqcplayer_status = CSQCPLAYERSTATUS_PREDICTED;
 
@@ -91,7 +109,7 @@ void CSQCPlayer_PredictTo(float endframe)
                        break;
                }
                runstandardplayerphysics(self);
-
+               CSQCPlayer_SetMinsMaxs();
                csqcplayer_moveframe++;
        }
 
@@ -116,6 +134,7 @@ void CSQCPlayer_SetCamera()
                if(servercommandframe == 0)
                {
                        InterpolateOrigin_Do();
+                       self.view_ofs = '0 0 1' * getstati(STAT_VIEWHEIGHT);
                }
                else
                {
@@ -129,6 +148,13 @@ void CSQCPlayer_SetCamera()
                                CSQCPlayer_SetPredictionError(o - self.origin);
                                self.origin = o;
                                self.velocity = v;
+
+                               // 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;
+
                                CSQCPlayer_SavePrediction();
                        }
                        CSQCPlayer_PredictTo(clientcommandframe);
@@ -136,7 +162,7 @@ void CSQCPlayer_SetCamera()
 
                self = oldself;
 
-               org = csqcplayer.origin + '0 0 1' * getstati(STAT_VIEWHEIGHT) + CSQCPlayer_GetPredictionError();
+               org = csqcplayer.origin + self.view_ofs + CSQCPlayer_GetPredictionError();
                ang = R_SetView3fv(VF_ANGLES);
 
                // simulate missing engine features
index 51c3a771ef636917edd4ada493630032a045f17a..40eba7d0a1371dd081f8e2f560de0fa7ef2eec24 100644 (file)
 #define CSQCMODELS_HOOK_PREUPDATE
 #define CSQCMODELS_HOOK_POSTUPDATE
 #define CSQCMODELS_HOOK_PREDRAW
+
+// mod must define:
+//vector PL_MIN  = ...;
+//vector PL_MAX  = ...;
+//vector PL_VIEW_OFS  = ...;
+//vector PL_CROUCH_MIN  = ...;
+//vector PL_CROUCH_MAX  = ...;
+//vector PL_CROUCH_VIEW_OFS  = ...;
index 86521da8edd9433ad8a0d5028719e24d04b31ba4..80c01d4cf9cbe923c2d1f033369cf9430ed8b420 100644 (file)
@@ -1132,13 +1132,6 @@ float autocvar_sv_maxairspeed;
 float autocvar_sv_maxairstrafespeed;
 float autocvar_sv_maxspeed;
 string autocvar_sv_motd;
-string autocvar_sv_player_crouch_maxs;
-string autocvar_sv_player_crouch_mins;
-string autocvar_sv_player_crouch_viewoffset;
-string autocvar_sv_player_headsize;
-string autocvar_sv_player_maxs;
-string autocvar_sv_player_mins;
-string autocvar_sv_player_viewoffset;
 float autocvar_sv_player_jumpanim_minfall;
 float autocvar_sv_precacheplayermodels;
 float autocvar_sv_precacheweapons;
index 5e18a5cc60c55bb4936887ab9fab6f8b80153105..7cefb530d9f14be48ec3fb4f657fd1a07b0bbe3f 100644 (file)
@@ -125,13 +125,6 @@ float      MSG_ALL                                 = 2; // reliable
 float  MSG_INIT                                = 3; // initialization
 float  MSG_ENTITY                              = 5; // csqc
 
-vector PL_VIEW_OFS                             = '0 0 35';
-vector PL_MIN                                  = '-16 -16 -24';
-vector PL_MAX                                  = '16 16 45';
-vector PL_CROUCH_VIEW_OFS                      = '0 0 15';
-vector PL_CROUCH_MIN                           = '-16 -16 -24';
-vector PL_CROUCH_MAX                           = '16 16 25';
-
 // Sajt - added these, just as constants. Not sure how you want them actually put in the game, but I just
 // did this so at least they worked
 // NOTE: instagib IS NOT compatible with rocket-arena, so make sure to prevent selecting both in a menu
index 2fe562774d0d625468b36e4333f1e9547e17a607..97dd6017d92defca63829e3d42d0d34991c74ffa 100644 (file)
@@ -136,25 +136,9 @@ void GameLogClose()
     }
 }
 
-vector PL_VIEW_OFS;
-vector PL_MIN;
-vector PL_MAX;
-vector PL_HEAD;
-vector PL_CROUCH_VIEW_OFS;
-vector PL_CROUCH_MIN;
-vector PL_CROUCH_MAX;
-
 float spawnpoint_nag;
 void relocate_spawnpoint()
 {
-    PL_VIEW_OFS                             = stov(autocvar_sv_player_viewoffset);
-    PL_MIN                                  = stov(autocvar_sv_player_mins);
-    PL_MAX                                  = stov(autocvar_sv_player_maxs);
-    PL_HEAD                                 = stov(autocvar_sv_player_headsize);
-    PL_CROUCH_VIEW_OFS                      = stov(autocvar_sv_player_crouch_viewoffset);
-    PL_CROUCH_MIN                           = stov(autocvar_sv_player_crouch_mins);
-    PL_CROUCH_MAX                           = stov(autocvar_sv_player_crouch_maxs);
-
     // nudge off the floor
     setorigin(self, self.origin + '0 0 1');