From 2ca00cf2e96c3f964cdf5f50e624734c4d75d746 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 28 Mar 2020 00:21:41 -0400 Subject: [PATCH] Try to prevent bubble from going out of bounds --- src/p_inter.c | 2 -- src/p_mobj.c | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 2c8324972..43544447e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -637,8 +637,6 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) // attach to player! P_SetTarget(&special->tracer, toucher); toucher->flags |= MF_NOGRAVITY; - toucher->momx = (15*toucher->momx)/16; // Huge initial speed cut - toucher->momy = (15*toucher->momy)/16; toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher); S_StartSound(toucher, sfx_s1b2); return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 06cdfa4b8..a3b526b7c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9454,6 +9454,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player) { player_t *player = mobj->tracer->player; + fixed_t destx, desty, curfz, destfz; + boolean blockmove = false; mobj->flags = MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY|MF_DONTENCOREMAP; mobj->extravalue1 = 1; @@ -9462,16 +9464,38 @@ void P_MobjThinker(mobj_t *mobj) mobj->momz = 0; mobj->destscale = ((5*mobj->tracer->scale)>>2) + (mobj->tracer->scale>>3); - mobj->tracer->momx = (63*mobj->tracer->momx)/64; - mobj->tracer->momy = (63*mobj->tracer->momy)/64; mobj->tracer->momz = (8*mobj->tracer->scale) * P_MobjFlip(mobj->tracer); - P_TeleportMove(mobj, - mobj->tracer->x + mobj->tracer->momx + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + mobj->tracer->momy + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z + mobj->tracer->momz - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<tracer->momx = (31*mobj->tracer->momx)/32; + mobj->tracer->momy = (31*mobj->tracer->momy)/32; - if (mobj->movecount > 8*TICRATE) + destx = mobj->x + mobj->tracer->momx; + desty = mobj->y + mobj->tracer->momy; + + if (mobj->tracer->eflags & MFE_VERTICALFLIP) + { + curfz = P_GetCeilingZ(mobj->tracer, mobj->tracer->subsector->sector, mobj->tracer->x, mobj->tracer->y, NULL); + destfz = P_GetCeilingZ(mobj->tracer, R_PointInSubsector(destx, desty)->sector, destx, desty, NULL); + blockmove = (curfz - destfz >= 24*mobj->scale); + } + else + { + curfz = P_GetFloorZ(mobj->tracer, mobj->tracer->subsector->sector, mobj->tracer->x, mobj->tracer->y, NULL); + destfz = P_GetFloorZ(mobj->tracer, R_PointInSubsector(destx, desty)->sector, destx, desty, NULL); + blockmove = (destfz - curfz >= 24*mobj->scale); + } + + if (blockmove) + { + mobj->tracer->momx = mobj->tracer->momy = 0; + } + + P_TeleportMove(mobj, + mobj->tracer->x + P_ReturnThrustX(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->y + P_ReturnThrustY(NULL, mobj->tracer->angle+ANGLE_90, (mobj->cvmem)<tracer->z - (4*mobj->tracer->scale) + (P_RandomRange(-abs(mobj->cvmem), abs(mobj->cvmem))<movecount > 4*TICRATE) { S_StartSound(mobj->tracer, sfx_s3k77); mobj->tracer->flags &= ~MF_NOGRAVITY;