Exemple #1
0
        internal override void Execute()
        {
            if (Settings.UseE && !Config.Auto.AutoE.KillEnemyHeros && E.IsReady() && GameObjects.EnemyHeroes.Any(x => x.IsKillableWithE(true)))
            {
                E.Cast();
            }

            if (Settings.AttackMinion && Variables.Orbwalker.CanAttack && !GameObjects.EnemyHeroes.Any(x => x.InAutoAttackRange()))
            {
                var units = new List <Obj_AI_Minion>();
                units.AddRange(GameObjects.EnemyMinions);
                units.AddRange(GameObjects.Jungle);
                var bestUnit = units.Where(x => x.IsValidTarget() && x.InAutoAttackRange()).OrderByDescending(x => x.Distance(GameObjects.Player)).FirstOrDefault();
                if (bestUnit != null)
                {
                    Variables.Orbwalker.Attack(bestUnit);
                }
            }

            if (!Variables.Orbwalker.CanMove)
            {
                return;
            }

            if (Q.IsReady() && Settings.KeepManaForE ? GameObjects.Player.Mana - Q.Instance.SData.Mana >= 30 : true)
            {
                var caststate = CastStates.NotCasted;

                if (Settings.UseQ)
                {
                    caststate = Q.CastOnBestTarget();
                }

                if (Settings.UseQPierce && caststate == CastStates.NotCasted)
                {
                    var target = Variables.TargetSelector.GetTarget(Q);
                    if (target != null)
                    {
                        var prediction = Movement.GetPrediction(new PredictionInput
                        {
                            Unit = target, Delay = Q.Delay, Radius = Q.Width, Speed = Q.Speed, Range = Q.Range
                        });
                        if (prediction.Hitchance >= HitChance.High)
                        {
                            var collision = Collision.GetCollision(new List <Vector3>
                            {
                                prediction.UnitPosition
                            }, SpellManager.QCollisionInput);
                            collision.Remove(GameObjects.Player);
                            collision.Remove(target);
                            if (collision.All(x => x.IsKillableWithQ()))
                            {
                                Q.Cast(prediction.CastPosition);
                            }
                        }
                    }
                }
            }
        }
Exemple #2
0
        internal override void Execute()
        {
            if (!Variables.Orbwalker.CanMove())
            {
                return;
            }

            if (Q.IsReady() && GameObjects.Player.ManaPercent > Settings.Mana)
            {
                var caststate = CastStates.NotCasted;

                if (Settings.UseQ)
                {
                    caststate = Q.CastOnBestTarget();
                }

                if (Settings.UseQPierce && caststate == CastStates.NotCasted)
                {
                    var target = Variables.TargetSelector.GetTarget(Q);
                    if (target != null)
                    {
                        var prediction = Movement.GetPrediction(new PredictionInput
                        {
                            Unit   = target,
                            Delay  = Q.Delay,
                            Radius = Q.Width,
                            Speed  = Q.Speed,
                            Range  = Q.Range
                        });
                        if (prediction.Hitchance >= HitChance.High)
                        {
                            var collision = Collision.GetCollision(new List <Vector3>
                            {
                                prediction.UnitPosition
                            }, SpellManager.QCollisionInput);
                            collision.Remove(GameObjects.Player);
                            collision.Remove(target);
                            if (collision.All(x => x.IsKillableWithQ()))
                            {
                                Q.Cast(prediction.CastPosition);
                            }
                        }
                    }
                }
            }
        }
Exemple #3
0
        internal static List <Obj_AI_Base> GetCollision(
            this PredictionOutput pred,
            CollisionableObjects collisionable = CollisionableObjects.Minions)
        {
            var col = Collision.GetCollision(
                new List <Vector3> {
                pred.UnitPosition, pred.Input.Unit.Position
            },
                new PredictionInput
            {
                Delay = pred.Input.Delay, Radius = pred.Input.Radius, Speed = pred.Input.Speed,
                Range = pred.Input.Range, Type = pred.Input.Type, CollisionObjects = collisionable,
                From  = pred.Input.From
            });

            col.RemoveAll(i => i.Compare(pred.Input.Unit));
            return(col);
        }
Exemple #4
0
        public static List <Obj_AI_Base> GetCollision(this Spell spell, Obj_AI_Base target, List <Vector3> to, CollisionableObjects collisionable = CollisionableObjects.Minions)
        {
            var col = Collision.GetCollision(
                to,
                new PredictionInput
            {
                Delay            = spell.Delay,
                Radius           = spell.Width,
                Speed            = spell.Speed,
                From             = spell.From,
                Range            = spell.Range,
                Type             = spell.Type,
                CollisionObjects = collisionable
            });

            col.RemoveAll(i => i.Compare(target));

            return(col);
        }
Exemple #5
0
        /// <summary>
        ///     Returns Calculated Prediction based off given data values.
        /// </summary>
        /// <param name="input">
        ///     <see cref="PredictionInput" /> input
        /// </param>
        /// <param name="ft">Add Delay</param>
        /// <param name="checkCollision">Check Collision</param>
        /// <returns>
        ///     <see cref="PredictionOutput" /> output
        /// </returns>
        internal static PredictionOutput GetPrediction(PredictionInput input, bool ft, bool checkCollision)
        {
            if (!input.Unit.LSIsValidTarget(float.MaxValue, false))
            {
                return(new PredictionOutput());
            }

            if (ft)
            {
                // Increase the delay due to the latency and server tick:
                input.Delay += Game.Ping / 2000f + 0.06f;

                if (input.AoE)
                {
                    return(Cluster.GetAoEPrediction(input));
                }
            }

            // Target too far away.
            if (Math.Abs(input.Range - float.MaxValue) > float.Epsilon &&
                input.Unit.LSDistanceSquared(input.RangeCheckFrom) > Math.Pow(input.Range * 1.5, 2))
            {
                return(new PredictionOutput {
                    Input = input
                });
            }

            PredictionOutput result = null;

            // Unit is dashing.
            if (input.Unit.IsDashing())
            {
                result = GetDashingPrediction(input);
            }
            else
            {
                // Unit is immobile.
                var remainingImmobileT = UnitIsImmobileUntil(input.Unit);

                if (remainingImmobileT >= 0d)
                {
                    result = GetImmobilePrediction(input, remainingImmobileT);
                }
            }

            // Normal prediction
            if (result == null)
            {
                result = GetStandardPrediction(input);
            }

            // Check if the unit position is in range
            if (Math.Abs(input.Range - float.MaxValue) > float.Epsilon)
            {
                if (result.Hitchance >= HitChance.High &&
                    input.RangeCheckFrom.LSDistanceSquared(input.Unit.Position)
                    > Math.Pow(input.Range + input.RealRadius * 3 / 4, 2))
                {
                    result.Hitchance = HitChance.Medium;
                }

                if (input.RangeCheckFrom.LSDistanceSquared(result.UnitPosition)
                    > Math.Pow(input.Range + (input.Type == SkillshotType.SkillshotCircle ? input.RealRadius : 0), 2))
                {
                    result.Hitchance = HitChance.OutOfRange;
                }

                if (input.RangeCheckFrom.LSDistanceSquared(result.CastPosition) > Math.Pow(input.Range, 2) &&
                    result.Hitchance != HitChance.OutOfRange)
                {
                    result.CastPosition = input.RangeCheckFrom
                                          + input.Range
                                          * (result.UnitPosition - input.RangeCheckFrom).ToVector2()
                                          .LSNormalized()
                                          .ToVector3();
                }
            }

            // Check for collision
            if (checkCollision && input.Collision && Math.Abs(input.Speed - float.MaxValue) > float.Epsilon)
            {
                var positions = new List <Vector3> {
                    result.UnitPosition, input.Unit.Position
                };
                result.CollisionObjects = Collision.GetCollision(positions, input);
                result.CollisionObjects.RemoveAll(x => x.Compare(input.Unit));

                if (result.CollisionObjects.Count > 0)
                {
                    result.Hitchance = HitChance.Collision;
                }
            }

            // Calc hitchance again
            if (result.Hitchance == HitChance.High)
            {
                result.Hitchance = GetHitChance(input);
            }

            return(result);
        }
Exemple #6
0
        /// <summary>
        ///     Returns Calculated Prediction based off given data values.
        /// </summary>
        /// <param name="input">
        ///     <see cref="PredictionInput" /> input
        /// </param>
        /// <param name="ft">Add Delay</param>
        /// <param name="checkCollision">Check Collision</param>
        /// <returns>
        ///     <see cref="PredictionOutput" /> output
        /// </returns>
        internal static PredictionOutput GetPrediction(PredictionInput input, bool ft, bool checkCollision)
        {
            if (!input.Unit.IsValidTarget(float.MaxValue, false))
            {
                return(new PredictionOutput());
            }

            if (ft)
            {
                input.Delay += Game.Ping / 2000f + 0.05f;

                if (input.AoE)
                {
                    return(Cluster.GetAoEPrediction(input));
                }
            }

            // Target too far away.
            if (Math.Abs(input.Range - float.MaxValue) > float.Epsilon &&
                input.Unit.DistanceSquared(input.RangeCheckFrom) > Math.Pow(input.Range * 1.5, 2))
            {
                return(new PredictionOutput {
                    Input = input
                });
            }

            PredictionOutput result = null;

            // Unit is dashing.
            if (input.Unit.IsDashing())
            {
                result = GetDashingPrediction(input);
            }
            else
            {
                // Unit is immobile.
                var remainingImmobileT = UnitIsImmobileUntil(input.Unit);

                if (remainingImmobileT >= 0d)
                {
                    result = GetImmobilePrediction(input, remainingImmobileT);
                }
            }

            // Normal prediction
            if (result == null)
            {
                result = GetStandardPrediction(input);
            }

            if (!((Player.Instance).Distance(input.Unit, true) < input.Range * input.Range))
            {
                result.Hitchance = HitChance.OutOfRange;
            }

            // Check for collision
            if (checkCollision && input.Collision && Math.Abs(input.Speed - float.MaxValue) > float.Epsilon)
            {
                var positions = new List <Vector3> {
                    result.UnitPosition, input.Unit.Position
                };
                result.CollisionObjects = Collision.GetCollision(positions, input);
                result.CollisionObjects.RemoveAll(x => x.Compare(input.Unit));

                if (result.CollisionObjects.Count > 0)
                {
                    result.Hitchance = HitChance.Collision;
                }
            }

            // Calc hitchance again
            if (result.Hitchance == HitChance.High)
            {
                result.Hitchance = GetHitChance(input);
            }

            return(result);
        }