Beispiel #1
0
        public static bool TargetFinder()
        {
            if (Core.Target != null && Core.Target.IsValid && Core.Target.IsAlive)
            {
                if (Core.Target.ClassId == ClassId.CDOTA_Unit_Hero_Phoenix)
                {
                    if (!Core.Target.IsVisible)
                    {
                        var egg =
                            EntityManager <Unit> .Entities.FirstOrDefault(
                                x =>
                                UnitExtensions.IsInRange(x, Core.Target, 150) && x.Name == "npc_dota_phoenix_sun" &&
                                x.IsAlive && x.Team == Core.MainHero.Hero.GetEnemyTeam());

                        if (egg != null)
                        {
                            Core.Target = egg;
                            Printer.Both(
                                $"[TargetFinder] new target: phoenix to egg {Core.Target.Name} | {Core.Target.Handle}");
                        }
                    }
                }

                return(true);
            }

            //modifier_morphling_replicate
            var mousePos = Game.MousePosition;

            Core.Target = EntityManager <Hero> .Entities.Where(x =>
                                                               x.Team != Core.MainHero.Hero.Team && x.IsAlive && x.IsVisible && x.Distance2D(mousePos) <= 500 &&
                                                               (!x.IsIllusion || x.HasModifier("modifier_morphling_replicate")))
                          .OrderBy(x => x.Distance2D(mousePos)).FirstOrDefault();

            //TargetSelector.ClosestToMouse(Core.MainHero.Hero, 500);
            var tempTarget =
                EntityManager <Unit> .Entities.FirstOrDefault(
                    x =>
                    (x.NetworkName == "CDOTA_Unit_SpiritBear" || x.Name == "npc_dota_phoenix_sun") && x.IsAlive &&
                    x.Team == Core.MainHero.Hero.GetEnemyTeam() && x.Distance2D(mousePos) <= 500);

            if (Core.Target != null && tempTarget != null)
            {
                if (Core.Target.Distance2D(mousePos) > tempTarget.Distance2D(mousePos))
                {
                    Core.Target = tempTarget;
                }
            }
            else if (Core.Target == null && tempTarget != null)
            {
                Core.Target = tempTarget;
            }

            if (Core.Target == null)
            {
                return(false);
            }
            Printer.Both($"[TargetFinder] new target: {Core.Target.Name} | {Core.Target.Handle}");
            return(true);
        }
Beispiel #2
0
        public async Task UseAbilities(UnitBase unitBase)
        {
            if (unitBase.Hero.IsInvisible() || unitBase.Hero.Modifiers.Any(x => x.Name.Contains("windwalk")))
            {
                return;
            }
            var flux          = unitBase.Flux;
            var magneticField = unitBase.MagneticField;
            var spark         = unitBase.Spark;

            if (!_multiSleeper.Sleeping(flux) && unitBase.AbilityChecker.IsAbilityEnabled(flux.GetAbilityId()) &&
                flux.CanBeCasted() && flux.CanHit(Core.Target))
            {
                if (Core.Target.IsLinkensProtected() || !MenuManager.SmartFlux || !EntityManager <Unit> .Entities.Any(
                        x =>
                        !x.Equals(Core.Target) && x.Team == Core.Target.Team && x.Name != "npc_dota_thinker" &&
                        x.IsAlive && x.IsVisible &&
                        Ensage.SDK.Extensions.EntityExtensions.Distance2D(x, Core.Target) <= 225))
                {
                    flux.UseAbility(Core.Target);
                    Printer.Both("Flux usages " + flux.GetAbilityDelay());
                    _multiSleeper.Sleep(500, flux);
                    await Task.Delay(flux.GetAbilityDelay(), Core.ComboToken.Token);
                }
            }
            var distance = unitBase.Hero.Distance2D(Core.Target);

            if (!_multiSleeper.Sleeping(magneticField) && magneticField != null &&
                unitBase.AbilityChecker.IsAbilityEnabled(magneticField.GetAbilityId()) && magneticField.CanBeCasted() &&
                !unitBase.Hero.HasModifier("modifier_arc_warden_magnetic_field") && distance <= 600 &&
                Core.Target.IsVisible)
            {
                if (!MenuManager.MagneticField && Core.Target.IsMelee)
                {
                    magneticField.UseAbility(Prediction.InFront(unitBase.Hero, -250));
                }
                else
                {
                    magneticField.UseAbility(Prediction.InFront(unitBase.Hero, 250));
                }
                _multiSleeper.Sleep(500, magneticField);
                Printer.Both("MagneticField usages");
                await Task.Delay(magneticField.GetAbilityDelay(), Core.ComboToken.Token);
            }
            if (!_multiSleeper.Sleeping(spark) && spark != null &&
                unitBase.AbilityChecker.IsAbilityEnabled(spark.GetAbilityId()) && spark.CanBeCasted() &&
                !Prediction.IsTurning(Core.Target) && unitBase.Hero.IsVisibleToEnemies)
            {
                if (UnitExtensions.IsInAttackRange(unitBase.Hero, Core.Target) && MenuManager.SmartSpark)
                {
                    return;
                }
                var delay       = spark.GetAbilityDelay();
                var predVector3 = Prediction.PredictedXYZ(Core.Target, 2000 + delay);
                spark.UseAbility(predVector3);
                _multiSleeper.Sleep(500, spark);
                Printer.Both("spark usages");
                await Task.Delay(spark.GetAbilityDelay(), Core.ComboToken.Token);
            }
        }
Beispiel #3
0
        public virtual async Task DrawingTargetDisplay()
        {
            var e = TargetSelector.Active.GetTargets()
                    .FirstOrDefault(x => !ExUnit.IsInvulnerable(x) && x.IsAlive);

            if (e == null && Effect != null)
            {
                Effect.Dispose();
                Effect = null;
                await Await.Delay(100);
            }
            if (e == null || !e.IsValid || !e.IsAlive)
            {
                return;
            }
            if (Effect == null || !Effect.IsValid)
            {
                Effect = new ParticleEffect(@"particles\ui_mouseactions\range_finder_tower_aoe.vpcf", e);
                Effect.SetControlPoint(2, new Vector3(me.Position.X, me.Position.Y, me.Position.Z));
                Effect.SetControlPoint(6, new Vector3(1, 0, 0));
                Effect.SetControlPoint(7, new Vector3(e.Position.X, e.Position.Y, e.Position.Z));
                await Await.Delay(100);
            }
            else
            {
                Effect.SetControlPoint(2, new Vector3(me.Position.X, me.Position.Y, me.Position.Z));
                Effect.SetControlPoint(6, new Vector3(1, 0, 0));
                Effect.SetControlPoint(7, new Vector3(e.Position.X, e.Position.Y, e.Position.Z));
                await Await.Delay(100);
            }
            await Await.Delay(100);
        }
Beispiel #4
0
        private bool IceWallCanHit(Hero target)
        {
            var myPos    = Me.Owner.NetworkPosition;
            var startPos = myPos + UnitExtensions.Direction(Me.Owner, 200);
            var rotation = Me.Owner.NetworkRotationRad;
            var toLeft   = rotation - Math.PI / 2;
            var toRight  = rotation + Math.PI / 2;

            for (var i = 0; i < 7; i++)
            {
                var pos = startPos + Direction(toLeft, 80 * i);
                if (Ensage.SDK.Extensions.EntityExtensions.IsInRange(target, pos, 50))
                {
                    return(true);
                }
            }
            for (var i = 0; i < 7; i++)
            {
                var pos = startPos + Direction(toRight, 80 * i);
                if (Ensage.SDK.Extensions.EntityExtensions.IsInRange(target, pos, 50))
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #5
0
        protected override void OnActivate()
        {
            // Init everything (menu, grab abilities, etc)
            config = new Config(this);

            this.RemoteMines = UnitExtensions.GetAbilityById(context.Owner, AbilityId.techies_remote_mines);

            this.context.Inventory.Attach(this);

            base.OnActivate();
        }
Beispiel #6
0
        private async Task ExecuteAsync(CancellationToken token)
        {
            try
            {
                if (Game.IsPaused || !Owner.IsValid || !Owner.IsAlive || Owner.IsStunned())
                {
                    await Task.Delay(125, token);

                    return;
                }

                var target = EntityManager <Hero> .Entities.FirstOrDefault(
                    x => x.IsAlive &&
                    (x.Team != this.Owner.Team) &&
                    !x.IsIllusion &&
                    Main.SoulAssumption.CanHit(x) &&
                    Main.SoulAssumption.GetDamage(x) > x.Health);

                if (target != null)
                {
                    if (!UnitExtensions.IsBlockingAbilities(target))
                    {
                        if (Main.SoulAssumption.UseAbility(target))
                        {
                            await Task.Delay(Main.SoulAssumption.GetCastDelay(target) + 20, token);
                        }
                    }
                    else
                    {
                        Config.LinkenHandler.RunAsync();
                        return;
                    }
                }

                await Task.Delay(125, token);
            }
            catch (TaskCanceledException)
            {
                // ignore
            }
            catch (Exception e)
            {
                Main.Log.Error(e);
            }
        }
Beispiel #7
0
        private async Task OnUpdate(CancellationToken token)
        {
            if (Game.IsPaused || !this.Owner.IsAlive)
            {
                await Task.Delay(250, token);

                return;
            }

            // setting walrus kick on OnUpdate so that it can return null if doesn't have aghanim
            // and can properly set skill if has aghanim.
            if (UnitExtensions.HasAghanimsScepter(this.Owner))
            {
                this.WalrusKick = this.Owner.GetAbilityById(AbilityId.tusk_walrus_kick);
            }
            else
            {
                WalrusKick = null;
            }

            if (this.CliffKey.Value.Active)
            {
                var pos = this.Owner.Position;
                if (this.IceShards != null && this.IceShards.CanBeCasted() && !this.Owner.IsChanneling())
                {
                    if (this.Owner.IsMoving)
                    {
                        this.IceShards.UseAbility(this.Owner.InFront(((float)this.Owner.MovementSpeed / 18) + (Game.Ping / 6))); // magic numbers
                        await Task.Delay((int)this.IceShards.GetCastDelay(this.Owner, this.Owner, true), token);
                    }
                    else
                    {
                        this.IceShards.UseAbility(this.Owner.InFront(5));
                        await Task.Delay((int)this.IceShards.GetCastDelay(this.Owner, this.Owner, true), token);
                    }
                }
                await Task.Delay(100, token);
            }
        }
Beispiel #8
0
        private void RazeHitCheck()
        {
            if (this.CurrentTarget == null || !this.CurrentTarget.IsVisible || !Nevermore.PriRaze)
            {
                return;
            }

            if (this.Nevermore.RazeShort.IsInAbilityPhase &&
                !this.Nevermore.CanHit(Nevermore.RazeShort, CurrentTarget,
                                       this.Nevermore.GetRazeDelay(CurrentTarget, Nevermore.RazeShort)) || (UnitExtensions.IsInvulnerable(this.CurrentTarget)))
            {
                this.Owner.Stop();
                this.Owner.MoveToDirection(this.Nevermore.PredictedTargetPosition);
                this.razeUpdateHandler.IsEnabled = false;
                Task.Delay(200);
            }

            if (this.Nevermore.RazeMedium.IsInAbilityPhase &&
                !this.Nevermore.CanHit(Nevermore.RazeMedium, CurrentTarget,
                                       this.Nevermore.GetRazeDelay(CurrentTarget, Nevermore.RazeMedium)) || (UnitExtensions.IsInvulnerable(this.CurrentTarget)))
            {
                this.Owner.Stop();
                this.Owner.MoveToDirection(this.Nevermore.PredictedTargetPosition);
                this.razeUpdateHandler.IsEnabled = false;
                Task.Delay(200);
            }

            if (this.Nevermore.RazeLong.IsInAbilityPhase &&
                !this.Nevermore.CanHit(Nevermore.RazeLong, CurrentTarget,
                                       this.Nevermore.GetRazeDelay(CurrentTarget, Nevermore.RazeLong)) && this.Owner.Distance2D(this.CurrentTarget) <= 730 ||
                (UnitExtensions.IsInvulnerable(this.CurrentTarget)))
            {
                this.Owner.Stop();
                this.Owner.MoveToDirection(this.Nevermore.PredictedTargetPosition);
                this.razeUpdateHandler.IsEnabled = false;
                Task.Delay(200);
            }
        }
Beispiel #9
0
        protected override void OnActivate()
        {
            base.OnActivate();

            this._OpenWondAbility = UnitExtensions.GetAbilityById(this.Owner, AbilityId.life_stealer_open_wounds);
            this._RageAbility     = UnitExtensions.GetAbilityById(this.Owner, AbilityId.life_stealer_rage);
            this.Context.Inventory.Attach(this);

            var factory = this.Menu.Hero.Factory;
            var items   = new List <AbilityId>
            {
                AbilityId.item_medallion_of_courage,
                AbilityId.item_solar_crest,
                AbilityId.item_mjollnir,
                AbilityId.item_abyssal_blade,
                AbilityId.item_diffusal_blade,
                AbilityId.item_blink
            };

            this.Items = factory.Item("Items", new AbilityToggler(items.ToDictionary(x => x.ToString(), x => true)));

            //  this.LSController = UpdateManager.Run(this.OnUpdate);
        }
Beispiel #10
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            if (!await this.ShouldExecute(token))
            {
                return;
            }

            this.MaxTargetRange = this.GenericHero.MaximumTargetDistance.Value;

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

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

            if (UnitExtensions.HasModifier(this.Owner, "modifier_templar_assassin_meld"))
            {
                this.Owner.Attack(this.CurrentTarget);
            }

            try
            {
                if (!this.Owner.IsChanneling() && !UnitExtensions.HasModifier(this.Owner, "modifier_templar_assassin_meld"))
                {
                    this.OrbwalkToTarget();
                }

                if (this.GenericHero.PrioritizeBlink /*&& !this.Owner.IsChanneling()*/)
                {
                    if (!await this.GenericHero.MoveOrBlinkToEnemy(this.CurrentTarget, token))
                    {
                        return;
                    }
                }

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

                if (!this.GenericHero.PrioritizeAbilities)
                {
                    await GenericHero.UseGenericItems(this.CurrentTarget, token);

                    await GenericHero.DisableEnemy(this.CurrentTarget, token);

                    await GenericHero.UseGenericAbilities(this.CurrentTarget, token, 0.5f);

                    await Task.Delay(100, token);
                }
                else
                {
                    await GenericHero.UseGenericAbilities(this.CurrentTarget, token, 0.5f);

                    await Task.Delay(100, token);

                    await GenericHero.UseGenericItems(this.CurrentTarget, token);

                    await GenericHero.DisableEnemy(this.CurrentTarget, token);

                    await Task.Delay(100, token);
                }

                if (!await this.GenericHero.MoveOrBlinkToEnemy(this.CurrentTarget, token))
                {
                    return;
                }
            }
            catch (TaskCanceledException)
            {
                // ignore
            }
            catch (Exception e)
            {
                Log.Debug($"{e}");
            }
        }
        public static void Init()
        {
            var sleeper     = new Sleeper();
            var landLevel   = Core.LandMine.Level;
            var remoteLevel = Core.RemoteMine.Level;
            var aghState    = Core.Me.AghanimState();

            Game.OnUpdate += args =>
            {
                if (sleeper.Sleeping || !MenuManager.IsEnable)
                {
                    return;
                }
                sleeper.Sleep(MenuManager.GetUpdateSpeed);
                // ReSharper disable once RedundantCheckBeforeAssignment
                if (!Core.ExtraDamageFromSuicide)
                {
                    var techiesExtraDamage = Core.Me.GetAbilityById(AbilityId.special_bonus_unique_techies);
                    if (techiesExtraDamage.Level > 0)
                    {
                        Core.ExtraDamageFromSuicide = true;
                    }
                }
                if (landLevel != Core.LandMine.Level)
                {
                    landLevel = Core.LandMine.Level;
                    foreach (var bomb in Core.Bombs.Where(x => !x.IsRemoteMine))
                    {
                        bomb.UpdateDamage();
                    }
                }
                // ReSharper disable once RedundantCheckBeforeAssignment

                /*if (remoteLevel != Core.RemoteMine.Level)
                 * {
                 *  remoteLevel = Core.RemoteMine.Level;
                 *  foreach (var bomb in Core.Bombs.Where(x => x.IsRemoteMine))
                 *  {
                 *      bomb.UpdateDamage();
                 *  }
                 * }*/
                if (!aghState && Core.Me.AghanimState())
                {
                    aghState = true;
                    foreach (var bomb in Core.Bombs.Where(x => x.IsRemoteMine))
                    {
                        bomb.OnUltimateScepter();
                    }
                }
                var landDamage    = Core.GetLandMineDamage;
                var remoteDamage  = Core.GetRemoteMineDamage;
                var suicideDamage = Core.GetSuicideDamage + (Core.ExtraDamageFromSuicide ? 400 : 0);
                var spellAmp      = UnitExtensions.GetSpellAmplification(Core.Me);
                foreach (var hero in Heroes.GetByTeam(Core.EnemyTeam))
                {
                    var heroCont = DamageContainers.Find(x => x.Hero.Equals(hero));
                    if (heroCont == null)
                    {
                        heroCont = new HeroDamageContainer(hero);
                        DamageContainers.Add(heroCont);
                    }
                    var heroHealth              = hero.Health + hero.HealthRegeneration;
                    var maxHeroHealth           = hero.MaximumHealth;
                    var reduction               = Core.LandMine.GetDamageReduction(hero);
                    var healthPerTickFromLand   = DamageHelpers.GetSpellDamage(landDamage, 0, reduction);
                    var healthPerTickFromRemote = DamageHelpers.GetSpellDamage(remoteDamage, 0, reduction);
                    var healthPerSucide         = DamageHelpers.GetSpellDamage(suicideDamage, spellAmp, reduction);
                    //Utils.Printer.Print($"to {hero.GetRealName()} -> {suicideDamage} [res: {reduction}] [amp: {spellAmp}] [defDmg: {healthPerSucide}] [extra400: {Core.ExtraDamageFromSuicide}]");
                    heroCont.CurrentLandMines   = (int)Math.Ceiling(heroHealth / healthPerTickFromLand);
                    heroCont.MaxLandMines       = (int)Math.Ceiling(maxHeroHealth / healthPerTickFromLand);
                    heroCont.CurrentRemoteMines = (int)Math.Ceiling(heroHealth / healthPerTickFromRemote);
                    heroCont.MaxRemoteMines     = (int)Math.Ceiling(maxHeroHealth / healthPerTickFromRemote);
                    heroCont.HealthAfterSuicide = heroHealth - healthPerSucide;
                    heroCont.CanKillWithSuicide = heroCont.HealthAfterSuicide <= 0;
                }
            };
        }
Beispiel #12
0
        private void PlayerOnOnExecuteOrder(Player player, ExecuteOrderEventArgs args)
        {
            /*if (!args.IsPlayerInput)
             *  return;*/
            if (!args.Entities.Any(x => x.Equals(Me)))
            {
                return;
            }
            if (_config.ComboKey || DisableKey)
            {
                return;
            }
            if (Me.IsInvisible() || UnitExtensions.HasAnyModifiers(Me, "modifier_invoker_ghost_walk_self",
                                                                   "modifier_rune_invis", "modifier_invisible"))
            {
                return;
            }
            var order = args.OrderId;

            if (args.IsPlayerInput)
            {
                if (order == OrderId.Ability)
                {
                    var abilityId = args.Ability.Id;
                    if (abilityId == AbilityId.invoker_quas || abilityId == AbilityId.invoker_wex ||
                        abilityId == AbilityId.invoker_exort || abilityId == AbilityId.invoker_invoke ||
                        abilityId == AbilityId.invoker_ghost_walk)
                    {
                        Sleeper.Sleep(1500);
                    }
                }
            }

            if (Sleeper.Sleeping || Me.IsSilenced())
            {
                return;
            }
            if (order == OrderId.AttackLocation || order == OrderId.AttackTarget)
            {
                if (_multySleeper.Sleeping("attack"))
                {
                    return;
                }
                _multySleeper.Sleep(250, "attack");
                var activeSphereForAttack =
                    Me.GetAbilityById(Buttons.First(x => x.IsActive && x.Type == TypeEnum.Attack).Id);
                if (activeSphereForAttack.CanBeCasted())
                {
                    if (CheckForModifiers)
                    {
                        var countOfModifiers =
                            Me.Modifiers.Count(x => x.Name == $"modifier_{activeSphereForAttack.Id}_instance");
                        if (countOfModifiers >= 3)
                        {
                            return;
                        }
                        for (var i = countOfModifiers; i < 3; i++)
                        {
                            activeSphereForAttack.UseAbility();
                        }
                        InChanging.Sleep(250);
                    }
                    else
                    {
                        InChanging.Sleep(250);
                        activeSphereForAttack.UseAbility();
                        activeSphereForAttack.UseAbility();
                        activeSphereForAttack.UseAbility();
                    }
                }
            }
            else if (order == OrderId.MoveLocation || order == OrderId.MoveTarget)
            {
                if (args.Target != null && args.Target.NetworkName == ClassId.CDOTA_BaseNPC_Healer.ToString())
                {
                    return;
                }

                if (_multySleeper.Sleeping("move"))
                {
                    return;
                }
                _multySleeper.Sleep(250, "move");

                var activeSphereForMove =
                    Me.GetAbilityById(Buttons.First(x => x.IsActive && x.Type == TypeEnum.Move).Id);
                if (VerySmartSpheres)
                {
                    if (UnitExtensions.HealthPercent(Me) <= HpSlider / 100f)
                    {
                        if (_config.Main.AbilitiesInCombo.Quas.Level > 0)
                        {
                            activeSphereForMove = _config.Main.AbilitiesInCombo.Quas;
                        }
                        else
                        {
                            activeSphereForMove = _config.Main.AbilitiesInCombo.Wex;
                        }
                    }
                    else
                    {
                        if (_config.Main.AbilitiesInCombo.Wex.Level > 0)
                        {
                            activeSphereForMove = _config.Main.AbilitiesInCombo.Wex;
                        }
                        else
                        {
                            activeSphereForMove = _config.Main.AbilitiesInCombo.Quas;
                        }
                    }

                    foreach (var typeButton in Buttons.Where(x => x.Type == TypeEnum.Move))
                    {
                        typeButton.IsActive = typeButton.Id == activeSphereForMove.Id;
                    }
                }

                if (activeSphereForMove.CanBeCasted())
                {
                    if (CheckForModifiers)
                    {
                        var countOfModifiers =
                            Me.Modifiers.Count(x => x.Name == $"modifier_{activeSphereForMove.Id}_instance");
                        if (countOfModifiers >= 3)
                        {
                            return;
                        }
                        for (var i = countOfModifiers; i < 3; i++)
                        {
                            activeSphereForMove.UseAbility();
                        }
                        InChanging.Sleep(250);
                    }
                    else
                    {
                        InChanging.Sleep(250);
                        activeSphereForMove.UseAbility();
                        activeSphereForMove.UseAbility();
                        activeSphereForMove.UseAbility();
                    }
                }
            }

            if (!args.IsPlayerInput)
            {
                if (!InChanging.Sleeping && order == OrderId.Ability)
                {
                    var abilityId = args.Ability.Id;
                    if (abilityId == AbilityId.invoker_quas || abilityId == AbilityId.invoker_wex ||
                        abilityId == AbilityId.invoker_exort || abilityId == AbilityId.invoker_invoke ||
                        abilityId == AbilityId.invoker_ghost_walk)
                    {
                        _multySleeper.Sleep(250, "attack");
                        _multySleeper.Sleep(250, "move");
                        //InvokerCrappahilationPaid.Log.Warn($"On Sleep");
                    }
                }
            }
        }
Beispiel #13
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            if (!await this.ShouldExecute(token))
            {
                return;
            }

            var blink = this.EmberSpirit.BlinkDagger;

            if (blink != null)
            {
                this.MaxTargetRange = Math.Max(this.MaxTargetRange, blink.CastRange + 1200 * 1.3f);
            }
            else if (blink == null)
            {
                this.MaxTargetRange = Math.Max(this.MaxTargetRange, 2000);
            }

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

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

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

                var ulti      = this.EmberSpirit.FireRemnant;
                var activator = this.EmberSpirit.ActiveFireRemnant;
                var mod       = this.Owner.FindModifier("modifier_ember_spirit_fire_remnant_charge_counter");
                var stacks    = mod?.StackCount;
                var dagger    = this.EmberSpirit.BlinkDagger;

                var w          = this.EmberSpirit.Fist;
                var q          = this.EmberSpirit.SearingChains;
                var prediction =
                    this.EmberSpirit.Context.Prediction.GetPrediction(
                        this.EmberSpirit.FistPredictionInput(this.CurrentTarget));

                if (dagger != null && dagger.CanBeCasted && this.Owner.Distance2D(this.CurrentTarget) <= dagger.CastRange + w.CastRange &&
                    this.Owner.Distance2D(this.CurrentTarget) >= 350)
                {
                    dagger.UseAbility(this.CurrentTarget.NetworkPosition.Extend(this.CurrentTarget.NetworkPosition, 1200));
                    await Task.Delay(dagger.GetCastDelay(this.CurrentTarget.NetworkPosition), token);
                }

                var veil = this.EmberSpirit.VeilOfDiscord;
                if (veil != null && veil.CanBeCasted && veil.CanHit(this.CurrentTarget))
                {
                    veil.UseAbility(this.CurrentTarget.NetworkPosition);
                    await Task.Delay(veil.GetCastDelay(this.CurrentTarget.NetworkPosition), token);
                }

                if (
                    this.Owner.HasModifiers(new[]
                {
                    "modifier_ember_spirit_sleight_of_fist_caster",
                    "modifier_ember_spirit_fire_remnant"
                }, false))
                {
                    if (!this.Owner.IsSilenced() && q.CanBeCasted && q.CanHit(this.CurrentTarget) &&
                        !this.CurrentTarget.IsMagicImmune() && this.Owner.Distance2D(this.CurrentTarget) <= 350)
                    {
                        q.UseAbility();
                        await Task.Delay(125, token);
                    }
                    return;
                }

                if (w.CanBeCasted && this.Owner.Distance2D(prediction.CastPosition) <= 1400 && !UnitExtensions.IsEthereal(this.CurrentTarget))
                {
                    w.UseAbility(prediction.CastPosition);
                    await Task.Delay(1, token);
                }

                if (stacks - this.EmberSpirit.LeaveSpirits.Value.Value > 0 && this.CurrentTarget.IsRooted())
                {
                    for (int i = 0; i < stacks.Value - this.EmberSpirit.LeaveSpirits.Value.Value; i++)
                    {
                        ulti.UseAbility(this.CurrentTarget.NetworkPosition);
                        await Task.Delay(ulti.GetCastDelay(), token);
                    }
                }
                else
                {
                    var anySpirits = EntityManager <Entity> .Entities.Any(
                        x => x.Name == "npc_dota_ember_spirit_remnant" && x.Distance2D(this.CurrentTarget) <= 450);

                    if (anySpirits)
                    {
                        await Task.Delay(150, token);

                        activator.UseAbility(this.CurrentTarget.NetworkPosition);
                        await Task.Delay(activator.GetCastDelay(), token);
                    }
                }

                if (q.CanBeCasted && this.Owner.Distance2D(this.CurrentTarget) <= 350)
                {
                    q.UseAbility();
                    await Task.Delay(125, token);
                }

                var e = this.EmberSpirit.FlameGuard;
                if (e.CanBeCasted && this.Owner.Distance2D(this.CurrentTarget) <= 300)
                {
                    e.UseAbility();
                    await Task.Delay(e.GetCastDelay(), token);
                }

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

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

                var hex = this.EmberSpirit.Sheepstick;
                if (hex != null && hex.CanBeCasted && hex.CanHit(CurrentTarget) && !linkens &&
                    this.EmberSpirit.HexHeroes.Value.IsEnabled(CurrentTarget.Name))
                {
                    hex.UseAbility(CurrentTarget);
                    await Task.Delay(hex.GetCastDelay(), token);
                }

                var shivas = this.EmberSpirit.ShivasGuard;
                if (shivas != null && shivas.CanBeCasted && this.Owner.Distance2D(this.CurrentTarget) <= 400)
                {
                    shivas.UseAbility();
                    await Task.Delay(shivas.GetCastDelay(), token);
                }

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

                var nullifier = this.EmberSpirit.Nullifier;
                if (nullifier != null && nullifier.CanBeCasted && nullifier.CanHit(CurrentTarget) && !linkens &&
                    this.EmberSpirit.NullifierHeroes.Value.IsEnabled(CurrentTarget.Name))
                {
                    nullifier.UseAbility(CurrentTarget);
                    await Task.Delay(nullifier.GetCastDelay(), token);
                }

                var mjollnir = this.EmberSpirit.Mjollnir;
                if (mjollnir != null && mjollnir.CanBeCasted && this.Owner.Distance2D(this.CurrentTarget) <= 400)
                {
                    mjollnir.UseAbility(this.Owner);
                    await Task.Delay(mjollnir.GetCastDelay(), token);
                }
            }
            catch (TaskCanceledException)
            {
                // ignore
            }
            catch (Exception e)
            {
                Log.Debug($"{e}");
            }
            this.OrbwalkToTarget();
        }
Beispiel #14
0
        public async Task <bool> UseAbility(Hero target, CancellationToken token)
        {
            var comboModifiers = target.HasModifiers(new[]
            {
                "modifier_obsidian_destroyer_astral_imprisonment_prison", "modifier_eul_cyclone",
                "modifier_shadow_demon_disruption", "modifier_invoker_tornado"
            }, false);
            float time;
            var   isStunned = target.IsStunned(out time);

            switch (Ability.Id)
            {
            case AbilityId.invoker_cold_snap:
                if (target.IsMagicImmune())
                {
                    return(false);
                }
                Ability.UseAbility(target);
                break;

            case AbilityId.invoker_ghost_walk:
                Ability.UseAbility();
                break;

            case AbilityId.invoker_tornado:
                if (comboModifiers && isStunned)
                {
                    return(true);
                }
                if (!Ability.CastSkillShot(target))
                {
                    return(false);
                }
                AfterTornado.Sleep((float)Ability.GetHitDelay(target) * 1000);
                break;

            case AbilityId.invoker_emp:
                if (AfterTornado.Sleeping)
                {
                    return(false);
                }
                Ability.UseAbility(target.Position);
                break;

            case AbilityId.invoker_alacrity:
                Ability.UseAbility(Ability.Owner as Hero);
                break;

            case AbilityId.invoker_chaos_meteor:
                if (AfterTornado.Sleeping)
                {
                    return(false);
                }
                if (comboModifiers && isStunned)
                {
                    var timing = 1.3f;
                    if (time <= timing + Game.Ping / 1000)
                    {
                        Ability.UseAbility(target.Position);
                    }
                    else
                    {
                        await Task.Delay((int)((time - timing + Game.Ping / 1000) * 1000), token);

                        Ability.UseAbility(target.Position);
                    }
                }
                else
                {
                    if (target.HasModifier("modifier_invoker_cold_snap"))
                    {
                        Ability.UseAbility(target.Position);
                    }
                    else if (!Ability.CastSkillShot(target))
                    {
                        return(false);
                    }
                }
                break;

            case AbilityId.invoker_sun_strike:
                if (AfterTornado.Sleeping)
                {
                    return(false);
                }
                if (comboModifiers && isStunned)
                {
                    var timing = 1.7f;
                    if (time <= timing + Game.Ping / 1000)
                    {
                        Ability.UseAbility(target.Position);
                    }
                    else
                    {
                        var timeForCast = timing + Me.Config.SsExtraDelay / 100f + Game.Ping / 1000;
                        var delayTime   = (int)((time - timeForCast) * 1000);
                        Log.Warn($"[SS] delay time: {delayTime} rem time: {time} Time for cast: {timeForCast}");
                        await Task.Delay(delayTime, token);

                        Ability.UseAbility(target.Position);
                    }
                }
                else
                {
                    if (!Ability.CastSkillShot(target))
                    {
                        return(false);
                    }
                }
                break;

            case AbilityId.invoker_forge_spirit:
                Ability.UseAbility();
                break;

            case AbilityId.invoker_ice_wall:
                if (Me.Config.AutoIceWall)
                {
                    var angle = UnitExtensions.FindRotationAngle(ObjectManager.LocalHero,
                                                                 target.NetworkPosition);
                    //if (Ensage.SDK.Extensions.EntityExtensions.Distance2D(target, Ability.Owner) > 300 || angle>0.99)
                    while (Ensage.SDK.Extensions.EntityExtensions.Distance2D(target, Ability.Owner) > 300 ||
                           angle > 0.99)
                    {
                        angle = UnitExtensions.FindRotationAngle(ObjectManager.LocalHero,
                                                                 target.NetworkPosition);
                        var hero = Ability.Owner as Hero;
                        hero?.Move(target.NetworkPosition);
                        Log.Debug(
                            $"Dist: [{Ensage.SDK.Extensions.EntityExtensions.Distance2D(target, Ability.Owner)}] angle: [{angle}]");
                        await Task.Delay(100, token);
                    }
                    Ability.UseAbility();
                }
                else
                {
                    if (IceWallCanHit(target))
                    {
                        Me.BlockerSleeper.Sleep(300);
                        Me.Owner.Stop();
                        //Me.Owner.Move(Me.Owner.NetworkPosition + UnitExtensions.Direction(Me.Owner, 10));
                        //await Task.Delay(100, token);
                        Ability.UseAbility();
                        await Task.Delay(300, token);
                    }
                    else
                    {
                        return(false);
                    }
                }
                break;

            case AbilityId.invoker_deafening_blast:
                if (target.IsMagicImmune())
                {
                    return(false);
                }
                if (!Ability.CastSkillShot(target))
                {
                    return(false);
                }
                break;

            case AbilityId.item_cyclone:
                if (comboModifiers && isStunned)
                {
                    return(true);
                }
                Ability.UseAbility(target);
                await WaitForCombo(target);

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(true);
        }
Beispiel #15
0
        public async Task <bool> UseItems(UnitBase unitBase)
        {
            if (!unitBase.Hero.CanUseItems())
            {
                return(true);
            }
            if (unitBase is Tempest)
            {
                var ability = unitBase.Hero.GetItemById(ItemId.item_sphere);
                if (ability != null && ability.CanBeCasted() && ability.CanHit(Core.MainHero.Hero))
                {
                    ability.UseAbility(Core.MainHero.Hero);
                    var delayTime = ability.GetAbilityDelay();
                    Printer.Both(
                        $"[{unitBase}][Linken] To main hero-> ({delayTime})");
                    await Await.Delay(delayTime, Core.ComboToken.Token);
                }
                if (OrderManager.CurrentOrder is DefaultCombo)
                {
                    ability = unitBase.Hero.GetItemById(ItemId.item_solar_crest) ??
                              unitBase.Hero.GetItemById(ItemId.item_medallion_of_courage);
                    if (ability != null && ability.CanBeCasted() && ability.CanHit(Core.MainHero.Hero))
                    {
                        ability.UseAbility(Core.MainHero.Hero);
                        var delayTime = ability.GetAbilityDelay();
                        Printer.Both(
                            $"[{unitBase}][Solar] To main hero-> ({delayTime})");
                        await Await.Delay(delayTime, Core.ComboToken.Token);
                    }
                }
            }

            var counter = 0;

            foreach (var ability in unitBase.GetItems())
            {
                if (!ability.CanBeCasted(Core.Target))
                {
                    Printer.Log($"cant use {ability.Name} to {Core.Target.Name}");
                    continue;
                }
                var canHit = (ability.Id == AbilityId.item_blink
                                 ? unitBase.Hero.Distance2D(Core.Target) - MenuManager.GetBlinkExtraRange <
                              (MenuManager.BlinkUseExtraRange ? ability.TravelDistance() : 50000)
                                 : ability.CanHit(Core.Target)) || _afterBlink.Sleeping;
                var isNoTarget = ability.IsAbilityBehavior(AbilityBehavior.NoTarget) &&
                                 (unitBase.Hero.Distance2D(Core.Target) <= 750 || ability.IsInvis());
                if (!canHit && !isNoTarget)
                {
                    Printer.Both($"{ability.Name} cant hit target!");
                    continue;
                }

                /*if (isNoTarget && unitBase.Hero.Distance2D(Core.Target)>=800)
                 *  continue;*/
                // if (canHit || _afterBlink)
                if (_afterInvis.Sleeping || unitBase.Hero.IsInvisible())
                {
                    Printer.Both($"{ability.Name} cant cast, cuz under invis!");
                    continue;
                }
                var delayTime = 0;
                if (ability.IsAbilityBehavior(AbilityBehavior.NoTarget))
                {
                    if (ability.IsInvis())
                    {
                        var blink = unitBase.Hero.GetItemById(ItemId.item_blink);
                        if (blink != null && blink.CanBeCasted())
                        {
                            if (MenuManager.SilverEdgeBlocker)
                            {
                                counter++;
                                continue;
                            }
                        }
                        _afterInvis.Sleep(500);
                    }
                    if (ability.Id == AbilityId.item_satanic && UnitExtensions.HealthPercent(unitBase.Hero) > 0.7f)
                    {
                        counter++;
                        continue;
                    }
                    ability.UseAbility();
                }
                else if (ability.IsAbilityBehavior(AbilityBehavior.UnitTarget))
                {
                    if (ability.Id == AbilityId.item_hurricane_pike)
                    {
                        ability.UseAbility(unitBase.Hero);
                    }
                    else if (ability.TargetTeamType == TargetTeamType.Enemy || ability.TargetTeamType == TargetTeamType.All ||
                             ability.TargetTeamType == TargetTeamType.Custom || ability.TargetTeamType == (TargetTeamType)7)
                    {
                        var amWithAghUnderLinken = Core.Target.ClassId == ClassId.CDOTA_Unit_Hero_AntiMage &&
                                                   Core.Target.GetItemById(ItemId.item_ultimate_scepter) != null &&
                                                   Core.Target.GetAbilityById(AbilityId.antimage_spell_shield)
                                                   .CanBeCasted();
                        var isDisable = ability.IsDisable();
                        if ((Core.Target.IsLinkensProtected() || amWithAghUnderLinken) &&
                            (isDisable || ability.IsDagon() || ability.Id == AbilityId.item_ethereal_blade || ability.Id == AbilityId.item_nullifier))
                        {
                            counter++;
                            continue;
                        }
                        if (ability.Id == AbilityId.item_ethereal_blade &&
                            unitBase.GetItems()
                            .Any(
                                x =>
                                (x.Id == AbilityId.item_dagon || x.Id == AbilityId.item_dagon_2 ||
                                 x.Id == AbilityId.item_dagon_3 || x.Id == AbilityId.item_dagon_4 ||
                                 x.Id == AbilityId.item_dagon_5) && x.CanBeCasted()))
                        {
                            ability.UseAbility(Core.Target);
                            await Core.Target.WaitGainModifierAsync("modifier_item_ethereal_blade_ethereal", 2,
                                                                    Core.ComboToken.Token);
                        }
                        else
                        {
                            var slarkMod =
                                Core.Target.HasModifiers(
                                    new[] { "modifier_slark_dark_pact", "modifier_slark_dark_pact_pulses" }, false);
                            var lotusMid = Core.Target.HasModifier("modifier_item_lotus_orb_active");
                            if ((slarkMod || lotusMid) && isDisable && ability.Id != AbilityId.item_sheepstick)
                            {
                                counter++;
                                continue;
                            }
                            if (ability.Id == AbilityId.item_sheepstick && GlobalHexSleeper.Sleeping)
                            {
                                counter++;
                                continue;
                            }
                            if ((ability.Id == AbilityId.item_orchid ||
                                 ability.Id == AbilityId.item_bloodthorn) && GlobalOrchidSleeper.Sleeping)
                            {
                                counter++;
                                continue;
                            }
                            if (isDisable)
                            {
                                if (Core.Target.IsUnitState(UnitState.Stunned) ||
                                    Core.Target.IsUnitState(UnitState.Hexed))
                                {
                                    var time = Ensage.Common.Utils.DisableDuration(Core.Target);
                                    if (time >= 0.35f + Game.Ping / 1000)
                                    {
                                        counter++;
                                        continue;
                                    }
                                }
                                ability.UseAbility(Core.Target);
                                GlobalHexSleeper.Sleep(800);
                            }
                            else
                            {
                                if (ability.IsSilence()) //TODO: check only for real silence
                                {
                                    if (
                                        Core.Target.HasModifiers(
                                            new[] { "modifier_orchid_malevolence_debuff", "modifier_bloodthorn_debuff" },
                                            false)) //(Core.Target.IsSilenced())
                                    {
                                        counter++;
                                        continue;
                                    }
                                    GlobalOrchidSleeper.Sleep(800);
                                }
                                ability.UseAbility(Core.Target);
                            }
                        }
                    }
                    else
                    {
                        ability.UseAbility(unitBase.Hero);
                    }
                }
                else
                {
                    if (ability.Id == AbilityId.item_blink)
                    {
                        _afterBlink.Sleep(1000);
                        var pos       = (Core.Target.NetworkPosition - unitBase.Hero.NetworkPosition).Normalized();
                        var firstDist = Core.Target.NetworkPosition.Distance2D(unitBase.Hero.NetworkPosition);
                        pos *= firstDist <= ability.TravelDistance() ? 50 : MenuManager.GetBlinkExtraRange;
                        pos  = Core.Target.NetworkPosition - pos;
                        if (pos.Distance2D(unitBase.Hero.NetworkPosition) < MenuManager.GetBlinkMinRange)
                        {
                            counter++;
                            continue;
                        }
                        ability.UseAbility(pos);
                        await Task.Delay((int)MenuManager.GetBlinkExtraDelay, Core.ComboToken.Token);
                    }
                    else
                    {
                        ability.UseAbility(Core.Target.Position);
                    }
                }
                delayTime = ability.GetAbilityDelay(Core.Target);
                Printer.Both(
                    $"[{unitBase}][item] {ability.Name} ({delayTime}) [After Blink: {_afterBlink.Sleeping}] [{ability.TravelDistance()}]");
                await Await.Delay(delayTime, Core.ComboToken.Token);

                //await Task.Delay(150, Core.ComboToken.Token);
            }
            Printer.Log("now we can use abilities -> " + (unitBase.GetItems().Count(x => x.CanBeCasted()) <= counter));
            return(unitBase.GetItems().Count(x => x.CanBeCasted()) <= counter);
        }
Beispiel #16
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();
            }
        }
Beispiel #17
0
        public override async Task ExecuteAsync(CancellationToken token)
        {
            if (!await this.ShouldExecute(token))
            {
                return;
            }

            if ((this.CurrentTarget == null) || !this.CurrentTarget.IsVisible)
            {
                this.hero.Context.Orbwalker.Active.OrbwalkTo(null);
                return;
            }
            var items = this.hero.Items.Value;
            //---------------------Ability----------------------
            var Rage    = this.hero._RageAbility;
            var openwnd = this.hero._OpenWondAbility;
            //------------------ITEM ABILITY-----------------
            var diff     = this.hero.DiffBlade;
            var abysal   = this.hero.AbyssalBlade;
            var mlonir   = this.hero.Mjollnir;
            var blink    = this.hero.BlinkDagger;
            var solar    = this.hero.SolarCrest;
            var medalion = this.hero.Medalion;
            var armlet   = this.hero.Armlet;
            //-----------------Function--------------------
            var blinkReaady   = (blink != null) && items.IsEnabled(blink.Ability.Name) && blink.CanBeCasted;
            var duffusalReady = (diff != null) && items.IsEnabled(diff.Ability.Name) && diff.CanBeCasted;
            var mjonirReady   = (mlonir != null) && items.IsEnabled(mlonir.Ability.Name) && mlonir.CanBeCasted;
            var AbisalReady   = (abysal != null) && items.IsEnabled(abysal.Ability.Name) && abysal.CanBeCasted;
            var solarReady    = (solar != null) && items.IsEnabled(solar.Ability.Name) && solar.CanBeCasted;
            var medalionReady = (medalion != null) && items.IsEnabled(medalion.Ability.Name) && medalion.CanBeCasted;
            //-------------------------------------------------------------------------------------------------
            var targetDistance = this.Owner.Distance2D(this.CurrentTarget);
            var attackRange    = UnitExtensions.AttackRange(this.CurrentTarget) + 100;

            if (blinkReaady && !this.CurrentTarget.IsIllusion && blink.CanBeCasted && blink.CanHit(this.CurrentTarget) && (((targetDistance > attackRange))))
            {
                blink.UseAbility(this.CurrentTarget.Position);
                await Task.Delay(blink.GetCastDelay(this.CurrentTarget.Position), token);
            }

            if ((openwnd != null) && openwnd.CanBeCasted() && openwnd.CanHit(this.CurrentTarget))
            {
                openwnd.UseAbility(this.CurrentTarget);
                await Task.Delay(this.GetAbilityDelay(base.CurrentTarget, openwnd), token);
            }

            if ((Rage != null) && base.Owner.IsAttacking() && Rage.CanBeCasted())
            {
                Rage.UseAbility();
                await Task.Delay(this.GetAbilityDelay(base.Owner, Rage), token);
            }

            if (mjonirReady && mlonir.CanBeCasted && mlonir.CanHit(this.CurrentTarget))
            {
                mlonir.UseAbility(this.Owner);
                await Await.Delay(mlonir.GetCastDelay(), token);
            }

            if (!this.CurrentTarget.IsAttacking() && !this.CurrentTarget.IsIllusion)
            {
                if (AbisalReady && abysal.CanBeCasted && abysal.CanHit(this.CurrentTarget))
                {
                    abysal.UseAbility(this.CurrentTarget);
                    await Task.Delay(abysal.GetCastDelay(this.CurrentTarget), token);
                }
                if (duffusalReady && diff.CanBeCasted && this.Owner.IsVisible && diff.CanHit(this.CurrentTarget))
                {
                    diff.UseAbility(this.CurrentTarget);
                    await Await.Delay(diff.GetCastDelay(this.CurrentTarget), token);
                }
                if (solarReady && solar.CanBeCasted && this.Owner.IsVisible && solar.CanHit(this.CurrentTarget))
                {
                    solar.UseAbility(this.CurrentTarget);
                    await Await.Delay(solar.GetCastDelay(this.CurrentTarget), token);
                }
                if (medalionReady && medalion.CanBeCasted && this.Owner.IsVisible && medalion.CanHit(this.CurrentTarget))
                {
                    medalion.UseAbility(this.CurrentTarget);
                    await Await.Delay(medalion.GetCastDelay(this.CurrentTarget), token);
                }
            }

            if ((armlet != null) && armlet.CanBeCasted && armlet.CanHit(this.CurrentTarget))
            {
                armlet.Enabled = false;
            }
            else
            {
                armlet.Enabled = true;
            }
            await Task.Delay(armlet.GetCastDelay(), token);


            /*  var isInvisible = this.Owner.IsInvisible() || (this.Owner.InvisiblityLevel > 0);
             * if ((armlet != null) && !isInvisible)
             * {
             *    var enemiesNear = EntityManager<Hero>.Entities.Any(
             *        x => x.IsVisible
             *        && x.IsAlive
             *        && !x.IsIllusion
             *        && (x.Team != this.Owner.Team)
             *        && (x.Distance2D(this.Owner) < 1000));
             *    if ((enemiesNear !=null) )
             *    {
             *        armlet.Enabled = false;
             *    }
             *    else
             *    {
             *        armlet.Enabled = true;
             *    }
             *
             *    await Task.Delay(armlet.GetCastDelay(), token);
             * }*/

            this.OrbwalkToTarget();
        }
Beispiel #18
0
        public async Task <bool> UseAbility(Hero target, CancellationToken token)
        {
            var comboModifiers = target.HasModifiers(new[]
            {
                "modifier_obsidian_destroyer_astral_imprisonment_prison", "modifier_eul_cyclone",
                "modifier_shadow_demon_disruption", "modifier_invoker_tornado"
            }, false);
            float time;
            var   isStunned = target.IsStunned(out time);

            switch (Ability.Id)
            {
            case AbilityId.invoker_cold_snap:
                if (target.IsMagicImmune())
                {
                    return(false);
                }
                Ability.UseAbility(target);
                break;

            case AbilityId.invoker_ghost_walk:
                Ability.UseAbility();
                break;

            case AbilityId.invoker_tornado:
                if (comboModifiers && isStunned)
                {
                    return(true);
                }
                if (!Ability.CastSkillShot(target))
                {
                    return(false);
                }
                AfterTornado.Sleep((float)Ability.GetHitDelay(target) * 1000);
                break;

            case AbilityId.invoker_emp:
                if (AfterTornado.Sleeping)
                {
                    return(false);
                }
                Ability.UseAbility(target.Position);
                break;

            case AbilityId.invoker_alacrity:
                Ability.UseAbility(Ability.Owner as Hero);
                break;

            case AbilityId.invoker_chaos_meteor:
                if (AfterTornado.Sleeping)
                {
                    return(false);
                }
                if (comboModifiers && isStunned)
                {
                    var timing = 1.3f;
                    if (time <= timing + Game.Ping / 1000)
                    {
                        Ability.UseAbility(target.Position);
                    }
                    else
                    {
                        await Task.Delay((int)((time - timing + Game.Ping / 1000) * 1000), token);

                        Ability.UseAbility(target.Position);
                    }
                }
                else
                {
                    //var blastModifier = target.FindModifier("modifier_invoker_deafening_blast_knockback");
                    //if (blastModifier == null)
                    //{
                    if (
                        target.HasModifiers(
                            new[] { "modifier_invoker_cold_snap", "modifier_invoker_deafening_blast_knockback" },
                            false))
                    {
                        Ability.UseAbility(target.NetworkPosition);
                    }
                    else if (!Ability.CastSkillShot(target))
                    {
                        return(false);
                    }

                    /*}
                     * else
                     * {
                     *  var remTime = blastModifier.RemainingTime;
                     *  var newPost
                     * }*/
                }
                break;

            case AbilityId.invoker_sun_strike:
                if (AfterTornado.Sleeping)
                {
                    return(false);
                }
                if (comboModifiers && isStunned)
                {
                    var cataclysm = Me.Config.Cataclysm &&
                                    Me.Owner.GetAbilityById(AbilityId.special_bonus_unique_invoker_4)?.Level > 0;
                    var timing = cataclysm ? 1.73f : 1.7f;
                    if (time <= timing + Game.Ping / 1000)
                    {
                        if (cataclysm)
                        {
                            Ability.UseAbility(Me.Owner);
                        }
                        else
                        {
                            Ability.UseAbility(target.Position);
                        }
                    }
                    else
                    {
                        var timeForCast = timing + Me.Config.SsExtraDelay / 100f + Game.Ping / 1000;
                        var delayTime   = (int)((time - timeForCast) * 1000);
                        Log.Warn($"[SS] delay time: {delayTime} rem time: {time} Time for cast: {timeForCast}");
                        await Task.Delay(Math.Max(delayTime, 30), token);

                        Log.Debug($"[SS] after delay -> try to use ability. cataclysm -> {cataclysm}");
                        if (cataclysm)
                        {
                            Ability.UseAbility(Me.Owner);
                        }
                        else
                        {
                            Ability.UseAbility(target.Position);
                        }
                    }
                }
                else
                {
                    var cataclysm = Me.Config.Cataclysm &&
                                    Me.Owner.GetAbilityById(AbilityId.special_bonus_unique_invoker_4)?.Level > 0;
                    if (cataclysm)
                    {
                        Ability.UseAbility(Me.Owner);
                        Log.Debug($"[SS] cataclysm casted");
                    }
                    else
                    {
                        if (!Ability.CastSkillShot(target))
                        {
                            Log.Debug($"[SS] SkillShot not casted");
                            return(false);
                        }
                        Log.Debug($"[SS] SkillShot casted");
                    }
                }
                break;

            case AbilityId.invoker_forge_spirit:
                var forges =
                    EntityManager <Unit> .Entities.Any(
                        x =>
                        x.IsValid && x.Team == Me.Owner.Team && x.ClassId == ClassId.CDOTA_BaseNPC_Invoker_Forged_Spirit &&
                        UnitExtensions.HealthPercent(x) > .55f);

                if (!forges)
                {
                    Ability.UseAbility();
                }
                break;

            case AbilityId.invoker_ice_wall:
                if (Me.Config.AutoIceWall)
                {
                    var angle = UnitExtensions.FindRotationAngle(ObjectManager.LocalHero,
                                                                 target.NetworkPosition);
                    //if (Ensage.SDK.Extensions.EntityExtensions.Distance2D(target, Ability.Owner) > 300 || angle>0.99)
                    while (Ensage.SDK.Extensions.EntityExtensions.Distance2D(target, Ability.Owner) > 300 ||
                           angle > 0.99)
                    {
                        angle = UnitExtensions.FindRotationAngle(ObjectManager.LocalHero,
                                                                 target.NetworkPosition);
                        var hero = Ability.Owner as Hero;
                        hero?.Move(target.NetworkPosition);
                        Log.Debug(
                            $"Dist: [{Ensage.SDK.Extensions.EntityExtensions.Distance2D(target, Ability.Owner)}] angle: [{angle}]");
                        await Task.Delay(100, token);
                    }
                    Ability.UseAbility();
                }
                else
                {
                    if (IceWallCanHit(target))
                    {
                        Me.BlockerSleeper.Sleep(300);
                        Me.Owner.Stop();
                        //Me.Owner.Move(Me.Owner.NetworkPosition + UnitExtensions.Direction(Me.Owner, 10));
                        //await Task.Delay(100, token);
                        Ability.UseAbility();
                        await Task.Delay(300, token);
                    }
                    else
                    {
                        return(false);
                    }
                }
                break;

            case AbilityId.invoker_deafening_blast:
                if (target.IsMagicImmune())
                {
                    return(false);
                }
                if (!Ability.CastSkillShot(target))
                {
                    return(false);
                }
                break;

            case AbilityId.item_cyclone:
                Log.Warn($"Eul -> start (modifiers: {comboModifiers}) (isStunned: {isStunned})");
                if (comboModifiers && isStunned)
                {
                    Log.Warn($"Eul -> Under shit");
                    return(true);
                }
                Ability.UseAbility(target);
                Log.Warn($"Eul -> casted ({target.HeroId}). w8 for modifier");
                await WaitForCombo(target, Ability);

                Log.Warn($"Eul -> modifier was found");
                break;

            case AbilityId.item_refresher:
                Ability.UseAbility();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            return(true);
        }
Beispiel #19
0
        public static void OnUpdate(EventArgs args)
        {
            if (!MenuManager.IsEnable)
            {
                return;
            }
            if (!MenuManager.IsAutoDetonation)
            {
                return;
            }
            var spellAmp = 0;//UnitExtensions.GetSpellAmplification(Me);

            foreach (var hero in Heroes.GetByTeam(EnemyTeam))
            {
                if (HeroSleeper.Sleeping(hero) || !hero.IsAlive || !hero.IsVisible || !hero.CanDie(MenuManager.CheckForAegis))
                {
                    continue;
                }
                if (hero.HasModifiers(
                        new[]
                {
                    "modifier_shredder_timber_chain", "modifier_storm_spirit_ball_lightning",
                    "modifier_item_aeon_disk_buff", "modifier_ember_spirit_sleight_of_fist_caster",
                    "modifier_ember_spirit_sleight_of_fist_caster_invulnerability"
                },
                        false))
                {
                    continue;
                }
                var listForDetonation = new List <BombManager>();
                var heroHealth        = hero.Health + hero.HealthRegeneration;
                var rainrop           = hero.GetItemById(ItemId.item_infused_raindrop);
                if (rainrop != null && rainrop.CanBeCasted())
                {
                    var extraHealth = 90f;//rainrop.GetAbilityData("magic_damage_block");
                    heroHealth += extraHealth;
                }
                //Console.WriteLine($"[{hero.GetRealName()}] Total Life -> {heroHealth}");
                var   reduction          = RemoteMine.GetDamageReduction(hero);
                var   refraction         = hero.FindModifier("modifier_templar_assassin_refraction_absorb");
                var   blockCount         = refraction?.StackCount;
                var   aeon               = UnitExtensions.GetItemById(hero, AbilityId.item_aeon_disk);
                var   breakHealthForAeon = hero.MaximumHealth * .8f;
                float treshold           = 0;
                var   heroid             = hero.HeroId;
                if (heroid == HeroId.npc_dota_hero_medusa)
                {
                    var shield = hero.GetAbilityById(AbilityId.medusa_mana_shield);
                    if (shield.IsToggled)
                    {
                        treshold = shield.GetAbilityData("damage_per_mana");
                    }
                }
                var startManaCalc = hero.Mana;
                foreach (var element in Bombs)
                {
                    if (element.IsRemoteMine && element.Active)
                    {
                        if (element.CanHit(hero))
                        {
                            //Printer.Print($"BombDelay: {element.GetBombDelay(hero)} MaxDelay: {MenuManager.GetBombDelay}");
                            if (MenuManager.IsEnableDelayBlow &&
                                !(element.GetBombDelay(hero) >= MenuManager.GetBombDelay))
                            {
                                continue;
                            }
                            if (blockCount > 0)
                            {
                                blockCount--;
                            }
                            else
                            {
                                var damage = DamageHelpers.GetSpellDamage(element.Damage, spellAmp, reduction);
                                if (heroid == HeroId.npc_dota_hero_medusa)
                                {
                                    BombDamageManager.CalcDamageForDusa(ref damage, ref startManaCalc, treshold);
                                }
                                heroHealth -= damage;
                            }
                            listForDetonation.Add(element);
                            var aeuoByPass = aeon != null && aeon.CanBeCasted() && heroHealth < breakHealthForAeon;

                            if (heroHealth <= 0 || aeuoByPass)
                            {
                                if (MenuManager.IsCameraMovingEnable)
                                {
                                    if (MenuManager.CameraMovingType == 0)
                                    {
                                        var heroPos         = hero.Position;
                                        var consolePosition = $"{heroPos.X} {heroPos.Y}";
                                        Game.ExecuteCommand($"dota_camera_set_lookatpos {consolePosition}");
                                    }
                                    else
                                    {
                                        var pos = hero.Position.WorldToMinimap();
                                        SetCursorPos((int)pos.X, (int)pos.Y);
                                        UpdateManager.BeginInvoke(() =>
                                        {
                                            mouse_event((int)MouseEvent.MouseeventfLeftdown, 0, 0, 0, 0);
                                            mouse_event((int)MouseEvent.MouseeventfLeftup, 0, 0, 0, 0);
                                        }, 100);
                                    }
                                }
                                HeroSleeper.Sleep(300 + listForDetonation.Count * 30, hero);
                                if (MenuManager.IsSuperDetonate)
                                {
                                    foreach (var manager in Bombs.Where(x => x.IsRemoteMine && x.Active && x.CanHit(hero)))
                                    {
                                        manager.Detonate();
                                    }
                                }
                                else
                                {
                                    foreach (var manager in listForDetonation)
                                    {
                                        manager.Detonate();
                                    }
                                }

                                break;
                            }
                        }
                    }
                }
            }
        }