Пример #1
0
        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);
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
 public override void Enter(object optionalData = null)
 {
     raceSessionData = new RaceSessionData(NetworkTime.time);
     raceFinishTime  = NetworkTime.time + maxRaceDuration;
     EnableAllPlayerCarControllers();
 }