void MySyncScenario_PlayerReadyToStart(ulong steamId)
        {
            Debug.Assert(Sync.IsServer);

            if (GameState == MyState.WaitingForClients)
            {
                m_playersReadyForBattle.Add(steamId);

                if (AllPlayersReadyForBattle())
                {
                    StartScenario();

                    foreach (var playerId in m_playersReadyForBattle)
                    {
                        if (playerId != Sync.MyId)
                        {
                            MySyncScenario.StartScenarioRequest(playerId, ServerStartGameTime.Ticks);
                        }
                    }
                }
            }
            else if (GameState == MyState.Running)
            {
                MySyncScenario.StartScenarioRequest(steamId, ServerStartGameTime.Ticks);
            }
        }
 protected override void OnStartClicked(MyGuiControlButton sender)
 {
     Debug.Assert(!Sync.IsServer);
     //joining into running game:
     MySyncScenario.OnPrepareScenarioFromLobby(-1);
     CloseScreen();
 }
 public MyGuiScreenScenarioMpClient()
 {
     Debug.Assert(!Sync.IsServer);
     m_startButton.Enabled      = false;
     MySyncScenario.InfoAnswer += MySyncScenario_InfoAnswer;
     MySyncScenario.AskInfo();
 }
 private void OnTimeoutSelected()
 {
     MyScenarioSystem.LoadTimeout = 60 * (int)TimeoutCombo.GetSelectedKey();
     if (Sync.IsServer)
     {
         MySyncScenario.SetTimeout((int)TimeoutCombo.GetSelectedIndex());//for GUI display only, no logic on clients
     }
 }
        internal void PrepareForStart()
        {
            Debug.Assert(Sync.IsServer);

            GameState = MyState.WaitingForClients;
            m_startBattlePreparationOnClients = MySession.Static.ElapsedPlayTime;

            var onlineMode = GetOnlineModeFromCurrentLobbyType();
            if (onlineMode != MyOnlineModeEnum.OFFLINE)
            {
                m_waitingScreen = new MyGuiScreenScenarioWaitForPlayers();
                MyGuiSandbox.AddScreen(m_waitingScreen);

                ServerPreparationStartTime = DateTime.UtcNow;
                MyMultiplayer.Static.ScenarioStartTime = ServerPreparationStartTime;
                MySyncScenario.PrepareScenarioFromLobby(ServerPreparationStartTime.Ticks);
            }
            else
            {
                StartScenario();
            }
        }
        public override void UpdateBeforeSimulation()
        {
            base.UpdateBeforeSimulation();

            if (!(MySession.Static.IsScenario || MySession.Static.Settings.ScenarioEditMode))
            {
                return;
            }

            if (!Sync.IsServer)
            {
                return;
            }

            if (MySession.Static.OnlineMode == MyOnlineModeEnum.OFFLINE && GameState < MyState.Running)
            {
                if (GameState == MyState.Loaded)
                {
                    GameState           = MyState.Running;
                    ServerStartGameTime = DateTime.UtcNow;
                }
                return;
            }

            switch (GameState)
            {
            case MyState.Loaded:
                if (MySession.Static.OnlineMode != MyOnlineModeEnum.OFFLINE && MyMultiplayer.Static == null)
                {
                    if (MyFakes.XBOX_PREVIEW)
                    {
                        GameState = MyState.Running;
                    }
                    else
                    {
                        m_bootUpCount++;
                        if (m_bootUpCount > 100)    //because MyMultiplayer.Static is initialized later than this part of game
                        {
                            //network start failure - trying to save what we can :-)
                            MyPlayerCollection.RequestLocalRespawn();
                            GameState = MyState.Running;
                        }
                    }
                    return;
                }
                if (MySandboxGame.IsDedicated || MySession.Static.Settings.ScenarioEditMode)
                {
                    ServerPreparationStartTime             = DateTime.UtcNow;
                    MyMultiplayer.Static.ScenarioStartTime = ServerPreparationStartTime;
                    GameState = MyState.Running;
                    if (!MySandboxGame.IsDedicated)
                    {
                        StartScenario();
                    }
                    return;
                }
                if (MySession.Static.OnlineMode == MyOnlineModeEnum.OFFLINE || MyMultiplayer.Static != null)
                {
                    if (MyMultiplayer.Static != null)
                    {
                        MyMultiplayer.Static.Scenario         = true;
                        MyMultiplayer.Static.ScenarioBriefing = MySession.Static.GetWorld().Checkpoint.Briefing;
                    }
                    MyGuiScreenScenarioMpServer guiscreen = new MyGuiScreenScenarioMpServer();
                    guiscreen.Briefing = MySession.Static.GetWorld().Checkpoint.Briefing;
                    MyGuiSandbox.AddScreen(guiscreen);
                    m_playersReadyForBattle.Add(Sync.MyId);
                    GameState = MyState.JoinScreen;
                }
                break;

            case MyState.JoinScreen:
                break;

            case MyState.WaitingForClients:
                // Check timeout
                TimeSpan currenTime = MySession.Static.ElapsedPlayTime;
                if (AllPlayersReadyForBattle() || (LoadTimeout > 0 && currenTime - m_startBattlePreparationOnClients > TimeSpan.FromSeconds(LoadTimeout)))
                {
                    StartScenario();
                    foreach (var playerId in m_playersReadyForBattle)
                    {
                        if (playerId != Sync.MyId)
                        {
                            MySyncScenario.StartScenarioRequest(playerId, ServerStartGameTime.Ticks);
                        }
                    }
                }
                break;

            case MyState.Running:
                break;

            case MyState.Ending:
                if (EndAction != null && MySession.Static.ElapsedPlayTime - m_stateChangePlayTime > TimeSpan.FromSeconds(10))
                {
                    EndAction();
                }
                break;
            }
        }
 private void OnJoinRunningChecked(MyGuiControlCheckbox source)
 {
     Debug.Assert(Sync.IsServer);
     MySession.Static.Settings.CanJoinRunning = source.IsChecked;
     MySyncScenario.SetJoinRunning(source.IsChecked);//for GUI display only, no logic on clients
 }