Ensage.Common.Prediction.SpeedTrack C# (CSharp) Method

SpeedTrack() public static method

Tracks heroes movements
public static SpeedTrack ( EventArgs args ) : void
args System.EventArgs /// The args. ///
return void
        public static void SpeedTrack(EventArgs args)
        {
            if (!Game.IsInGame || Game.IsPaused)
            {
                return;
            }

            var me = ObjectManager.LocalHero;
            if (me == null)
            {
                return;
            }
            
            if (!Utils.SleepCheck("Prediction.SpeedTrack.Sleep"))
            {
                return;
            }

            if (playerList == null || (playerList.Count < 10 && Utils.SleepCheck("Prediction.SpeedTrack")))
            {
                playerList = Heroes.All;
                Utils.Sleep(1000, "Prediction.SpeedTrack");
            }

            if (!playerList.Any())
            {
                return;
            }

            Utils.Sleep(70, "Prediction.SpeedTrack.Sleep");
            var tick = Utils.TickCount;
            var tempTable = new List<Prediction>(TrackTable);
            foreach (var unit in playerList)
            {
                if (!unit.IsValid)
                {
                    continue;
                }

                var data =
                    tempTable.FirstOrDefault(
                        unitData => unitData.UnitName == unit.StoredName() || unitData.UnitClassId == unit.ClassID);
                if (data == null && unit.IsAlive && unit.IsVisible)
                {
                    data = new Prediction(
                        unit.StoredName(), 
                        unit.ClassID, 
                        new Vector3(0, 0, 0), 
                        0, 
                        new Vector3(0, 0, 0), 
                        0, 
                        0);
                    TrackTable.Add(data);
                }

                if (data != null && (!unit.IsAlive || !unit.IsVisible))
                {
                    data.LastPosition = new Vector3(0, 0, 0);
                    data.LastRotR = 0;
                    data.Lasttick = 0;
                    continue;
                }

                if (data == null || (data.LastPosition != new Vector3(0, 0, 0) && !(tick - data.Lasttick > 0)))
                {
                    continue;
                }

                if (data.LastPosition == new Vector3(0, 0, 0))
                {
                    data.LastPosition = unit.Position;
                    data.LastRotR = unit.RotationRad;
                    data.Lasttick = tick;
                }
                else
                {
                    data.RotSpeed = data.LastRotR - unit.RotationRad;
                    if (!RotTimeDictionary.ContainsKey(unit.Handle))
                    {
                        RotTimeDictionary.Add(unit.Handle, tick);
                    }

                    if (!lastRotRDictionary.ContainsKey(unit.Handle))
                    {
                        lastRotRDictionary.Add(unit.Handle, unit.RotationRad);
                    }

                    var speed = (unit.Position - data.LastPosition) / (tick - data.Lasttick);
                    if (Math.Abs(data.RotSpeed) > 0.18 && data.Speed != new Vector3(0, 0, 0))
                    {
                        data.Speed = speed;
                        RotTimeDictionary[unit.Handle] = tick;
                    }
                    else
                    {
                        lastRotRDictionary[unit.Handle] = unit.RotationRad;
                        data.Speed = speed;
                    }

                    data.LastPosition = unit.Position;
                    data.LastRotR = unit.RotationRad;
                    data.Lasttick = tick;
                    if (!SpeedDictionary.ContainsKey(unit.Handle))
                    {
                        SpeedDictionary.Add(unit.Handle, data.Speed);
                    }
                    else
                    {
                        SpeedDictionary[unit.Handle] = data.Speed;
                    }

                    if (!RotSpeedDictionary.ContainsKey(unit.Handle))
                    {
                        RotSpeedDictionary.Add(unit.Handle, data.RotSpeed);
                    }
                    else
                    {
                        RotSpeedDictionary[unit.Handle] = data.RotSpeed;
                    }
                }
            }
        }