diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ef313f783..7ce3e42f7 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -5593,12 +5593,22 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum) if (!P_MobjWasRemoved(player->mo)) { - player->mo->flags ^= MF_NOCLIP; + UINT32 noclipFlags = MF_NOCLIP; - if (!(player->mo->flags & MF_NOCLIP)) + if (player->spectator) { + noclipFlags |= MF_NOCLIPHEIGHT; + } + + if (player->mo->flags & MF_NOCLIP) + { + player->mo->flags &= ~(noclipFlags); status = "off"; } + else + { + player->mo->flags |= noclipFlags; + } } CV_CheaterWarning(targetPlayer, va("noclip %s", status)); diff --git a/src/p_mobj.c b/src/p_mobj.c index 1604257ca..4322e8478 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2839,8 +2839,9 @@ void P_PlayerZMovement(mobj_t *mo) P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector); // check for smooth step up - if ((mo->eflags & MFE_VERTICALFLIP && mo->z + mo->height > mo->ceilingz) - || (!(mo->eflags & MFE_VERTICALFLIP) && mo->z < mo->floorz)) + if (!(mo->flags & MF_NOCLIPHEIGHT) + && ((mo->eflags & MFE_VERTICALFLIP && mo->z + mo->height > mo->ceilingz) + || (!(mo->eflags & MFE_VERTICALFLIP) && mo->z < mo->floorz))) { if (mo->eflags & MFE_VERTICALFLIP) mo->player->viewheight -= (mo->z+mo->height) - mo->ceilingz; diff --git a/src/p_user.c b/src/p_user.c index 639745890..71d8eb630 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -221,12 +221,20 @@ void P_CalcHeight(player_t *player) if (mo->eflags & MFE_VERTICALFLIP) { player->viewz = mo->z + mo->height - player->viewheight; + + if (mo->flags & MF_NOCLIPHEIGHT) + return; + if (player->viewz < mo->floorz + FixedMul(FRACUNIT, mo->scale)) player->viewz = mo->floorz + FixedMul(FRACUNIT, mo->scale); } else { player->viewz = mo->z + player->viewheight; + + if (mo->flags & MF_NOCLIPHEIGHT) + return; + if (player->viewz > mo->ceilingz - FixedMul(FRACUNIT, mo->scale)) player->viewz = mo->ceilingz - FixedMul(FRACUNIT, mo->scale); } @@ -2289,10 +2297,13 @@ static void P_SpectatorMovement(player_t *player) else if (cmd->buttons & BT_BRAKE) player->mo->z -= 32*mapobjectscale; - if (player->mo->z > player->mo->ceilingz - player->mo->height) - player->mo->z = player->mo->ceilingz - player->mo->height; - if (player->mo->z < player->mo->floorz) - player->mo->z = player->mo->floorz; + if (!(player->mo->flags & MF_NOCLIPHEIGHT)) + { + if (player->mo->z > player->mo->ceilingz - player->mo->height) + player->mo->z = player->mo->ceilingz - player->mo->height; + if (player->mo->z < player->mo->floorz) + player->mo->z = player->mo->floorz; + } player->mo->momx = player->mo->momy = player->mo->momz = 0; if (cmd->forwardmove != 0)