Exemplo n.º 1
0
        private void Roll_RollUsed(Roll sender, Event.RollUsedEvent.RollUsedEventArgs e)
        {
            UpdateManager.BeginInvoke(650, () =>
            {
                var target = TargetSelector.CurrentTarget;
                var dist   = Owner.Distance2D(e.Destination);

                if (dist < 300)
                {
                    return;
                }

                var newTargetPos = PredictionManager.GetPrediction(e.PredictionInput).UnitPosition;

                if (StoneExtensions.FirstUnitBetween(Owner.Position, newTargetPos, StoneExtensions.StoneName, 250, 600) != null)
                {
                    return;
                }

                if (e.Destination.Distance2D(newTargetPos) > 200 + dist / 3)
                {
                    return;
                }

                UseAbility(Owner.Position.Extend(newTargetPos, 150));
            });
        }
Exemplo n.º 2
0
        public bool UseAbilityOnStone(Unit target)
        {
            var stone = StoneExtensions.FirstUnitInRange(Owner.Position, StoneExtensions.StoneName, 200);

            if (stone == null)
            {
                return(false);
            }

            var castPos = Owner.Position + (GetPrediction(target) - stone.Position).Normalized() * 400;

            return(base.UseAbility(castPos));
        }
Exemplo n.º 3
0
        public override bool UseAbility(Unit target)
        {
            if (!CanBeCasted() || target.IsMagicImmune())
            {
                return(false);
            }

            var rudePrediction = target.IsMoving ? target.InFront(target.Speed) : target.Position;

            float range = this.Range;
            float speed = this.Speed;

            bool willGetStoneBuff = (Owner.Spellbook.Spell4.CurrentCharges > 0 ||
                                     StoneExtensions.FirstUnitBetween(Owner.Position, rudePrediction, StoneExtensions.StoneName, 250, 400) != null);

            if (willGetStoneBuff)
            {
                range += 750;
                speed += 800;
            }

            if (range < Owner.Distance2D(target))
            {
                return(false);
            }

            var input = new PredictionInput
            {
                Delay  = Owner.TurnTime(rudePrediction) + 0.6f, // 0.6f is "cast point"
                Range  = range,
                Speed  = speed,
                Radius = this.Radius,
                Owner  = this.Owner
            };

            input = input.WithTarget(target);

            var predictionPoint = PredictionManager.GetPrediction(input).CastPosition;



            Base.Cast(predictionPoint);

            RollUsed?.Invoke(this, new RollUsedEventArgs(input, predictionPoint));

            return(true);
        }
Exemplo n.º 4
0
        private void OrderManager_OrderAdding(Divine.Order.EventArgs.OrderAddingEventArgs e)
        {
            if (e.IsCustom ||
                IsIgnoringInputs ||
                e.Order.Type == OrderType.UpgradeSpell)
            {
                return;
            }

            var localHeroPos = localHero.Position;

            if (smartSmash.Value &&
                e.Order.Ability == smash.Base &&
                e.Order.Type != OrderType.CastTarget)
            {
                if (StoneExtensions.FirstUnitInRange(localHeroPos, stoneName, 200) != null ||
                    EntityManager.GetEntities <Hero>().Any(x => x.Distance2D(localHero) < 200 &&
                                                           x.IsAlive &&
                                                           x.IsEnchanted()))
                {
                    return;
                }

                stone.Base.Cast(localHero.InFront(100));
                return;
            }

            if (smartGrip.Value && e.Order.Ability == grip.Base)
            {
                var mousePos = GameManager.MousePosition;

                if (StoneExtensions.FirstUnitInRange(mousePos, stoneName, 200) != null ||
                    EntityManager.GetEntities <Hero>().Any(x => x.Distance2D(mousePos) < 200 &&
                                                           x.IsAlive &&
                                                           (x.IsEnchanted() ||
                                                            (x.IsAlly(localHero) && localHero.Spellbook.Talents
                                                             .FirstOrDefault(x => x.Id == AbilityId.special_bonus_unique_earth_spirit_2).Level > 0))))
                {
                    return;
                }

                stone.Base.Cast(mousePos);
                return;
            }

            if (smartRoll.Value && e.Order.Ability == roll.Base)
            {
                var orderPos = e.Order.Position;

                if (orderPos.Distance2D(localHeroPos) > roll.Range)
                {
                    return;
                }

                if (StoneExtensions.FirstUnitInRange(localHeroPos.Extend(orderPos, 100), stoneName, 200) != null ||
                    StoneExtensions.FirstUnitInRange(localHeroPos.Extend(orderPos, 300), stoneName, 200) != null)
                {
                    return;
                }

                var startTime = 600 + (int)(localHero.TurnTime(orderPos) * 1000);

                UpdateManager.BeginInvoke(startTime, () =>
                {
                    stone.UseAbility();
                    return;
                });
            }
        }
Exemplo n.º 5
0
        private void UpdateManager_IngameUpdate()
        {
            var target = TargetSelector.CurrentTarget;

            if (target == null || !target.IsAlive || target.IsEnchanted())
            {
                return;
            }

            if (!OrbWalkerSleeper.Sleeping)
            {
                OrbwalkerManager.OrbwalkTo(target, GameManager.MousePosition);
                OrbWalkerSleeper.Sleep(200);
                return;
            }

            if (AbilitySleeper.Sleeping || localHero.IsRooted())
            {
                return;
            }

            var distanceToTarget = localHero.Distance2D(target);
            var blinkRange       = Blink?.Range;

            //blink logic
            if (Blink != null &&
                Blink.CanBeCasted())
            {
                if (Roll.CanBeCasted() &&
                    blinkRange < distanceToTarget &&
                    blinkRange + Roll.Range > distanceToTarget &&
                    Blink.UseAbility(target))
                {
                    Stone.Sleeper.Sleep(300);
                    Roll.Sleeper.Sleep(300);
                    AbilitySleeper.Sleep(200);
                    return;
                }

                if (!Roll.CanBeCasted() &&
                    distanceToTarget > blinkRange / 3 &&
                    distanceToTarget < blinkRange &&
                    Blink.UseAbility(target))
                {
                    Stone.Sleeper.Sleep(300);
                    Roll.Sleeper.Sleep(300);
                    AbilitySleeper.Sleep(200);
                    return;
                }
            }

            if (VeilOfDiscord != null &&
                VeilOfDiscord.UseAbility(target))
            {
                AbilitySleeper.Sleep(100);
                return;
            }

            if (Hex != null &&
                Hex.UseAbility(target))
            {
                AbilitySleeper.Sleep(100);
                return;
            }

            if (Abyssal != null &&
                Abyssal.UseAbility(target))
            {
                AbilitySleeper.Sleep(100);
                return;
            }

            if (target.IsMagicImmune())
            {
                return;
            }

            var firstStoneNearEnemy = StoneExtensions.FirstUnitInRange(target.Position, StoneExtensions.StoneName, 500);
            var firstStoneNearHero  = StoneExtensions.FirstUnitInRange(localHero.Position, StoneExtensions.StoneName, 250);

            // roll logic
            if (Roll.CanBeCasted())
            {
                var rudePredict   = target.IsMoving ? target.InFront(150) : target.Position;
                var prediction    = Smash.GetPrediction(target);
                var distToPredict = prediction.Distance2D(localHero.Position);

                if (firstStoneNearHero == null &&
                    firstStoneNearEnemy == null &&
                    !target.IsInvulnerable() &&
                    !context.AutoPushInTowerDirection.CanPushInTower &&
                    distToPredict < 600f &&
                    Grip.CanBeCasted() &&
                    Smash.CanBeCasted() &&
                    Stone.UseAbility(localHero.Position.Extend(rudePredict, 100)))
                {
                    Blink?.Sleeper.Sleep(300);
                    Grip.Sleeper.Sleep(distToPredict / Grip.Speed * 1000);
                    Stone.Sleeper.Sleep(500);
                    Roll.Sleeper.Sleep(300 + distToPredict / Grip.Speed * 1000);
                    AbilitySleeper.Sleep(100);
                    return;
                }

                var stoneBetween = StoneExtensions.FirstUnitBetween(localHero.Position, rudePredict, StoneExtensions.StoneName, 250, 350);

                if (firstStoneNearEnemy != null &&
                    firstStoneNearEnemy.Distance2D(localHero) < 1000f &&
                    stoneBetween == null &&
                    Grip.UseAbility(firstStoneNearEnemy.Position))
                {
                    Blink?.Sleeper.Sleep(300);
                    AbilitySleeper.Sleep(100);
                    return;
                }
                else if (firstStoneNearEnemy == null &&
                         distToPredict < 900f &&
                         !target.IsInvulnerable() &&
                         stoneBetween == null &&
                         !localHero.IsInRollPhase() &&
                         Grip.CanBeCasted() &&
                         Stone.UseAbility(rudePredict))
                {
                    Blink?.Sleeper.Sleep(300);
                    Stone.Sleeper.Sleep(500);
                    AbilitySleeper.Sleep(200);
                    return;
                }

                if (!localHero.IsInRollPhase() &&
                    Roll.UseAbility(target))
                {
                    Smash.Sleeper.Sleep(1000);
                    Blink?.Sleeper.Sleep(300);
                    AbilitySleeper.Sleep(800);
                    return;
                }
            }

            var intersectingStone = EntityManager.GetEntities <Unit>()
                                    .FirstOrDefault(x => x.Distance2D(target) < Grip.Range &&
                                                    x.Name == StoneExtensions.StoneName &&
                                                    x.IsAlive &&
                                                    StoneExtensions.FirstUnitBetween(localHero.Position, x.Position, target.Name, 200, Grip.Range) == target);

            if (intersectingStone != null &&
                !target.IsInvulnerable() &&
                Grip.UseAbility(intersectingStone.Position))
            {
                Smash.Sleeper.Sleep(intersectingStone.Distance2D(localHero) / Grip.Speed * 1100);
                AbilitySleeper.Sleep(200);
                return;
            }

            if (Orchid != null &&
                Orchid.UseAbility(target))
            {
                AbilitySleeper.Sleep(100);
                return;
            }

            if (Halberd != null &&
                Halberd.UseAbility(target))
            {
                AbilitySleeper.Sleep(100);
                return;
            }

            if (Shivas != null &&
                Shivas.UseAbility(target))
            {
                AbilitySleeper.Sleep(100);
                return;
            }


            if (distanceToTarget < Smash.Range * 0.4f &&
                !target.IsInvulnerable() &&
                Smash.UseAbilityOnStone(target))
            {
                AbilitySleeper.Sleep(200);
                return;
            }

            if (distanceToTarget < Smash.Range * 0.4f &&
                !localHero.IsInRollPhase() &&
                !target.IsInvulnerable() &&
                Grip.CanBeCasted() &&
                Smash.CanBeCasted() &&
                Stone.UseAbility())

            {
                Stone.Sleeper.Sleep(300);
                AbilitySleeper.Sleep(200);
                return;
            }

            if (distanceToTarget < Smash.Range * 0.4f &&
                firstStoneNearHero == null &&
                !target.IsInvulnerable() &&
                (Grip.Base.Cooldown > Smash.Base.CooldownLength ||
                 (!Grip.CanBeCasted() && Grip.Base.Cooldown == 0)) &&
                !localHero.IsInRollPhase() &&
                Smash.CanBeCasted() &&
                !context.AutoPushInTowerDirection.CanPushInTower &&
                Stone.UseAbility())
            {
                Stone.Sleeper.Sleep(300);
                AbilitySleeper.Sleep(100);
                return;
            }

            if (SpiritVessel != null &&
                SpiritVessel.UseAbility(target))
            {
                AbilitySleeper.Sleep(100);
                return;
            }
        }