mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-22 10:52:23 +00:00
Merge branch 'pit-savior' into 'next'
Make Dead / NoClipHeight Objects Immune to Death Pits (Resolves #553) Closes #553 See merge request STJr/SRB2!2001
This commit is contained in:
commit
b55b91bc24
1 changed files with 57 additions and 96 deletions
153
src/p_mobj.c
153
src/p_mobj.c
|
@ -2380,6 +2380,55 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
else if (!onground)
|
||||
P_SlopeLaunch(mo);
|
||||
}
|
||||
|
||||
if (!mo->player && P_CheckDeathPitCollide(mo) && mo->health
|
||||
&& !(mo->flags & MF_NOCLIPHEIGHT) && !(mo->flags2 & MF2_BOSSDEAD))
|
||||
{
|
||||
switch (mo->type)
|
||||
{
|
||||
case MT_GHOST:
|
||||
case MT_METALSONIC_RACE:
|
||||
case MT_EXPLODE:
|
||||
case MT_BOSSEXPLODE:
|
||||
case MT_SONIC3KBOSSEXPLODE:
|
||||
break;
|
||||
case MT_REDFLAG:
|
||||
case MT_BLUEFLAG:
|
||||
// Remove from death pits. DON'T FUCKING DESPAWN IT DAMMIT
|
||||
mo->fuse = 1;
|
||||
return false;
|
||||
case MT_BOUNCERING:
|
||||
case MT_INFINITYRING:
|
||||
case MT_AUTOMATICRING:
|
||||
case MT_RAILRING:
|
||||
case MT_EXPLOSIONRING:
|
||||
case MT_SCATTERRING:
|
||||
case MT_GRENADERING:
|
||||
case MT_BOUNCEPICKUP:
|
||||
case MT_RAILPICKUP:
|
||||
case MT_AUTOPICKUP:
|
||||
case MT_EXPLODEPICKUP:
|
||||
case MT_SCATTERPICKUP:
|
||||
case MT_GRENADEPICKUP:
|
||||
//Don't remove respawning ringslinger collectables on death pits
|
||||
if (!(mo->flags2 & MF2_DONTRESPAWN))
|
||||
break;
|
||||
/* FALLTHRU */
|
||||
default:
|
||||
if (mo->flags & MF_ENEMY || mo->flags & MF_BOSS || mo->type == MT_MINECART)
|
||||
{
|
||||
// Kill enemies, bosses and minecarts that fall into death pits.
|
||||
P_KillMobj(mo, NULL, NULL, 0);
|
||||
return !P_MobjWasRemoved(mo); // allows explosion states to run
|
||||
}
|
||||
else
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (mo->type)
|
||||
{
|
||||
|
@ -2407,19 +2456,7 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
mo->flags |= MF_NOGRAVITY;
|
||||
}
|
||||
break;
|
||||
case MT_SPINFIRE:
|
||||
if (P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case MT_GOOP:
|
||||
if (P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
if (mo->z <= mo->floorz && mo->momz)
|
||||
{
|
||||
P_SetMobjState(mo, mo->info->meleestate);
|
||||
|
@ -2429,27 +2466,6 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
S_StartSound(mo, mo->info->painsound);
|
||||
}
|
||||
break;
|
||||
case MT_FALLINGROCK:
|
||||
case MT_BIGTUMBLEWEED:
|
||||
case MT_LITTLETUMBLEWEED:
|
||||
case MT_SHELL:
|
||||
// Remove stuff from death pits.
|
||||
if (P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case MT_REDFLAG:
|
||||
case MT_BLUEFLAG:
|
||||
// Remove from death pits. DON'T FUCKING DESPAWN IT DAMMIT
|
||||
if (P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
mo->fuse = 1;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case MT_RING: // Ignore still rings
|
||||
case MT_COIN:
|
||||
case MT_BLUESPHERE:
|
||||
|
@ -2463,15 +2479,6 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
case MT_FLINGBLUESPHERE:
|
||||
case MT_FLINGNIGHTSCHIP:
|
||||
case MT_FLINGEMERALD:
|
||||
// Remove flinged stuff from death pits.
|
||||
if (P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
if (!(mo->momx || mo->momy || mo->momz))
|
||||
return true;
|
||||
break;
|
||||
case MT_BOUNCERING:
|
||||
case MT_INFINITYRING:
|
||||
case MT_AUTOMATICRING:
|
||||
|
@ -2485,12 +2492,6 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
case MT_EXPLODEPICKUP:
|
||||
case MT_SCATTERPICKUP:
|
||||
case MT_GRENADEPICKUP:
|
||||
// Remove flinged stuff from death pits.
|
||||
if (P_CheckDeathPitCollide(mo) && (mo->flags2 & MF2_DONTRESPAWN))
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
if (!(mo->momx || mo->momy || mo->momz))
|
||||
return true;
|
||||
break;
|
||||
|
@ -2512,35 +2513,6 @@ boolean P_ZMovement(mobj_t *mo)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!mo->player && P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
switch (mo->type)
|
||||
{
|
||||
case MT_GHOST:
|
||||
case MT_METALSONIC_RACE:
|
||||
case MT_EXPLODE:
|
||||
case MT_BOSSEXPLODE:
|
||||
case MT_SONIC3KBOSSEXPLODE:
|
||||
break;
|
||||
default:
|
||||
if (mo->flags & MF_ENEMY || mo->flags & MF_BOSS || mo->type == MT_MINECART)
|
||||
{
|
||||
// Kill enemies, bosses and minecarts that fall into death pits.
|
||||
if (mo->health)
|
||||
{
|
||||
P_KillMobj(mo, NULL, NULL, 0);
|
||||
}
|
||||
return !P_MobjWasRemoved(mo); // allows explosion states to run
|
||||
}
|
||||
else
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (P_MobjFlip(mo)*mo->momz < 0
|
||||
&& (mo->flags2 & MF2_CLASSICPUSH))
|
||||
mo->momx = mo->momy = 0;
|
||||
|
@ -2993,7 +2965,7 @@ void P_PlayerZMovement(mobj_t *mo)
|
|||
|
||||
if (P_MobjFlip(mo)*mo->momz < 0) // falling
|
||||
{
|
||||
boolean clipmomz = !(P_CheckDeathPitCollide(mo));
|
||||
boolean clipmomz;
|
||||
|
||||
mo->pmomz = 0; // We're on a new floor, don't keep doing platform movement.
|
||||
|
||||
|
@ -3101,6 +3073,13 @@ boolean P_SceneryZMovement(mobj_t *mo)
|
|||
mo->eflags &= ~MFE_APPLYPMOMZ;
|
||||
}
|
||||
mo->z += mo->momz;
|
||||
|
||||
if (!mo->player && P_CheckDeathPitCollide(mo) && mo->health
|
||||
&& !(mo->flags & MF_NOCLIPHEIGHT) && !(mo->flags2 & MF2_BOSSDEAD))
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (mo->type)
|
||||
{
|
||||
|
@ -3114,11 +3093,6 @@ boolean P_SceneryZMovement(mobj_t *mo)
|
|||
}
|
||||
break;
|
||||
case MT_MEDIUMBUBBLE:
|
||||
if (P_CheckDeathPitCollide(mo)) // Don't split if you fell in a pit
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z <= mo->floorz)
|
||||
|| (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height >= mo->ceilingz)) // Hit the floor, so split!
|
||||
{
|
||||
|
@ -3153,11 +3127,6 @@ boolean P_SceneryZMovement(mobj_t *mo)
|
|||
}
|
||||
break;
|
||||
case MT_SEED: // now scenery
|
||||
if (P_CheckDeathPitCollide(mo)) // No flowers for death pits
|
||||
{
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
// Soniccd seed turns into a flower!
|
||||
if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z <= mo->floorz)
|
||||
|| (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height >= mo->ceilingz))
|
||||
|
@ -3178,13 +3147,6 @@ boolean P_SceneryZMovement(mobj_t *mo)
|
|||
break;
|
||||
}
|
||||
|
||||
if (P_CheckDeathPitCollide(mo))
|
||||
{
|
||||
if (mo->type != MT_GHOST) // ghosts play death animations instead, so don't remove them
|
||||
P_RemoveMobj(mo);
|
||||
return false;
|
||||
}
|
||||
|
||||
// clip movement
|
||||
if (((mo->z <= mo->floorz && !(mo->eflags & MFE_VERTICALFLIP))
|
||||
|| (mo->z + mo->height >= mo->ceilingz && mo->eflags & MFE_VERTICALFLIP))
|
||||
|
@ -7899,7 +7861,6 @@ static void P_MobjSceneryThink(mobj_t *mobj)
|
|||
if (!(mobj->eflags & MFE_UNDERWATER)
|
||||
|| (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + mobj->height >= mobj->ceilingz)
|
||||
|| (mobj->eflags & MFE_VERTICALFLIP && mobj->z <= mobj->floorz)
|
||||
|| (P_CheckDeathPitCollide(mobj))
|
||||
|| --mobj->fuse <= 0) // Bubbles eventually dissipate if they can't reach the surface.
|
||||
{
|
||||
// no playing sound: no point; the object is being removed
|
||||
|
|
Loading…
Reference in a new issue