Пример #1
0
        private float GetRequiredTime(Unit9 ally, Vector3 movePosition, float remainingTime, out DodgeAbility speedBuffAbility)
        {
            var turnTime = ally.GetTurnTime(movePosition);
            var distance = ally.Distance(movePosition);
            var speed    = ally.Speed;

            var requiredTime = turnTime + (distance / speed);

            if (remainingTime > requiredTime)
            {
                speedBuffAbility = null;
                return(requiredTime);
            }

            speedBuffAbility = this.dodgeAbilities.Where(x => x.CanBeCasted(ally, null, null))
                               .OrderByDescending(x => x.SpeedBuffAbility.GetSpeedBuff(ally))
                               .FirstOrDefault();

            if (speedBuffAbility == null)
            {
                return(requiredTime);
            }

            return(turnTime + (distance / (speed + speedBuffAbility.SpeedBuffAbility.GetSpeedBuff(ally))));
        }
Пример #2
0
        private bool?UseSingleBlink(Unit9 owner, IEnumerable <OldBlinkAbility> blinkAbilities, Vector3 position, float distance)
        {
            foreach (var blinkAbility in blinkAbilities)
            {
                if (blinkAbility.Blink.Range < distance)
                {
                    continue;
                }

                switch (blinkAbility.Blink.BlinkType)
                {
                case BlinkType.Blink:
                {
                    if (!blinkAbility.Use(position))
                    {
                        return(false);
                    }

                    if (blinkAbility.Ability.Speed <= 0)
                    {
                        return(true);
                    }

                    return(null);
                }

                case BlinkType.Leap:
                {
                    if (owner.GetAngle(position) > 0.2)
                    {
                        owner.BaseUnit.Move(owner.Position.Extend2D(position, 25));
                        this.OrbwalkSleeper.Sleep(owner.Handle, owner.GetTurnTime(position));
                        return(null);
                    }

                    if (!blinkAbility.Use(owner))
                    {
                        return(false);
                    }

                    if (blinkAbility.Ability.Speed <= 0)
                    {
                        return(true);
                    }

                    return(null);
                }
                }
            }

            return(false);
        }
Пример #3
0
        // Token: 0x06000046 RID: 70 RVA: 0x0000F638 File Offset: 0x0000D838
        public PredictionOutput9 GetSimplePrediction(PredictionInput9 input)
        {
            Unit9             target           = input.Target;
            Vector3           position         = input.Target.Position;
            Unit9             caster           = input.Caster;
            bool              isVisible        = target.IsVisible;
            float             num              = input.Delay;
            PredictionOutput9 predictionOutput = new PredictionOutput9
            {
                Target = target
            };

            if (target.Equals(caster))
            {
                predictionOutput.HitChance      = HitChance.High;
                predictionOutput.TargetPosition = position;
                predictionOutput.CastPosition   = position;
                return(predictionOutput);
            }
            if (input.RequiresToTurn)
            {
                num += caster.GetTurnTime(position);
            }
            if (input.Speed > 0f)
            {
                num += caster.Distance(position) / input.Speed;
            }
            Vector3 predictedPosition = target.GetPredictedPosition(num);

            predictionOutput.TargetPosition = predictedPosition;
            predictionOutput.CastPosition   = predictedPosition;
            if (!isVisible)
            {
                predictionOutput.HitChance = HitChance.Low;
                return(predictionOutput);
            }
            if (target.IsStunned || target.IsRooted || target.IsHexed)
            {
                predictionOutput.HitChance = HitChance.Immobile;
                return(predictionOutput);
            }
            if (!target.IsMoving && !caster.IsVisibleToEnemies)
            {
                predictionOutput.HitChance = HitChance.High;
                return(predictionOutput);
            }
            predictionOutput.HitChance = ((num > 0.5f) ? HitChance.Medium : HitChance.High);
            return(predictionOutput);
        }
Пример #4
0
        public override float GetRequiredTime(Unit9 ally, Unit9 enemy, IObstacle obstacle)
        {
            var remainingTime = obstacle.GetEvadeTime(ally, true) - this.ActiveAbility.CastPoint;

            this.tree = this.trees
                        .Where(
                x => x.IsValid && x.IsAlive && ally.Distance(x.Position) < this.ActiveAbility.CastRange &&
                (GameManager.RawGameTime > this.ultEndTime || x.Distance2D(this.ultPosition) < this.ult.Radius - 50))
                        .OrderBy(x => x.Distance2D(this.FountainPosition))
                        .FirstOrDefault(x => ally.GetTurnTime(x.Position) + 0.1f < remainingTime);

            if (this.tree == null)
            {
                return(9999);
            }

            return(this.ActiveAbility.GetCastDelay(this.tree.Position) + 0.15f);
        }
 // Token: 0x060008C7 RID: 2247 RVA: 0x00027A9C File Offset: 0x00025C9C
 private bool?UseSingleBlink(Unit9 owner, IEnumerable <OldBlinkAbility> blinkAbilities, Vector3 position, float distance)
 {
     foreach (OldBlinkAbility oldBlinkAbility in blinkAbilities)
     {
         if (oldBlinkAbility.Blink.Range >= distance)
         {
             BlinkType blinkType = oldBlinkAbility.Blink.BlinkType;
             if (blinkType != null)
             {
                 if (blinkType == 1)
                 {
                     if ((double)owner.GetAngle(position, false) > 0.2)
                     {
                         owner.BaseUnit.Move(Vector3Extensions.Extend2D(owner.Position, position, 25f));
                         base.OrbwalkSleeper.Sleep(owner.Handle, owner.GetTurnTime(position));
                         return(null);
                     }
                     if (!oldBlinkAbility.Use(owner))
                     {
                         return(new bool?(false));
                     }
                     if (oldBlinkAbility.Ability.Speed <= 0f)
                     {
                         return(new bool?(true));
                     }
                     return(null);
                 }
             }
             else
             {
                 if (!oldBlinkAbility.Use(position))
                 {
                     return(new bool?(false));
                 }
                 if (oldBlinkAbility.Ability.Speed <= 0f)
                 {
                     return(new bool?(true));
                 }
                 return(null);
             }
         }
     }
     return(new bool?(false));
 }
Пример #6
0
        public override float GetRequiredTime(Unit9 ally, Unit9 enemy, IObstacle obstacle)
        {
            var additionalTime = 0f;

            this.position = Vector3.Zero;

            switch (obstacle.EvadableAbility)
            {
            case HomingMissileEvadable _:
            {
                var missilePosition = ((HomingMissileObstacle)obstacle).Position;
                this.position   = ally.Position.Extend2D(missilePosition, 199);
                additionalTime += ally.GetTurnTime(this.position);
                break;
            }

            case PhantomsEmbraceEvadable _:
            {
                var casterPosition = obstacle.Caster.Position;
                var range          = 225 + (50 * this.Ability.Level);
                this.position   = ally.Position.Extend2D(casterPosition, range);
                additionalTime += ally.GetTurnTime(this.position) + 0.07f;
                break;
            }

            case ChargeOfDarknessEvadable _:
            {
                var spiritBreakerPosition = obstacle.Caster.Position;
                var range = 175 + (50 * this.Ability.Level);
                this.position   = ally.Position.Extend2D(spiritBreakerPosition, range);
                additionalTime += ally.GetTurnTime(this.position) + 0.3f;
                break;
            }

            case TargetableProjectileEvadable projectile:
            {
                if (!projectile.IsDisjointable)
                {
                    this.position   = ally.Position.Extend2D(enemy.Position, 199);
                    additionalTime += ally.GetTurnTime(this.position);
                }

                if (obstacle.EvadableAbility.Ability.Id == AbilityId.sven_storm_bolt)
                {
                    this.position = ally.InFront(300);
                }

                additionalTime += 0.05f;
                break;
            }

            case LinearProjectileEvadable _:
            case ConeProjectileEvadable _:
            case AreaOfEffectEvadable _ when obstacle.EvadableAbility.Ability.Id == AbilityId.venomancer_poison_nova:
            {
                var path = this.pathfinder.GetPathFromObstacle(ally, ally.Speed, ally.Position, 69, out var success);
                if (!success)
                {
                    return(69);
                }

                this.position   = path.Last();
                additionalTime += ally.GetTurnTime(this.position) + 0.05f;
                break;
            }

            case AreaOfEffectEvadable _:
            {
                //todo more aoe spells with speed

                var pathAoe = this.pathfinder.GetPathFromObstacle(ally, ally.Speed, ally.Position, 69, out var success);
                if (!success)
                {
                    return(69);
                }

                var safePosition = pathAoe.Last().Extend2D(this.Owner.Position, -50);

                switch (obstacle.EvadableAbility.Ability.Id)
                {
                case AbilityId.nevermore_requiem:
                {
                    if (ally.Distance(enemy.Position) < 600)
                    {
                        this.position = safePosition;
                    }
                    else
                    {
                        var jumpPosition = ally.Position.Extend2D(enemy.Position, 600);
                        this.position = this.Owner.Distance(jumpPosition) > this.Owner.Distance(safePosition)
                                                    ? safePosition
                                                    : jumpPosition;
                    }

                    additionalTime += ally.GetTurnTime(this.position) + 0.15f;
                    break;
                }

                case AbilityId.tidehunter_ravage:
                {
                    if (ally.Distance(enemy.Position) < 600)
                    {
                        this.position = safePosition;
                    }
                    else
                    {
                        var jumpPosition = ally.Position.Extend2D(enemy.Position, 600);
                        this.position = this.Owner.Distance(jumpPosition) > this.Owner.Distance(safePosition)
                                                    ? safePosition
                                                    : jumpPosition;
                    }

                    additionalTime += ally.GetTurnTime(this.position) + 0.1f;
                    break;
                }
                }

                break;
            }
            }

            if (this.position.IsZero)
            {
                this.position = ally.InFront(ally.IsMoving ? 190 : 90);
            }

            return(this.ActiveAbility.GetHitTime(ally) + additionalTime);
        }