From: Mario Date: Sun, 27 Nov 2022 02:16:58 +0000 (+0000) Subject: Some minor tweaks to the QC physics logic X-Git-Tag: xonotic-v0.8.6~286^2 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=f7bb9542c253d14073cb574abb83508b657b6ee4;p=xonotic%2Fxonotic-data.pk3dir.git Some minor tweaks to the QC physics logic --- diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6a12c61c1..fa6d92d5b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -55,7 +55,7 @@ test_sv_game: - wget -O data/maps/stormkeep.waypoints https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints - wget -O data/maps/stormkeep.waypoints.cache https://gitlab.com/xonotic/xonotic-maps.pk3dir/raw/master/maps/stormkeep.waypoints.cache - - EXPECT=757e5413dab5085242502ca47740b83c + - EXPECT=4c834aa9b5950ffe25deec1880f21641 - HASH=$(${ENGINE} +timestamps 1 +exec serverbench.cfg | tee /dev/stderr | sed -e 's,^\[[^]]*\] ,,' diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index 93cf2a4d3..2634b8246 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -129,14 +129,14 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno return 0; int blockedflag = 0; - int i, j, numplanes = 0; + int numplanes = 0; float time_left = dt, grav = 0; vector push; vector primal_velocity, original_velocity; vector restore_velocity = this.velocity; - for(i = 0; i < MAX_CLIP_PLANES; ++i) - planes[i] = '0 0 0'; + for(int j = 0; j < MAX_CLIP_PLANES; ++j) + planes[j] = '0 0 0'; if(applygravity) { @@ -160,7 +160,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno break; push = this.velocity * time_left; - if(!_Movetype_PushEntity(this, push, true, false)) + if(!_Movetype_PushEntity(this, push, false)) { // we got teleported by a touch function // let's abort the move @@ -205,22 +205,22 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno { // step - handle it immediately vector org = this.origin; - vector steppush = '0 0 1' * stepheight; + vector steppush = vec3(0, 0, stepheight); push = this.velocity * time_left; - if(!_Movetype_PushEntity(this, steppush, true, false)) + if(!_Movetype_PushEntity(this, steppush, false)) { blockedflag |= 8; break; } - if(!_Movetype_PushEntity(this, push, true, false)) + if(!_Movetype_PushEntity(this, push, false)) { blockedflag |= 8; break; } float trace2_fraction = trace_fraction; steppush = vec3(0, 0, org.z - this.origin_z); - if(!_Movetype_PushEntity(this, steppush, true, false)) + if(!_Movetype_PushEntity(this, steppush, false)) { blockedflag |= 8; break; @@ -268,23 +268,25 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno // modify original_velocity so it parallels all of the clip planes vector new_velocity = '0 0 0'; - for (i = 0;i < numplanes;i++) + int plane; + for (plane = 0;plane < numplanes;plane++) { - new_velocity = _Movetype_ClipVelocity(original_velocity, planes[i], 1); - for (j = 0;j < numplanes;j++) + int newplane; + new_velocity = _Movetype_ClipVelocity(original_velocity, planes[plane], 1); + for (newplane = 0;newplane < numplanes;newplane++) { - if(j != i) + if(newplane != plane) { // not ok - if((new_velocity * planes[j]) < 0) + if((new_velocity * planes[newplane]) < 0) break; } } - if(j == numplanes) + if(newplane == numplanes) break; } - if(i != numplanes) + if(plane != numplanes) { // go along this plane this.velocity = new_velocity; @@ -300,12 +302,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, bool applystepno } vector dir = cross(planes[0], planes[1]); // LordHavoc: thanks to taniwha of QuakeForge for pointing out this fix for slowed falling in corners - float ilength = sqrt((dir * dir)); - if(ilength) - ilength = 1.0 / ilength; - dir.x *= ilength; - dir.y *= ilength; - dir.z *= ilength; + dir = normalize(dir); float d = (dir * this.velocity); this.velocity = dir * d; } @@ -696,12 +693,12 @@ void _Movetype_PushEntityTrace(entity this, vector push) tracebox(this.origin, this.mins, this.maxs, end, type, this); } -bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool dolink) // SV_PushEntity +bool _Movetype_PushEntity(entity this, vector push, bool dolink) // SV_PushEntity { _Movetype_PushEntityTrace(this, push); // NOTE: this is a workaround for the QC's lack of a worldstartsolid trace parameter - if(trace_startsolid && failonstartsolid) + if(trace_startsolid) { int oldtype = this.move_nomonsters; this.move_nomonsters = MOVE_WORLDONLY; diff --git a/qcsrc/common/physics/movetypes/movetypes.qh b/qcsrc/common/physics/movetypes/movetypes.qh index 79b0ea7ba..23a3e28e4 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qh +++ b/qcsrc/common/physics/movetypes/movetypes.qh @@ -113,7 +113,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); -bool _Movetype_PushEntity(entity this, vector push, float failonstartsolid, bool dolink); +bool _Movetype_PushEntity(entity this, vector push, 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/push.qc b/qcsrc/common/physics/movetypes/push.qc index 1b654b59c..c3c16b904 100644 --- a/qcsrc/common/physics/movetypes/push.qc +++ b/qcsrc/common/physics/movetypes/push.qc @@ -131,7 +131,7 @@ void _Movetype_PushMove(entity this, float dt) // SV_PushMove // try moving the contacted entity int savesolid = this.solid; this.solid = SOLID_NOT; - if(!_Movetype_PushEntity(check, move, true, true)) + if(!_Movetype_PushEntity(check, move, true)) { // entity "check" got teleported check.angles_y += trace_fraction * moveangle.y; @@ -155,7 +155,7 @@ void _Movetype_PushMove(entity this, float dt) // SV_PushMove if(_Movetype_NudgeOutOfSolid_PivotIsKnownGood(check, pivot)) { // hack to invoke all necessary movement triggers - _Movetype_PushEntity(check, '0 0 0', true, true); + _Movetype_PushEntity(check, '0 0 0', true); // we could fix it or entity "check" was telported continue; } diff --git a/qcsrc/common/physics/movetypes/toss.qc b/qcsrc/common/physics/movetypes/toss.qc index 67405a636..c23ab4384 100644 --- a/qcsrc/common/physics/movetypes/toss.qc +++ b/qcsrc/common/physics/movetypes/toss.qc @@ -51,7 +51,7 @@ 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; - if(!_Movetype_PushEntity(this, move, true, true)) + if(!_Movetype_PushEntity(this, move, true)) return; if (wasfreed(this)) return; @@ -67,7 +67,7 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss trace_fraction = oldtrace_fraction; trace_plane_normal = oldtrace_plane_normal; trace_ent = oldtrace_ent; - if(!_Movetype_PushEntity(this, move, true, true)) + if(!_Movetype_PushEntity(this, move, true)) return; if (wasfreed(this)) return; diff --git a/qcsrc/common/physics/movetypes/walk.qc b/qcsrc/common/physics/movetypes/walk.qc index babb38ca4..868bf6d35 100644 --- a/qcsrc/common/physics/movetypes/walk.qc +++ b/qcsrc/common/physics/movetypes/walk.qc @@ -37,13 +37,16 @@ void _Movetype_Physics_Walk(entity this, float dt) // SV_WalkMove vector upmove = this.origin + '0 0 1'; vector downmove = this.origin - '0 0 1'; int type; - if (this.move_movetype == MOVETYPE_FLYMISSILE) + if (this.move_nomonsters) + type = max(0, this.move_nomonsters); + else if (this.move_movetype == MOVETYPE_FLYMISSILE) type = MOVE_MISSILE; else if (this.move_movetype == MOVETYPE_FLY_WORLDONLY) type = MOVE_WORLDONLY; else if (this.solid == SOLID_TRIGGER || this.solid == SOLID_NOT) type = MOVE_NOMONSTERS; - else type = MOVE_NORMAL; + else + type = MOVE_NORMAL; tracebox(upmove, this.mins, this.maxs, downmove, type, this); if (trace_fraction < 1 && trace_plane_normal.z > 0.7) { @@ -103,7 +106,7 @@ void _Movetype_Physics_Walk(entity this, float dt) // SV_WalkMove // move up vector upmove = '0 0 1' * PHYS_STEPHEIGHT(this); - if(!_Movetype_PushEntity(this, upmove, true, true)) + if(!_Movetype_PushEntity(this, upmove, true)) { // we got teleported when upstepping... must abort the move return; @@ -157,7 +160,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; - if(!_Movetype_PushEntity(this, downmove, true, true)) + if(!_Movetype_PushEntity(this, downmove, true)) { // we got teleported when downstepping... must abort the move return; diff --git a/qcsrc/common/physics/player.qc b/qcsrc/common/physics/player.qc index 22a16e7d5..8f681ce5f 100644 --- a/qcsrc/common/physics/player.qc +++ b/qcsrc/common/physics/player.qc @@ -166,7 +166,7 @@ void PM_ClientMovement_UpdateStatus(entity 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); + tracebox(this.origin, STAT(PL_MIN, this), STAT(PL_MAX, this), this.origin, MOVE_NORMAL, this); if (!trace_startsolid) { UNSET_DUCKED(this); this.view_ofs = STAT(PL_VIEW_OFS, this);