private static HitChance GetHitChance(this PredictionInput input) { var hero = input.Unit as Obj_AI_Hero; if (hero == null || !hero.IsValid || input.Radius <= 1f) { return(HitChance.VeryHigh); } var isTrack = UnitTracker.CanTrack(hero); if (hero.IsCastingInterruptableSpell(true) || hero.IsRecalling() || (isTrack && UnitTracker.GetLastStop(hero) < 0.1 && hero.IsRooted)) { return(HitChance.VeryHigh); } /*if (hero.Path.Length > 0 != hero.IsMoving) * { * return HitChance.Medium; * }*/ var wayPoint = input.Unit.GetWaypoints().Last(); var distUnitToWay = hero.Distance(wayPoint); var distUnitToFrom = hero.Distance(input.From); var distFromToWay = input.From.Distance(wayPoint); var delay = input.Delay + (Math.Abs(input.Speed - float.MaxValue) < float.Epsilon ? 0 : distUnitToFrom / input.Speed); var moveArea = hero.MoveSpeed * delay; var fixRange = moveArea * 0.4f; var minPath = 900 + moveArea; var moveAngle = 31d; if (input.Radius > 70) { moveAngle++; } else if (input.Radius <= 60) { moveAngle--; } if (input.Delay < 0.3) { moveAngle++; } if (GamePath.PathTracker.GetCurrentPath(input.Unit).Time < 0.1d) { fixRange = moveArea * 0.3f; minPath = 700 + moveArea; moveAngle += 1.5; } if (input.Type == SkillshotType.SkillshotCircle) { fixRange -= input.Radius / 2; } if (distFromToWay <= distUnitToFrom) { /*if (distUnitToFrom > input.Range - fixRange) * { * return HitChance.Medium; * }*/ } else if (distUnitToWay > 350) { moveAngle += 1.5; } if (isTrack) { /*if (UnitTracker.IsSpamClick(hero)) * { * return distUnitToFrom < input.Range - fixRange ? HitChance.VeryHigh : HitChance.Medium; * }*/ if (UnitTracker.IsSpamPos(hero)) { return(HitChance.VeryHigh); } } if (!hero.IsMoving) { if (hero.IsWindingUp) { return(isTrack && (UnitTracker.GetLastAttack(hero) < 0.1 || UnitTracker.GetLastStop(hero) < 0.1) && delay < 0.6 ? HitChance.VeryHigh : HitChance.High); } return(isTrack && UnitTracker.GetLastStop(hero) < 0.5 ? HitChance.High : HitChance.VeryHigh); } if (distUnitToFrom < 250 || hero.MoveSpeed < 250 || distFromToWay < 250) { return(HitChance.VeryHigh); } if (distUnitToWay > minPath) { return(HitChance.VeryHigh); } if (hero.HealthPercent < 20 || Program.Player.HealthPercent < 20) { return(HitChance.VeryHigh); } if (input.From.ToVector2().GetAngle(hero.ServerPosition.ToVector2(), wayPoint) < moveAngle && distUnitToWay > 260) { return(HitChance.VeryHigh); } if (input.Type == SkillshotType.SkillshotCircle && GamePath.PathTracker.GetCurrentPath(input.Unit).Time < 0.1d && distUnitToWay > fixRange) { return(HitChance.VeryHigh); } return(HitChance.High); }