コード例 #1
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));
        }
コード例 #2
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);
            }
        }