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