// Token: 0x0600070D RID: 1805 RVA: 0x00021360 File Offset: 0x0001F560
        public bool?BodyBlock(TargetManager targetManager, Vector3 blockPosition, ComboModeMenu menu)
        {
            if (!this.Owner.CanMove(true) || this.MoveSleeper.IsSleeping)
            {
                return(new bool?(false));
            }
            Unit9 target = targetManager.Target;
            float angle  = target.GetAngle(this.Owner.Position, false);

            if ((double)angle > 1.2)
            {
                if (this.Owner.Speed <= target.Speed + 35f)
                {
                    return(null);
                }
                float   num     = angle * 0.6f;
                Vector3 vector  = target.InFront((float)this.BodyBlockRange, MathUtil.RadiansToDegrees(num), true);
                Vector3 vector2 = target.InFront((float)this.BodyBlockRange, MathUtil.RadiansToDegrees(-num), true);
                if (this.Move((this.Owner.Distance(vector) < this.Owner.Distance(vector2)) ? vector : vector2))
                {
                    this.MoveSleeper.Sleep(0.1f);
                    return(new bool?(true));
                }
                return(new bool?(false));
            }
            else if ((double)angle < 0.36)
            {
                if (!target.IsMoving && this.CanAttack(target, 400f))
                {
                    return(new bool?(this.Attack(target, menu)));
                }
                if (this.Owner.IsMoving && !this.AttackSleeper.IsSleeping)
                {
                    this.MoveSleeper.Sleep(0.2f);
                    return(new bool?(this.Owner.BaseUnit.Stop()));
                }
                return(new bool?(false));
            }
            else
            {
                if (this.Move(Vector3Extensions.Extend2D(target.Position, blockPosition, (float)this.BodyBlockRange)))
                {
                    this.MoveSleeper.Sleep(0.1f);
                    return(new bool?(true));
                }
                return(new bool?(false));
            }
        }
Пример #2
0
        // Token: 0x060003BA RID: 954 RVA: 0x00015170 File Offset: 0x00013370
        protected override bool ForceMove(Unit9 target, bool attack)
        {
            Vector3 mousePosition = Game.MousePosition;
            Vector3 vector        = mousePosition;

            if (target != null && attack)
            {
                Vector3 position = target.Position;
                vector = target.InFront(100f, 180f, false);
                if (base.Menu.OrbwalkingMode == "Move to target" || this.CanAttack(target, 400f))
                {
                    vector = position;
                }
                if (base.Menu.DangerRange > 0)
                {
                    int   num  = Math.Min((int)base.Owner.GetAttackRange(null, 0f), base.Menu.DangerRange);
                    float num2 = base.Owner.Distance(target);
                    if (base.Menu.DangerMoveToMouse)
                    {
                        if (num2 < (float)num)
                        {
                            vector = mousePosition;
                        }
                    }
                    else if (num2 < (float)num)
                    {
                        float num3 = (position - base.Owner.Position).AngleBetween(vector - position);
                        if (num3 < 90f)
                        {
                            if (num3 < 30f)
                            {
                                vector = Vector3Extensions.Extend2D(position, vector, (float)((num - 25) * -1));
                            }
                            else
                            {
                                Vector3 vector2 = (mousePosition - position).Rotated(MathUtil.DegreesToRadians(90f)).Normalized() * (float)(num - 25);
                                Vector3 vector3 = position + vector2;
                                Vector3 vector4 = position - vector2;
                                vector = ((base.Owner.Distance(vector3) < base.Owner.Distance(vector4)) ? vector3 : vector4);
                            }
                        }
                        else if (target.Distance(vector) < (float)num)
                        {
                            vector = Vector3Extensions.Extend2D(position, vector, (float)(num - 25));
                        }
                    }
                }
            }
            if (vector == base.LastMovePosition)
            {
                return(false);
            }
            if (!base.Owner.BaseUnit.Move(vector))
            {
                return(false);
            }
            base.LastMovePosition = vector;
            return(true);
        }
Пример #3
0
 // Token: 0x06000742 RID: 1858 RVA: 0x00005AF5 File Offset: 0x00003CF5
 public override bool Orbwalk(Unit9 target, bool attack, bool move, ComboModeMenu comboMenu = null)
 {
     if (target != null && base.Owner.HasModifier("modifier_juggernaut_blade_fury"))
     {
         return(base.Move(target.InFront(100f, 0f, true)));
     }
     return(base.Orbwalk(target, attack, move, comboMenu));
 }
        // Token: 0x06000322 RID: 802 RVA: 0x0001BBC4 File Offset: 0x00019DC4
        public override void AddDrawableAbility(List <IDrawableAbility> drawableAbilities, ParticleEffect particle, Team allyTeam, INotificator notificator)
        {
            Unit9 unit;

            if (!base.SearchOwner && particle.Owner is Unit)
            {
                unit = EntityManager9.GetUnit(particle.Owner.Handle);
            }
            else
            {
                Ability9 ability = EntityManager9.Abilities.FirstOrDefault((Ability9 x) => x.Id == this.AbilityId && x.Owner.Team != allyTeam);
                unit = ((ability != null) ? ability.Owner : null);
            }
            Unit9 unit2 = unit;

            if (unit2 == null || unit2.IsVisible)
            {
                return;
            }
            if (Game.RawGameTime - unit2.LastVisibleTime >= 1f)
            {
                DrawableAbility item = new DrawableAbility
                {
                    AbilityTexture     = base.AbilityId + "_rounded",
                    HeroTexture        = unit2.Name + "_rounded",
                    MinimapHeroTexture = unit2.Name + "_icon",
                    ShowUntil          = Game.RawGameTime + base.TimeToShow,
                    Position           = particle.GetControlPoint(base.ControlPoint)
                };
                drawableAbilities.Add(item);
                return;
            }
            Ability9 ability2 = unit2.Abilities.FirstOrDefault((Ability9 x) => x.Id == this.AbilityId);

            if (ability2 == null)
            {
                return;
            }
            DrawableAbility item2 = new DrawableAbility
            {
                AbilityTexture     = base.AbilityId + "_rounded",
                HeroTexture        = unit2.Name + "_rounded",
                MinimapHeroTexture = unit2.Name + "_icon",
                ShowUntil          = Game.RawGameTime + base.TimeToShow,
                Position           = unit2.InFront(ability2.Range, 0f, true)
            };

            drawableAbilities.Add(item2);
        }
Пример #5
0
        public virtual bool IsIntersecting(Unit9 unit, bool checkPrediction)
        {
            if (this.Polygon == null)
            {
                return(false);
            }

            if (!this.Polygon.IsOutside(unit.Position.To2D()))
            {
                return(true);
            }

            if (!checkPrediction || this.NavMeshId == null || (!unit.IsMoving && !unit.IsRotating))
            {
                return(false);
            }

            return(!this.Polygon.IsOutside(unit.InFront(100).To2D()));
        }
Пример #6
0
        // Token: 0x06000378 RID: 888 RVA: 0x00013CB8 File Offset: 0x00011EB8
        public override bool UseAbility(TargetManager targetManager, Sleeper comboSleeper, bool aoe)
        {
            Unit9 target = targetManager.Target;

            if (base.Owner.HasAghanimsScepter && (target.GetImmobilityDuration() > 0f || !target.IsMoving) && !targetManager.EnemyHeroes.Any((Unit9 x) => !x.Equals(target) && x.Distance(target) < 900f))
            {
                Vector3 vector = target.InFront(base.Ability.Radius + (float)(target.IsMoving ? 30 : 10), 0f, true);
                if (base.Owner.Distance(vector) > base.Ability.CastRange)
                {
                    return(false);
                }
                if (!base.Ability.UseAbility(vector, false, false))
                {
                    return(false);
                }
            }
            else
            {
                PredictionInput9 predictionInput = base.Ability.GetPredictionInput(target, null);
                predictionInput.Delay += 0.3f;
                PredictionOutput9 predictionOutput = base.Ability.GetPredictionOutput(predictionInput);
                if (predictionOutput.HitChance < 1)
                {
                    return(false);
                }
                if (!base.Ability.UseAbility(predictionOutput.CastPosition, false, false))
                {
                    return(false);
                }
            }
            float castDelay = base.Ability.GetCastDelay(targetManager.Target);

            comboSleeper.Sleep(castDelay);
            base.Sleeper.Sleep(castDelay + 0.5f);
            base.OrbwalkSleeper.Sleep(castDelay);
            return(true);
        }
Пример #7
0
        protected override bool ForceMove(Unit9 target, bool attack)
        {
            var mousePosition = GameManager.MousePosition;
            var movePosition  = mousePosition;

            if (target != null && attack)
            {
                var targetPosition = target.Position;
                movePosition = target.InFront(100, 180, false);

                if (this.Menu.OrbwalkingMode == "Move to target" || this.CanAttack(target, 400))
                {
                    movePosition = targetPosition;
                }

                if (this.Menu.DangerRange > 0)
                {
                    var dangerRange    = Math.Min((int)this.Owner.GetAttackRange(), this.Menu.DangerRange);
                    var targetDistance = this.Owner.Distance(target);

                    if (this.Menu.DangerMoveToMouse)
                    {
                        if (targetDistance < dangerRange)
                        {
                            movePosition = mousePosition;
                        }
                    }
                    else
                    {
                        if (targetDistance < dangerRange)
                        {
                            var angle = (targetPosition - this.Owner.Position).AngleBetween(movePosition - targetPosition);
                            if (angle < 90)
                            {
                                if (angle < 30)
                                {
                                    movePosition = targetPosition.Extend2D(movePosition, (dangerRange - 25) * -1);
                                }
                                else
                                {
                                    var difference = mousePosition - targetPosition;
                                    var rotation   = difference.Rotated(MathUtil.DegreesToRadians(90));
                                    var end        = rotation.Normalized() * (dangerRange - 25);
                                    var right      = targetPosition + end;
                                    var left       = targetPosition - end;

                                    movePosition = this.Owner.Distance(right) < this.Owner.Distance(left) ? right : left;
                                }
                            }
                            else if (target.Distance(movePosition) < dangerRange)
                            {
                                movePosition = targetPosition.Extend2D(movePosition, dangerRange - 25);
                            }
                        }
                    }
                }
            }

            if (movePosition == this.LastMovePosition)
            {
                return(false);
            }

            if (!this.Owner.BaseUnit.Move(movePosition))
            {
                return(false);
            }

            this.LastMovePosition = movePosition;
            return(true);
        }
Пример #8
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);
        }
Пример #9
0
 public override bool Use(Unit9 ally, Unit9 enemy, IObstacle obstacle)
 {
     this.MoveCamera(ally.Position);
     return(this.ActiveAbility.UseAbility(ally.InFront(100), false, true));
 }
 // Token: 0x060008C5 RID: 2245 RVA: 0x000278CC File Offset: 0x00025ACC
 private Vector3 GetBlinkPosition(Unit9 owner, Unit9 target, ComboModeMenu menu)
 {
     if (this.Disables.CanBeCasted(this.forceBlinkAbilities, menu, target))
     {
         if (target.IsMoving)
         {
             return(target.Position);
         }
         return(Vector3Extensions.Extend2D(target.Position, owner.Position, 25f));
     }
     else
     {
         if (this.Disables.CanBeCasted(new HashSet <AbilityId>
         {
             AbilityId.item_cyclone
         }, menu, target) && this.Specials.CanBeCasted(new HashSet <AbilityId>
         {
             AbilityId.item_cyclone
         }, menu, target))
         {
             return(Vector3Extensions.Extend2D(target.Position, owner.Position, 25f));
         }
         Vector3 result = owner.IsRanged ? Vector3Extensions.Extend2D(target.Position, owner.Position, owner.GetAttackRange(null, 0f) * 0.75f) : target.InFront(25f, 0f, true);
         if (owner.Distance(target) < owner.GetAttackRange(target, 100f))
         {
             return(Vector3.Zero);
         }
         return(result);
     }
 }
Пример #11
0
        private Vector3 GetBlinkPosition(Unit9 owner, Unit9 target, ComboModeMenu menu)
        {
            if (this.Disables.CanBeCasted(this.forceBlinkAbilities, menu, target))
            {
                if (target.IsMoving)
                {
                    return(target.Position);
                }
                else
                {
                    return(target.Position.Extend2D(owner.Position, 25));
                }
            }

            if (this.Disables.CanBeCasted(
                    new HashSet <AbilityId>
            {
                AbilityId.item_cyclone
            },
                    menu,
                    target) && this.Specials.CanBeCasted(
                    new HashSet <AbilityId>
            {
                AbilityId.item_cyclone
            },
                    menu,
                    target))
            {
                return(target.Position.Extend2D(owner.Position, 25));
            }

            var position = owner.IsRanged ? target.Position.Extend2D(owner.Position, owner.GetAttackRange() * 0.75f) : target.InFront(25);

            if (owner.Distance(target) < owner.GetAttackRange(target, 100))
            {
                return(Vector3.Zero);
            }

            return(position);
        }
        // Token: 0x06000755 RID: 1877 RVA: 0x0002243C File Offset: 0x0002063C
        protected override void Execute()
        {
            if (this.sleeper.IsSleeping)
            {
                return;
            }
            Unit9 unit = this.ward;

            if (unit == null || !unit.IsValid || !this.ward.IsAlive)
            {
                return;
            }
            Vector3      fountain    = base.TargetManager.Fountain;
            Unit9        owner       = this.ward.Owner;
            HealingWard  healingWard = (HealingWard)owner.Abilities.First((Ability9 x) => x.Id == AbilityId.juggernaut_healing_ward);
            List <Unit9> list        = (from x in base.TargetManager.AllyHeroes
                                        where x.HealthPercentage < 90f || x.IsMyHero
                                        orderby x.HealthPercentage
                                        select x).ToList <Unit9>();
            Unit9 unit2 = (owner.HealthPercentage < 80f && owner.IsAlive) ? owner : list.FirstOrDefault <Unit9>();

            if (unit2 == null || !unit2.IsAlive)
            {
                return;
            }
            PredictionInput9 predictionInput = healingWard.GetPredictionInput(unit2, list);

            predictionInput.CastRange = 2000f;
            PredictionOutput9 predictionOutput = healingWard.GetPredictionOutput(predictionInput);

            if (predictionOutput.HitChance < 1)
            {
                return;
            }
            Vector3 vector = predictionOutput.CastPosition;

            if (predictionOutput.AoeTargetsHit.Count == 1)
            {
                vector = predictionOutput.TargetPosition;
            }
            if (!unit2.Equals(owner) || owner.HealthPercentage > 50f)
            {
                foreach (Unit9 unit3 in from x in base.TargetManager.EnemyHeroes
                         orderby x.GetAttackRange(null, 0f) descending
                         select x)
                {
                    float num = unit3.GetAttackRange(null, 0f) * (unit3.IsRanged ? 2f : 3f);
                    if (unit3.Distance(vector) <= num)
                    {
                        vector = unit2.InFront(5f, 0f, false);
                        break;
                    }
                }
            }
            if (this.ward.Position == vector)
            {
                return;
            }
            this.ward.BaseUnit.Move(vector);
            this.sleeper.Sleep(0.15f);
        }
Пример #13
0
        // Token: 0x0600031A RID: 794 RVA: 0x0001B924 File Offset: 0x00019B24
        public override void AddDrawableAbility(List <IDrawableAbility> drawableAbilities, ParticleEffect particle, Team allyTeam, INotificator notificator)
        {
            Vector3         position = particle.GetControlPoint(base.ControlPoint);
            List <Ability9> list     = (from x in EntityManager9.Abilities
                                        where x.Id == this.AbilityId && x.Owner.CanUseAbilities && x.Owner.IsAlive
                                        select x).ToList <Ability9>();

            if (list.Count == 0 || list.All((Ability9 x) => x.Owner.Team == allyTeam))
            {
                return;
            }
            if (list.Any((Ability9 x) => x.Owner.IsVisible && x.Owner.Distance(position) < 1500f && x.TimeSinceCasted < 0.5f))
            {
                return;
            }
            List <Ability9> list2 = (from x in list
                                     where x.Owner.Team != allyTeam && !x.Owner.IsVisible && x.RemainingCooldown <= 0f
                                     select x).ToList <Ability9>();

            if (list2.Count == 0)
            {
                return;
            }
            if (list2.Count == 1)
            {
                Unit9           owner = list2[0].Owner;
                DrawableAbility item  = new DrawableAbility
                {
                    AbilityTexture     = base.AbilityId + "_rounded",
                    HeroTexture        = owner.Name + "_rounded",
                    MinimapHeroTexture = owner.Name + "_icon",
                    ShowUntil          = Game.RawGameTime + base.TimeToShow,
                    Position           = ((Game.RawGameTime - owner.LastVisibleTime < 0.5f) ? owner.InFront(list2[0].Range - 200f, 0f, true) : position.SetZ(new float?((float)350)))
                };
                drawableAbilities.Add(item);
                return;
            }
            Ability9 ability = list2.Find((Ability9 x) => x.Owner.Distance(position) < 100f && Game.RawGameTime - x.Owner.LastVisibleTime < 0.5f);
            Unit9    unit    = (ability != null) ? ability.Owner : null;

            if (unit != null)
            {
                DrawableAbility item2 = new DrawableAbility
                {
                    AbilityTexture     = base.AbilityId + "_rounded",
                    HeroTexture        = unit.Name + "_rounded",
                    MinimapHeroTexture = unit.Name + "_icon",
                    ShowUntil          = Game.RawGameTime + base.TimeToShow,
                    Position           = unit.InFront(list2[0].Range - 200f, 0f, true)
                };
                drawableAbilities.Add(item2);
                return;
            }
            SimpleDrawableAbility item3 = new SimpleDrawableAbility
            {
                AbilityTexture = base.AbilityId + "_rounded",
                ShowUntil      = Game.RawGameTime + base.TimeToShow,
                Position       = (base.RawParticlePosition ? particle.Position : particle.GetControlPoint(base.ControlPoint)).SetZ(new float?((float)350))
            };

            drawableAbilities.Add(item3);
        }
Пример #14
0
        public override EvadeResult Evade(Unit9 ally, IObstacle obstacle)
        {
            var result = new EvadeResult
            {
                Ally         = ally.DisplayName,
                EnemyAbility = obstacle.EvadableAbility.Ability.DisplayName,
                IsModifier   = obstacle.IsModifierObstacle,
                Mode         = EvadeMode.Dodge,
                ObstacleId   = obstacle.Id
            };

            if (!obstacle.CanBeDodged || ally.IsCourier)
            {
                result.State = EvadeResult.EvadeState.Ignore;
                return(result);
            }

            if (this.pathfinderMode == Pathfinder.EvadeMode.None)
            {
                result.State = EvadeResult.EvadeState.Ignore;
                return(result);
            }

            if ((this.pathfinderMode == Pathfinder.EvadeMode.Disables || ally.IsCharging) && !obstacle.EvadableAbility.Ability.IsDisable())
            {
                result.State = EvadeResult.EvadeState.Ignore;
                return(result);
            }

            if (!ally.CanUseAbilities)
            {
                result.State = EvadeResult.EvadeState.Ignore;
                return(result);
            }

            if (ally.IsInvulnerable || (!obstacle.EvadableAbility.Ability.CanHitSpellImmuneEnemy && ally.IsMagicImmune))
            {
                result.State = EvadeResult.EvadeState.Successful;
                return(result);
            }

            if (!ally.CanMove(false))
            {
                result.State = EvadeResult.EvadeState.Failed;
                return(result);
            }

            if (!ally.IsControllable || this.ActionManager.IsInputBlocked(ally))
            {
                result.State = EvadeResult.EvadeState.Failed;
                return(result);
            }

            var remainingTime = obstacle.GetEvadeTime(ally, true) - (Game.Ping / 2000f);

            if (remainingTime <= 0)
            {
                result.State = EvadeResult.EvadeState.Failed;
                return(result);
            }

            var movingIntoObstacle = !obstacle.IsIntersecting(ally, false);
            var path = movingIntoObstacle
                           ? this.pathfinder.GetPathFromObstacle(ally, ally.Speed, ally.InFront(100), 69, out var success)
                           : this.pathfinder.GetPathFromObstacle(ally, ally.Speed, ally.Position, 69, out success);

            if (!success)
            {
                result.State = EvadeResult.EvadeState.Failed;
                return(result);
            }

            var ignoreTime   = obstacle.EvadableAbility.IgnoreRemainingTime(obstacle, null);
            var movePosition = path.Last();
            var requiredTime = this.GetRequiredTime(ally, movePosition, remainingTime, out var speedBuffAbility) - 0.15f;

            if (obstacle is AreaOfEffectObstacle)
            {
                remainingTime -= 0.15f;
            }

            if (!ignoreTime)
            {
                if (requiredTime > remainingTime)
                {
                    result.State = EvadeResult.EvadeState.Failed;
                    return(result);
                }

                if (requiredTime + 0.15 < remainingTime)
                {
                    if (EvadeModeManager.MoveCamera && !Hud.IsPositionOnScreen(movePosition))
                    {
                        Hud.CameraPosition = movePosition;
                    }

                    result.State = EvadeResult.EvadeState.TooEarly;
                    return(result);
                }
            }

            if (ally.IsRuptured && ally.Distance(movePosition) > 300)
            {
                result.State = EvadeResult.EvadeState.Failed;
                return(result);
            }

            if (!this.ChannelCanceled(ally, obstacle, remainingTime, null))
            {
                result.State = EvadeResult.EvadeState.Failed;
                return(result);
            }

            if (!this.PhaseCanceled(ally, obstacle, null))
            {
                result.State = EvadeResult.EvadeState.Failed;
                return(result);
            }

            if (speedBuffAbility != null)
            {
                speedBuffAbility.Use(ally, null, null);
                result.AllyAbility = speedBuffAbility.Ability.DisplayName;
            }

            if (EvadeModeManager.MoveCamera && !Hud.IsPositionOnScreen(movePosition))
            {
                Hud.CameraPosition = movePosition;
            }

            ally.BaseUnit.Move(movePosition, false, true);

            this.ActionManager.BlockInput(ally, obstacle, requiredTime + 0.2f);
            this.ActionManager.IgnoreObstacle(ally, obstacle, requiredTime + 0.5f);

            result.State = EvadeResult.EvadeState.Successful;
            return(result);
        }