private static void OnSteamLoginEnd(MyMasterServiceClient client, IAsyncResult result, Action loginSuccessAction)
        {
            try
            {
                string username, token;
                if (MyMwcFinalBuildConstants.STEAM_DEMO)
                {
                    username = client.EndSteamDemoLogin(out token, result);
                }
                else
                {
                    username = client.EndSteamLogin(out token, result);
                }
                var screen = new MyGuiScreenLoginProgress(username, token, () =>
                    {
                        MyClientServer.LoggedPlayer.LoggedUsingSteam = true;
                        MyClientServer.LoggedPlayer.SetDisplayName(new StringBuilder(MySteam.UserName));
                        loginSuccessAction();
                    }, null);
                screen.CloseScreenBeforeCallingHandler = true;
                screen.PasswordHash = token;
                MyGuiManager.AddScreen(screen);

                m_loginInProgress = false;
            }
            catch (FaultException<MySteamFault> e)
            {
                if (e.Detail.SteamFaultCode == SteamFaultCode.NotRegistered)
                {
                    MyMasterServerAction registerAction = new MyMasterServerAction(MyTextsWrapperEnum.LoginInProgressPleaseWait);
                    registerAction.SetPublicCredentials();
                    if (String.IsNullOrEmpty(MySteam.SerialKey))
                    {
                        m_loginInProgress = false;
                        OnSteamRegisterError(new InvalidOperationException("Cannot obtain CD key from Steam"));
                    }
                    else
                    {
                        registerAction.BeginAction = (c) => c.BeginSteamRegister(MySteam.UserId, MySteam.SessionTicket, MySteam.SerialKey, MySteam.UserName, null, c);
                        registerAction.EndAction = (c, r) => c.EndSteamRegister(r);
                        registerAction.ActionSuccess += () => OnSteamRegister(loginSuccessAction);
                        registerAction.ActionFailed += OnSteamRegisterError;
                        registerAction.ShowErrorMessage = false;
                        registerAction.Start();
                    }
                }
                else if (e.Detail.SteamFaultCode == SteamFaultCode.NoMW1ProductsOwned)
                {
                    m_loginInProgress = false;
                    MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamNoProductsText, MyTextsWrapperEnum.SteamNoProductsCaption, MyTextsWrapperEnum.Ok, null));
                }
                else if (e.Detail.SteamFaultCode == SteamFaultCode.InvalidTicket)
                {
                    m_loginInProgress = false;
                    MySteam.RefreshSessionTicket();
                    MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamInvalidTicketText, MyTextsWrapperEnum.SteamInvalidTicketCaption, MyTextsWrapperEnum.Ok, null));
                }
                else
                {
                    m_loginInProgress = false;
                    throw;
                }
            }
            finally
            {
                m_loginInProgress = false;
            }
        }
        private static bool HandleSteamLogin(Action loginSuccessAction)
        {
            if (MySteam.IsActive)
            {
                if (m_loginInProgress)
                {
                    Debug.Fail("Login is already in progress!");
                    MyMwcLog.WriteLine("Login called twice, second call stack trace:");
                    MyMwcLog.WriteLine(Environment.StackTrace);

                    // Just do nothing, another login is already in progress
                    return true;
                }

                m_loginInProgress = true;

                MyMasterServerAction steamLogin = new MyMasterServerAction(MyTextsWrapperEnum.LoginInProgressPleaseWait);
                steamLogin.SetPublicCredentials();
                if (MyMwcFinalBuildConstants.STEAM_DEMO)
                {
                    steamLogin.BeginAction = (c) => c.BeginSteamDemoLogin(MySteam.UserId, MySteam.SessionTicket, null, c);
                }
                else
                {
                    steamLogin.BeginAction = (c) => c.BeginSteamLogin(MySteam.UserId, MySteam.SessionTicket, null, c);
                }
                steamLogin.EndAction = (c, r) => OnSteamLoginEnd(c, r, loginSuccessAction);
                steamLogin.Start();
                return true;
            }
            return false;
        }