From 3bb2602f5b3ffddc3fd4be863010aa43514cd5ea Mon Sep 17 00:00:00 2001 From: BjossiAlfreds Date: Fri, 30 Sep 2022 15:25:18 +0000 Subject: [PATCH] Prevent dead bodies from obstructing elevators and falling through them --- src/g_phys.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/g_phys.c b/src/g_phys.c index b594d97..678cef3 100644 --- a/src/g_phys.c +++ b/src/g_phys.c @@ -53,7 +53,10 @@ SV_TestEntityPosition(edict_t *ent) return NULL; } - if (ent->clipmask) + /* dead bodies are supposed to not be solid so lets + ensure they only collide with BSP during pushmoves + */ + if (ent->clipmask && !(ent->svflags & SVF_DEADMONSTER)) { mask = ent->clipmask; } @@ -518,6 +521,17 @@ retry: trace = gi.trace(start, ent->mins, ent->maxs, end, ent, mask); + /* startsolid treats different-content volumes + as continuous, like the bbox of a monster/player + and the floor of an elevator. So do another trace + that only collides with BSP so that we make a best + effort to keep these entities inside non-solid space + */ + if (trace.startsolid && (mask & ~MASK_SOLID)) + { + trace = gi.trace (start, ent->mins, ent->maxs, end, ent, MASK_SOLID); + } + VectorCopy(trace.endpos, ent->s.origin); gi.linkentity(ent);