Example #1
0
        private void UpdatePhysics()
        {
            if (_physicsFile == null)
            {
                return;
            }

            try {
                var physics = _physicsFile.ToStruct <AcSharedPhysics>(AcSharedPhysics.Buffer);
                if (physics.PacketId != _previousPacketId)
                {
                    IsPaused = false;

                    _previousPacketId   = physics.PacketId;
                    _previousPacketTime = DateTime.Now;

                    if (Status != AcSharedMemoryStatus.Live)
                    {
                        Status       = AcSharedMemoryStatus.Live;
                        _gameProcess = TryToFindGameProcess();
                        KnownProcess = _gameProcess != null;
                    }

                    var graphics   = _graphicsFile.ToStruct <AcSharedGraphics>(AcSharedGraphics.Buffer);
                    var staticInfo = _staticInfoFile.ToStruct <AcSharedStaticInfo>(AcSharedStaticInfo.Buffer);
                    Shared = new AcShared(physics, graphics, staticInfo);
                }
                else if (_gameProcess?.HasExitedSafe() ?? (DateTime.Now - _previousPacketTime).TotalSeconds > 1d)
                {
                    IsPaused = false;
                    Status   = AcSharedMemoryStatus.Connected;
                    Shared   = null;
                }
                else
                {
                    IsPaused = Shared != null && Shared.Graphics.Status == AcGameStatus.AcPause;
                }
            } catch (Exception ex) {
                Logging.Error(ex);
                Status = AcSharedMemoryStatus.Disabled;
            }
        }
Example #2
0
        private void UpdatePhysics() {
            if (_physicsFile == null) return;

            try {
                var physics = AcSharedPhysics.FromFile(_physicsFile);
                if (physics.PacketId != _previousPacketId) {
                    IsPaused = false;

                    _previousPacketId = physics.PacketId;
                    _previousPacketTime = DateTime.Now;

                    if (Status != AcSharedMemoryStatus.Live) {
                        Status = AcSharedMemoryStatus.Live;
                        _gameProcess = TryToFindGameProcess();
                        KnownProcess = _gameProcess != null;
                    }

                    var graphics = AcSharedGraphics.FromFile(_graphicsFile);
                    var staticInfo = AcSharedStaticInfo.FromFile(_staticInfoFile);
                    Shared = new AcShared(physics, graphics, staticInfo);
                } else if (_gameProcess?.HasExitedSafe() ?? (DateTime.Now - _previousPacketTime).TotalSeconds > 1d) {
                    IsPaused = false;
                    Status = AcSharedMemoryStatus.Connected;
                    Shared = null;
                } else {
                    IsPaused = Shared != null && Shared.Graphics.Status == AcGameStatus.AcPause;
                }
            } catch (Exception ex) {
                Logging.Error(ex);
                Status = AcSharedMemoryStatus.Disabled;
            }
        }
Example #3
0
            public void Extend(AcShared previous, AcShared current, TimeSpan time) {
                if (current == null) {
                    _offroad = false;
                    return;
                }

                if (previous == null || current.Graphics.Status != AcGameStatus.AcLive) {
                    CurrentStatus = Status.NotLive;
                    return;
                }

                var physics = current.Physics;
                var graphics = current.Graphics;
                var info = current.StaticInfo;

                if (CarId == null) {
                    CarId = info.CarModel;
                    TrackId = string.IsNullOrWhiteSpace(info.TrackConfiguration) ? info.Track :
                            $@"{info.Track}/{info.TrackConfiguration}";
                    Penalties = info.PenaltiesEnabled == 1;
                }

                _coordinates = graphics.CarCoordinates;

                if (graphics.CurrentTimeMs < previous.Graphics.CurrentTimeMs) {
                    CurrentStatus = Status.Teleported;
                    return;
                }

                var distance = graphics.CarCoordinates - previous.Graphics.CarCoordinates;
                var calcSpeed = distance.Length() / 1e3 / time.TotalHours;

                if (graphics.IsInPit || physics.NumberOfTyresOut > OptionTyresOutsideAllowed) {
                    _lapSpoiledId = graphics.CompletedLaps;
                }

                /* best lap */
                if (graphics.CompletedLaps != _completedLaps) {
                    if (graphics.LastTimeMs == 0) {
                        Logging.Debug("Lap time: 0");
                    } else if (graphics.CompletedLaps - 1 > _lapSpoiledId) {
                        var lastTime = TimeSpan.FromMilliseconds(graphics.LastTimeMs);
                        if (!BestLap.HasValue || lastTime <= BestLap) {
                            BestLap = lastTime;
                            BestLapId = graphics.CompletedLaps - 1;
                            Logging.Debug("New lap time: " + lastTime.ToProperString());
                        } else {
                            Logging.Debug("Lap time is worse or the same");
                        }
                    } else {
                        Logging.Debug("Lap spoiled");
                    }

                    _completedLaps = graphics.CompletedLaps;
                }

                if (distance.Y < OptionFallingThreshold) {
                    CurrentStatus = Status.Falling;
                    return;
                }

                var paused = physics.SpeedKmh > 5 && calcSpeed < physics.SpeedKmh * 0.1d;
                if (paused) {
                    CurrentStatus = Status.Paused;
                    return;
                }

                var jumped = calcSpeed > physics.SpeedKmh * 3d + 10;
                if (jumped) {
                    CurrentStatus = Status.Teleported;
                    return;
                }

                for (var i = 0; i < 4; i++) {
                    var d = previous.Physics.TyreWear[i] - physics.TyreWear[i];
                    if (d > 0 && d < 0.1) {
                        /* TyreWear’ range is from 0.0 to 100.0 */
                        TotalTyreWear += d / 100d;
                    }
                }

                for (var i = 0; i < 5; i++) {
                    var d = physics.CarDamage[i] - previous.Physics.CarDamage[i];
                    if (d > 0.1 && (DateTime.Now - _crashTime).TotalSeconds > 5d) {
                        TotalCrashes++;
                        _crashTime = DateTime.Now;
                    }
                }

                /* offroad counter */
                if (_offroad) {
                    _offroad = physics.NumberOfTyresOut > 0;
                } else if (physics.NumberOfTyresOut > 3) {
                    _offroad = true;

                    if ((DateTime.Now - _offroadTime).TotalSeconds > 10) {
                        GoneOffroad++;
                        _offroadTime = DateTime.Now;
                    }
                }

                if (physics.SpeedKmh > OptionMinSpeedKmh) {
                    /* status */
                    var slip = physics.WheelSlip;
                    var prev = previous.Physics.WheelSlip;

                    var e0 = Equals(slip[0], prev[0]);
                    var e1 = Equals(slip[1], prev[1]);
                    var e2 = Equals(slip[2], prev[2]);
                    var e3 = Equals(slip[3], prev[3]);

                    if (e0 && e1) {
                        if (e2 && e3) {
                            CurrentStatus = Status.Airborne;
                        } else if (!e2 && !e3) {
                            CurrentStatus = Status.Wheelie;
                        } else {
                            CurrentStatus = Status.Live;
                        }
                    } else if (e0 && e2 && !e3 || e1 && e3 && !e2) {
                        CurrentStatus = Status.TwoWheels;
                    } else {
                        CurrentStatus = Status.Live;
                    }

                    /* max speed, driven distance and time */
                    if (physics.SpeedKmh > MaxSpeed) MaxSpeed = physics.SpeedKmh;
                    Distance += distance.Length();
                    Time += time;

                    /* burnt fuel */
                    var fuel = previous.Physics.Fuel - current.Physics.Fuel;
                    if (fuel > 0 && fuel < 0.05) {
                        FuelBurnt += fuel;
                    }
                } else {
                    CurrentStatus = Status.Live;
                }
            }
Example #4
0
 public AcSharedEventArgs([CanBeNull] AcShared previous, [CanBeNull] AcShared current, TimeSpan time)
 {
     Previous = previous;
     Current  = current;
     Time     = time;
 }