A bunch of fixes that allow for proper handling of triggerspecial_touch. Not perfect, but I don't have any more time to spend tonight.
This commit is contained in:
parent
5fed10913f
commit
2d50dd1fd1
|
@ -2073,6 +2073,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime)
|
||||||
boolean inAndOut = false;
|
boolean inAndOut = false;
|
||||||
boolean floortouch = false;
|
boolean floortouch = false;
|
||||||
fixed_t bottomheight, topheight;
|
fixed_t bottomheight, topheight;
|
||||||
|
msecnode_t *node;
|
||||||
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
|
@ -2134,8 +2135,22 @@ void T_EachTimeThinker(levelspecthink_t *eachtime)
|
||||||
if ((netgame || multiplayer) && players[j].spectator)
|
if ((netgame || multiplayer) && players[j].spectator)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (players[j].mo->subsector->sector != targetsec)
|
if (players[j].mo->subsector->sector == targetsec)
|
||||||
continue;
|
;
|
||||||
|
else if (sec->flags & SF_TRIGGERSPECIAL_TOUCH)
|
||||||
|
{
|
||||||
|
boolean insector = false;
|
||||||
|
for (node = players[j].mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
|
{
|
||||||
|
if (node->m_sector == targetsec)
|
||||||
|
{
|
||||||
|
insector = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!insector)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
topheight = P_GetSpecialTopZ(players[j].mo, sec, targetsec);
|
topheight = P_GetSpecialTopZ(players[j].mo, sec, targetsec);
|
||||||
bottomheight = P_GetSpecialBottomZ(players[j].mo, sec, targetsec);
|
bottomheight = P_GetSpecialBottomZ(players[j].mo, sec, targetsec);
|
||||||
|
@ -2184,7 +2199,25 @@ void T_EachTimeThinker(levelspecthink_t *eachtime)
|
||||||
if ((netgame || multiplayer) && players[i].spectator)
|
if ((netgame || multiplayer) && players[i].spectator)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (players[i].mo->subsector->sector != sec)
|
if (players[i].mo->subsector->sector == targetsec)
|
||||||
|
;
|
||||||
|
else if (sec->flags & SF_TRIGGERSPECIAL_TOUCH)
|
||||||
|
{
|
||||||
|
boolean insector = false;
|
||||||
|
for (node = players[i].mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
|
{
|
||||||
|
if (node->m_sector == targetsec)
|
||||||
|
{
|
||||||
|
insector = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!insector)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(players[i].mo->subsector->sector == sec
|
||||||
|
|| P_PlayerTouchingSectorSpecial(&players[i], 2, (GETSECSPECIAL(sec->special, 2))) == sec))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (floortouch == true && P_IsObjectOnGroundIn(players[i].mo, sec))
|
if (floortouch == true && P_IsObjectOnGroundIn(players[i].mo, sec))
|
||||||
|
|
61
src/p_spec.c
61
src/p_spec.c
|
@ -3606,14 +3606,16 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
|
||||||
{
|
{
|
||||||
if (roversector)
|
if (roversector)
|
||||||
{
|
{
|
||||||
if (players[i].mo->subsector->sector != roversector)
|
if (!(players[i].mo->subsector->sector == roversector
|
||||||
|
|| sector->flags & SF_TRIGGERSPECIAL_TOUCH))
|
||||||
goto DoneSection2;
|
goto DoneSection2;
|
||||||
if (!P_ThingIsOnThe3DFloor(players[i].mo, sector, roversector))
|
if (!P_ThingIsOnThe3DFloor(players[i].mo, sector, roversector))
|
||||||
goto DoneSection2;
|
goto DoneSection2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (players[i].mo->subsector->sector != sector)
|
if (!(players[i].mo->subsector->sector == sector
|
||||||
|
|| sector->flags & SF_TRIGGERSPECIAL_TOUCH))
|
||||||
goto DoneSection2;
|
goto DoneSection2;
|
||||||
|
|
||||||
if (special == 3 && !P_MobjReadyToTrigger(players[i].mo, sector))
|
if (special == 3 && !P_MobjReadyToTrigger(players[i].mo, sector))
|
||||||
|
@ -4364,6 +4366,7 @@ sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo)
|
||||||
{
|
{
|
||||||
sector_t *sector;
|
sector_t *sector;
|
||||||
ffloor_t *rover;
|
ffloor_t *rover;
|
||||||
|
fixed_t topheight, bottomheight;
|
||||||
|
|
||||||
sector = mo->subsector->sector;
|
sector = mo->subsector->sector;
|
||||||
if (!sector->ffloors)
|
if (!sector->ffloors)
|
||||||
|
@ -4371,8 +4374,6 @@ sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo)
|
||||||
|
|
||||||
for (rover = sector->ffloors; rover; rover = rover->next)
|
for (rover = sector->ffloors; rover; rover = rover->next)
|
||||||
{
|
{
|
||||||
fixed_t topheight, bottomheight;
|
|
||||||
|
|
||||||
if (!rover->master->frontsector->special)
|
if (!rover->master->frontsector->special)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -4420,20 +4421,21 @@ sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define TELEPORTED (player->mo->subsector->sector != originalsector)
|
||||||
|
|
||||||
/** Checks if a player is standing on or is inside a 3D floor (e.g. water) and
|
/** Checks if a player is standing on or is inside a 3D floor (e.g. water) and
|
||||||
* applies any specials.
|
* applies any specials.
|
||||||
*
|
*
|
||||||
* \param player Player to check.
|
* \param player Player to check.
|
||||||
* \sa P_ThingOnSpecial3DFloor, P_PlayerInSpecialSector
|
* \sa P_ThingOnSpecial3DFloor, P_PlayerInSpecialSector
|
||||||
*/
|
*/
|
||||||
static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector)
|
static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector, sector_t *originalsector)
|
||||||
{
|
{
|
||||||
ffloor_t *rover;
|
ffloor_t *rover;
|
||||||
|
fixed_t topheight, bottomheight;
|
||||||
|
|
||||||
for (rover = sector->ffloors; rover; rover = rover->next)
|
for (rover = sector->ffloors; rover; rover = rover->next)
|
||||||
{
|
{
|
||||||
fixed_t topheight, bottomheight;
|
|
||||||
|
|
||||||
if (!rover->master->frontsector->special)
|
if (!rover->master->frontsector->special)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -4477,7 +4479,10 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector)
|
||||||
// This FOF has the special we're looking for, but are we allowed to touch it?
|
// This FOF has the special we're looking for, but are we allowed to touch it?
|
||||||
if (sector == player->mo->subsector->sector
|
if (sector == player->mo->subsector->sector
|
||||||
|| (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH))
|
|| (rover->master->frontsector->flags & SF_TRIGGERSPECIAL_TOUCH))
|
||||||
|
{
|
||||||
P_ProcessSpecialSector(player, rover->master->frontsector, sector);
|
P_ProcessSpecialSector(player, rover->master->frontsector, sector);
|
||||||
|
if TELEPORTED return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow sector specials to be applied to polyobjects!
|
// Allow sector specials to be applied to polyobjects!
|
||||||
|
@ -4488,7 +4493,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector)
|
||||||
boolean touching = false;
|
boolean touching = false;
|
||||||
boolean inside = false;
|
boolean inside = false;
|
||||||
|
|
||||||
while(po)
|
while (po)
|
||||||
{
|
{
|
||||||
if (po->flags & POF_NOSPECIALS)
|
if (po->flags & POF_NOSPECIALS)
|
||||||
{
|
{
|
||||||
|
@ -4564,6 +4569,7 @@ static void P_PlayerOnSpecial3DFloor(player_t *player, sector_t *sector)
|
||||||
}
|
}
|
||||||
|
|
||||||
P_ProcessSpecialSector(player, polysec, sector);
|
P_ProcessSpecialSector(player, polysec, sector);
|
||||||
|
if TELEPORTED return;
|
||||||
|
|
||||||
po = (polyobj_t *)(po->link.next);
|
po = (polyobj_t *)(po->link.next);
|
||||||
}
|
}
|
||||||
|
@ -4668,40 +4674,43 @@ static void P_RunSpecialSectorCheck(player_t *player, sector_t *sector)
|
||||||
*/
|
*/
|
||||||
void P_PlayerInSpecialSector(player_t *player)
|
void P_PlayerInSpecialSector(player_t *player)
|
||||||
{
|
{
|
||||||
sector_t *sector;
|
sector_t *originalsector;
|
||||||
|
sector_t *loopsector;
|
||||||
msecnode_t *node;
|
msecnode_t *node;
|
||||||
|
|
||||||
if (!player->mo)
|
if (!player->mo)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Do your ->subsector->sector first
|
originalsector = player->mo->subsector->sector;
|
||||||
sector = player->mo->subsector->sector;
|
|
||||||
P_PlayerOnSpecial3DFloor(player, sector);
|
|
||||||
// After P_PlayerOnSpecial3DFloor, recheck if the player is in that sector,
|
|
||||||
// because the player can be teleported in between these times.
|
|
||||||
if (sector == player->mo->subsector->sector)
|
|
||||||
P_RunSpecialSectorCheck(player, sector);
|
|
||||||
|
|
||||||
// Iterate through touching_sectorlist
|
P_PlayerOnSpecial3DFloor(player, originalsector, originalsector); // Handle FOFs first.
|
||||||
|
if TELEPORTED return;
|
||||||
|
|
||||||
|
P_RunSpecialSectorCheck(player, originalsector);
|
||||||
|
if TELEPORTED return;
|
||||||
|
|
||||||
|
// Iterate through touching_sectorlist for SF_TRIGGERSPECIAL_TOUCH
|
||||||
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next)
|
||||||
{
|
{
|
||||||
sector = node->m_sector;
|
loopsector = node->m_sector;
|
||||||
|
|
||||||
if (sector == player->mo->subsector->sector) // Don't duplicate
|
if (loopsector == originalsector) // Don't duplicate
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Check 3D floors...
|
// Check 3D floors...
|
||||||
P_PlayerOnSpecial3DFloor(player, sector);
|
P_PlayerOnSpecial3DFloor(player, loopsector, originalsector);
|
||||||
|
if TELEPORTED return;
|
||||||
|
|
||||||
if (!(sector->flags & SF_TRIGGERSPECIAL_TOUCH))
|
if (!(loopsector->flags & SF_TRIGGERSPECIAL_TOUCH))
|
||||||
return;
|
continue;
|
||||||
// After P_PlayerOnSpecial3DFloor, recheck if the player is in that sector,
|
|
||||||
// because the player can be teleported in between these times.
|
P_RunSpecialSectorCheck(player, loopsector);
|
||||||
if (sector == player->mo->subsector->sector)
|
if TELEPORTED return;
|
||||||
P_RunSpecialSectorCheck(player, sector);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef TELEPORTED
|
||||||
|
|
||||||
/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up.
|
/** Animate planes, scroll walls, etc. and keeps track of level timelimit and exits if time is up.
|
||||||
*
|
*
|
||||||
* \sa P_CheckTimeLimit, P_CheckPointLimit
|
* \sa P_CheckTimeLimit, P_CheckPointLimit
|
||||||
|
|
Loading…
Reference in a new issue