mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-14 08:30:50 +00:00
Improved compatibility of blocking lines handling
Only the first blocking line changes contact state during line iteration
This reverts 3b818171d5
https://forum.zdoom.org/viewtopic.php?t=57870
This commit is contained in:
parent
a5ded11994
commit
40fd816d54
1 changed files with 75 additions and 57 deletions
|
@ -856,7 +856,7 @@ static int LineIsBelow(line_t *line, AActor *actor)
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
static // killough 3/26/98: make static
|
static // killough 3/26/98: make static
|
||||||
bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::CheckResult &cres, const FBoundingBox &box, FCheckPosition &tm)
|
bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::CheckResult &cres, const FBoundingBox &box, FCheckPosition &tm, const bool wasfit)
|
||||||
{
|
{
|
||||||
line_t *ld = cres.line;
|
line_t *ld = cres.line;
|
||||||
bool rail = false;
|
bool rail = false;
|
||||||
|
@ -901,6 +901,8 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
{
|
{
|
||||||
double portz = cres.line->frontsector->GetPortalPlaneZ(sector_t::ceiling);
|
double portz = cres.line->frontsector->GetPortalPlaneZ(sector_t::ceiling);
|
||||||
if (tm.thing->Z() < portz && tm.thing->Z() + tm.thing->MaxStepHeight >= portz && tm.floorz < portz)
|
if (tm.thing->Z() < portz && tm.thing->Z() + tm.thing->MaxStepHeight >= portz && tm.floorz < portz)
|
||||||
|
{
|
||||||
|
if (wasfit)
|
||||||
{
|
{
|
||||||
tm.floorz = portz;
|
tm.floorz = portz;
|
||||||
tm.floorsector = cres.line->frontsector;
|
tm.floorsector = cres.line->frontsector;
|
||||||
|
@ -908,6 +910,7 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
tm.floorterrain = 0;
|
tm.floorterrain = 0;
|
||||||
tm.portalstep = true;
|
tm.portalstep = true;
|
||||||
tm.portalgroup = cres.line->frontsector->GetOppositePortalGroup(sector_t::ceiling);
|
tm.portalgroup = cres.line->frontsector->GetOppositePortalGroup(sector_t::ceiling);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -916,7 +919,10 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
{
|
{
|
||||||
P_DamageMobj(tm.thing, NULL, NULL, tm.thing->Mass >> 5, NAME_Melee);
|
P_DamageMobj(tm.thing, NULL, NULL, tm.thing->Mass >> 5, NAME_Melee);
|
||||||
}
|
}
|
||||||
|
if (wasfit)
|
||||||
|
{
|
||||||
tm.thing->BlockingLine = ld;
|
tm.thing->BlockingLine = ld;
|
||||||
|
}
|
||||||
CheckForPushSpecial(ld, 0, tm.thing);
|
CheckForPushSpecial(ld, 0, tm.thing);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -947,6 +953,8 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
int state = LineIsAbove(cres.line, tm.thing);
|
int state = LineIsAbove(cres.line, tm.thing);
|
||||||
if (state == -1) return true;
|
if (state == -1) return true;
|
||||||
if (state == 1)
|
if (state == 1)
|
||||||
|
{
|
||||||
|
if (wasfit)
|
||||||
{
|
{
|
||||||
// the line should not block but we should set the ceilingz to the portal boundary so that we can't float up into that line.
|
// the line should not block but we should set the ceilingz to the portal boundary so that we can't float up into that line.
|
||||||
double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::floor);
|
double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::floor);
|
||||||
|
@ -955,6 +963,7 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
tm.ceilingz = portalz;
|
tm.ceilingz = portalz;
|
||||||
tm.ceilingsector = cres.line->frontsector;
|
tm.ceilingsector = cres.line->frontsector;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -964,6 +973,8 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
int state = LineIsBelow(cres.line, tm.thing);
|
int state = LineIsBelow(cres.line, tm.thing);
|
||||||
if (state == -1) return true;
|
if (state == -1) return true;
|
||||||
if (state == 1)
|
if (state == 1)
|
||||||
|
{
|
||||||
|
if (wasfit)
|
||||||
{
|
{
|
||||||
double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::ceiling);
|
double portalz = cres.line->frontsector->GetPortalPlaneZ(sector_t::ceiling);
|
||||||
if (portalz > tm.floorz)
|
if (portalz > tm.floorz)
|
||||||
|
@ -972,6 +983,7 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
tm.floorsector = cres.line->frontsector;
|
tm.floorsector = cres.line->frontsector;
|
||||||
tm.floorterrain = 0;
|
tm.floorterrain = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -981,7 +993,10 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
{
|
{
|
||||||
P_DamageMobj(tm.thing, NULL, NULL, tm.thing->Mass >> 5, NAME_Melee);
|
P_DamageMobj(tm.thing, NULL, NULL, tm.thing->Mass >> 5, NAME_Melee);
|
||||||
}
|
}
|
||||||
|
if (wasfit)
|
||||||
|
{
|
||||||
tm.thing->BlockingLine = ld;
|
tm.thing->BlockingLine = ld;
|
||||||
|
}
|
||||||
// Calculate line side based on the actor's original position, not the new one.
|
// Calculate line side based on the actor's original position, not the new one.
|
||||||
CheckForPushSpecial(ld, P_PointOnLineSide(cres.Position, ld), tm.thing);
|
CheckForPushSpecial(ld, P_PointOnLineSide(cres.Position, ld), tm.thing);
|
||||||
return false;
|
return false;
|
||||||
|
@ -999,10 +1014,13 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
{
|
{
|
||||||
double portz = tm.thing->Sector->GetPortalPlaneZ(sector_t::ceiling);
|
double portz = tm.thing->Sector->GetPortalPlaneZ(sector_t::ceiling);
|
||||||
if (tm.thing->Z() < portz && tm.thing->Z() + tm.thing->MaxStepHeight >= portz && tm.floorz < portz)
|
if (tm.thing->Z() < portz && tm.thing->Z() + tm.thing->MaxStepHeight >= portz && tm.floorz < portz)
|
||||||
|
{
|
||||||
|
if (wasfit)
|
||||||
{
|
{
|
||||||
// Actor is stepping through a portal.
|
// Actor is stepping through a portal.
|
||||||
tm.portalstep = true;
|
tm.portalstep = true;
|
||||||
tm.portalgroup = tm.thing->Sector->GetOppositePortalGroup(sector_t::ceiling);
|
tm.portalgroup = tm.thing->Sector->GetOppositePortalGroup(sector_t::ceiling);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1042,6 +1060,8 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
open.bottom += 32;
|
open.bottom += 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wasfit)
|
||||||
|
{
|
||||||
// adjust floor / ceiling heights
|
// adjust floor / ceiling heights
|
||||||
if (!(cres.portalflags & FFCF_NOCEILING))
|
if (!(cres.portalflags & FFCF_NOCEILING))
|
||||||
{
|
{
|
||||||
|
@ -1079,6 +1099,7 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec
|
||||||
tm.dropoffz = open.lowfloor;
|
tm.dropoffz = open.lowfloor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if contacted a special line, add it to the list
|
// if contacted a special line, add it to the list
|
||||||
spechit_t spec;
|
spechit_t spec;
|
||||||
|
@ -1881,7 +1902,7 @@ bool P_CheckPosition(AActor *thing, const DVector2 &pos, FCheckPosition &tm, boo
|
||||||
|
|
||||||
while (it.Next(&lcres))
|
while (it.Next(&lcres))
|
||||||
{
|
{
|
||||||
bool thisresult = PIT_CheckLine(it, lcres, it.Box(), tm);
|
bool thisresult = PIT_CheckLine(it, lcres, it.Box(), tm, good);
|
||||||
good &= thisresult;
|
good &= thisresult;
|
||||||
if (thisresult)
|
if (thisresult)
|
||||||
{
|
{
|
||||||
|
@ -5920,10 +5941,7 @@ bool P_AdjustFloorCeil(AActor *thing, FChangePosition *cpos)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isgood = P_CheckPosition(thing, thing->Pos(), tm);
|
bool isgood = P_CheckPosition(thing, thing->Pos(), tm);
|
||||||
|
if (!(thing->flags4 & MF4_ACTLIKEBRIDGE))
|
||||||
// This is essentially utterly broken because it even uses the return from a failed P_CheckPosition but the entire logic will break down if that isn't done.
|
|
||||||
// However, if tm.floorz is greater than tm.ceilingz we have a real problem that needs to be dealt with exolicitly.
|
|
||||||
if (!(thing->flags4 & MF4_ACTLIKEBRIDGE) && tm.floorz <= tm.ceilingz)
|
|
||||||
{
|
{
|
||||||
thing->floorz = tm.floorz;
|
thing->floorz = tm.floorz;
|
||||||
thing->ceilingz = tm.ceilingz;
|
thing->ceilingz = tm.ceilingz;
|
||||||
|
|
Loading…
Reference in a new issue