Esempio n. 1
0
        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);
        }