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(); } } } }
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(); } } } }