Many more bugfixes

This commit is contained in:
MascaraSnake 2019-06-15 20:21:18 +02:00
parent 91c1e13273
commit 24c6dd1a68
4 changed files with 34 additions and 32 deletions

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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)