private static Menu CreateEvadeSpellMenu(EvadeSpellData spell) { string menuName = spell.name + " (" + spell.spellKey.ToString() + ") Settings"; if (spell.isItem) { menuName = spell.name + " Settings"; } Menu newSpellMenu = evadeSpellMenu.IsSubMenu ? evadeSpellMenu.Parent.AddSubMenuEx(menuName, spell.charName + spell.name + "EvadeSpellSettings") : evadeSpellMenu.AddSubMenuEx(menuName, spell.charName + spell.name + "EvadeSpellSettings"); newSpellMenu.Add(spell.name + "UseEvadeSpell", new CheckBox("Use Spell", true)); newSpellMenu.Add(spell.name + "EvadeSpellDangerLevel", new Slider("Danger Level", spell.dangerlevel - 1, 0, 4)); var slider = newSpellMenu.Add(spell.name + "EvadeSpellMode", new Slider("Spell Mode", GetDefaultSpellMode(spell), 0, 2)); var array = new[] { "Undodgeable", "Activation Time", "Always" }; slider.OnValueChange += delegate(ValueBase<int> sender, ValueBase<int>.ValueChangeArgs args) { sender.DisplayName = array[args.NewValue]; }; slider.DisplayName = array[slider.CurrentValue]; //newSpellMenu.AddItem(new MenuItem(spell.name + "SpellActivationTime", "Spell Activation Time").SetValue(new Slider(0, 0, 1000))); //Menu newSpellMiscMenu = new Menu("Misc Settings", spell.charName + spell.name + "EvadeSpellMiscSettings"); //newSpellMenu.AddSubMenuEx(newSpellMiscMenu); return newSpellMenu; }
private static Menu CreateEvadeSpellMenu(EvadeSpellData spell) { string menuName = spell.name + " (" + spell.spellKey.ToString() + ") Settings"; if (spell.isItem) { menuName = spell.name + " Settings"; } Menu newSpellMenu = new Menu(menuName, spell.charName + spell.name + "EvadeSpellSettings"); newSpellMenu.AddItem(new MenuItem(spell.name + "UseEvadeSpell", "Use Spell").SetValue(true)); newSpellMenu.AddItem(new MenuItem(spell.name + "EvadeSpellDangerLevel", "Danger Level") .SetValue(new StringList(new[] { "Low", "Normal", "High", "Extreme" }, spell.dangerlevel - 1))); //newSpellMenu.AddItem(new MenuItem(spell.name + "SpellActivationTime", "Spell Activation Time").SetValue(new Slider(0, 0, 1000))); //Menu newSpellMiscMenu = new Menu("Misc Settings", spell.charName + spell.name + "EvadeSpellMiscSettings"); //newSpellMenu.AddSubMenu(newSpellMiscMenu); newSpellMenu.AddItem(new MenuItem(spell.name + "EvadeSpellMode", "Spell Mode") .SetValue(new StringList(new[] { "Undodgeable", "Activation Time", "Always" }, GetDefaultSpellMode(spell)))); evadeSpellMenu.AddSubMenu(newSpellMenu); return newSpellMenu; }
public static bool UseEkkoR(EvadeSpellData evadeSpell, bool process = true) { if ((from obj in ObjectManager.Get<Obj_AI_Minion>() where obj != null && obj.IsValid && !obj.IsDead && obj.Name == "Ekko" && obj.IsAlly select obj.ServerPosition.To2D()).Any(blinkPos => !blinkPos.CheckDangerousPos(10))) { EvadeSpell.CastEvadeSpell(() => EvadeCommand.CastSpell(evadeSpell), process); //DelayAction.Add(50, () => myHero.IssueOrder(GameObjectOrder.MoveTo, posInfo.position.To3D())); return true; } return false; }
public static void LoadSpecialSpell(EvadeSpellData spellData) { if (spellData.spellName == "EkkoEAttack") { spellData.useSpellFunc = UseEkkoE2; } if (spellData.spellName == "EkkoR") { spellData.useSpellFunc = UseEkkoR; } }
public static bool UseBrokenWings(EvadeSpellData evadeSpell, bool process = false) { var posInfo = EvadeHelper.GetBestPositionDash(evadeSpell); if (posInfo != null) { EvadeCommand.MoveTo(posInfo.position); DelayAction.Add(50, () => EvadeSpell.CastEvadeSpell(() => EvadeCommand.CastSpell(evadeSpell), process)); return true; } return false; }
public static void CastSpell(EvadeSpellData spellData, Vector2 movePos) { EvadeSpell.lastSpellEvadeCommand = new EvadeCommand { order = EvadeOrderCommand.CastSpell, targetPosition = movePos, evadeSpellData = spellData, timestamp = EvadeUtils.TickCount, isProcessed = false }; myHero.Spellbook.CastSpell(spellData.spellKey, movePos.To3D(), false); }
public static void CastSpell(EvadeSpellData spellData, Obj_AI_Base target) { EvadeSpell.lastSpellEvadeCommand = new EvadeCommand { order = EvadeOrderCommand.CastSpell, target = target, evadeSpellData = spellData, timestamp = EvadeUtils.TickCount, isProcessed = false }; myHero.Spellbook.CastSpell(spellData.spellKey, target, false); }
public static void Attack(EvadeSpellData spellData, Obj_AI_Base target) { EvadeSpell.lastSpellEvadeCommand = new EvadeCommand { order = EvadeOrderCommand.Attack, target = target, evadeSpellData = spellData, timestamp = EvadeUtils.TickCount, isProcessed = false }; Player.IssueOrder(GameObjectOrder.AttackUnit, target, false); }
public static bool UsePounce(EvadeSpellData evadeSpell, bool proecess = true) { if (myHero.CharData.BaseSkinName != "Nidalee") { var posInfo = EvadeHelper.GetBestPositionDash(evadeSpell); if (posInfo != null) { EvadeSpell.CastEvadeSpell(() => EvadeCommand.CastSpell(evadeSpell), proecess); return true; } } return false; }
public static bool UseEkkoE2(EvadeSpellData evadeSpell, bool process = true) { if (myHero.HasBuff("ekkoeattackbuff")) { var posInfo = EvadeHelper.GetBestPositionTargetedDash(evadeSpell); if (posInfo != null && posInfo.target != null) { EvadeSpell.CastEvadeSpell(() => EvadeCommand.Attack(evadeSpell, posInfo.target), process); //DelayAction.Add(50, () => myHero.IssueOrder(GameObjectOrder.MoveTo, posInfo.position.To3D())); return true; } } return false; }
public static void LoadSpecialSpell(EvadeSpellData spellData) { if (spellData.spellName == "EkkoEAttack") { spellData.useSpellFunc = UseEkkoE2; } if (spellData.spellName == "EkkoR") { spellData.useSpellFunc = UseEkkoR; } if (spellData.spellName == "Pounce") { spellData.useSpellFunc = UsePounce; } if (spellData.spellName == "RivenTriCleave") { spellData.useSpellFunc = UseBrokenWings; } }
public static int GetDefaultSpellMode(EvadeSpellData spell) { return 0; }
public static int GetSpellDangerLevel(EvadeSpellData spell) { var dangerStr = ObjectCache.menuCache.cache[spell.name + "EvadeSpellDangerLevel"].Cast<Slider>().DisplayName; var dangerlevel = 1; switch (dangerStr) { case "Low": dangerlevel = 1; break; case "High": dangerlevel = 3; break; case "Extreme": dangerlevel = 4; break; default: dangerlevel = 2; break; } return dangerlevel; }
public static int GetDefaultSpellMode(EvadeSpellData spell) { if (spell.dangerlevel > 3) { return 0; } return 1; }
private static Menu CreateEvadeSpellMenu(EvadeSpellData spell) { string menuName = spell.name + " (" + spell.spellKey.ToString() + ") Settings"; if (spell.isItem) { menuName = spell.name + " Settings"; } evadeSpellMenu.AddGroupLabel(menuName); evadeSpellMenu.Add(spell.name + "UseEvadeSpell", new CheckBox("Use Spell")); evadeSpellMenu.Add(spell.name + "EvadeSpellDangerLevel", new ComboBox("Danger Level", spell.dangerlevel - 1, "Low", "Normal", "High", "Extreme")); evadeSpellMenu.Add(spell.name + "EvadeSpellMode", new ComboBox("Spell Mode", GetDefaultSpellMode(spell), "Undodgeable", "Activation Time", "Always")); return evadeSpellMenu; }
public static int GetSpellDangerLevel(EvadeSpellData spell) { var dangerStr = ObjectCache.menuCache.cache[spell.name + "EvadeSpellDangerLevel"].Cast<ComboBox>().CurrentValue; var dangerlevel = 1; switch (dangerStr) { case 0: dangerlevel = 1; break; case 2: dangerlevel = 3; break; case 3: dangerlevel = 4; break; default: dangerlevel = 2; break; } return dangerlevel; }
public static int GetSpellDangerLevel(EvadeSpellData spell) { var dangerStr = ObjectCache.menuCache.cache[spell.name + "EvadeSpellDangerLevel"].GetValue<StringList>().SelectedValue; var dangerlevel = 1; switch (dangerStr) { case "Low": dangerlevel = 1; break; case "High": dangerlevel = 3; break; case "Extreme": dangerlevel = 4; break; default: dangerlevel = 2; break; } return dangerlevel; }
public static PositionInfo GetBestPositionTargetedDash(EvadeSpellData spell) { /*if (spell.spellDelay > 0) * { * if (CheckWindupTime(spell.spellDelay)) * { * return null; * } * }*/ var extraDelayBuffer = ObjectCache.menuCache.cache["ExtraPingBuffer"].GetValue <Slider>().Value; var extraEvadeDistance = 100;// Evade.menu.SubMenu("MiscSettings").SubMenu("ExtraBuffers").Item("ExtraEvadeDistance").GetValue<Slider>().Value; var extraDist = ObjectCache.menuCache.cache["ExtraCPADistance"].GetValue <Slider>().Value; Vector2 heroPoint = ObjectCache.myHeroCache.serverPos2DPing; Vector2 lastMovePos = Game.CursorPos.To2D(); List <PositionInfo> posTable = new List <PositionInfo>(); List <int> spellList = SpellDetector.GetSpellList(); int minDistance = 50; //Math.Min(spell.range, minDistance) int maxDistance = int.MaxValue; if (spell.fixedRange) { minDistance = maxDistance = (int)spell.range; } List <Obj_AI_Base> collisionCandidates = new List <Obj_AI_Base>(); if (spell.spellTargets.Contains(SpellTargets.Targetables)) { foreach (var obj in ObjectManager.Get <Obj_AI_Base>() .Where(h => !h.IsMe && h.IsValidTarget(spell.range, false))) { if (!obj.IsValid <Obj_AI_Turret>()) { collisionCandidates.Add(obj); } } } else { List <Obj_AI_Hero> heroList = new List <Obj_AI_Hero>(); if (spell.spellTargets.Contains(SpellTargets.EnemyChampions) && spell.spellTargets.Contains(SpellTargets.AllyChampions)) { heroList = HeroManager.AllHeroes; } else if (spell.spellTargets.Contains(SpellTargets.EnemyChampions)) { heroList = HeroManager.Enemies; } else if (spell.spellTargets.Contains(SpellTargets.AllyChampions)) { heroList = HeroManager.Allies; } foreach (var hero in heroList.Where(h => !h.IsMe && h.IsValidTarget(spell.range))) { collisionCandidates.Add(hero); } List <Obj_AI_Base> minionList = new List <Obj_AI_Base>(); if (spell.spellTargets.Contains(SpellTargets.EnemyMinions) && spell.spellTargets.Contains(SpellTargets.AllyMinions)) { minionList = MinionManager.GetMinions(spell.range, MinionTypes.All, MinionTeam.All); } else if (spell.spellTargets.Contains(SpellTargets.EnemyMinions)) { minionList = MinionManager.GetMinions(spell.range, MinionTypes.All, MinionTeam.Enemy); } else if (spell.spellTargets.Contains(SpellTargets.AllyMinions)) { minionList = MinionManager.GetMinions(spell.range, MinionTypes.All, MinionTeam.Ally); } foreach (var minion in minionList.Where(h => h.IsValidTarget(spell.range))) { collisionCandidates.Add(minion); } } foreach (var candidate in collisionCandidates) { var pos = candidate.ServerPosition.To2D(); PositionInfo posInfo; if (spell.spellName == "YasuoDashWrapper") { bool hasDashBuff = false; foreach (var buff in candidate.Buffs) { if (buff.Name == "YasuoDashWrapper") { hasDashBuff = true; break; } } if (hasDashBuff) { continue; } } if (spell.behindTarget) { var dir = (pos - heroPoint).Normalized(); pos = pos + dir * (candidate.BoundingRadius + ObjectCache.myHeroCache.boundingRadius); } if (spell.infrontTarget) { var dir = (pos - heroPoint).Normalized(); pos = pos - dir * (candidate.BoundingRadius + ObjectCache.myHeroCache.boundingRadius); } if (spell.fixedRange) { var dir = (pos - heroPoint).Normalized(); pos = heroPoint + dir * spell.range; } if (spell.evadeType == EvadeType.Dash) { posInfo = CanHeroWalkToPos(pos, spell.speed, extraDelayBuffer + ObjectCache.gamePing, extraDist); posInfo.isDangerousPos = pos.CheckDangerousPos(6); posInfo.distanceToMouse = pos.GetPositionValue(); posInfo.spellList = spellList; } else { bool isDangerousPos = pos.CheckDangerousPos(6); var dist = pos.GetPositionValue(); posInfo = new PositionInfo(pos, isDangerousPos, dist); } posInfo.target = candidate; posTable.Add(posInfo); } if (spell.evadeType == EvadeType.Dash) { var sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount) .ThenBy(p => p.distanceToMouse); var first = sortedPosTable.FirstOrDefault(); if (first != null && Evade.lastPosInfo != null && first.isDangerousPos == false && Evade.lastPosInfo.posDangerLevel > first.posDangerLevel) { return(first); } } else { var sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) //.ThenByDescending(p => p.hasComfortZone) //.ThenBy(p => p.hasExtraDistance) .ThenBy(p => p.distanceToMouse); var first = sortedPosTable.FirstOrDefault(); return(first); } return(null); }
public static PositionInfo GetBestPositionDash(EvadeSpellData spell) { int posChecked = 0; int maxPosToCheck = 100; int posRadius = 50; int radiusIndex = 0; var extraDelayBuffer = ObjectCache.menuCache.cache["ExtraPingBuffer"].Cast<Slider>().CurrentValue; var extraEvadeDistance = 100;// Evade.menu.SubMenu("MiscSettings").SubMenu("ExtraBuffers").Item("ExtraEvadeDistance").GetValue<Slider>().Value; var extraDist = ObjectCache.menuCache.cache["ExtraCPADistance"].Cast<Slider>().CurrentValue; Vector2 heroPoint = ObjectCache.myHeroCache.serverPos2DPing; Vector2 lastMovePos = Game.CursorPos.To2D(); List<PositionInfo> posTable = new List<PositionInfo>(); List<int> spellList = SpellDetector.GetSpellList(); int minDistance = 50; //Math.Min(spell.range, minDistance) int maxDistance = int.MaxValue; if (spell.fixedRange) { minDistance = maxDistance = (int)spell.range; } while (posChecked < maxPosToCheck) { radiusIndex++; int curRadius = radiusIndex * (2 * posRadius) + (minDistance - 2 * posRadius); int curCircleChecks = (int)Math.Ceiling((2 * Math.PI * (double)curRadius) / (2 * (double)posRadius)); for (int i = 1; i < curCircleChecks; i++) { posChecked++; var cRadians = (2 * Math.PI / (curCircleChecks - 1)) * i; //check decimals var pos = new Vector2((float)Math.Floor(heroPoint.X + curRadius * Math.Cos(cRadians)), (float)Math.Floor(heroPoint.Y + curRadius * Math.Sin(cRadians))); var posInfo = CanHeroWalkToPos(pos, spell.speed, extraDelayBuffer + ObjectCache.gamePing, extraDist); posInfo.isDangerousPos = pos.CheckDangerousPos(6); posInfo.hasExtraDistance = extraEvadeDistance > 0 ? pos.CheckDangerousPos(extraEvadeDistance) : false;// ? 1 : 0; posInfo.distanceToMouse = pos.GetPositionValue(); posInfo.spellList = spellList; posInfo.posDistToChamps = pos.GetDistanceToChampions(); posTable.Add(posInfo); } if (curRadius >= maxDistance) break; } var sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount) .ThenBy(p => p.hasExtraDistance) .ThenBy(p => p.distanceToMouse); foreach (var posInfo in sortedPosTable) { if (CheckPathCollision(myHero, posInfo.position) == false) { if (PositionInfoStillValid(posInfo, spell.speed)) { return posInfo; } } } return null; }
public static PositionInfo GetBestPosition(EvadeSpellData evadeSpell = null) { int posChecked = 0; int maxPosToCheck = 50; int posRadius = 50; int radiusIndex = 0; var extraDelayBuffer = ObjectCache.menuCache.cache["ExtraPingBuffer"].Cast<Slider>().CurrentValue; var extraEvadeDistance = ObjectCache.menuCache.cache["ExtraEvadeDistance"].Cast<Slider>().CurrentValue; SpellDetector.UpdateSpells(); CalculateEvadeTime(); if (ObjectCache.menuCache.cache["CalculateWindupDelay"].Cast<CheckBox>().CurrentValue) { var extraWindupDelay = Evade.lastWindupTime - EvadeUtils.TickCount; if (extraWindupDelay > 0) { extraDelayBuffer += (int)extraWindupDelay; } } extraDelayBuffer += (int)(Evade.avgCalculationTime); if (ObjectCache.menuCache.cache["HigherPrecision"].Cast<CheckBox>().CurrentValue) { maxPosToCheck = 150; posRadius = 25; } Vector2 heroPoint = ObjectCache.myHeroCache.serverPos2D; Vector2 lastMovePos = Game.CursorPos.LSTo2D(); List<PositionInfo> posTable = new List<PositionInfo>(); Spell lowestEvadeTimeSpell; var lowestEvadeTime = SpellDetector.GetLowestEvadeTime(out lowestEvadeTimeSpell); List<Vector2> fastestPositions = GetFastestPositions(); foreach (var pos in fastestPositions) //add the fastest positions into list of candidates { posTable.Add(InitPositionInfo(pos, extraDelayBuffer, extraEvadeDistance, lastMovePos, lowestEvadeTimeSpell)); } /*if (SpellDetector.spells.Count() == 1) { var sortedFastestTable = posTable.OrderBy(p => p.posDangerLevel); if (sortedFastestTable.First() != null && sortedFastestTable.First().posDangerLevel > 0) { //use fastest } }*/ while (posChecked < maxPosToCheck) { radiusIndex++; int curRadius = radiusIndex * (2 * posRadius); int curCircleChecks = (int)Math.Ceiling((2 * Math.PI * (double)curRadius) / (2 * (double)posRadius)); for (int i = 1; i < curCircleChecks; i++) { posChecked++; var cRadians = (2 * Math.PI / (curCircleChecks - 1)) * i; //check decimals var pos = new Vector2((float)Math.Floor(heroPoint.X + curRadius * Math.Cos(cRadians)), (float)Math.Floor(heroPoint.Y + curRadius * Math.Sin(cRadians))); posTable.Add(InitPositionInfo(pos, extraDelayBuffer, extraEvadeDistance, lastMovePos, lowestEvadeTimeSpell)); } } IOrderedEnumerable<PositionInfo> sortedPosTable; if (ObjectCache.menuCache.cache["EvadeMode"].Cast<ComboBox>().CurrentValue == 1) { sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) .ThenByDescending(p => p.intersectionTime) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount); fastEvadeMode = true; } else if (ObjectCache.menuCache.cache["FastEvadeActivationTime"].Cast<Slider>().CurrentValue > 0 && ObjectCache.menuCache.cache["FastEvadeActivationTime"].Cast<Slider>().CurrentValue + ObjectCache.gamePing + extraDelayBuffer > lowestEvadeTime) { sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) .ThenByDescending(p => p.intersectionTime) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount); fastEvadeMode = true; } else { sortedPosTable = posTable.OrderBy(p => p.rejectPosition) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount) .ThenBy(p => p.distanceToMouse); if (sortedPosTable.First().posDangerCount != 0) //if can't dodge smoothly, dodge fast { var sortedPosTableFastest = posTable.OrderBy(p => p.isDangerousPos) .ThenByDescending(p => p.intersectionTime) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount); if (sortedPosTableFastest.First().posDangerCount == 0) { sortedPosTable = sortedPosTableFastest; fastEvadeMode = true; } } } foreach (var posInfo in sortedPosTable) { if (CheckPathCollision(myHero, posInfo.position) == false) { var moveSpeed = ObjectCache.myHeroCache.moveSpeed; if (evadeSpell != null && evadeSpell.evadeType == EvadeType.MovementSpeedBuff) { moveSpeed = moveSpeed + moveSpeed * evadeSpell.speedArray[myHero.GetSpell(evadeSpell.spellKey).Level - 1] / 100; } if (fastEvadeMode) { posInfo.position = GetExtendedSafePosition(ObjectCache.myHeroCache.serverPos2D, posInfo.position, extraEvadeDistance); return CanHeroWalkToPos(posInfo.position, moveSpeed, ObjectCache.gamePing, 0); } if (PositionInfoStillValid(posInfo)) { if (posInfo.position.CheckDangerousPos(extraEvadeDistance)) //extra evade distance, no multiple skillshots posInfo.position = GetExtendedSafePosition(ObjectCache.myHeroCache.serverPos2D, posInfo.position, extraEvadeDistance); return posInfo; } } } return PositionInfo.SetAllUndodgeable(); }
public static PositionInfo GetBestPositionTargetedDash(EvadeSpellData spell) { /*if (spell.spellDelay > 0) { if (CheckWindupTime(spell.spellDelay)) { return null; } }*/ var extraDelayBuffer = ObjectCache.menuCache.cache["ExtraPingBuffer"].Cast<Slider>().CurrentValue; //var extraEvadeDistance = 100;// Evade.menu.SubMenu("MiscSettings").SubMenu("ExtraBuffers").Item("ExtraEvadeDistance").GetValue<Slider>().Value; var extraDist = ObjectCache.menuCache.cache["ExtraCPADistance"].Cast<Slider>().CurrentValue; Vector2 heroPoint = ObjectCache.myHeroCache.serverPos2DPing; Vector2 lastMovePos = Game.CursorPos.To2D(); List<PositionInfo> posTable = new List<PositionInfo>(); List<int> spellList = SpellDetector.GetSpellList(); int minDistance = 50; //Math.Min(spell.range, minDistance) int maxDistance = int.MaxValue; if (spell.fixedRange) { minDistance = maxDistance = (int)spell.range; } List<Obj_AI_Base> collisionCandidates = new List<Obj_AI_Base>(); if (spell.spellTargets.Contains(SpellTargets.Targetables)) { foreach (var obj in ObjectManager.Get<Obj_AI_Base>() .Where(h => !h.IsMe && h.IsValidTarget(spell.range, false))) { if (obj.GetType() == typeof(Obj_AI_Turret) && ((Obj_AI_Turret)obj).IsValid()) { collisionCandidates.Add(obj); } } } else { List<AIHeroClient> heroList = new List<AIHeroClient>(); if (spell.spellTargets.Contains(SpellTargets.EnemyChampions) && spell.spellTargets.Contains(SpellTargets.AllyChampions)) { heroList = EntityManager.Heroes.AllHeroes; } else if (spell.spellTargets.Contains(SpellTargets.EnemyChampions)) { heroList = EntityManager.Heroes.Enemies; } else if (spell.spellTargets.Contains(SpellTargets.AllyChampions)) { heroList = EntityManager.Heroes.Allies; } foreach (var hero in heroList.Where(h => !h.IsMe && h.IsValidTarget(spell.range))) { collisionCandidates.Add(hero); } List<Obj_AI_Minion> minionList = new List<Obj_AI_Minion>(); if (spell.spellTargets.Contains(SpellTargets.EnemyMinions) && spell.spellTargets.Contains(SpellTargets.AllyMinions)) { minionList = EntityManager.MinionsAndMonsters.GetLaneMinions(EntityManager.UnitTeam.Both, Player.Instance.ServerPosition, spell.range).ToList(); } else if (spell.spellTargets.Contains(SpellTargets.EnemyMinions)) { minionList = EntityManager.MinionsAndMonsters.GetLaneMinions(EntityManager.UnitTeam.Enemy, Player.Instance.ServerPosition, spell.range).ToList(); } else if (spell.spellTargets.Contains(SpellTargets.AllyMinions)) { minionList = EntityManager.MinionsAndMonsters.GetLaneMinions(EntityManager.UnitTeam.Ally, Player.Instance.ServerPosition, spell.range).ToList(); } foreach (var minion in minionList.Where(h => h.IsValidTarget(spell.range))) { collisionCandidates.Add(minion); } } foreach (var candidate in collisionCandidates) { var pos = candidate.ServerPosition.To2D(); PositionInfo posInfo; if (spell.spellName == "YasuoDashWrapper") { bool hasDashBuff = false; foreach (var buff in candidate.Buffs) { if (buff.Name == "YasuoDashWrapper") { hasDashBuff = true; break; } } if (hasDashBuff) continue; } if (spell.behindTarget) { var dir = (pos - heroPoint).Normalized(); pos = pos + dir * (candidate.BoundingRadius + ObjectCache.myHeroCache.boundingRadius); } if (spell.infrontTarget) { var dir = (pos - heroPoint).Normalized(); pos = pos - dir * (candidate.BoundingRadius + ObjectCache.myHeroCache.boundingRadius); } if (spell.fixedRange) { var dir = (pos - heroPoint).Normalized(); pos = heroPoint + dir * spell.range; } if (spell.evadeType == EvadeType.Dash) { posInfo = CanHeroWalkToPos(pos, spell.speed, extraDelayBuffer + ObjectCache.gamePing, extraDist); posInfo.isDangerousPos = pos.CheckDangerousPos(6); posInfo.distanceToMouse = pos.GetPositionValue(); posInfo.spellList = spellList; } else { bool isDangerousPos = pos.CheckDangerousPos(6); var dist = pos.GetPositionValue(); posInfo = new PositionInfo(pos, isDangerousPos, dist); } posInfo.target = candidate; posTable.Add(posInfo); } if (spell.evadeType == EvadeType.Dash) { var sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount) .ThenBy(p => p.distanceToMouse); var first = sortedPosTable.FirstOrDefault(); if (first != null && Evade.lastPosInfo != null && first.isDangerousPos == false && Evade.lastPosInfo.posDangerLevel > first.posDangerLevel) { return first; } } else { var sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) //.ThenByDescending(p => p.hasComfortZone) //.ThenBy(p => p.hasExtraDistance) .ThenBy(p => p.distanceToMouse); var first = sortedPosTable.FirstOrDefault(); return first; } return null; }
public static PositionInfo GetBestPositionDash(EvadeSpellData spell) { int posChecked = 0; int maxPosToCheck = 100; int posRadius = 50; int radiusIndex = 0; var extraDelayBuffer = ObjectCache.menuCache.cache["ExtraPingBuffer"].GetValue <Slider>().Value; var extraEvadeDistance = 100;// Evade.menu.SubMenu("MiscSettings").SubMenu("ExtraBuffers").Item("ExtraEvadeDistance").GetValue<Slider>().Value; var extraDist = ObjectCache.menuCache.cache["ExtraCPADistance"].GetValue <Slider>().Value; Vector2 heroPoint = ObjectCache.myHeroCache.serverPos2DPing; Vector2 lastMovePos = Game.CursorPos.To2D(); List <PositionInfo> posTable = new List <PositionInfo>(); List <int> spellList = SpellDetector.GetSpellList(); int minDistance = 50; //Math.Min(spell.range, minDistance) int maxDistance = int.MaxValue; if (spell.fixedRange) { minDistance = maxDistance = (int)spell.range; } while (posChecked < maxPosToCheck) { radiusIndex++; int curRadius = radiusIndex * (2 * posRadius) + (minDistance - 2 * posRadius); int curCircleChecks = (int)Math.Ceiling((2 * Math.PI * (double)curRadius) / (2 * (double)posRadius)); for (int i = 1; i < curCircleChecks; i++) { posChecked++; var cRadians = (2 * Math.PI / (curCircleChecks - 1)) * i; //check decimals var pos = new Vector2((float)Math.Floor(heroPoint.X + curRadius * Math.Cos(cRadians)), (float)Math.Floor(heroPoint.Y + curRadius * Math.Sin(cRadians))); var posInfo = CanHeroWalkToPos(pos, spell.speed, extraDelayBuffer + ObjectCache.gamePing, extraDist); posInfo.isDangerousPos = pos.CheckDangerousPos(6); posInfo.hasExtraDistance = extraEvadeDistance > 0 ? pos.CheckDangerousPos(extraEvadeDistance) : false;// ? 1 : 0; posInfo.distanceToMouse = pos.GetPositionValue(); posInfo.spellList = spellList; posInfo.posDistToChamps = pos.GetDistanceToChampions(); posTable.Add(posInfo); } if (curRadius >= maxDistance) { break; } } var sortedPosTable = posTable.OrderBy(p => p.isDangerousPos) .ThenBy(p => p.posDangerLevel) .ThenBy(p => p.posDangerCount) .ThenBy(p => p.hasExtraDistance) .ThenBy(p => p.distanceToMouse); foreach (var posInfo in sortedPosTable) { if (CheckPathCollision(myHero, posInfo.position) == false) { if (PositionInfoStillValid(posInfo, spell.speed)) { return(posInfo); } } } return(null); }