Example #1
0
 private DriverData getDriverData(RaceRoomShared shared, int slot_id)
 {
     foreach (DriverData driverData in shared.all_drivers_data)
     {
         if (driverData.driver_info.slot_id == slot_id)
         {
             return(driverData);
         }
     }
     throw new Exception("no driver data for slotID " + slot_id);
 }
Example #2
0
        protected override float[] getWorldPositionOfDriverAtPosition(Object currentStateObj, int position)
        {
            RaceRoomShared latestRawData = (RaceRoomShared)currentStateObj;

            foreach (DriverData driverData in latestRawData.DriverData)
            {
                if (driverData.Place == position)
                {
                    return(new float[] { driverData.Position.X, driverData.Position.Z });
                }
            }
            return(new float[] { 0, 0 });
        }
Example #3
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)
        {
            RaceRoomShared latestRawData  = ((CrewChiefV4.RaceRoom.R3ESharedMemoryReader.R3EStructWrapper)currentStateObj).data;
            DriverData     playerData     = getDriverData(latestRawData, latestRawData.VehicleInfo.SlotId);
            float          playerRotation = latestRawData.CarOrientation.Yaw;

            if (playerRotation < 0)
            {
                playerRotation = (float)(2 * Math.PI) + playerRotation;
            }
            playerRotation = (float)(2 * Math.PI) - playerRotation;
            float playerXPosition        = playerData.Position.X;
            float playerZPosition        = playerData.Position.Z;
            int   playerStartingPosition = latestRawData.Position;
            int   numCars = latestRawData.NumCars;

            return(getGridSideInternal(latestRawData, playerRotation, playerXPosition, playerZPosition, playerStartingPosition, numCars));
        }
Example #4
0
 public override Object ReadGameData(Boolean forSpotter)
 {
     lock (this)
     {
         RaceRoomShared _raceroomapistruct = new RaceRoomShared();
         if (!initialised)
         {
             if (!InitialiseInternal())
             {
                 throw new GameDataReadException("Failed to initialise shared memory");
             }
         }
         try
         {
             using (var sharedMemoryStreamView = memoryMappedFile.CreateViewStream())
             {
                 BinaryReader _SharedMemoryStream = new BinaryReader(sharedMemoryStreamView);
                 sharedMemoryReadBuffer = _SharedMemoryStream.ReadBytes(sharedmemorysize);
                 GCHandle handle = GCHandle.Alloc(sharedMemoryReadBuffer, GCHandleType.Pinned);
                 try
                 {
                     _raceroomapistruct = (RaceRoomShared)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(RaceRoomShared));
                 }
                 finally
                 {
                     handle.Free();
                 }
             }
             R3EStructWrapper structWrapper = new R3EStructWrapper();
             structWrapper.ticksWhenRead = DateTime.Now.Ticks;
             structWrapper.data          = _raceroomapistruct;
             if (!forSpotter && dumpToFile && dataToDump != null)
             {
                 dataToDump.Add(structWrapper);
             }
             return(structWrapper);
         }
         catch (Exception ex)
         {
             throw new GameDataReadException(ex.Message, ex);
         }
     }
 }
 public override Object ReadGameData(Boolean forSpotter)
 {
     lock (this)
     {
         RaceRoomShared _raceroomapistruct = new RaceRoomShared();
         if (!initialised)
         {
             if (!InitialiseInternal())
             {
                 throw new GameDataReadException("Failed to initialise shared memory");
             }
         }
         try
         {
             using (var sharedMemoryStreamView = memoryMappedFile.CreateViewStream())
             {
                 BinaryReader _SharedMemoryStream = new BinaryReader(sharedMemoryStreamView);
                 sharedMemoryReadBuffer = _SharedMemoryStream.ReadBytes(sharedmemorysize);
                 handle = GCHandle.Alloc(sharedMemoryReadBuffer, GCHandleType.Pinned);
                 _raceroomapistruct = (RaceRoomShared)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(RaceRoomShared));
                 handle.Free();
             }
             R3EStructWrapper structWrapper = new R3EStructWrapper();
             structWrapper.ticksWhenRead = DateTime.Now.Ticks;
             structWrapper.data = _raceroomapistruct;
             if (!forSpotter && dumpToFile && dataToDump != null)
             {
                 dataToDump.Add(structWrapper);
             }
             return structWrapper;
         }
         catch (Exception ex)
         {
             throw new GameDataReadException(ex.Message, ex);
         }
     }
 }
Example #6
0
        public void trigger(Object lastStateObj, Object currentStateObj)
        {
            if (paused)
            {
                return;
            }

            RaceRoomShared lastState    = ((CrewChiefV4.RaceRoom.R3ESharedMemoryReader.R3EStructWrapper)lastStateObj).data;
            RaceRoomShared currentState = ((CrewChiefV4.RaceRoom.R3ESharedMemoryReader.R3EStructWrapper)currentStateObj).data;

            if (!enabled || currentState.Player.GameSimulationTime < timeAfterRaceStartToActivate ||
                currentState.ControlType != (int)RaceRoomConstant.Control.Player ||
                ((int)RaceRoomConstant.Session.Qualify == currentState.SessionType && (currentState.NumCars == 1 || currentState.NumCars == 2)))
            {
                return;
            }

            DateTime   now = DateTime.Now;
            DriverData currentPlayerData;
            DriverData previousPlayerData;
            float      timeDiffSeconds;

            try
            {
                currentPlayerData  = getDriverData(currentState, currentState.slot_id);
                previousPlayerData = getDriverData(lastState, currentState.slot_id);
                timeDiffSeconds    = ((float)(now - previousTime).TotalMilliseconds) / 1000f;
                previousTime       = now;
                if (timeDiffSeconds <= 0)
                {
                    // WTF?
                    return;
                }
            }
            catch (Exception)
            {
                return;
            }
            float[] currentPlayerPosition = new float[] { currentPlayerData.position.X, currentPlayerData.position.Z };

            if (currentPlayerData.in_pitlane == 0)
            {
                List <float[]> currentOpponentPositions = new List <float[]>();
                float[]        playerVelocityData       = new float[3];
                playerVelocityData[0] = currentState.CarSpeed;
                playerVelocityData[1] = (currentPlayerData.position.X - previousPlayerData.position.X) / timeDiffSeconds;
                playerVelocityData[2] = (currentPlayerData.position.Z - previousPlayerData.position.Z) / timeDiffSeconds;

                foreach (DriverData driverData in currentState.all_drivers_data)
                {
                    if (driverData.driver_info.slot_id == currentState.slot_id || driverData.driver_info.slot_id == -1 || driverData.in_pitlane == 1)
                    {
                        continue;
                    }
                    currentOpponentPositions.Add(new float[] { driverData.position.X, driverData.position.Z });
                }
                float playerRotation = currentState.CarOrientation.Yaw;
                if (playerRotation < 0)
                {
                    playerRotation = (float)(2 * Math.PI) + playerRotation;
                }
                playerRotation = (float)(2 * Math.PI) - playerRotation;
                internalSpotter.triggerInternal(playerRotation, currentPlayerPosition, playerVelocityData, currentOpponentPositions);
            }
        }
 private DriverData getDriverData(RaceRoomShared shared, int slot_id)
 {
     foreach (DriverData driverData in shared.all_drivers_data)
     {
         if (driverData.driver_info.slot_id == slot_id)
         {
             return driverData;
         }
     }
     throw new Exception("no driver data for slotID " + slot_id);
 }
Example #8
0
        public void trigger(Object lastStateObj, Object currentStateObj, GameStateData currentGameState)
        {
            if (paused)
            {
                return;
            }

            RaceRoomShared lastState    = ((CrewChiefV4.RaceRoom.R3ESharedMemoryReader.R3EStructWrapper)lastStateObj).data;
            RaceRoomShared currentState = ((CrewChiefV4.RaceRoom.R3ESharedMemoryReader.R3EStructWrapper)currentStateObj).data;

            if (!enabled || currentState.Player.GameSimulationTime < timeAfterRaceStartToActivate ||
                currentState.ControlType != (int)RaceRoomConstant.Control.Player ||
                ((int)RaceRoomConstant.Session.Qualify == currentState.SessionType && (currentState.NumCars == 1 || currentState.NumCars == 2)))
            {
                return;
            }

            DateTime   now = DateTime.Now;
            DriverData currentPlayerData;
            DriverData previousPlayerData;
            float      timeDiffSeconds;

            try
            {
                currentPlayerData  = getDriverData(currentState, currentState.VehicleInfo.SlotId);
                previousPlayerData = getDriverData(lastState, currentState.VehicleInfo.SlotId);
                timeDiffSeconds    = ((float)(now - previousTime).TotalMilliseconds) / 1000f;
                previousTime       = now;
                if (timeDiffSeconds <= 0)
                {
                    // WTF?
                    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.Position.X, currentPlayerData.Position.Z };

            if (currentPlayerData.InPitlane == 0)
            {
                List <float[]> currentOpponentPositions = new List <float[]>();
                float[]        playerVelocityData       = new float[3];
                playerVelocityData[0] = currentState.CarSpeed;
                playerVelocityData[1] = (currentPlayerData.Position.X - previousPlayerData.Position.X) / timeDiffSeconds;
                playerVelocityData[2] = (currentPlayerData.Position.Z - previousPlayerData.Position.Z) / timeDiffSeconds;

                foreach (DriverData driverData in currentState.DriverData)
                {
                    if (driverData.DriverInfo.SlotId == currentState.VehicleInfo.SlotId || driverData.DriverInfo.SlotId == -1 || driverData.InPitlane == 1)
                    {
                        continue;
                    }
                    currentOpponentPositions.Add(new float[] { driverData.Position.X, driverData.Position.Z });
                }
                float playerRotation = currentState.CarOrientation.Yaw;
                if (playerRotation < 0)
                {
                    playerRotation = (float)(2 * Math.PI) + playerRotation;
                }
                playerRotation = (float)(2 * Math.PI) - playerRotation;
                internalSpotter.triggerInternal(playerRotation, currentPlayerPosition, playerVelocityData, currentOpponentPositions);
            }
        }
Example #9
0
        public override void trigger(Object lastStateObj, Object currentStateObj, GameStateData currentGameState)
        {
            if (paused)
            {
                return;
            }
            RaceRoomShared currentState = ((CrewChiefV4.RaceRoom.R3ESharedMemoryReader.R3EStructWrapper)currentStateObj).data;
            RaceRoomShared lastState    = ((CrewChiefV4.RaceRoom.R3ESharedMemoryReader.R3EStructWrapper)lastStateObj).data;

            if (!enabled || currentState.Player.GameSimulationTime < timeAfterRaceStartToActivate ||
                currentState.ControlType != (int)RaceRoomConstant.Control.Player ||
                currentGameState.SessionData.SessionType == SessionType.HotLap ||
                currentGameState.SessionData.SessionType == SessionType.LonePractice)
            {
                return;
            }

            DateTime   now = DateTime.UtcNow;
            DriverData currentPlayerData;
            DriverData previousPlayerData;
            float      timeDiffSeconds;

            try
            {
                currentPlayerData  = getDriverData(currentState, currentState.VehicleInfo.SlotId);
                previousPlayerData = getDriverData(lastState, currentState.VehicleInfo.SlotId);
                timeDiffSeconds    = (float)(now - previousTime).TotalSeconds;
                previousTime       = now;
                if (timeDiffSeconds <= 0)
                {
                    // WTF?
                    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.
                    this.internalSpotter.setCarDimensions(GlobalBehaviourSettings.spotterVehicleLength, GlobalBehaviourSettings.spotterVehicleWidth);
                    this.currentPlayerCarClassID = carClass.getClassIdentifier();
                }
            }
            float[] currentPlayerPosition = new float[] { currentPlayerData.Position.X, currentPlayerData.Position.Z };

            if (currentPlayerData.InPitlane == 0)
            {
                List <float[]> currentOpponentPositions = new List <float[]>();
                float[]        playerVelocityData       = new float[3];
                playerVelocityData[0] = currentState.CarSpeed;
                playerVelocityData[1] = (currentPlayerData.Position.X - previousPlayerData.Position.X) / timeDiffSeconds;
                playerVelocityData[2] = (currentPlayerData.Position.Z - previousPlayerData.Position.Z) / timeDiffSeconds;

                positionsFilledForThisTick.Clear();
                positionsFilledForThisTick.Add(currentPlayerData.Place);
                foreach (DriverData driverData in currentState.DriverData)
                {
                    if (driverData.DriverInfo.SlotId == currentState.VehicleInfo.SlotId || driverData.DriverInfo.SlotId == -1 || driverData.InPitlane == 1 ||
                        positionsFilledForThisTick.Contains(driverData.Place))
                    {
                        continue;
                    }
                    positionsFilledForThisTick.Add(driverData.Place);
                    currentOpponentPositions.Add(new float[] { driverData.Position.X, driverData.Position.Z });
                }
                float playerRotation = currentState.CarOrientation.Yaw;
                if (playerRotation < 0)
                {
                    playerRotation = playerRotation * -1;
                }
                else
                {
                    playerRotation = twoPi - playerRotation;
                }
                internalSpotter.triggerInternal(playerRotation, currentPlayerPosition, playerVelocityData, currentOpponentPositions);
            }
        }
 private OvertakingAids getOvertakingAids(RaceRoomShared shared, CarData.CarClassEnum carClassEnum, int lapsCompleted, SessionType sessionType)
 {
     OvertakingAids overtakingAids = new OvertakingAids();
     overtakingAids.DrsAvailable = shared.DrsAvailable == 1;
     overtakingAids.DrsEngaged = shared.DrsEngaged == 1;
     if (carClassEnum == CarData.CarClassEnum.DTM_2014)
     {
         overtakingAids.DrsEnabled = sessionType == SessionType.Race && lapsCompleted > 2;
         overtakingAids.DrsRange = 2;
     }
     else if (carClassEnum == CarData.CarClassEnum.DTM_2015)
     {
         overtakingAids.DrsEnabled = sessionType == SessionType.Race && lapsCompleted > 3;
         overtakingAids.DrsRange = 1;
     }
     overtakingAids.PushToPassActivationsRemaining = shared.push_to_pass.amount_left;
     overtakingAids.PushToPassAvailable = shared.push_to_pass.available == 1;
     overtakingAids.PushToPassEngaged = shared.push_to_pass.engaged == 1;
     overtakingAids.PushToPassEngagedTimeLeft = shared.push_to_pass.engaged_time_left;
     overtakingAids.PushToPassWaitTimeLeft = shared.push_to_pass.wait_time_left;
     return overtakingAids;
 }