Ejemplo n.º 1
0
        protected override float[] getWorldPositionOfDriverAtPosition(Object currentStateObj, int position)
        {
            AssettoCorsaShared latestRawData = (AssettoCorsaShared)currentStateObj;

            foreach (acsVehicleInfo vehicleInfo in latestRawData.acsChief.vehicle)
            {
                if (vehicleInfo.carLeaderboardPosition == position)
                {
                    return(new float[] { vehicleInfo.worldPosition.x, vehicleInfo.worldPosition.y });
                }
            }
            return(new float[] { 0, 0 });
        }
Ejemplo n.º 2
0
        private bool CheckSessionStarted(AssettoCorsaShared acData, SimulatorDataSet dataSet)
        {
            if (_rawLastSessionType != acData.AcsGraphic.session || _lastSessionType != dataSet.SessionInfo.SessionType)
            {
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = acData.AcsGraphic.session;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                Logger.Info("Session restart cause - Session Type Change");
                return(true);
            }

            if (dataSet.SessionInfo.SessionPhase != _lastSessionPhase && _lastSessionPhase != SessionPhase.Green &&
                dataSet.SessionInfo.SessionPhase
                != SessionPhase.Countdown)
            {
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = acData.AcsGraphic.session;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                Logger.Info("Session restart cause - Session Phase Change");
                _assettoCorsaStartObserver.ResetStartState();
                return(true);
            }

            if (_lastDataSet == null)
            {
                return(false);
            }

            if (_lastDataSet.PlayerInfo?.CompletedLaps > dataSet.PlayerInfo?.CompletedLaps)
            {
                Logger.Info("Session restart cause - Less Completed Laps than previously");
                _assettoCorsaStartObserver.ResetStartState();
                return(true);
            }

            if (_lastDataSet.SessionInfo.SessionType == SessionType.Race && _lastDataSet.SessionInfo.LeaderCurrentLap
                > dataSet.SessionInfo.LeaderCurrentLap)
            {
                Logger.Info("Session restart cause - Less Leader Completed Laps than previously");
                _assettoCorsaStartObserver.ResetStartState();
                return(true);
            }


            return(false);
        }
Ejemplo n.º 3
0
        private AssettoCorsaShared ReadAllBuffers()
        {
            if (!IsConnected)
            {
                throw new InvalidOperationException("Not connected");
            }

            AssettoCorsaShared data = new AssettoCorsaShared()
            {
                AcsGraphic       = _graphicsBuffer.GetMappedDataUnSynchronized(),
                AcsPhysics       = _physicsBuffer.GetMappedDataUnSynchronized(),
                AcsSecondMonitor = _secondMonitorBuffer.GetMappedDataUnSynchronized(),
                AcsStatic        = _staticBuffer.GetMappedDataUnSynchronized()
            };

            return(data);
        }
Ejemplo n.º 4
0
        // For double-file manual rolling starts. Will only work when the cars are all nicely settled on the grid - preferably
        // when the game thinks the race has just started
        public override Tuple <GridSide, Dictionary <int, GridSide> > getGridSide(Object currentStateObj)
        {
            AssettoCorsaShared latestRawData = ((ACSSharedMemoryReader.ACSStructWrapper)currentStateObj).data;
            acsVehicleInfo     playerData    = latestRawData.acsChief.vehicle[0];
            float playerRotation             = latestRawData.acsPhysics.heading;

            if (playerRotation < 0)
            {
                playerRotation = (float)(2 * Math.PI) + playerRotation;
            }
            playerRotation = (float)(2 * Math.PI) - playerRotation;
            float playerXPosition        = playerData.worldPosition.x;
            float playerZPosition        = playerData.worldPosition.y;
            int   playerStartingPosition = playerData.carLeaderboardPosition;
            int   numCars = latestRawData.acsChief.numVehicles;

            return(getGridSideInternal(latestRawData, playerRotation, playerXPosition, playerZPosition, playerStartingPosition, numCars));
        }
Ejemplo n.º 5
0
        protected override async Task DaemonMethod(CancellationToken cancellationToken)
        {
            _connectionTime = DateTime.MinValue;
            while (!ShouldDisconnect)
            {
                await Task.Delay(TickTime, cancellationToken).ConfigureAwait(false);

                AssettoCorsaShared acData = ReadAllBuffers();

                if (!_stopwatch.IsRunning && acData.AcsGraphic.status == AcStatus.AC_LIVE)
                {
                    _stopwatch.Start();
                }

                if (_stopwatch.IsRunning && acData.AcsGraphic.status != AcStatus.AC_LIVE)
                {
                    _stopwatch.Stop();
                }

                SimulatorDataSet dataSet = _acDataConverter.CreateSimulatorDataSet(acData);

                if (CheckSessionStarted(acData, dataSet))
                {
                    _stopwatch.Restart();
                    dataSet.SessionInfo.SessionTime = _stopwatch.Elapsed;
                    _acDataConverter.ResetConverter();
                    RaiseSessionStartedEvent(dataSet);
                }

                RaiseDataLoadedEvent(dataSet);
                _lastDataSet = dataSet;

                if (!IsProcessRunning())
                {
                    ShouldDisconnect = true;
                }
            }
            Disconnect();
            RaiseDisconnectedEvent();
        }
Ejemplo n.º 6
0
        private bool CheckSessionStarted(AssettoCorsaShared acData, SimulatorDataSet dataSet)
        {
            if (_rawLastSessionType != acData.AcsGraphic.session || _lastSessionType != dataSet.SessionInfo.SessionType)
            {
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = acData.AcsGraphic.session;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                return(true);
            }

            if (dataSet.SessionInfo.SessionPhase != _lastSessionPhase && _lastSessionPhase != SessionPhase.Green &&
                dataSet.SessionInfo.SessionPhase
                != SessionPhase.Countdown)
            {
                _lastSessionType    = dataSet.SessionInfo.SessionType;
                _rawLastSessionType = acData.AcsGraphic.session;
                _lastSessionPhase   = dataSet.SessionInfo.SessionPhase;
                return(true);
            }

            if (_lastDataSet == null)
            {
                return(false);
            }

            if (_lastDataSet.PlayerInfo?.CompletedLaps > dataSet.PlayerInfo?.CompletedLaps)
            {
                return(true);
            }

            if (_lastDataSet.SessionInfo.SessionType == SessionType.Race && _lastDataSet.SessionInfo.LeaderCurrentLap
                > dataSet.SessionInfo.LeaderCurrentLap)
            {
                return(true);
            }


            return(false);
        }
Ejemplo n.º 7
0
        public void trigger(Object lastStateObj, Object currentStateObj, GameStateData currentGameState)
        {
            if (paused)
            {
                return;
            }
            AssettoCorsaShared lastState    = ((ACSSharedMemoryReader.ACSStructWrapper)lastStateObj).data;
            AssettoCorsaShared currentState = ((ACSSharedMemoryReader.ACSStructWrapper)currentStateObj).data;

            if (!enabled || currentState.acsChief.numVehicles <= 1 ||
                (mapToFloatTime(currentState.acsChief.vehicle[0].currentLapTimeMS) < timeAfterRaceStartToActivate &&
                 currentState.acsChief.vehicle[0].lapCount <= 0))
            {
                return;
            }
            DateTime       now = DateTime.Now;
            acsVehicleInfo currentPlayerData;
            acsVehicleInfo previousPlayerData;
            float          timeDiffSeconds;

            try
            {
                currentPlayerData  = currentState.acsChief.vehicle[0];
                previousPlayerData = lastState.acsChief.vehicle[0];
                timeDiffSeconds    = ((float)(now - previousTime).TotalMilliseconds) / 1000f;
                previousTime       = now;
                if (timeDiffSeconds <= 0)
                {
                    return;
                }
            }
            catch (Exception)
            {
                return;
            }
            if (currentGameState != null)
            {
                var carClass = currentGameState.carClass;
                if (carClass != null && !String.Equals(currentPlayerCarClassID, carClass.getClassIdentifier()))
                {
                    // Retrieve and use user overridable spotter car length/width.
                    currentPlayerCarClassID = carClass.getClassIdentifier();
                    var preferences = carClass.getPreferences();
                    this.internalSpotter.setCarDimensions(preferences.spotterVehicleLength, preferences.spotterVehicleWidth);
                }
            }
            float[] currentPlayerPosition = new float[] { currentPlayerData.worldPosition.x, currentPlayerData.worldPosition.z };

            if (currentPlayerData.isCarInPitline == 0 || currentPlayerData.isCarInPit == 0)
            {
                List <float[]> currentOpponentPositions = new List <float[]>();
                float[]        playerVelocityData       = new float[3];
                playerVelocityData[0] = currentPlayerData.speedMS;
                playerVelocityData[1] = (currentPlayerData.worldPosition.x - previousPlayerData.worldPosition.x) / timeDiffSeconds;
                playerVelocityData[2] = (currentPlayerData.worldPosition.z - previousPlayerData.worldPosition.z) / timeDiffSeconds;

                for (int i = 0; i < currentState.acsChief.numVehicles; i++)
                {
                    acsVehicleInfo vehicle = currentState.acsChief.vehicle[i];
                    if (vehicle.carId == 0 || vehicle.isCarInPit == 1 || vehicle.isCarInPitline == 1 || vehicle.isConnected != 1)
                    {
                        continue;
                    }
                    currentOpponentPositions.Add(new float[] { vehicle.worldPosition.x, vehicle.worldPosition.z });
                }
                float playerRotation = currentState.acsPhysics.heading;

                if (playerRotation < 0)
                {
                    playerRotation = (float)(2 * Math.PI) + playerRotation;
                }
                internalSpotter.triggerInternal(playerRotation, currentPlayerPosition, playerVelocityData, currentOpponentPositions);
            }
        }
        public override Object ReadGameData(Boolean forSpotter)
        {
            lock (this)
            {
                AssettoCorsaShared acsShared = new AssettoCorsaShared();
                if (!initialised)
                {
                    if (!InitialiseInternal())
                    {
                        throw new GameDataReadException("Failed to initialise shared memory");
                    }
                }
                try
                {
                    if (!forSpotter)
                    {
                        using (var sharedMemoryStreamView = memoryMappedGraphicFile.CreateViewStream())
                        {
                            BinaryReader _SharedMemoryStream = new BinaryReader(sharedMemoryStreamView);
                            sharedMemoryGraphicReadBuffer = _SharedMemoryStream.ReadBytes(sharedmemoryGraphicsize);
                            handleGraphic        = GCHandle.Alloc(sharedMemoryGraphicReadBuffer, GCHandleType.Pinned);
                            acsShared.acsGraphic = (SPageFileGraphic)Marshal.PtrToStructure(handleGraphic.AddrOfPinnedObject(), typeof(SPageFileGraphic));
                            handleGraphic.Free();
                        }
                        using (var sharedMemoryStreamView = memoryMappedStaticFile.CreateViewStream())
                        {
                            BinaryReader _SharedMemoryStream = new BinaryReader(sharedMemoryStreamView);
                            sharedMemoryStaticReadBuffer = _SharedMemoryStream.ReadBytes(sharedmemoryStaticsize);
                            handleStatic        = GCHandle.Alloc(sharedMemoryStaticReadBuffer, GCHandleType.Pinned);
                            acsShared.acsStatic = (SPageFileStatic)Marshal.PtrToStructure(handleStatic.AddrOfPinnedObject(), typeof(SPageFileStatic));
                            handleStatic.Free();
                        }
                    }

                    using (var sharedMemoryStreamView = memoryMappedPhysicsFile.CreateViewStream())
                    {
                        BinaryReader _SharedMemoryStream = new BinaryReader(sharedMemoryStreamView);
                        sharedMemoryPhysicsReadBuffer = _SharedMemoryStream.ReadBytes(sharedmemoryPhysicssize);
                        handlePhysics        = GCHandle.Alloc(sharedMemoryPhysicsReadBuffer, GCHandleType.Pinned);
                        acsShared.acsPhysics = (SPageFilePhysics)Marshal.PtrToStructure(handlePhysics.AddrOfPinnedObject(), typeof(SPageFilePhysics));
                        handlePhysics.Free();
                    }
                    using (var sharedMemoryStreamView = memoryMappedCrewChiefFile.CreateViewStream())
                    {
                        BinaryReader _SharedMemoryStream = new BinaryReader(sharedMemoryStreamView);
                        sharedMemoryCrewChiefReadBuffer = _SharedMemoryStream.ReadBytes(sharedmemoryCrewChiefsize);
                        handleCrewChief    = GCHandle.Alloc(sharedMemoryCrewChiefReadBuffer, GCHandleType.Pinned);
                        acsShared.acsChief = (SPageFileCrewChief)Marshal.PtrToStructure(handleCrewChief.AddrOfPinnedObject(), typeof(SPageFileCrewChief));
                        handleCrewChief.Free();
                    }

                    ACSStructWrapper structWrapper = new ACSStructWrapper();
                    structWrapper.ticksWhenRead = DateTime.Now.Ticks;
                    structWrapper.data          = acsShared;

                    if (!forSpotter && dumpToFile && dataToDump != null)
                    {
                        dataToDump.Add(structWrapper);
                    }

                    return(structWrapper);
                }
                catch (Exception ex)
                {
                    throw new GameDataReadException(ex.Message, ex);
                }
            }
        }