Skip to content

Commit 0ab59b2

Browse files
committed
Adding disconnect reason handling client-side
(cherry picked from commit d094706)
1 parent 40f7167 commit 0ab59b2

File tree

5 files changed

+48
-34
lines changed

5 files changed

+48
-34
lines changed

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionManager.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Threading.Tasks;
44
using Unity.Collections;
5+
using Unity.Multiplayer.Samples.BossRoom.ApplicationLifecycle.Messages;
56
using Unity.Multiplayer.Samples.BossRoom.Client;
67
using Unity.Multiplayer.Samples.BossRoom.Shared;
78
using Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure;
@@ -11,7 +12,6 @@
1112
using Unity.Services.Authentication;
1213
using Unity.Services.Core;
1314
using UnityEngine;
14-
using UnityEngine.SceneManagement;
1515

1616
namespace Unity.Multiplayer.Samples.BossRoom
1717
{
@@ -74,14 +74,23 @@ public class ConnectionManager : MonoBehaviour
7474
LobbyServiceFacade m_LobbyServiceFacade;
7575
LocalLobby m_LocalLobby;
7676
IPublisher<ConnectionEventMessage> m_ConnectionEventPublisher;
77+
IPublisher<QuitGameSessionMessage> m_QuitGameSessionPublisher;
78+
IPublisher<ConnectStatus> m_ConnectStatusPublisher;
79+
80+
DisconnectReason m_DisconnectReason = new DisconnectReason();
81+
public DisconnectReason DisconnectReason => m_DisconnectReason;
7782

7883
[Inject]
79-
void InjectDependencies(ProfileManager profileManager, LobbyServiceFacade lobbyServiceFacade, LocalLobby localLobby, IPublisher<ConnectionEventMessage> connectionEventPublisher)
84+
void InjectDependencies(ProfileManager profileManager, LobbyServiceFacade lobbyServiceFacade, LocalLobby localLobby,
85+
IPublisher<ConnectionEventMessage> connectionEventPublisher, IPublisher<QuitGameSessionMessage> quitGameSessionPublisher,
86+
IPublisher<ConnectStatus> connectStatusPublisher)
8087
{
8188
m_ProfileManager = profileManager;
8289
m_LobbyServiceFacade = lobbyServiceFacade;
8390
m_LocalLobby = localLobby;
8491
m_ConnectionEventPublisher = connectionEventPublisher;
92+
m_QuitGameSessionPublisher = quitGameSessionPublisher;
93+
m_ConnectStatusPublisher = connectStatusPublisher;
8594
}
8695

8796
void Awake()
@@ -94,8 +103,8 @@ void Start()
94103
m_Logics = new Dictionary<ConnectionStateType, ConnectionState>()
95104
{
96105
[ConnectionStateType.Offline] = new OfflineConnectionState(this, m_LobbyServiceFacade, m_LocalLobby),
97-
[ConnectionStateType.Connecting] = new ConnectingConnectionState(this),
98-
[ConnectionStateType.Connected] = new ConnectedConnectionState(this),
106+
[ConnectionStateType.Connecting] = new ConnectingConnectionState(this, m_QuitGameSessionPublisher, m_ConnectStatusPublisher),
107+
[ConnectionStateType.Connected] = new ConnectedConnectionState(this, m_QuitGameSessionPublisher, m_ConnectStatusPublisher),
99108
[ConnectionStateType.Reconnecting] = new ReconnectingConnectionState(this),
100109
[ConnectionStateType.Hosting] = new HostingConnectionState(this, m_LobbyServiceFacade, m_ConnectionEventPublisher)
101110
};
@@ -164,7 +173,6 @@ void ApprovalCheck(byte[] connectionData, ulong clientId, NetworkManager.Connect
164173
m_Logics[m_CurrentState].ApprovalCheck(connectionData, clientId, connectionApprovedCallback);
165174
}
166175

167-
168176
public Task StartClientLobbyAsync(string playerName, Action<string> onFailure)
169177
{
170178
return m_Logics[m_CurrentState].StartClientLobbyAsync(playerName, GetPlayerId(), onFailure);
@@ -205,7 +213,7 @@ void OnClientStarted()
205213
void ReceiveServerToClientSetDisconnectReason_CustomMessage(ulong clientID, FastBufferReader reader)
206214
{
207215
reader.ReadValueSafe(out ConnectStatus status);
208-
//m_ConnectStatus = status;
216+
m_DisconnectReason.SetDisconnectReason(status);
209217
}
210218

211219
/// <summary>

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionState/ConnectedConnectionState.cs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
using System;
22
using System.Threading.Tasks;
3+
using Unity.Multiplayer.Samples.BossRoom.ApplicationLifecycle.Messages;
4+
using Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure;
35
using Unity.Netcode;
46

57
namespace Unity.Multiplayer.Samples.BossRoom
68
{
79
public class ConnectedConnectionState : ConnectionState
810
{
9-
public ConnectedConnectionState(ConnectionManager connectionManager)
11+
IPublisher<QuitGameSessionMessage> m_QuitGameSessionPublisher;
12+
IPublisher<ConnectStatus> m_ConnectStatusPublisher;
13+
14+
public ConnectedConnectionState(ConnectionManager connectionManager, IPublisher<QuitGameSessionMessage> quitGameSessionPublisher,
15+
IPublisher<ConnectStatus> connectStatusPublisher)
1016
: base(connectionManager)
1117
{
18+
m_QuitGameSessionPublisher = quitGameSessionPublisher;
19+
m_ConnectStatusPublisher = connectStatusPublisher;
1220
}
1321

1422
public override void OnClientConnected(ulong clientId)
@@ -20,37 +28,25 @@ public override void OnClientDisconnect(ulong clientId)
2028
{
2129
// This is also called on the Host when a different client disconnects. To make sure we only handle our own disconnection, verify that we are either
2230
// not a host (in which case we know this is about us) or that the clientID is the same as ours if we are the host.
23-
/*if (!NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsHost && NetworkManager.Singleton.LocalClientId == clientId)
31+
if (!NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsHost && NetworkManager.Singleton.LocalClientId == clientId)
2432
{
2533
//On a client disconnect we want to take them back to the main menu.
2634
//We have to check here in SceneManager if our active scene is the main menu, as if it is, it means we timed out rather than a raw disconnect;
27-
switch (DisconnectReason.Reason)
35+
switch (m_ConnectionManager.DisconnectReason.Reason)
2836
{
2937
case ConnectStatus.UserRequestedDisconnect:
3038
case ConnectStatus.HostEndedSession:
31-
case ConnectStatus.ServerFull:
32-
33-
m_QuitGameSessionPub.Publish(new QuitGameSessionMessage() {UserRequested = false}); // go through the normal leave flow
34-
break;
35-
case ConnectStatus.LoggedInAgain:
36-
if (m_TryToReconnectCoroutine == null)
37-
{
38-
m_QuitGameSessionPub.Publish(new QuitGameSessionMessage() {UserRequested = false}); // if not trying to reconnect, go through the normal leave flow
39-
}
40-
39+
m_QuitGameSessionPublisher.Publish(new QuitGameSessionMessage() {UserRequested = false}); // go through the normal leave flow
4140
break;
42-
case ConnectStatus.GenericDisconnect:
43-
case ConnectStatus.Undefined:
41+
default:
4442
// try reconnecting
4543
m_ConnectionManager.ChangeState(ConnectionStateType.Reconnecting);
4644
break;
47-
default:
48-
throw new NotImplementedException(DisconnectReason.Reason.ToString());
4945
}
5046

51-
m_ConnectStatusPub.Publish(DisconnectReason.Reason);
52-
DisconnectReason.Clear();
53-
}*/
47+
m_ConnectStatusPublisher.Publish(m_ConnectionManager.DisconnectReason.Reason);
48+
m_ConnectionManager.DisconnectReason.Clear();
49+
}
5450
}
5551

5652
public override void OnServerStarted()

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionState/ConnectingConnectionState.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
using System;
22
using System.Threading.Tasks;
3+
using Unity.Multiplayer.Samples.BossRoom.ApplicationLifecycle.Messages;
4+
using Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure;
35
using Unity.Netcode;
46

57
namespace Unity.Multiplayer.Samples.BossRoom
68
{
79
public class ConnectingConnectionState : ConnectionState
810
{
9-
public ConnectingConnectionState(ConnectionManager connectionManager)
11+
IPublisher<QuitGameSessionMessage> m_QuitGameSessionPublisher;
12+
IPublisher<ConnectStatus> m_ConnectStatusPublisher;
13+
14+
public ConnectingConnectionState(ConnectionManager connectionManager, IPublisher<QuitGameSessionMessage> quitGameSessionPublisher,
15+
IPublisher<ConnectStatus> connectStatusPublisher)
1016
: base(connectionManager)
1117
{
18+
m_QuitGameSessionPublisher = quitGameSessionPublisher;
19+
m_ConnectStatusPublisher = connectStatusPublisher;
1220
}
1321

1422
public override void OnClientConnected(ulong clientId)
@@ -18,6 +26,9 @@ public override void OnClientConnected(ulong clientId)
1826

1927
public override void OnClientDisconnect(ulong clientId)
2028
{
29+
m_QuitGameSessionPublisher.Publish(new QuitGameSessionMessage(){UserRequested = false}); // go through the normal leave flow
30+
m_ConnectStatusPublisher.Publish(m_ConnectionManager.DisconnectReason.Reason);
31+
m_ConnectionManager.DisconnectReason.Clear();
2132
m_ConnectionManager.ChangeState(ConnectionStateType.Offline);
2233
}
2334

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionState/HostingConnectionState.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ public override void ApprovalCheck(byte[] connectionData, ulong clientId, Networ
126126
//TODO:Netcode: In the future we expect Netcode to allow us to return more information as part of the
127127
//approval callback, so that we can provide more context on a reject. In the meantime we must provide
128128
//the extra information ourselves, and then wait a short time before manually close down the connection.
129-
ConnectionManager.SendServerToClientSetDisconnectReason(clientId, gameReturnStatus);
129+
130+
//ConnectionManager.SendServerToClientSetDisconnectReason(clientId, gameReturnStatus);
130131
//StartCoroutine(WaitToDenyApproval(connectionApprovedCallback));
131132
if (m_LobbyServiceFacade.CurrentUnityLobby != null)
132133
{

Assets/Scripts/Gameplay/ConnectionManagement/ConnectionState/OfflineConnectionState.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using System;
22
using System.Threading.Tasks;
3-
using Unity.Multiplayer.Samples.BossRoom;
4-
using Unity.Multiplayer.Samples.BossRoom.Shared.Infrastructure;
53
using Unity.Multiplayer.Samples.BossRoom.Shared.Net.UnityServices.Lobbies;
64
using Unity.Multiplayer.Samples.Utilities;
75
using Unity.Netcode;
@@ -34,12 +32,12 @@ public override void OnClientConnected(ulong clientId)
3432

3533
public override void OnClientDisconnect(ulong clientId)
3634
{
37-
throw new System.NotImplementedException();
35+
throw new NotImplementedException();
3836
}
3937

4038
public override void OnServerStarted()
4139
{
42-
throw new System.NotImplementedException();
40+
throw new NotImplementedException();
4341
}
4442

4543
public override void StartClientIP(string playerId, string playerName, string ipaddress, int port)
@@ -119,12 +117,12 @@ public override async Task StartHostLobbyAsync(string playerId, string playerNam
119117

120118
public override void OnUserRequestedShutdown()
121119
{
122-
throw new System.NotImplementedException();
120+
throw new NotImplementedException();
123121
}
124122

125123
public override void OnServerShutdown()
126124
{
127-
throw new System.NotImplementedException();
125+
throw new NotImplementedException();
128126
}
129127

130128
public override void ApprovalCheck(byte[] connectionData, ulong clientId, NetworkManager.ConnectionApprovedDelegate connectionApprovedCallback)

0 commit comments

Comments
 (0)