Polyobject waypoint movement: Prevent infinite loop if all waypoints are in the same location
This commit is contained in:
parent
536e355cdf
commit
371a1851e3
|
@ -631,6 +631,7 @@ mobj_t *P_GetLastWaypoint(UINT8 sequence);
|
||||||
mobj_t *P_GetPreviousWaypoint(mobj_t *current, boolean wrap);
|
mobj_t *P_GetPreviousWaypoint(mobj_t *current, boolean wrap);
|
||||||
mobj_t *P_GetNextWaypoint(mobj_t *current, boolean wrap);
|
mobj_t *P_GetNextWaypoint(mobj_t *current, boolean wrap);
|
||||||
mobj_t *P_GetClosestWaypoint(UINT8 sequence, mobj_t *mo);
|
mobj_t *P_GetClosestWaypoint(UINT8 sequence, mobj_t *mo);
|
||||||
|
boolean P_IsDegeneratedWaypointSequence(UINT8 sequence);
|
||||||
|
|
||||||
// =====================================
|
// =====================================
|
||||||
// Internal parameters, used for engine.
|
// Internal parameters, used for engine.
|
||||||
|
|
|
@ -2173,6 +2173,14 @@ boolean EV_DoPolyObjWaypoint(polywaypointdata_t *pwdata)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sanity check: If all waypoints are in the same location,
|
||||||
|
// don't allow the movement to be continuous so we don't get stuck in an infinite loop.
|
||||||
|
if (th->continuous && P_IsDegeneratedWaypointSequence(th->sequence))
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_POLYOBJ, "EV_DoPolyObjWaypoint: All waypoints are in the same location!\n");
|
||||||
|
th->continuous = false;
|
||||||
|
}
|
||||||
|
|
||||||
th->pointnum = first->health;
|
th->pointnum = first->health;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -239,6 +239,38 @@ mobj_t *P_GetClosestWaypoint(UINT8 sequence, mobj_t *mo)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return true if all waypoints are in the same location
|
||||||
|
boolean P_IsDegeneratedWaypointSequence(UINT8 sequence)
|
||||||
|
{
|
||||||
|
mobj_t *first, *waypoint;
|
||||||
|
UINT8 wp;
|
||||||
|
|
||||||
|
if (numwaypoints[sequence] <= 1)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
first = waypoints[sequence][0];
|
||||||
|
|
||||||
|
for (wp = 1; wp < numwaypoints[sequence]; wp++)
|
||||||
|
{
|
||||||
|
waypoint = waypoints[sequence][wp];
|
||||||
|
|
||||||
|
if (!waypoint)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (waypoint->x != first->x)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (waypoint->y != first->y)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (waypoint->z != first->z)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Logs an error about a map being corrupt, then terminate.
|
/** Logs an error about a map being corrupt, then terminate.
|
||||||
* This allows reporting highly technical errors for usefulness, without
|
* This allows reporting highly technical errors for usefulness, without
|
||||||
* confusing a novice map designer who simply needs to run ZenNode.
|
* confusing a novice map designer who simply needs to run ZenNode.
|
||||||
|
|
Loading…
Reference in New Issue