public void Reset() { Creatures.Clear(); Targets.Clear(); DamageDone.Clear(); DamageTaken.Clear(); Deads.Clear(); CombatCreatureGuid.Reset(); CombatDamageDoneGuid.Reset(); CombatDamageTakenGuid.Reset(); CombatDeadGuid.Reset(); }
public void PollingRate(int rate, long fightDuration, bool forceInterpolate) { if (forceInterpolate && Positions.Count == 0) { Positions.Add(new Point3D(short.MinValue, short.MinValue, 0, 0)); Deads.Add(new Tuple <long, long>(0, fightDuration)); } if (Positions.Count == 0) { _start = -1; _end = -1; return; } else if (Positions.Count == 1 && !forceInterpolate) { Velocities = null; return; } List <Point3D> interpolatedPositions = new List <Point3D>(); int tablePos = 0; Point3D currentVelocity = null; for (int i = -50 * rate; i < fightDuration; i += rate) { Point3D pt = Positions[tablePos]; if (i <= pt.Time) { currentVelocity = null; interpolatedPositions.Add(new Point3D(pt.X, pt.Y, pt.Z, i)); } else { if (tablePos == Positions.Count - 1) { interpolatedPositions.Add(new Point3D(pt.X, pt.Y, pt.Z, i)); } else { Point3D ptn = Positions[tablePos + 1]; if (ptn.Time < i) { tablePos++; currentVelocity = null; i -= rate; } else { Point3D last = interpolatedPositions.Last().Time > pt.Time ? interpolatedPositions.Last() : pt; Point3D velocity = Velocities.Find(x => x.Time <= i && x.Time > last.Time); currentVelocity = velocity ?? currentVelocity; if (ptn.Time - pt.Time < 400) { float ratio = (float)(i - pt.Time) / (ptn.Time - pt.Time); interpolatedPositions.Add(new Point3D(pt, ptn, ratio, i)); } else { if (currentVelocity == null || (Math.Abs(currentVelocity.X) <= 1e-1 && Math.Abs(currentVelocity.Y) <= 1e-1)) { interpolatedPositions.Add(new Point3D(last.X, last.Y, last.Z, i)); } else { float ratio = (float)(i - last.Time) / (ptn.Time - last.Time); interpolatedPositions.Add(new Point3D(last, ptn, ratio, i)); } } } } } } Positions = interpolatedPositions.Where(x => x.Time >= 0).ToList(); Velocities = null; }