Esempio n. 1
0
        public static void OnCombo(Obj_AI_Base afterAttackTarget = null)
        {
            // Smite usage
            if (Config.BoolLinks["comboUseSmite"].Value && SpellManager.HasSmite() && player.HasStalkersBlade())
            {
                if (player.GetSmiteSpell().State == SpellState.Ready)
                {
                    var smiteTarget = TargetSelector.GetTarget(700, TargetSelector.DamageType.True);
                    if (smiteTarget != null)
                    {
                        if (smiteTarget.Health < player.GetStalkerSmiteDamage())
                        {
                            SpellManager.CastSmite(smiteTarget);
                        }
                    }
                }
            }

            // Unburrowed
            if (!player.IsBurrowed())
            {
                // Item usage
                if (afterAttackTarget.IsValidTarget() && Config.BoolLinks["comboUseItems"].Value)
                {
                    ItemManager.UseBotrkOrCutlass(afterAttackTarget);
                    ItemManager.UseRanduin(afterAttackTarget);
                    if (ItemManager.UseHydraOrTiamat(afterAttackTarget))
                    {
                        return;
                    }
                }

                // General Q usage, we can safely spam that I guess
                if (!player.HasQActive() && Q.IsEnabledAndReady(Mode.COMBO) && afterAttackTarget.IsValidTarget())
                {
                    if (Q.Cast(true))
                    {
                        return;
                    }
                }

                // E usage, only cast on secure kill, full fury or our health is low
                if (E.IsEnabledAndReady(Mode.COMBO))
                {
                    var target = E.GetTarget();
                    if (target != null)
                    {
                        if (target.Health < E.GetRealDamage(target) || player.HasMaxFury() || player.IsLowHealth())
                        {
                            if (E.Cast(target).IsCasted())
                            {
                                return;
                            }
                        }
                    }
                }

                // Burrow usage
                if (W.IsEnabledAndReady(Mode.COMBO) && !player.HasQActive())
                {
                    var target = W.GetTarget();
                    if (target != null)
                    {
                        if (target.CanBeKnockedUp())
                        {
                            W.Cast();
                        }
                        else if (!Q.IsEnabledAndReady(Mode.COMBO) && Q.IsEnabledAndReady(Mode.COMBO, true))
                        {
                            // Check if the player could make more attack attack damage than the Q damage, else cast W
                            if (Math.Floor(player.AttackSpeed()) * player.GetAutoAttackDamage(target) < SpellManager.QBurrowed.GetRealDamage(target))
                            {
                                W.Cast();
                            }
                        }
                    }
                }
            }
            // Burrowed
            else
            {
                // Disable auto attacks
                Config.Menu.Orbwalker.SetAttack(false);

                // General Q usage
                if (Q.IsEnabledAndReady(Mode.COMBO, true))
                {
                    // Get a target at Q range
                    var target = Q.GetTarget();
                    if (target != null)
                    {
                        if (Q.Cast(target).IsCasted())
                        {
                            return;
                        }
                    }
                }

                // Gapclose with E, only for (almost) secured kills
                if (E.IsEnabledAndReady(Mode.COMBO, true))
                {
                    // Get targets that could be valid for our combo
                    var target = ObjectManager.Get <Obj_AI_Hero>()
                                 .Find(h =>
                                       h.Distance(player, true) < Math.Pow(Q.Range + 150, 2) && h.Distance(player, true) > Math.Pow(Q.Range - 150, 2) &&
                                       h.Health <
                                       W.GetRealDamage(h) +
                                       // Let's say 2 AAs without Q and 4 AAs with Q
                                       (SpellManager.QNormal.IsReallyReady(1000) ? SpellManager.QNormal.GetRealDamage(h) * 3 + player.GetAutoAttackDamage(h) : player.GetAutoAttackDamage(h) * 2) +
                                       (SpellManager.ENormal.IsReallyReady(1000) ? SpellManager.ENormal.GetRealDamage(h) : 0));

                    if (target != null)
                    {
                        // Digg tunnel to target Kappa
                        if (E.Cast(target).IsCasted())
                        {
                            return;
                        }
                    }
                }

                // Check if we need to unburrow
                if (W.IsEnabledAndReady(Mode.COMBO) && ((Q.IsEnabled(Mode.COMBO) ? SpellManager.QNormal.IsReallyReady(250) : true) || (E.IsEnabled(Mode.COMBO) ? SpellManager.ENormal.IsReallyReady(250) : true)))
                {
                    // Get a target above the player that is within our spell range
                    var target = W.GetTarget();
                    if (target != null)
                    {
                        // Unburrow
                        W.Cast();
                    }
                }
            }
        }
Esempio n. 2
0
        public void OnCombo(bool afterAttack = false, Obj_AI_Base afterAttackTarget = null)
        {
            // TODO: Smite usage

            // Unburrowed
            if (!player.IsBurrowed())
            {
                // Config values
                var useQ       = true;
                var useW       = true;
                var useE       = true;
                var useBurrowQ = true;



                // Validate spells we wanna use
                if ((useQ ? !Q.IsReady() : true) && (useW ? !W.IsReady() : true) && (useE ? !E.IsReady() : true))
                {
                    return;
                }

                // Get a low range target, since we don't have much range with our spells
                var target = ARAMTargetSelector.getBestTarget(useQ && Q.IsReady() ? Q.Range : E.Range);

                if (target != null)
                {
                    // General Q usage, we can safely spam that I guess
                    if (afterAttack && useQ && Q.IsReady())
                    {
                        Q.Cast(true);
                    }

                    // E usage, only cast on secure kill, full fury or our health is low
                    if (useE && E.IsReady() && (target.Health < E.GetDamage(target) || player.HasMaxFury() || player.IsLowHealth()))
                    {
                        E.Cast(target);
                    }
                }

                // Burrow usage
                if (target != null && useW && W.IsReady() && !player.HasQActive())
                {
                    if (target.CanBeKnockedUp())
                    {
                        W.Cast();
                    }
                    else if ((!useQ || !Q.IsReady()) && useBurrowQ && SpellManager.QBurrowed.IsReallyReady())
                    {
                        // Check if the player could make more attack attack damage than the Q damage, else cast W
                        if (Math.Floor(player.AttackSpeed()) * player.GetAutoAttackDamage(target) < SpellManager.QBurrowed.GetRealDamage(target))
                        {
                            W.Cast();
                        }
                    }
                }
            }
            // Burrowed
            else
            {
                // Disable auto attacks
                //DeathWalker.setAttack(false);

                // Config values
                var useQ       = true;
                var useW       = true;
                var useE       = true;
                var useNormalQ = true;
                var useNormalE = true;

                // General Q usage
                if (useQ && Q.IsReady())
                {
                    // Get a target at Q range
                    var target = ARAMTargetSelector.getBestTarget(Q.Range);

                    if (target != null)
                    {
                        Q.Cast(target);
                    }
                }

                // Gapclose with E, only for (almost) secured kills
                if (useE && E.IsReady())
                {
                    // Get targets that could be valid for our combo
                    var validRangeTargets = ObjectManager.Get <Obj_AI_Hero>().Where(h => h.Distance(player, true) < Math.Pow(Q.Range + 150, 2) && h.Distance(player, true) > Math.Pow(Q.Range - 150, 2));

                    // Get a target that could die with our combo
                    var target = validRangeTargets.FirstOrDefault(t =>
                                                                  t.Health <
                                                                  W.GetRealDamage(t) +
                                                                  // Let's say 2 AAs without Q and 4 AAs with Q
                                                                  (SpellManager.QNormal.IsReallyReady(1000) ? SpellManager.QNormal.GetRealDamage(t) * 3 + player.GetAutoAttackDamage(t) : player.GetAutoAttackDamage(t) * 2) +
                                                                  (SpellManager.ENormal.IsReallyReady(1000) ? SpellManager.ENormal.GetRealDamage(t) : 0)
                                                                  );

                    if (target != null)
                    {
                        // Digg tunnel to target Kappa
                        E.Cast(target);
                    }
                    else
                    {
                        // Snipe Q targets, experimental, dunno if I'll leave this in here
                        if (useQ && Q.IsReallyReady(1000))
                        {
                            var snipeTarget = ARAMTargetSelector.getBestTarget(E.Range + Q.Range);
                            if (snipeTarget != null && snipeTarget.Health < Q.GetRealDamage(snipeTarget))
                            {
                                // Digg tunnel to the target direction
                                var prediction = E.GetPrediction(snipeTarget, false, float.MaxValue);
                                E.Cast(prediction.CastPosition);
                            }
                        }
                    }
                }

                // Check if we need to unburrow
                if (useW && ((useNormalQ ? SpellManager.QNormal.IsReallyReady(250) : true) || (useNormalE ? SpellManager.ENormal.IsReallyReady(250) : true)))
                {
                    // Get a target above the player that is within our spell range
                    var target = ARAMTargetSelector.getBestTarget(useNormalQ && SpellManager.QNormal.IsReallyReady(250) ? SpellManager.QNormal.Range : useNormalE ? SpellManager.ENormal.Range : Orbwalking.GetRealAutoAttackRange(player));
                    if (target != null)
                    {
                        // Unburrow
                        W.Cast();
                    }
                }
            }
        }