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;
}
}
}
}