Skip to content

Commit b4e5da8

Browse files
committed
replacing custom messaging with new disconnect reason (v2)
1 parent 7ccd612 commit b4e5da8

File tree

6 files changed

+62
-97
lines changed

6 files changed

+62
-97
lines changed

Assets/Scripts/ConnectionManagement/ConnectionManager.cs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -172,43 +172,5 @@ public void RequestShutdown()
172172
{
173173
m_CurrentState.OnUserRequestedShutdown();
174174
}
175-
176-
/// <summary>
177-
/// Registers the message handler for custom named messages. This should only be done once StartClient has been
178-
/// called (start client will initialize NetworkSceneManager and CustomMessagingManager)
179-
/// </summary>
180-
public void RegisterCustomMessages()
181-
{
182-
NetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(nameof(ReceiveServerToClientSetDisconnectReason_CustomMessage), ReceiveServerToClientSetDisconnectReason_CustomMessage);
183-
}
184-
185-
void ReceiveServerToClientSetDisconnectReason_CustomMessage(ulong clientID, FastBufferReader reader)
186-
{
187-
reader.ReadValueSafe(out ConnectStatus status);
188-
m_CurrentState.OnDisconnectReasonReceived(status);
189-
}
190-
191-
/// <summary>
192-
/// Sends a DisconnectReason to all connected clients. This should only be done on the server, prior to disconnecting the clients.
193-
/// </summary>
194-
/// <param name="status"> The reason for the upcoming disconnect.</param>
195-
public void SendServerToAllClientsSetDisconnectReason(ConnectStatus status)
196-
{
197-
var writer = new FastBufferWriter(sizeof(ConnectStatus), Allocator.Temp);
198-
writer.WriteValueSafe(status);
199-
NetworkManager.CustomMessagingManager.SendNamedMessageToAll(nameof(ReceiveServerToClientSetDisconnectReason_CustomMessage), writer);
200-
}
201-
202-
/// <summary>
203-
/// Sends a DisconnectReason to the indicated client. This should only be done on the server, prior to disconnecting the client.
204-
/// </summary>
205-
/// <param name="clientID"> id of the client to send to </param>
206-
/// <param name="status"> The reason for the upcoming disconnect.</param>
207-
public void SendServerToClientSetDisconnectReason(ulong clientID, ConnectStatus status)
208-
{
209-
var writer = new FastBufferWriter(sizeof(ConnectStatus), Allocator.Temp);
210-
writer.WriteValueSafe(status);
211-
NetworkManager.CustomMessagingManager.SendNamedMessage(nameof(ReceiveServerToClientSetDisconnectReason_CustomMessage), clientID, writer);
212-
}
213175
}
214176
}

Assets/Scripts/ConnectionManagement/ConnectionState/ClientConnectedState.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,24 @@ public override void Exit() { }
2626

2727
public override void OnClientDisconnect(ulong _)
2828
{
29-
m_ConnectStatusPublisher.Publish(ConnectStatus.Reconnecting);
30-
m_ConnectionManager.ChangeState(m_ConnectionManager.m_ClientReconnecting);
29+
var disconnectReason = m_ConnectionManager.NetworkManager.DisconnectReason;
30+
if (string.IsNullOrEmpty(disconnectReason))
31+
{
32+
m_ConnectStatusPublisher.Publish(ConnectStatus.Reconnecting);
33+
m_ConnectionManager.ChangeState(m_ConnectionManager.m_ClientReconnecting);
34+
}
35+
else
36+
{
37+
var connectStatus = JsonUtility.FromJson<ConnectStatus>(disconnectReason);
38+
m_ConnectStatusPublisher.Publish(connectStatus);
39+
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
40+
}
3141
}
3242

3343
public override void OnUserRequestedShutdown()
3444
{
3545
m_ConnectStatusPublisher.Publish(ConnectStatus.UserRequestedDisconnect);
3646
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
3747
}
38-
39-
public override void OnDisconnectReasonReceived(ConnectStatus disconnectReason)
40-
{
41-
m_ConnectStatusPublisher.Publish(disconnectReason);
42-
m_ConnectionManager.ChangeState(m_ConnectionManager.m_DisconnectingWithReason);
43-
}
4448
}
4549
}

Assets/Scripts/ConnectionManagement/ConnectionState/ClientConnectingState.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,19 @@ public override void OnClientDisconnect(ulong _)
4949

5050
protected void StartingClientFailedAsync()
5151
{
52-
m_ConnectStatusPublisher.Publish(ConnectStatus.StartClientFailed);
52+
var disconnectReason = m_ConnectionManager.NetworkManager.DisconnectReason;
53+
if (string.IsNullOrEmpty(disconnectReason))
54+
{
55+
m_ConnectStatusPublisher.Publish(ConnectStatus.StartClientFailed);
56+
}
57+
else
58+
{
59+
var connectStatus = JsonUtility.FromJson<ConnectStatus>(disconnectReason);
60+
m_ConnectStatusPublisher.Publish(connectStatus);
61+
}
5362
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
5463
}
5564

56-
public override void OnDisconnectReasonReceived(ConnectStatus disconnectReason)
57-
{
58-
m_ConnectStatusPublisher.Publish(disconnectReason);
59-
m_ConnectionManager.ChangeState(m_ConnectionManager.m_DisconnectingWithReason);
60-
}
61-
6265

6366
internal async Task ConnectClientAsync()
6467
{
@@ -74,7 +77,6 @@ internal async Task ConnectClientAsync()
7477
}
7578

7679
SceneLoaderWrapper.Instance.AddOnSceneEventCallback();
77-
m_ConnectionManager.RegisterCustomMessages();
7880
}
7981
catch (Exception e)
8082
{

Assets/Scripts/ConnectionManagement/ConnectionState/ClientReconnectingState.cs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,35 @@ public override void OnClientConnected(ulong _)
4747

4848
public override void OnClientDisconnect(ulong _)
4949
{
50-
if (m_NbAttempts < m_ConnectionManager.NbReconnectAttempts)
50+
var disconnectReason = m_ConnectionManager.NetworkManager.DisconnectReason;
51+
if (string.IsNullOrEmpty(disconnectReason))
5152
{
52-
m_ReconnectCoroutine = m_ConnectionManager.StartCoroutine(ReconnectCoroutine());
53+
if (m_NbAttempts < m_ConnectionManager.NbReconnectAttempts)
54+
{
55+
m_ReconnectCoroutine = m_ConnectionManager.StartCoroutine(ReconnectCoroutine());
56+
}
57+
else
58+
{
59+
m_ConnectStatusPublisher.Publish(ConnectStatus.GenericDisconnect);
60+
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
61+
}
5362
}
5463
else
5564
{
56-
m_ConnectStatusPublisher.Publish(ConnectStatus.GenericDisconnect);
57-
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
58-
}
59-
}
60-
61-
public override void OnDisconnectReasonReceived(ConnectStatus disconnectReason)
62-
{
63-
m_ConnectStatusPublisher.Publish(disconnectReason);
64-
switch (disconnectReason)
65-
{
66-
case ConnectStatus.UserRequestedDisconnect:
67-
case ConnectStatus.HostEndedSession:
68-
case ConnectStatus.ServerFull:
69-
m_ConnectionManager.ChangeState(m_ConnectionManager.m_DisconnectingWithReason);
70-
break;
65+
var connectStatus = JsonUtility.FromJson<ConnectStatus>(disconnectReason);
66+
m_ConnectStatusPublisher.Publish(connectStatus);
67+
switch (connectStatus)
68+
{
69+
case ConnectStatus.UserRequestedDisconnect:
70+
case ConnectStatus.HostEndedSession:
71+
case ConnectStatus.ServerFull:
72+
case ConnectStatus.IncompatibleBuildType:
73+
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
74+
break;
75+
default:
76+
m_ReconnectCoroutine = m_ConnectionManager.StartCoroutine(ReconnectCoroutine());
77+
break;
78+
}
7179
}
7280
}
7381

Assets/Scripts/ConnectionManagement/ConnectionState/ConnectionState.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ public virtual void StartHostLobby(string playerName) { }
3636

3737
public virtual void OnUserRequestedShutdown() { }
3838

39-
public virtual void OnDisconnectReasonReceived(ConnectStatus disconnectReason) { }
40-
4139
public virtual void ApprovalCheck(NetworkManager.ConnectionApprovalRequest request, NetworkManager.ConnectionApprovalResponse response) { }
4240

4341
public virtual void OnTransportFailure() { }

Assets/Scripts/ConnectionManagement/ConnectionState/HostingState.cs

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,19 @@ public override void OnClientDisconnect(ulong clientId)
7171

7272
public override void OnUserRequestedShutdown()
7373
{
74-
m_ConnectionManager.SendServerToAllClientsSetDisconnectReason(ConnectStatus.HostEndedSession);
75-
// Wait before shutting down to make sure clients receive that message before they are disconnected
76-
m_ConnectionManager.StartCoroutine(WaitToShutdown());
74+
ulong[] clientIds = new ulong[m_ConnectionManager.NetworkManager.ConnectedClientsIds.Count];
75+
var i = 0;
76+
foreach (var id in m_ConnectionManager.NetworkManager.ConnectedClientsIds)
77+
{
78+
clientIds[i] = id;
79+
i++;
80+
}
81+
82+
foreach (var id in clientIds)
83+
{
84+
m_ConnectionManager.NetworkManager.DisconnectClient(id, JsonUtility.ToJson(ConnectStatus.HostEndedSession));
85+
}
86+
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
7787
}
7888

7989
/// <summary>
@@ -119,21 +129,8 @@ public override void ApprovalCheck(NetworkManager.ConnectionApprovalRequest requ
119129
return;
120130
}
121131

122-
// In order for clients to not just get disconnected with no feedback, the server needs to tell the client why it disconnected it.
123-
// This could happen after an auth check on a service or because of gameplay reasons (server full, wrong build version, etc)
124-
// Since network objects haven't synced yet (still in the approval process), we need to send a custom message to clients, wait for
125-
// UTP to update a frame and flush that message, then give our response to NetworkManager's connection approval process, with a denied approval.
126-
IEnumerator WaitToDenyApproval()
127-
{
128-
response.Pending = true; // give some time for server to send connection status message to clients
129-
response.Approved = false;
130-
m_ConnectionManager.SendServerToClientSetDisconnectReason(clientId, gameReturnStatus);
131-
yield return null; // wait a frame so UTP can flush it's messages on next update
132-
response.Pending = false; // connection approval process can be finished.
133-
}
134-
135-
m_ConnectionManager.SendServerToClientSetDisconnectReason(clientId, gameReturnStatus);
136-
m_ConnectionManager.StartCoroutine(WaitToDenyApproval());
132+
response.Approved = false;
133+
response.Reason = JsonUtility.ToJson(gameReturnStatus);
137134
if (m_LobbyServiceFacade.CurrentUnityLobby != null)
138135
{
139136
m_LobbyServiceFacade.RemovePlayerFromLobbyAsync(connectionPayload.playerId, m_LobbyServiceFacade.CurrentUnityLobby.Id);
@@ -155,11 +152,5 @@ ConnectStatus GetConnectStatus(ConnectionPayload connectionPayload)
155152
return SessionManager<SessionPlayerData>.Instance.IsDuplicateConnection(connectionPayload.playerId) ?
156153
ConnectStatus.LoggedInAgain : ConnectStatus.Success;
157154
}
158-
159-
IEnumerator WaitToShutdown()
160-
{
161-
yield return null;
162-
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
163-
}
164155
}
165156
}

0 commit comments

Comments
 (0)