예제 #1
0
        /// <summary>
        ///     Fired on an incoming gapcloser.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="args">The <see cref="Gapcloser.GapcloserArgs" /> instance containing the event data.</param>
        public void OnGapcloser(AIHeroClient sender, Gapcloser.GapcloserArgs args)
        {
            if (UtilityClass.Player.IsDead)
            {
                return;
            }

            if (sender == null || !sender.IsEnemy() || !sender.IsMelee)
            {
                return;
            }

            /// <summary>
            ///     The Anti-Gapcloser E.
            /// </summary>
            if (SpellClass.E.Ready &&
                !Invulnerable.Check(sender, DamageType.Magical, false))
            {
                var enabledOption = MenuClass.Gapcloser["enabled"];
                if (enabledOption == null || !enabledOption.Enabled)
                {
                    return;
                }

                var spellOption = MenuClass.SubGapcloser[$"{sender.CharName.ToLower()}.{args.SpellName.ToLower()}"];
                if (spellOption == null || !spellOption.Enabled)
                {
                    return;
                }

                switch (args.Type)
                {
                case Gapcloser.Type.Targeted:
                    if (sender.IsMelee &&
                        args.Target.IsMe())
                    {
                        SpellClass.E.Cast();
                    }
                    break;

                default:
                    if (args.EndPosition.DistanceToPlayer() <= UtilityClass.Player.GetAutoAttackRange())
                    {
                        SpellClass.E.Cast();
                    }
                    break;
                }
            }
        }
예제 #2
0
        /// <summary>
        ///     Fired on an incoming gapcloser.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="args">The <see cref="Gapcloser.GapcloserArgs" /> instance containing the event data.</param>
        public void OnGapcloser(AIHeroClient sender, Gapcloser.GapcloserArgs args)
        {
            if (UtilityClass.Player.IsDead)
            {
                return;
            }

            if (sender == null || !sender.IsEnemy() || !sender.IsMelee)
            {
                return;
            }

            /// <summary>
            ///     The Anti-Gapcloser Q.
            /// </summary>
            if (SpellClass.Q.Ready &&
                MenuClass.Gapcloser["enabled"].Enabled &&
                MenuClass.SubGapcloser[$"{sender.CharName.ToLower()}.{args.SpellName.ToLower()}"].Enabled)
            {
                switch (args.Type)
                {
                case Gapcloser.Type.Targeted:
                    if (sender.IsMelee &&
                        args.Target.IsMe())
                    {
                        Vector3 targetPos =
                            UtilityClass.Player.Position.Extend(args.StartPosition, -SpellClass.Q.Range);
                        if (targetPos.IsUnderEnemyTurret())
                        {
                            return;
                        }

                        SpellClass.Q.Cast(targetPos);
                    }
                    break;

                default:
                    Vector3 targetPos2 = UtilityClass.Player.Position.Extend(args.EndPosition, -SpellClass.Q.Range);
                    if (targetPos2.IsUnderEnemyTurret())
                    {
                        return;
                    }

                    if (args.EndPosition.DistanceToPlayer() <= UtilityClass.Player.GetAutoAttackRange())
                    {
                        SpellClass.Q.Cast(targetPos2);
                    }
                    break;
                }
            }

            /// <summary>
            ///     The Anti-Gapcloser E.
            /// </summary>
            if (SpellClass.E.Ready &&
                MenuClass.Gapcloser2["enabled"].Enabled &&
                MenuClass.SubGapcloser2[$"{sender.CharName.ToLower()}.{args.SpellName.ToLower()}"].Enabled &&
                !Invulnerable.Check(sender, DamageType.Magical, false))
            {
                switch (args.Type)
                {
                case Gapcloser.Type.Targeted:
                    if (args.Target.IsMe())
                    {
                        SpellClass.E.CastOnUnit(sender);
                    }
                    break;

                default:
                    if (args.EndPosition.DistanceToPlayer() <= UtilityClass.Player.GetAutoAttackRange())
                    {
                        SpellClass.E.CastOnUnit(sender);
                    }
                    break;
                }
            }
        }
예제 #3
0
        /// <summary>
        ///     Fired on an incoming gapcloser.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="args">The <see cref="Utilities.Gapcloser.GapcloserArgs" /> instance containing the event data.</param>
        public void OnGapcloser(AIHeroClient sender, Gapcloser.GapcloserArgs args)
        {
            if (UtilityClass.Player.IsDead)
            {
                return;
            }

            if (sender == null)
            {
                return;
            }

            /// <summary>
            ///     The On-Dash E Logics.
            /// </summary>
            if (SpellClass.E.Ready)
            {
                /// <summary>
                ///     The Anti-Gapcloser E.
                /// </summary>
                if (sender.IsEnemy() && sender.IsMelee)
                {
                    var enabledOption = MenuClass.Gapcloser["enabled"];
                    if (enabledOption == null || !enabledOption.Enabled)
                    {
                        return;
                    }

                    var spellOption = MenuClass.SubGapcloser[$"{sender.CharName.ToLower()}.{args.SpellName.ToLower()}"];
                    if (spellOption == null || !spellOption.Enabled)
                    {
                        return;
                    }

                    switch (args.Type)
                    {
                    case Gapcloser.Type.Targeted:
                        if (args.Target.IsMe())
                        {
                            SpellClass.E.CastOnUnit(UtilityClass.Player);
                        }
                        break;

                    default:
                        if (args.EndPosition.Distance(UtilityClass.Player.Position) <= UtilityClass.Player.GetAutoAttackRange())
                        {
                            SpellClass.E.CastOnUnit(UtilityClass.Player);
                        }
                        else
                        {
                            var bestAlly = ObjectCache.AllyHeroes
                                           .Where(a =>
                                                  !a.IsMe() &&
                                                  a.IsValidTarget(SpellClass.E.Range, true) &&
                                                  args.EndPosition.Distance(a) <= a.GetAutoAttackRange() / 2)
                                           .MinBy(o => o.MaxHP);

                            if (bestAlly != null)
                            {
                                SpellClass.E.CastOnUnit(bestAlly);
                            }
                        }
                        break;
                    }
                }
                else if (sender.IsAlly())
                {
                    if (ObjectCache.EnemyHeroes.Count() < 2)
                    {
                        return;
                    }

                    /// <summary>
                    ///     The E Engager Logic.
                    /// </summary>
                    if (sender.IsValidTarget(SpellClass.E.Range, true) &&
                        MenuClass.R["aoe"].Enabled &&
                        MenuClass.E["engager"].Enabled)
                    {
                        if (ObjectCache.EnemyHeroes.Count(t =>
                                                          !Invulnerable.Check(t, DamageType.Magical, false) &&
                                                          t.IsValidTarget(SpellClass.R.Width - SpellClass.R.Delay * t.BoundingRadius, args.EndPosition)) >= MenuClass.R["aoe"].Value &&
                            MenuClass.E["engagerswhitelist"][sender.CharName.ToLower()].Enabled)
                        {
                            SpellClass.E.CastOnUnit(sender);
                        }
                    }
                }
            }
        }