void TransitionToIntermission() { // Copy over the Race Session Data to the Intermission State so the previous race's leaderboard and timer // is shown while players wait for the next race. RaceSessionData raceSessionDataForIntermission = new RaceSessionData( raceSessionData.raceStartTime, CurrentRaceDuration, raceSessionData.PlayersInRace, raceSessionData.FinishedPlayers ); ServerStateMachine.Singleton.ChangeState(StateEnum.Intermission, raceSessionDataForIntermission); }
IEnumerator IntermissionTimerAndTrackGeneration() { intermissionSecondsRemaining = intermissionSecondsTotal; while (intermissionSecondsRemaining > 0) { yield return(new WaitForSeconds(1)); intermissionSecondsRemaining--; // Destroy previous track and generate new track for next race when halfway in intermission if (intermissionSecondsRemaining == intermissionSecondsTotal / 2) { raceSessionData = new RaceSessionData(0); TrackGenerator.Singleton.DestroyIfRequired(); // Spawn/despawn required AI players int numToSpawn = minPlayersOnServer - ServerStateMachine.Singleton.ReadyPlayers.Count; if (numToSpawn > 0) { ServerManager.singleton.ConnectAIPlayers(numToSpawn); } else { ServerManager.singleton.DisconnectAIPlayers(-numToSpawn); } List <Player> shuffledReadyPlayers = ServerStateMachine.Singleton.ReadyPlayers.OrderBy(_ => Guid.NewGuid()).ToList(); TrackGenerator.Singleton.GenerateIfRequired(shuffledReadyPlayers); } } // Intermission Timer fully finished - now we transition to states based on whether or not there are players. if (ServerStateMachine.Singleton.ReadyPlayers.Any(player => !player.IsAI)) { // Only transition to race if track is generated while (!TrackGenerator.Singleton.IsTrackGenerated) { yield return(null); } TransitionToRace(); } else { TransitionToIdle(); } }
public override void Enter(object optionalData = null) { raceSessionData = new RaceSessionData(NetworkTime.time); raceFinishTime = NetworkTime.time + maxRaceDuration; EnableAllPlayerCarControllers(); }