Пример #1
0
        public override bool Orbwalk(Unit9 target, bool attack, bool move, ComboModeMenu comboMenu = null)
        {
            if (target?.HasModifier("modifier_venomancer_poison_sting_ward") != false)
            {
                var enemy = EntityManager9.EnemyHeroes
                            .Where(x => this.Owner.CanAttack(x) && !x.HasModifier("modifier_venomancer_poison_sting_ward"))
                            .OrderBy(x => x.Distance(this.Owner))
                            .FirstOrDefault();

                if (enemy != null)
                {
                    target = enemy;
                }
            }

            return(base.Orbwalk(target, attack, move, comboMenu));
        }
Пример #2
0
        private void Kill(Unit9 target, IReadOnlyList <KillStealAbility> abilities)
        {
            //todo dynamic order

            if (this.KillStealSleeper.IsSleeping)
            {
                return;
            }

            foreach (var ability in abilities.OrderBy(x => x.Ability.GetDamage(target)))
            {
                var hitTime = ability.Ability.GetHitTime(target);

                if (target.Health + (target.HealthRegeneration * hitTime * 1.5f) > ability.Ability.GetDamage(target))
                {
                    continue;
                }

                if (!ability.UseAbility(target))
                {
                    continue;
                }

                var castDelay = ability.Ability.GetCastDelay(target);
                this.AbilitySleeper.Sleep(ability.Ability.Handle, hitTime);
                this.orbwalkSleeper.Sleep(ability.Ability.Owner.Handle, castDelay);
                this.KillStealSleeper.Sleep(hitTime - ability.Ability.ActivationDelay);
                return;
            }

            for (var i = 0; i < abilities.Count; i++)
            {
                var ability = abilities[i];

                if (this.orbwalkSleeper.IsSleeping(ability.Ability.Owner.Handle))
                {
                    return;
                }

                if (!ability.Ability.CanBeCasted())
                {
                    continue;
                }

                var amplifier       = ability.Ability as IHasDamageAmplify;
                var ampsDamage      = amplifier?.IsIncomingDamageAmplifier() == true;
                var targetAmplified = ampsDamage && target.HasModifier(amplifier.AmplifierModifierNames);

                if (targetAmplified && !(ability.Ability is INuke))
                {
                    continue;
                }

                if (!ability.UseAbility(target))
                {
                    return;
                }

                float delay;
                if (!targetAmplified)
                {
                    var nextAbility = i < abilities.Count - 1 ? abilities[i + 1] : null;
                    if (nextAbility != null)
                    {
                        var nextAbilityDelay = nextAbility.Ability.GetHitTime(target);
                        var ampDelay         = ability.Ability.GetHitTime(target);
                        delay = ampDelay - nextAbilityDelay;
                    }
                    else
                    {
                        delay = ability.Ability.GetHitTime(target);
                    }
                }
                else
                {
                    delay = ability.Ability.GetCastDelay(target);
                }

                this.AbilitySleeper.Sleep(ability.Ability.Handle, ability.Ability.GetHitTime(target));
                this.orbwalkSleeper.Sleep(ability.Ability.Owner.Handle, ability.Ability.GetCastDelay(target));
                this.KillStealSleeper.Sleep(delay - ability.Ability.ActivationDelay);
                return;
            }
        }
Пример #3
0
        private Dictionary <KillStealAbility, int> GetDamage(Unit9 target)
        {
            var abilities            = new List <KillStealAbility>();
            var additionalAmplifiers = new DamageAmplifier();
            var damageBlockers       = target.GetDamageBlockers().ToDictionary(x => x, x => x.BlockValue(target));

            foreach (var ability in this.activeAbilities.Where(x => this.KillStealMenu.IsAbilityEnabled(x.Ability.Name)))
            {
                if (!ability.Ability.IsValid)
                {
                    continue;
                }

                if (!this.AbilitySleeper.IsSleeping(ability.Ability.Handle) && !ability.Ability.CanBeCasted(false))
                {
                    continue;
                }

                //todo remove positive amplifiers
                if (ability.Ability is IHasDamageAmplify amplifier)
                {
                    if ((amplifier.IsIncomingDamageAmplifier() && !target.HasModifier(amplifier.AmplifierModifierNames)) ||
                        (amplifier.IsOutgoingDamageAmplifier() && !ability.Ability.Owner.HasModifier(amplifier.AmplifierModifierNames)))
                    {
                        if (amplifier.IsPhysicalDamageAmplifier())
                        {
                            additionalAmplifiers[DamageType.Physical] *= 1 + amplifier.AmplifierValue(ability.Ability.Owner, target);
                        }

                        if (amplifier.IsMagicalDamageAmplifier())
                        {
                            additionalAmplifiers[DamageType.Magical] *= 1 + amplifier.AmplifierValue(ability.Ability.Owner, target);
                        }

                        if (amplifier.IsPureDamageAmplifier())
                        {
                            additionalAmplifiers[DamageType.Pure] *= 1 + amplifier.AmplifierValue(ability.Ability.Owner, target);
                        }
                    }
                }

                abilities.Add(ability);
            }

            var remainingHealth = target.Health;
            var finalDamage     = new Dictionary <KillStealAbility, int>();
            var remainingMana   = new Dictionary <Unit9, float>();

            foreach (var ability in abilities)
            {
                if (!remainingMana.TryGetValue(ability.Ability.Owner, out var mana))
                {
                    remainingMana[ability.Ability.Owner] = mana = ability.Ability.Owner.Mana;
                }

                if (mana < ability.Ability.ManaCost)
                {
                    continue;
                }

                foreach (var damagePair in ability.Ability.GetRawDamage(target, remainingHealth))
                {
                    var damageType = damagePair.Key;
                    var damage     = damagePair.Value;

                    if (damageType == DamageType.None)
                    {
                        if (damage > 0)
                        {
                            var ex = new BrokenAbilityException("DamageType");
                            Logger.Error(ex, ability.Ability.Name);
                            this.activeAbilities.RemoveAll(x => x.Ability.Handle == ability.Ability.Handle);
                        }

                        finalDamage.Add(ability, 0);
                        continue;
                    }

                    if (damageType == DamageType.HealthRemoval)
                    {
                        finalDamage.TryGetValue(ability, out var hpRemovalDamage);
                        finalDamage[ability] = hpRemovalDamage + (int)damage;
                        remainingHealth     -= damage;
                        continue;
                    }

                    var amp = target.GetDamageAmplification(ability.Ability.Owner, damageType, ability.Ability.IntelligenceAmplify);
                    if (amp <= 0)
                    {
                        continue;
                    }

                    foreach (var damageBlock in damageBlockers.ToList())
                    {
                        var blockAbility = damageBlock.Key;
                        if (!blockAbility.CanBlock(damageType))
                        {
                            continue;
                        }

                        var blockedDamage = Math.Min(damage, damageBlock.Value);
                        damageBlockers[blockAbility] -= blockedDamage;

                        if (blockAbility.BlocksDamageAfterReduction)
                        {
                            damage -= Math.Min(damage, blockedDamage * (1 / (amp * additionalAmplifiers[damageType])));
                        }
                        else
                        {
                            damage -= blockedDamage;
                        }
                    }

                    var amplifiedDamage = (int)(damage * amp * additionalAmplifiers[damageType]);
                    if (amplifiedDamage <= 0)
                    {
                        continue;
                    }

                    remainingMana[ability.Ability.Owner] -= ability.Ability.ManaCost;
                    finalDamage.TryGetValue(ability, out var savedDamage);
                    finalDamage[ability] = savedDamage + amplifiedDamage;
                    remainingHealth     -= amplifiedDamage;
                }
            }

            return(finalDamage);
        }
Пример #4
0
        // Token: 0x0600053A RID: 1338 RVA: 0x0001ADB0 File Offset: 0x00018FB0
        public override bool CanHit(TargetManager targetManager, IComboModeMenu comboMenu)
        {
            if (!comboMenu.GetAbilitySettingsMenu <SpearOfMarsMenu>(this).StunOnly)
            {
                return(base.CanHit(targetManager, comboMenu));
            }
            Unit9 target = targetManager.Target;

            if (target.IsMagicImmune && !base.Ability.CanHitSpellImmuneEnemy)
            {
                return(false);
            }
            if (base.Owner.Distance(target) > base.Ability.CastRange)
            {
                return(false);
            }
            if (target.HasModifier("modifier_mars_arena_of_blood_leash"))
            {
                return(true);
            }
            PredictionInput9 predictionInput = base.Ability.GetPredictionInput(target, null);

            predictionInput.Range = base.Ability.CastRange;
            PredictionOutput9 simplePrediction = base.Ability.PredictionManager.GetSimplePrediction(predictionInput);
            Vector3           targetPosition   = simplePrediction.TargetPosition;
            float             num    = base.Ability.Range - 200f;
            float             radius = base.Ability.Radius;

            Polygon.Rectangle collisionRec = new Polygon.Rectangle(base.Owner.Position, targetPosition, radius);
            if (targetManager.AllEnemyHeroes.Any((Unit9 x) => x != target && collisionRec.IsInside(x.Position)))
            {
                return(false);
            }
            foreach (Tree tree in from x in this.trees
                     where x.IsValid && x.IsAlive
                     select x)
            {
                if (new Polygon.Rectangle(targetPosition, Vector3Extensions.Extend2D(base.Owner.Position, targetPosition, num), radius - 50f).IsInside(tree.Position))
                {
                    this.castPosition = simplePrediction.CastPosition;
                    return(true);
                }
            }
            foreach (Building building in from x in this.buildings
                     where x.IsValid && x.IsAlive
                     select x)
            {
                if (new Polygon.Rectangle(targetPosition, Vector3Extensions.Extend2D(base.Owner.Position, targetPosition, num), radius).IsInside(building.Position))
                {
                    this.castPosition = simplePrediction.CastPosition;
                    return(true);
                }
            }
            for (int i = 0; i < 30; i++)
            {
                for (int j = 0; j < 30; j++)
                {
                    Vector2 vector;
                    vector..ctor(this.navMesh.CellSize * (float)(i - 15) + targetPosition.X, this.navMesh.CellSize * (float)(j - 15) + targetPosition.Y);
                    if ((this.navMesh.GetCellFlags(vector) & NavMeshCellFlags.InteractionBlocker) != NavMeshCellFlags.None && new Polygon.Rectangle(targetPosition, Vector3Extensions.Extend2D(base.Owner.Position, targetPosition, num), radius - 100f).IsInside(vector))
                    {
                        this.castPosition = simplePrediction.CastPosition;
                        return(true);
                    }
                }
            }
            return(false);
        }
Пример #5
0
        // Token: 0x06000A28 RID: 2600 RVA: 0x0002C17C File Offset: 0x0002A37C
        public override bool ShouldCast(TargetManager targetManager)
        {
            Unit9 owner = base.Owner;

            if (owner.IsInvulnerable)
            {
                return(false);
            }
            if (owner.Equals(this.Buff.Owner))
            {
                if (!this.Buff.BuffsOwner)
                {
                    return(false);
                }
            }
            else if (!this.Buff.BuffsAlly)
            {
                return(false);
            }
            ToggleAbility toggleAbility;

            return((!owner.IsMagicImmune || this.Buff.PiercesMagicImmunity(owner)) && !owner.HasModifier(this.Buff.BuffModifierName) && ((toggleAbility = (this.Buff as ToggleAbility)) == null || !toggleAbility.Enabled));
        }
        // Token: 0x06000A6E RID: 2670 RVA: 0x0002CDD0 File Offset: 0x0002AFD0
        public override bool ShouldCast(TargetManager targetManager)
        {
            Unit9 target = targetManager.Target;

            return((target.IsInNormalState || target.IsTeleporting || target.IsChanneling) && !target.HasModifier(new string[]
            {
                "modifier_lina_laguna_blade",
                "modifier_lion_finger_of_death"
            }) && this.ShouldForceCast(targetManager));
        }
Пример #7
0
        // Token: 0x06000111 RID: 273 RVA: 0x0000B7C0 File Offset: 0x000099C0
        private void Kill(Unit9 target, IReadOnlyList <KillStealAbility> abilities)
        {
            if (this.KillStealSleeper.IsSleeping)
            {
                return;
            }
            Func <KillStealAbility, int> < > 9__0;
            Func <KillStealAbility, int> keySelector;

            if ((keySelector = < > 9__0) == null)
            {
                keySelector = (< > 9__0 = ((KillStealAbility x) => x.Ability.GetDamage(target)));
            }
            foreach (KillStealAbility killStealAbility in abilities.OrderBy(keySelector))
            {
                float hitTime = killStealAbility.Ability.GetHitTime(target);
                if (target.Health + target.HealthRegeneration * hitTime * 1.5f <= (float)killStealAbility.Ability.GetDamage(target) && killStealAbility.Ability.UseAbility(target, EntityManager9.EnemyHeroes, 2, 0, false, false))
                {
                    float castDelay = killStealAbility.Ability.GetCastDelay(target);
                    this.AbilitySleeper.Sleep(killStealAbility.Ability.Handle, hitTime);
                    this.orbwalkSleeper.Sleep(killStealAbility.Ability.Owner.Handle, castDelay);
                    this.KillStealSleeper.Sleep(hitTime - killStealAbility.Ability.ActivationDelay);
                    return;
                }
            }
            for (int i = 0; i < abilities.Count; i++)
            {
                KillStealAbility killStealAbility2 = abilities[i];
                if (this.orbwalkSleeper.IsSleeping(killStealAbility2.Ability.Owner.Handle))
                {
                    return;
                }
                if (killStealAbility2.Ability.CanBeCasted(true))
                {
                    IHasDamageAmplify hasDamageAmplify = killStealAbility2.Ability as IHasDamageAmplify;
                    bool flag = hasDamageAmplify != null && AbilityExtensions.IsIncomingDamageAmplifier(hasDamageAmplify) && target.HasModifier(hasDamageAmplify.AmplifierModifierName);
                    if (!flag || killStealAbility2.Ability is INuke)
                    {
                        if (!killStealAbility2.Ability.UseAbility(target, EntityManager9.EnemyHeroes, 2, 0, false, false))
                        {
                            return;
                        }
                        float num;
                        if (!flag)
                        {
                            KillStealAbility killStealAbility3 = (i < abilities.Count - 1) ? abilities[i + 1] : null;
                            if (killStealAbility3 != null)
                            {
                                float hitTime2 = killStealAbility3.Ability.GetHitTime(target);
                                num = killStealAbility2.Ability.GetHitTime(target) - hitTime2;
                            }
                            else
                            {
                                num = killStealAbility2.Ability.GetHitTime(target);
                            }
                        }
                        else
                        {
                            num = killStealAbility2.Ability.GetCastDelay(target);
                        }
                        this.AbilitySleeper.Sleep(killStealAbility2.Ability.Handle, killStealAbility2.Ability.GetHitTime(target));
                        this.orbwalkSleeper.Sleep(killStealAbility2.Ability.Owner.Handle, killStealAbility2.Ability.GetCastDelay(target));
                        this.KillStealSleeper.Sleep(num - killStealAbility2.Ability.ActivationDelay);
                        return;
                    }
                }
            }
        }
Пример #8
0
        // Token: 0x06000110 RID: 272 RVA: 0x0000B0E0 File Offset: 0x000092E0
        private Dictionary <KillStealAbility, int> GetDamage(Unit9 target)
        {
            List <KillStealAbility>             list            = new List <KillStealAbility>();
            DamageAmplifier                     damageAmplifier = new DamageAmplifier();
            Dictionary <IHasDamageBlock, float> dictionary      = target.GetDamageBlockers().ToDictionary((IHasDamageBlock x) => x, (IHasDamageBlock x) => x.BlockValue(target));
            IEnumerable <KillStealAbility>      source          = this.activeAbilities;

            Func <KillStealAbility, bool> < > 9__2;
            Func <KillStealAbility, bool> predicate;

            if ((predicate = < > 9__2) == null)
            {
                predicate = (< > 9__2 = ((KillStealAbility x) => this.KillStealMenu.IsAbilityEnabled(x.Ability.Name)));
            }
            foreach (KillStealAbility killStealAbility in source.Where(predicate))
            {
                if (killStealAbility.Ability.IsValid && (this.AbilitySleeper.IsSleeping(killStealAbility.Ability.Handle) || killStealAbility.Ability.CanBeCasted(false)))
                {
                    IHasDamageAmplify hasDamageAmplify;
                    if ((hasDamageAmplify = (killStealAbility.Ability as IHasDamageAmplify)) != null && ((AbilityExtensions.IsIncomingDamageAmplifier(hasDamageAmplify) && !target.HasModifier(hasDamageAmplify.AmplifierModifierName)) || (AbilityExtensions.IsOutgoingDamageAmplifier(hasDamageAmplify) && !killStealAbility.Ability.Owner.HasModifier(hasDamageAmplify.AmplifierModifierName))))
                    {
                        if (AbilityExtensions.IsPhysicalDamageAmplifier(hasDamageAmplify))
                        {
                            DamageAmplifier damageAmplifier2 = damageAmplifier;
                            damageAmplifier2[DamageType.Physical] = damageAmplifier2[DamageType.Physical] * (1f + hasDamageAmplify.AmplifierValue(killStealAbility.Ability.Owner, target));
                        }
                        if (AbilityExtensions.IsMagicalDamageAmplifier(hasDamageAmplify))
                        {
                            DamageAmplifier damageAmplifier2 = damageAmplifier;
                            damageAmplifier2[DamageType.Magical] = damageAmplifier2[DamageType.Magical] * (1f + hasDamageAmplify.AmplifierValue(killStealAbility.Ability.Owner, target));
                        }
                        if (AbilityExtensions.IsPureDamageAmplifier(hasDamageAmplify))
                        {
                            DamageAmplifier damageAmplifier2 = damageAmplifier;
                            damageAmplifier2[DamageType.Pure] = damageAmplifier2[DamageType.Pure] * (1f + hasDamageAmplify.AmplifierValue(killStealAbility.Ability.Owner, target));
                        }
                    }
                    list.Add(killStealAbility);
                }
            }
            float num = target.Health;
            Dictionary <KillStealAbility, int> dictionary2 = new Dictionary <KillStealAbility, int>();
            Dictionary <Unit9, float>          dictionary3 = new Dictionary <Unit9, float>();

            using (List <KillStealAbility> .Enumerator enumerator2 = list.GetEnumerator())
            {
                while (enumerator2.MoveNext())
                {
                    KillStealAbility ability = enumerator2.Current;
                    float            num2;
                    if (!dictionary3.TryGetValue(ability.Ability.Owner, out num2))
                    {
                        num2 = (dictionary3[ability.Ability.Owner] = ability.Ability.Owner.Mana);
                    }
                    if (num2 >= ability.Ability.ManaCost)
                    {
                        Predicate <KillStealAbility> < > 9__3;
                        foreach (KeyValuePair <DamageType, float> keyValuePair in ability.Ability.GetRawDamage(target, new float?(num)))
                        {
                            DamageType key  = keyValuePair.Key;
                            float      num3 = keyValuePair.Value;
                            if (key == DamageType.None)
                            {
                                if (num3 > 0f)
                                {
                                    Logger.Error(new BrokenAbilityException("DamageType"), ability.Ability.Name);
                                    List <KillStealAbility>      list2 = this.activeAbilities;
                                    Predicate <KillStealAbility> match;
                                    if ((match = < > 9__3) == null)
                                    {
                                        match = (< > 9__3 = ((KillStealAbility x) => x.Ability.Handle == ability.Ability.Handle));
                                    }
                                    list2.RemoveAll(match);
                                }
                                dictionary2.Add(ability, 0);
                            }
                            else if (key == DamageType.HealthRemoval)
                            {
                                int num4;
                                dictionary2.TryGetValue(ability, out num4);
                                dictionary2[ability] = num4 + (int)num3;
                                num -= num3;
                            }
                            else
                            {
                                float damageAmplification = target.GetDamageAmplification(ability.Ability.Owner, key, ability.Ability.IntelligenceAmplify);
                                if (damageAmplification > 0f)
                                {
                                    foreach (KeyValuePair <IHasDamageBlock, float> keyValuePair2 in dictionary.ToList <KeyValuePair <IHasDamageBlock, float> >())
                                    {
                                        IHasDamageBlock key2 = keyValuePair2.Key;
                                        if (AbilityExtensions.CanBlock(key2, key))
                                        {
                                            float num5 = Math.Min(num3, keyValuePair2.Value);
                                            Dictionary <IHasDamageBlock, float> dictionary4 = dictionary;
                                            IHasDamageBlock key3 = key2;
                                            dictionary4[key3] -= num5;
                                            if (key2.BlocksDamageAfterReduction)
                                            {
                                                num3 -= Math.Min(num3, num5 * (1f / (damageAmplification * damageAmplifier[key])));
                                            }
                                            else
                                            {
                                                num3 -= num5;
                                            }
                                        }
                                    }
                                    int num6 = (int)(num3 * damageAmplification * damageAmplifier[key]);
                                    if (num6 > 6000 || num6 < 0)
                                    {
                                        BrokenAbilityException ex = new BrokenAbilityException("Amplified");
                                        ex.Data["Ability"] = new
                                        {
                                            Ability         = ability.Ability.Name,
                                            Target          = target.Name,
                                            Damage          = num3.ToString(),
                                            AmplifiedDamage = num6.ToString(),
                                            Type            = key.ToString(),
                                            Amp             = damageAmplification.ToString(),
                                            Amp2            = damageAmplifier[key].ToString(),
                                            TargetAmps      = (from x in target.amplifiers
                                                               where x.IsValid && AbilityExtensions.IsIncomingDamageAmplifier(x)
                                                               select x.AmplifierModifierName).ToArray <string>(),
                                            OwnerAmps = (from x in ability.Ability.Owner.amplifiers
                                                         where x.IsValid && AbilityExtensions.IsOutgoingDamageAmplifier(x)
                                                         select x.AmplifierModifierName).ToArray <string>()
                                        };
                                        Logger.Error(ex, null);
                                    }
                                    else
                                    {
                                        Dictionary <Unit9, float> dictionary5 = dictionary3;
                                        Unit9 owner = ability.Ability.Owner;
                                        dictionary5[owner] -= ability.Ability.ManaCost;
                                        int num7;
                                        dictionary2.TryGetValue(ability, out num7);
                                        dictionary2[ability] = num7 + num6;
                                        num -= (float)num6;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(dictionary2);
        }
Пример #9
0
        // Token: 0x060007F9 RID: 2041 RVA: 0x00024918 File Offset: 0x00022B18
        public void RollSmashCombo(TargetManager targetManager, RollSmashModeMenu menu)
        {
            if (base.ComboSleeper.IsSleeping)
            {
                return;
            }
            Unit9         target        = targetManager.Target;
            float         num           = base.Owner.Distance(target.Position);
            AbilityHelper abilityHelper = new AbilityHelper(targetManager, null, this);

            if (base.Owner.HasModifier("modifier_earth_spirit_rolling_boulder_caster") && abilityHelper.ForceUseAbility(this.stone, true, true))
            {
                base.ComboSleeper.Sleep(3f);
                return;
            }
            Unit9 unit = (from x in targetManager.AllyHeroes
                          where !x.Equals(this.Owner) && menu.IsAllyEnabled(x.Name) && x.Distance(target) > 300f && x.Distance(target) < 1500f
                          orderby x.Distance(target)
                          select x).FirstOrDefault <Unit9>();

            if (unit == null)
            {
                return;
            }
            if (target.HasModifier("modifier_earth_spirit_boulder_smash"))
            {
                if (abilityHelper.CanBeCasted(this.rolling, false, false, true, true) && this.rolling.SimpleUseAbility(target.Position))
                {
                    base.ComboSleeper.Sleep(0.5f);
                    return;
                }
                return;
            }
            else
            {
                BoulderSmash boulderSmash = this.smash;
                if (boulderSmash == null || !boulderSmash.Ability.CanBeCasted(true))
                {
                    return;
                }
                if (num < this.smash.Ability.CastRange + 100f)
                {
                    if (Vector3Extensions.AngleBetween(base.Owner.Position, target.Position, unit.Position) < 30f)
                    {
                        this.smash.Ability.UseAbility(target, false, false);
                        base.ComboSleeper.Sleep(0.3f);
                        return;
                    }
                    if (target.GetImmobilityDuration() > 0.5f)
                    {
                        base.Owner.BaseUnit.Move(Vector3Extensions.Extend2D(target.Position, unit.Position, -100f));
                        base.OrbwalkSleeper.Sleep(0.1f);
                        base.ComboSleeper.Sleep(0.1f);
                        return;
                    }
                }
                if (abilityHelper.CanBeCasted(this.blink, true, true, true, true))
                {
                    Vector3 position = Vector3Extensions.Extend2D(target.GetPredictedPosition(base.Owner.GetTurnTime(target.Position) + Game.Ping / 2000f + 0.2f), unit.Position, -125f);
                    if (abilityHelper.UseAbility(this.blink, position))
                    {
                        base.ComboSleeper.ExtendSleep(0.1f);
                        return;
                    }
                    return;
                }
                else
                {
                    if (!abilityHelper.CanBeCasted(this.rolling, true, true, true, true))
                    {
                        return;
                    }
                    if (abilityHelper.UseAbility(this.rolling, true))
                    {
                        return;
                    }
                    if (abilityHelper.CanBeCasted(this.stone, false, true, true, true))
                    {
                        abilityHelper.ForceUseAbility(this.stone, true, true);
                        return;
                    }
                    abilityHelper.ForceUseAbility(this.rolling, true, true);
                    return;
                }
            }
        }