public static PredictionOutput GetPrediction(PredictionInput input) { PredictionOutput prediction = Prediction.GetPrediction(input, false, true); List <AoePrediction.PossibleTarget> list = new List <AoePrediction.PossibleTarget> { new AoePrediction.PossibleTarget { Position = prediction.UnitPosition.ToVector2(), Unit = input.Unit } }; if (prediction.Hitchance >= HitChance.Medium) { list.AddRange(AoePrediction.GetPossibleTargets(input)); } while (list.Count > 1) { var mec = MEC.GetMec((from h in list select h.Position).ToList <Vector2>()); if (mec.Radius <= input.RealRadius - 10f && Vector2.DistanceSquared(mec.Center, input.RangeCheckFrom.ToVector2()) < input.Range * input.Range) { PredictionOutput predictionOutput = new PredictionOutput(); predictionOutput.AoeTargetsHit = (from hero in list select hero.Unit).ToList <AIBaseClient>(); predictionOutput.CastPosition = mec.Center.ToVector3(); predictionOutput.UnitPosition = prediction.UnitPosition; predictionOutput.Hitchance = prediction.Hitchance; predictionOutput.Input = input; predictionOutput._aoeTargetsHitCount = list.Count; return(predictionOutput); } float num = -1f; int index = 1; for (int i = 1; i < list.Count; i++) { float num2 = Vector2.DistanceSquared(list[i].Position, list[0].Position); if (num2 > num || num.CompareTo(-1f) == 0) { index = i; num = num2; } } list.RemoveAt(index); } return(prediction); }
public static PredictionOutput GetPrediction(PredictionInput input) { PredictionOutput prediction = Prediction.GetPrediction(input, false, true); List <AoePrediction.PossibleTarget> list = new List <AoePrediction.PossibleTarget> { new AoePrediction.PossibleTarget { Position = prediction.UnitPosition.ToVector2(), Unit = input.Unit } }; if (prediction.Hitchance >= HitChance.Medium) { list.AddRange(AoePrediction.GetPossibleTargets(input)); } if (list.Count > 1) { List <Vector2> list2 = new List <Vector2>(); foreach (AoePrediction.PossibleTarget possibleTarget in list) { Vector2[] candidates = AoePrediction.Line.GetCandidates(input.From.ToVector2(), possibleTarget.Position, input.Radius, input.Range); list2.AddRange(candidates); } var num = -1; var vector = default(Vector2); List <Vector2> list3 = new List <Vector2>(); List <Vector2> list4 = (from t in list select t.Position).ToList <Vector2>(); foreach (Vector2 vector2 in list2) { if (AoePrediction.Line.GetHits(input.From.ToVector2(), vector2, (double)(input.Radius + input.Unit.BoundingRadius / 3f - 10f), new List <Vector2> { list[0].Position }).Count <Vector2>() == 1) { List <Vector2> list5 = AoePrediction.Line.GetHits(input.From.ToVector2(), vector2, (double)input.Radius, list4).ToList <Vector2>(); int count = list5.Count; if (count >= num) { num = count; vector = vector2; list3 = list5.ToList <Vector2>(); } } } if (num > 1) { float num2 = -1f; Vector2 left = default(Vector2); Vector2 right = default(Vector2); for (int i = 0; i < list3.Count; i++) { for (int j = 0; j < list3.Count; j++) { Vector2 segmentStart = input.From.ToVector2(); Vector2 segmentEnd = vector; var projectionInfo = list4[i].ProjectOn(segmentStart, segmentEnd); var projectionInfo2 = list4[j].ProjectOn(segmentStart, segmentEnd); float num3 = Vector2.DistanceSquared(list3[i], projectionInfo.LinePoint) + Vector2.DistanceSquared(list3[j], projectionInfo2.LinePoint); if (num3 >= num2 && (projectionInfo.LinePoint - list4[i]).AngleBetween(projectionInfo2.LinePoint - list4[j]) > 90f) { num2 = num3; left = list4[i]; right = list4[j]; } } } return(new PredictionOutput { Hitchance = prediction.Hitchance, _aoeTargetsHitCount = num, UnitPosition = prediction.UnitPosition, CastPosition = ((left + right) * 0.5f).ToVector3(), Input = input }); } } return(prediction); }
public static PredictionOutput GetPrediction(PredictionInput input) { PredictionOutput prediction = Prediction.GetPrediction(input, false, true); List <AoePrediction.PossibleTarget> list = new List <AoePrediction.PossibleTarget> { new AoePrediction.PossibleTarget { Position = prediction.UnitPosition.ToVector2(), Unit = input.Unit } }; if (prediction.Hitchance >= HitChance.Medium) { list.AddRange(AoePrediction.GetPossibleTargets(input)); } if (list.Count > 1) { List <Vector2> list2 = new List <Vector2>(); foreach (AoePrediction.PossibleTarget possibleTarget in list) { possibleTarget.Position -= input.From.ToVector2(); } for (int i = 0; i < list.Count; i++) { for (int j = 0; j < list.Count; j++) { if (i != j) { Vector2 item = (list[i].Position + list[j].Position) * 0.5f; if (!list2.Contains(item)) { list2.Add(item); } } } } int num = -1; Vector2 vector = default(Vector2); List <Vector2> points = (from t in list select t.Position).ToList <Vector2>(); foreach (Vector2 vector2 in list2) { int hits = AoePrediction.Cone.GetHits(vector2, (double)input.Range, input.Radius, points); if (hits > num) { vector = vector2; num = hits; } } vector += input.From.ToVector2(); if (num > 1 && input.From.ToVector2().DistanceSquared(vector) > 2500f) { return(new PredictionOutput { Hitchance = prediction.Hitchance, _aoeTargetsHitCount = num, UnitPosition = prediction.UnitPosition, CastPosition = vector.ToVector3(), Input = input }); } } return(prediction); }