From 932b2d820db7bcfcb062b9641088dc8eef36fc82 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 2 Jun 2020 23:04:05 +0200 Subject: [PATCH] - fixed floorclipping checks for 3D floors. Neither the setup nor the in-game checks were correct, because this code comes from a time where ceilings could not have a terrain, meaning that 3D floors couldn't have one. --- src/playsim/p_mobj.cpp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index 74d311551b..a2fc66faa6 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -4887,22 +4887,37 @@ void AActor::AdjustFloorClip () double shallowestclip = INT_MAX; const msecnode_t *m; - // possibly standing on a 3D-floor - if (Sector->e->XFloor.ffloors.Size() && Z() > Sector->floorplane.ZatPoint(this)) Floorclip = 0; - // [RH] clip based on shallowest floor player is standing on // If the sector has a deep water effect, then let that effect // do the floorclipping instead of the terrain type. for (m = touching_sectorlist; m; m = m->m_tnext) { DVector3 pos = PosRelative(m->m_sector); - sector_t *hsec = m->m_sector->GetHeightSec(); - if (hsec == NULL && m->m_sector->floorplane.ZatPoint (pos) == Z()) + sector_t* hsec = m->m_sector->GetHeightSec(); + if (hsec == NULL) { - double clip = Terrains[m->m_sector->GetTerrain(sector_t::floor)].FootClip; - if (clip < shallowestclip) + if (m->m_sector->floorplane.ZatPoint(pos) == Z()) { - shallowestclip = clip; + double clip = Terrains[m->m_sector->GetTerrain(sector_t::floor)].FootClip; + if (clip < shallowestclip) + { + shallowestclip = clip; + } + } + else + { + for (auto& ff : m->m_sector->e->XFloor.ffloors) + { + if ((ff->flags & FF_SOLID) && (ff->flags & FF_EXISTS) && ff->top.plane->ZatPoint(pos) == Z()) + { + double clip = Terrains[ff->top.model->GetTerrain(ff->top.isceiling)].FootClip; + if (clip < shallowestclip) + { + shallowestclip = clip; + } + } + } + } } } @@ -5548,6 +5563,11 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) else if (sz == ONCEILINGZ) mobj->AddZ(-mthing->pos.Z); + if (mobj->flags2 & MF2_FLOORCLIP) + { + mobj->AdjustFloorClip(); + } + mobj->SpawnPoint = mthing->pos; mobj->SpawnAngle = mthing->angle; mobj->SpawnFlags = mthing->flags;