Exemplo n.º 1
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            target =
                this.TargetSelector.Active.GetTargets()
                .FirstOrDefault(x => !x.IsInvulnerable() && x.Distance2D(this.Owner) <= this.Owner.AttackRange * 2);

            var silenced = UnitExtensions.IsSilenced(this.Owner);

            var sliderValue = this.Config.UseBlinkPrediction.Item.GetValue <Slider>().Value;

            var modifier = Ensage.SDK.Extensions.UnitExtensions.HasModifier(this.Owner,
                                                                            "modifier_item_hurricane_pike_range");

            if ((this.BlinkDagger != null) &&
                (this.BlinkDagger.Item.IsValid) &&
                target != null && Owner.Distance2D(target) <= 1200 + sliderValue && !(Owner.Distance2D(target) <= 400) &&
                this.BlinkDagger.Item.CanBeCasted(target) &&
                this.Config.ItemToggler.Value.IsEnabled(this.BlinkDagger.Item.Name))
            {
                var l        = (this.Owner.Distance2D(target) - sliderValue) / sliderValue;
                var posA     = this.Owner.Position;
                var posB     = target.Position;
                var x        = (posA.X + (l * posB.X)) / (1 + l);
                var y        = (posA.Y + (l * posB.Y)) / (1 + l);
                var position = new Vector3((int)x, (int)y, posA.Z);

                Log.Debug("Using BlinkDagger");
                this.BlinkDagger.UseAbility(position);
                await Await.Delay(this.GetItemDelay(target), token);
            }

            if (!silenced)
            {
                try
                {
                    var targets =
                        EntityManager <Hero> .Entities.Where(
                            x =>
                            x.IsValid && x.Team != this.Owner.Team && !x.IsIllusion &&
                            x.Distance2D(this.Owner) <= 700)
                        .ToList();

                    foreach (var ultiTarget in targets)
                    {
                        if (this.Config.AbilityToggler.Value.IsEnabled(this.Ulti.Ability.Name) &&
                            this.Ulti.Ability.CanBeCasted(ultiTarget))
                        {
                            var ultiDamage = Ulti.GetDamage(ultiTarget);


                            if (ultiTarget.Health > ultiDamage)
                            {
                                continue;
                            }

                            var delay  = this.GetAbilityDelay(ultiTarget, this.Ulti);
                            var radius = this.Ulti.Ability.GetAbilitySpecialData("radius");
                            var input  =
                                new PredictionInput(
                                    this.Owner,
                                    ultiTarget,
                                    delay,
                                    float.MaxValue,
                                    700,
                                    radius,
                                    PredictionSkillshotType.SkillshotCircle,
                                    true)
                            {
                                CollisionTypes = CollisionTypes.None
                            };

                            // Log.Debug($"Owner: {input.Owner.Name}");
                            // Log.Debug($"Delay: {input.Delay}");
                            // Log.Debug($"Range: {input.Range}");
                            // Log.Debug($"Speed: {input.Speed}");
                            // Log.Debug($"Radius: {input.Radius}");
                            // Log.Debug($"Type: {input.PredictionSkillshotType}");
                            var output = this.Prediction.GetPrediction(input);
                            var amount = output.AoeTargetsHit.Count;

                            // Log.Debug($"{output.HitChance}");

                            if (output.HitChance >= HitChance.Medium &&
                                this.Config.MinimumTargetToUlti.Value >= amount)
                            {
                                Log.Debug(
                                    $"Using Ulti!");
                                this.Ulti.UseAbility(output.CastPosition);
                                await Await.Delay(delay + (int)Game.Ping, token);
                            }
                        }
                    }
                }
                catch (TaskCanceledException)
                {
                    // ignore
                }
                catch (Exception e)
                {
                    Log.Debug($"{e}");
                }
            }

            if ((this.BloodThorn != null) &&
                this.BloodThorn.Item.IsValid &&
                target != null &&
                this.BloodThorn.Item.CanBeCasted(target) &&
                this.Config.ItemToggler.Value.IsEnabled(this.BloodThorn.Item.Name))
            {
                Log.Debug("Using Bloodthorn");
                this.BloodThorn.UseAbility(target);
                await Await.Delay(this.GetItemDelay(target), token);
            }

            if ((this.SheepStick != null) &&
                this.SheepStick.Item.IsValid &&
                target != null &&
                this.SheepStick.Item.CanBeCasted(target) &&
                this.Config.ItemToggler.Value.IsEnabled("item_sheepstick"))
            {
                Log.Debug("Using Sheepstick");
                this.SheepStick.UseAbility(target);
                await Await.Delay(this.GetItemDelay(target), token);
            }

            if ((this.Orchid != null) &&
                this.Orchid.Item.IsValid && target != null &&
                this.Orchid.Item.CanBeCasted(target) &&
                this.Config.ItemToggler.Value.IsEnabled("item_orchid"))
            {
                Log.Debug("Using Orchid");
                this.Orchid.UseAbility(target);
                await Await.Delay(this.GetItemDelay(target), token);
            }

            if ((this.RodofAtos != null) &&
                this.RodofAtos.Item.IsValid &&
                target != null &&
                this.RodofAtos.Item.CanBeCasted(target) &&
                this.Config.ItemToggler.Value.IsEnabled("item_rod_of_atos"))
            {
                Log.Debug("Using RodofAtos");
                this.RodofAtos.UseAbility(target);
                await Await.Delay(this.GetItemDelay(target), token);
            }

            if ((this.VeilofDiscord != null) &&
                this.VeilofDiscord.Item.IsValid &&
                target != null &&
                this.VeilofDiscord.Item.CanBeCasted() &&
                this.Config.ItemToggler.Value.IsEnabled("item_veil_of_discord"))
            {
                Log.Debug("Using VeilofDiscord");
                this.VeilofDiscord.UseAbility(target.Position);
                await Await.Delay(this.GetItemDelay(target), token);
            }

            try
            {
                if (this.HurricanePike != null)
                {
                    if (modifier && target != null && target.IsValid && target.IsAlive && this.Owner.CanAttack(target) &&
                        this.Orb.Ability.CanBeCasted(target))
                    {
                        await this.UseOrb(target, token);

                        return;
                    }
                    else if (modifier && target != null && target.IsValid && target.IsAlive && this.Owner.CanAttack(target) &&
                             !this.Orb.Ability.CanBeCasted(target))
                    {
                        this.Owner.Attack(target);
                        await Await.Delay(100, token);
                    }

                    if ((double)(this.Owner.Health / this.Owner.MaximumHealth) * 100 <=
                        (double)Config.HurricanePercentage.Item.GetValue <Slider>().Value&&
                        this.HurricanePike.Item.IsValid &&
                        target != null &&
                        this.HurricanePike.Item.CanBeCasted() &&
                        this.Config.ItemToggler.Value.IsEnabled("item_hurricane_pike"))
                    {
                        Log.Debug("Using HurricanePike");
                        this.HurricanePike.UseAbility(target);
                        await Await.Delay(this.GetItemDelay(target), token);

                        return;
                    }
                }
            }
            catch (TaskCanceledException)
            {
                // ignore
            }
            catch (Exception e)
            {
                Log.Error($"{e}");
            }

            if ((this.ShivasGuard != null) &&
                this.ShivasGuard.Item.IsValid &&
                target != null && this.Owner.Distance2D(target) <= 900 &&
                this.ShivasGuard.Item.CanBeCasted() &&
                this.Config.ItemToggler.Value.IsEnabled("item_shivas_guard"))
            {
                Log.Debug("Using Shivas");
                this.ShivasGuard.UseAbility();
                await Await.Delay(20 + (int)Game.Ping, token);
            }


            if (this.Orb != null && this.Orb.Ability.IsValid &&
                this.Config.AbilityToggler.Value.IsEnabled(this.Orb.Ability.Name) &&
                this.Orb.Ability.CanBeCasted(target))
            {
                await this.UseOrb(target, token);

                return;
            }

            if (this.target != null && target.IsValid &&
                this.Owner.Distance2D(this.target) <= this.Owner.AttackRange(this.target))
            {
                this.Context.Orbwalker.Active.OrbwalkTo(target);
            }
            else
            {
                this.Context.Orbwalker.Active.OrbwalkTo(null);
            }

            await Await.Delay(125, token);
        }