QSBNetworkManager.cs: proper transport error

This commit is contained in:
JohnCorby 2023-05-07 18:14:49 -07:00
parent 38f653ef3c
commit a89c325c88
4 changed files with 22 additions and 33 deletions

View File

@ -40,9 +40,6 @@ namespace EpicTransport {
public ProductUserId productUserId; public ProductUserId productUserId;
private int packetId = 0; private int packetId = 0;
// CHANGED
public Action<string> SetTransportError;
private void Awake() { private void Awake() {
Debug.Assert(Channels != null && Channels.Length > 0, "No channel configured for EOS Transport."); Debug.Assert(Channels != null && Channels.Length > 0, "No channel configured for EOS Transport.");

View File

@ -1,4 +1,5 @@
using EpicTransport; using EpicTransport;
using Mirror;
using OWML.Common; using OWML.Common;
using QSB.Localization; using QSB.Localization;
using QSB.Messaging; using QSB.Messaging;
@ -716,7 +717,7 @@ internal class MenuManager : MonoBehaviour, IAddComponentOnStart
OpenInfoPopup(string.Format(QSBLocalization.Current.ServerRefusedConnection, reason), QSBLocalization.Current.OK); OpenInfoPopup(string.Format(QSBLocalization.Current.ServerRefusedConnection, reason), QSBLocalization.Current.OK);
} }
private void OnDisconnected(string error) private void OnDisconnected(TransportError error, string reason)
{ {
QSBCore.IsInMultiplayer = false; QSBCore.IsInMultiplayer = false;
@ -735,7 +736,7 @@ internal class MenuManager : MonoBehaviour, IAddComponentOnStart
} }
}; };
OpenInfoPopup(string.Format(QSBLocalization.Current.ClientDisconnectWithError, error), QSBLocalization.Current.OK); OpenInfoPopup(string.Format(QSBLocalization.Current.ClientDisconnectWithError, reason), QSBLocalization.Current.OK);
} }
SetButtonActive(DisconnectButton, false); SetButtonActive(DisconnectButton, false);

View File

@ -45,7 +45,7 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart
public new static QSBNetworkManager singleton => (QSBNetworkManager)NetworkManager.singleton; public new static QSBNetworkManager singleton => (QSBNetworkManager)NetworkManager.singleton;
public event Action OnClientConnected; public event Action OnClientConnected;
public event Action<string> OnClientDisconnected; public event Action<TransportError, string> OnClientDisconnected;
public GameObject OrbPrefab { get; private set; } public GameObject OrbPrefab { get; private set; }
public GameObject ShipPrefab { get; private set; } public GameObject ShipPrefab { get; private set; }
@ -65,12 +65,7 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart
private GameObject _probePrefab; private GameObject _probePrefab;
private bool _everConnected; private bool _everConnected;
private string _lastTransportError; private (TransportError error, string reason) _lastTransportError;
private static readonly string[] _kcpErrorLogs =
{
"KcpPeer: received disconnect message",
"Failed to resolve host: .*"
};
private static kcp2k.KcpTransport _kcpTransport; private static kcp2k.KcpTransport _kcpTransport;
private static EosTransport _eosTransport; private static EosTransport _eosTransport;
@ -99,7 +94,6 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart
eosSdkComponent.epicLoggerLevel = LogLevel.VeryVerbose; eosSdkComponent.epicLoggerLevel = LogLevel.VeryVerbose;
_eosTransport = gameObject.AddComponent<EosTransport>(); _eosTransport = gameObject.AddComponent<EosTransport>();
_eosTransport.SetTransportError = error => _lastTransportError = error;
} }
transport = QSBCore.UseKcpTransport ? _kcpTransport : _eosTransport; transport = QSBCore.UseKcpTransport ? _kcpTransport : _eosTransport;
@ -242,24 +236,14 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart
networkAddress = QSBCore.DefaultServerIP; networkAddress = QSBCore.DefaultServerIP;
{ {
kcp2k.Log.Info = s => // hack
kcp2k.Log.Info += s =>
{ {
DebugLog.DebugWrite("[KCP] " + s); if (s == "KcpPeer: received disconnect message")
if (_kcpErrorLogs.Any(p => Regex.IsMatch(s, p)))
{ {
_lastTransportError = s; OnClientError(TransportError.ConnectionClosed, "host disconnected");
} }
}; };
kcp2k.Log.Warning = s =>
{
DebugLog.DebugWrite("[KCP] " + s, MessageType.Warning);
_lastTransportError = s;
};
kcp2k.Log.Error = s =>
{
DebugLog.DebugWrite("[KCP] " + s, MessageType.Error);
_lastTransportError = s;
};
} }
QSBSceneManager.OnPostSceneLoad += (_, loadScene) => QSBSceneManager.OnPostSceneLoad += (_, loadScene) =>
@ -357,8 +341,8 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart
{ {
DebugLog.DebugWrite("OnClientDisconnect"); DebugLog.DebugWrite("OnClientDisconnect");
base.OnClientDisconnect(); base.OnClientDisconnect();
OnClientDisconnected?.SafeInvoke(_lastTransportError); OnClientDisconnected?.SafeInvoke(_lastTransportError.error, _lastTransportError.reason);
_lastTransportError = null; _lastTransportError = default;
} }
public override void OnServerDisconnect(NetworkConnectionToClient conn) // Called on the server when any client disconnects public override void OnServerDisconnect(NetworkConnectionToClient conn) // Called on the server when any client disconnects
@ -425,9 +409,15 @@ public class QSBNetworkManager : NetworkManager, IAddComponentOnStart
base.OnStopServer(); base.OnStopServer();
} }
public override void OnServerError(NetworkConnectionToClient conn, TransportError error, string reason) => public override void OnServerError(NetworkConnectionToClient conn, TransportError error, string reason)
{
DebugLog.DebugWrite($"OnServerError({conn}, {error}, {reason})", MessageType.Error); DebugLog.DebugWrite($"OnServerError({conn}, {error}, {reason})", MessageType.Error);
_lastTransportError = (error, reason);
}
public override void OnClientError(TransportError error, string reason) => public override void OnClientError(TransportError error, string reason)
{
DebugLog.DebugWrite($"OnClientError({error}, {reason})", MessageType.Error); DebugLog.DebugWrite($"OnClientError({error}, {reason})", MessageType.Error);
_lastTransportError = (error, reason);
}
} }

View File

@ -1,4 +1,5 @@
using QSB.DeathSync.Messages; using Mirror;
using QSB.DeathSync.Messages;
using QSB.Messaging; using QSB.Messaging;
using QSB.Patches; using QSB.Patches;
using QSB.Player; using QSB.Player;
@ -48,7 +49,7 @@ internal class RespawnManager : MonoBehaviour, IAddComponentOnStart
} }
} }
private void OnDisconnected(string error) private void OnDisconnected(TransportError error, string reason)
{ {
_owRecoveryPoint?.SetActive(true); _owRecoveryPoint?.SetActive(true);
_qsbRecoveryPoint?.SetActive(false); _qsbRecoveryPoint?.SetActive(false);