From: Mario Date: Sat, 13 Oct 2018 16:53:50 +0000 (+1000) Subject: Apply some tweaks to the QC movetypes to somewhat match what the engine is doing... X-Git-Tag: xonotic-v0.8.5~1754^2~3 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=3fbe2612073d87265cecd108e860081db95acf9e;p=xonotic%2Fxonotic-data.pk3dir.git Apply some tweaks to the QC movetypes to somewhat match what the engine is doing, attempt to fix players stuck inside other players --- diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index e31b4076b..ef9fbdf0f 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -36,11 +36,15 @@ void _Movetype_WallFriction(entity this, vector stepnormal) // SV_WallFriction vector planes[MAX_CLIP_PLANES]; int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnormal, float stepheight) // SV_FlyMove { + if(dt <= 0) + return 0; + int blocked = 0; int i, j, numplanes = 0; float time_left = dt, grav = 0; vector push; - vector primal_velocity, original_velocity, restore_velocity; + vector primal_velocity, original_velocity; + vector restore_velocity = this.velocity; for(i = 0; i < MAX_CLIP_PLANES; ++i) planes[i] = '0 0 0'; @@ -59,7 +63,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma } } - original_velocity = primal_velocity = restore_velocity = this.velocity; + original_velocity = primal_velocity = this.velocity; for(int bumpcount = 0;bumpcount < MAX_CLIP_PLANES;bumpcount++) { @@ -67,8 +71,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma break; push = this.velocity * time_left; - _Movetype_PushEntity(this, push, true); - if(trace_startsolid) + if(!_Movetype_PushEntity(this, push, true, false)) { // we got teleported by a touch function // let's abort the move @@ -113,22 +116,19 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma vector org = this.origin; vector steppush = '0 0 1' * stepheight; - _Movetype_PushEntity(this, steppush, true); - if(trace_startsolid) + if(!_Movetype_PushEntity(this, steppush, true, false)) { blocked |= 8; break; } - _Movetype_PushEntity(this, push, true); - if(trace_startsolid) + if(!_Movetype_PushEntity(this, push, true, false)) { blocked |= 8; break; } float trace2_fraction = trace_fraction; - steppush = '0 0 1' * (org.z - this.origin_z); - _Movetype_PushEntity(this, steppush, true); - if(trace_startsolid) + steppush = vec3(0, 0, org.z - this.origin_z); + if(!_Movetype_PushEntity(this, steppush, true, false)) { blocked |= 8; break; @@ -501,20 +501,32 @@ void _Movetype_PushEntityTrace(entity this, vector push) tracebox(this.origin, this.mins, this.maxs, end, type, this); } -float _Movetype_PushEntity(entity this, vector push, bool failonstartsolid) // SV_PushEntity +bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool dolink) // SV_PushEntity { _Movetype_PushEntityTrace(this, push); if(trace_startsolid && failonstartsolid) - return trace_fraction; + { + int oldtype = this.move_nomonsters; + this.move_nomonsters = MOVE_NOMONSTERS; + _Movetype_PushEntityTrace(this, push); + this.move_nomonsters = oldtype; + if(trace_startsolid) + return true; + } this.origin = trace_endpos; + vector last_origin = this.origin; + + if(dolink) + _Movetype_LinkEdict(this, true); + if(trace_fraction < 1) if(this.solid >= SOLID_TRIGGER && (!IS_ONGROUND(this) || (this.groundentity != trace_ent))) _Movetype_Impact(this, trace_ent); - return trace_fraction; + return (this.origin == last_origin); // false if teleported by touch } diff --git a/qcsrc/common/physics/movetypes/movetypes.qh b/qcsrc/common/physics/movetypes/movetypes.qh index 62b7964d9..1eb2d95e4 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qh +++ b/qcsrc/common/physics/movetypes/movetypes.qh @@ -95,7 +95,7 @@ void _Movetype_LinkEdict_TouchAreaGrid(entity this); void _Movetype_LinkEdict(entity this, float touch_triggers); vector _Movetype_ClipVelocity(vector vel, vector norm, float f); void _Movetype_PushEntityTrace(entity this, vector push); -float _Movetype_PushEntity(entity this, vector push, float failonstartsolid); +bool _Movetype_PushEntity(entity this, vector push, float failonstartsolid, bool dolink); void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient); void Movetype_Physics_MatchTicrate(entity this, float tr, bool sloppy); diff --git a/qcsrc/common/physics/movetypes/toss.qc b/qcsrc/common/physics/movetypes/toss.qc index 71e7fa9d0..fc3de0859 100644 --- a/qcsrc/common/physics/movetypes/toss.qc +++ b/qcsrc/common/physics/movetypes/toss.qc @@ -44,14 +44,14 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; ++bump) { vector move = this.velocity * movetime; - _Movetype_PushEntity(this, move, true); + _Movetype_PushEntity(this, move, true, false); if (wasfreed(this)) return; if (trace_startsolid) { _Movetype_UnstickEntity(this); - _Movetype_PushEntity(this, move, false); + _Movetype_PushEntity(this, move, false, false); if (wasfreed(this)) return; } diff --git a/qcsrc/common/physics/movetypes/walk.qc b/qcsrc/common/physics/movetypes/walk.qc index c0f2fac96..5c7ae9ee2 100644 --- a/qcsrc/common/physics/movetypes/walk.qc +++ b/qcsrc/common/physics/movetypes/walk.qc @@ -100,10 +100,7 @@ void _Movetype_Physics_Walk(entity this, float dt) // SV_WalkMove // move up vector upmove = '0 0 1' * PHYS_STEPHEIGHT(this); - _Movetype_PushEntity(this, upmove, true); - if(wasfreed(this)) - return; - if(trace_startsolid) + if(!_Movetype_PushEntity(this, upmove, true, true)) { // we got teleported when upstepping... must abort the move return; @@ -156,11 +153,7 @@ void _Movetype_Physics_Walk(entity this, float dt) // SV_WalkMove // move down vector downmove = '0 0 0'; downmove.z = -PHYS_STEPHEIGHT(this) + start_velocity.z * dt; - _Movetype_PushEntity(this, downmove, true); - if(wasfreed(this)) - return; - - if(trace_startsolid) + if(!_Movetype_PushEntity(this, downmove, true, true)) { // we got teleported when downstepping... must abort the move return; diff --git a/qcsrc/server/client.qc b/qcsrc/server/client.qc index af05fd79c..01c8222e6 100644 --- a/qcsrc/server/client.qc +++ b/qcsrc/server/client.qc @@ -1146,7 +1146,7 @@ void ClientConnect(entity this) if (IS_REAL_CLIENT(this)) sv_notice_join(this); - this.move_qcphysics = false; + this.move_qcphysics = true; // update physics stats (players can spawn before physics runs) Physics_UpdateStats(this);