mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-23 03:12:38 +00:00
Many more bugfixes
This commit is contained in:
parent
91c1e13273
commit
24c6dd1a68
4 changed files with 34 additions and 32 deletions
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
18
src/p_mobj.c
18
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;
|
||||
|
|
41
src/p_user.c
41
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)
|
||||
|
|
Loading…
Reference in a new issue