public static Obj_AI_Hero GetTarget(Obj_AI_Base champion, float range, DamageType type, bool ignoreShieldSpells = true, IEnumerable<Obj_AI_Hero> ignoredChamps = null, Vector3? rangeCheckFrom = null) { try { if (ignoredChamps == null) { ignoredChamps = new List<Obj_AI_Hero>(); } var damageType = (Damage.DamageType) Enum.Parse(typeof(Damage.DamageType), type.ToString()); if (_configMenu != null && IsValidTarget( SelectedTarget, _configMenu.Item("ForceFocusSelected").GetValue<bool>() ? float.MaxValue : range, type, ignoreShieldSpells, rangeCheckFrom)) { return SelectedTarget; } if (_configMenu != null && _configMenu.Item("TargetingMode") != null && Mode == TargetingMode.AutoPriority) { var menuItem = _configMenu.Item("TargetingMode").GetValue<StringList>(); Enum.TryParse(menuItem.SList[menuItem.SelectedIndex], out Mode); } var targets = HeroManager.Enemies .FindAll( hero => ignoredChamps.All(ignored => ignored.NetworkId != hero.NetworkId) && IsValidTarget(hero, range, type, ignoreShieldSpells, rangeCheckFrom)); switch (Mode) { case TargetingMode.LowHP: return targets.MinOrDefault(hero => hero.Health); case TargetingMode.MostAD: return targets.MaxOrDefault(hero => hero.BaseAttackDamage + hero.FlatPhysicalDamageMod); case TargetingMode.MostAP: return targets.MaxOrDefault(hero => hero.BaseAbilityDamage + hero.FlatMagicDamageMod); case TargetingMode.Closest: return targets.MinOrDefault( hero => (rangeCheckFrom.HasValue ? rangeCheckFrom.Value : champion.ServerPosition).Distance( hero.ServerPosition, true)); case TargetingMode.NearMouse: return targets.Find(hero => hero.Distance(Game.CursorPos, true) < 22500); // 150 * 150 case TargetingMode.AutoPriority: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, damageType, 100) / (1 + hero.Health) * GetPriority(hero)); case TargetingMode.LessAttack: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Physical, 100) / (1 + hero.Health) * GetPriority(hero)); case TargetingMode.LessCast: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Magical, 100) / (1 + hero.Health) * GetPriority(hero)); } } catch (Exception e) { Console.WriteLine(e); } return null; }
private static void Obj_AI_Base_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { #region Hero Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Hero) { Casted = Utils.GameTimeTickCount; foreach (var hero in Activator.Allies()) { if (!hero.Player.IsValidTarget(float.MaxValue, false) || hero.Player.IsZombie || hero.Immunity) { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Clear(); continue; } if (hero.IncomeDamage < 12) hero.IncomeDamage = 0; #region auto attack dectection if (args.SData.IsAutoAttack()) { if (args.Target.NetworkId == hero.Player.NetworkId) { float dmg = 0; var enemy = sender as Obj_AI_Hero; if (!sender.HasBuff("lichbane") && !sender.HasBuff("sheen")) dmg = (int) Math.Abs(sender.GetAutoAttackDamage(hero.Player, true)); if (sender.HasBuff("sheen")) dmg = (int) Math.Abs(sender.GetAutoAttackDamage(hero.Player, true) + enemy.GetCustomDamage("sheen", hero.Player)); if (sender.HasBuff("lichbane")) dmg = (int) Math.Abs(sender.GetAutoAttackDamage(hero.Player, true) + enemy.GetCustomDamage("lichbane", hero.Player)); Utility.DelayAction.Add(250, () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.AutoAttack); hero.IncomeDamage += dmg; Utility.DelayAction.Add(800, delegate { hero.Attacker = null; hero.IncomeDamage -= dmg; hero.HitTypes.Remove(HitType.AutoAttack); }); }); } } #endregion foreach (var data in spelldata.spells.Where(x => x.SDataName == args.SData.Name.ToLower())) { #region self/selfaoe spell detection if (args.SData.TargettingType == SpellDataTargetType.Self || args.SData.TargettingType == SpellDataTargetType.SelfAoe) { var fromObj = ObjectManager.Get<GameObject>() .FirstOrDefault( x => data.FromObject != null && data.FromObject.Any(y => x.Name.Contains(y))); var correctpos = fromObj != null ? fromObj.Position : sender.ServerPosition; if (hero.Player.Distance(correctpos) > data.CastRange) continue; if (data.SDataName == "kalistaexpungewrapper" && !hero.Player.HasBuff("kalistaexpungemarker", true)) continue; var evadetime = 1000 * (data.CastRange - hero.Player.Distance(correctpos) + hero.Player.BoundingRadius) / hero.Player.MoveSpeed; if (Activator.Origin.Item("evade").GetValue<bool>()) { // ignore if can evade if (hero.Player.NetworkId == Activator.Player.NetworkId) { if (hero.Player.IsMoving && evadetime < data.Delay) { // check next player continue; } } } if (!Activator.Origin.Item(data.SDataName + "predict").GetValue<bool>()) return; var dmg = (int) Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); // delay the spell a bit before missile endtime Utility.DelayAction.Add((int) (data.Delay - (data.Delay * 0.7)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += dmg; if (Activator.Origin.Item(data.SDataName + "danger").GetValue<bool>()) hero.HitTypes.Add(HitType.Danger); if (Activator.Origin.Item(data.SDataName + "crowdcontrol").GetValue<bool>()) hero.HitTypes.Add(HitType.CrowdControl); if (Activator.Origin.Item(data.SDataName + "ultimate").GetValue<bool>()) hero.HitTypes.Add(HitType.Ultimate); if (Activator.Origin.Item(data.SDataName + "forceexhaust").GetValue<bool>()) hero.HitTypes.Add(HitType.ForceExhaust); // lazy safe reset Utility.DelayAction.Add((int) (data.Delay + 500), () => { hero.Attacker = null; hero.IncomeDamage -= dmg; hero.HitTypes.Remove(HitType.Spell); if (Activator.Origin.Item(data.SDataName + "danger").GetValue<bool>()) hero.HitTypes.Remove(HitType.Danger); if (Activator.Origin.Item(data.SDataName + "crowdcontrol").GetValue<bool>()) hero.HitTypes.Remove(HitType.CrowdControl); if (Activator.Origin.Item(data.SDataName + "ultimate").GetValue<bool>()) hero.HitTypes.Remove(HitType.Ultimate); if (Activator.Origin.Item(data.SDataName + "forceexhaust").GetValue<bool>()) hero.HitTypes.Remove(HitType.ForceExhaust); }); }); } #endregion #region skillshot detection completerino if (args.SData.TargettingType == SpellDataTargetType.Cone || args.SData.TargettingType.ToString().Contains("Location") || args.SData.TargettingType == (SpellDataTargetType) 10 && data.SDataName == "azirq") { var fromObj = ObjectManager.Get<GameObject>() .FirstOrDefault( x => !x.IsAlly && data.FromObject != null && data.FromObject.Any(y => x.Name.Contains(y))); var islineskillshot = args.SData.LineWidth != 0; var startpos = fromObj != null ? fromObj.Position : sender.ServerPosition; var correctwidth = !islineskillshot ? data.CastRange : args.SData.LineWidth; if (data.SDataName == "azirq") { correctwidth = 275f; islineskillshot = true; } if (hero.Player.Distance(startpos) > data.CastRange) continue; var distance = (int)(1000 * (startpos.Distance(hero.Player.ServerPosition) / data.MissileSpeed)); var endtime = data.Delay - 100 + Game.Ping/2 + distance - (Utils.GameTimeTickCount - Casted); var direction = (args.End.To2D() - startpos.To2D()).Normalized(); var endpos = startpos.To2D() + direction * data.CastRange; var proj = hero.Player.ServerPosition.To2D().ProjectOn(startpos.To2D(), endpos); var projdist = hero.Player.ServerPosition.To2D().Distance(proj.SegmentPoint); int evadetime; if (islineskillshot) { evadetime = (int) (1000 * (correctwidth - projdist + hero.Player.BoundingRadius) / hero.Player.MoveSpeed); } else { evadetime = (int) (1000 * (correctwidth - hero.Player.Distance(startpos) + hero.Player.BoundingRadius) / hero.Player.MoveSpeed); } if (!islineskillshot && hero.Player.Distance(endpos) <= correctwidth || islineskillshot && correctwidth + hero.Player.BoundingRadius > projdist) { if (data.Global || Activator.Origin.Item("evade").GetValue<bool>()) { if (hero.Player.NetworkId == Activator.Player.NetworkId) { if (hero.Player.IsMoving && evadetime < endtime) { continue; } } } // vayne invis check if (data.SDataName == "vaynetumble" && sender.HasBuff("VayneInquisition", true)) hero.HitTypes.Add(HitType.Stealth); if (!Activator.Origin.Item(data.SDataName + "predict").GetValue<bool>()) return; var dmg = (int) Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); Utility.DelayAction.Add((int) (endtime - (endtime * 0.7)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += dmg; if (Activator.Origin.Item(data.SDataName + "danger").GetValue<bool>()) hero.HitTypes.Add(HitType.Danger); if (Activator.Origin.Item(data.SDataName + "crowdcontrol").GetValue<bool>()) hero.HitTypes.Add(HitType.CrowdControl); if (Activator.Origin.Item(data.SDataName + "ultimate").GetValue<bool>()) hero.HitTypes.Add(HitType.Ultimate); if (Activator.Origin.Item(data.SDataName + "forceexhaust").GetValue<bool>()) hero.HitTypes.Add(HitType.ForceExhaust); Utility.DelayAction.Add((int) (endtime + 500), () => { hero.Attacker = null; hero.IncomeDamage -= dmg; hero.HitTypes.Remove(HitType.Spell); if (Activator.Origin.Item(data.SDataName + "danger").GetValue<bool>()) hero.HitTypes.Remove(HitType.Danger); if (Activator.Origin.Item(data.SDataName + "crowdcontrol").GetValue<bool>()) hero.HitTypes.Remove(HitType.CrowdControl); if (Activator.Origin.Item(data.SDataName + "ultimate").GetValue<bool>()) hero.HitTypes.Remove(HitType.Ultimate); if (Activator.Origin.Item(data.SDataName + "forceexhaust").GetValue<bool>()) hero.HitTypes.Remove(HitType.ForceExhaust); }); }); } } #endregion #region unit type detection if (args.SData.TargettingType == SpellDataTargetType.Unit || args.SData.TargettingType == SpellDataTargetType.SelfAndUnit) { // check if is targeteting the hero on our table if (hero.Player.NetworkId != args.Target.NetworkId) continue; // target spell dectection if (hero.Player.Distance(sender.ServerPosition) > data.CastRange) continue; var distance = (int) (1000 * (sender.Distance(hero.Player.ServerPosition) / data.MissileSpeed)); var endtime = data.Delay - 100 + Game.Ping / 2 + distance - (Utils.GameTimeTickCount - Casted); if (!Activator.Origin.Item(data.SDataName + "predict").GetValue<bool>()) return; var dmg = (int) Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); Utility.DelayAction.Add((int) (endtime - (endtime * 0.7)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += dmg; //if (data.ChampionName == "annie" && spelldebuffhandler.Pyromania) //{ // hero.HitTypes.Add(HitType.CrowdControl); // spelldebuffhandler.Pyromania = false; //} if (Activator.Origin.Item(data.SDataName + "danger").GetValue<bool>()) hero.HitTypes.Add(HitType.Danger); if (Activator.Origin.Item(data.SDataName + "crowdcontrol").GetValue<bool>()) hero.HitTypes.Add(HitType.CrowdControl); if (Activator.Origin.Item(data.SDataName + "ultimate").GetValue<bool>()) hero.HitTypes.Add(HitType.Ultimate); if (Activator.Origin.Item(data.SDataName + "forceexhaust").GetValue<bool>()) hero.HitTypes.Add(HitType.ForceExhaust); // lazy reset Utility.DelayAction.Add((int) (endtime + 500), () => { hero.Attacker = null; hero.IncomeDamage -= dmg; hero.HitTypes.Remove(HitType.Spell); if (Activator.Origin.Item(data.SDataName + "danger").GetValue<bool>()) hero.HitTypes.Remove(HitType.Danger); if (Activator.Origin.Item(data.SDataName + "crowdcontrol").GetValue<bool>()) hero.HitTypes.Remove(HitType.CrowdControl); if (Activator.Origin.Item(data.SDataName + "ultimate").GetValue<bool>()) hero.HitTypes.Remove(HitType.Ultimate); if (Activator.Origin.Item(data.SDataName + "forceexhaust").GetValue<bool>()) hero.HitTypes.Remove(HitType.ForceExhaust); }); }); } #endregion } } } #endregion #region Turret Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Turret) { foreach (var hero in Activator.Allies()) { if (args.Target.NetworkId == hero.Player.NetworkId && !hero.Immunity) { var dmg = (int) Math.Abs(sender.CalcDamage(hero.Player, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); if (sender.Distance(hero.Player.ServerPosition) <= 900) { if (Activator.Player.Distance(hero.Player.ServerPosition) <= 1000) { Utility.DelayAction.Add(450, () => { hero.HitTypes.Add(HitType.TurretAttack); hero.IncomeDamage += dmg; Utility.DelayAction.Add(650, () => { hero.Attacker = null; hero.IncomeDamage -= dmg; hero.HitTypes.Remove(HitType.TurretAttack); }); }); } } } } } #endregion #region Minion Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Minion) { foreach (var hero in Activator.Allies()) { if (hero.Player.NetworkId != args.Target.NetworkId || hero.Immunity) continue; if (hero.Player.Distance(sender.ServerPosition) <= 750) { if (Activator.Player.Distance(hero.Player.ServerPosition) <= 1000) { hero.HitTypes.Add(HitType.MinionAttack); hero.MinionDamage = (int) Math.Abs(sender.CalcDamage(hero.Player, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); Utility.DelayAction.Add(500, () => { hero.HitTypes.Remove(HitType.MinionAttack); hero.MinionDamage = 0; }); } } } } #endregion #region Gangplank Barell if (sender.IsEnemy) { var enemy = sender as Obj_AI_Hero; if (enemy.IsValid<Obj_AI_Hero>() && enemy.ChampionName == "Gangplank") { foreach (var hero in Activator.Allies()) { foreach (var b in ObjectManager.Get<GameObject>() .Where(x => x.Name.Contains("E_AoE") && x.Position.Distance(x.Position) <= 400 && !x.IsAlly) .OrderBy(y => y.Position.Distance(hero.Player.ServerPosition))) { if (hero.Player.Distance(b.Position) > 400 || args.Target.Name != "Barrel") { continue; } var dmg = (int)Math.Abs(enemy.GetAutoAttackDamage(hero.Player, true) * 1.6 + 200); if (args.SData.Name.ToLower() == "gangplankcritattack") { dmg = dmg * 2; } if (!hero.Player.IsValidTarget(float.MaxValue, false) || hero.Player.IsZombie || hero.Immunity) { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Clear(); continue; } if (hero.IncomeDamage < 12) hero.IncomeDamage = 0; Utility.DelayAction.Add(250, () => { hero.Attacker = enemy; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += dmg; Utility.DelayAction.Add(800, delegate { hero.Attacker = null; hero.HitTypes.Remove(HitType.Spell); hero.IncomeDamage -= dmg; }); }); } } } } #endregion }
private static void OnObjAiBaseProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { try { if (!Enabled) { return; } var enemy = sender as AIHeroClient; var turret = sender as Obj_AI_Turret; foreach ( var hero in GameObjects.Heroes.Where(h => h.IsValid && IncomingDamages.ContainsKey(h.NetworkId))) { if (ShouldReset(hero)) { IncomingDamages[hero.NetworkId] = 0; continue; } if (enemy != null && enemy.IsValid && enemy.IsEnemy && enemy.LSDistance(hero) <= 2000f) { if (args.Target != null && args.Target.NetworkId.Equals(hero.NetworkId)) { if (args.SData.IsAutoAttack()) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.3f), (float)sender.LSGetAutoAttackDamage(hero, true)); } else if (args.SData.TargettingType == SpellDataTargetType.Unit || args.SData.TargettingType == SpellDataTargetType.SelfAndUnit) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.3f), (float)sender.LSGetSpellDamage(hero, args.SData.Name)); } } if (args.Target == null && Skillshots) { var slot = enemy.GetSpellSlot(args.SData.Name); if (slot != SpellSlot.Unknown && (slot == SpellSlot.Q || slot == SpellSlot.E || slot == SpellSlot.W || slot == SpellSlot.R)) { var width = Math.Min( 750f, (args.SData.TargettingType == SpellDataTargetType.Cone || args.SData.LineWidth > 0) && args.SData.TargettingType != SpellDataTargetType.Cone ? args.SData.LineWidth : (args.SData.CastRadius <= 0 ? args.SData.CastRadiusSecondary : args.SData.CastRadius)); if (args.End.LSDistance(hero.ServerPosition) <= Math.Pow(width, 2)) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.6f), (float)sender.LSGetSpellDamage(hero, args.SData.Name)); } } } } if (turret != null && turret.IsValid && turret.IsEnemy && turret.LSDistance(hero) <= 1500f) { if (args.Target != null && args.Target.NetworkId.Equals(hero.NetworkId)) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.3f), (float) sender.CalcDamage( hero, DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); } } } } catch (Exception e) { Console.WriteLine(e); } }
private static void Obj_AI_Base_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { #region Hero Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Hero) { Casted = Utils.GameTimeTickCount; foreach (var hero in Activator.Allies()) { if (!hero.Player.IsValidTarget(float.MaxValue, false) || hero.Player.IsZombie || hero.Immunity) { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Clear(); continue; } #region auto attack dectection if (args.SData.IsAutoAttack()) { if (args.Target.NetworkId != hero.Player.NetworkId) continue; // delay a little bit before missile endtime Utility.DelayAction.Add(250, () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.AutoAttack); hero.IncomeDamage += (float) Math.Abs(sender.GetAutoAttackDamage(hero.Player)); // lazy reset Utility.DelayAction.Add(550, delegate { hero.Attacker = null; hero.HitTypes.Remove(HitType.AutoAttack); hero.IncomeDamage = 0; }); }); } #endregion foreach (var data in spelldata.spells.Where(x => x.SDataName == args.SData.Name.ToLower())) { #region self/selfaoe spell detection if (args.SData.TargettingType == SpellDataTargetType.Self || args.SData.TargettingType == SpellDataTargetType.SelfAoe) { var fromObj = ObjectManager.Get<GameObject>() .FirstOrDefault( x => data.FromObject != null && data.FromObject.Any(y => x.Name.Contains(y))); var correctpos = fromObj != null ? fromObj.Position : sender.ServerPosition; if (hero.Player.Distance(correctpos) > data.CastRange) continue; if (data.SDataName == "kalistaexpungewrapper" && !hero.Player.HasBuff("kalistaexpungemarker", true)) continue; var evadetime = 1000 * (data.CastRange - hero.Player.Distance(correctpos) + hero.Player.BoundingRadius) / hero.Player.MoveSpeed; if (Activator.Origin.Item("evade").GetValue<bool>()) { // ignore if can evade if (hero.Player.NetworkId == Activator.Player.NetworkId) { if (hero.Player.CanMove && evadetime < data.Delay) { // check next player continue; } } } // delay the spell a bit before missile endtime Utility.DelayAction.Add((int) (data.Delay - (data.Delay * 0.3)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += (float) Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); foreach (var type in data.HitType) hero.HitTypes.Add(type); // lazy safe reset Utility.DelayAction.Add((int) (data.Delay + 300), () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Clear(); }); }); } #endregion #region skillshot detection completerino if (args.SData.TargettingType == SpellDataTargetType.Cone || args.SData.TargettingType.ToString().Contains("Location")) { var fromObj = ObjectManager.Get<GameObject>() .FirstOrDefault( x => data.FromObject != null && data.FromObject.Any(y => x.Name.Contains(y))); // correct datas var islineskillshot = args.SData.LineWidth != 0; var correctpos = fromObj != null ? fromObj.Position : sender.ServerPosition; var correctwidth = !islineskillshot ? args.SData.CastRadius : args.SData.LineWidth; if (hero.Player.Distance(correctpos) > data.CastRange) continue; var distance = (int)(1000 * (correctpos.Distance(hero.Player.ServerPosition) / data.MissileSpeed)); var endtime = data.Delay - 100 + Game.Ping/2 + distance - (Utils.GameTimeTickCount - Casted); // get the real end position normalized var direction = (args.End.To2D() - correctpos.To2D()).Normalized(); var endpos = correctpos.To2D() + direction * data.CastRange; // setup projection var proj = hero.Player.ServerPosition.To2D().ProjectOn(correctpos.To2D(), endpos); var projdist = hero.Player.ServerPosition.To2D().Distance(proj.SegmentPoint); // get the evade time int evadetime; if (islineskillshot) { evadetime = (int) (1000 * (correctwidth - projdist + hero.Player.BoundingRadius) / hero.Player.MoveSpeed); } else { evadetime = (int) (1000 * (correctwidth - hero.Player.Distance(correctpos) + hero.Player.BoundingRadius) / hero.Player.MoveSpeed); } if (!islineskillshot && hero.Player.Distance(args.End) <= correctwidth || islineskillshot && correctwidth + hero.Player.BoundingRadius > projdist) { if (data.Global || Activator.Origin.Item("evade").GetValue<bool>()) { // ignore if can evade if (hero.Player.NetworkId == Activator.Player.NetworkId) { if (hero.Player.CanMove && evadetime < endtime) { // check next player continue; } } } // vayne invis check if (data.SDataName == "vaynetumble" && sender.HasBuff("VayneInquisition", true)) hero.HitTypes.Add(HitType.Stealth); // delay the action a little bit before endtime Utility.DelayAction.Add((int) (endtime - (endtime * 0.3)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += (float) Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); foreach (var type in data.HitType) hero.HitTypes.Add(type); // lazy safe reset Utility.DelayAction.Add((int) (endtime + 300), () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Clear(); }); }); } } #endregion #region unit type detection if (args.SData.TargettingType == SpellDataTargetType.Unit || args.SData.TargettingType == SpellDataTargetType.SelfAndUnit) { // check if is targeteting the hero on our table if (hero.Player.NetworkId != args.Target.NetworkId) continue; // target spell dectection if (hero.Player.Distance(sender.ServerPosition) > data.CastRange) continue; var distance = (int) (1000 * (sender.Distance(hero.Player.ServerPosition) / data.MissileSpeed)); var endtime = data.Delay - 100 + Game.Ping / 2 + distance - (Utils.GameTimeTickCount - Casted); Utility.DelayAction.Add((int) (endtime - (endtime * 0.3)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += (float) Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); foreach (var type in data.HitType) hero.HitTypes.Add(type); // lazy reset Utility.DelayAction.Add((int) (endtime + 300), () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Clear(); }); }); } #endregion } } } #endregion #region Turret Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Turret) { foreach (var hero in Activator.Allies()) { if (args.Target.NetworkId != hero.Player.NetworkId) continue; if (hero.Immunity) continue; if (sender.Distance(hero.Player.ServerPosition) <= 900 && Activator.Player.Distance(hero.Player.ServerPosition) <= 1000) { Utility.DelayAction.Add(500, () => { hero.HitTypes.Add(HitType.TurretAttack); hero.IncomeDamage = (float) Math.Abs(sender.CalcDamage(hero.Player, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); // lazy reset Utility.DelayAction.Add(800, () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Remove(HitType.TurretAttack); }); }); } } } #endregion #region Minion Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Minion) { foreach (var hero in Activator.Allies()) { if (hero.Player.NetworkId != args.Target.NetworkId) continue; if (hero.Immunity) continue; if (hero.Player.Distance(sender.ServerPosition) <= 750 && Activator.Player.Distance(hero.Player.ServerPosition) <= 1000) { hero.HitTypes.Add(HitType.MinionAttack); hero.MinionDamage = (float) Math.Abs(sender.CalcDamage(hero.Player, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); // lazy reset Utility.DelayAction.Add(500, () => { hero.HitTypes.Remove(HitType.MinionAttack); hero.MinionDamage = 0; }); } } } #endregion }
private static void OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { if (sender.Type == GameObjectType.obj_AI_Hero && sender.IsEnemy) { var heroSender = ObjectManager.Get<Obj_AI_Hero>().First(x => x.NetworkId == sender.NetworkId); if (heroSender.GetSpellSlot(args.SData.Name) == SpellSlot.Unknown && args.Target.Type == Player.Type) { AggroTarget = ObjectManager.GetUnitByNetworkId<Obj_AI_Hero>(args.Target.NetworkId); incomingDamage = (float)heroSender.GetAutoAttackDamage(AggroTarget); } if (heroSender.ChampionName == "Jinx" && args.SData.Name.Contains("JinxQAttack") && args.Target.Type == Player.Type) { AggroTarget = ObjectManager.GetUnitByNetworkId<Obj_AI_Hero>(args.Target.NetworkId); incomingDamage = (float)heroSender.GetAutoAttackDamage(AggroTarget); } } if (sender.Type == GameObjectType.obj_AI_Turret && sender.IsEnemy) { if (args.Target.Type == Player.Type) { if (sender.Distance(Allies().ServerPosition, true) <= 900 * 900) { AggroTarget = ObjectManager.GetUnitByNetworkId<Obj_AI_Hero>(args.Target.NetworkId); incomingDamage = (float) sender.CalcDamage( AggroTarget, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod); } } } }
public static Obj_AI_Hero GetTarget(Obj_AI_Base champion, float range, IEnumerable<Obj_AI_Hero> ignoredChamps = null, Vector3? rangeCheckFrom = null) { try { if (ignoredChamps == null) { ignoredChamps = new List<Obj_AI_Hero>(); } if (_configMenu != null && IsValidTarget( SelectedTarget, _configMenu.Item("ForceFocusSelected").GetValue<bool>() ? float.MaxValue : range, rangeCheckFrom)) { return SelectedTarget; } if (_configMenu != null && _configMenu.Item("TargetingMode") != null && Mode == TargetingMode.AutoPriority) { var menuItem = _configMenu.Item("TargetingMode").GetValue<StringList>(); Enum.TryParse(menuItem.SList[menuItem.SelectedIndex], out Mode); } var targets = HeroManager.Enemies .FindAll( hero => !IsInvulnerable(hero) && ignoredChamps.All(ignored => ignored.NetworkId != hero.NetworkId) && IsValidTarget(hero, range, rangeCheckFrom)); switch (Mode) { case TargetingMode.LowHP: return targets.MinOrDefault(hero => hero.Health); case TargetingMode.Closest: return targets.MinOrDefault( hero => (rangeCheckFrom.HasValue ? rangeCheckFrom.Value : champion.ServerPosition).Distance( hero.ServerPosition, true)); case TargetingMode.AutoPriority: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Physical, 100)/(1 + hero.Health)* GetPriority(hero)); case TargetingMode.LeastAttacks: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Physical, 100)/(1 + hero.Health)* GetPriority(hero)); case TargetingMode.HighestPriority: return targets.MaxOrDefault( hero => GetPriority(hero)); default: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Physical, 100)/(1 + hero.Health)* GetPriority(hero)); } } catch (Exception e) { Console.WriteLine(e); } return null; }
public static double GetTowerDamage(Obj_AI_Base sender) { var towerDamage = sender.CalcDamage( ObjectManager.Player, Damage.DamageType.Physical, sender.BaseAttackDamage); if (TowerIsOuter(sender)) { towerDamage = towerDamage * (1 + 0.375f * WarmingUpStacks + 0.25f * HeatedUpStacks); } else if (TowerIsInhib(sender)) { towerDamage = towerDamage * (1 + 0.0105f * HeatStacks); } return towerDamage; }
public static AIHeroClient GetTarget(Obj_AI_Base champion, float range, DamageType type, bool ignoreShieldSpells = true, IEnumerable<AIHeroClient> ignoredChamps = null, Vector3? rangeCheckFrom = null, TargetSelectionConditionDelegate conditions = null) { try { if (ignoredChamps == null) { ignoredChamps = new List<AIHeroClient>(); } var damageType = (EloBuddy.DamageType)Enum.Parse(typeof(EloBuddy.DamageType), type.ToString()); if (_configMenu != null && IsValidTarget( SelectedTarget, focusMenu["ForceFocusSelected"].Cast<CheckBox>().CurrentValue ? float.MaxValue : range, type, ignoreShieldSpells, rangeCheckFrom)) { return SelectedTarget; } if (_configMenu != null && IsValidTarget( SelectedTarget, focusMenu["ForceFocusSelectedKeys"].Cast<CheckBox>().CurrentValue ? float.MaxValue : range, type, ignoreShieldSpells, rangeCheckFrom)) { if (focusMenu["ForceFocusSelectedK"].Cast<KeyBind>().CurrentValue || focusMenu["ForceFocusSelectedK2"].Cast<KeyBind>().CurrentValue) { return SelectedTarget; } } if (_configMenu != null && _configMenu["TargetingMode"] != null && Mode == TargetingMode.AutoPriority) { var menuItem = _configMenu["TargetingMode"].Cast<ComboBox>().CurrentValue; Enum.TryParse(getMode().ToString(), out Mode); } var targets = EntityManager.Heroes.Enemies .FindAll( hero => ignoredChamps.All(ignored => ignored.NetworkId != hero.NetworkId) && IsValidTarget(hero, range, type, ignoreShieldSpells, rangeCheckFrom) && (conditions == null || conditions(hero))); switch (Mode) { case TargetingMode.LowHP: return targets.MinOrDefault(hero => hero.Health); case TargetingMode.MostAD: return targets.MaxOrDefault(hero => hero.BaseAttackDamage + hero.FlatPhysicalDamageMod); case TargetingMode.MostAP: return targets.MaxOrDefault(hero => hero.BaseAbilityDamage + hero.FlatMagicDamageMod); case TargetingMode.Closest: return targets.MinOrDefault( hero => (rangeCheckFrom.HasValue ? rangeCheckFrom.Value : champion.ServerPosition).LSDistance( hero.ServerPosition, true)); case TargetingMode.NearMouse: return targets.MinOrDefault(hero => hero.LSDistance(Game.CursorPos, true)); case TargetingMode.AutoPriority: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, damageType, 100) / (1 + hero.Health) * GetPriority(hero)); case TargetingMode.LessAttack: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, EloBuddy.DamageType.Physical, 100) / (1 + hero.Health) * GetPriority(hero)); case TargetingMode.LessCast: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, EloBuddy.DamageType.Magical, 100) / (1 + hero.Health) * GetPriority(hero)); case TargetingMode.MostStack: return targets.MaxOrDefault( hero => champion.CalcDamage(hero, damageType, 100) / (1 + hero.Health) * GetPriority(hero) + (1 + hero.Buffs.Where(b => StackNames.Contains(b.Name.ToLower())).Sum(t => t.Count))); } } catch (Exception e) { Console.WriteLine(e); } return null; }
private static void OnObjAiBaseProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { try { if (!Enabled) { return; } var enemy = sender as Obj_AI_Hero; var turret = sender as Obj_AI_Turret; foreach ( var hero in GameObjects.Heroes.Where(h => h.IsValid && IncomingDamages.ContainsKey(h.NetworkId))) { if (ShouldReset(hero)) { IncomingDamages[hero.NetworkId] = 0; continue; } if (enemy != null && enemy.IsValid && enemy.IsEnemy && enemy.Distance(hero) <= 2000) { if (args.Target != null && args.Target.NetworkId.Equals(hero.NetworkId)) { if (args.SData.IsAutoAttack()) { AddDamage( hero, (int) (GetTime(sender, hero, args.SData) * 0.3f), (float) sender.GetAutoAttackDamage(hero, true)); } else if ((args.SData.TargettingType == SpellDataTargetType.Unit || args.SData.TargettingType == SpellDataTargetType.SelfAndUnit)) { AddDamage( hero, (int) (GetTime(sender, hero, args.SData) * 0.3f), (float) sender.GetSpellDamage(hero, args.SData.Name)); } } if (Skillshots) { if (args.SData.TargettingType == SpellDataTargetType.Cone || args.SData.TargettingType.ToString().Contains("Location")) { var width = (args.SData.TargettingType == SpellDataTargetType.Cone || args.SData.LineWidth > 0) && args.SData.TargettingType != SpellDataTargetType.Cone ? args.SData.LineWidth : (args.SData.CastRadius <= 0 ? args.SData.CastRadiusSecondary : args.SData.CastRadius); if (args.End.Distance(hero.ServerPosition) <= width * 1.2f) { AddDamage( hero, (int) (GetTime(sender, hero, args.SData) * 0.7f), (float) sender.GetSpellDamage(hero, args.SData.Name)); } } } } if (turret != null && turret.IsValid && turret.IsEnemy && turret.Distance(hero) <= 1500) { if (args.Target != null && args.Target.NetworkId.Equals(hero.NetworkId)) { AddDamage( hero, (int) (GetTime(sender, hero, args.SData) * 0.3f), (float) sender.CalcDamage( hero, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); } } } } catch (Exception ex) { Global.Logger.AddItem(new LogItem(ex)); } }
public static bool MinionIsLethal(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { //Console.WriteLine("Damage from Minion: " + sender.GetAutoAttackDamage(ObjectManager.Player)); return ObjectManager.Player.Health <= sender.CalcDamage(ObjectManager.Player, Damage.DamageType.Physical, sender.BaseAttackDamage); }
private static void Obj_AI_Base_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { #region Hero Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Hero) { Casted = Utils.GameTimeTickCount; foreach (var hero in Activator.Allies()) { if (!hero.Player.IsValidTarget(float.MaxValue, false) || hero.Player.IsZombie || hero.Immunity) { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Clear(); continue; } #region auto attack dectection if (args.SData.IsAutoAttack()) { if (args.Target.NetworkId != hero.Player.NetworkId) { continue; } // delay a little bit before missile endtime Utility.DelayAction.Add(250, () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.AutoAttack); hero.IncomeDamage += (float)Math.Abs(sender.GetAutoAttackDamage(hero.Player)); // lazy reset Utility.DelayAction.Add(1000, delegate { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Remove(HitType.AutoAttack); }); }); } #endregion foreach (var data in spelldata.spells.Where(x => x.SDataName == args.SData.Name.ToLower())) { #region self/selfaoe spell detection if (args.SData.TargettingType == SpellDataTargetType.Self || args.SData.TargettingType == SpellDataTargetType.SelfAoe) { var fromObj = ObjectManager.Get <GameObject>() .FirstOrDefault( x => data.FromObject != null && data.FromObject.Any(y => x.Name.Contains(y))); var correctpos = fromObj != null ? fromObj.Position : sender.ServerPosition; if (hero.Player.Distance(correctpos) > data.CastRange) { continue; } if (data.SDataName == "kalistaexpungewrapper" && !hero.Player.HasBuff("kalistaexpungemarker", true)) { continue; } var evadetime = 1000 * (data.CastRange - hero.Player.Distance(correctpos) + hero.Player.BoundingRadius) / hero.Player.MoveSpeed; if (Activator.Origin.Item("evade").GetValue <bool>()) { // ignore if can evade if (hero.Player.NetworkId == Activator.Player.NetworkId) { if (hero.Player.CanMove && evadetime < data.Delay) { // check next player continue; } } } // delay the spell a bit before missile endtime Utility.DelayAction.Add((int)(data.Delay - (data.Delay * 0.3)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += (float)Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); foreach (var type in data.HitType) { hero.HitTypes.Add(type); } // lazy safe reset Utility.DelayAction.Add((int)(data.Delay + 500), () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Remove(HitType.Spell); foreach (var t in data.HitType) { hero.HitTypes.Remove(t); } }); }); } #endregion #region skillshot detection completerino if (args.SData.TargettingType == SpellDataTargetType.Cone || args.SData.TargettingType.ToString().Contains("Location")) { var fromObj = ObjectManager.Get <GameObject>() .FirstOrDefault( x => data.FromObject != null && data.FromObject.Any(y => x.Name.Contains(y))); // correct datas var islineskillshot = args.SData.LineWidth != 0; var correctpos = fromObj != null ? fromObj.Position : sender.ServerPosition; var correctwidth = !islineskillshot ? args.SData.CastRadius : args.SData.LineWidth; if (hero.Player.Distance(correctpos) > data.CastRange) { continue; } var distance = (int)(1000 * (correctpos.Distance(hero.Player.ServerPosition) / data.MissileSpeed)); var endtime = data.Delay - 100 + Game.Ping / 2 + distance - (Utils.GameTimeTickCount - Casted); // get the real end position normalized var direction = (args.End.To2D() - correctpos.To2D()).Normalized(); var endpos = correctpos.To2D() + direction * data.CastRange; // setup projection var proj = hero.Player.ServerPosition.To2D().ProjectOn(correctpos.To2D(), endpos); var projdist = hero.Player.ServerPosition.To2D().Distance(proj.SegmentPoint); // get the evade time int evadetime; if (islineskillshot) { evadetime = (int) (1000 * (correctwidth - projdist + hero.Player.BoundingRadius) / hero.Player.MoveSpeed); } else { evadetime = (int) (1000 * (correctwidth - hero.Player.Distance(correctpos) + hero.Player.BoundingRadius) / hero.Player.MoveSpeed); } if (!islineskillshot && hero.Player.Distance(args.End) <= correctwidth || islineskillshot && correctwidth + hero.Player.BoundingRadius > projdist) { if (data.Global || Activator.Origin.Item("evade").GetValue <bool>()) { // ignore if can evade if (hero.Player.NetworkId == Activator.Player.NetworkId) { if (hero.Player.CanMove && evadetime < endtime) { // check next player continue; } } } // vayne invis check if (data.SDataName == "vaynetumble" && sender.HasBuff("VayneInquisition", true)) { hero.HitTypes.Add(HitType.Stealth); } // delay the action a little bit before endtime Utility.DelayAction.Add((int)(endtime - (endtime * 0.3)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += (float)Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); foreach (var type in data.HitType) { hero.HitTypes.Add(type); } // lazy safe reset Utility.DelayAction.Add((int)(endtime + 500), () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Remove(HitType.Spell); foreach (var t in data.HitType) { hero.HitTypes.Remove(t); } }); }); } } #endregion #region unit type detection if (args.SData.TargettingType == SpellDataTargetType.Unit || args.SData.TargettingType == SpellDataTargetType.SelfAndUnit) { // check if is targeteting the hero on our table if (hero.Player.NetworkId != args.Target.NetworkId) { continue; } // target spell dectection if (hero.Player.Distance(sender.ServerPosition) > data.CastRange) { continue; } var distance = (int)(1000 * (sender.Distance(hero.Player.ServerPosition) / data.MissileSpeed)); var endtime = data.Delay - 100 + Game.Ping / 2 + distance - (Utils.GameTimeTickCount - Casted); Utility.DelayAction.Add((int)(endtime - (endtime * 0.3)), () => { hero.Attacker = sender; hero.HitTypes.Add(HitType.Spell); hero.IncomeDamage += (float)Math.Abs(sender.GetSpellDamage(hero.Player, args.SData.Name)); foreach (var type in data.HitType) { hero.HitTypes.Add(type); } // lazy reset Utility.DelayAction.Add((int)(endtime + 500), () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Remove(HitType.Spell); foreach (var t in data.HitType) { hero.HitTypes.Remove(t); } }); }); } #endregion } } } #endregion #region Turret Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Turret) { foreach (var hero in Activator.Allies()) { if (args.Target.NetworkId != hero.Player.NetworkId) { continue; } if (hero.Immunity) { continue; } if (sender.Distance(hero.Player.ServerPosition) <= 900 && Activator.Player.Distance(hero.Player.ServerPosition) <= 1000) { Utility.DelayAction.Add(500, () => { hero.HitTypes.Add(HitType.TurretAttack); hero.IncomeDamage = (float)Math.Abs(sender.CalcDamage(hero.Player, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); // lazy reset Utility.DelayAction.Add(800, () => { hero.Attacker = null; hero.IncomeDamage = 0; hero.HitTypes.Remove(HitType.TurretAttack); }); }); } } } #endregion #region Minion Detection if (sender.IsEnemy && sender.Type == GameObjectType.obj_AI_Minion) { foreach (var hero in Activator.Allies()) { if (hero.Player.NetworkId != args.Target.NetworkId) { continue; } if (hero.Immunity) { continue; } if (hero.Player.Distance(sender.ServerPosition) <= 750 && Activator.Player.Distance(hero.Player.ServerPosition) <= 1000) { hero.HitTypes.Add(HitType.MinionAttack); hero.MinionDamage = (float)Math.Abs(sender.CalcDamage(hero.Player, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); // lazy reset Utility.DelayAction.Add(500, () => { hero.HitTypes.Remove(HitType.MinionAttack); hero.MinionDamage = 0; }); } } } #endregion }
public static AIHeroClient GetTarget( Obj_AI_Base champion, float range, DamageType type, bool ignoreShieldSpells = true, IEnumerable <AIHeroClient> ignoredChamps = null, Vector3?rangeCheckFrom = null, TargetSelectionConditionDelegate conditions = null) { try { if (ignoredChamps == null) { ignoredChamps = new List <AIHeroClient>(); } var damageType = (Damage.DamageType)Enum.Parse(typeof(Damage.DamageType), type.ToString()); if (_configMenu != null && IsValidTarget( SelectedTarget, _configMenu.Item("ForceFocusSelected").GetValue <bool>() ? float.MaxValue : range, type, ignoreShieldSpells, rangeCheckFrom)) { return(SelectedTarget); } if (_configMenu != null && IsValidTarget( SelectedTarget, _configMenu.Item("ForceFocusSelectedKeys").GetValue <bool>() ? float.MaxValue : range, type, ignoreShieldSpells, rangeCheckFrom)) { if (_configMenu.Item("ForceFocusSelectedK").GetValue <KeyBind>().Active || _configMenu.Item("ForceFocusSelectedK2").GetValue <KeyBind>().Active) { return(SelectedTarget); } } if (_configMenu != null && _configMenu.Item("TargetingMode") != null && Mode == TargetingMode.AutoPriority) { var menuItem = _configMenu.Item("TargetingMode").GetValue <StringList>(); Enum.TryParse(menuItem.SList[menuItem.SelectedIndex], out Mode); } var targets = EloBuddy.SDK.EntityManager.Heroes.Enemies.Where( hero => ignoredChamps.All(ignored => ignored.NetworkId != hero.NetworkId) && IsValidTarget(hero, range, type, ignoreShieldSpells, rangeCheckFrom) && (conditions == null || conditions(hero))); switch (Mode) { case TargetingMode.LowHP: return(targets.MinOrDefault(hero => hero.Health)); case TargetingMode.MostAD: return(targets.MaxOrDefault(hero => hero.BaseAttackDamage + hero.FlatPhysicalDamageMod)); case TargetingMode.MostAP: return(targets.MaxOrDefault(hero => hero.BaseAbilityDamage + hero.FlatMagicDamageMod)); case TargetingMode.Closest: return (targets.MinOrDefault( hero => (rangeCheckFrom.HasValue ? rangeCheckFrom.Value : champion.ServerPosition).Distance( hero.ServerPosition, true))); case TargetingMode.NearMouse: return(targets.MinOrDefault(hero => hero.Distance(Game.CursorPos, true))); case TargetingMode.AutoPriority: return (targets.MaxOrDefault( hero => champion.CalcDamage(hero, damageType, 100) / (1 + hero.Health) * GetPriority(hero))); case TargetingMode.LessAttack: return (targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Physical, 100) / (1 + hero.Health) * GetPriority(hero))); case TargetingMode.LessCast: return (targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Magical, 100) / (1 + hero.Health) * GetPriority(hero))); case TargetingMode.MostStack: return (targets.MaxOrDefault( hero => champion.CalcDamage(hero, damageType, 100) / (1 + hero.Health) * GetPriority(hero) + (1 + hero.Buffs.Where(b => StackNames.Contains(b.Name.ToLower())).Sum(t => t.Count)))); } } catch (Exception e) { Console.WriteLine(e); } return(null); }
public static Obj_AI_Hero GetTarget(Obj_AI_Base champion, float range, DamageType type, bool ignoreShieldSpells = true, IEnumerable <Obj_AI_Hero> ignoredChamps = null, Vector3?rangeCheckFrom = null) { try { if (ignoredChamps == null) { ignoredChamps = new List <Obj_AI_Hero>(); } var damageType = (Damage.DamageType)Enum.Parse(typeof(Damage.DamageType), type.ToString()); if (_configMenu != null && IsValidTarget( SelectedTarget, _configMenu.Item("ForceFocusSelected").GetValue <bool>() ? float.MaxValue : range, type, ignoreShieldSpells, rangeCheckFrom)) { return(SelectedTarget); } if (_configMenu != null && _configMenu.Item("TargetingMode") != null && Mode == TargetingMode.AutoPriority) { var menuItem = _configMenu.Item("TargetingMode").GetValue <StringList>(); Enum.TryParse(menuItem.SList[menuItem.SelectedIndex], out Mode); } var targets = HeroManager.Enemies .FindAll( hero => ignoredChamps.All(ignored => ignored.NetworkId != hero.NetworkId) && IsValidTarget(hero, range, type, ignoreShieldSpells, rangeCheckFrom)); switch (Mode) { case TargetingMode.LowHP: return(targets.MinOrDefault(hero => hero.Health)); case TargetingMode.MostAD: return(targets.MaxOrDefault(hero => hero.BaseAttackDamage + hero.FlatPhysicalDamageMod)); case TargetingMode.MostAP: return(targets.MaxOrDefault(hero => hero.BaseAbilityDamage + hero.FlatMagicDamageMod)); case TargetingMode.Closest: return (targets.MinOrDefault( hero => (rangeCheckFrom.HasValue ? rangeCheckFrom.Value : champion.ServerPosition).Distance( hero.ServerPosition, true))); case TargetingMode.NearMouse: return(targets.Find(hero => hero.Distance(Game.CursorPos, true) < 22500)); // 150 * 150 case TargetingMode.AutoPriority: return (targets.MaxOrDefault( hero => champion.CalcDamage(hero, damageType, 100) / (1 + hero.Health) * GetPriority(hero))); case TargetingMode.LessAttack: return (targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Physical, 100) / (1 + hero.Health) * GetPriority(hero))); case TargetingMode.LessCast: return (targets.MaxOrDefault( hero => champion.CalcDamage(hero, Damage.DamageType.Magical, 100) / (1 + hero.Health) * GetPriority(hero))); } } catch (Exception e) { Console.WriteLine(e); } return(null); }
public static void EmulateDamage(Obj_AI_Base sender, Champion hero, Gamedata data, HitType dmgType, string notes = null, float dmgEntry = 0f, int expiry = 500) { var hpred = new HPInstance(); hpred.HitType = dmgType; hpred.TargetHero = hero.Player; hpred.Data = data; hpred.Name = string.Empty; if (!string.IsNullOrEmpty(data?.SDataName)) { hpred.Name = data.SDataName; } if (sender is Obj_AI_Hero) { hpred.Attacker = sender; } if (dmgEntry == 0f && sender != null) { switch (dmgType) { case HitType.AutoAttack: hpred.PredictedDmg = (float)sender.GetAutoAttackDamage(hero.Player, true); break; case HitType.MinionAttack: case HitType.TurretAttack: hpred.PredictedDmg = (float) Math.Max( sender.CalcDamage(hero.Player, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod), 0); break; default: if (!string.IsNullOrEmpty(data?.SDataName)) { hpred.PredictedDmg = (float)Math.Max(0, sender.GetSpellDamage(hero.Player, data.SDataName)); } break; } } else { var idmg = dmgEntry; hpred.PredictedDmg = (float)Math.Round(idmg); } if (hpred.PredictedDmg > 0) { var idmg = hpred.PredictedDmg * Activator.Origin.Item("weightdmg").GetValue <Slider>().Value / 100; hpred.PredictedDmg = (float)Math.Round(idmg); } else { var idmg = (hero.Player.Health / hero.Player.MaxHealth) * 5; hpred.PredictedDmg = (float)Math.Round(idmg); } if (dmgType != HitType.Buff && dmgType != HitType.Troy) { // check duplicates (missiles and process spell) if (IncomeDamage.Select(entry => entry.Value).Any(o => o.Name == data.SDataName)) { return; } } var dmg = AddDamage(hpred, hero, notes); var extendedEndtime = Activator.Origin.Item("lagtolerance").GetValue <Slider>().Value * 10; Utility.DelayAction.Add(expiry + extendedEndtime, () => RemoveDamage(dmg, notes)); }
private static void OnObjAiBaseProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { try { if (!Enabled) { return; } var enemy = sender as Obj_AI_Hero; var turret = sender as Obj_AI_Turret; foreach ( var hero in GameObjects.Heroes.Where(h => h.IsValid && IncomingDamages.ContainsKey(h.NetworkId))) { if (ShouldReset(hero)) { IncomingDamages[hero.NetworkId] = 0; continue; } if (enemy != null && enemy.IsValid && enemy.IsEnemy && enemy.Distance(hero) <= 2000f) { if (args.Target != null && args.Target.NetworkId.Equals(hero.NetworkId)) { if (args.SData.IsAutoAttack()) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.3f), (float)sender.GetAutoAttackDamage(hero, true)); } else if (args.SData.TargettingType == SpellDataTargetType.Unit || args.SData.TargettingType == SpellDataTargetType.SelfAndUnit) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.3f), (float)sender.GetSpellDamage(hero, args.SData.Name)); } } if (args.Target == null && Skillshots) { var slot = enemy.GetSpellSlot(args.SData.Name); if (slot != SpellSlot.Unknown && (slot == SpellSlot.Q || slot == SpellSlot.E || slot == SpellSlot.W || slot == SpellSlot.R)) { var width = Math.Min( 750f, (args.SData.TargettingType == SpellDataTargetType.Cone || args.SData.LineWidth > 0) && args.SData.TargettingType != SpellDataTargetType.Cone ? args.SData.LineWidth : (args.SData.CastRadius <= 0 ? args.SData.CastRadiusSecondary : args.SData.CastRadius)); if (args.End.Distance(hero.ServerPosition) <= Math.Pow(width, 2)) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.6f), (float)sender.GetSpellDamage(hero, args.SData.Name)); } } } } if (turret != null && turret.IsValid && turret.IsEnemy && turret.Distance(hero) <= 1500f) { if (args.Target != null && args.Target.NetworkId.Equals(hero.NetworkId)) { AddDamage( hero, (int)(GetTime(sender, hero, args.SData) * 0.3f), (float) sender.CalcDamage( hero, Damage.DamageType.Physical, sender.BaseAttackDamage + sender.FlatPhysicalDamageMod)); } } } } catch (Exception ex) { Global.Logger.AddItem(new LogItem(ex)); } }