Beispiel #1
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            if (!await this.ShouldExecute(token))
            {
                return;
            }

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

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

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

            try
            {
                if ((this.WinterWyvern.BlinkDagger != null) &&
                    (this.WinterWyvern.BlinkDagger.Item.IsValid) && Owner.Distance2D(this.CurrentTarget) <= 1200 + 350 &&
                    !(Owner.Distance2D(this.CurrentTarget) <= 400) &&
                    this.WinterWyvern.BlinkDagger.CanBeCasted && this.WinterWyvern.UseBlink)
                {
                    var l        = (this.Owner.Distance2D(this.CurrentTarget) - 350) / 350;
                    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.WinterWyvern.BlinkDagger.UseAbility(position);
                    await Task.Delay(this.WinterWyvern.BlinkDagger.GetCastDelay(position), token);
                }

                var linkens = this.CurrentTarget.IsLinkensProtected();
                await BreakLinken(token);

                var ulti = this.WinterWyvern.WintersCurse;
                if (ulti.CanBeCasted() &&
                    this.WinterWyvern.HeroestoUlti.Value.IsEnabled(CurrentTarget.Name) &&
                    this.WinterWyvern.NearHeroesCount(this.CurrentTarget) >= this.WinterWyvern.HeroCountToUlti.Value &&
                    this.Owner.Distance2D(this.CurrentTarget) <= this.WinterWyvern.WintersCurse.CastRange &&
                    !this.CurrentTarget.IsStunned())
                {
                    ulti.UseAbility(this.CurrentTarget);
                    await Task.Delay((int)ulti.GetCastDelay(this.Owner, this.CurrentTarget) + 200, token);
                }

                var q = this.WinterWyvern.ArcticBurn;
                if (this.Owner.AghanimState())
                {
                    if (!q.IsToggled && q.CanBeCasted() &&
                        this.Owner.Distance2D(this.CurrentTarget) <=
                        AbilityExtensions.GetAbilitySpecialData(q, "attack_range_bonus") + this.Owner.AttackRange)
                    {
                        q.ToggleAbility();
                        await Task.Delay(50, token);
                    }
                    await Task.Delay(125, token);
                }
                else if (!this.Owner.AghanimState() && q.CanBeCasted() && this.Owner.Distance2D(this.CurrentTarget) <=
                         AbilityExtensions.GetAbilitySpecialData(q, "attack_range_bonus") + this.Owner.AttackRange)
                {
                    q.UseAbility();
                    await Task.Delay(50, token);
                }

                var blast    = this.WinterWyvern.SplinterBlast;
                var target   = this.WinterWyvern.SplinterBlastUnit(this.CurrentTarget);
                var modifier = this.CurrentTarget.HasModifier("modifier_winter_wyvern_winters_curse_aura") ||
                               this.CurrentTarget.HasModifier("modifier_winter_wyvern_winters_curse")
                    ? this.CurrentTarget.Modifiers.FirstOrDefault(x =>
                                                                  x.Name.Contains("modifier_winter_wyvern_winters_curse")) : null;

                if (modifier != null && target != null)
                {
                    if (blast.CanBeCasted() && !this.CurrentTarget.IsMagicImmune() && !target.IsMagicImmune() &&
                        this.Owner.Distance2D(target) <= blast.CastRange &&
                        modifier.RemainingTime <= this.WinterWyvern.GetBlastHitTime(this.CurrentTarget) + (target.Distance2D(this.CurrentTarget) / 650))
                    {
                        blast.UseAbility(target);
                        await Task.Delay((int)blast.GetCastDelay(this.Owner, target), token);
                    }
                }

                else if (modifier == null && target != null &&
                         (this.WinterWyvern.NearHeroesCount(this.CurrentTarget) < this.WinterWyvern.HeroCountToUlti.Value || !this.WinterWyvern.WintersCurse.CanBeCasted()))
                {
                    if (blast.CanBeCasted() && !this.CurrentTarget.IsMagicImmune() && !target.IsMagicImmune() &&
                        this.Owner.Distance2D(target) <= blast.CastRange)
                    {
                        blast.UseAbility(target);
                        await Task.Delay((int)blast.GetCastDelay(this.Owner, target), token);
                    }
                }

                var abyssal = this.WinterWyvern.AbyssalBlade;
                if (abyssal != null && abyssal.CanBeCasted && abyssal.CanHit(CurrentTarget) && !linkens &&
                    this.WinterWyvern.AbyssalBladeHeroes.Value.IsEnabled(CurrentTarget.Name))
                {
                    abyssal.UseAbility(CurrentTarget);
                    await Task.Delay(abyssal.GetCastDelay(), token);
                }

                var manta = this.WinterWyvern.Manta;
                if (manta != null && manta.CanBeCasted && this.Owner.Distance2D(CurrentTarget) <= 200 &&
                    this.WinterWyvern.MantaHeroes.Value.IsEnabled(CurrentTarget.Name))
                {
                    manta.UseAbility();
                    await Task.Delay(manta.GetCastDelay(), token);
                }

                var nullifier = this.WinterWyvern.Nullifier;
                if (nullifier != null && nullifier.CanBeCasted && nullifier.CanHit(CurrentTarget) && !linkens &&
                    this.WinterWyvern.NullifierHeroes.Value.IsEnabled(CurrentTarget.Name))
                {
                    nullifier.UseAbility(CurrentTarget);
                    await Task.Delay(nullifier.GetCastDelay(), token);
                }
            }
            catch (TaskCanceledException)
            {
                // ignore
            }
            catch (Exception e)
            {
                Log.Debug($"{e}");
            }
            this.OrbwalkToTarget();
        }
Beispiel #2
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            if (!await this.ShouldExecute(token) || this.Owner.IsChanneling())
            {
                return;
            }

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

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

            if (this.CurrentTarget != null && this.Owner.HasModifier("modifier_item_silver_edge_windwalk"))
            {
                this.Owner.Attack(this.CurrentTarget);
                await Task.Delay(100, token);
            }

            if ((this.Nevermore.BlinkDagger != null) &&
                (this.Nevermore.BlinkDagger.Item.IsValid) && Owner.Distance2D(this.CurrentTarget) <= 1200 + 350 &&
                !(Owner.Distance2D(this.CurrentTarget) <= 400) &&
                this.Nevermore.BlinkDagger.CanBeCasted && this.Nevermore.UseBlink)
            {
                var l        = (this.Owner.Distance2D(this.CurrentTarget) - 350) / 350;
                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.Nevermore.BlinkDagger.UseAbility(position);
                await Task.Delay(this.Nevermore.BlinkDagger.GetCastDelay(position), token);
            }

            var linkens = this.CurrentTarget.IsLinkensProtected();

            await BreakLinken(token, this.CurrentTarget);

            var veil = this.Nevermore.VeilOfDiscord;

            if (veil != null && veil.CanBeCasted && veil.CanHit(CurrentTarget) &&
                this.Nevermore.VeilOfDiscordHeroes.Value.IsEnabled(CurrentTarget.Name))
            {
                veil.UseAbility(CurrentTarget.Position);
                await Task.Delay(veil.GetCastDelay(), token);
            }

            var sheep = this.Nevermore.Sheepstick;

            if (sheep != null && sheep.CanBeCasted && !linkens &&
                (this.Nevermore.HexHeroes.Value.IsEnabled(this.CurrentTarget.Name)))
            {
                sheep.UseAbility(CurrentTarget);
                await Task.Delay(sheep.GetCastDelay(), token);
            }

            var ethereal = this.Nevermore.EtherealBlade;

            if (ethereal != null && ethereal.CanBeCasted && ethereal.CanHit(CurrentTarget) && !linkens &&
                this.Nevermore.EtherealHeroes.Value.IsEnabled(CurrentTarget.Name))
            {
                ethereal.UseAbility(CurrentTarget);
                await Task.Delay(ethereal.GetCastDelay(this.CurrentTarget), token);
            }

            var dagon = this.Nevermore.Dagon;

            if ((ethereal == null || !ethereal.CanBeCasted) && dagon != null && dagon.CanBeCasted && !linkens &&
                dagon.CanHit(this.CurrentTarget))
            {
                dagon.UseAbility(this.CurrentTarget);
                await Task.Delay(dagon.GetCastDelay(), token);
            }

            var shivas = this.Nevermore.ShivasGuard;

            if (!this.Owner.IsChanneling() && shivas != null && shivas.CanBeCasted && Owner.Distance2D(CurrentTarget) <= 700)
            {
                shivas.UseAbility();
                await Task.Delay(shivas.GetCastDelay(), token);
            }
            var bloodthorn = this.Nevermore.BloodThorn;

            if (bloodthorn != null && bloodthorn.CanBeCasted && bloodthorn.CanHit(CurrentTarget) && !linkens &&
                this.Nevermore.OrchidBloodthornHeroes.Value.IsEnabled(CurrentTarget.Name))
            {
                bloodthorn.UseAbility(CurrentTarget);
                await Task.Delay(bloodthorn.GetCastDelay(), token);
            }
            var orchid = this.Nevermore.Orchid;

            if (orchid != null && orchid.CanBeCasted && orchid.CanHit(CurrentTarget) && !linkens &&
                this.Nevermore.OrchidBloodthornHeroes.Value.IsEnabled(CurrentTarget.Name))
            {
                orchid.UseAbility(CurrentTarget);
                await Task.Delay(orchid.GetCastDelay(), token);
            }
            var atos = this.Nevermore.RodOfAtos;

            if (atos != null && atos.CanBeCasted && atos.CanHit(CurrentTarget) && !linkens &&
                this.Nevermore.AtosHeroes.Value.IsEnabled(CurrentTarget.Name))
            {
                atos.UseAbility(CurrentTarget);
                await Task.Delay(atos.GetCastDelay(), token);
            }
            var halberd = this.Nevermore.HeavensHalberd;

            if (halberd != null && halberd.CanBeCasted && halberd.CanHit(CurrentTarget) && !linkens &&
                this.Nevermore.AtosHeroes.Value.IsEnabled(CurrentTarget.Name))
            {
                halberd.UseAbility(CurrentTarget);
                await Task.Delay(halberd.GetCastDelay(), token);
            }

            try
            {
                // Log.Debug($"{Nevermore.Razes.ToString()}");
                if (Nevermore.Razes != null)
                {
                    foreach (
                        var raze in
                        Nevermore.Razes.OrderBy(
                            x => this.Owner.Distance2D(this.Owner.InFront(AbilityExtensions.GetAbilitySpecialData(x, "shadowraze_range")))))
                    {
                        if (CurrentTarget == null || UnitExtensions.IsMagicImmune(CurrentTarget) || raze == null ||
                            !raze.CanBeCasted() || this.Owner.IsSilenced() ||
                            !this.Nevermore.CanHit(raze, CurrentTarget, Nevermore.GetRazeDelay(CurrentTarget, raze)) || !this.CurrentTarget.IsAlive ||
                            UnitExtensions.IsInvulnerable(this.CurrentTarget))
                        {
                            continue;
                        }

                        /*if (raze == this.Nevermore.RazeLong && this.Owner.Distance2D(this.CurrentTarget) >= 730)
                         * {
                         *  return;
                         * }
                         * else
                         * {*/
                        raze.UseAbility();
                        await Task.Delay((int)raze.GetCastDelay(this.Owner, this.CurrentTarget, true) + 100, token);

                        //}
                    }
                }
            }
            catch (TaskCanceledException)
            {
                // ignore
            }
            catch (Exception e)
            {
                Log.Debug(e);
            }

            if (!this.Nevermore.RazeShort.IsInAbilityPhase && !this.Nevermore.RazeMedium.IsInAbilityPhase &&
                !this.Nevermore.RazeLong.IsInAbilityPhase)
            {
                this.OrbwalkToTarget();
            }
        }