mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-25 05:41:42 +00:00
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:
parent
51c769247a
commit
19b186e52e
1 changed files with 4 additions and 100 deletions
104
src/p_user.c
104
src/p_user.c
|
@ -2852,8 +2852,8 @@ static void P_DoTeeter(player_t *player)
|
|||
msecnode_t *node;
|
||||
boolean teeter = false;
|
||||
boolean roverfloor; // solid 3d floors?
|
||||
boolean checkedforteeter = false;
|
||||
fixed_t floorheight, ceilingheight;
|
||||
fixed_t highestceilingheight, lowestfloorheight;
|
||||
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.
|
||||
|
||||
|
@ -2862,107 +2862,11 @@ static void P_DoTeeter(player_t *player)
|
|||
teeter = true;
|
||||
#undef maxzdelta
|
||||
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;
|
||||
UINT8 i;
|
||||
fixed_t highestceilingheight = INT32_MIN;
|
||||
fixed_t lowestfloorheight = INT32_MAX;
|
||||
highestceilingheight = INT32_MIN;
|
||||
lowestfloorheight = INT32_MAX;
|
||||
|
||||
teeter = 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]))
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue