diff --git a/src/k_kart.c b/src/k_kart.c index fefc5387b..f0dc4ba09 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1981,7 +1981,7 @@ void K_SpawnDashDustRelease(player_t *player) dust->momx = 3*player->mo->momx/5; dust->momy = 3*player->mo->momy/5; - //dust->momz = 3*player->mo->momz/5; + dust->momz = 3*P_GetMobjZMovement(player->mo)/5; K_MatchGenericExtraFlags(dust, player->mo); } @@ -2008,6 +2008,7 @@ void K_SpawnDriftBoostClip(player_t *player) { mobj_t *clip; fixed_t scale = 115*FRACUNIT/100; + fixed_t momz = P_GetMobjZMovement(player->mo); fixed_t z; if (( player->mo->eflags & MFE_VERTICALFLIP )) @@ -2024,8 +2025,8 @@ void K_SpawnDriftBoostClip(player_t *player) clip->fuse = 105; clip->momz = 7 * P_MobjFlip(clip) * clip->scale; - if (player->mo->momz > 0) - clip->momz += player->mo->momz; + if (momz > 0) + clip->momz += momz; P_InstaThrust(clip, player->mo->angle + P_RandomFlip(P_RandomRange(FRACUNIT/2, FRACUNIT)), @@ -2057,7 +2058,7 @@ void K_SpawnNormalSpeedLines(player_t *player) fast->angle = K_MomentumAngle(player->mo); fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; - fast->momz = 3*player->mo->momz/4; + fast->momz = 3*P_GetMobjZMovement(player->mo)/4; K_MatchGenericExtraFlags(fast, player->mo); @@ -2079,7 +2080,7 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo) fast->momx = 3*mo->momx/4; fast->momy = 3*mo->momy/4; - fast->momz = 3*mo->momz/4; + fast->momz = 3*P_GetMobjZMovement(mo)/4; P_SetTarget(&fast->target, mo); fast->angle = K_MomentumAngle(mo); @@ -4027,6 +4028,7 @@ void K_SpawnDriftElectricSparks(player_t *player) P_SetObjectMomZ(spark, vspeed, false); spark->momx += mo->momx; // copy player speed spark->momy += mo->momy; + spark->momz += P_GetMobjZMovement(mo); sparkangle += ANGLE_90; } @@ -4077,7 +4079,7 @@ static void K_SpawnDriftSparks(player_t *player) spark->momx = player->mo->momx/2; spark->momy = player->mo->momy/2; - //spark->momz = player->mo->momz/2; + spark->momz = P_GetMobjZMovement(player->mo)/2; spark->color = K_DriftSparkColor(player, player->driftcharge); @@ -4220,7 +4222,7 @@ static void K_SpawnAIZDust(player_t *player) spark->momx = (6*player->mo->momx)/5; spark->momy = (6*player->mo->momy)/5; - //spark->momz = player->mo->momz/2; + spark->momz = P_GetMobjZMovement(player->mo); K_MatchGenericExtraFlags(spark, player->mo); } @@ -4442,7 +4444,7 @@ void K_SpawnDraftDust(mobj_t *mo) dust->momx = (4*mo->momx)/5; dust->momy = (4*mo->momy)/5; - //dust->momz = (4*mo->momz)/5; + dust->momz = (4*P_GetMobjZMovement(mo))/5; P_Thrust(dust, dust->angle, 4*mo->scale); @@ -4972,7 +4974,7 @@ static void K_FlameDashLeftoverSmoke(mobj_t *src) smoke->momx = 3*src->momx/4; smoke->momy = 3*src->momy/4; - smoke->momz = 3*src->momz/4; + smoke->momz = 3*P_GetMobjZMovement(src)/4; P_Thrust(smoke, src->angle + FixedAngle(P_RandomRange(135, 225)<scale); smoke->momz += P_RandomRange(0, 4) * src->scale; @@ -6709,7 +6711,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (gametype == GT_RACE && player->rings <= 0) // spawn ring debt indicator { mobj_t *debtflag = P_SpawnMobj(player->mo->x + player->mo->momx, player->mo->y + player->mo->momy, - player->mo->z + player->mo->momz + player->mo->height + (24*player->mo->scale), MT_THOK); + player->mo->z + P_GetMobjZMovement(player->mo) + player->mo->height + (24*player->mo->scale), MT_THOK); P_SetMobjState(debtflag, S_RINGDEBT); P_SetScale(debtflag, (debtflag->destscale = player->mo->scale)); @@ -6741,7 +6743,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) star->flags |= MF_NOGRAVITY; star->momx = player->mo->momx / 2; star->momy = player->mo->momy / 2; - star->momz = player->mo->momz / 2; + star->momz = P_GetMobjZMovement(player->mo) / 2; star->fuse = 12; star->scale = player->mo->scale; star->destscale = star->scale / 2; @@ -8317,7 +8319,7 @@ static void K_KartSpindashWind(mobj_t *parent) wind->momx = 3 * parent->momx / 4; wind->momy = 3 * parent->momy / 4; - wind->momz = 3 * parent->momz / 4; + wind->momz = 3 * P_GetMobjZMovement(parent) / 4; K_MatchGenericExtraFlags(wind, parent); } diff --git a/src/p_local.h b/src/p_local.h index b642613df..7ddf59875 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -531,5 +531,6 @@ fixed_t P_ScaleFromMap(fixed_t n, fixed_t scale); fixed_t P_GetMobjHead(const mobj_t *); fixed_t P_GetMobjFeet(const mobj_t *); fixed_t P_GetMobjGround(const mobj_t *); +fixed_t P_GetMobjZMovement(mobj_t *mo); #endif // __P_LOCAL__ diff --git a/src/p_mobj.c b/src/p_mobj.c index 8975abc26..732706500 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7495,7 +7495,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) fast->angle = mobj->angle; fast->momx = 3*mobj->target->momx/4; fast->momy = 3*mobj->target->momy/4; - fast->momz = 3*mobj->target->momz/4; + fast->momz = 3*P_GetMobjZMovement(mobj->target)/4; K_MatchGenericExtraFlags(fast, mobj); P_SetMobjState(fast, S_FLAMESHIELDLINE1 + i); @@ -13258,3 +13258,25 @@ fixed_t P_GetMobjGround(const mobj_t *mobj) { return P_IsObjectFlipped(mobj) ? mobj->ceilingz : mobj->floorz; } + +// +// P_GetMobjZMovement +// Returns the Z momentum of the object, accounting for slopes if the object is grounded +// +fixed_t P_GetMobjZMovement(mobj_t *mo) +{ + pslope_t *slope = mo->standingslope; + angle_t angDiff; + fixed_t speed; + + if (!P_IsObjectOnGround(mo)) + return mo->momz; + + if (!slope) + return 0; + + angDiff = R_PointToAngle2(0, 0, mo->momx, mo->momy) - slope->xydirection; + speed = FixedHypot(mo->momx, mo->momy); + + return P_ReturnThrustY(mo, slope->zangle, P_ReturnThrustX(mo, angDiff, speed)); +} \ No newline at end of file