private bool isValidCover(Cover cover, Vector3 position, int direction, bool checkPath) { if (!_hasThreat) { return(true); } if (Vector3.Distance(position, _threatPosition) < AvoidDistance) { return(false); } if (!AIUtil.IsGoodAngle(MaxTallCoverAngle, MaxLowCoverAngle, cover, position, _threatPosition, cover.IsTall)) { return(false); } if (!AIUtil.IsCoverPositionFree(cover, position, 1, _actor)) { return(false); } var aimPosition = position; if (cover.IsTall) { var angle = Util.AngleOfVector(_threatPosition - position); if (direction > 0) { if (!cover.IsFrontField(angle, _motor.CoverSettings.Angles.TallRightCornerFront)) { return(false); } if (!cover.IsRight(angle, _motor.CoverSettings.Angles.RightCorner, false)) { return(false); } aimPosition = cover.RightCorner(cover.Bottom, _motor.CoverSettings.CornerOffset.x); } else if (direction < 0) { if (!cover.IsFrontField(angle, _motor.CoverSettings.Angles.TallLeftCornerFront)) { return(false); } if (!cover.IsLeft(angle, _motor.CoverSettings.Angles.LeftCorner, false)) { return(false); } aimPosition = cover.LeftCorner(cover.Bottom, _motor.CoverSettings.CornerOffset.x); } } if (AIUtil.IsObstructed(aimPosition + (_actor.StandingTopPosition - transform.position), _threatPosition + Vector3.up * 2, 100)) { return(false); } if (checkPath) { if (Vector3.Distance(transform.position, _threatPosition) > AvoidDistance) { if (NavMesh.CalculatePath(transform.position, position, 1, _path)) { for (int i = 0; i < _path.GetCornersNonAlloc(_corners); i++) { var a = i == 0 ? transform.position : _corners[i - 1]; var b = _corners[i]; var closest = Util.FindClosestToPath(a, b, _threatPosition); if (Vector3.Distance(closest, _threatPosition) < AvoidDistance) { return(false); } } } else { return(false); } } } return(true); }