From 25bea77fed3ba90566d6d93ec67c5281d4b0a3d9 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Mon, 14 Nov 2011 15:48:35 +0100 Subject: [PATCH] better crouch handling --- qcsrc/common/constants.qh | 26 ++++++++++++++++++++++++++ qcsrc/csqcmodel/cl_player.qc | 30 ++++++++++++++++++++++++++++-- qcsrc/csqcmodel/settings.qh | 8 ++++++++ qcsrc/server/autocvars.qh | 7 ------- qcsrc/server/constants.qh | 7 ------- qcsrc/server/miscfunctions.qc | 16 ---------------- 6 files changed, 62 insertions(+), 32 deletions(-) diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 02530c2da..010f17be7 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -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 diff --git a/qcsrc/csqcmodel/cl_player.qc b/qcsrc/csqcmodel/cl_player.qc index 3ee4afa13..29b0ed9c3 100644 --- a/qcsrc/csqcmodel/cl_player.qc +++ b/qcsrc/csqcmodel/cl_player.qc @@ -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 diff --git a/qcsrc/csqcmodel/settings.qh b/qcsrc/csqcmodel/settings.qh index 51c3a771e..40eba7d0a 100644 --- a/qcsrc/csqcmodel/settings.qh +++ b/qcsrc/csqcmodel/settings.qh @@ -18,3 +18,11 @@ #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 = ...; diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 86521da8e..80c01d4cf 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -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; diff --git a/qcsrc/server/constants.qh b/qcsrc/server/constants.qh index 5e18a5cc6..7cefb530d 100644 --- a/qcsrc/server/constants.qh +++ b/qcsrc/server/constants.qh @@ -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 diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 2fe562774..97dd6017d 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -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'); -- 2.39.2