diff --git a/src/p_mobj.c b/src/p_mobj.c index 13379ad538ed5eb9ba94eff690fbb6eaa1592453..0c4ae64889c1ec9ada9e9f790690c7dd5965495e 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 d939fee98b9cb36f015da6cb187131acc6407eb6..69f0b756aa7605aa990ac3d40ae243a1ca44d6bc 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 de38f1d9ed279be0059a8c0a283a337d8e4e7bb8..6975516ed466aefb10242ab31ad0dffc629e60a8 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);