From b98bf384124a0866ad9e20d65f253ec21c4cb3a1 Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 1 Mar 2018 23:34:41 +1000 Subject: [PATCH] Move crouch checking into prediction code (fixes crouching prediction) --- qcsrc/common/physics/player.qc | 53 +++++++++++++++++++-------------- qcsrc/common/physics/player.qh | 4 +++ qcsrc/ecs/systems/sv_physics.qc | 1 + qcsrc/server/client.qc | 37 ----------------------- 4 files changed, 36 insertions(+), 59 deletions(-) diff --git a/qcsrc/common/physics/player.qc b/qcsrc/common/physics/player.qc index 7d3cab007..14981df2e 100644 --- a/qcsrc/common/physics/player.qc +++ b/qcsrc/common/physics/player.qc @@ -98,42 +98,51 @@ float GeomLerp(float a, float _lerp, float b) void PM_ClientMovement_UpdateStatus(entity this) { -#ifdef CSQC if(!IS_PLAYER(this)) return; - // set crouched - bool do_crouch = PHYS_INPUT_BUTTON_CROUCH(this); + bool have_hook = false; for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { - entity wep = viewmodels[slot]; - if(wep.hook && !wasfreed(wep.hook)) + #if defined(CSQC) + entity wepent = viewmodels[slot]; + #elif defined(SVQC) + .entity weaponentity = weaponentities[slot]; + entity wepent = this.(weaponentity); + #endif + if(wepent.hook && !wasfreed(wepent.hook)) { - do_crouch = false; - break; // don't bother checking the others + have_hook = true; + break; } } - if(this.waterlevel >= WATERLEVEL_SWIMMING) + bool do_crouch = PHYS_INPUT_BUTTON_CROUCH(this); + if (have_hook) { + do_crouch = false; + } else if (this.waterlevel >= WATERLEVEL_SWIMMING) { do_crouch = false; - if(hud != HUD_NORMAL) + } else if (PHYS_INVEHICLE(this)) { do_crouch = false; - if(STAT(FROZEN, this)) + } else if (STAT(FROZEN, this)) { do_crouch = false; + } - if (do_crouch) - { - // wants to crouch, this always works - if (!IS_DUCKED(this)) SET_DUCKED(this); - } - else - { - // wants to stand, if currently crouching we need to check for a low ceiling first - if (IS_DUCKED(this)) - { - tracebox(this.origin, STAT(PL_MIN, this), STAT(PL_MAX, this), this.origin, MOVE_NORMAL, this); - if (!trace_startsolid) UNSET_DUCKED(this); + if (do_crouch) { + if (!IS_DUCKED(this)) { + SET_DUCKED(this); + this.view_ofs = STAT(PL_CROUCH_VIEW_OFS, this); + setsize(this, STAT(PL_CROUCH_MIN, this), STAT(PL_CROUCH_MAX, this)); + // setanim(this, this.anim_duck, false, true, true); // this anim is BROKEN anyway } + } else if (IS_DUCKED(this)) { + tracebox(this.origin, STAT(PL_MIN, this), STAT(PL_MAX, this), this.origin, false, this); + if (!trace_startsolid) { + UNSET_DUCKED(this); + this.view_ofs = STAT(PL_VIEW_OFS, this); + setsize(this, STAT(PL_MIN, this), STAT(PL_MAX, this)); + } } +#ifdef CSQC if (IS_ONGROUND(this) || this.velocity.z <= 0 || PHYS_WATERJUMP_TIME(this) <= 0) PHYS_WATERJUMP_TIME(this) = 0; diff --git a/qcsrc/common/physics/player.qh b/qcsrc/common/physics/player.qh index 4b2ffc55f..c351c2466 100644 --- a/qcsrc/common/physics/player.qh +++ b/qcsrc/common/physics/player.qh @@ -240,6 +240,8 @@ STATIC_INIT(PHYS_INPUT_BUTTON_DODGE) #define SET_DUCKED(s) ((s).flags |= FL_DUCKED) #define UNSET_DUCKED(s) ((s).flags &= ~FL_DUCKED) + #define PHYS_INVEHICLE(s) (boolean(hud != HUD_NORMAL)) + #define PHYS_JUMPSPEEDCAP_MIN autocvar_cl_jumpspeedcap_min #define PHYS_JUMPSPEEDCAP_MAX autocvar_cl_jumpspeedcap_max @@ -292,6 +294,8 @@ STATIC_INIT(PHYS_INPUT_BUTTON_DODGE) #define SET_DUCKED(s) ((s).crouch = true) #define UNSET_DUCKED(s) ((s).crouch = false) + #define PHYS_INVEHICLE(s) (boolean((s).vehicle != NULL)) + #define PHYS_JUMPSPEEDCAP_MIN autocvar_sv_jumpspeedcap_min #define PHYS_JUMPSPEEDCAP_MAX autocvar_sv_jumpspeedcap_max diff --git a/qcsrc/ecs/systems/sv_physics.qc b/qcsrc/ecs/systems/sv_physics.qc index 5ae47c394..c3594c013 100644 --- a/qcsrc/ecs/systems/sv_physics.qc +++ b/qcsrc/ecs/systems/sv_physics.qc @@ -4,6 +4,7 @@ void sys_phys_fix(entity this, float dt) { WarpZone_PlayerPhysics_FixVAngle(this); Physics_UpdateStats(this); + PM_ClientMovement_UpdateStatus(this); } bool sys_phys_override(entity this, float dt) diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index 01f2b74e0..f87a5b765 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -2239,43 +2239,6 @@ bool PlayerThink(entity this) return false; } - bool have_hook = false; - for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) - { - .entity weaponentity = weaponentities[slot]; - if(this.(weaponentity).hook.state) - { - have_hook = true; - break; - } - } - bool do_crouch = PHYS_INPUT_BUTTON_CROUCH(this); - if (have_hook) { - do_crouch = false; - } else if (this.waterlevel >= WATERLEVEL_SWIMMING) { - do_crouch = false; - } else if (this.vehicle) { - do_crouch = false; - } else if (STAT(FROZEN, this)) { - do_crouch = false; - } - - if (do_crouch) { - if (!this.crouch) { - this.crouch = true; - this.view_ofs = STAT(PL_CROUCH_VIEW_OFS, this); - setsize(this, STAT(PL_CROUCH_MIN, this), STAT(PL_CROUCH_MAX, this)); - // setanim(this, this.anim_duck, false, true, true); // this anim is BROKEN anyway - } - } else if (this.crouch) { - tracebox(this.origin, STAT(PL_MIN, this), STAT(PL_MAX, this), this.origin, false, this); - if (!trace_startsolid) { - this.crouch = false; - this.view_ofs = STAT(PL_VIEW_OFS, this); - setsize(this, STAT(PL_MIN, this), STAT(PL_MAX, this)); - } - } - FixPlayermodel(this); // LordHavoc: allow firing on move frames (sub-ticrate), this gives better timing on slow servers -- 2.39.2