/// <summary> /// Fired when the OnNewPath event is called. /// </summary> /// <param name="sender">The sender.</param> /// <param name="args">The <see cref="GameObjectNewPathEventArgs" /> instance containing the event data.</param> private void AIBaseClient_OnNewPath(AIBaseClient sender, AIBaseClientNewPathEventArgs args) { if (!sender.IsMe) { return; } CatchAxe(); }
/// <summary> /// New Path subscribed event function. /// </summary> /// <param name="sender"><see cref="AIBaseClient" /> sender</param> /// <param name="args">New Path event data</param> private static void EventDash(AIBaseClient sender, AIBaseClientNewPathEventArgs args) { var hero = sender as AIHeroClient; if (hero != null && hero.IsValid) { if (!DetectedDashes.ContainsKey(hero.NetworkId)) { DetectedDashes.Add(hero.NetworkId, new DashArgs()); } if (args.IsDash) { var path = new List <Vector2> { hero.Position.ToVector2() }; path.AddRange(args.Path.ToList().ToVector2()); DetectedDashes[hero.NetworkId].Unit = sender; DetectedDashes[hero.NetworkId].Path = path; DetectedDashes[hero.NetworkId].Speed = args.Speed; DetectedDashes[hero.NetworkId].StartPos = hero.Position.ToVector2(); DetectedDashes[hero.NetworkId].StartTick = Variables.TickCount - (Game.Ping / 2); DetectedDashes[hero.NetworkId].EndPos = path.Last(); DetectedDashes[hero.NetworkId].EndTick = DetectedDashes[hero.NetworkId].StartTick + (int) (1000 * (DetectedDashes[hero.NetworkId].EndPos.Distance( DetectedDashes[hero.NetworkId].StartPos) / DetectedDashes[hero.NetworkId].Speed)); DetectedDashes[hero.NetworkId].Duration = DetectedDashes[hero.NetworkId].EndTick - DetectedDashes[hero.NetworkId].StartTick; OnDash?.Invoke(MethodBase.GetCurrentMethod().DeclaringType, DetectedDashes[hero.NetworkId]); } else { DetectedDashes[hero.NetworkId].EndTick = 0; } } }
/// <summary> /// On New Path subscribed event function. /// </summary> /// <param name="sender"><see cref="AIBaseClient" /> sender.</param> /// <param name="args">Path Data</param> private static void AIHeroClient_OnNewPath(AIBaseClient sender, AIBaseClientNewPathEventArgs args) { if (!(sender is AIHeroClient)) { return; } if (!StoredPaths.ContainsKey(sender.NetworkId)) { StoredPaths.Add(sender.NetworkId, new List <StoredPath>()); } var newPath = new StoredPath { Tick = Variables.TickCount, Path = args.Path.ToList().ToVector2() }; StoredPaths[sender.NetworkId].Add(newPath); if (StoredPaths[sender.NetworkId].Count > 50) { StoredPaths[sender.NetworkId].RemoveRange(0, 40); } }
/// <summary> /// OnNewPath event for average reaction time calculations /// </summary> private static void AIBaseClient_OnNewPath(AIBaseClient sender, AIBaseClientNewPathEventArgs args) { if (!sender.IsEnemy || !(sender.Type == GameObjectType.AIHeroClient && sender.IsValid) || args.IsDash) { return; } var enemy = EnemyInfo[sender.NetworkId]; if (args.Path.Length < 2) { if (!enemy.IsStopped) { enemy.StopTick = Environment.TickCount; enemy.LastWaypointTick = Environment.TickCount; enemy.IsStopped = true; enemy.Count = 0; enemy.AvgTick = 0; enemy.AvgPathLenght = 0; enemy.LastAngleDiff = 360; } } else { var wp = args.Path.Select(p => p.ToVector2()).ToList(); var sample1 = new List <Vector2>(); wp.Insert(0, sender.PreviousPosition.ToVector2()); for (var i = 0; i < wp.Count - 1; i++) { var direction = (wp[i + 1] - wp[i]).Normalized(); sample1.Add(direction); } var sample2 = new List <Vector2>(); for (var i = 0; i < enemy.LastWaypoints.Count - 1; i++) { var direction = (enemy.LastWaypoints[i + 1] - enemy.LastWaypoints[i]).Normalized(); sample2.Add(direction); } if (sample1.Count > 0 && sample2.Count > 0) { var sample1_avg = sample1.Average(p => p.AngleBetween(Vector2.Zero)); var sample2_avg = sample2.Average(p => p.AngleBetween(Vector2.Zero)); enemy.LastAngleDiff = Math.Abs(sample2_avg - sample1_avg); } if (!enemy.LastWaypoints.SequenceEqual(wp)) { if (!enemy.IsStopped) { enemy.AvgTick = (enemy.Count * enemy.AvgTick + (Environment.TickCount - enemy.LastWaypointTick)) / ++enemy.Count; enemy.AvgPathLenght = ((enemy.Count - 1) * enemy.AvgPathLenght + wp.PathLength()) / enemy.Count; } enemy.LastWaypointTick = Environment.TickCount; enemy.IsStopped = false; enemy.LastWaypoints = wp; if (!enemy.IsWindupChecked) { if (Environment.TickCount - enemy.LastAATick < 300) { enemy.AvgOrbwalkTime = (enemy.AvgOrbwalkTime * enemy.OrbwalkCount + (enemy.LastWaypointTick - enemy.LastWindupTick)) / ++enemy.OrbwalkCount; } enemy.IsWindupChecked = true; } } } EnemyInfo[sender.NetworkId] = enemy; }
/// <summary> /// On new path event. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="args"> /// The args. /// </param> private static void OnNewPath(AIBaseClient sender, AIBaseClientNewPathEventArgs args) { EventDash(sender, args); }