public virtual async Task KillStealAsync()
        {
            var damageEtherShock = Ethershock.GetAbilityData("damage");
            var talent           = UnitExtensions.GetAbilityById(this.Owner, AbilityId.special_bonus_unique_shadow_shaman_3);

            if (talent?.Level > 0)
            {
                damageEtherShock += talent.GetAbilitySpecialData("value");
            }

            damageEtherShock *= GetSpellAmp();

            var killstealTarget =
                EntityManager <Hero> .Entities.FirstOrDefault(
                    x =>
                    x.IsAlive && x.Team != this.Owner.Team && !x.IsIllusion &&
                    x.Health < damageEtherShock *(1 - x.MagicDamageResist) &&
                    Ethershock.CanBeCasted() && !UnitExtensions.IsMagicImmune(x) &&
                    Ensage.SDK.Extensions.EntityExtensions.Distance2D(Owner, x.NetworkPosition) <=
                    Ethershock.CastRange);

            if (killstealTarget != null)
            {
                Ethershock.UseAbility(killstealTarget);
                await Await.Delay(GetAbilityDelay(killstealTarget, Ethershock));
            }
        }
Пример #2
0
        public virtual async Task linken()
        {
            var e = TargetSelector.Active.GetTargets()
                    .FirstOrDefault(x => !x.IsInvulnerable() && x.IsAlive);

            if (ExUnit.IsInvisible(me))
            {
                return;
            }

            var dagon = me.GetDagon();

            if ((cyclone != null && cyclone.Item.CanBeCasted() || force != null && force.Item.CanBeCasted() ||
                 sheep != null && sheep.Item.CanBeCasted() || atos != null && atos.Item.CanBeCasted() || W != null && W.CanBeCasted()) &&
                me.Distance2D(e) <= 900)
            {
                if (cyclone != null && cyclone.Item.CanBeCasted() &&
                    cyclone.Item.IsValid &&
                    Config.Link.Value.IsEnabled(cyclone.Item.Name))
                {
                    cyclone.UseAbility(e);
                }
                else if (force != null &&
                         force.Item.IsValid && force.Item.CanBeCasted() &&
                         Config.Link.Value.IsEnabled(force.Item.Name))
                {
                    force.UseAbility(e);
                }
                else if (atos != null && atos.Item.CanBeCasted() &&
                         atos.Item.IsValid &&
                         Config.Link.Value.IsEnabled(atos.Item.Name))
                {
                    atos.UseAbility(e);
                }
                else if (dagon != null && dagon.CanBeCasted() &&
                         dagon.IsValid &&
                         Config.Link.Value.IsEnabled("item_dagon_5"))
                {
                    dagon.UseAbility(e);
                }
                else if (W != null && W.CanBeCasted() &&
                         Config.Link.Value.IsEnabled(W.Name) &&
                         !ExUnit.IsMagicImmune(e))
                {
                    W.UseAbility(e);
                }
                else if (sheep != null && sheep.Item.CanBeCasted() &&
                         sheep.Item.IsValid &&
                         Config.Link.Value.IsEnabled(sheep.Item.Name))
                {
                    sheep.UseAbility(e);
                }
            }
            await Await.Delay(250);
        }
Пример #3
0
        public virtual async Task KillStealAsync()
        {
            float RemnantAutoDamage = this.Remnant.GetAbilityData("static_remnant_damage") + this.Overload.GetDamage(Overload.Level - 1);

            RemnantAutoDamage += (Owner.MinimumDamage + Owner.BonusDamage);
            RemnantAutoDamage *= GetSpellAmp();

            float AutoDamage = this.Overload.GetDamage(Overload.Level - 1);

            AutoDamage += (Owner.MinimumDamage + Owner.BonusDamage);
            AutoDamage *= GetSpellAmp();

            var RemnantAutokillableTar =
                ObjectManager.GetEntitiesFast <Hero>()
                .FirstOrDefault(
                    x =>
                    x.IsAlive && x.Team != this.Owner.Team && !x.IsIllusion &&
                    this.Remnant.CanBeCasted() && this.Remnant.CanHit(x) &&
                    x.Health < (RemnantAutoDamage * (1 - x.MagicDamageResist)) &&
                    !UnitExtensions.IsMagicImmune(x) &&
                    x.Distance2D(this.Owner) <= 235);

            var AutokillableTar =
                ObjectManager.GetEntitiesFast <Hero>()
                .FirstOrDefault(
                    x =>
                    x.IsAlive && x.Team != this.Owner.Team && !x.IsIllusion &&
                    x.Health < AutoDamage * (1 - x.MagicDamageResist) &&
                    !UnitExtensions.IsMagicImmune(x) &&
                    x.Distance2D(this.Owner) <= 480);



            if (UnitExtensions.HasModifier(Owner, "modifier_storm_spirit_overload") && AutokillableTar != null)
            {
                Owner.Attack(AutokillableTar);
                await Await.Delay(500);
            }
            if (!UnitExtensions.IsSilenced(Owner))
            {
                if (RemnantAutokillableTar != null && AutokillableTar == null || AutokillableTar != null && !UnitExtensions.HasModifier(Owner, "modifier_storm_spirit_overload"))
                {
                    Remnant.UseAbility();
                    await Await.Delay((int)Game.Ping + 50);

                    Owner.Attack(RemnantAutokillableTar);
                    await Await.Delay(500);
                }
            }
        }
Пример #4
0
        public virtual bool CanBeCasted(Unit target)
        {
            if (target == null || !target.IsValid || !Menu.IsEnabled(target.StoredName()))
            {
                return(false);
            }

            if (!target.IsAlive || !target.IsVisible || UnitExtensions.IsMagicImmune(target) ||
                EntityExtensions.Distance2D(target, Manager.MyHero.Position) > GetCastRange() || target.IsInvul() ||
                target.IsReflectingAbilities())
            {
                return(false);
            }

            if (!Menu.BreakLinkens && UnitExtensions.IsLinkensProtected(target))
            {
                return(false);
            }

            if (!Menu.HexStack && target.IsReallyHexed())
            {
                return(false);
            }

            if (!Menu.SilenceStack && UnitExtensions.IsSilenced(target) && !target.IsReallyHexed())
            {
                return(false);
            }

            if (!Menu.RootStack && UnitExtensions.IsRooted(target))
            {
                return(false);
            }

            if (!Menu.StunStack && UnitExtensions.IsStunned(target))
            {
                return(false);
            }

            if (!Menu.DisarmStack && UnitExtensions.IsDisarmed(target) && !target.IsReallyHexed())
            {
                return(false);
            }

            return(true);
        }
Пример #5
0
        public virtual async Task KillStealAsync()
        {
            var damageBlast = Blast.GetAbilityData("blast_damage");

            damageBlast *= GetSpellAmp();

            bool comboMana = Blast.GetManaCost(Blast.Level - 1) + Decrepify.GetManaCost(Decrepify.Level - 1) <
                             Owner.Mana;

            var decrepifyKillable =
                EntityManager <Hero> .Entities.FirstOrDefault(
                    x =>
                    x.IsAlive && x.Team != this.Owner.Team && !x.IsIllusion &&
                    x.Health < damageBlast *(1 - x.MagicDamageResist) &&
                    Decrepify.CanBeCasted(x) && Blast.CanBeCasted() &&
                    !UnitExtensions.IsMagicImmune(x) && comboMana);

            var blastKillable =
                EntityManager <Hero> .Entities.FirstOrDefault(
                    x =>
                    x.IsAlive && x.Team != this.Owner.Team && !x.IsIllusion &&
                    x.Health < damageBlast *(1 - x.MagicDamageResist) &&
                    Blast.CanBeCasted() && !UnitExtensions.IsMagicImmune(x) &&
                    Ensage.SDK.Extensions.EntityExtensions.Distance2D(Owner, x.NetworkPosition) <= 400);

            if (decrepifyKillable != null)
            {
                Decrepify.UseAbility(decrepifyKillable);
                await Await.Delay(GetAbilityDelay(decrepifyKillable, Decrepify));

                Blast.UseAbility(decrepifyKillable);
                await Await.Delay(GetAbilityDelay(decrepifyKillable, Decrepify));
            }

            if (blastKillable != null)
            {
                Blast.UseAbility(blastKillable.NetworkPosition);
                await Await.Delay(GetAbilityDelay(blastKillable, Blast));
            }
        }
Пример #6
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            if (!await this.ShouldExecute(token))
            {
                return;
            }

            this.MaxTargetRange = Math.Max(this.MaxTargetRange, 700);

            if ((this.CurrentTarget == null) || !this.CurrentTarget.IsVisible)
            {
                this.Pugna.Context.Orbwalker.Active.OrbwalkTo(null);
                return;
            }

            if (this.CurrentTarget.IsIllusion)
            {
                this.OrbwalkToTarget();
                return;
            }

            try
            {
                var linkens = Ensage.SDK.Extensions.UnitExtensions.IsLinkensProtected(this.CurrentTarget);

                await BreakLinken(token);

                var allTargets = this.Context.TargetSelector.Active.GetTargets().FirstOrDefault();

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

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

                var myHpThreshold = this.Pugna.SelfHPDrain.Item.GetValue <Slider>().Value;

                var postDrainHp = this.Pugna.PostDrainHP.Item.GetValue <Slider>().Value;

                var allyPostDrain = this.Pugna.HealAllyTo.Item.GetValue <Slider>().Value;

                var healThreshold = this.Pugna.DrainHP.Item.GetValue <Slider>().Value;

                var wardTars = this.Pugna.WardTargets.Item.GetValue <Slider>().Value;

                if (!silenced)
                {
                    try
                    {
                        this.Pugna.HealTarget =
                            EntityManager <Hero> .Entities.FirstOrDefault(
                                x =>
                                x.IsAlive && x.Team == this.Owner.Team && x != Owner && !x.IsIllusion &&
                                ((float)x.Health / (float)x.MaximumHealth) * 100 < healThreshold &&
                                !UnitExtensions.IsMagicImmune(x) &&
                                this.Pugna.HealTargetHeroes.Value.IsEnabled(x.Name));

                        var myHealth = (float)Owner.Health / (float)Owner.MaximumHealth * 100;

                        if (this.Pugna.HealTarget != null)
                        {
                            this.Pugna.HealTarget = this.Pugna.HealTarget;
                        }

                        if (this.Pugna.HealTarget != null)
                        {
                            if (this.Pugna.HealTarget != null &&
                                !UnitExtensions.IsChanneling(Owner) && myHealth >= myHpThreshold &&
                                this.Pugna.HealTarget.Distance2D(this.Owner) <= this.Pugna.Drain.CastRange &&
                                this.Pugna.HealTarget.HealthPercent() * 100 < healThreshold)
                            {
                                this.Pugna.Drain.UseAbility(this.Pugna.HealTarget);
                                this.Pugna.IsHealing = true;
                                await Task.Delay(
                                    (int)this.Pugna.Drain.GetCastDelay(this.Owner, this.Pugna.HealTarget, true),
                                    token);
                            }

                            //Stop Healing; There is no hidden modifier/any way to check if we are healing a target.
                            if ((UnitExtensions.IsChanneling(Owner) && myHealth <= postDrainHp) && this.Pugna.IsHealing)
                            {
                                Owner.Stop();
                                this.Pugna.IsHealing = false;
                            }

                            if (this.Pugna.HealTarget != null && this.Pugna.IsHealing &&
                                (this.Pugna.HealTarget.HealthPercent() >= ((float)allyPostDrain / 100)))
                            {
                                Owner.Stop();
                                this.Pugna.IsHealing = false;
                            }

                            if (this.Pugna.HealTarget == null && this.Pugna.IsHealing)
                            {
                                Owner.Stop();
                                this.Pugna.IsHealing = false;
                            }
                        }
                    }
                    catch (Exception)
                    {
                        // ignore
                    }
                }

                if (this.Pugna.IsHealing)
                {
                    return;
                }

                if ((this.Pugna.BlinkDagger != null) &&
                    (this.Pugna.BlinkDagger.Item.IsValid) &&
                    this.CurrentTarget != null && Owner.Distance2D(this.CurrentTarget) <= 1200 + sliderValue &&
                    !(Owner.Distance2D(this.CurrentTarget) <= 400) &&
                    this.Pugna.BlinkDagger.Item.CanBeCasted(this.CurrentTarget) &&
                    !UnitExtensions.IsChanneling(Owner))
                {
                    var l        = (this.Owner.Distance2D(this.CurrentTarget) - sliderValue) / sliderValue;
                    var posA     = this.Owner.Position;
                    var posB     = this.CurrentTarget.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);

                    this.Pugna.BlinkDagger.UseAbility(position);
                    await Task.Delay((int)this.Pugna.BlinkDagger.GetCastDelay(position), token);
                }


                if (!silenced && this.CurrentTarget != null)
                {
                    var targets =
                        EntityManager <Hero> .Entities.Where(
                            x =>
                            x.IsValid && x.Team != this.Owner.Team && !x.IsIllusion &&
                            !UnitExtensions.IsMagicImmune(x) &&
                            x.Distance2D(this.Owner) <= this.Pugna.Ward.GetAbilityData("radius"))
                        .ToList();

                    if (targets.Count >= wardTars && this.Pugna.Ward.CanBeCasted() &&
                        !UnitExtensions.IsChanneling(Owner))
                    {
                        this.Pugna.Ward.UseAbility(Owner.NetworkPosition);
                        await Task.Delay((int)this.Pugna.Ward.GetCastDelay(this.Owner, this.Owner, true), token);
                    }

                    try
                    {
                        // var thresholdTars = this.Config.WardTargets.Item.GetValue<Slider>();
                        var manaDecrepify = this.Pugna.Decrepify.GetManaCost(this.Pugna.Decrepify.Level - 1);
                        var manaBlast     = this.Pugna.Blast.GetManaCost(this.Pugna.Blast.Level - 1);
                        // var manaDrain = Drain.GetManaCost(Drain.Level - 1);

                        if (this.Pugna.Decrepify.CanBeCasted() && this.CurrentTarget != null &&
                            this.Pugna.Decrepify.CanHit(this.CurrentTarget) &&
                            this.Owner.Mana >= manaBlast + manaDecrepify &&
                            !UnitExtensions.IsChanneling(Owner) &&
                            this.CurrentTarget.IsAlive)
                        {
                            this.Pugna.Decrepify.UseAbility(this.CurrentTarget);
                            await Task.Delay(
                                (int)this.Pugna.Decrepify.GetCastDelay(this.Owner, this.CurrentTarget, true), token);
                        }

                        if (this.Pugna.Blast.CanBeCasted() &&
                            (!this.Pugna.Decrepify.CanBeCasted() || manaBlast > Owner.Mana - manaDecrepify) &&
                            !UnitExtensions.IsChanneling(Owner) &&
                            this.CurrentTarget != null && this.CurrentTarget.IsAlive)
                        {
                            var delay        = this.Pugna.Blast.GetAbilityData("delay") + this.Pugna.Blast.GetCastPoint();
                            var blastTargets =
                                EntityManager <Hero> .Entities.OrderBy(x => x == allTargets).Where(
                                    x =>
                                    x.IsValid && x.IsVisible && x.Team != Owner.Team && !x.IsIllusion &&
                                    !UnitExtensions.IsMagicImmune(x)).ToList();

                            var blastCastRange = this.Pugna.Blast.CastRange;

                            if (blastTargets == null)
                            {
                                return;
                            }
                            var input =
                                new PredictionInput(
                                    Owner,
                                    this.CurrentTarget,
                                    delay,
                                    float.MaxValue,
                                    blastCastRange,
                                    400,
                                    PredictionSkillshotType.SkillshotCircle,
                                    true,
                                    blastTargets)
                            {
                                CollisionTypes = CollisionTypes.None
                            };

                            var output = this.Context.Prediction.GetPrediction(input);

                            if (output.HitChance >= HitChance.Medium)
                            {
                                this.Pugna.Blast.UseAbility(output.CastPosition);
                                await Task.Delay(
                                    (int)this.Pugna.Blast.GetCastDelay(this.Owner, this.CurrentTarget, true), token);
                            }
                        }
                    }
                    catch (Exception)
                    {
                        // ignored
                    }
                }

                if (this.Pugna.BloodThorn != null &&
                    this.Pugna.BloodThorn.Item.IsValid &&
                    this.CurrentTarget != null && !UnitExtensions.IsChanneling(Owner) &&
                    this.Pugna.BloodThorn.Item.CanBeCasted(this.CurrentTarget))
                {
                    this.Pugna.BloodThorn.UseAbility(this.CurrentTarget);
                    await Task.Delay(this.Pugna.BloodThorn.GetCastDelay(this.CurrentTarget), token);
                }

                if ((this.Pugna.Sheepstick != null) &&
                    (this.Pugna.Sheepstick.Item.IsValid) &&
                    this.CurrentTarget != null && !UnitExtensions.IsChanneling(Owner) &&
                    this.Pugna.Sheepstick.Item.CanBeCasted(this.CurrentTarget))
                {
                    this.Pugna.Sheepstick.UseAbility(this.CurrentTarget);
                    await Await.Delay(this.Pugna.Sheepstick.GetCastDelay(this.CurrentTarget), token);
                }

                if (this.Pugna.Dagon != null &&
                    this.Pugna.Dagon.Item.IsValid &&
                    this.CurrentTarget != null && !UnitExtensions.IsChanneling(Owner) &&
                    this.Pugna.Dagon.Item.CanBeCasted(this.CurrentTarget))
                {
                    this.Pugna.Dagon.UseAbility(this.CurrentTarget);
                    await Await.Delay(this.Pugna.Dagon.GetCastDelay(this.CurrentTarget), token);
                }

                if (this.Pugna.Orchid != null &&
                    this.Pugna.Orchid.Item.IsValid &&
                    this.CurrentTarget != null && !UnitExtensions.IsChanneling(Owner) &&
                    this.Pugna.Orchid.Item.CanBeCasted(this.CurrentTarget))
                {
                    this.Pugna.Orchid.UseAbility(this.CurrentTarget);
                    await Await.Delay(this.Pugna.Orchid.GetCastDelay(this.CurrentTarget), token);
                }

                if (this.Pugna.RodOfAtos != null &&
                    this.Pugna.RodOfAtos.Item.IsValid &&
                    this.CurrentTarget != null && !UnitExtensions.IsChanneling(Owner) &&
                    this.Pugna.RodOfAtos.Item.CanBeCasted(this.CurrentTarget))
                {
                    this.Pugna.RodOfAtos.UseAbility(this.CurrentTarget);
                    await Await.Delay(this.Pugna.RodOfAtos.GetCastDelay(this.CurrentTarget), token);
                }

                if (this.Pugna.VeilOfDiscord != null &&
                    this.Pugna.VeilOfDiscord.Item.IsValid &&
                    this.CurrentTarget != null && !UnitExtensions.IsChanneling(Owner) &&
                    this.Pugna.VeilOfDiscord.Item.CanBeCasted())
                {
                    this.Pugna.VeilOfDiscord.UseAbility(this.CurrentTarget.Position);
                    await Await.Delay(this.Pugna.VeilOfDiscord.GetCastDelay(this.CurrentTarget), token);
                }

                if (this.Pugna.ShivasGuard != null &&
                    this.Pugna.ShivasGuard.Item.IsValid &&
                    this.CurrentTarget != null && !UnitExtensions.IsChanneling(Owner) &&
                    this.Pugna.ShivasGuard.Item.CanBeCasted() &&
                    Owner.Distance2D(this.CurrentTarget) <= 900)
                {
                    this.Pugna.ShivasGuard.UseAbility();
                    await Await.Delay((int)Game.Ping, token);
                }

                if (!silenced && this.Pugna.Drain.CanBeCasted() &&
                    (!this.Pugna.Blast.CanBeCasted() || this.Owner.Distance2D(this.CurrentTarget) > this.Pugna.Blast.CastRange) &&
                    (!this.Pugna.Decrepify.CanBeCasted() || this.Owner.Distance2D(this.CurrentTarget) > this.Pugna.Decrepify.CastRange) &&
                    !UnitExtensions.IsChanneling(Owner) &&
                    this.CurrentTarget != null && this.CurrentTarget.IsAlive)
                {
                    this.Pugna.Drain.UseAbility(this.CurrentTarget);
                    await Task.Delay((int)this.Pugna.Drain.GetCastDelay(this.Owner, this.CurrentTarget, true) + 50,
                                     token);
                }
                else if (!silenced && this.Pugna.Drain.CanBeCasted() &&
                         (this.Owner.Distance2D(this.CurrentTarget) > this.Pugna.Blast.CastRange ||
                          this.Owner.Distance2D(this.CurrentTarget) > this.Pugna.Decrepify.CastRange) &&
                         !UnitExtensions.IsChanneling(Owner) &&
                         this.CurrentTarget != null && this.CurrentTarget.IsAlive)
                {
                    this.Pugna.Drain.UseAbility(this.CurrentTarget);
                    await Task.Delay((int)this.Pugna.Drain.GetCastDelay(this.Owner, this.CurrentTarget, true) + 50,
                                     token);
                }

                if (this.CurrentTarget != null && !Owner.IsValidOrbwalkingTarget(this.CurrentTarget) &&
                    !UnitExtensions.IsChanneling(this.Owner))
                {
                    Orbwalker.Move(Game.MousePosition);
                    await Await.Delay(50, token);
                }
                else
                {
                    Orbwalker.OrbwalkTo(this.CurrentTarget);
                }

                await Await.Delay(50, token);
            }
            catch (TaskCanceledException)
            {
                // ignore
            }
            catch (Exception e)
            {
                Log.Debug($"{e}");
            }

            this.OrbwalkToTarget();
        }
Пример #7
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            Target = this.TargetSelector.Active.GetTargets().FirstOrDefault(x => !x.IsInvulnerable());

            var allTargets = this.TargetSelector.Active.GetTargets().FirstOrDefault();

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

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

            var myHpThreshold = this.Config.SelfHPDrain.Item.GetValue <Slider>().Value;

            var postDrainHp = this.Config.PostDrainHP.Item.GetValue <Slider>().Value;

            var allyPostDrain = this.Config.HealAllyTo.Item.GetValue <Slider>().Value;

            var healThreshold = this.Config.DrainHP.Item.GetValue <Slider>().Value;

            var wardTars = this.Config.WardTargets.Item.GetValue <Slider>().Value;

            //warnings
            if (myHpThreshold < postDrainHp && this.Config.AbilityToggler.Value.IsEnabled(this.Drain.Name))
            {
                Log.Debug(
                    "Post drain hp is higher than your hp threshold to begin healing, please change this or the script won't work.");
                return;
            }

            if (healThreshold > allyPostDrain && this.Config.AbilityToggler.Value.IsEnabled(this.Drain.Name))
            {
                Log.Debug("Your ally's post heal threshold is lower than their heal threshold, please fix this.");
                return;
            }

            if (!silenced)
            {
                try
                {
                    var tempHealTarget =
                        EntityManager <Hero> .Entities.FirstOrDefault(
                            x =>
                            x.IsAlive && x.Team == this.Owner.Team && x != Owner && !x.IsIllusion &&
                            ((float)x.Health / (float)x.MaximumHealth) * 100 < healThreshold &&
                            !UnitExtensions.IsMagicImmune(x) && Config.HealTargetHeroes.Value.IsEnabled(x.Name));

                    var myHealth = (float)Owner.Health / (float)Owner.MaximumHealth * 100;

                    if (tempHealTarget != null)
                    {
                        HealTarget = tempHealTarget;
                    }

                    if (HealTarget != null)
                    {
                        if (HealTarget != null && this.Config.AbilityToggler.Value.IsEnabled(this.Drain.Name) &&
                            !UnitExtensions.IsChanneling(Owner) && myHealth >= myHpThreshold &&
                            HealTarget.Distance2D(this.Owner) <= Drain.CastRange &&
                            HealTarget.HealthPercent() * 100 < healThreshold)
                        {
                            this.Drain.UseAbility(HealTarget);
                            IsHealing = true;
                            await Await.Delay(GetAbilityDelay(HealTarget, Drain), token);
                        }

                        //Stop Healing; There is no hidden modifier/any way to check if we are healing a target.
                        if ((UnitExtensions.IsChanneling(Owner) && myHealth <= postDrainHp) && IsHealing)
                        {
                            Owner.Stop();
                            IsHealing = false;
                        }

                        if (HealTarget != null && IsHealing &&
                            (HealTarget.HealthPercent() >= ((float)allyPostDrain / 100)))
                        {
                            Owner.Stop();
                            IsHealing = false;
                        }

                        if (HealTarget == null && IsHealing)
                        {
                            Owner.Stop();
                            IsHealing = false;
                        }
                    }
                }
                catch (Exception)
                {
                    // ignore
                }
            }

            if (IsHealing)
            {
                return;
            }

            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) &&
                !UnitExtensions.IsChanneling(Owner))
            {
                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(position) + (int)Game.Ping, token);
            }


            if (!silenced && Target != null)
            {
                var targets =
                    EntityManager <Hero> .Entities.Where(
                        x =>
                        x.IsValid && x.Team != this.Owner.Team && !x.IsIllusion &&
                        !UnitExtensions.IsMagicImmune(x) &&
                        x.Distance2D(this.Owner) <= Ward.GetAbilityData("radius"))
                    .ToList();

                if (targets.Count >= wardTars && this.Ward.CanBeCasted() && !UnitExtensions.IsChanneling(Owner) &&
                    this.Config.AbilityToggler.Value.IsEnabled(this.Ward.Name))
                {
                    Log.Debug($"Using Ward");
                    Ward.UseAbility(Owner.NetworkPosition);
                    await Await.Delay(GetAbilityDelay(Owner, Ward), token);
                }

                try
                {
                    // var thresholdTars = this.Config.WardTargets.Item.GetValue<Slider>();
                    var manaDecrepify = Decrepify.GetManaCost(Decrepify.Level - 1);
                    var manaBlast     = Blast.GetManaCost(Blast.Level - 1);
                    // var manaDrain = Drain.GetManaCost(Drain.Level - 1);

                    if (Decrepify.CanBeCasted() && Target != null && Decrepify.CanHit(Target) &&
                        this.Config.AbilityToggler.Value.IsEnabled(this.Decrepify.Name) &&
                        this.Owner.Mana >= manaBlast + manaDecrepify &&
                        !UnitExtensions.IsChanneling(Owner) &&
                        Target.IsAlive)
                    {
                        this.Decrepify.UseAbility(Target);
                        await Await.Delay(GetAbilityDelay(Target, Decrepify), token);
                    }

                    if (this.Blast.CanBeCasted() &&
                        this.Config.AbilityToggler.Value.IsEnabled(this.Blast.Name) &&
                        (!this.Decrepify.CanBeCasted() || manaBlast > Owner.Mana - manaDecrepify) &&
                        !UnitExtensions.IsChanneling(Owner) &&
                        Target != null && Target.IsAlive)
                    {
                        var delay        = Blast.GetAbilityData("delay") + Blast.GetCastPoint();
                        var blastTargets =
                            EntityManager <Hero> .Entities.OrderBy(x => x == allTargets).Where(
                                x =>
                                x.IsValid && x.IsVisible && x.Team != Owner.Team && !x.IsIllusion &&
                                !UnitExtensions.IsMagicImmune(x)).ToList();

                        var blastCastRange = Blast.CastRange;

                        if (blastTargets == null)
                        {
                            return;
                        }
                        var input =
                            new PredictionInput(
                                Owner,
                                Target,
                                delay,
                                float.MaxValue,
                                blastCastRange,
                                400,
                                PredictionSkillshotType.SkillshotCircle,
                                true,
                                blastTargets)
                        {
                            CollisionTypes = CollisionTypes.None
                        };

                        var output = Prediction.GetPrediction(input);

                        if (output.HitChance >= HitChance.Medium)
                        {
                            Log.Debug($"Using Blast");
                            this.Blast.UseAbility(output.CastPosition);
                            await Await.Delay(GetAbilityDelay(Target.Position, this.Blast), token);
                        }
                    }
                }
                catch (Exception)
                {
                    // ignored
                }
            }

            if (this.BloodThorn != null &&
                this.BloodThorn.Item.IsValid &&
                Target != null && !UnitExtensions.IsChanneling(Owner) &&
                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 && !UnitExtensions.IsChanneling(Owner) &&
                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.Dagon != null &&
                this.Dagon.Item.IsValid &&
                Target != null && !UnitExtensions.IsChanneling(Owner) &&
                this.Dagon.Item.CanBeCasted(Target) &&
                this.Config.ItemToggler.Value.IsEnabled(Dagon5.Item.Name))
            {
                Log.Debug("Using Dagon");
                this.Dagon.UseAbility(Target);
                await Await.Delay(this.GetItemDelay(Target), token);
            }

            if (this.Orchid != null &&
                this.Orchid.Item.IsValid &&
                Target != null && !UnitExtensions.IsChanneling(Owner) &&
                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 && !UnitExtensions.IsChanneling(Owner) &&
                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 && !UnitExtensions.IsChanneling(Owner) &&
                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);
            }

            if (this.HurricanePike != null &&
                this.HurricanePike.Item.IsValid &&
                Target != null && !UnitExtensions.IsChanneling(Owner) &&
                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);
            }

            if (this.ShivasGuard != null &&
                this.ShivasGuard.Item.IsValid &&
                Target != null && !UnitExtensions.IsChanneling(Owner) &&
                this.ShivasGuard.Item.CanBeCasted() &&
                Owner.Distance2D(Target) <= 900 &&
                this.Config.ItemToggler.Value.IsEnabled("item_shivas_guard"))
            {
                Log.Debug("Using Shiva's Guard");
                this.ShivasGuard.UseAbility();
                await Await.Delay((int)Game.Ping, token);
            }

            if (this.Mjollnir != null &&
                this.Mjollnir.Item.IsValid &&
                Target != null && !UnitExtensions.IsChanneling(Owner) &&
                this.Mjollnir.Item.CanBeCasted() &&
                this.Config.ItemToggler.Value.IsEnabled("item_mjollnir"))
            {
                Log.Debug("Using Mjollnir");
                this.Mjollnir.UseAbility(Owner);
                await Await.Delay(this.GetItemDelay(Target), token);
            }
            if (this.Config.AbilityToggler.Value.IsEnabled(this.Blast.Name) &&
                this.Config.AbilityToggler.Value.IsEnabled(this.Decrepify.Name))
            {
                if (!silenced && this.Drain.CanBeCasted() &&
                    !this.Blast.CanBeCasted() && !this.Decrepify.CanBeCasted() &&
                    this.Config.AbilityToggler.Value.IsEnabled(this.Drain.Name) &&
                    !UnitExtensions.IsChanneling(Owner) &&
                    Target != null && Target.IsAlive)
                {
                    Log.Debug($"Using Drain 1");
                    this.Drain.UseAbility(Target);
                    await Await.Delay(GetAbilityDelay(Target, Drain) + 50, token);
                }
            }
            else
            {
                if (!silenced && this.Drain.CanBeCasted() &&
                    this.Config.AbilityToggler.Value.IsEnabled(this.Drain.Name) &&
                    !UnitExtensions.IsChanneling(Owner) &&
                    Target != null && Target.IsAlive)
                {
                    Log.Debug($"Using Drain 2");
                    this.Drain.UseAbility(Target);
                    await Await.Delay(GetAbilityDelay(Target, Drain) + 50, token);
                }
            }

            if (Target != null && !Owner.IsValidOrbwalkingTarget(Target) && !UnitExtensions.IsChanneling(this.Owner))
            {
                Orbwalker.Move(Game.MousePosition);
                await Await.Delay(50, token);
            }
            else
            {
                Orbwalker.OrbwalkTo(Target);
            }

            await Await.Delay(50, token);
        }
Пример #8
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            try
            {
                var sliderValue = this.Config.UseBlinkPrediction.Item.GetValue <Slider>().Value;

                if (Config.TargetItem.Value.SelectedValue.Contains("Lock") && Context.TargetSelector.IsActive &&
                    (!CanExecute || EnemyHero == null || !EnemyHero.IsValid || !EnemyHero.IsAlive))
                {
                    EnemyHero = Context.TargetSelector.Active.GetTargets().FirstOrDefault() as Hero;
                }
                else if (Config.TargetItem.Value.SelectedValue.Contains("Default") && Context.TargetSelector.IsActive)
                {
                    EnemyHero = Context.TargetSelector.Active.GetTargets().FirstOrDefault() as Hero;
                }

                var Silenced = UnitExtensions.IsSilenced(base.Owner);

                if (EnemyHero != null)
                {
                    if (this.BlinkDagger != null &&
                        (this.BlinkDagger.CanBeCasted &&
                         base.Owner.Distance2D(EnemyHero) <= 1200 + sliderValue &&
                         !(base.Owner.Distance2D(EnemyHero) <= 400) &&
                         this.Config.ItemToggler.Value.IsEnabled(this.BlinkDagger.Item.Name)))
                    {
                        var l        = (this.Owner.Distance2D(EnemyHero) - sliderValue) / sliderValue;
                        var posA     = this.Owner.Position;
                        var posB     = EnemyHero.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);

                        this.BlinkDagger.UseAbility(position);
                        await Await.Delay(BlinkDagger.GetCastDelay(position), token);
                    }

                    if (!Silenced)
                    {
                        if (this.Config.AbilityToggler.Value.IsEnabled(this.Blast.Name) && this.Blast.CanBeCasted() && this.Blast.CanHit(EnemyHero))
                        {
                            this.Blast.UseAbility(EnemyHero);
                            await Await.Delay(this.GetAbilityDelay(base.Owner, Blast), token);
                        }
                    }

                    if (this.Basher != null &&
                        base.Owner.IsAttacking() &&
                        this.Basher.CanBeCasted &&
                        this.Basher.CanHit(EnemyHero) &&
                        this.Config.ItemToggler.Value.IsEnabled(Basher.ToString()))
                    {
                        this.Basher.UseAbility(EnemyHero);
                        await Await.Delay(Basher.GetCastDelay(EnemyHero), token);
                    }

                    if (this.Mjollnir != null &&
                        base.Owner.IsAttacking() &&
                        this.Mjollnir.CanBeCasted &&
                        this.Config.ItemToggler.Value.IsEnabled(Mjollnir.ToString()))
                    {
                        this.Mjollnir.UseAbility(base.Owner);
                        await Await.Delay(Mjollnir.GetCastDelay(Owner), token);
                    }

                    if (!UnitExtensions.IsMagicImmune(EnemyHero) &&
                        !EnemyHero.IsInvulnerable() &&
                        !UnitExtensions.HasModifier(EnemyHero, "modifier_winter_wyvern_winters_curse"))
                    {
                        if (this.BloodThorn != null &&
                            this.BloodThorn.CanBeCasted &&
                            this.BloodThorn.CanHit(EnemyHero) &&
                            this.Config.ItemToggler.Value.IsEnabled(this.BloodThorn.ToString()))
                        {
                            this.BloodThorn.UseAbility(EnemyHero);
                            await Await.Delay(BloodThorn.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Medalion1 != null &&
                            this.Medalion1.CanBeCasted &&
                            this.Medalion1.CanHit(EnemyHero) &&
                            this.Config.ItemToggler.Value.IsEnabled(this.Medalion1.ToString()))
                        {
                            this.Medalion1.UseAbility(EnemyHero);
                            await Await.Delay(Medalion1.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Medallion2 != null &&
                            this.Medallion2.CanBeCasted &&
                            this.Medallion2.CanHit(EnemyHero) &&
                            this.Config.ItemToggler.Value.IsEnabled(this.Medallion2.ToString()))
                        {
                            this.Medallion2.UseAbility(EnemyHero);
                            await Await.Delay(Medallion2.GetCastDelay(EnemyHero), token);
                        }



                        if (this.DiffBlade != null &&
                            this.DiffBlade.CanBeCasted &&
                            this.DiffBlade.CanHit(EnemyHero) &&
                            this.Config.ItemToggler.Value.IsEnabled("item_diffusal_blade_2"))
                        {
                            this.DiffBlade.UseAbility(EnemyHero);
                            await Await.Delay(DiffBlade.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Orchid != null &&
                            this.Orchid.CanBeCasted &&
                            this.Orchid.CanHit(EnemyHero) &&
                            this.Config.ItemToggler.Value.IsEnabled(Orchid.ToString()))
                        {
                            this.Orchid.UseAbility(EnemyHero);
                            await Await.Delay(Orchid.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Heaven != null &&
                            base.Owner.IsAttacking() &&
                            this.Heaven.CanBeCasted &&
                            this.Heaven.CanHit(EnemyHero) &&
                            this.Config.ItemToggler.Value.IsEnabled(Heaven.ToString()))
                        {
                            this.Heaven.UseAbility(EnemyHero);
                            await Await.Delay(Heaven.GetCastDelay(EnemyHero), token);
                        }
                    }

                    if (EnemyHero != null && (EnemyHero.IsInvulnerable() || UnitExtensions.IsAttackImmune(EnemyHero)))
                    {
                        Orbwalker.Move(Game.MousePosition);
                    }
                    else if (EnemyHero != null)
                    {
                        Orbwalker.OrbwalkTo(EnemyHero);
                    }
                }
                else
                {
                    Orbwalker.Move(Game.MousePosition);
                }
            }
            catch (TaskCanceledException)
            {
                // canceled
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
Пример #9
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            var e = TargetSelector.Active.GetTargets()
                    .FirstOrDefault(x => !x.IsInvulnerable() && x.IsAlive);

            if (e == null)
            {
                return;
            }
            var debuff = e.FindModifier("modifier_storm_spirit_electric_vortex_pull") ?? e.FindModifier("modifier_sheepstick_debuff") ?? e.FindModifier("modifier_rod_of_atos_debuff");


            var buff = e.HasModifiers(new[]
            {
                "modifier_storm_spirit_electric_vortex_pull",
                "modifier_sheepstick_debuff",
                "modifier_rod_of_atos_debuff"
            }, false) || ExUnit.IsStunned(e) || ExUnit.IsHexed(e) || ExUnit.IsRooted(e);
            var checkTimeModif = debuff?.RemainingTime <= 0.3;

            var inUltBall = ExUnit.HasModifier(me, "modifier_storm_spirit_ball_lightning") ||
                            R.IsInAbilityPhase;
            var inOverload = ExUnit.HasModifier(me, "modifier_storm_spirit_overload");
            var lotusBuff  = ExUnit.HasModifier(e, "modifier_item_lotus_orb_active");
            var inVortex   = ExUnit.HasModifier(e, "modifier_storm_spirit_electric_vortex_pull");

            var travelSpeed   = R.GetAbilityData("ball_lightning_move_speed", R.Level);
            var distance      = me.Distance2D(e);
            var travelTime    = distance / travelSpeed;
            var startManaCost = R.GetAbilityData("ball_lightning_initial_mana_base") +
                                me.MaximumMana / 100 * R.GetAbilityData("ball_lightning_initial_mana_percentage");
            var costPerUnit = (12 + me.MaximumMana * 0.007) / 100.0;
            var rManacost   = startManaCost + costPerUnit * Math.Floor(distance / 100) * 100;
            var dagon       = me.GetDagon();
            var enemies     = EntityManager <Hero> .Entities.Count(
                x => x.IsValid && x.IsAlive && !x.IsIllusion && x.Team != me.Team && x.Distance2D(me) <= 700) >= Config.Heel.Item.GetValue <Slider>().Value;

            if (!lotusBuff)
            {
                if (
                    // cheese
                    cheese != null &&
                    cheese.Item.IsValid &&
                    cheese.Item.CanBeCasted() &&
                    (me.Health <= me.MaximumHealth * 0.3 ||
                     me.Mana <= me.MaximumMana * 0.2) &&
                    distance <= 700 &&
                    Config.ItemToggler.Value.IsEnabled(cheese.Item.Name)
                    )
                {
                    cheese.UseAbility();
                    await Await.Delay(GetItemDelay(e), token);
                }
                if ( // SoulRing Item
                    soul != null &&
                    soul.Item.IsValid &&
                    soul.Item.CanBeCasted() &&
                    Config.ItemToggler.Value.IsEnabled(soul.Item.Name) &&
                    me.CanCast() &&
                    me.Health >= me.MaximumHealth * 0.4 &&
                    me.Mana <= me.MaximumMana * 0.4
                    )
                {
                    soul.UseAbility();
                    await Await.Delay(GetItemDelay(e), token);
                }
                if ( // Arcane Boots Item
                    arcane != null &&
                    arcane.Item.IsValid &&
                    arcane.Item.CanBeCasted() &&
                    Config.ItemToggler.Value.IsEnabled(arcane.Item.Name) &&
                    me.CanCast() &&
                    me.Mana <= me.MaximumMana * 0.4
                    )
                {
                    arcane.UseAbility();
                    await Await.Delay(GetItemDelay(e), token);
                }

                uint elsecount = 0;
                elsecount += 1;
                if (elsecount == 1 &&
                    R != null &&
                    R.CanBeCasted() &&
                    !me.IsAttacking() &&
                    !R.IsChanneling &&
                    !R.IsInAbilityPhase &&
                    me.Mana >= rManacost &&
                    !inUltBall &&
                    distance >= me.GetAttackRange() &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.AbilityToggler.Value.IsEnabled(R.Name)
                    )
                {
                    if (e.NetworkActivity == NetworkActivity.Move)
                    {
                        R.CastSkillShot(e);
                    }
                    else
                    {
                        R.UseAbility(e.Position);
                    }
                    await Await.Delay(GetAbilityDelay(me, R) + (int)Math.Floor(travelTime * 1000), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (vail != null &&
                    vail.Item.IsValid &&
                    vail.Item.CanBeCasted() &&
                    Config.ItemToggler.Value.IsEnabled(vail.Item.Name) &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e)
                    )
                {
                    vail.UseAbility(e.Position);
                    await Await.Delay(GetItemDelay(e), token);
                }
                if (orchid != null &&
                    orchid.Item.IsValid &&
                    orchid.Item.CanBeCasted() &&
                    (Config.silenceToHex.Value || !ExUnit.IsHexed(e)) &&
                    (Config.silenceToVortex.Value || !inVortex)

                    && me.CanCast() &&
                    !ExUnit.IsLinkensProtected(e) &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled("item_bloodthorn")
                    )
                {
                    orchid.UseAbility(e);
                    await Await.Delay(GetItemDelay(e), token);
                }
                if (nullifier != null &&
                    nullifier.Item.IsValid &&
                    nullifier.Item.CanBeCasted() &&
                    me.CanCast() &&
                    !ExUnit.IsHexed(e) &&
                    !ExUnit.IsLinkensProtected(e) &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled(nullifier.Item.Name)
                    )
                {
                    nullifier.UseAbility(e);
                    await Await.Delay(GetItemDelay(e), token);
                }

                if (bloodthorn != null &&
                    bloodthorn.Item.IsValid &&
                    bloodthorn.Item.CanBeCasted() &&
                    (Config.silenceToVortex.Value || !inVortex) &&
                    (Config.silenceToHex.Value || !ExUnit.IsHexed(e)) &&
                    me.CanCast() &&
                    !ExUnit.IsLinkensProtected(e) &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled("item_bloodthorn")
                    )
                {
                    bloodthorn.UseAbility(e);
                    await Await.Delay(GetItemDelay(e), token);
                }
                if (elsecount == 2 &&
                    sheep != null &&
                    sheep.Item.IsValid &&
                    sheep.Item.CanBeCasted() &&
                    me.CanCast() &&
                    (checkTimeModif || !buff) &&
                    !ExUnit.IsLinkensProtected(e) &&
                    !ExUnit.IsMagicImmune(e) &&
                    (Config.hexToSilence.Value || !ExUnit.IsSilenced(e)) &&
                    e.ClassId != ClassId.CDOTA_Unit_Hero_Tidehunter &&
                    Config.ItemToggler.Value.IsEnabled(sheep.Item.Name)
                    )
                {
                    sheep.UseAbility(e);
                    await Await.Delay(GetItemDelay(e), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 3 &&
                    Q != null &&
                    Q.CanBeCasted() &&
                    Config.AbilityToggler.Value.IsEnabled(Q.Name) &&
                    !ExUnit.IsMagicImmune(e) &&
                    me.CanCast() &&
                    !R.IsInAbilityPhase &&
                    (W == null || !W.CanBeCasted() || !Config.AbilityToggler.Value.IsEnabled(W.Name) || ExUnit.IsSilenced(e) || ExUnit.IsHexed(e)) &&
                    (!inOverload || inOverload && ExUnit.IsAttackImmune(e)) &&
                    distance <= Q.GetAbilityData("static_remnant_radius") + me.HullRadius
                    )
                {
                    Q.UseAbility();
                    await Await.Delay(GetAbilityDelay(me, Q) + 100, token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 4 &&
                    W != null &&
                    W.CanBeCasted() &&
                    (Config.fastVortex.Value || !R.IsInAbilityPhase && !inOverload) &&
                    (checkTimeModif || !buff) &&
                    (Config.vortexToSilence.Value || !ExUnit.IsSilenced(e)) &&
                    !me.IsAttacking() &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.AbilityToggler.Value.IsEnabled(W.Name)
                    )
                {
                    W.UseAbility(e);
                    await Await.Delay(GetAbilityDelay(me, W) + 50, token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 5 &&
                    ExUnit.CanAttack(me) &&
                    !me.IsAttacking() &&
                    !ExUnit.HasModifier(e, "modifier_item_ethereal_blade_slow") &&
                    inOverload &&
                    !ExUnit.IsAttackImmune(e) &&
                    distance <= me.GetAttackRange() &&
                    !ExUnit.IsAttackImmune(e)
                    )
                {
                    me.Attack(e);
                    await Await.Delay(170, token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 6 &&
                    W != null &&
                    W.CanBeCasted() &&
                    (Config.fastVortex.Value || !inOverload) &&
                    me.AghanimState() &&
                    (checkTimeModif || !buff) &&
                    !me.IsAttacking() &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.AbilityToggler.Value.IsEnabled(W.Name)
                    )
                {
                    W.UseAbility();
                    await Await.Delay(GetAbilityDelay(me, W), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 7 &&
                    atos != null &&
                    atos.Item.IsValid &&
                    atos.Item.CanBeCasted() &&
                    me.CanCast() &&
                    (checkTimeModif || !buff || !ExUnit.IsHexed(e)) &&
                    !ExUnit.IsLinkensProtected(e) &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled(atos.Item.Name)
                    )
                {
                    atos.UseAbility(e);
                    await Await.Delay(GetItemDelay(e) + 100, token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 8 &&
                    ethereal != null &&
                    ethereal.Item.IsValid &&
                    ethereal.Item.CanBeCasted() &&
                    me.CanCast() &&
                    !ExUnit.IsLinkensProtected(e) &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled(ethereal.Item.Name)
                    )
                {
                    if (Config.debuff.Value)
                    {
                        var speed = ethereal.Item.GetAbilityData("projectile_speed");
                        var time  = e.Distance2D(me) / speed;
                        ethereal.UseAbility(e);
                        await Await.Delay((int)(time * 1000.0f + Game.Ping) + 30, token);
                    }
                    else
                    {
                        ethereal.UseAbility(e);
                        await Await.Delay(GetItemDelay(e), token);
                    }
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 9 &&
                    dagon != null &&
                    dagon.IsValid &&
                    dagon.CanBeCasted() &&
                    Config.ItemToggler.Value.IsEnabled("item_dagon_5") &&
                    me.CanCast() &&
                    (ethereal == null ||
                     ExUnit.HasModifier(e, "modifier_item_ethereal_blade_slow") ||
                     ethereal.Item.Cooldown < 17) &&
                    !ExUnit.IsLinkensProtected(e) &&
                    !ExUnit.IsMagicImmune(e)
                    )
                {
                    dagon.UseAbility(e);
                    await Await.Delay(GetItemDelay(e), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 10 &&
                    urn != null &&
                    urn.Item.IsValid && urn.Item.CanBeCasted() && urn.Item.CurrentCharges > 0 &&
                    distance <= urn.Item.GetCastRange() &&
                    Config.ItemToggler.Value.IsEnabled(urn.Item.Name)
                    )
                {
                    urn.UseAbility(e);
                    await Await.Delay(GetItemDelay(e), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 11 &&
                    bkb != null &&
                    bkb.Item.IsValid &&
                    bkb.Item.CanBeCasted() &&
                    enemies &&
                    Config.ItemToggler.Value.IsEnabled(bkb.Item.Name)
                    )
                {
                    bkb.UseAbility();
                    await Await.Delay(GetItemDelay(me), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 12 &&
                    lotus != null &&
                    lotus.Item.IsValid &&
                    lotus.Item.CanBeCasted() &&
                    enemies &&
                    Config.ItemToggler.Value.IsEnabled(lotus.Item.Name)
                    )
                {
                    lotus.UseAbility(me);
                    await Await.Delay(GetItemDelay(me), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 13 &&
                    shiva != null &&
                    shiva.Item.IsValid &&
                    shiva.Item.CanBeCasted() &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled(shiva.Item.Name) &&
                    distance <= 600
                    )
                {
                    shiva.UseAbility();
                    await Await.Delay(GetItemDelay(me), token);
                }
                else
                {
                    elsecount += 1;
                }
                if (elsecount == 14 &&
                    mjollnir != null &&
                    mjollnir.Item.IsValid &&
                    mjollnir.Item.CanBeCasted() &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled(mjollnir.Item.Name) &&
                    me.Distance2D(e) <= 600
                    )
                {
                    mjollnir.UseAbility(me);
                    await Await.Delay(GetItemDelay(me), token);
                }
            }
            else
            {
                if (Q != null &&
                    Q.CanBeCasted() &&
                    !inOverload &&
                    (W == null || !W.CanBeCasted() || !Config.AbilityToggler.Value.IsEnabled(W.Name)) &&
                    distance <= Q.GetAbilityData("static_remnant_radius") + me.HullRadius &&
                    Config.AbilityToggler.Value.IsEnabled(Q.Name) &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e)
                    )
                {
                    Q.UseAbility();
                    await Await.Delay(GetAbilityDelay(me, Q) + 200, token);
                }

                if (shiva != null &&
                    shiva.Item.IsValid &&
                    shiva.Item.CanBeCasted() &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.ItemToggler.Value.IsEnabled(shiva.Item.Name) &&
                    distance <= 600
                    )
                {
                    shiva.UseAbility();
                    await Await.Delay(GetItemDelay(me), token);
                }
                if (W != null &&
                    W.CanBeCasted() &&
                    !inOverload &&
                    me.AghanimState() &&
                    (checkTimeModif || !buff) &&
                    !me.IsAttacking() &&
                    me.CanCast() &&
                    !ExUnit.IsMagicImmune(e) &&
                    Config.AbilityToggler.Value.IsEnabled(W.Name)
                    )
                {
                    W.UseAbility();
                    await Await.Delay(GetAbilityDelay(me, W), token);
                }
            }
            Vector3 start = e.NetworkActivity == NetworkActivity.Move ? new Vector3((float)((R.GetCastDelay(me, me, true) + 0.3) * Math.Cos(e.RotationRad) * e.MovementSpeed + e.Position.X),
                                                                                    (float)((R.GetCastDelay(me, me, true) + 0.3) * Math.Sin(e.RotationRad) * e.MovementSpeed + e.NetworkPosition.Y), e.NetworkPosition.Z) : e.NetworkPosition;

            if (R != null &&
                R.CanBeCasted() &&
                !inUltBall &&
                Q.Cooldown <= 3 &&
                !R.IsInAbilityPhase &&
                !R.IsChanneling &&
                !me.IsAttacking() &&
                (W == null || !W.CanBeCasted() || !Config.AbilityToggler.Value.IsEnabled(W.Name)) &&
                !ExUnit.IsChanneling(me) &&
                (Config.AutoOverload.Value &&
                 buff ||
                 !buff) &&
                me.Position.Distance2D(start) <= me.GetAttackRange() &&
                !ExUnit.IsMagicImmune(e) &&
                (Config.savemanamode.Value &&
                 me.AttackBackswing() > 0.3 - me.TurnTime(e.NetworkPosition) &&
                 !cooldown ||
                 !Config.savemanamode.Value) &&
                Config.AbilityToggler.Value.IsEnabled(R.Name)
                )
            {
                float   angle = e.FindAngleBetween(me.Position, true);
                Vector3 pos   = new Vector3((float)(me.Position.X - 15 * Math.Cos(angle)),
                                            (float)(me.Position.Y - 15 * Math.Sin(angle)), me.Position.Z);
                if (!inOverload)
                {
                    R.UseAbility(pos);
                    await Await.Delay(GetAbilityDelay(me, R) + 100, token);
                }
            }
            if (!ExUnit.IsAttackImmune(e) && !ExUnit.IsDisarmed(me) && !ExUnit.HasModifier(e, "modifier_item_ethereal_blade_slow"))
            {
                float   angle = e.FindAngleBetween(me.Position, true);
                Vector3 pos   = new Vector3((float)(me.Position.X + 300 * Math.Cos(angle)),
                                            (float)(me.Position.Y + 300 * Math.Sin(angle)), me.Position.Z);
                if (me.Distance2D(e) <= 250 && e.GetTurnTime(me) * 1000 < 35 && cooldown && !me.IsAttacking())
                {
                    me.Move(pos);
                    await Await.Delay((int)(me.SecondsPerAttack * 100), token);
                }
                if (me.Distance2D(e) <= 250 && !cooldown && !me.IsAttacking() && ExUnit.CanAttack(me))
                {
                    me.Attack(e);
                    await Await.Delay((int)(me.SecondsPerAttack * 100), token);
                }
                if (me.Distance2D(e) >= 250 && !cooldown && ExUnit.CanAttack(me))
                {
                    if (Orbwalker.OrbwalkTo(e))
                    {
                        return;
                    }
                }
            }
            await Await.Delay(10, token);
        }
Пример #10
0
        private async Task UseItems(Unit target, CancellationToken token)
        {
            var called = EntityManager <Hero> .Entities
                         .Where(x => Owner.Team != x.Team && x.IsValid && !x.IsIllusion && x.IsAlive && x.Modifiers.Any(m => m.Name == "modifier_axe_berserkers_call"))
                         .ToList();

            if (called.Any())
            {
                var bkb = Owner.GetItemById(AbilityId.item_black_king_bar);
                if (bkb != null && bkb.CanBeCasted() && config.UseItems.Value.IsEnabled(bkb.Name))
                {
                    bkb.UseAbility();
                    await Task.Delay(10, token);
                }

                var bladeMail = Owner.GetItemById(AbilityId.item_blade_mail);
                if (bladeMail != null && bladeMail.CanBeCasted() && config.UseItems.Value.IsEnabled(bladeMail.Name))
                {
                    bladeMail.UseAbility();
                    await Task.Delay(10, token);
                }

                var lotus = Owner.GetItemById(AbilityId.item_lotus_orb);
                if (lotus != null && lotus.CanBeCasted() && config.UseItems.Value.IsEnabled(lotus.Name))
                {
                    lotus.UseAbility(Owner);
                    await Task.Delay(10, token);
                }

                var mjollnir = Owner.GetItemById(AbilityId.item_mjollnir);
                if (mjollnir != null && mjollnir.CanBeCasted() && config.UseItems.Value.IsEnabled(mjollnir.Name))
                {
                    mjollnir.UseAbility(Owner);
                    await Task.Delay(10, token);
                }

                var shiva = Owner.GetItemById(AbilityId.item_shivas_guard);
                if (shiva != null && shiva.CanBeCasted() && config.UseItems.Value.IsEnabled(shiva.Name))
                {
                    shiva.UseAbility();
                    await Task.Delay(10, token);
                }

                var crimson = Owner.GetItemById(AbilityId.item_crimson_guard);
                if (crimson != null && crimson.CanBeCasted() && config.UseItems.Value.IsEnabled(crimson.Name))
                {
                    crimson.UseAbility();
                    await Task.Delay(10, token);
                }

                var pipe = Owner.GetItemById(AbilityId.item_pipe);
                if (pipe != null && pipe.CanBeCasted() && config.UseItems.Value.IsEnabled(pipe.Name))
                {
                    pipe.UseAbility();
                    await Task.Delay(10, token);
                }

                var dagon = Owner.GetDagon();
                if (dagon != null && dagon.CanBeCasted() && config.UseItems.Value.IsEnabled("item_dagon") && !UnitExtensions.IsMagicImmune(target) && !UnitExtensions.IsLinkensProtected(target))
                {
                    dagon.UseAbility(target);
                    await Task.Delay(10, token);
                }

                if (W != null && W.CanBeCasted() && Owner.CanCast() && !UnitExtensions.IsMagicImmune(target))
                {
                    if (W.ManaCost + R.ManaCost < Owner.Mana)
                    {
                        W.UseAbility(target);
                        await Task.Delay((int)(W.FindCastPoint() * 1000 + Game.Ping), token);
                    }
                }
            }
        }
Пример #11
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            try
            {
                if (Config.Target.Value.SelectedValue.Contains("Lock") && Context.TargetSelector.IsActive &&
                    (!CanExecute || EnemyHero == null || !EnemyHero.IsValid || !EnemyHero.IsAlive))
                {
                    EnemyHero = Context.TargetSelector.Active.GetTargets().FirstOrDefault() as Hero;
                }
                else if (Config.Target.Value.SelectedValue.Contains("Default") && Context.TargetSelector.IsActive)
                {
                    EnemyHero = Context.TargetSelector.Active.GetTargets().FirstOrDefault() as Hero;
                }

                var Silenced   = UnitExtensions.IsSilenced(base.Owner);
                var SliderData = this.Config.UseBlink.Item.GetValue <Slider>().Value;
                var IsInvis    = Ensage.SDK.Extensions.UnitExtensions.IsInvisible(this.Owner);


                var WAbiCasted = Ensage.SDK.Extensions.UnitExtensions.HasModifier(Owner, "modifier_dark_willow_shadow_realm_buff");



                var QAbiTargets = EntityManager <Hero> .Entities.OrderBy(x => x == EnemyHero).Where(x => x.IsValid && x.IsVisible && x.Team != Owner.Team && !x.IsIllusion && !UnitExtensions.IsMagicImmune(x)).ToList();

                if (EnemyHero != null && !EnemyHero.IsInvulnerable() && !UnitExtensions.IsMagicImmune(EnemyHero))
                {
                    if (this.QAbi.CanBeCasted && this.QAbi != null && !Silenced && this.Config.AbilityToggler.Value.IsEnabled(this.QAbi.Ability.Name) && this.QAbi.CanHit(EnemyHero) && !IsInvis)
                    {
                        QAbi.UseAbility(EnemyHero.Position);
                        ///  await Await.Delay(QAbi.GetCastDelay(EnemyHero.Position), token);
                        await Await.Delay(this.GetAbilityDelay(this.Owner, QAbi), token);
                    }

                    if (!Silenced && this.EAbi != null && this.Config.AbilityToggler.Value.IsEnabled(this.EAbi.Ability.Name) && this.EAbi.CanBeCasted && !IsInvis && this.EAbi.CanHit(EnemyHero))
                    {
                        this.EAbi.Ability.UseAbility(EnemyHero);
                        await Await.Delay(this.GetAbilityDelay(this.Owner, EAbi), token);
                    }

                    if (!Silenced && this.DAbi != null && !IsInvis && this.Owner.IsInRange(EnemyHero, 300) && !IsInvis && this.DAbi.CanBeCasted && this.Config.AbilityToggler.Value.IsEnabled(this.DAbi.Ability.Name))
                    {
                        this.DAbi.Ability.UseAbility();
                        await Await.Delay(this.GetAbilityDelay(this.Owner, DAbi), token);
                    }

                    //
                    //
                    //
                    //
                    //
                    //


                    if (this.Blink != null && this.Blink.CanBeCasted && Owner.Distance2D(EnemyHero) <= 1200 + SliderData && !IsInvis && !(this.Owner.Distance2D(EnemyHero) <= 400) && this.Config.ItemToggler2.Value.IsEnabled(this.Blink.Item.Name))
                    {
                        var l        = (this.Owner.Distance2D(EnemyHero) - SliderData) / SliderData;
                        var posA     = this.Owner.Position;
                        var posB     = EnemyHero.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);

                        this.Blink.UseAbility(position);
                        await Await.Delay(Blink.GetCastDelay(position), token);
                    }


                    if (!UnitExtensions.IsMagicImmune(EnemyHero))
                    {
                        if (this.BloodThorn != null && this.BloodThorn.CanBeCasted && !IsInvis && !this.Owner.IsAttacking() && this.Config.ItemToggler.Value.IsEnabled(this.BloodThorn.Item.Name))
                        {
                            this.BloodThorn.UseAbility(EnemyHero);
                            await Await.Delay(BloodThorn.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Medalion1 != null && this.Medalion1.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && !this.Owner.IsAttacking() && this.Config.ItemToggler.Value.IsEnabled(this.Medalion1.Item.Name))
                        {
                            this.Medalion1.UseAbility(EnemyHero);
                            await Await.Delay(Medalion1.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Medallion2 != null && this.Medallion2.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && !this.Owner.IsAttacking() && this.Config.ItemToggler.Value.IsEnabled(this.Medallion2.Item.Name))
                        {
                            this.Medallion2.UseAbility(EnemyHero);
                            await Await.Delay(Medallion2.GetCastDelay(EnemyHero), token);
                        }

                        if (this.SheepStick != null && this.SheepStick.CanBeCasted && !IsInvis && this.Config.ItemToggler.Value.IsEnabled(this.SheepStick.Item.Name))
                        {
                            this.SheepStick.UseAbility(EnemyHero);
                            await Await.Delay(SheepStick.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Orchid != null && this.Orchid.CanBeCasted && !IsInvis && this.Config.ItemToggler.Value.IsEnabled(Orchid.Item.Name))
                        {
                            this.Orchid.UseAbility(EnemyHero);
                            await Await.Delay(Orchid.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Mjollnir != null && this.Mjollnir.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && this.Config.ItemToggler2.Value.IsEnabled(Mjollnir.Item.Name))
                        {
                            this.Mjollnir.UseAbility(this.Owner);
                            await Await.Delay(Mjollnir.GetCastDelay(), token);
                        }

                        if (this.Veil_Of_Discord != null && this.Veil_Of_Discord.CanBeCasted && !IsInvis && this.Config.ItemToggler2.Value.IsEnabled(Veil_Of_Discord.Item.Name))
                        {
                            this.Veil_Of_Discord.UseAbility(EnemyHero.Position);
                            await Await.Delay(Veil_Of_Discord.GetCastDelay(), token);
                        }

                        if (this.Rod_Of_Atos != null && this.Rod_Of_Atos.CanBeCasted && !IsInvis && this.Config.ItemToggler2.Value.IsEnabled(Rod_Of_Atos.Item.Name))
                        {
                            this.Rod_Of_Atos.UseAbility(EnemyHero);
                            await Await.Delay(Rod_Of_Atos.GetCastDelay(), token);
                        }
                    }

                    if (EnemyHero != null && (EnemyHero.IsInvulnerable() || UnitExtensions.IsAttackImmune(EnemyHero)))
                    {
                        Orbwalker.Move(Game.MousePosition);
                    }
                    else if (EnemyHero != null)
                    {
                        Orbwalker.OrbwalkTo(EnemyHero);
                    }
                }
                else
                {
                    Orbwalker.Move(Game.MousePosition);
                }
            }
            catch (TaskCanceledException)
            {
                // canceled
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
Пример #12
0
        private void OnUpdate()
        {
            if (RazeShort.Level <= 0)
            {
                return;
            }

            Razes = new List <Ability> {
                RazeShort, RazeMedium, RazeLong
            };

            if (DrawRazeRange == true)
            {
                var raze1 = UnitExtensions.InFront(Owner, this.RazeShort.GetAbilitySpecialData("shadowraze_range"));
                var raze2 = UnitExtensions.InFront(Owner, this.RazeMedium.GetAbilitySpecialData("shadowraze_range"));
                var raze3 = UnitExtensions.InFront(Owner, this.RazeLong.GetAbilitySpecialData("shadowraze_range"));

                var file = "materials/ensage_ui/particles/alert_range.vpcf";
                Particle.AddOrUpdate(Owner, $"DrawRange_{1}", file, ParticleAttachment.AbsOrigin, RestartType.None, 0,
                                     raze1,
                                     1, new Vector3(255, 0, 0), 2, new Vector3(200, 255, 40));
                Particle.AddOrUpdate(Owner, $"DrawRange_{2}", file, ParticleAttachment.AbsOrigin, RestartType.None, 0,
                                     raze2,
                                     1, new Vector3(255, 0, 0), 2, new Vector3(200, 255, 40));
                Particle.AddOrUpdate(Owner, $"DrawRange_{3}", file, ParticleAttachment.AbsOrigin, RestartType.None, 0,
                                     raze3,
                                     1, new Vector3(255, 0, 0), 2, new Vector3(200, 255, 40));

                var targets = EntityManager <Hero> .Entities.FirstOrDefault(
                    x => x.IsAlive && x.Team != this.Owner.Team &&
                    x.Distance2D(this.Owner) < 1500 && !x.IsIllusion);


                if (targets != null && this.RazeShort.CanBeCasted() && !UnitExtensions.IsMagicImmune(targets) && !targets.IsInvulnerable() &&
                    CanHit(this.RazeShort, targets, GetRazeDelay(targets, RazeShort), true))
                {
                    Particle.AddOrUpdate(Owner, $"DrawRange_{1}", file, ParticleAttachment.AbsOrigin, RestartType.None,
                                         0,
                                         raze1, 1, new Vector3(0, 255, 0), 2, new Vector3(200, 255, 40));
                }

                if (targets != null && this.RazeMedium.CanBeCasted() && !UnitExtensions.IsMagicImmune(targets) && !targets.IsInvulnerable() &&
                    CanHit(this.RazeMedium, targets, GetRazeDelay(targets, RazeMedium), true))
                {
                    Particle.AddOrUpdate(Owner, $"DrawRange_{2}", file, ParticleAttachment.AbsOrigin, RestartType.None,
                                         0,
                                         raze2, 1, new Vector3(0, 255, 0), 2, new Vector3(200, 255, 40));
                }

                if (targets != null && this.RazeLong.CanBeCasted() && !UnitExtensions.IsMagicImmune(targets) && !targets.IsInvulnerable() &&
                    CanHit(this.RazeLong, targets, GetRazeDelay(targets, RazeLong), true))
                {
                    Particle.AddOrUpdate(Owner, $"DrawRange_{3}", file, ParticleAttachment.AbsOrigin, RestartType.None,
                                         0,
                                         raze3, 1, new Vector3(0, 255, 0), 2, new Vector3(200, 255, 40));
                }
            }
            else
            {
                Particle.Remove($"DrawRange_{1}");
                Particle.Remove($"DrawRange_{2}");
                Particle.Remove($"DrawRange_{3}");
            }
        }
Пример #13
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            var target = this.TargetSelector.Active.GetTargets()
                         .FirstOrDefault(x => !x.IsInvulnerable() && !UnitExtensions.IsMagicImmune(x) && x.IsAlive);

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

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

            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);
            }
            //Are we in an ult phase?
            var inUltimate = UnitExtensions.HasModifier(Owner, "modifier_storm_spirit_ball_lightning") ||
                             Lightning.IsInAbilityPhase;

            //Check if we're silenced, our target is alive, and we have a target.
            var UltDistance = Config.DistanceForUlt.Item.GetValue <Slider>().Value;

            //Check for distance to target and push against slider value
            if (target != null && target.IsAlive &&
                Owner.Distance2D(target) >= 400 && Owner.Distance2D(target) <= UltDistance &&
                Config.AbilityToggler.Value.IsEnabled(Lightning.Name) && !silenced)
            {
                //Based on whether they are moving or not, predict where they will be.
                if (target.IsMoving)
                {
                    var PredictedPosition = Ensage.Common.Extensions.UnitExtensions.InFront(target, 0);
                    //Check the mana consumed from our prediction.
                    double TempManaConsumed = (Lightning.GetAbilityData("ball_lightning_initial_mana_base") +
                                               ((Lightning.GetAbilityData("ball_lightning_initial_mana_percentage") /
                                                 100) * Owner.MaximumMana))
                                              + ((Ensage.SDK.Extensions.EntityExtensions.Distance2D(Owner,
                                                                                                    PredictedPosition) / 100) *
                                                 (((Lightning.GetAbilityData("ball_lightning_travel_cost_percent") /
                                                    100) * Owner.MaximumMana)));
                    if (TempManaConsumed <= Owner.Mana && !inUltimate)
                    {
                        Lightning.UseAbility(PredictedPosition);
                        await Await.Delay(
                            (int)(Lightning.FindCastPoint() + Owner.GetTurnTime(PredictedPosition) * 2250 + Game.Ping),
                            token);
                    }
                }

                else
                {
                    var    PredictedPosition = target.NetworkPosition;
                    double TempManaConsumed  = (Lightning.GetAbilityData("ball_lightning_initial_mana_base") +
                                                ((Lightning.GetAbilityData("ball_lightning_initial_mana_percentage") /
                                                  100) * Owner.MaximumMana))
                                               + ((Ensage.SDK.Extensions.EntityExtensions.Distance2D(Owner,
                                                                                                     PredictedPosition) / 100) *
                                                  (((Lightning.GetAbilityData("ball_lightning_travel_cost_percent") /
                                                     100) * Owner.MaximumMana)));
                    if (TempManaConsumed <= Owner.Mana && !inUltimate)
                    {
                        Lightning.UseAbility(PredictedPosition);
                        await Await.Delay(
                            (int)(Lightning.FindCastPoint() + Owner.GetTurnTime(PredictedPosition) * 2250 + Game.Ping),
                            token);
                    }
                }
            }

            //Vars we need before combo.
            bool  HasAghanims = Owner.HasItem(ItemId.item_ultimate_scepter);
            float VortexCost  = Vortex.GetManaCost(Vortex.Level - 1);
            float RemnantCost = Remnant.GetManaCost(Remnant.Level - 1);
            float CurrentMana = Owner.Mana;
            float TotalMana   = Owner.MaximumMana;

            //This is here to stop us from ulting after our target dies.


            float RemnantAutoDamage = this.Remnant.GetAbilityData("static_remnant_damage");

            if (this.Overload != null)
            {
                RemnantAutoDamage += this.Overload.GetDamage(Overload.Level - 1);
            }

            var RemnantAutokillableTar =
                ObjectManager.GetEntitiesFast <Hero>()
                .FirstOrDefault(
                    x =>
                    x.IsAlive && x.Team != this.Owner.Team && !x.IsIllusion &&
                    this.Remnant.CanBeCasted() && this.Remnant.CanHit(x) &&
                    x.Health < (RemnantAutoDamage * (1 - x.MagicDamageResist)) &&
                    !UnitExtensions.IsMagicImmune(x) &&
                    x.Distance2D(this.Owner) <= 235);

            var ActiveRemnant = Remnants.Any(unit => unit.Distance2D(RemnantAutokillableTar) < 240);


            if (!silenced && target != null)
            {
                //there is a reason behind this; the default delay on storm ult is larger than a minimum distance travelled.
                var TargetPosition = target.NetworkPosition;

                /*TargetPosition *= 100;
                 * TargetPosition = target.NetworkPosition + TargetPosition;*/
                double ManaConsumed = (Lightning.GetAbilityData("ball_lightning_initial_mana_base") + ((Lightning.GetAbilityData("ball_lightning_initial_mana_percentage") / 100) * CurrentMana))
                                      + ((Ensage.SDK.Extensions.EntityExtensions.Distance2D(Owner, TargetPosition) / 100) * (((Lightning.GetAbilityData("ball_lightning_travel_cost_percent") / 100) * CurrentMana)));

                //Always auto attack if we have an overload charge.
                if (UnitExtensions.HasModifier(Owner, "modifier_storm_spirit_overload") && target != null)
                {
                    Owner.Attack(target);
                    await Await.Delay(500);
                }

                //Vortex prioritization logic [do we have q/w enabled, do we have the mana to cast both, do they have lotus, do we have an overload modifier]
                if (!UnitExtensions.HasModifier(Owner, "modifier_storm_spirit_overload") &&
                    Config.AbilityToggler.Value.IsEnabled(Vortex.Name) && Vortex.CanBeCasted() &&
                    Config.AbilityToggler.Value.IsEnabled(Remnant.Name) && Remnant.CanBeCasted() &&
                    (VortexCost + RemnantCost) <= CurrentMana)
                {
                    //Use Vortex
                    if (!HasAghanims)
                    {
                        Vortex.UseAbility(target);
                        await Await.Delay(GetAbilityDelay(Owner, Vortex), token);
                    }

                    //Use Vortex differently for aghanims.
                    else
                    {
                        Vortex.UseAbility();
                        await Await.Delay(GetAbilityDelay(Owner, Vortex), token);
                    }
                }

                //Remnant logic [w is not available, cant ult, close enough for the detonation]
                if (!UnitExtensions.HasModifier(Owner, "modifier_storm_spirit_overload") && target.IsAlive &&
                    Config.AbilityToggler.Value.IsEnabled(Remnant.Name) && Remnant.CanBeCasted() &&
                    !Vortex.CanBeCasted() && (CurrentMana <= RemnantCost + ManaConsumed || Owner.Distance2D(target) <= Remnant.GetAbilityData("static_remnant_radius")))
                {
                    Remnant.UseAbility();
                    await Await.Delay(GetAbilityDelay(Owner, Remnant), token);
                }

                //Ult logic [nothing else is available or we are not in range for a q]
                if (!UnitExtensions.HasModifier(Owner, "modifier_storm_spirit_overload") && target.IsAlive &&
                    Config.AbilityToggler.Value.IsEnabled(Lightning.Name) && Lightning.CanBeCasted() &&
                    (!Remnant.CanBeCasted() || Owner.Distance2D(target) >= Remnant.GetAbilityData("static_remnant_radius")) &&
                    (!Vortex.CanBeCasted(target) || Owner.Distance2D(target) <= UltDistance)
                    //Don't cast ult if theres a remnant that can kill our target.
                    && !inUltimate && (RemnantAutokillableTar == null || ActiveRemnant == false))
                //todo: alternate check for aghanims
                {
                    Lightning.UseAbility(TargetPosition);
                    int delay = (int)((Lightning.FindCastPoint() + Owner.GetTurnTime(TargetPosition)) * 1250.0 + Game.Ping);
                    Log.Debug($"{delay}ms to wait.");
                    await Task.Delay(delay);
                }
            }

            if ((this.Nullifier != null &&
                 (this.Nullifier.Item.IsValid &&
                  target != null &&
                  this.Nullifier.Item.CanBeCasted(target) &&
                  this.Config.ItemToggler.Value.IsEnabled("item_nullifier"))))
            {
                Log.Debug("Using Nullifier");
                this.Nullifier.UseAbility(target);
                await Await.Delay(this.GetItemDelay(target) + (int)Game.Ping, token);
            }

            if ((this.BloodThorn != null &&
                 (this.BloodThorn.Item.IsValid &&
                  target != null &&
                  this.BloodThorn.Item.CanBeCasted(target) &&
                  this.Config.ItemToggler.Value.IsEnabled("item_bloodthorn"))))
            {
                Log.Debug("Using Bloodthorn");
                this.BloodThorn.UseAbility(target);
                await Await.Delay(this.GetItemDelay(target) + (int)Game.Ping, 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) + (int)Game.Ping, 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) + (int)Game.Ping, 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) + (int)Game.Ping, 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) + (int)Game.Ping, token);
            }

            if ((this.HurricanePike != null) && (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) + (int)Game.Ping, token);
            }

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

            if ((this.Mjollnir != null &&
                 (this.Mjollnir.Item.IsValid &&
                  target != null &&
                  this.Mjollnir.Item.CanBeCasted() &&
                  this.Config.ItemToggler.Value.IsEnabled("item_mjollnir"))))
            {
                Log.Debug("Using Mjollnir");
                this.Mjollnir.UseAbility(Owner);
                await Await.Delay(this.GetItemDelay(target) + (int)Game.Ping, token);
            }

            if (this.Orbwalker.OrbwalkTo(target))
            {
                return;
            }

            await Await.Delay(125, token);
        }
Пример #14
0
        private void DrawingDamagePanel(EventArgs args)
        {
            me = Context.Owner as Hero;
            var enemies = ObjectManager.GetEntities <Hero>()
                          .Where(x => x.IsVisible && x.IsAlive && x.Team != me.Team && !ExUnit.IsMagicImmune(x) && !x.IsIllusion).ToList();

            if (!Game.IsInGame || Game.IsPaused || Game.IsWatchingGame || enemies.Count == 0 || !Config.DrawingDamageEnabled.Value)
            {
                return;
            }

            foreach (var v in enemies)
            {
                damage[v.Handle] = (float)CalculateDamage(v);
                var useMana = CalculateMana(v);
                //Console.WriteLine("useMana" + useMana);
                var screenPos = HUDInfo.GetHPbarPosition(v);

                if (!OnScreen(v.Position))
                {
                    continue;
                }
                var travelSpeed = R.GetAbilityData("ball_lightning_move_speed", R.Level);
                //var travelTime = me.Distance2D(v) / travelSpeed;
                var distance = me.Distance2D(v);

                var startManaCost = R.GetAbilityData("ball_lightning_initial_mana_base") +
                                    me.MaximumMana / 100 * R.GetAbilityData("ball_lightning_initial_mana_percentage");

                var costPerUnit     = (12 + me.MaximumMana * 0.007) / 100.0;
                var calcEnemyHealth = v.Health <= 0 ? 0 : v.Health - damage[v.Handle];
                var calcMyMana      = useMana >= me.Mana ? 0 : me.Mana - useMana;
                var rManacost       = startManaCost + costPerUnit * Math.Floor(distance / 100) * 100;
                var text1           = v.Health <= damage[v.Handle] ? "✔ Damage:" + Math.Floor(damage[v.Handle]) + "(Easy Kill)"
                    : "✘ Damage:" + (int)Math.Floor(damage[v.Handle]) + "(" + (int)calcEnemyHealth + ")";
                var text2      = me.Mana >= useMana ? "✔ Mana:" + (int)Math.Floor(useMana) + "(" + (int)calcMyMana + ")" : "✘ Mana:" + (int)Math.Floor(useMana) + "(" + (int)calcMyMana + ")";
                var text3      = me.Mana >= rManacost ? "✔ Distance:" + (int)me.Distance2D(v) : "✘ Distance:" + (int)me.Distance2D(v);
                var size       = new Vector2(Config.DrawingDamageSize.Item.GetValue <Slider>().Value, Config.DrawingDamageSize.Item.GetValue <Slider>().Value);
                var position1  = new Vector2(screenPos.X + 65, screenPos.Y + 12);
                var position2  = new Vector2(screenPos.X + 65, screenPos.Y + 24);
                var position3  = new Vector2(screenPos.X + 65, screenPos.Y + 36);
                var fountCount = Config.WeatherItem.Value.SelectedIndex;

                var fountName = Config.WeatherItem.Value.SList;

                if (Drawing.Direct3DDevice9 == null)
                {
                    return;
                }
                Drawing.DrawText(
                    text1, fountName[fountCount],
                    new Vector2(screenPos.X + 64, screenPos.Y + 13),
                    size,
                    Color.Black,
                    FontFlags.GaussianBlur);
                Drawing.DrawText(
                    text1, fountName[fountCount],
                    position1,
                    size,
                    v.Health <= damage[v.Handle] ? Color.LawnGreen : Color.OrangeRed,
                    FontFlags.GaussianBlur);

                Drawing.DrawText(
                    text2, fountName[fountCount],
                    new Vector2(screenPos.X + 64, screenPos.Y + 25),
                    size,
                    Color.Black,
                    FontFlags.GaussianBlur);
                Drawing.DrawText(
                    text2, fountName[fountCount],
                    position2,
                    size,
                    me.Mana >= useMana ? Color.LawnGreen : Color.OrangeRed,
                    FontFlags.GaussianBlur);

                Drawing.DrawText(
                    text3, fountName[fountCount],
                    new Vector2(screenPos.X + 64, screenPos.Y + 37),
                    size,
                    Color.Black,
                    FontFlags.GaussianBlur);
                Drawing.DrawText(
                    text3, fountName[fountCount],
                    position3,
                    size,
                    me.Mana >= rManacost ? Color.LawnGreen : Color.OrangeRed,
                    FontFlags.GaussianBlur);
            }
        }
Пример #15
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            try
            {
                if (Config.Target.Value.SelectedValue.Contains("Lock") && Context.TargetSelector.IsActive &&
                    (!CanExecute || EnemyHero == null || !EnemyHero.IsValid || !EnemyHero.IsAlive))
                {
                    EnemyHero = Context.TargetSelector.Active.GetTargets().FirstOrDefault() as Hero;
                }
                else if (Config.Target.Value.SelectedValue.Contains("Default") && Context.TargetSelector.IsActive)
                {
                    EnemyHero = Context.TargetSelector.Active.GetTargets().FirstOrDefault() as Hero;
                }

                var Silenced   = UnitExtensions.IsSilenced(base.Owner);
                var SliderData = this.Config.UseBlink.Item.GetValue <Slider>().Value;
                var IsInvis    = Ensage.SDK.Extensions.UnitExtensions.IsInvisible(this.Owner);



                if (EnemyHero != null && !EnemyHero.IsInvulnerable())
                {
                    if (!Silenced && this.Config.AbilityToggler.Value.IsEnabled(this.QAbi.Ability.Name) && this.Owner.IsMelee && !IsInvis && this.Owner.IsInAttackRange(EnemyHero, 350) && !this.Owner.IsInRange(EnemyHero, 150))
                    {
                        this.QAbi.Ability.ToggleAbility();
                        await Await.Delay(this.GetAbilityDelay(base.Owner, QAbi), token);
                    }

                    if (!Silenced && this.Config.AbilityToggler.Value.IsEnabled(this.QAbi.Ability.Name) && !IsInvis && this.Owner.IsRanged && this.Owner.IsInRange(EnemyHero, 150))
                    {
                        this.QAbi.Ability.ToggleAbility();
                        await Await.Delay(this.GetAbilityDelay(base.Owner, QAbi), token);
                    }

                    if (!Silenced && !this.Owner.IsInAttackRange(EnemyHero) && !IsInvis && this.Owner.IsRanged)
                    {
                        this.QAbi.Ability.ToggleAbility();
                        await Await.Delay(this.GetAbilityDelay(base.Owner, QAbi), token);
                    }

                    if (this.Blink != null && this.Blink.CanBeCasted && Owner.Distance2D(EnemyHero) <= 1200 + SliderData && !IsInvis && !(this.Owner.Distance2D(EnemyHero) <= 400) && this.Config.ItemToggler2.Value.IsEnabled(this.Blink.Item.Name))
                    {
                        var l        = (this.Owner.Distance2D(EnemyHero) - SliderData) / SliderData;
                        var posA     = this.Owner.Position;
                        var posB     = EnemyHero.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);

                        this.Blink.UseAbility(position);
                        await Await.Delay(Blink.GetCastDelay(position), token);
                    }


                    if (!UnitExtensions.IsMagicImmune(EnemyHero))
                    {
                        if (!Silenced && this.WAbi != null && this.WAbi.CanBeCasted && !IsInvis && this.WAbi.CanHit(EnemyHero) && this.Config.AbilityToggler.Value.IsEnabled(this.WAbi.Ability.Name))
                        {
                            this.WAbi.UseAbility();
                            await Await.Delay(WAbi.GetCastDelay(), token);
                        }

                        if (!Silenced && this.EAbi != null && this.EAbi.CanBeCasted && !IsInvis && this.EAbi.CanHit(EnemyHero) && this.Config.AbilityToggler.Value.IsEnabled(this.EAbi.Ability.Name))
                        {
                            this.EAbi.UseAbility(EnemyHero);
                            await Await.Delay(EAbi.GetCastDelay(), token);
                        }


                        if (!Silenced && this.RAbi != null && this.RAbi.CanBeCasted && !IsInvis && this.Owner.IsAttacking() && this.Config.AbilityToggler.Value.IsEnabled(this.RAbi.Ability.Name))
                        {
                            this.RAbi.UseAbility();
                            await Await.Delay(EAbi.GetCastDelay(), token);
                        }

                        if (this.BloodThorn != null && this.BloodThorn.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && !this.Owner.IsAttacking() && this.Config.ItemToggler.Value.IsEnabled(this.BloodThorn.Item.Name))
                        {
                            this.BloodThorn.UseAbility(EnemyHero);
                            await Await.Delay(BloodThorn.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Medalion1 != null && this.Medalion1.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && !this.Owner.IsAttacking() && this.Config.ItemToggler.Value.IsEnabled(this.Medalion1.Item.Name))
                        {
                            this.Medalion1.UseAbility(EnemyHero);
                            await Await.Delay(Medalion1.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Medallion2 != null && this.Medallion2.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && !this.Owner.IsAttacking() && this.Config.ItemToggler.Value.IsEnabled(this.Medallion2.Item.Name))
                        {
                            this.Medallion2.UseAbility(EnemyHero);
                            await Await.Delay(Medallion2.GetCastDelay(EnemyHero), token);
                        }

                        if (this.SheepStick != null && this.SheepStick.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && this.Config.ItemToggler.Value.IsEnabled(this.SheepStick.Item.Name))
                        {
                            this.SheepStick.UseAbility(EnemyHero);
                            await Await.Delay(SheepStick.GetCastDelay(EnemyHero), token);
                        }

                        if (this.DiffBlade != null && this.DiffBlade.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && this.Config.ItemToggler.Value.IsEnabled(DiffBlade.Item.Name))
                        {
                            this.DiffBlade.UseAbility(EnemyHero);
                            await Await.Delay(DiffBlade.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Orchid != null && this.Orchid.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && this.Config.ItemToggler.Value.IsEnabled(Orchid.Item.Name))
                        {
                            this.Orchid.UseAbility(EnemyHero);
                            await Await.Delay(Orchid.GetCastDelay(EnemyHero), token);
                        }

                        if (this.Mjollnir != null && this.Mjollnir.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && this.Config.ItemToggler2.Value.IsEnabled(Mjollnir.Item.Name))
                        {
                            this.Mjollnir.UseAbility(this.Owner);
                            await Await.Delay(Mjollnir.GetCastDelay(), token);
                        }

                        if (this.Heavens_Halberd != null && this.Heavens_Halberd.CanBeCasted && !IsInvis && this.Owner.IsInAttackRange(EnemyHero) && this.Config.ItemToggler2.Value.IsEnabled(Heavens_Halberd.Item.Name))
                        {
                            this.Heavens_Halberd.UseAbility(EnemyHero);
                            await Await.Delay(Heavens_Halberd.GetCastDelay(), token);
                        }

                        if (this.Invis_Sword != null && this.Invis_Sword.CanBeCasted && !IsInvis && !this.Owner.IsInRange(EnemyHero, 1000) && !this.Owner.IsAttacking() && this.Config.ItemToggler2.Value.IsEnabled(Invis_Sword.Item.Name))
                        {
                            this.Invis_Sword.UseAbility();
                            await Await.Delay(Invis_Sword.GetCastDelay(), token);
                        }

                        if (this.Silver_Edge != null && this.Silver_Edge.CanBeCasted && !IsInvis && !this.Owner.IsInRange(EnemyHero, 1000) && !this.Owner.IsAttacking() && this.Config.ItemToggler2.Value.IsEnabled(Silver_Edge.Item.Name))
                        {
                            this.Silver_Edge.UseAbility();
                            await Await.Delay(Silver_Edge.GetCastDelay(), token);
                        }
                    }

                    if (this.Mask_Of_Madness != null && this.Mask_Of_Madness.CanBeCasted && !IsInvis && this.Config.ItemToggler2.Value.IsEnabled(Mask_Of_Madness.Item.Name))
                    {
                        if (Config.MomUsage.Value.SelectedValue.Contains("Melee Form") && this.Owner.IsMelee && !this.EAbi.CanBeCasted && !this.RAbi.CanBeCasted)
                        {
                            this.Mask_Of_Madness.UseAbility();
                            await Await.Delay(Mask_Of_Madness.GetCastDelay(), token);
                        }
                        else if (Config.MomUsage.Value.SelectedValue.Contains("Ranged Form") && this.Owner.IsRanged && !this.WAbi.CanBeCasted && !this.RAbi.CanBeCasted)
                        {
                            this.Mask_Of_Madness.UseAbility();
                            await Await.Delay(Mask_Of_Madness.GetCastDelay(), token);
                        }
                    }

                    if (EnemyHero != null && (EnemyHero.IsInvulnerable() || UnitExtensions.IsAttackImmune(EnemyHero)))
                    {
                        Orbwalker.Move(Game.MousePosition);
                    }
                    else if (EnemyHero != null)
                    {
                        Orbwalker.OrbwalkTo(EnemyHero);
                    }
                }
                else
                {
                    Orbwalker.Move(Game.MousePosition);
                }
            }
            catch (TaskCanceledException)
            {
                // canceled
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }