using System; using Robust.Client; using Robust.Client.UserInterface; using Robust.Shared.IoC; using Robust.Shared.Network; namespace Content.Client.Launcher { public class LauncherConnecting : Robust.Client.State.State { [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; [Dependency] private readonly IClientNetManager _clientNetManager = default!; [Dependency] private readonly IGameController _gameController = default!; [Dependency] private readonly IBaseClient _baseClient = default!; private LauncherConnectingGui? _control; private Page _currentPage; private string? _connectFailReason; public string? Address => _gameController.LaunchState.Ss14Address ?? _gameController.LaunchState.ConnectAddress; public string? ConnectFailReason { get => _connectFailReason; private set { _connectFailReason = value; ConnectFailReasonChanged?.Invoke(value); } } public string? LastDisconnectReason => _baseClient.LastDisconnectReason; public Page CurrentPage { get => _currentPage; private set { _currentPage = value; PageChanged?.Invoke(value); } } public ClientConnectionState ConnectionState => _clientNetManager.ClientConnectState; public event Action? PageChanged; public event Action? ConnectFailReasonChanged; public event Action? ConnectionStateChanged; public override void Startup() { _control = new LauncherConnectingGui(this); _userInterfaceManager.StateRoot.AddChild(_control); _clientNetManager.ConnectFailed += OnConnectFailed; _clientNetManager.ClientConnectStateChanged += OnConnectStateChanged; CurrentPage = Page.Connecting; } public override void Shutdown() { _control?.Dispose(); _clientNetManager.ConnectFailed -= OnConnectFailed; _clientNetManager.ClientConnectStateChanged -= OnConnectStateChanged; } private void OnConnectFailed(object? _, NetConnectFailArgs args) { ConnectFailReason = args.Reason; CurrentPage = Page.ConnectFailed; } private void OnConnectStateChanged(ClientConnectionState state) { ConnectionStateChanged?.Invoke(state); } public void RetryConnect() { if (_gameController.LaunchState.ConnectEndpoint != null) { _baseClient.ConnectToServer(_gameController.LaunchState.ConnectEndpoint); CurrentPage = Page.Connecting; } } public void Exit() { _gameController.Shutdown("Exit button pressed"); } public void SetDisconnected() { CurrentPage = Page.Disconnected; } public enum Page : byte { Connecting, ConnectFailed, Disconnected, } } }