From 780df3d4c8c05a74b64af03b46794e6cbc65fa19 Mon Sep 17 00:00:00 2001 From: Mario Date: Sun, 23 Sep 2018 11:48:18 +1000 Subject: [PATCH] Fix unsticking so it uses the actual offset position rather than the entity's current position, also implement SV_CheckStuck for player unsticking to oldorigin --- qcsrc/common/physics/movetypes/movetypes.qc | 31 +++++++++++++++++---- qcsrc/common/physics/movetypes/movetypes.qh | 8 +++++- qcsrc/common/physics/movetypes/walk.qc | 2 +- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index e518fe210..e31b4076b 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -406,11 +406,11 @@ entity _Movetype_TestEntityPosition_ent; bool _Movetype_TestEntityPosition(vector ofs) // SV_TestEntityPosition { entity this = _Movetype_TestEntityPosition_ent; -// vector org = this.origin + ofs; + vector org = this.origin + ofs; int cont = this.dphitcontentsmask; this.dphitcontentsmask = DPCONTENTS_SOLID; - tracebox(this.origin, this.mins, this.maxs, this.origin, ((this.move_movetype == MOVETYPE_FLY_WORLDONLY) ? MOVE_WORLDONLY : MOVE_NOMONSTERS), this); + tracebox(org, this.mins, this.maxs, org, ((this.move_movetype == MOVETYPE_FLY_WORLDONLY) ? MOVE_WORLDONLY : MOVE_NOMONSTERS), this); this.dphitcontentsmask = cont; if(trace_startsolid) @@ -421,11 +421,11 @@ bool _Movetype_TestEntityPosition(vector ofs) // SV_TestEntityPosition return false; } -bool _Movetype_UnstickEntity(entity this) // SV_UnstickEntity +int _Movetype_UnstickEntity(entity this) // SV_UnstickEntity { _Movetype_TestEntityPosition_ent = this; if (!_Movetype_TestEntityPosition(' 0 0 0')) { - return true; + return UNSTICK_FINE; } #define X(v) if (_Movetype_TestEntityPosition(v)) X('-1 0 0') X(' 1 0 0') @@ -444,13 +444,32 @@ bool _Movetype_UnstickEntity(entity this) // SV_UnstickEntity { LOG_DEBUGF("Can't unstick an entity (edict: %d, classname: %s, origin: %s)", etof(this), this.classname, vtos(this.origin)); - return false; + return UNSTICK_STUCK; } } LOG_DEBUGF("Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)", etof(this), this.classname, vtos(this.origin)); _Movetype_LinkEdict(this, true); - return true; + return UNSTICK_FIXED; +} + +void _Movetype_CheckStuck(entity this) // SV_CheckStuck +{ + int unstick = _Movetype_UnstickEntity(this); // sets test position entity + switch(unstick) + { + case UNSTICK_FINE: + this.oldorigin = this.origin; + break; + case UNSTICK_FIXED: + break; // already sorted + case UNSTICK_STUCK: + vector offset = this.oldorigin - this.origin; + if(!_Movetype_TestEntityPosition(offset)) + _Movetype_LinkEdict(this, false); + // couldn't unstick, should we warn about this? + break; + } } vector _Movetype_ClipVelocity(vector vel, vector norm, float f) // SV_ClipVelocity diff --git a/qcsrc/common/physics/movetypes/movetypes.qh b/qcsrc/common/physics/movetypes/movetypes.qh index 36cbd9f46..62b7964d9 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qh +++ b/qcsrc/common/physics/movetypes/movetypes.qh @@ -80,10 +80,16 @@ void set_movetype(entity this, int mt); .float move_suspendedinair; .float move_didgravity; +// unsticking +const int UNSTICK_FINE = 0; +const int UNSTICK_FIXED = 1; +const int UNSTICK_STUCK = 2; + void _Movetype_WallFriction(entity this, vector stepnormal); int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnormal, float stepheight); void _Movetype_CheckVelocity(entity this); void _Movetype_CheckWaterTransition(entity ent); +void _Movetype_CheckStuck(entity this); float _Movetype_CheckWater(entity ent); void _Movetype_LinkEdict_TouchAreaGrid(entity this); void _Movetype_LinkEdict(entity this, float touch_triggers); @@ -98,7 +104,7 @@ void Movetype_Physics_NoMatchServer(entity this); void _Movetype_LinkEdict(entity this, float touch_triggers); void _Movetype_LinkEdict_TouchAreaGrid(entity this); -float _Movetype_UnstickEntity(entity this); +int _Movetype_UnstickEntity(entity this); const int MAX_CLIP_PLANES = 5; diff --git a/qcsrc/common/physics/movetypes/walk.qc b/qcsrc/common/physics/movetypes/walk.qc index d22b6d32a..c0f2fac96 100644 --- a/qcsrc/common/physics/movetypes/walk.qc +++ b/qcsrc/common/physics/movetypes/walk.qc @@ -8,7 +8,7 @@ void _Movetype_Physics_Walk(entity this, float dt) // SV_WalkMove return; if (GAMEPLAYFIX_UNSTICKPLAYERS(this)) - _Movetype_UnstickEntity(this); + _Movetype_CheckStuck(this); bool applygravity = (!_Movetype_CheckWater(this) && this.move_movetype == MOVETYPE_WALK && !(this.flags & FL_WATERJUMP)); -- 2.39.2