diff --git a/src/p_enemy.c b/src/p_enemy.c index b7bb730e1..65581f65a 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -13547,5 +13547,6 @@ void A_MinecartSparkThink(mobj_t *actor) trail->tics = 2; trail->sprite = actor->sprite; P_SetScale(trail, trail->scale/4); + trail->destscale = trail->scale; } } \ No newline at end of file diff --git a/src/p_map.c b/src/p_map.c index 2655042dc..906ca8c51 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -836,10 +836,10 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->type == MT_SALOONDOOR && tmthing->player) { - if (tmthing->player->powers[pw_carry] == CR_MINECART) + if (tmthing->player->powers[pw_carry] == CR_MINECART && tmthing->tracer && !P_MobjWasRemoved(tmthing->tracer) && tmthing->tracer->health) { - fixed_t dx = tmthing->momx; - fixed_t dy = tmthing->momy; + fixed_t dx = tmthing->tracer->momx; + fixed_t dy = tmthing->tracer->momy; fixed_t dm = min(FixedHypot(dx, dy), 16*FRACUNIT); angle_t ang = R_PointToAngle2(0, 0, dx, dy) - thing->angle; fixed_t s = FINESINE((ang >> ANGLETOFINESHIFT) & FINEMASK); diff --git a/src/p_mobj.c b/src/p_mobj.c index b7af8eaf6..4c48db0a6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8567,14 +8567,6 @@ void P_MobjThinker(mobj_t *mobj) } mobj->flags2 ^= MF2_DONTDRAW; break; - case MT_MINECART: - // If player is ded, remove this minecart - if (!mobj->target || P_MobjWasRemoved(mobj->target) || !mobj->target->health) - { - P_KillMobj(mobj, NULL, NULL, 0); - return; - } - break; case MT_SPINFIRE: if (mobj->flags & MF_NOGRAVITY) { @@ -8952,6 +8944,16 @@ void P_PushableThinker(mobj_t *mobj) if (mobj->flags & MF_PUSHABLE && !(mobj->momx || mobj->momy)) P_TryMove(mobj, mobj->x, mobj->y, true); + if (mobj->type == MT_MINECART && mobj->health) + { + // If player is ded, remove this minecart + if (!mobj->target || P_MobjWasRemoved(mobj->target) || !mobj->target->health) + { + P_KillMobj(mobj, NULL, NULL, 0); + return; + } + } + if (mobj->fuse == 1) // it would explode in the MobjThinker code { mobj_t *spawnmo; diff --git a/src/p_user.c b/src/p_user.c index 4a4d25847..c8e5254ea 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9881,23 +9881,21 @@ static void P_SpawnSparks(mobj_t *mo, angle_t maindir) fixed_t c = FixedMul(FINECOSINE(fa), mo->radius); fixed_t s = FixedMul(FINESINE(fa), mo->radius); mobj_t *spark; - UINT8 b1 = (leveltime % 2 == 1) ? 1 : -1; - UINT8 b2 = ((leveltime / 2) % 2 == 1) ? 1 : -1; - fixed_t r = FRACUNIT*P_RandomRange(-1, 1); + SINT8 b1 = (leveltime & 1) ? 1 : -1; + SINT8 b2 = (leveltime & 2) ? 1 : -1; + fixed_t r1 = FRACUNIT*P_RandomRange(-1, 1); + fixed_t r2 = FRACUNIT*P_RandomRange(-1, 1); + fixed_t r3 = FRACUNIT*P_RandomRange(-1, 1); + fixed_t fm = (maindir >> ANGLETOFINESHIFT) & FINEMASK; spark = P_SpawnMobj(mo->x - b2*s + b1*c, mo->y + b2*c + b1*s, mo->z, MT_MINECARTSPARK); - spark->momx = mo->momx + r; - spark->momy = mo->momy + r; - spark->momz = mo->momz + r; + spark->momx = mo->momx + r1 + 8*FINECOSINE(fm); + spark->momy = mo->momy + r2 + 8*FINESINE(fm); + spark->momz = mo->momz + r3; - if (maindir) - { - fixed_t fm = (maindir >> ANGLETOFINESHIFT) & FINEMASK; - spark->momx += 8*FINECOSINE(fm); - spark->momy += 8*FINESINE(fm); - } P_Thrust(spark, R_PointToAngle2(mo->x, mo->y, spark->x, spark->y), 8*FRACUNIT); P_SetScale(spark, FRACUNIT/4); + spark->destscale = spark->scale; spark->fuse = TICRATE/3; } @@ -9979,7 +9977,7 @@ static void P_MinecartThink(player_t *player) else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX)) player->mo->angle = minecart->angle - MINECARTCONEMAX; - if (angdiff + minecart->angle != player->mo->angle) + if (angdiff + minecart->angle != player->mo->angle && (!demoplayback || P_AnalogMove(player))) { if (player == &players[consoleplayer]) localangle = player->mo->angle; @@ -10051,7 +10049,7 @@ static void P_MinecartThink(player_t *player) P_ResetScore(player); // Handle angle and position P_GetAxisPosition(minecart->x, minecart->y, axis, &newx, &newy, &targetangle, &grind); - if (grind) + if (axis->type != MT_AXISTRANSFERLINE) P_SpawnSparks(minecart, grind); P_TryMove(minecart, newx, newy, true); @@ -10062,13 +10060,14 @@ static void P_MinecartThink(player_t *player) minecart->angle = targetangle; else minecart->angle = targetangle + ANGLE_180; - player->mo->angle += (minecart->angle - prevangle); // maintain relative angle on turns - if (angdiff + minecart->angle != targetangle) + angdiff = (minecart->angle - prevangle); + if (angdiff && (!demoplayback || P_AnalogMove(player))) // maintain relative angle on turns { + player->mo->angle += angdiff; if (player == &players[consoleplayer]) - localangle = player->mo->angle; + localangle += angdiff; else if (player == &players[secondarydisplayplayer]) - localangle2 = player->mo->angle; + localangle2 += angdiff; } // Sideways detection @@ -10164,9 +10163,9 @@ static void P_MinecartThink(player_t *player) // Move player to minecart. P_TeleportMove(player->mo, minecart->x - minecart->momx, minecart->y - minecart->momy, minecart->z + max(minecart->momz, 0) + 8*FRACUNIT); - player->mo->momx = minecart->momx; - player->mo->momy = minecart->momy; - player->mo->momz = 0; + if (player->powers[pw_carry] != CR_MINECART) + return; + player->mo->momx = player->mo->momy = player->mo->momz = 0; P_TryMove(player->mo, player->mo->x + minecart->momx, player->mo->y + minecart->momy, true); if (player->powers[pw_flashing] == flashingtics)