From dc846dcd49caf527c3ecd21262aeba677397225f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 1 Jun 2021 21:21:39 +0200 Subject: [PATCH] - Duke: avoid clipping against self when executing script logic for floor sprites. A good place to see the result is a kitchen knife in E4L2 that went missing due to the faulty check. --- source/build/src/clip.cpp | 1 + source/games/duke/src/actors.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/source/build/src/clip.cpp b/source/build/src/clip.cpp index 2a3ba6352..df5ea421e 100644 --- a/source/build/src/clip.cpp +++ b/source/build/src/clip.cpp @@ -1081,6 +1081,7 @@ void getzrange(const vec3_t *pos, int16_t sectnum, const int32_t cstat = sprite[j].cstat; int32_t daz, daz2; + if (cstat & CSTAT_SPRITE_INVISIBLE) continue; if (cstat&dasprclipmask) { int32_t clipyou = 0; diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index dc498fbfd..ae7d35b6c 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -4955,7 +4955,10 @@ void getglobalz(DDukeActor* actor) zr = 4; else zr = 127; + auto cc = s->cstat; + s->cstat |= CSTAT_SPRITE_INVISIBLE; // don't clip against self. getzrange cannot detect this because it only receives a coordinate. getzrange_ex(s->x, s->y, s->z - (FOURSLEIGHT), s->sectnum, &actor->ceilingz, hz, &actor->floorz, lz, zr, CLIPMASK0); + s->cstat = cc; if( lz.type == kHitSprite && (lz.actor->s->cstat&48) == 0 ) {