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->tics = 2;
trail->sprite = actor->sprite; trail->sprite = actor->sprite;
P_SetScale(trail, trail->scale/4); 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 (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 dx = tmthing->tracer->momx;
fixed_t dy = tmthing->momy; fixed_t dy = tmthing->tracer->momy;
fixed_t dm = min(FixedHypot(dx, dy), 16*FRACUNIT); fixed_t dm = min(FixedHypot(dx, dy), 16*FRACUNIT);
angle_t ang = R_PointToAngle2(0, 0, dx, dy) - thing->angle; angle_t ang = R_PointToAngle2(0, 0, dx, dy) - thing->angle;
fixed_t s = FINESINE((ang >> ANGLETOFINESHIFT) & FINEMASK); fixed_t s = FINESINE((ang >> ANGLETOFINESHIFT) & FINEMASK);

View File

@ -8567,14 +8567,6 @@ void P_MobjThinker(mobj_t *mobj)
} }
mobj->flags2 ^= MF2_DONTDRAW; mobj->flags2 ^= MF2_DONTDRAW;
break; 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: case MT_SPINFIRE:
if (mobj->flags & MF_NOGRAVITY) if (mobj->flags & MF_NOGRAVITY)
{ {
@ -8952,6 +8944,16 @@ void P_PushableThinker(mobj_t *mobj)
if (mobj->flags & MF_PUSHABLE && !(mobj->momx || mobj->momy)) if (mobj->flags & MF_PUSHABLE && !(mobj->momx || mobj->momy))
P_TryMove(mobj, mobj->x, mobj->y, true); 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 if (mobj->fuse == 1) // it would explode in the MobjThinker code
{ {
mobj_t *spawnmo; 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 c = FixedMul(FINECOSINE(fa), mo->radius);
fixed_t s = FixedMul(FINESINE(fa), mo->radius); fixed_t s = FixedMul(FINESINE(fa), mo->radius);
mobj_t *spark; mobj_t *spark;
UINT8 b1 = (leveltime % 2 == 1) ? 1 : -1; SINT8 b1 = (leveltime & 1) ? 1 : -1;
UINT8 b2 = ((leveltime / 2) % 2 == 1) ? 1 : -1; SINT8 b2 = (leveltime & 2) ? 1 : -1;
fixed_t r = FRACUNIT*P_RandomRange(-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 = P_SpawnMobj(mo->x - b2*s + b1*c, mo->y + b2*c + b1*s, mo->z, MT_MINECARTSPARK);
spark->momx = mo->momx + r; spark->momx = mo->momx + r1 + 8*FINECOSINE(fm);
spark->momy = mo->momy + r; spark->momy = mo->momy + r2 + 8*FINESINE(fm);
spark->momz = mo->momz + r; 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_Thrust(spark, R_PointToAngle2(mo->x, mo->y, spark->x, spark->y), 8*FRACUNIT);
P_SetScale(spark, FRACUNIT/4); P_SetScale(spark, FRACUNIT/4);
spark->destscale = spark->scale;
spark->fuse = TICRATE/3; spark->fuse = TICRATE/3;
} }
@ -9979,7 +9977,7 @@ static void P_MinecartThink(player_t *player)
else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX)) else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX))
player->mo->angle = minecart->angle - 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]) if (player == &players[consoleplayer])
localangle = player->mo->angle; localangle = player->mo->angle;
@ -10051,7 +10049,7 @@ static void P_MinecartThink(player_t *player)
P_ResetScore(player); P_ResetScore(player);
// Handle angle and position // Handle angle and position
P_GetAxisPosition(minecart->x, minecart->y, axis, &newx, &newy, &targetangle, &grind); P_GetAxisPosition(minecart->x, minecart->y, axis, &newx, &newy, &targetangle, &grind);
if (grind) if (axis->type != MT_AXISTRANSFERLINE)
P_SpawnSparks(minecart, grind); P_SpawnSparks(minecart, grind);
P_TryMove(minecart, newx, newy, true); P_TryMove(minecart, newx, newy, true);
@ -10062,13 +10060,14 @@ static void P_MinecartThink(player_t *player)
minecart->angle = targetangle; minecart->angle = targetangle;
else else
minecart->angle = targetangle + ANGLE_180; minecart->angle = targetangle + ANGLE_180;
player->mo->angle += (minecart->angle - prevangle); // maintain relative angle on turns angdiff = (minecart->angle - prevangle);
if (angdiff + minecart->angle != targetangle) if (angdiff && (!demoplayback || P_AnalogMove(player))) // maintain relative angle on turns
{ {
player->mo->angle += angdiff;
if (player == &players[consoleplayer]) if (player == &players[consoleplayer])
localangle = player->mo->angle; localangle += angdiff;
else if (player == &players[secondarydisplayplayer]) else if (player == &players[secondarydisplayplayer])
localangle2 = player->mo->angle; localangle2 += angdiff;
} }
// Sideways detection // Sideways detection
@ -10164,9 +10163,9 @@ static void P_MinecartThink(player_t *player)
// Move player to minecart. // Move player to minecart.
P_TeleportMove(player->mo, minecart->x - minecart->momx, minecart->y - minecart->momy, minecart->z + max(minecart->momz, 0) + 8*FRACUNIT); 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; if (player->powers[pw_carry] != CR_MINECART)
player->mo->momy = minecart->momy; return;
player->mo->momz = 0; 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); P_TryMove(player->mo, player->mo->x + minecart->momx, player->mo->y + minecart->momy, true);
if (player->powers[pw_flashing] == flashingtics) if (player->powers[pw_flashing] == flashingtics)