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