示例#1
0
        private static bool CheckTarget(Unit enemy, bool doubleOwnage = false)
        {
            if (enemy.IsIllusion || !enemy.IsValidTarget(dagon.GetCastRange(), true, hero.NetworkPosition))
            {
                return(false);
            }

            if (enemy.IsLinkensProtected() || enemy.IsMagicImmune())
            {
                return(false);
            }

            if (!enemy.CanDie() || enemy.Modifiers.Any(x => IgnoreModifiers.Any(x.Name.Equals)))
            {
                return(false);
            }

            var damage = AbilityDamage.CalculateDamage(dagon, hero, enemy);

            if (doubleOwnage)
            {
                damage *= 2;
            }

            return(enemy.Health < damage);
        }
示例#2
0
        public override bool CanBeCasted(EvadableAbility ability, Unit unit)
        {
            if (Sleeper.Sleeping || !Ability.CanBeCasted() || !Hero.CanUseItems() || Hero.CanReincarnate())
            {
                return(false);
            }

            Debugger.WriteLine("// * Bloodstone calculations");

            var damageSource = ability.AbilityOwner;

            if (ability.IsDisable)
            {
                var totalDamage = (damageSource.MinimumDamage + damageSource.BonusDamage)
                                  * damageSource.SecondsPerAttack * 2;
                var totalMana = damageSource.Mana;

                foreach (var spell in damageSource.Spellbook.Spells.Where(x => x.Level > 0 && x.Cooldown <= 0))
                {
                    if (totalMana >= spell.ManaCost)
                    {
                        try
                        {
                            totalDamage += (int)Math.Round(AbilityDamage.CalculateDamage(spell, damageSource, unit));
                            totalMana   -= spell.ManaCost;
                        }
                        catch (Exception)
                        {
                        }
                    }
                }

                Debugger.WriteLine("// * Incoming damage: " + totalDamage + " from: " + damageSource.GetName());
                Debugger.WriteLine("// * HP left: " + unit.Health);

                return(unit.Health <= totalDamage);
            }

            float damage;

            try
            {
                damage = (int)Math.Round(AbilityDamage.CalculateDamage(ability.Ability, ability.AbilityOwner, Hero));
            }
            catch (Exception)
            {
                return(false);
            }

            if (damage > 850)
            {
                Debugger.WriteLine("// * Damage calculations probably incorrect // " + damage + " // " + ability.Name);
                damage = 350;
            }

            Debugger.WriteLine("// * Incoming damage: " + damage + " from: " + ability.Name);
            Debugger.WriteLine("// * HP left: " + unit.Health);

            return(unit.Health <= damage);
        }
示例#3
0
        public bool ShouldSpendGold(EvadableAbility ability)
        {
            if (sleeper.Sleeping)
            {
                return(false);
            }

            float damage;

            try
            {
                damage = (int)Math.Round(AbilityDamage.CalculateDamage(ability.Ability, ability.AbilityOwner, Hero));
            }
            catch (Exception)
            {
                return(false);
            }

            if (damage > 850)
            {
                Debugger.WriteLine("// * Damage calculations probably incorrect // " + damage + " // " + ability.Name);
                damage = 350;
            }

            //  Debugger.WriteLine("// * Incoming damage: " + damage + " from: " + ability.Name);
            //  Debugger.WriteLine("// * HP left: " + Hero.Health);

            return(Hero.Health <= damage);
        }
示例#4
0
        public override bool CanBeCasted(EvadableAbility ability, Unit unit)
        {
            if (Sleeper.Sleeping)
            {
                return(false);
            }

            var damageSource = ability.AbilityOwner;

            if (ability.IsDisable)
            {
                var totalDamage = (damageSource.MinimumDamage + damageSource.BonusDamage)
                                  * damageSource.SecondsPerAttack * 2;
                var totalMana = damageSource.Mana;

                foreach (var spell in damageSource.Spellbook.Spells.Where(x => x.Level > 0 && x.Cooldown <= 0))
                {
                    if (totalMana >= spell.ManaCost)
                    {
                        totalDamage += (int)Math.Round(AbilityDamage.CalculateDamage(spell, damageSource, unit));
                        totalMana   -= spell.ManaCost;
                    }
                }

                return(unit.Health <= totalDamage);
            }

            var damage = (int)Math.Round(AbilityDamage.CalculateDamage(ability.Ability, damageSource, unit));

            return(unit.Health <= damage);
        }
示例#5
0
        public override bool CanBeCasted(EvadableAbility ability, Unit unit)
        {
            if (Sleeper.Sleeping || !Hero.CanUseItems())
            {
                return(false);
            }

            if (armletEnabled && AffectedByDot())
            {
                return(false);
            }

            var damageSource = ability.AbilityOwner;
            var health       = (int)unit.Health;

            if (armletEnabled)
            {
                health = Math.Max(health - ArmletHpGain, 1);
            }

            //if (ability.IsDisable)
            //{
            //    var totalDamage = (damageSource.MinimumDamage + damageSource.BonusDamage)
            //                      * damageSource.AttacksPerSecond * 2;
            //    var totalMana = damageSource.Mana;

            //    foreach (var spell in damageSource.Spellbook.Spells.Where(x => x.Level > 0 && x.Cooldown <= 0))
            //    {
            //        if (totalMana >= spell.ManaCost)
            //        {
            //            totalDamage += (int)Math.Round(AbilityDamage.CalculateDamage(spell, damageSource, unit));
            //            totalMana -= spell.ManaCost;
            //        }
            //    }

            //    return health <= totalDamage;
            //}

            var damage = 150d;

            try
            {
                damage = Math.Round(AbilityDamage.CalculateDamage(ability.Ability, damageSource, unit));
            }
            catch
            {
                Console.WriteLine("[Evader] Failed to calculate damage for: " + ability.Name);
            }

            if (HpRestored(ability.GetRemainingTime(Hero)) + health < damage)
            {
                return(false);
            }

            return(health <= damage);
        }
示例#6
0
 /// <summary>
 ///     The load.
 /// </summary>
 private static void Load()
 {
     AbilityDatabase.Init();
     AbilityDamage.Init();
     AbilityExtensions.Init();
     HeroExtensions.Init();
     UnitExtensions.Init();
     Names.Init();
     Abilities.Init();
 }
示例#7
0
        /// <summary>
        ///     The kill steal.
        /// </summary>
        /// <param name="hero">
        ///     The hero.
        /// </param>
        /// <param name="minHealth">
        ///     The min health.
        /// </param>
        /// <returns>
        ///     The <see cref="bool" />.
        /// </returns>
        public bool KillSteal(Unit hero, float minHealth)
        {
            if (!hero.IsAlive || !this.CanUseOn(hero) || !(hero.Health > minHealth) ||
                !(AbilityDamage.CalculateDamage(this.ability, Variables.Hero, hero) >= hero.Health) || !hero.CanDie())
            {
                return(false);
            }

            this.UseOn(hero);
            return(true);
        }
示例#8
0
        public override float CalculateDamage(Hero source, Unit target)
        {
            var damage = AbilityDamage.CalculateDamage(Ability, source, target);

            if (target is Tower)
            {
                damage *= towerDamageReduction;
            }

            return((float)Math.Round(damage));
        }
示例#9
0
        public bool ShouldReturn(Hero hero, Target enemy, bool doubleChakramDamage)
        {
            var damage = AbilityDamage.CalculateDamage(Ability, hero, enemy.Hero);

            if (!doubleChakramDamage)
            {
                damage /= 2;
            }

            return(!Sleeper.Sleeping && CanReturn && enemy.IsValid() &&
                   (!Damaging(enemy) && enemy.FindAngle(Position) > 0.5 || damage >= enemy.Health));
        }
示例#10
0
        private async Task OnUpdate(CancellationToken token)
        {
            //List<Hero> enemies = new List<Hero> ();
            //List<Unit> greenbombsnearby = new List<Unit> ();
            //greenbombsnearby.Clear ();
            //enemies.Clear ();

            if (config.EnableCheat)
            {
                greenbombsnearby = new List <Unit>();
                if (config.techiesRampage.RemoteMines != null)
                {
                    enemies = ObjectManager.GetEntities <Hero> ().Where(x => (x.Team != main.Team)).ToList();
                    if (enemies.Count > 0)
                    {
                        foreach (Hero enemy in enemies)
                        {
                            int   bombsneeded  = 0;
                            float damage       = 0.0f;
                            int   bombscounter = 0;
                            damage = AbilityDamage.CalculateDamage(config.techiesRampage.RemoteMines, context.Owner, enemy as Unit, 0, 0, enemy.MagicDamageResist, enemy.Health);
                            //damage = getDamage(enemy);
                            greenbombsnearby = ObjectManager.GetEntities <Unit> ().Where(x => x.IsInRange(enemy, 400) && x.IsAlive && x.Name == "npc_dota_techies_remote_mine" && x.Team == main.Team && x.IsControllableByPlayer(ObjectManager.LocalPlayer)).ToList();
                            bombsneeded      = 0;
                            float damageneeded = 0;
                            while (greenbombsnearby.Count > 0 && damageneeded < enemy.Health)
                            {
                                damageneeded += damage;
                                bombsneeded++;
                            }

                            if (greenbombsnearby.Count > 0 && greenbombsnearby.Count >= bombsneeded)
                            {
                                foreach (Unit bomb in greenbombsnearby)
                                {
                                    if (bombscounter < bombsneeded)
                                    {
                                        Ability selfdetonate = UnitExtensions.GetAbilityById(bomb, AbilityId.techies_remote_mines_self_detonate);
                                        if (selfdetonate != null)
                                        {
                                            selfdetonate.UseAbility();
                                            bombscounter++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            await Task.Delay(25, token);
        }
        private static void GameOnOnUpdate(EventArgs args)
        {
            if (!Checker.IsActive())
            {
                return;
            }
            if (!IsEnable)
            {
                return;
            }
            if (_sleeper.Sleeping)
            {
                return;
            }
            _sleeper.Sleep(500);
            InSys = InSys.Where(x => x != null && x.IsValid).ToList();
            var randomEnemy = Manager.HeroManager.GetEnemyViableHeroes().FirstOrDefault(x => !x.IsMagicImmune());

            if (randomEnemy == null || !randomEnemy.IsValid)
            {
                return;
            }
            foreach (
                var spell in
                Members.MyHero.Spellbook.Spells.Where(
                    x =>
                    !x.IsAbilityBehavior(AbilityBehavior.Passive) && !InSys.Contains(x) &&
                    (x.GetDamage(0) > 0 || WhiteList.Contains(x.Name) || AbilityDamage.CalculateDamage(x, Members.MyHero, randomEnemy) > 0)))
            {
                InSys.Add(spell);
                AddToCalcMenu(spell.StoredName());
                Log.Debug($"dmgCalc.ability.new [{spell.Name}] [{spell.GetDamage(0)}]");
            }
            try
            {
                var items = Manager.HeroManager.GetItemList(Members.MyHero);
                items =
                    items.Where(
                        x =>
                        !InSys.Contains(x) && AbilityDamage.CalculateDamage(x, Members.MyHero, randomEnemy) > 0 || x.GetDamage(0) > 0)
                    .ToList();
                foreach (var spell in items)
                {
                    InSys.Add(spell);
                    AddToCalcMenu(spell.StoredName());
                    Log.Debug($"dmgCalc.item.new [{spell.Name}]");
                }
            }
            catch (Exception)
            {
                //
            }
        }
示例#12
0
 /// <summary>
 ///     The load.
 /// </summary>
 private static void Init()
 {
     AbilityDatabase.Init();
     AbilityDamage.Init();
     AbilityExtensions.Init();
     HeroExtensions.Init();
     UnitExtensions.Init();
     Names.Init();
     Abilities.Init();
     Calculations.Init();
     EntityExtensions.Init();
     Utils.Sleeps = new Dictionary <string, double>();
     NotifiedSubscribers.Clear();
 }
示例#13
0
 /// <summary>
 ///     The load.
 /// </summary>
 private static void Load()
 {
     AbilityDatabase.Init();
     AbilityDamage.Init();
     AbilityExtensions.Init();
     HeroExtensions.Init();
     UnitExtensions.Init();
     Names.Init();
     Abilities.Init();
     Calculations.Init();
     EntityExtensions.Init();
     Orbwalking.Events_OnLoad(null, null);
     Utils.Sleeps = new Dictionary <string, double>();
 }
示例#14
0
        private static void Drawing_OnDraw(EventArgs args)
        {
            if (!Checker.IsActive())
            {
                return;
            }
            if (!IsEnable)
            {
                return;
            }
            if (InSys == null || InSys.Count == 0)
            {
                return;
            }
            var haveEb = InSys.Any(x => x.StoredName() == "item_ethereal_blade" && x.CanBeCasted());

            foreach (var v in Manager.HeroManager.GetEnemyViableHeroes())
            {
                try
                {
                    var pos = HUDInfo.GetHPbarPosition(v);
                    if (pos.IsZero)
                    {
                        continue;
                    }
                    var myDmg = InSys.Where(x => x.CanBeCasted())
                                .Sum(
                        x =>
                        AbilityDamage.CalculateDamage(x, Members.MyHero, v,
                                                      minusMagicResistancePerc: haveEb ? 40 : 0));
                    var healthAfterShit = (int)(v.Health - myDmg);
                    var size            = HUDInfo.GetHpBarSizeY();
                    var text            = $"{healthAfterShit} ({myDmg})";
                    var textSize        = Drawing.MeasureText(text, "Arial",
                                                              new Vector2((float)(size * 1.5), 500), FontFlags.AntiAlias);
                    var textPos = pos + new Vector2(HUDInfo.GetHPBarSizeX() + 4, 0);
                    Drawing.DrawText(
                        text,
                        textPos,
                        new Vector2(textSize.Y, 0),
                        new Color(R, G, B, 255),
                        FontFlags.AntiAlias | FontFlags.StrikeOut);
                }
                catch (Exception)
                {
                    Printer.Print($"[DamageCalculation]: {v.StoredName()}");
                }
            }
        }
示例#15
0
        private static void GameOnOnUpdate(EventArgs args)
        {
            if (!Checker.IsActive())
            {
                return;
            }
            if (!IsEnable)
            {
                return;
            }
            if (_sleeper.Sleeping)
            {
                return;
            }
            _sleeper.Sleep(500);
            InSys = InSys.Where(x => x != null && x.IsValid).ToList();
            var randomEnemy = Manager.HeroManager.GetEnemyViableHeroes().FirstOrDefault();

            if (randomEnemy == null || !randomEnemy.IsValid)
            {
                return;
            }
            foreach (
                var spell in
                Members.MyHero.Spellbook.Spells.Where(
                    x =>
                    !x.IsAbilityBehavior(AbilityBehavior.Passive) && !InSys.Contains(x) && x.Level > 0 &&
                    AbilityDamage.CalculateDamage(x, Members.MyHero, randomEnemy) > 0))
            {
                InSys.Add(spell);
            }
            try
            {
                var items = Manager.HeroManager.GetItemList(Members.MyHero);
                items =
                    items.Where(
                        x =>
                        !InSys.Contains(x) && AbilityDamage.CalculateDamage(x, Members.MyHero, randomEnemy) > 0)
                    .ToList();
                foreach (var spell in items)
                {
                    InSys.Add(spell);
                }
            }
            catch (Exception)
            {
                //
            }
        }
示例#16
0
        public static void OnUpdate(EventArgs args)
        {
            if (!MenuManager.AimIsActive || Updater.Sleeping || MenuManager.ComboIsActive)
            {
                return;
            }
            var target =
                Heroes.GetByTeam(Me.GetEnemyTeam())
                .FirstOrDefault(
                    x =>
                    x.IsAlive && x.IsVisible && x.IsValidRazeTarget() &&
                    (!MenuManager.AimKillStealOnly ||
                     AbilityDamage.CalculateDamage(Core.RazeLow, Core.Me, x) > x.Health + x.HealthRegeneration));

            if (target != null)
            {
                if (!KillStealer.Sleeping && Core.Razes.Any(x => x.CanBeCasted() && x.CanHit(target, x.GetAbilityDelay() + 50, false)) && !Core.Razes.Any(y => y.IsInAbilityPhase))
                {
                    /*var mePos = Me.Position;
                     * var targetPos = Prediction.PredictedXYZ(Target, 550);//Target.Position;
                     * var angle = Me.FindAngleBetween(targetPos, true);
                     * var point = new Vector3(
                     *  (float)
                     *      (mePos.X +
                     *       100 *
                     *       Math.Cos(angle)),
                     *  (float)
                     *      (mePos.Y +
                     *       100 *
                     *       Math.Sin(angle)),
                     *  Target.Position.Z);
                     * Me.Move(point);*/
                    Me.Attack(target);
                    KillStealer.Sleep(350);
                }
                if (Helper.RazeAimCaster(Core.RazeLow, target))
                {
                    Updater.Sleep(1000);
                }
                else if (Helper.RazeAimCaster(Core.RazeNormal, target))
                {
                    Updater.Sleep(1000);
                }
                else if (Helper.RazeAimCaster(Core.RazeHigh, target))
                {
                    Updater.Sleep(1000);
                }
            }
        }
示例#17
0
        public override float CalculateDamage(Hero source, Unit target)
        {
            var damage = AbilityDamage.CalculateDamage(Ability, source, target);

            if (target is Tower)
            {
                damage *= towerDamageReduction;
            }
            else if (grow?.Level >= 1)
            {
                damage *= owner.AghanimState() ? tossBonusDamageScepter[grow.Level - 1] : tossBonusDamage[grow.Level - 1];
            }

            return((float)Math.Round(damage));
        }
示例#18
0
        /// <summary>
        ///     The kill steal.
        /// </summary>
        /// <param name="minHealth">
        ///     The min Health.
        /// </param>
        /// <returns>
        ///     The <see cref="bool" />.
        /// </returns>
        public bool KillSteal(float minHealth)
        {
            foreach (var hero in
                     Heroes.GetByTeam(Variables.EnemyTeam)
                     .Where(
                         hero =>
                         hero.IsValid && hero.IsVisible && hero.IsAlive && this.CanUseOn(hero) && hero.Health > minHealth &&
                         AbilityDamage.CalculateDamage(this.ability, Variables.Hero, hero) >= hero.Health &&
                         hero.CanDie()))
            {
                this.UseOn(hero);
                return(true);
            }

            return(false);
        }
示例#19
0
        public override bool CanBeCasted(EvadableAbility ability, Unit unit)
        {
            if (Sleeper.Sleeping || !Ability.CanBeCasted())
            {
                return(false);
            }

            Debugger.WriteLine("// * Bloodstone calculations");

            var damageSource = ability.AbilityOwner;

            if (ability.IsDisable)
            {
                var totalDamage = (damageSource.MinimumDamage + damageSource.BonusDamage)
                                  * damageSource.SecondsPerAttack * 2;
                var totalMana = damageSource.Mana;

                foreach (var spell in damageSource.Spellbook.Spells.Where(x => x.Level > 0 && x.Cooldown <= 0))
                {
                    if (totalMana >= spell.ManaCost)
                    {
                        totalDamage += (int)Math.Round(AbilityDamage.CalculateDamage(spell, damageSource, unit));
                        totalMana   -= spell.ManaCost;
                    }
                }

                Debugger.WriteLine("// * Incoming damage: " + totalDamage + " from: " + damageSource.GetName());
                Debugger.WriteLine("// * HP left: " + unit.Health);

                return(unit.Health <= totalDamage);
            }

            var damage = (int)Math.Round(AbilityDamage.CalculateDamage(ability.Ability, damageSource, unit));

            Debugger.WriteLine("// * Incoming damage: " + damage + " from: " + ability.Name);
            Debugger.WriteLine("// * HP left: " + unit.Health);

            return(unit.Health <= damage);
        }
示例#20
0
        private async Task OnUpdate2(CancellationToken token)
        {
            if (config.techiesRampage.ForceStaff != null && config.EnableCheat)
            {
                List <Hero> enemies = ObjectManager.GetEntities <Hero> ().Where(x => (x.Team != main.Team) && x.IsVisible && x.IsInRange(context.Owner, config.techiesRampage.ForceStaff.CastRange, true)).ToList();
                if (enemies.Count > 0)
                {
                    foreach (Hero enemy in enemies)
                    {
                        Vector3 pos = FindVector(enemy.Position, enemy.Rotation, config.techiesRampage.ForceStaff.PushLength);

                        int   bombsneeded = 0;
                        float damage      = 0.0f;
                        damage = AbilityDamage.CalculateDamage(config.techiesRampage.RemoteMines, context.Owner, enemy as Unit, 0, 0, enemy.MagicDamageResist, enemy.Health);
                        //damage = getDamage(enemy);
                        greenbombsnearby = ObjectManager.GetEntities <Unit> ().Where(x => pos.Distance(x.Position) <= 400 && x.IsAlive && x.Name == "npc_dota_techies_remote_mine" && x.Team == main.Team && x.IsControllableByPlayer(ObjectManager.LocalPlayer)).ToList();

                        float damageneeded = 0;

                        while (greenbombsnearby.Count > 0 && damageneeded < enemy.Health)
                        {
                            damageneeded += damage;
                            bombsneeded++;
                        }

                        if (greenbombsnearby.Count > 0 && greenbombsnearby.Count >= bombsneeded && config.techiesRampage.ForceStaff.CanBeCasted)
                        {
                            config.techiesRampage.ForceStaff.UseAbility(enemy);
                        }
                    }
                }


                count = enemies.Count;
            }
            await Task.Delay(25, token);
        }
示例#21
0
        public static void UpdateDamage(Hero[] enemyHeroes, Hero[] allyHeroes)
        {
            if (!Utils.SleepCheck("GankDamage.Update"))
            {
                return;
            }

            if (!OnUpdateChecks.CanUpdate() || !MainMenu.GankDamageMenu.Item("enableGankDamage").GetValue <bool>())
            {
                return;
            }

            enemies = enemyHeroes;
            allies  = allyHeroes;
            Utils.Sleep(1000, "GankDamage.Update");
            if (MainMenu.GankDamageMenu.Item("enableGankDamageEnemies").GetValue <bool>())
            {
                foreach (var enemyHero in enemyHeroes)
                {
                    var hero     = enemyHero;
                    var heroName = NameManager.Name(hero);
                    if (!IncomingDamages.ContainsKey(heroName))
                    {
                        IncomingDamages.Add(heroName, 0);
                    }

                    var tempDmg = 0f;
                    foreach (var allyHero in
                             allyHeroes.Where(
                                 x =>
                                 AllyHeroes.AbilityDictionary.ContainsKey(NameManager.Name(x)) &&
                                 AllyHeroes.ItemDictionary.ContainsKey(NameManager.Name(x)) && x.Distance2D(hero) < 1700))
                    {
                        var abilities = AllyHeroes.AbilityDictionary[NameManager.Name(allyHero)];
                        var items     = AllyHeroes.ItemDictionary[NameManager.Name(allyHero)].Where(x => x.IsValid).ToList();
                        var list      = new List <Ability>(abilities.Count + items.Count);
                        list.AddRange(abilities);
                        list.AddRange(items);
                        tempDmg +=
                            list.Where(x => x.CanBeCasted())
                            .Sum(ability => AbilityDamage.CalculateDamage(ability, allyHero, hero));
                    }

                    IncomingDamages[heroName] = tempDmg;
                }
            }

            if (!MainMenu.GankDamageMenu.Item("enableGankDamageAllies").GetValue <bool>())
            {
                return;
            }

            foreach (var allyHero in allyHeroes)
            {
                var hero     = allyHero;
                var heroName = NameManager.Name(hero);
                if (!IncomingDamages.ContainsKey(heroName))
                {
                    IncomingDamages.Add(heroName, 0);
                }

                var tempDmg = 0f;
                foreach (var enemyHero in
                         enemyHeroes.Where(
                             x =>
                             EnemyHeroes.AbilityDictionary.ContainsKey(NameManager.Name(x)) &&
                             EnemyHeroes.ItemDictionary.ContainsKey(NameManager.Name(x)) && x.Distance2D(hero) < 1700))
                {
                    var abilities = EnemyHeroes.AbilityDictionary[NameManager.Name(enemyHero)];
                    var items     = EnemyHeroes.ItemDictionary[NameManager.Name(enemyHero)].Where(x => x.IsValid).ToList();
                    var list      = new List <Ability>(abilities.Count + items.Count);
                    list.AddRange(abilities);
                    list.AddRange(items);
                    tempDmg +=
                        list.Where(x => x.CanBeCasted())
                        .Sum(ability => AbilityDamage.CalculateDamage(ability, enemyHero, hero));
                }

                IncomingDamages[heroName] = tempDmg;
            }
        }
示例#22
0
        public void OnUpdate()
        {
            if (!Utils.SleepCheck("AbilityLastHit.Sleep"))
            {
                return;
            }

            Utils.Sleep(500, "AbilityLastHit.Sleep");

            if (!menuManager.IsEnabled || !hero.IsAlive || !hero.CanCast() && !heroMeepo)
            {
                pause = true;
                return;
            }

            var autoDisable = menuManager.AutoDisableTime;

            if (autoDisable > 0 && Game.GameTime / 60 >= autoDisable)
            {
                menuManager.Disable();
            }

            if (pause)
            {
                pause = false;
            }

            availableAbilities =
                abilities.Where(x => menuManager.AbilityActive(x.Name) && (x.CanBeCasted || heroMeepo)).ToList();

            //debug
            //foreach (var creep in
            //    from source in Creeps.All.Where(x => x.Team != heroTeam && x.IsValid && x.IsAlive && x.IsSpawned)
            //    let creep = new Classes.Creep(source)
            //    where !killableList.Select(x => x.Handle).Contains(source.Handle)
            //    select creep)
            //{
            //    killableList.Add(creep);
            //}

            var myAutoAttackDamage = hero.MinimumDamage + hero.BonusDamage;

            foreach (var killable in killableList.Where(x => x.IsValid && x.Distance(hero) < 1500))
            {
                var autoAttackDamageDone = killable.Unit.DamageTaken(myAutoAttackDamage, DamageType.Physical, hero);

                var siege = killable.Unit.ClassID == ClassID.CDOTA_BaseNPC_Tower
                            || killable.Unit.ClassID == ClassID.CDOTA_BaseNPC_Creep_Siege;

                if (siege)
                {
                    autoAttackDamageDone /= 2;
                }

                killable.HeroDamage = autoAttackDamageDone;

                foreach (var ability in abilities.Where(x => x.Level > 0))
                {
                    var creep = killable as Classes.Creep;

                    if (creep != null)
                    {
                        var damage = AbilityDamage.CalculateDamage(ability.Source, hero, creep.Unit);

                        switch (ability.Name)
                        {
                            case "meepo_poof":
                                damage *= 2;
                                break;
                            case "ember_spirit_sleight_of_fist":
                                damage = autoAttackDamageDone / 2;
                                break;
                            case "templar_assassin_meld":
                                if (siege)
                                {
                                    var armor = new[] { 2, 4, 6, 8 };
                                    var bonusTemplar = new[] { 50, 100, 150, 200 };

                                    damage =
                                        killable.Unit.SpellDamageTaken(
                                            myAutoAttackDamage + bonusTemplar[ability.Level - 1],
                                            DamageType.Physical,
                                            hero,
                                            ability.Name,
                                            true,
                                            armor[ability.Level - 1]);
                                }
                                break;
                            case "clinkz_searing_arrows":
                                var bonusClinkz = new[] { 30, 40, 50, 60 };

                                var tempDamage =
                                    killable.Unit.SpellDamageTaken(
                                        myAutoAttackDamage + bonusClinkz[ability.Level - 1],
                                        DamageType.Physical,
                                        hero,
                                        ability.Name,
                                        true);
                                if (siege)
                                {
                                    tempDamage /= 2;
                                }
                                damage = tempDamage;

                                break;
                        }

                        creep.SaveDamage(ability.Handle, damage);
                    }

                    if (ability.DoesTowerDamage)
                    {
                        var tower = killable as Tower;
                        tower?.SaveDamage(
                            ability.Handle,
                            AbilityDamage.CalculateDamage(ability.Source, hero, tower.Unit)
                            / ability.TowerDamageReduction);
                    }
                }

                killable.DamageCalculated = true;
            }
        }
示例#23
0
        public static void OnUpdate(EventArgs args)
        {
            if (!OnUpdateChecks.CanUpdate())
            {
                return;
            }

            if (!Utils.SleepCheck("DamageUpdate") || !Utils.SleepCheck("GlobalCasting"))
            {
                return;
            }

            Utils.Sleep(100, "DamageUpdate");
            foreach (var hero in
                     new List <Hero>(EnemyHeroes.Heroes).Where(x => x != null && x.IsValid && x.IsAlive && x.IsVisible))
            {
                var heroName   = NameManager.Name(hero);
                var heroHandle = hero.Handle;
                if (Utils.SleepCheck("calculate"))
                {
                    var enumerable =
                        MyAbilities.OffensiveAbilities.Where(
                            ability =>
                            ability.Value.IsValid && ability.Key.Contains("nuke") &&
                            Nukes.NukesMenuDictionary[NameManager.Name(ability.Value)].Item(
                                NameManager.Name(ability.Value) + "herotoggler")
                            .GetValue <HeroToggler>()
                            .IsEnabled(heroName) &&
                            MainMenu.Menu.Item("nukesToggler")
                            .GetValue <AbilityToggler>()
                            .IsEnabled(NameManager.Name(ability.Value)) &&
                            Nukes.NukesMenuDictionary[NameManager.Name(ability.Value)].Item(
                                NameManager.Name(ability.Value) + "combo").GetValue <bool>())
                        .OrderBy(x => ComboOrder.GetDamageOrder(x.Value))
                        .ToList();
                    float[] intakenDamage            = { 0 };
                    var     minusMagicResistancePerc = 0f;
                    var     tempList       = new List <Ability>();
                    float[] outtakenDamage = { 0 };
                    var     manaLeft       = AbilityMain.Me.Mana;
                    foreach (var ability in
                             enumerable.Where(
                                 ability =>
                                 (ability.Value.CanBeCasted() || ability.Value.IsInAbilityPhase ||
                                  (AbilityMain.Me.ClassID == ClassID.CDOTA_Unit_Hero_Invoker &&
                                   MyAbilities.InvokerInvoke.CanBeCasted() && ability.Value.Cooldown <= 0.5 &&
                                   ability.Value.ManaCost + MyAbilities.InvokerInvoke.ManaCost < manaLeft)))
                             .Select(data => data.Value))
                    {
                        var name = NameManager.Name(ability);
                        if (manaLeft < ability.ManaCost ||
                            manaLeft
                            < Nukes.NukesMenuDictionary[name].Item(name + "minManaCheck").GetValue <Slider>().Value)
                        {
                            continue;
                        }

                        manaLeft -= ability.ManaCost;
                        if (DamageAmps.IsDamageAmp(ability))
                        {
                            minusMagicResistancePerc += DamageAmps.DamageAmpValue(ability);
                        }

                        float tempdmg;
                        if (ability.CanHit(hero, MyHeroInfo.Position))
                        {
                            tempdmg = AbilityDamage.CalculateDamage(
                                ability,
                                AbilityMain.Me,
                                hero,
                                minusHealth: intakenDamage[0] + outtakenDamage[0],
                                minusMagicResistancePerc: minusMagicResistancePerc);
                            intakenDamage[0] += tempdmg;
                            tempList.Add(ability);
                            if (!Dictionaries.InDamageDictionary.ContainsKey(heroHandle))
                            {
                                Dictionaries.InDamageDictionary.Add(heroHandle, intakenDamage[0]);
                            }
                            else
                            {
                                Dictionaries.InDamageDictionary[heroHandle] = intakenDamage[0];
                            }

                            if (intakenDamage[0] >= hero.Health)
                            {
                                MyAbilities.NukesCombo  = tempList;
                                AbilityMain.DealtDamage = 0;
                                break;
                            }
                        }
                        else
                        {
                            tempdmg = AbilityDamage.CalculateDamage(
                                ability,
                                AbilityMain.Me,
                                hero,
                                minusHealth: outtakenDamage[0] + intakenDamage[0],
                                minusMagicResistancePerc: minusMagicResistancePerc);
                            outtakenDamage[0] += tempdmg;
                        }
                    }

                    if (!Dictionaries.OutDamageDictionary.ContainsKey(heroHandle))
                    {
                        Dictionaries.OutDamageDictionary.Add(heroHandle, outtakenDamage[0]);
                    }
                    else
                    {
                        Dictionaries.OutDamageDictionary[heroHandle] = outtakenDamage[0];
                    }

                    if (!Dictionaries.InDamageDictionary.ContainsKey(heroHandle))
                    {
                        Dictionaries.InDamageDictionary.Add(heroHandle, intakenDamage[0]);
                    }
                    else
                    {
                        Dictionaries.InDamageDictionary[heroHandle] = intakenDamage[0];
                    }
                }

                float dmg;
                if (!Dictionaries.InDamageDictionary.TryGetValue(heroHandle, out dmg))
                {
                    dmg = 0;
                }

                float outdmg;
                if (!Dictionaries.OutDamageDictionary.TryGetValue(heroHandle, out outdmg))
                {
                    outdmg = 0;
                }

                var   hp  = Math.Max(hero.Health - dmg, 0);
                var   lhp = Math.Max(hp - outdmg, 0);
                float hitDmg;
                if (!Dictionaries.HitDamageDictionary.TryGetValue(heroHandle, out hitDmg))
                {
                    hitDmg = hero.DamageTaken(
                        MyDamage.BonusDamage + MyDamage.MinDamage,
                        DamageType.Physical,
                        AbilityMain.Me);
                    Dictionaries.HitDamageDictionary.Add(heroHandle, hitDmg);
                }
                else
                {
                    hitDmg = hero.DamageTaken(
                        MyDamage.BonusDamage + MyDamage.MinDamage,
                        DamageType.Physical,
                        AbilityMain.Me);
                    Dictionaries.HitDamageDictionary[heroHandle] = hitDmg;
                    Utils.Sleep(250, heroHandle + "updatehitdamage");
                }

                var    currentHits = lhp / hitDmg;
                double hits;
                if (!Dictionaries.HitsDictionary.TryGetValue(heroHandle.ToString(), out hits))
                {
                    hits = Math.Ceiling(
                        (currentHits * MyHeroInfo.AttackRate() * hero.HealthRegeneration + lhp) / hitDmg);
                    Dictionaries.HitsDictionary.Add(heroHandle.ToString(), hits);
                }
                else if (Utils.SleepCheck(heroHandle + "updatehits"))
                {
                    hits = Math.Ceiling(
                        (currentHits * MyHeroInfo.AttackRate() * hero.HealthRegeneration + lhp) / hitDmg);
                    Dictionaries.HitsDictionary[heroHandle.ToString()] = hits;
                    Utils.Sleep(250, heroHandle + "updatehits");
                }
            }
        }
示例#24
0
 public bool ShouldReturn(Hero hero, Target enemy)
 {
     return(Utils.SleepCheck("Timber." + Name) && CanReturn && enemy.IsValid() &&
            (enemy.GetDistance(Position) > Radius - 50 && enemy.GetTurnTime(Position) > 0 ||
             AbilityDamage.CalculateDamage(Ability, hero, enemy.Hero) / 2 >= enemy.Health));
 }
示例#25
0
        public static bool Cast(Ability ability, Unit target, string name, bool disabled = false)
        {
            if (!disabled)
            {
                disabled = target.IsStunned() || target.IsRooted() || target.IsHexed() || target.IsInvul();
            }

            if (target.HasModifier("modifier_item_blade_mail_reflect") &&
                AbilityDamage.CalculateDamage(ability, AbilityMain.Me, target) > AbilityMain.Me.Health)
            {
                return(false);
            }

            if (target.HasModifier("modifier_nyx_assassin_spiked_carapace"))
            {
                return(false);
            }

            if (ability.Name == "sniper_assassinate")
            {
                if (AbilityMain.Me.Distance2D(target) <= AbilityMain.Me.GetAttackRange() + 100)
                {
                    return(false);
                }
            }

            if (ability.IsAbilityBehavior(AbilityBehavior.UnitTarget, name) && ability.Name != "lion_impale" &&
                ability.Name != "lina_dragon_slave")
            {
                if (target.IsLinkensProtected())
                {
                    if (!Utils.SleepCheck("AbilitySharp.CancelLinkens"))
                    {
                        return(false);
                    }

                    if (MyAbilities.Cyclone != null && MyAbilities.Cyclone.CanBeCasted())
                    {
                        MyAbilities.Cyclone.UseAbility(target);
                    }
                    else if (MyAbilities.ForceStaff != null && MyAbilities.ForceStaff.CanBeCasted())
                    {
                        MyAbilities.ForceStaff.UseAbility(target);
                    }

                    Utils.Sleep(1000, "AbilitySharp.CancelLinkens");

                    Game.ExecuteCommand("dota_player_units_auto_attack_mode 0");
                    ManageAutoAttack.AutoAttackDisabled = true;
                    SoulRing.Cast(ability);
                    ability.UseAbility(target, true);
                    return(false);
                }

                Game.ExecuteCommand("dota_player_units_auto_attack_mode 0");
                ManageAutoAttack.AutoAttackDisabled = true;
                SoulRing.Cast(ability);
                ability.UseAbility(target);
                DelayAction.Add(
                    new DelayActionItem(300, () => { AbilityMain.LaunchSnowball(); }, CancellationToken.None));
                return(true);
            }

            if ((ability.IsAbilityBehavior(AbilityBehavior.AreaOfEffect, name) ||
                 ability.IsAbilityBehavior(AbilityBehavior.Point, name)) &&
                (disabled ||
                 Prediction.StraightTime(target)
                 > Nukes.NukesMenuDictionary[name].Item(name + "minstraighttime").GetValue <Slider>().Value ||
                 target.MovementSpeed < 200))
            {
                if (AbilityMain.Me.ClassId == ClassId.CDOTA_Unit_Hero_Invoker && !ability.CanBeCasted())
                {
                    var invoked = ability.Invoke();
                    if (!invoked)
                    {
                        return(false);
                    }

                    DelayAction.Add(
                        Game.Ping * 2,
                        () =>
                    {
                        Game.ExecuteCommand("dota_player_units_auto_attack_mode 0");
                        ManageAutoAttack.AutoAttackDisabled = true;
                        var casted2 = ability.CastSkillShot(
                            target,
                            MyHeroInfo.Position,
                            name,
                            SoulRing.Check(ability) ? MyAbilities.SoulRing : null);
                        if (!casted2)
                        {
                            return;
                        }

                        if (!disabled && Utils.SleepCheck(ability.Handle.ToString()) &&
                            ability.GetCastDelay(AbilityMain.Me, target, true) * 1000 - Game.Ping > 0.1)
                        {
                            DelayAction.Add(
                                new DelayActionItem(
                                    (int)
                                    (ability.GetCastDelay(AbilityMain.Me, target, true) * 1000
                                     - Math.Max(50, Game.Ping)),
                                    () =>
                            {
                                if (Prediction.StraightTime(target)
                                    < (600
                                       + (ability.GetCastDelay(AbilityMain.Me, target, true) * 1000
                                          - Math.Max(50, Game.Ping))) && target.MovementSpeed > 200)
                                {
                                    AbilityMain.Me.Stop();
                                }
                            },
                                    CancellationToken.None));
                        }
                    });
                    Utils.Sleep((Game.Ping * 2) + 200, "cancelorder");
                    Utils.Sleep((Game.Ping * 2) + 200, ability.Handle.ToString());
                    Utils.Sleep((Game.Ping * 2) + 200, "casting");
                }

                Game.ExecuteCommand("dota_player_units_auto_attack_mode 0");
                ManageAutoAttack.AutoAttackDisabled = true;
                var casted = ability.CastSkillShot(
                    target,
                    MyHeroInfo.Position,
                    name,
                    SoulRing.Check(ability) ? MyAbilities.SoulRing : null);
                if (!casted)
                {
                    return(false);
                }

                if (!disabled && Utils.SleepCheck(ability.Handle.ToString()) &&
                    ability.GetCastDelay(AbilityMain.Me, target, true) * 1000 - Game.Ping > 0.1)
                {
                    DelayAction.Add(
                        new DelayActionItem(
                            (int)(ability.GetCastDelay(AbilityMain.Me, target, true) * 1000 - Math.Max(50, Game.Ping)),
                            () =>
                    {
                        if (Prediction.StraightTime(target)
                            < (600
                               + (ability.GetCastDelay(AbilityMain.Me, target, true) * 1000
                                  - Math.Max(50, Game.Ping))) && target.MovementSpeed > 200)
                        {
                            AbilityMain.Me.Stop();
                        }
                    },
                            CancellationToken.None));
                }

                return(true);
            }

            if (ability.IsAbilityBehavior(AbilityBehavior.NoTarget, name))
            {
                if (ability.Name == "templar_assassin_meld")
                {
                    if (
                        !(target.Distance2D(MyHeroInfo.Position)
                          < (AbilityMain.Me.GetAttackRange() + 50 + target.HullRadius + AbilityMain.Me.HullRadius)) ||
                        Orbwalking.AttackOnCooldown(target) || AbilityMain.Me.IsAttacking() ||
                        (target.Predict(Game.Ping).Distance2D(MyHeroInfo.Position)
                         > (AbilityMain.Me.GetAttackRange() + 50 + target.HullRadius + AbilityMain.Me.HullRadius)) ||
                        !Utils.SleepCheck("GlobalCasting"))
                    {
                        return(false);
                    }

                    Game.ExecuteCommand("dota_player_units_auto_attack_mode 0");
                    ManageAutoAttack.AutoAttackDisabled = true;
                    ability.UseAbility();
                    DelayAction.Add(
                        new DelayActionItem(
                            (int)ability.GetCastDelay(AbilityMain.Me, target) * 1000,
                            () => { AbilityMain.Me.Attack(target); },
                            CancellationToken.None));
                    Utils.Sleep(ability.GetCastDelay(AbilityMain.Me, target) * 1000, "GlobalCasting");
                    Utils.Sleep(ability.GetCastDelay(AbilityMain.Me, target) * 1000 + 200, "casting");
                    Utils.Sleep(ability.GetCastDelay(AbilityMain.Me, target) * 1000 + 200, "Ability.Move");
                    Utils.Sleep(ability.GetCastDelay(AbilityMain.Me, target) * 1000 + 200, "cancelorder");
                    return(true);
                }

                if (ability.Name.Contains("nevermore_shadowraze"))
                {
                    Game.ExecuteCommand("dota_player_units_auto_attack_mode 0");
                    ManageAutoAttack.AutoAttackDisabled = true;
                    return(ability.CastSkillShot(target, name));
                }

                SoulRing.Cast(ability);
                Game.ExecuteCommand("dota_player_units_auto_attack_mode 0");
                ManageAutoAttack.AutoAttackDisabled = true;
                ability.UseAbility();
                return(true);
            }

            return(false);
        }
示例#26
0
        private static void Drawing_OnDraw(EventArgs args)
        {
            if (!Checker.IsActive())
            {
                return;
            }
            if (!IsEnable)
            {
                return;
            }
            if (InSys == null || InSys.Count == 0)
            {
                return;
            }
            var haveEb =
                InSys.Any(
                    x => IsAbilityEnable(x.StoredName()) && x.StoredName() == "item_ethereal_blade" && x.CanBeCasted());
            var haveVeil =
                InSys.Any(
                    x => IsAbilityEnable(x.StoredName()) && x.StoredName() == "item_veil_of_discord" && x.CanBeCasted());
            var myPhysDmg = 0f;

            if (Members.MyHero.ClassID == ClassID.CDOTA_Unit_Hero_MonkeyKing)
            {
                var extraMkAbility = Members.MyHero.FindSpell("special_bonus_unique_monkey_king", true)?.Level == 1;
                var passiveDmg     = MkDmg[Members.MyHero.FindSpell("monkey_king_jingu_mastery", true).Level];
                myPhysDmg = Members.MyHero.MinimumDamage + Members.MyHero.BonusDamage +
                            (Members.MyHero.HasModifier("modifier_monkey_king_quadruple_tap_bonuses")
                                    ? passiveDmg
                                    : 0);
                var boundless = Members.MyHero.FindSpell("monkey_king_boundless_strike", true).Level;
                var coef      = 1.2f + 0.20f * boundless;
                myPhysDmg *= extraMkAbility ? 3f : coef;
            }
            foreach (var v in Manager.HeroManager.GetEnemyViableHeroes())
            {
                try
                {
                    var pos = HUDInfo.GetHPbarPosition(v);
                    if (pos.IsZero)
                    {
                        continue;
                    }
                    var extraDamage = haveEb && !v.HasModifier("modifier_item_ethereal_blade_ethereal") ? 40 : 0;
                    extraDamage += haveVeil && !v.HasModifier("modifier_item_veil_of_discord_debuff") ? 25 : 0;
                    var myDmg = InSys.Where(x => x.CanBeCasted() && IsAbilityEnable(x.StoredName()))
                                .Sum(
                        x => WhiteList.Contains(x.Name)
                                ? Calculations.DamageTaken(v,
                                                           myPhysDmg,
                                                           DamageType.Physical, Members.MyHero)
                                : AbilityDamage.CalculateDamage(x, Members.MyHero, v,
                                                                minusMagicResistancePerc: extraDamage));

                    var health    = v.Health;
                    var extraLife =
                        (uint)(Manager.HeroManager.GetItemList(v)
                               .Any(x => x.StoredName() == "item_infused_raindrop" && x.Cooldown <= 0)
                            ? 120
                            : 0);
                    if (extraLife > 100)
                    {
                        var needToCalcExtraLife =
                            InSys.Any(
                                x =>
                                x.DamageType == DamageType.Magical &&
                                AbilityDamage.CalculateDamage(x, Members.MyHero, v,
                                                              minusMagicResistancePerc: haveEb ? 40 : 0) > 120);
                        health += needToCalcExtraLife ? extraLife : 0;
                    }

                    var healthAfterShit = (int)(health - myDmg);
                    var size            = HUDInfo.GetHpBarSizeY();
                    var text            = $"{healthAfterShit} ({(int) myDmg})";
                    var textSize        = Drawing.MeasureText(text, "Arial",
                                                              new Vector2((float)(size * 1.5), 500), FontFlags.AntiAlias);
                    var textPos = pos + new Vector2(HUDInfo.GetHPBarSizeX() + 4, 0);
                    var isEno   = healthAfterShit < 0;
                    var name    = isEno ? "killableCol" : "defCol";
                    Drawing.DrawText(
                        text,
                        textPos,
                        new Vector2(textSize.Y, 0),
                        new Color(R(name), G(name), B(name), 255),
                        FontFlags.AntiAlias | FontFlags.StrikeOut);
                }
                catch (Exception)
                {
                    Printer.Print($"[DamageCalculation]: {v.StoredName()}");
                }
            }
        }
示例#27
0
        private static void FullCombo(EventArgs args)
        {
            if (!Game.IsInGame || Game.IsPaused || Game.IsWatchingGame || Game.IsChatOpen)
            {
                return;
            }

            // Selects target closest to mouse using user selected range from menu.
            //playerList = Heroes.All;
            target     = me.ClosestToMouseTarget(ClosestToMouseRange.GetValue <Slider>().Value);
            allyTarget = ClosestToMouseAlly(me);

            if (target != null && Utils.SleepCheck("PudgePROrotatedCheckSleep"))
            {
                //Game.PrintMessage("Target Rotated: " + TargetRotated(), MessageType.LogMessage);
                targetRotate = TargetRotated();

                Utils.Sleep(comboSleepGet, "PudgePROrotatedCheckSleep");
            }

            //rotToggled = me.HasModifier("modifier_pudge_rot") == true ? true : false;

            //if (hook != null && hook.IsInAbilityPhase && targetRotate)
            //{
            //    Game.PrintMessage("I WORK NOW", MessageType.LogMessage);
            //    me.Stop();
            //}

            if (hook != null && target != null && hookPredictRad.GetValue <bool>())
            {
                GetCastSkillShotEnemy(hook, target, "pudge_meat_hook", soulring, true);
            }

            //foreach (var unit in playerList)
            //{
            //    if (unit.Team == me.Team && unit.IsAlive && !unit.IsIllusion)
            //    {
            //        allyTarget = TargetSelector.ClosestToMouse(me).;//unit;
            //    }
            //}
            //var allyTarget = TargetSelector.ClosestToMouse(me).Equals(ally);

            //var targetFacingLocationB = target.InFront(1000);
            //var targetFacingAngleB = target.Position.ToVector2().FindAngleBetween(targetFacingLocationB.ToVector2(), true);
            //targetFacing = targetFacingAngleB;

            //if (Utils.SleepCheck("PudgePROGetAbilities")) GetAbilities();

            //if (hook != null && hook.IsInAbilityPhase)// && Utils.SleepCheck("PudgePROcastSleep"))
            //{
            //    var targetFacingLocationA = target.InFront(1000);
            //    var targetFacingAngleA = target.Position.ToVector2().FindAngleBetween(targetFacingLocationA.ToVector2(), true);

            //    Game.PrintMessage("targetFacing: " + targetFacing + "targetFacingAngleA: " + targetFacingAngleA, MessageType.LogMessage);

            //    if (targetFacing >= targetFacingAngleA + 0.1f && targetFacing <= targetFacingAngleA - 0.1f)
            //    {
            //        Game.PrintMessage("BAD HOOK", MessageType.LogMessage);
            //        me.Stop();
            //        return;
            //    }
            //}

            //if (Utils.SleepCheck("PudgePRObadHookSleep2"))
            //{
            //    if (Utils.SleepCheck("BLAHBLAHBLAH"))
            //    {
            //        Game.PrintMessage("target is turning " + TargetTurning(), MessageType.LogMessage);
            //        Utils.Sleep(100, "BLAHBLAHBLAH");

            //    }

            //    if (TargetTurning())// || (walkStraight < straightTimer && walkStraight != 0))
            //    {
            //        Game.PrintMessage("BAD HOOK", MessageType.LogMessage);
            //        me.Stop();
            //        return;
            //    }
            //    Utils.Sleep(100, "PudgePRObadHookSleep2");
            //}

            // Combo type.
            if (Menu.Item("comboType").GetValue <StringList>().SelectedIndex == 0 && Utils.SleepCheck("PudgePROcomboTypeSleep"))
            {
                GetAbilities();

                var dismAddRange = (dismember != null) ? dismember.GetCastRange() : 100;

                if (aetherLens == null)
                {
                    dismAddRange -= 75;
                }
                else if (aetherLens != null)
                {
                    dismAddRange -= 125;
                }

                //Menu.Item("itemsCon").Equals("item_force_staff");
                if (blink != null && target != null && target.NetworkPosition.Distance2D(me.NetworkPosition) < blink.GetCastRange() + me.HullRadius + dismAddRange)
                {
                    useBlink.SetValue(true);
                }
                else
                {
                    useBlink.SetValue(false);
                }

                Utils.Sleep(100, "PudgePROcomboTypeSleep");
            }
            else if (Menu.Item("comboType").GetValue <StringList>().SelectedIndex == 1)
            {
                if (useBlink.GetValue <bool>())
                {
                    useBlink.SetValue(false);
                }
            }
            else if (Menu.Item("comboType").GetValue <StringList>().SelectedIndex == 2)
            {
                // Do nothing
            }



            // Kill Steal with "nuke" abilities.
            if (killSteal.GetValue <bool>())
            {
                GetAbilities();

                if (hook != null && hook.CanBeCasted() && !hook.IsInAbilityPhase && !me.IsChanneling() && Utils.SleepCheck("PudgePROkillStealSleep"))
                {
                    var targets = ObjectManager.GetEntities <Hero>().Where(hero => hero.IsAlive && !hero.IsIllusion && hero.IsVisible && hero.Team == me.GetEnemyTeam()).ToList();

                    if (targets != null && targets.Any())
                    {
                        foreach (var enemy in targets)
                        {
                            var hookFullDamage = AbilityDamage.CalculateDamage(hook, me, enemy);

                            //Game.PrintMessage("Hook Damage: " + hookFullDamage, MessageType.LogMessage);

                            if (enemy.Health < hookFullDamage && hook.GetCastRange() >= enemy.NetworkPosition.Distance2D(me.NetworkPosition))
                            {
                                //Game.PrintMessage("Trying to hook " + enemy, MessageType.LogMessage);
                                CastSkillShotEnemy(hook, target, "pudge_meat_hook", soulring, false);
                            }
                        }
                    }

                    Utils.Sleep(100, "PudgePROkillStealSleep");
                }
            }



            if (Game.IsKeyDown(allyHookKey.GetValue <KeyBind>().Key))
            {
                GetAbilities();
                GetPredictionValues();

                aetherRange = aetherLens != null ? (uint)220 : (uint)0;
                var hookRange = hook.GetCastRange() + me.HullRadius;

                if (allyTarget == null || !allyTarget.IsValid || allyTarget.IsIllusion || !allyTarget.IsAlive || allyTarget.IsInvul())
                {
                    return;
                }

                //if (!allyRotate)
                //{
                //    var allyFacingLocationB = allyTarget.InFront(100);
                //    var allyFacingAngleB = allyTarget.Position.ToVector2().FindAngleBetween(allyFacingLocationB.ToVector2(), true);
                //    allyFacing = allyFacingAngleB;
                //    allyRotate = true;
                //}

                if (soulring != null && !soulRing.GetValue <bool>())
                {
                    soulring = null;
                }

                if (hook != null && Menu.Item("abilities").GetValue <AbilityToggler>().IsEnabled(hook.Name) &&
                    hookRange >= allyTarget.NetworkPosition.Distance2D(me) && hook.CanBeCasted() &&
                    !me.IsChanneling() && Utils.SleepCheck("PudgePROallyComboSleep"))
                {
                    Utils.Sleep(100, "PudgePROallyComboSleep");

                    CastSkillShotAlly(hook, allyTarget, me.NetworkPosition);

                    //Game.PrintMessage("allyTarget: " + allyTarget.Name, MessageType.LogMessage);

                    //var predict = Prediction.PredictedXYZ(allyTarget, 1);//(me, allyTarget, 0, hook.GetProjectileSpeed("pudge_meat_hook"), hook.GetCastRange("pudge_meat_hook"));
                    //var mePos = me.Position;
                    //var reachTime = Prediction.CalculateReachTime(allyTarget, hook.GetProjectileSpeed(), predict - mePos);
                    //bool allyIdle = Prediction.IsIdle(allyTarget);
                    //var allyLocation = SkillShotTEST(me, allyTarget, (float)hook.GetHitDelay(allyTarget), hook.GetProjectileSpeed("pudge_meat_hook"), hook.GetRadius("pudge_meat_hook"));

                    //Game.PrintMessage("allyLocation: " + allyLocation, MessageType.LogMessage);
                    //hook.UseAbility(allyLocation);
                    //if (!allyIdle) hook.UseAbility(allyLocation);
                    //else hook.UseAbility(allyTarget.NetworkPosition);
                }


                //if (((hook != null && Menu.Item("abilities").GetValue<AbilityToggler>().IsEnabled(hook.Name)) &&
                //    hookRange >= allyTarget.NetworkPosition.Distance2D(me) && hook.CanBeCasted() &&
                //    !me.IsChanneling() && Utils.SleepCheck("PudgePROcomboSleep")))
                //{

                //    Utils.Sleep(comboSleepGet, "PudgePROcomboSleep");

                //    //Game.PrintMessage("COMBO WORKING", MessageType.LogMessage);
                //    CastAbility(hook, hook.GetCastRange());

                //    if (!Utils.SleepCheck("PudgePRObadHookSleep")) return;
                //    //if (walkStraight < 500 && walkStraight != 0) return;

                //    var allyFacingLocationA = allyTarget.InFront(100);
                //    var allyFacingAngleA = allyTarget.Position.ToVector2().FindAngleBetween(allyFacingLocationA.ToVector2(), true);

                //    //Game.PrintMessage("targetFacing: " + targetFacing + "targetFacingAngleA: " + targetFacingAngleA, MessageType.LogMessage);

                //    if (badHook.GetValue<bool>() && hook != null && hook.IsInAbilityPhase && ((allyFacing + rotTolerance < allyFacingAngleA || allyFacing - rotTolerance > allyFacingAngleA) || (Prediction.IsIdle(allyTarget) && !allyStop)))
                //    {
                //        //Game.PrintMessage("BAD HOOK", MessageType.LogMessage);
                //        me.Stop();
                //        allyRotate = false;
                //        if (Prediction.IsIdle(allyTarget)) allyStop = true;
                //        return;
                //    }
                //    allyRotate = false;
                //}

                //if (hook != null && !hook.CanBeCasted() && allyStop && Utils.SleepCheck("PudgePROidleSleep"))
                //{
                //    //Game.PrintMessage("resetting idle", MessageType.LogMessage);

                //    allyStop = false;
                //    Utils.Sleep(100, "PudgePROidleSleep");
                //}

                //if (Utils.SleepCheck("PudgePRObadHookSleep") && allyRotate && Utils.SleepCheck("PudgePROrotateSleep"))
                //{
                //    //Game.PrintMessage("resetting rotate", MessageType.LogMessage);

                //    allyRotate = false;
                //    Utils.Sleep(100, "PudgePROrotateSleep");
                //}
            }


            // Full combo
            // Check if Combo key is being held down.
            if (Game.IsKeyDown(comboKey.GetValue <KeyBind>().Key) || Menu.Item("comboToggleKey").IsActive())
            {
                // Retrieves values for ability and item variables.
                GetAbilities();
                GetPredictionValues();

                aetherRange = aetherLens != null ? (uint)220 : (uint)0;
                var hookRange = hook.GetCastRange() + me.HullRadius;

                //var targetFacingLocationA = target.InFront(1000); ;
                //float targetFacingAngleA = 0;
                //sleepTimer = sleepTime.GetValue<Slider>().Value;
                //straightTimer = straightTime.GetValue<Slider>().Value;


                if (target == null || !target.IsValid || target.IsIllusion || !target.IsAlive || target.IsInvul())
                {
                    return;
                }

                if (!targetRotateOld && !newHookCheck.GetValue <bool>())
                {
                    var targetFacingLocationB = target.InFront(100);
                    var targetFacingAngleB    = target.Position.ToVector2().FindAngleBetween(targetFacingLocationB.ToVector2(), true);
                    targetFacing    = targetFacingAngleB;
                    targetRotateOld = true;
                }


                if (target.HasModifier("modifier_pudge_meat_hook") && target.Distance2D(me.Position) > 1000 && Utils.SleepCheck("PudgePROblink"))
                {
                    me.Stop();
                    Utils.Sleep(100, "PudgePROblink");
                }

                CheckLinkensProt();

                if (soulring != null && !soulRing.GetValue <bool>())
                {
                    soulring = null;
                }

                //if (bottle != null && bottle.CanBeCasted() && !me.IsChanneling()
                //    && Menu.Item("itemsHD").GetValue<AbilityToggler>().IsEnabled(bottle.Name)
                //    && !me.HasModifier("modifier_bottle_regeneration"))
                //    bottle.UseAbility(me);

                UseBlink();

                if (!Utils.SleepCheck("PudgePROblink"))
                {
                    return;
                }

                UseForceStaff();

                if (!Utils.SleepCheck("PudgePROforceStaff"))
                {
                    return;
                }

                if (Utils.SleepCheck("PudgePROsheepThornSleep"))
                {
                    UseItem(bloodthorn, bloodthorn.GetCastRange());
                    UseItem(orchid, orchid.GetCastRange());
                    UseItem(sheep, sheep.GetCastRange());
                    UseItem(ghost, itemUseRange);
                    UseItem(glimmer, itemUseRange);
                    Utils.Sleep(100, "PudgePROsheepThornSleep");
                }

                UseRot();

                UseItem(dust, dust.GetCastRange());
                UseItem(veil, veil.GetCastRange());
                UseItem(ethereal, ethereal.GetCastRange());
                UseDagon();
                UseItem(urn, urn.GetCastRange());
                UseItem(shivas, shivas.GetCastRange());
                UseItem(pipe, itemUseRange);
                UseItem(hood, itemUseRange);
                UseItem(crimson, itemUseRange);

                if ((hookRange < target.NetworkPosition.Distance2D(me) || !MeHasMana() || AllOnCooldown()) && !me.IsChanneling() &&
                    !me.Spellbook.Spells.Any(x => x.IsInAbilityPhase) && Utils.SleepCheck("PudgePROorbwalkSleep"))
                {
                    //Game.PrintMessage("ORBWALKING.", MessageType.LogMessage);
                    Orbwalk();
                    Utils.Sleep(100, "PudgePROorbwalkSleep");
                }
                else if (dismember != null && Menu.Item("abilities").GetValue <AbilityToggler>().IsEnabled(dismember.Name) && dismember.GetCastRange() + me.HullRadius >= target.Position.Distance2D(me.Position) &&
                         dismember.CanBeCasted() && !dismember.IsInAbilityPhase && !me.IsChanneling() && Utils.SleepCheck("PudgePROpreComboSleep"))
                {
                    //Game.PrintMessage("PRE-DISMEMBERING.", MessageType.LogMessage);
                    CastAbility(dismember, dismember.GetCastRange() + me.HullRadius);
                    Utils.Sleep(100, "PudgePROpreComboSleep");
                }
                else if (((hook != null && Menu.Item("abilities").GetValue <AbilityToggler>().IsEnabled(hook.Name)) ||
                          (dismember != null && Menu.Item("abilities").GetValue <AbilityToggler>().IsEnabled(dismember.Name))) &&
                         hookRange >= target.NetworkPosition.Distance2D(me) && hook.CanBeCasted() && !dismember.IsInAbilityPhase &&
                         !me.IsChanneling() && Utils.SleepCheck("PudgePROcomboSleep"))
                {
                    Utils.Sleep(100, "PudgePROcomboSleep");

                    //Game.PrintMessage("COMBO WORKING", MessageType.LogMessage);
                    CastAbility(hook, hook.GetCastRange());

                    //if (targetFacing == targetFacingOld) targetRotate = false;

                    if (!Utils.SleepCheck("PudgePRObadHookSleep") && !newHookCheck.GetValue <bool>())
                    {
                        return;
                    }
                    //if (walkStraight < 500 && walkStraight != 0) return;


                    var targetFacingLocationA = target.InFront(100);
                    var targetFacingAngleA    = target.Position.ToVector2().FindAngleBetween(targetFacingLocationA.ToVector2(), true);

                    //Game.PrintMessage(" targetFacing: " + targetFacing + " targetFacingAngleA: " + targetFacingAngleA, MessageType.LogMessage);


                    //if (targetFacing == targetFacingOld) targetFacing = targetFacingAngleA;

                    //Game.PrintMessage("NEED TO STOP HOOK " + targetRotate, MessageType.LogMessage);

                    if (badHook.GetValue <bool>() && hook != null && hook.IsInAbilityPhase &&
                        (((targetRotate && newHookCheck.GetValue <bool>()) || ((targetFacing + rotTolerance < targetFacingAngleA || targetFacing - rotTolerance > targetFacingAngleA) && !newHookCheck.GetValue <bool>())) ||
                         (Prediction.IsIdle(target) && ((!TargetStillIdle() && newHookCheck.GetValue <bool>()) || !targetStop && !newHookCheck.GetValue <bool>())) ||
                         (dismember != null && dismember.CanBeCasted() && target.Position.Distance2D(me.Position) < dismember.GetCastRange() + me.HullRadius) || !CastSkillShotEnemy(hook, target, "pudge_meat_hook", soulring, true)))
                    {
                        //Game.PrintMessage("BAD HOOK " + hook.IsInAbilityPhase + " " + (targetFacing + rotTolerance < targetFacingAngleA) + " " +
                        //    (targetFacing - rotTolerance > targetFacingAngleA) + " " + Prediction.IsIdle(target) + " " + targetStop + " " +
                        //    CastSkillShotEnemy(hook, target, "pudge_meat_hook", soulring, true), MessageType.LogMessage);
                        //Game.PrintMessage("STOPING HOOK", MessageType.LogMessage);
                        me.Stop();
                        targetRotateOld = false;
                        //targetFacing = targetFacingAngleA;
                        if (Prediction.IsIdle(target))
                        {
                            targetStop = true;
                        }
                        return;
                    }
                    targetRotateOld = false;

                    if (target.Position.Distance2D(me.Position) < hook.GetCastRange())
                    {
                        MoveToMousePos();
                    }

                    //if (0.1 + 0.1f < 0.5 || 0.1 - 0.1f > 0.5)

                    //if (Prediction.IsTurning(target))// || (walkStraight < straightTimer && walkStraight != 0))
                    //{
                    //    Game.PrintMessage("BAD HOOK", MessageType.LogMessage);
                    //    me.Stop();
                    //    return;
                    //}

                    CastAbility(dismember, hook.GetCastRange() + me.HullRadius);
                    //Utils.Sleep(100, "PudgePROcomboSleep");
                }
                else if ((hook != null ||
                          (dismember != null && Menu.Item("abilities").GetValue <AbilityToggler>().IsEnabled(dismember.Name))) &&
                         hookRange >= target.NetworkPosition.Distance2D(me) && !hook.CanBeCasted() && !dismember.IsInAbilityPhase &&
                         !me.IsChanneling() && Utils.SleepCheck("PudgePROdismemSleep"))
                {
                    Utils.Sleep(100, "PudgePROdismemSleep");
                    CastAbility(dismember, hook.GetCastRange() + me.HullRadius);
                }

                if (hook != null && !hook.CanBeCasted() && targetStop && Utils.SleepCheck("PudgePROidleSleep"))
                {
                    //Game.PrintMessage("resetting idle", MessageType.LogMessage);

                    targetStop = false;
                    Utils.Sleep(100, "PudgePROidleSleep");
                }

                if (Utils.SleepCheck("PudgePRObadHookSleep") && targetRotate && Utils.SleepCheck("PudgePROrotateSleep") && !newHookCheck.GetValue <bool>())
                {
                    //Game.PrintMessage("resetting rotate", MessageType.LogMessage);

                    targetRotateOld = false;
                    Utils.Sleep(100, "PudgePROrotateSleep");
                }
            }
        }
示例#28
0
        public static float CalculateMyDamage(Hero globalTarget)
        {
            var mana      = Members.MyHero.MaximumMana;
            var rearm     = Abilities.FindAbility("tinker_rearm");
            var laser     = Abilities.FindAbility("tinker_laser");
            var rocked    = Abilities.FindAbility("tinker_heat_seeking_missile");
            var allItems  = new List <Ability>();
            var allItems2 = new List <Ability>(Members.MyHero.Inventory.Items.Where(x =>
                                                                                    IsItemEnableNew(x.StoredName()) && (x.ManaCost > 0 || x.StoredName() == "item_soul_ring"))
                                               .OrderBy(PriorityHelper)
                                               .ToList());

            allItems.AddRange(allItems2);

            if (rocked.Level > 0 && IsItemEnableNew(rocked.StoredName()))
            {
                allItems.Add(rocked);
            }
            if (laser.Level > 0 && IsItemEnableNew(laser.StoredName()))
            {
                allItems.Add(laser);
            }
            if (rearm.Level > 0)
            {
                allItems.Add(rearm);
            }
            var haveEb      = allItems.Any(x => x.StoredName() == "item_ethereal_blade" && x.CanBeCasted());
            var haveVeil    = allItems.Any(x => x.StoredName() == "item_veil_of_discord" && x.CanBeCasted());
            var myDmg       = 0f;
            var extraDamage = haveEb && !globalTarget.HasModifier("modifier_item_ethereal_blade_ethereal") ? 40 : 0;

            extraDamage += haveVeil && !globalTarget.HasModifier("modifier_item_veil_of_discord_debuff") ? 25 : 0;
            if (allItems.Count == 0 || (rearm.Level == 0))
            {
                myDmg = allItems.Sum(
                    x =>
                    AbilityDamage.CalculateDamage(x, Members.MyHero, globalTarget,
                                                  minusMagicResistancePerc: extraDamage));
                return((int)(globalTarget.Health - myDmg));
            }

            //Printer.Print($"[mana]: init");
            Printer.ConsolePrint($"[mana]: Init. [count]: {allItems.Count}. [possible]: {allItems.Count(x => mana > x.ManaCost)}");
            var wasRearmed    = true;
            var templarStacks = globalTarget.FindModifier("modifier_templar_assassin_refraction_absorb_stacks");
            var stacks        = templarStacks?.StackCount ?? 0;
            var hasRainDrop   = globalTarget.FindItem("item_infused_raindrop", true)?.Cooldown <= 0;
            var wasNama       = mana;
            var linkDef       = globalTarget.IsLinkensProtected();

            while (mana > 5 && allItems.Count(x => mana > x.ManaCost) > 0 && wasRearmed && wasNama >= mana)
            {
                wasRearmed = false;
                foreach (var x in allItems)
                {
                    if (mana > x.ManaCost)
                    {
                        //Printer.ConsolePrint($"[mana]: {x.StoredName()} -> {x.ManaCost}/{mana}");
                        if (x.StoredName() == "item_soul_ring")
                        {
                            mana += 150;
                            Printer.ConsolePrint($"[mana]: {mana} (+150) soul ring");
                            continue;
                        }

                        var mCost = x.ManaCost;
                        if (!(mana - mCost > 0))
                        {
                            break;
                        }
                        mana -= mCost;

                        var dmgFromSpell = AbilityDamage.CalculateDamage(x, Members.MyHero, globalTarget,
                                                                         minusMagicResistancePerc: extraDamage);
                        if (x.GetAbilityId() == AbilityId.tinker_laser)
                        {
                            if (Members.LaserBuff)
                            {
                                dmgFromSpell += 100;
                            }
                        }
                        if (x.IsAbilityBehavior(AbilityBehavior.UnitTarget) && linkDef && !x.IsDisable())
                        {
                            dmgFromSpell = 0;
                            linkDef      = false;
                        }
                        if (stacks > 0)
                        {
                            stacks--;
                            myDmg += 0;
                        }
                        else
                        {
                            if (AbilityDamage.GetDamageType(x) == DamageType.Magical && hasRainDrop && dmgFromSpell > 50)
                            {
                                hasRainDrop   = false;
                                dmgFromSpell -= Math.Min(120, dmgFromSpell);
                                dmgFromSpell  = Math.Max(dmgFromSpell, 0);
                            }
                            myDmg += dmgFromSpell;
                        }
                        //Printer.Print($"[mana]: {mana} (-{mCost}) {x.StoredName()} -> damage: {myDmg}");

                        if (x.StoredName() == rearm.StoredName())
                        {
                            Printer.ConsolePrint($"[mana]: {mana} (-{mCost}) {x.StoredName()}");
                            wasRearmed = true;
                            continue;
                        }
                        Printer.ConsolePrint($"[mana]: {mana} (-{mCost}) {x.StoredName()} -> damage: {dmgFromSpell} || total:{myDmg}");
                    }
                    else
                    {
                        Printer.ConsolePrint($"[mana]: {x.StoredName()} -> {x.ManaCost}/{mana} cant cast this!");
                    }
                }

                /*Printer.ConsolePrint($"[mana]: {rearm.StoredName()} -> {rearm.ManaCost}/{mana}");
                 * mana -= rearm.ManaCost;*/
            }
            var healthAfterShit = (int)(globalTarget.Health - myDmg);

            return(healthAfterShit);
        }
示例#29
0
        public static float CalculateMyCurrentDamage(Hero globalTarget, bool checkForRange = false)
        {
            var mana      = Members.MyHero.Mana;
            var laser     = Abilities.FindAbility("tinker_laser");
            var rocked    = Abilities.FindAbility("tinker_heat_seeking_missile");
            var allItems  = new List <Ability>();
            var allItems2 = new List <Ability>(Members.MyHero.Inventory.Items.Where(x =>
                                                                                    IsItemEnableNew(x.StoredName()) && (x.ManaCost > 0 || x.StoredName() == "item_soul_ring"))
                                               .OrderBy(PriorityHelper)
                                               .ToList());

            allItems.AddRange(allItems2);

            if (laser.Level > 0 && IsItemEnableNew(laser.StoredName()))
            {
                allItems.Add(laser);
            }

            if (rocked.Level > 0 && IsItemEnableNew(rocked.StoredName()))
            {
                allItems.Add(rocked);
            }

            var haveEb =
                allItems.Any(
                    x =>
                    x.StoredName() == "item_ethereal_blade" && x.CanBeCasted() &&
                    (x.CanHit(globalTarget) || !checkForRange));
            var haveVeil =
                allItems.Any(
                    x =>
                    x.StoredName() == "item_veil_of_discord" && x.CanBeCasted() &&
                    (x.CanHit(globalTarget) || !checkForRange));
            var myDmg       = 0f;
            var extraDamage = haveEb && !globalTarget.HasModifier("modifier_item_ethereal_blade_ethereal") ? 40 : 0;

            extraDamage += haveVeil && !globalTarget.HasModifier("modifier_item_veil_of_discord_debuff") ? 25 : 0;
            var ignoreList = new List <Ability>();
            var linkDef    = globalTarget.IsLinkensProtected();

            foreach (
                var x in
                allItems.Where(x => x.CanBeCasted() && !ignoreList.Contains(x))
                .Where(x => !checkForRange || x.CanHit(globalTarget)))
            {
                if (x.Equals(rocked))
                {
                    if (!CanRockedHit(globalTarget))
                    {
                        ignoreList.Add(rocked);
                        continue;
                    }
                }
                if (mana > x.ManaCost)
                {
                    if (x.StoredName() == "item_soul_ring")
                    {
                        mana += 150;
                        continue;
                    }
                    var mCost = x.ManaCost;
                    if (!(mana - mCost > 0))
                    {
                        break;
                    }
                    mana -= mCost;
                    var dmgFromSpell = AbilityDamage.CalculateDamage(x, Members.MyHero, globalTarget,
                                                                     minusMagicResistancePerc: extraDamage);
                    if (x.GetAbilityId() == AbilityId.tinker_laser)
                    {
                        if (Members.LaserBuff)
                        {
                            dmgFromSpell += 100;
                        }
                    }
                    if (x.IsAbilityBehavior(AbilityBehavior.UnitTarget) && linkDef && !x.IsDisable())
                    {
                        dmgFromSpell = 0;
                        linkDef      = false;
                    }
                    myDmg += dmgFromSpell;
                }
            }
            return((int)(globalTarget.Health - myDmg));
        }
示例#30
0
        private static void Drawing_OnDraw(EventArgs args)
        {
            if (!Checker.IsActive())
            {
                return;
            }
            if (!IsEnable)
            {
                return;
            }
            if (InSys == null || InSys.Count == 0)
            {
                return;
            }
            var haveEb =
                InSys.Any(
                    x => IsAbilityEnable(x.StoredName()) && x.StoredName() == "item_ethereal_blade" && x.CanBeCasted());
            var haveVeil =
                InSys.Any(
                    x => IsAbilityEnable(x.StoredName()) && x.StoredName() == "item_veil_of_discord" && x.CanBeCasted());

            foreach (var v in Manager.HeroManager.GetEnemyViableHeroes())
            {
                try
                {
                    var pos = HUDInfo.GetHPbarPosition(v);
                    if (pos.IsZero)
                    {
                        continue;
                    }
                    var extraDamage = haveEb && !v.HasModifier("modifier_item_ethereal_blade_ethereal") ? 40 : 0;
                    extraDamage += haveVeil && !v.HasModifier("modifier_item_veil_of_discord_debuff") ? 25 : 0;
                    var myDmg = InSys.Where(x => x.CanBeCasted() && IsAbilityEnable(x.StoredName()))
                                .Sum(
                        x =>
                        AbilityDamage.CalculateDamage(x, Members.MyHero, v,
                                                      minusMagicResistancePerc: extraDamage));
                    var health    = v.Health;
                    var extraLife =
                        (uint)(Manager.HeroManager.GetItemList(v)
                               .Any(x => x.StoredName() == "item_infused_raindrop" && x.Cooldown <= 0)
                            ? 120
                            : 0);
                    if (extraLife > 100)
                    {
                        var needToCalcExtraLife =
                            InSys.Any(
                                x =>
                                x.DamageType == DamageType.Magical &&
                                AbilityDamage.CalculateDamage(x, Members.MyHero, v,
                                                              minusMagicResistancePerc: haveEb ? 40 : 0) > 120);
                        health += needToCalcExtraLife ? extraLife : 0;
                    }

                    var healthAfterShit = (int)(health - myDmg);
                    var size            = HUDInfo.GetHpBarSizeY();
                    var text            = $"{healthAfterShit} ({(int) myDmg})";
                    var textSize        = Drawing.MeasureText(text, "Arial",
                                                              new Vector2((float)(size * 1.5), 500), FontFlags.AntiAlias);
                    var textPos = pos + new Vector2(HUDInfo.GetHPBarSizeX() + 4, 0);
                    var isEno   = healthAfterShit < 0;
                    var name    = isEno ? "killableCol" : "defCol";
                    Drawing.DrawText(
                        text,
                        textPos,
                        new Vector2(textSize.Y, 0),
                        new Color(R(name), G(name), B(name), 255),
                        FontFlags.AntiAlias | FontFlags.StrikeOut);
                }
                catch (Exception)
                {
                    Printer.Print($"[DamageCalculation]: {v.StoredName()}");
                }
            }
        }