Merge branch 'fix-remove-facetarget-action' into 'next'

Fix segfault when P_RemoveMobj is called within A_FaceTarget action

See merge request STJr/SRB2!1974
This commit is contained in:
sphere 2023-05-26 01:15:40 +00:00
commit d6d424f102

View file

@ -1571,6 +1571,8 @@ void A_PointyThink(mobj_t *actor)
// Okay, we found the closest player. Let's move based on his movement.
P_SetTarget(&actor->target, player->mo);
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (P_AproxDistance(player->mo->x - actor->x, player->mo->y - actor->y) < P_AproxDistance(player->mo->x + player->mo->momx - actor->x, player->mo->y + player->mo->momy - actor->y))
sign = -1; // Player is moving away
@ -1690,6 +1692,8 @@ void A_HoodFire(mobj_t *actor)
}
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (!(arrow = P_SpawnMissile(actor, actor->target, (mobjtype_t)locvar1)))
return;
@ -2270,6 +2274,8 @@ void A_VultureVtol(mobj_t *actor)
actor->flags |= MF_FLOAT;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
S_StopSound(actor);
@ -2368,6 +2374,9 @@ void A_VultureHover(mobj_t *actor)
P_VultureHoverParticle(actor);
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
targetz = actor->target->z + actor->target->height / 2;
for (i = -1; i <= 1; i++)
{
@ -2684,6 +2693,8 @@ void A_LobShot(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (actor->eflags & MFE_VERTICALFLIP)
{
@ -2779,6 +2790,8 @@ void A_FireShot(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (actor->eflags & MFE_VERTICALFLIP)
z = actor->z + actor->height - FixedMul(48*FRACUNIT + locvar2*FRACUNIT, actor->scale);
@ -2817,6 +2830,8 @@ void A_SuperFireShot(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (actor->eflags & MFE_VERTICALFLIP)
z = actor->z + actor->height - FixedMul(48*FRACUNIT + locvar2*FRACUNIT, actor->scale);
@ -2864,6 +2879,8 @@ void A_BossFireShot(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
switch (locvar2)
{
@ -2951,6 +2968,8 @@ void A_Boss7FireMissiles(mobj_t *actor)
}
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
S_StartSound(NULL, locvar2);
@ -3335,6 +3354,8 @@ void A_SkullAttack(mobj_t *actor)
if (actor->info->activesound)
S_StartSound(actor, actor->info->activesound);
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
dist = P_AproxDistance(dest->x - actor->x, dest->y - actor->y);
@ -3446,6 +3467,9 @@ void A_BossZoom(mobj_t *actor)
if (actor->info->attacksound)
S_StartAttackSound(actor, actor->info->attacksound);
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
an = actor->angle >> ANGLETOFINESHIFT;
actor->momx = FixedMul(FixedMul(actor->info->speed*5*FRACUNIT, actor->scale), FINECOSINE(an));
actor->momy = FixedMul(FixedMul(actor->info->speed*5*FRACUNIT, actor->scale), FINESINE(an));
@ -5543,6 +5567,9 @@ void A_JetgShoot(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
P_SpawnMissile(actor, actor->target, (mobjtype_t)actor->info->raisestate);
if (ultimatemode)
@ -5577,6 +5604,9 @@ void A_ShootBullet(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
P_SpawnMissile(actor, actor->target, (mobjtype_t)actor->info->raisestate);
if (actor->info->attacksound)
@ -7435,6 +7465,8 @@ void A_Boss7Chase(mobj_t *actor)
&& (actor->target->player->powers[pw_carry] == CR_GENERIC))
{
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
P_SetMobjState(actor, S_BLACKEGG_SHOOT1);
actor->movecount = TICRATE + P_RandomByte()/2;
return;
@ -7452,6 +7484,8 @@ void A_Boss7Chase(mobj_t *actor)
if (actor->z < 1056*FRACUNIT)
{
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
P_SetMobjState(actor, actor->info->xdeathstate);
actor->movecount = 7*TICRATE + P_RandomByte();
break;
@ -7460,6 +7494,8 @@ void A_Boss7Chase(mobj_t *actor)
/* FALLTHRU */
case 1: // Chaingun Goop
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
P_SetMobjState(actor, S_BLACKEGG_SHOOT1);
if (actor->health > actor->info->damage)
@ -7469,6 +7505,8 @@ void A_Boss7Chase(mobj_t *actor)
break;
case 2: // Homing Missile
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
P_SetMobjState(actor, actor->info->missilestate);
S_StartSound(0, sfx_beflap);
break;
@ -8186,6 +8224,9 @@ void A_Boss3Path(mobj_t *actor)
P_SetTarget(&actor->target, actor->tracer->target);
var1 = 0, var2 = 0;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (actor->tracer->state == &states[actor->tracer->info->missilestate])
P_SetMobjState(actor, actor->info->missilestate);
return;
@ -9860,6 +9901,8 @@ void A_SplitShot(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
{
const angle_t an = (actor->angle + ANGLE_90) >> ANGLETOFINESHIFT;
const fixed_t fasin = FINESINE(an);
@ -9924,6 +9967,9 @@ void A_MultiShot(mobj_t *actor)
if (actor->target)
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if(loc1lw > 90)
ad = FixedMul(90*FRACUNIT, actor->scale);
else
@ -11068,6 +11114,8 @@ void A_VileTarget(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
// Determine object to spawn
if (locvar1 <= 0 || locvar1 >= NUMMOBJTYPES)
@ -11155,6 +11203,8 @@ void A_VileAttack(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (locvar1 <= 0 || locvar1 >= NUMSFX)
soundtoplay = sfx_brakrx;
@ -11473,6 +11523,8 @@ void A_BrakFireShot(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
x = actor->x
+ P_ReturnThrustX(actor, actor->angle, FixedMul(64*FRACUNIT, actor->scale))
@ -11590,6 +11642,9 @@ void A_BrakLobShot(mobj_t *actor)
// Okay, complicated math done. Let's fire our object already, sheesh.
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (locvar1 <= 0 || locvar1 >= NUMMOBJTYPES)
typeOfShot = MT_CANNONBALL;
else typeOfShot = (mobjtype_t)locvar1;
@ -12674,6 +12729,8 @@ void A_WhoCaresIfYourSonIsABee(mobj_t *actor)
return;
A_FaceTarget(actor);
if (P_MobjWasRemoved(actor))
return;
if (actor->extravalue1)
actor->extravalue1--;