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); }