/// <summary> /// Gets the minions of the specified type and team /// </summary> /// <param name="type">The minion type flags</param> /// <param name="team">The requested team</param> /// <param name="inrange">The function determining whether this instance is in range</param> /// <returns></returns> public static List <Obj_AI_Minion> GetMinions(ObjectTeam team = ObjectTeam.Enemy | ObjectTeam.Ally, MinionType type = MinionType.Minion, Predicate <Obj_AI_Minion> inrange = null) { var container = new List <Obj_AI_Minion>(); if ((type & MinionType.Minion) != 0) { container.AddRange(Minions); } if ((type & MinionType.Ward) != 0) { container.AddRange(Wards); } if ((type & MinionType.Pet) != 0) { container.AddRange(Pets); } if ((type & MinionType.Plant) != 0) { container.AddRange(Plants); } if ((type & MinionType.Jungle) != 0) { container.AddRange(JungleMinions); } if ((type & MinionType.Other) != 0) { container.AddRange(OtherMinions); } return(Selector(container, team, inrange)); }
public Flag(int id, Vector position, ObjectTeam team, ObjectState state) { Id = Id; Position = position; Team = team; State = state; }
/// <summary> /// Gets the minions of the specified type and team /// </summary> /// <param name="type">The minion type flags</param> /// <param name="team">The requested team</param> /// <param name="inrange">The function determining whether this instance is in range</param> /// <returns></returns> public static List <Obj_AI_Minion> GetMinions(ObjectTeam team = ObjectTeam.Enemy, MinionType type = MinionType.Minion, Predicate <Obj_AI_Minion> inrange = null) { var container = new List <Obj_AI_Minion>(Obj_AI_MinionList.Count); if (type.HasFlag(MinionType.Minion)) { container.AddRange(Minions); } if (type.HasFlag(MinionType.Ward)) { container.AddRange(Wards); } if (type.HasFlag(MinionType.Pet)) { container.AddRange(Pets); } if (type.HasFlag(MinionType.Jungle)) { container.AddRange(JungleMinions); } if (type.HasFlag(MinionType.Other)) { container.AddRange(OtherMinions); } return(Selector(container, team, true, true, inrange)); }
/// <summary> /// Gets the GameObjects of the specified type and team /// </summary> /// <typeparam name="TGameObject">The requested <see cref="GameObject" /> type</typeparam> /// <param name="team">The specified object team</param> /// <param name="predicate">The function determining whether this instance is eligible</param> /// <returns></returns> public static List <TGameObject> Get <TGameObject>(ObjectTeam team = ObjectTeam.Ally | ObjectTeam.Enemy | ObjectTeam.Neutral, Predicate <TGameObject> predicate = null) where TGameObject : GameObject { var name = typeof(TGameObject).Name + "List"; FieldInfo field; // Found it cached if (FieldData.TryGetValue(name, out field)) { return(Selector((List <TGameObject>)field.GetValue(null), team, predicate)); } var container = GameObjectList.ConvertAll(o => o as TGameObject).FindAll(o => o != null); field = GetField(name); // This type of GameObject is supported however cache is being just initialized if (field != null) { field.SetValue(null, container); FieldData.Add(name, field); } return(Selector(container, team, predicate)); }
/// <summary> /// Gets minions in a similiar way to <see cref="E:MinionManager" /> /// </summary> /// <param name="from">The from</param> /// <param name="range">The range to take minions from</param> /// <param name="team">The team</param> /// <param name="type">The minion type</param> /// <returns></returns> public static List <Obj_AI_Base> GetMinions(Vector2 from, float range, ObjectTeam team = ObjectTeam.Enemy, MinionType type = MinionType.Minion) { var container = new List <Obj_AI_Base>(Obj_AI_MinionList.Count); if (type.HasFlag(MinionType.Minion)) { container.AddRange(Minions); } if (type.HasFlag(MinionType.Ward)) { container.AddRange(Wards); } if (type.HasFlag(MinionType.Pet)) { container.AddRange(Pets); } if (type.HasFlag(MinionType.Jungle)) { container.AddRange(JungleMinions); } if (type.HasFlag(MinionType.Other)) { container.AddRange(OtherMinions); } if (from.IsZero) { from = Player.ServerPosition.ToVector2(); } var infinity = float.IsPositiveInfinity(range *= range); return(Selector(container, team, true, true, @base => infinity || Vector2.DistanceSquared(@base.ServerPosition.ToVector2(), from) <= range)); }
public static List <TGameObject> Get <TGameObject>(ObjectTeam team = ObjectTeam.Ally | ObjectTeam.Enemy | ObjectTeam.Neutral, Predicate <TGameObject> inrange = null) where TGameObject : GameObject { FieldInfo field; var name = typeof(TGameObject).Name + "List"; // Found it cached if (FieldData.TryGetValue(name, out field)) { return(Selector((List <TGameObject>)field.GetValue(null), team, true, true, inrange)); } var container = GameObjectList.OfType <GameObject, TGameObject>(o => o.IsValid); field = GetField(name); // ReSharper disable once InvertIf // This type of GameObject is supported however cache is being just initialized if (field != null) { field.SetValue(null, container); FieldData.Add(name, field); } return(Selector(container, team, true, false, inrange)); }
public static void DrawFlag(double diameter, ObjectTeam team, Vector position) { var colour = ChooseBrushColour(team); var pole = new Line(); var flag = new Rectangle(); pole.Stroke = colour; pole.Fill = colour; pole.StrokeThickness = 0.8; pole.X1 = position.X; pole.Y1 = position.Y; pole.X2 = position.X; pole.Y2 = position.Y + diameter; flag.Width = diameter; flag.Height = diameter / 2; flag.Stroke = colour; flag.Fill = colour; flag.Margin = new Thickness(0, 0, 0, 0); Canvas.SetLeft(flag, position.X); Canvas.SetBottom(flag, position.Y - diameter / 2); _canvas.Children.Add(flag); _canvas.Children.Add(pole); }
public Player(int id, ObjectTeam team, Vector position) { _maxSpeed = 10; State = ObjectState.Idle; Team = team; Id = id; Position = position; Velocity = new Vector(0, 0); }
public static SolidColorBrush ChooseBrushColour(ObjectTeam team) { switch (team) { case ObjectTeam.Red: return(Brushes.Red); case ObjectTeam.Blue: return(Brushes.Blue); default: return(Brushes.Black); } }
public static void DrawCircle(double diameter, ObjectTeam team, Vector position) { var colour = ChooseBrushColour(team); var circle = new Ellipse(); circle.Width = diameter; circle.Height = diameter; circle.Stroke = colour; circle.Fill = colour; Canvas.SetLeft(circle, position.X); Canvas.SetBottom(circle, position.Y); _canvas.Children.Add(circle); }
/// <summary> /// Gets minions in a similar way to <see cref="E:MinionManager" /> /// </summary> /// <param name="from">The from</param> /// <param name="range">The range to take minions from</param> /// <param name="team">The team</param> /// <param name="type">The minion type</param> /// <returns></returns> public static List <Obj_AI_Base> GetMinions(Vector2 from, float range, ObjectTeam team = ObjectTeam.Enemy, MinionType type = MinionType.Minion) { var container = new List <Obj_AI_Base>(); if ((type & MinionType.Minion) != 0) { container.AddRange(Minions); } if ((type & MinionType.Ward) != 0) { container.AddRange(Wards); } if ((type & MinionType.Pet) != 0) { container.AddRange(Pets); } if ((type & MinionType.Plant) != 0) { container.AddRange(Plants); } if ((type & MinionType.Jungle) != 0) { container.AddRange(JungleMinions); } if ((type & MinionType.Other) != 0) { container.AddRange(OtherMinions); } if (from.IsZero) { from = Player.ServerPosition.ToVector2(); } range *= range; if (float.IsPositiveInfinity(range)) { return(Selector(container, team, null)); } return(Selector(container, team, @base => Vector2.DistanceSquared(from, @base.ServerPosition.ToVector2()) <= range)); }
/// <summary> /// Returns a matched list /// </summary> /// <typeparam name="TGameObject">The requested <see cref="GameObject" /> type</typeparam> /// <param name="container">The original list</param> /// <param name="flags">The provided team flags</param> /// <param name="predicate">The function to check if the unit meets the condition</param> /// <returns></returns> private static List <TGameObject> Selector <TGameObject>(List <TGameObject> container, ObjectTeam flags, Predicate <TGameObject> predicate) where TGameObject : GameObject { return(predicate == null?container.FindAll(o => (flags & o.Team()) != 0) : container.FindAll(o => (flags & o.Team()) != 0 && predicate(o))); }
/// <summary> /// Returns a matched list /// </summary> /// <typeparam name="TGameObject">The requested <see cref="GameObject" /> type</typeparam> /// <param name="container">The original list</param> /// <param name="flags">The provided team flags</param> /// <param name="moreChecks">Determines whether to perform additional checks</param> /// <param name="validityCheck">The additional predicate</param> /// <param name="inrange">The function to check if the unit is in range</param> /// <returns></returns> private static List <TGameObject> Selector <TGameObject>(List <TGameObject> container, ObjectTeam flags, bool moreChecks, bool validityCheck, Predicate <TGameObject> inrange) where TGameObject : GameObject { return(container.FindAll(o => { if (validityCheck && (o == null || !o.IsValid)) { return false; } var team = o.Team; if (!flags.HasFlag(TeamDictionary.Single(pair => pair.Value == team).Key) || inrange != null && !inrange(o)) { return false; } if (!moreChecks) { return true; } if (!o.IsVisible || o.IsDead) { return false; } var attackable = o as AttackableUnit; if (attackable == null) { return true; } if (attackable.IsInvulnerable || attackable.IsZombie || (team != AlliedTeam && !attackable.IsTargetable)) { return false; } var @base = attackable as Obj_AI_Base; return @base == null || @base.HealthPercent > 10f || @base.Buffs.All(buff => buff.Type != BuffType.Invulnerability && buff.Name != "kindredrnodeathbuff"); })); }