Example #1
0
        /// <summary>
        /// Gets if the position is safe or not
        /// </summary>
        /// <param name="vec">Vector3 position</param>
        /// <returns><c>True</c> if position is safe</returns>
        public static bool IsPositionSafe(this Vector3 vec)
        {
            var player          = Player.Instance;
            var enemy           = EntityManager.Heroes.Enemies.Where(index => index.IsValidTarget(1500));
            var allies          = player.ServerPosition.CountAlliesInRange(1500);
            var enemies         = player.ServerPosition.CountEnemiesInRange(1500);
            var meeles          = CountMeelesInRange(1500);
            var ignoreallchecks = Config.TumbleMenu.IgnoreAllChecks;
            var dangerouspells  = Config.TumbleMenu.DangerousSpells;
            var dangerlevel     = Program.DangerLevel;
            var vector          = vec.ExtendPlayerVector();

            if (ignoreallchecks || enemies == 0)
            {
                return(true);
            }

            if (vector.IsVectorUnderEnemyTower())
            {
                return(false);
            }

            if (dangerouspells)
            {
                if (dangerlevel == 0)
                {
                    var playerhp = Player.Instance.HealthPercent;

                    if (enemies == 1 && meeles == 0)
                    {
                        return(true);
                    }

                    if (enemies == 1 && meeles == 1)
                    {
                        var closest       = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault();
                        var positionAfter = Prediction.PredictUnitPosition(closest, 250);

                        if (closest != null && (vector.Distance(positionAfter, true) > 250 * 250 && closest.HealthPercent > playerhp))
                        {
                            return(true);
                        }
                        if (closest != null && playerhp > closest.HealthPercent)
                        {
                            return(true);
                        }
                    }
                    else if (enemies > allies)
                    {
                        return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200))
                                let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250)
                                                    select
                                                    new Geometry.Polygon.Circle(positionAfter,
                                                                                enemyTarget.IsMelee
                                            ? enemyTarget.GetAutoAttackRange() + 350
                                            : enemyTarget.GetAutoAttackRange() + 150)).Any(
                                   polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                    }

                    else if (enemies <= allies)
                    {
                        return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200))
                                let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250)
                                                    select
                                                    new Geometry.Polygon.Circle(positionAfter,
                                                                                enemyTarget.IsMelee
                                            ? enemyTarget.GetAutoAttackRange() + 150
                                            : enemyTarget.GetAutoAttackRange())).Any(
                                   polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                    }
                }
                else if (dangerlevel > 0 && dangerlevel < 150)
                {
                    var playerhp = Player.Instance.HealthPercent;

                    if (enemies == 1 && meeles == 0)
                    {
                        return(true);
                    }

                    if (enemies == 1 && meeles == 1)
                    {
                        var closest       = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault();
                        var positionAfter = Prediction.PredictUnitPosition(closest, 250);

                        if (closest != null && (vector.Distance(positionAfter, true) > 300 * 300 && closest.HealthPercent > playerhp))
                        {
                            return(true);
                        }
                        if (closest != null && playerhp > closest.HealthPercent)
                        {
                            return(true);
                        }
                    }
                    else if (enemies > allies)
                    {
                        return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000))
                                let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500)
                                                    select
                                                    new Geometry.Polygon.Circle(positionAfter,
                                                                                enemyTarget.IsMelee
                                            ? enemyTarget.GetAutoAttackRange() + 600
                                            : enemyTarget.GetAutoAttackRange() + 150)).Any(
                                   polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                    }

                    else if (enemies <= allies)
                    {
                        return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000))
                                let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500)
                                                    select
                                                    new Geometry.Polygon.Circle(positionAfter,
                                                                                enemyTarget.IsMelee
                                            ? enemyTarget.GetAutoAttackRange() + 450
                                            : enemyTarget.GetAutoAttackRange() + 150)).Any(
                                   polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                    }
                }
                else if (dangerlevel > 150 && dangerlevel < 200)
                {
                    if (vector.IsInsideEnemyRange(800, true) == 0)
                    {
                        return(true);
                    }

                    if (GetTumbleEndPos(vector).Distance(Player.Instance) < 280)
                    {
                        return(false);
                    }

                    var playerhp = Player.Instance.HealthPercent;

                    if (enemies == 1 && meeles == 0)
                    {
                        return(true);
                    }

                    if (enemies == 1 && meeles == 1)
                    {
                        var closest       = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault();
                        var positionAfter = Prediction.PredictUnitPosition(closest, 250);

                        if (closest != null && (vector.Distance(positionAfter, true) > 400 * 400 && closest.HealthPercent > playerhp))
                        {
                            return(true);
                        }
                        if (closest != null && playerhp > closest.HealthPercent)
                        {
                            return(true);
                        }
                    }
                    else if (enemies > allies)
                    {
                        return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000))
                                let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500)
                                                    select
                                                    new Geometry.Polygon.Circle(positionAfter,
                                                                                enemyTarget.IsMelee
                                            ? enemyTarget.GetAutoAttackRange() + 600
                                            : enemyTarget.GetAutoAttackRange() + 300)).Any(
                                   polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                    }

                    else if (enemies <= allies)
                    {
                        return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000))
                                let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500)
                                                    select
                                                    new Geometry.Polygon.Circle(positionAfter,
                                                                                enemyTarget.IsMelee
                                            ? enemyTarget.GetAutoAttackRange() + 450
                                            : enemyTarget.GetAutoAttackRange() + 300)).Any(
                                   polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                    }
                }
            }
            else
            {
                var playerhp = Player.Instance.HealthPercent;

                if (enemies == 1 && meeles == 0)
                {
                    return(true);
                }

                if (enemies == 1 && meeles == 1)
                {
                    var closest       = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault();
                    var positionAfter = Prediction.PredictUnitPosition(closest, 250);

                    if (closest != null && (vector.Distance(positionAfter, true) > 250 * 250 && closest.HealthPercent > playerhp))
                    {
                        return(true);
                    }
                    if (closest != null && playerhp > closest.HealthPercent)
                    {
                        return(true);
                    }
                }
                else if (enemies > allies)
                {
                    return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200))
                            let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250)
                                                select
                                                new Geometry.Polygon.Circle(positionAfter,
                                                                            enemyTarget.IsMelee
                                    ? enemyTarget.GetAutoAttackRange() + 350
                                    : enemyTarget.GetAutoAttackRange() + 150)).Any(
                               polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                }

                else if (enemies <= allies)
                {
                    return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200))
                            let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250)
                                                select
                                                new Geometry.Polygon.Circle(positionAfter,
                                                                            enemyTarget.IsMelee
                                        ? enemyTarget.GetAutoAttackRange() + 150
                                        : enemyTarget.GetAutoAttackRange())).Any(
                               polygonCircle => polygonCircle.IsOutside(vector.To2D())));
                }
            }
            return(false);
        }
Example #2
0
        /// <summary>
        /// Returns true if all 3 condemn vectors have wall collision flags
        /// </summary>
        /// <param name="unit">Target</param>
        /// <param name="range">Push distance</param>
        /// <returns>Returns true if vectors have wall collision flags</returns>
        public static bool CanICastE(AIHeroClient unit, float range)
        {
            if (unit == null || !unit.IsECastableOnEnemy() || unit.IsDashing())
            {
                return(false);
            }

            var accuracy = Config.CondemnMenu.EMethod;
            var position = Prediction.PredictUnitPosition(unit, 200);

            if (!unit.CanMove)
            {
                for (var i = 25; i < range + 50; i += 50)
                {
                    var vec = unit.ServerPosition.Extend(Player.Instance.ServerPosition, -Math.Min(i, range));
                    if (vec.IsWall())
                    {
                        return(true);
                    }
                }
            }
            else
            {
                switch (accuracy)
                {
                case 0:
                {
                    for (var i = Config.CondemnMenu.PushDistance; i >= 100; i -= 100)
                    {
                        var vec   = position.Extend(Player.Instance.ServerPosition, -i);
                        var left  = new Vector2[5];
                        var right = new Vector2[5];
                        var var   = 18 * i / 100;

                        for (var x = 0; x < 5; x++)
                        {
                            left[x] =
                                position.Extend(
                                    vec + (position - vec).Normalized().Rotated((float)ToRadian(Math.Max(0, var))) *
                                    Math.Abs(i < 200 ? 50 : 45 * x), i);
                            right[x] =
                                position.Extend(
                                    vec +
                                    (position - vec).Normalized().Rotated((float)ToRadian(-Math.Max(0, var))) *
                                    Math.Abs(i < 200 ? 50 : 45 * x), i);
                        }
                        if (left[0].IsWall() && right[0].IsWall() && left[1].IsWall() && right[1].IsWall() &&
                            left[2].IsWall() && right[2].IsWall() && left[3].IsWall() && right[3].IsWall() &&
                            left[4].IsWall() && right[4].IsWall() && vec.IsWall())
                        {
                            return(true);
                        }
                    }
                    break;
                }

                case 1:
                {
                    for (var i = 25; i < range + 50; i += 50)
                    {
                        var vec = position.Extend(Player.Instance.ServerPosition, -Math.Min(i, range));
                        if (vec.IsWall())
                        {
                            return(true);
                        }
                    }
                    break;
                }

                default:
                {
                    return(false);
                }
                }
            }
            return(false);
        }