public static Vector3?GetCircularClearLocation(SpellWrapper spell) { List <Obj_AI_Base> minions = ObjectManager.Get <Obj_AI_Base>() .Where(x => x.IsValidTarget(spell.Range) && x.IsValidSpellTarget()).ToList(); List <Vector2> positions = minions.Select(x => x.ServerPosition.To2D()).ToList(); Vector3?bestAimPosition = null; int highestMinionCount = MinimumMinions; if (minions.Count >= MinimumMinions) { foreach (Vector2 minionCoordinate in positions) { int count = minions.Count(m => m.Distance(minionCoordinate) <= spell.Width && spell.CanKill(m)); if (count >= highestMinionCount) { bestAimPosition = minionCoordinate.To3D(); highestMinionCount = count; } } foreach (Vector2 p1 in positions) { foreach (Vector2 p2 in positions) { if (!p1.Equals(p2)) { Vector2 center; float radius; List <Vector2> combination = new List <Vector2>(new Vector2[] { p1, p2 }); Mec.FindMinimalBoundingCircle(combination, out center, out radius); int count = minions.Count(m => m.Distance(center) <= spell.Width && spell.CanKill(m)); if (count >= highestMinionCount) { bestAimPosition = center.To3D(); highestMinionCount = count; } } } } } return(bestAimPosition); }
public static LaneclearResult GetCircularClearLocation(float range, float width, int minHit) { var minions = ObjectManager.Get <Obj_AI_Base>().Where(x => x.IsValidSpellTarget(range)); var allPositions = minions.Select(x => x.ServerPosition.To2D()).ToList(); if (minHit == 1 && allPositions.Any()) { return(new LaneclearResult(1, allPositions.FirstOrDefault().To3D())); } var positionCount = allPositions.Count; var lcount = Math.Min(positionCount, 5); HashSet <LaneclearResult> results = new HashSet <LaneclearResult>(); void CheckResult(Vector3 c) { var hitMinions = allPositions.Where(x => x.Distance(c) <= 0.95f * width); var count = hitMinions.Count(); if (count >= minHit) { var result = new LaneclearResult(count, c); results.Add(result); } } if (allPositions.Count >= minHit) { Vector2 center; float radius; Mec.FindMinimalBoundingCircle(allPositions, out center, out radius); if (center.IsZero) { return(new LaneclearResult(0, Vector3.Zero)); } CheckResult(center.To3D()); for (int i = 0; i < lcount; i++) { for (int j = 0; j < lcount; j++) { var positions = new List <Vector2> { allPositions[i], allPositions[j] }; Mec.FindMinimalBoundingCircle(positions, out center, out radius); CheckResult(center.To3D()); } } return(results.MaxBy(x => x.numberOfMinionsHit)); } return(null); }