From 8426ce8d9cf48e0e87adc77698b439f5add38549 Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Thu, 30 Jun 2016 23:23:50 +0100 Subject: [PATCH] Minor change to fans and gas jets that makes them work on slopes. - Now checks whether the player's top is below the bottom of the fan/gas jet, instead of its bottom. zdist calculation not affected. - mo->standingslope is NULL'd so the player isn't launched off at a wacky angle. (I also did this for springs, since Prime mentioned it was a problem for them too.) --- src/p_map.c | 14 +++++++++++--- src/p_mobj.c | 6 +++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 8621ba20..1f2d903e 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -129,6 +129,10 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) return false; } +#ifdef ESLOPE + object->standingslope = NULL; // Okay, now we can't return - no launching off at silly angles for you. +#endif + object->eflags |= MFE_SPRUNG; // apply this flag asap! spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify @@ -232,20 +236,24 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) if (p && object->state == &states[object->info->painstate]) // can't use fans and gas jets when player is in pain! return; - // is object below thruster's position? if not, calculate distance between their bottoms + // is object's top below thruster's position? if not, calculate distance between their bottoms if (spring->eflags & MFE_VERTICALFLIP) { - if (object->z + object->height > spring->z + spring->height) + if (object->z > spring->z + spring->height) return; zdist = (spring->z + spring->height) - (object->z + object->height); } else { - if (object->z < spring->z) + if (object->z + object->height < spring->z) return; zdist = object->z - spring->z; } +#ifdef ESLOPE + object->standingslope = NULL; // No launching off at silly angles for you. +#endif + switch (spring->type) { case MT_FAN: // fan diff --git a/src/p_mobj.c b/src/p_mobj.c index c6fed993..62dee0a6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2376,9 +2376,9 @@ static boolean P_ZMovement(mobj_t *mo) #ifdef ESLOPE P_CheckPosition(mo, mo->x, mo->y); // Sets mo->standingslope correctly - if ((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) { + if (((mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope) && (mo->type != MT_STEAM)) + { mo->standingslope = (mo->eflags & MFE_VERTICALFLIP) ? tmceilingslope : tmfloorslope; - P_ReverseQuantizeMomentumToSlope(&mom, mo->standingslope); } #endif @@ -2532,7 +2532,7 @@ static boolean P_ZMovement(mobj_t *mo) mom.z = tmfloorthing->momz; #ifdef ESLOPE - if (mo->standingslope) { + if (mo->standingslope) { // MT_STEAM will never have a standingslope, see above. P_QuantizeMomentumToSlope(&mom, mo->standingslope); } #endif