LauncherConnecting.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System;
  2. using Robust.Client;
  3. using Robust.Client.UserInterface;
  4. using Robust.Shared.Configuration;
  5. using Robust.Shared.IoC;
  6. using Robust.Shared.Log;
  7. using Robust.Shared.Network;
  8. using Robust.Shared.Prototypes;
  9. using Robust.Shared.Random;
  10. namespace Content.Client.Launcher
  11. {
  12. public sealed class LauncherConnecting : Robust.Client.State.State
  13. {
  14. [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!;
  15. [Dependency] private readonly IClientNetManager _clientNetManager = default!;
  16. [Dependency] private readonly IGameController _gameController = default!;
  17. [Dependency] private readonly IBaseClient _baseClient = default!;
  18. [Dependency] private readonly IRobustRandom _random = default!;
  19. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  20. [Dependency] private readonly IConfigurationManager _cfg = default!;
  21. [Dependency] private readonly IClipboardManager _clipboard = default!;
  22. private LauncherConnectingGui? _control;
  23. private Page _currentPage;
  24. private string? _connectFailReason;
  25. public string? Address => _gameController.LaunchState.Ss14Address ?? _gameController.LaunchState.ConnectAddress;
  26. public string? ConnectFailReason
  27. {
  28. get => _connectFailReason;
  29. private set
  30. {
  31. _connectFailReason = value;
  32. ConnectFailReasonChanged?.Invoke(value);
  33. }
  34. }
  35. public string? LastDisconnectReason => _baseClient.LastDisconnectReason;
  36. public Page CurrentPage
  37. {
  38. get => _currentPage;
  39. private set
  40. {
  41. _currentPage = value;
  42. PageChanged?.Invoke(value);
  43. }
  44. }
  45. public ClientConnectionState ConnectionState => _clientNetManager.ClientConnectState;
  46. public event Action<Page>? PageChanged;
  47. public event Action<string?>? ConnectFailReasonChanged;
  48. public event Action<ClientConnectionState>? ConnectionStateChanged;
  49. public event Action<NetConnectFailArgs>? ConnectFailed;
  50. protected override void Startup()
  51. {
  52. _control = new LauncherConnectingGui(this, _random, _prototypeManager, _cfg, _clipboard);
  53. _userInterfaceManager.StateRoot.AddChild(_control);
  54. _clientNetManager.ConnectFailed += OnConnectFailed;
  55. _clientNetManager.ClientConnectStateChanged += OnConnectStateChanged;
  56. CurrentPage = Page.Connecting;
  57. }
  58. protected override void Shutdown()
  59. {
  60. _control?.Dispose();
  61. _clientNetManager.ConnectFailed -= OnConnectFailed;
  62. _clientNetManager.ClientConnectStateChanged -= OnConnectStateChanged;
  63. }
  64. private void OnConnectFailed(object? _, NetConnectFailArgs args)
  65. {
  66. if (args.RedialFlag)
  67. {
  68. // We've just *attempted* to connect and we've been told we need to redial, so do it.
  69. // Result deliberately discarded.
  70. Redial();
  71. }
  72. ConnectFailReason = args.Reason;
  73. CurrentPage = Page.ConnectFailed;
  74. ConnectFailed?.Invoke(args);
  75. }
  76. private void OnConnectStateChanged(ClientConnectionState state)
  77. {
  78. ConnectionStateChanged?.Invoke(state);
  79. }
  80. public void RetryConnect()
  81. {
  82. if (_gameController.LaunchState.ConnectEndpoint != null)
  83. {
  84. _baseClient.ConnectToServer(_gameController.LaunchState.ConnectEndpoint);
  85. CurrentPage = Page.Connecting;
  86. }
  87. }
  88. public bool Redial()
  89. {
  90. try
  91. {
  92. if (_gameController.LaunchState.Ss14Address != null)
  93. {
  94. _gameController.Redial(_gameController.LaunchState.Ss14Address);
  95. return true;
  96. }
  97. else
  98. {
  99. Logger.InfoS("launcher-ui", $"Redial not possible, no Ss14Address");
  100. }
  101. }
  102. catch (Exception ex)
  103. {
  104. Logger.ErrorS("launcher-ui", $"Redial exception: {ex}");
  105. }
  106. return false;
  107. }
  108. public void Exit()
  109. {
  110. _gameController.Shutdown("Exit button pressed");
  111. }
  112. public void SetDisconnected()
  113. {
  114. CurrentPage = Page.Disconnected;
  115. }
  116. public enum Page : byte
  117. {
  118. Connecting,
  119. ConnectFailed,
  120. Disconnected,
  121. }
  122. }
  123. }