IsWalkableTraceLineClear: Fixed deadlock (mutual collisions in traces leading to hang)

This commit is contained in:
s1lentq 2024-02-29 06:52:48 +07:00
parent 5d2174fbbf
commit 92775824e6

View File

@ -388,15 +388,21 @@ inline bool IsWalkableTraceLineClear(Vector &from, Vector &to, unsigned int flag
{
TraceResult result;
edict_t *pEntIgnore = nullptr;
edict_t *pEntPrev = nullptr;
Vector useFrom = from;
while (true)
const int maxTries = 50;
for (int t = 0; t < maxTries; ++t)
{
UTIL_TraceLine(useFrom, to, ignore_monsters, pEntIgnore, &result);
// if we hit a walkable entity, try again
if (result.flFraction != 1.0f && (result.pHit && IsEntityWalkable(VARS(result.pHit), flags)))
{
if (result.pHit == pEntPrev)
return false; // deadlock, give up
pEntPrev = pEntIgnore;
pEntIgnore = result.pHit;
// start from just beyond where we hit to avoid infinite loops