Changed teetering to match the discoveries made about it in the sectorlist_traversal branch in a way that matches my revamps here, since I DID change a lot.

This commit is contained in:
toasterbabe 2016-06-09 15:16:25 +01:00
parent 51c769247a
commit 19b186e52e

View file

@ -2852,8 +2852,8 @@ static void P_DoTeeter(player_t *player)
msecnode_t *node; msecnode_t *node;
boolean teeter = false; boolean teeter = false;
boolean roverfloor; // solid 3d floors? boolean roverfloor; // solid 3d floors?
boolean checkedforteeter = false;
fixed_t floorheight, ceilingheight; fixed_t floorheight, ceilingheight;
fixed_t highestceilingheight, lowestfloorheight;
fixed_t topheight, bottomheight; // for 3d floor usage fixed_t topheight, bottomheight; // for 3d floor usage
const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter. const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter.
@ -2862,107 +2862,11 @@ static void P_DoTeeter(player_t *player)
teeter = true; teeter = true;
#undef maxzdelta #undef maxzdelta
else // Let's do some checks... else // Let's do some checks...
{
for (node = player->mo->touching_sectorlist; node; node = node->m_snext)
{
// Ledge teetering. Check if any nearby sectors are low enough from your current one.
checkedforteeter = true;
roverfloor = false;
ceilingheight = node->m_sector->ceilingheight;
floorheight = node->m_sector->floorheight;
#ifdef ESLOPE
if (node->m_sector->c_slope)
ceilingheight = P_GetZAt(node->m_sector->c_slope, player->mo->x, player->mo->y) + FixedMul(node->m_sector->c_slope->zdelta, tiptop);
if (node->m_sector->f_slope)
floorheight = P_GetZAt(node->m_sector->f_slope, player->mo->x, player->mo->y);
#endif
if (node->m_sector->ffloors)
{
ffloor_t *rover;
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
{
if (!(rover->flags & FF_EXISTS)) continue;
topheight = *rover->topheight;
bottomheight = *rover->bottomheight;
#ifdef ESLOPE
if (*rover->t_slope)
topheight = P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y);
if (*rover->b_slope)
bottomheight = P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y);
#endif
if (P_CheckSolidLava(player->mo, rover))
;
else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND))
continue; // intangible 3d floor
if (player->mo->eflags & MFE_VERTICALFLIP)
{
if (bottomheight > ceilingheight) // Above the ceiling
continue;
if (bottomheight > player->mo->z + player->mo->height + tiptop
|| (topheight < player->mo->z
&& player->mo->z + player->mo->height < ceilingheight - tiptop))
{
teeter = true;
roverfloor = true;
}
else
{
teeter = false;
roverfloor = true;
break;
}
}
else
{
if (topheight < floorheight) // Below the floor
continue;
if (topheight < player->mo->z - tiptop
|| (bottomheight > player->mo->z + player->mo->height
&& player->mo->z > floorheight + tiptop))
{
teeter = true;
roverfloor = true;
}
else
{
teeter = false;
roverfloor = true;
break;
}
}
}
}
if (!teeter && !roverfloor)
{
if (player->mo->eflags & MFE_VERTICALFLIP)
{
if (ceilingheight > player->mo->z + player->mo->height + tiptop)
teeter = true;
}
else
{
if (floorheight < player->mo->z - tiptop)
teeter = true;
}
}
}
}
if (checkedforteeter && !teeter) // Backup code
{ {
sector_t *sec; sector_t *sec;
UINT8 i; UINT8 i;
fixed_t highestceilingheight = INT32_MIN; highestceilingheight = INT32_MIN;
fixed_t lowestfloorheight = INT32_MAX; lowestfloorheight = INT32_MAX;
teeter = false; teeter = false;
roverfloor = false; roverfloor = false;
@ -3197,7 +3101,7 @@ teeterdone:
if ((player->mo->state == &states[S_PLAY_STND] || player->mo->state == &states[S_PLAY_TAP1] || player->mo->state == &states[S_PLAY_TAP2] || player->mo->state == &states[S_PLAY_SUPERSTAND])) if ((player->mo->state == &states[S_PLAY_STND] || player->mo->state == &states[S_PLAY_TAP1] || player->mo->state == &states[S_PLAY_TAP2] || player->mo->state == &states[S_PLAY_SUPERSTAND]))
P_SetPlayerMobjState(player->mo, S_PLAY_TEETER1); P_SetPlayerMobjState(player->mo, S_PLAY_TEETER1);
} }
else if (checkedforteeter && (player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER])) else if ((player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER]))
P_SetPlayerMobjState(player->mo, S_PLAY_STND); P_SetPlayerMobjState(player->mo, S_PLAY_STND);
} }