private IEnumerator LaunchGame(string levelPath, ulong level, WorkshopItemSource type, int checkpoint, int subObjectives, Action onComplete) { object obj = stateLock; Monitor.Enter(obj); try { if (state == AppSate.Menu || state == AppSate.PlayLevel || state == AppSate.ClientJoin || state == AppSate.ClientLobby || state == AppSate.ClientPlayLevel || state == AppSate.ClientWaitServerLoad || state == AppSate.ServerLobby || state != AppSate.ServerPlayLevel) { } bool ui = state == AppSate.Menu || state == AppSate.ServerLobby || state == AppSate.ClientLobby || state == AppSate.ClientJoin; if (ui) { MenuSystem.instance.FadeOutActive(); } if (isServer || isClient) { MenuCameraEffects.FadeToBlack((!ui) ? 0.02f : 0.2f); Dialogs.ShowLoadLevelProgress(level); } if (isServer) { state = AppSate.ServerLoadLevel; } else if (isClient) { state = AppSate.ClientLoadLevel; } else { state = AppSate.LoadLevel; } queueAfterLevelLoad = null; if (ui) { yield return(new WaitForSeconds(0.2f)); } NetStream.DiscardPools(); Game.instance.BeginLoadLevel(levelPath, level, checkpoint, subObjectives, delegate { lock (stateLock) { if (state == AppSate.LoadLevel || state == AppSate.ServerLoadLevel || state != AppSate.ClientLoadLevel) { } MenuSystem.instance.ExitMenus(); NetStream.DiscardPools(); ResumeDeltasAfterLoad(); if (onComplete != null) { onComplete(); } if (queueAfterLevelLoad != null) { Action action = queueAfterLevelLoad; queueAfterLevelLoad = null; if (NetGame.netlog) { UnityEngine.Debug.Log("Executing queue"); } action(); } } }, type); } finally { } }