From: bones_was_here Date: Mon, 18 Sep 2023 14:52:31 +0000 (+1000) Subject: Fix 100% cpu when entities using TOSS-based movetypes get stuck X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=1fa773a5e5ff9682bb48cbd3a38accd975b82d49;p=xonotic%2Fxonotic-data.pk3dir.git Fix 100% cpu when entities using TOSS-based movetypes get stuck This is a bug in sv_gameplayfix_slidemoveprojectiles which gives nicer physics interactions but didn't abort if the entity is immovable. --- diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index 651b6f3d6..f72d4d43f 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -708,7 +708,10 @@ bool _Movetype_PushEntity(entity this, vector push, bool dolink) // SV_PushEnti _Movetype_PushEntityTrace(this, push); this.move_nomonsters = oldtype; if(trace_startsolid) + { + trace_fraction = 0; return true; + } } this.origin = trace_endpos; diff --git a/qcsrc/common/physics/movetypes/toss.qc b/qcsrc/common/physics/movetypes/toss.qc index c23ab4384..5c254811d 100644 --- a/qcsrc/common/physics/movetypes/toss.qc +++ b/qcsrc/common/physics/movetypes/toss.qc @@ -50,14 +50,17 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss float movetime = dt; for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; bump++) { + if(this.velocity == '0 0 0') + break; + vector move = this.velocity * movetime; if(!_Movetype_PushEntity(this, move, true)) - return; + return; // teleported if (wasfreed(this)) return; // NOTE: this is bmodelstartsolid in the engine - if (trace_startsolid && trace_ent.solid == SOLID_BSP) + if (trace_allsolid && trace_fraction == 0 && trace_ent.solid == SOLID_BSP) { // QC lacks pointers so we must save the old trace values float oldtrace_fraction = trace_fraction; @@ -68,9 +71,16 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss trace_plane_normal = oldtrace_plane_normal; trace_ent = oldtrace_ent; if(!_Movetype_PushEntity(this, move, true)) - return; + return; // teleported if (wasfreed(this)) return; + if (trace_allsolid && trace_fraction == 0) + { + // immovably stuck, don't waste CPU trying to move again + this.velocity = '0 0 0'; + SET_ONGROUND(this); + return; + } } if (trace_fraction == 1)