From aa6453382ec362588e070b0aa179e267ce10ce2b Mon Sep 17 00:00:00 2001 From: toasterbabe Date: Sun, 22 Jan 2017 18:26:05 +0000 Subject: [PATCH] SLOPE-TO-WALL TRANSFER --- src/p_mobj.c | 5 +++++ src/p_slopes.c | 24 ++++++++++++++++++++++++ src/p_slopes.h | 1 + 3 files changed, 30 insertions(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index 13379ad53..0c4ae6488 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2124,6 +2124,11 @@ void P_XYMovement(mobj_t *mo) // blocked move moved = false; +#ifdef ESLOPE + if (oldslope && predictedz > mo->z) // Only for moving up, otherwise there's a failed launch when going down slopes and hitting walls + P_SlopeToWallTransfer(mo); +#endif + if (player) { if (player->bot) B_MoveBlocked(player); diff --git a/src/p_slopes.c b/src/p_slopes.c index d939fee98..69f0b756a 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -804,6 +804,30 @@ void P_SlopeLaunch(mobj_t *mo) mo->standingslope = NULL; } +// +// P_SlopeToWallTransfer +// +// Handles slope-to-wall transfer for objects. +void P_SlopeToWallTransfer(mobj_t *mo) +{ + if (!(mo->standingslope->flags & SL_NOPHYSICS)) // If there's physics, time for launching. + { + // Doesn't kill the vertical momentum as much as P_SlopeLaunch does. + vector3_t slopemom; + slopemom.x = mo->momx; + slopemom.y = mo->momy; + slopemom.z = 3*(mo->momz/2); + P_QuantizeMomentumToSlope(&slopemom, mo->standingslope); + + mo->momx = slopemom.x; + mo->momy = slopemom.y; + mo->momz = 2*(slopemom.z/3); + } + + //CONS_Printf("Transferred off of slope.\n"); + mo->standingslope = NULL; +} + // Function to help handle landing on slopes void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope) { diff --git a/src/p_slopes.h b/src/p_slopes.h index de38f1d9e..6975516ed 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -37,6 +37,7 @@ fixed_t P_GetZAt(pslope_t *slope, fixed_t x, fixed_t y); void P_QuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope); void P_ReverseQuantizeMomentumToSlope(vector3_t *momentum, pslope_t *slope); void P_SlopeLaunch(mobj_t *mo); +void P_SlopeToWallTransfer(mobj_t *mo); void P_HandleSlopeLanding(mobj_t *thing, pslope_t *slope); void P_ButteredSlope(mobj_t *mo);