public static List<Vector2> GetEvadePoints(int speed = -1,
int delay = 0,
bool isBlink = false,
bool onlyGood = false)
{
speed = speed == -1 ? (int)ObjectManager.Player.MoveSpeed : speed;
var goodCandidates = new List<Vector2>();
var badCandidates = new List<Vector2>();
var polygonList = new List<Geometry.Polygon>();
foreach (var skillshot in SkillshotDetector.DetectedSkillshots)
{
if (skillshot.Evade)
{
polygonList.Add(skillshot.Polygon);
}
}
//Create the danger polygon:
var dangerPolygons = Geometry.ClipPolygons(polygonList).ToPolygons();
var myPosition = ObjectManager.Player.Position.To2D();
//Scan the sides of each polygon to find the safe point.
foreach (var poly in dangerPolygons)
{
for (var i = 0; i <= poly.Points.Count - 1; i++)
{
var sideStart = poly.Points[i];
var sideEnd = poly.Points[(i == poly.Points.Count - 1) ? 0 : i + 1];
var originalCandidate = myPosition.ProjectOn(sideStart, sideEnd).SegmentPoint;
var distanceToEvadePoint = Vector2.DistanceSquared(originalCandidate, myPosition);
if (distanceToEvadePoint < 600 * 600)
{
var sideDistance = Vector2.DistanceSquared(sideEnd, sideStart);
var direction = (sideEnd - sideStart).Normalized();
var s = (distanceToEvadePoint < 200 * 200 && sideDistance > 90 * 90)
? Configs.DiagonalEvadePointsCount
: 0;
for (var j = -s; j <= s; j++)
{
var candidate = originalCandidate + j * Configs.DiagonalEvadePointsStep * direction;
var pathToPoint = ObjectManager.Player.GetPath(candidate.To3D()).ToList();
if (IsSafePath(pathToPoint.To2D(), Configs.EvadingFirstTimeOffset, speed, delay).IsSafe)
{
goodCandidates.Add(candidate);
}
if (
IsSafePath(pathToPoint.To2D(), Configs.EvadingSecondTimeOffset, speed, delay).IsSafe &&
j == 0)
{
badCandidates.Add(candidate);
}
}
}
}
}
return (goodCandidates.Count > 0) ? goodCandidates : (onlyGood ? new List<Vector2>() : badCandidates);
}