Skip to content

feat: OnConnectionEvent callback usage in project and Utilities package [MTTB-1147] #907

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 7, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions Assets/Scripts/ConnectionManagement/ConnectionManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ void Start()

m_CurrentState = m_Offline;

NetworkManager.OnClientConnectedCallback += OnClientConnectedCallback;
NetworkManager.OnClientDisconnectCallback += OnClientDisconnectCallback;
NetworkManager.OnConnectionEvent += OnConnectionEvent;
NetworkManager.OnServerStarted += OnServerStarted;
NetworkManager.ConnectionApprovalCallback += ApprovalCheck;
NetworkManager.OnTransportFailure += OnTransportFailure;
Expand All @@ -103,8 +102,7 @@ void Start()

void OnDestroy()
{
NetworkManager.OnClientConnectedCallback -= OnClientConnectedCallback;
NetworkManager.OnClientDisconnectCallback -= OnClientDisconnectCallback;
NetworkManager.OnConnectionEvent -= OnConnectionEvent;
NetworkManager.OnServerStarted -= OnServerStarted;
NetworkManager.ConnectionApprovalCallback -= ApprovalCheck;
NetworkManager.OnTransportFailure -= OnTransportFailure;
Expand All @@ -123,14 +121,17 @@ internal void ChangeState(ConnectionState nextState)
m_CurrentState.Enter();
}

void OnClientDisconnectCallback(ulong clientId)
void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
m_CurrentState.OnClientDisconnect(clientId);
}

void OnClientConnectedCallback(ulong clientId)
{
m_CurrentState.OnClientConnected(clientId);
switch (connectionEventData.EventType)
{
case ConnectionEvent.ClientConnected:
m_CurrentState.OnClientConnected(connectionEventData.ClientId);
break;
case ConnectionEvent.ClientDisconnected:
m_CurrentState.OnClientDisconnect(connectionEventData.ClientId);
break;
}
}

void OnServerStarted()
Expand Down
15 changes: 9 additions & 6 deletions Assets/Scripts/Gameplay/GameState/ServerBossRoomState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void OnNetworkSpawn()
m_PersistentGameState.Reset();
m_LifeStateChangedEventMessageSubscriber.Subscribe(OnLifeStateChangedEventMessage);

NetworkManager.Singleton.OnClientDisconnectCallback += OnClientDisconnect;
NetworkManager.Singleton.OnConnectionEvent += OnConnectionEvent;
NetworkManager.Singleton.SceneManager.OnLoadEventCompleted += OnLoadEventCompleted;
NetworkManager.Singleton.SceneManager.OnSynchronizeComplete += OnSynchronizeComplete;

Expand All @@ -93,7 +93,7 @@ void OnNetworkDespawn()
m_LifeStateChangedEventMessageSubscriber.Unsubscribe(OnLifeStateChangedEventMessage);
}

NetworkManager.Singleton.OnClientDisconnectCallback -= OnClientDisconnect;
NetworkManager.Singleton.OnConnectionEvent -= OnConnectionEvent;
NetworkManager.Singleton.SceneManager.OnLoadEventCompleted -= OnLoadEventCompleted;
NetworkManager.Singleton.SceneManager.OnSynchronizeComplete -= OnSynchronizeComplete;
}
Expand Down Expand Up @@ -138,12 +138,15 @@ void OnLoadEventCompleted(string sceneName, LoadSceneMode loadSceneMode, List<ul
}
}

void OnClientDisconnect(ulong clientId)
void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
if (clientId != NetworkManager.Singleton.LocalClientId)
if (connectionEventData.EventType == ConnectionEvent.ClientDisconnected)
{
// If a client disconnects, check for game over in case all other players are already down
StartCoroutine(WaitToCheckForGameOver());
if (connectionEventData.ClientId != networkManager.LocalClientId)
{
// If a client disconnects, check for game over in case all other players are already down
StartCoroutine(WaitToCheckForGameOver());
}
}
}

Expand Down
33 changes: 18 additions & 15 deletions Assets/Scripts/Gameplay/GameState/ServerCharSelectState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,11 +184,11 @@ IEnumerator WaitToEndSession()
SceneLoaderWrapper.Instance.LoadScene("BossRoom", useNetworkSceneManager: true);
}

public void OnNetworkDespawn()
void OnNetworkDespawn()
{
if (NetworkManager.Singleton)
{
NetworkManager.Singleton.OnClientDisconnectCallback -= OnClientDisconnectCallback;
NetworkManager.Singleton.OnConnectionEvent -= OnConnectionEvent;
NetworkManager.Singleton.SceneManager.OnSceneEvent -= OnSceneEvent;
}
if (networkCharSelection)
Expand All @@ -197,15 +197,15 @@ public void OnNetworkDespawn()
}
}

public void OnNetworkSpawn()
void OnNetworkSpawn()
{
if (!NetworkManager.Singleton.IsServer)
{
enabled = false;
}
else
{
NetworkManager.Singleton.OnClientDisconnectCallback += OnClientDisconnectCallback;
NetworkManager.Singleton.OnConnectionEvent += OnConnectionEvent;
networkCharSelection.OnClientChangedSeat += OnClientChangedSeat;

NetworkManager.Singleton.SceneManager.OnSceneEvent += OnSceneEvent;
Expand Down Expand Up @@ -276,22 +276,25 @@ void SeatNewPlayer(ulong clientId)
}
}

void OnClientDisconnectCallback(ulong clientId)
void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
// clear this client's PlayerNumber and any associated visuals (so other players know they're gone).
for (int i = 0; i < networkCharSelection.sessionPlayers.Count; ++i)
if (connectionEventData.EventType == ConnectionEvent.ClientDisconnected)
{
if (networkCharSelection.sessionPlayers[i].ClientId == clientId)
// clear this client's PlayerNumber and any associated visuals (so other players know they're gone).
for (int i = 0; i < networkCharSelection.sessionPlayers.Count; ++i)
{
networkCharSelection.sessionPlayers.RemoveAt(i);
break;
if (networkCharSelection.sessionPlayers[i].ClientId == connectionEventData.ClientId)
{
networkCharSelection.sessionPlayers.RemoveAt(i);
break;
}
}
}

if (!networkCharSelection.IsSessionClosed.Value)
{
// If the Session is not already closing, close if the remaining players are all ready
CloseSessionIfReady();
if (!networkCharSelection.IsSessionClosed.Value)
{
// If the Session is not already closing, close if the remaining players are all ready
CloseSessionIfReady();
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public NetworkedMessageChannel()
void InjectDependencies(NetworkManager networkManager)
{
m_NetworkManager = networkManager;
m_NetworkManager.OnClientConnectedCallback += OnClientConnected;
m_NetworkManager.OnConnectionEvent += OnConnectionEvent;
if (m_NetworkManager.IsListening)
{
RegisterHandler();
Expand All @@ -40,14 +40,18 @@ public override void Dispose()
if (m_NetworkManager != null && m_NetworkManager.CustomMessagingManager != null)
{
m_NetworkManager.CustomMessagingManager.UnregisterNamedMessageHandler(m_Name);
m_NetworkManager.OnConnectionEvent -= OnConnectionEvent;
}
}
base.Dispose();
}

void OnClientConnected(ulong clientId)
void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
RegisterHandler();
if (connectionEventData.EventType == ConnectionEvent.ClientConnected)
{
RegisterHandler();
}
}

void RegisterHandler()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,17 +69,14 @@ public override void OnNetworkSpawn()
{
if (IsServer)
{
NetworkManager.OnClientConnectedCallback += AddTracker;
NetworkManager.OnClientDisconnectCallback += RemoveTracker;
AddTracker(NetworkManager.LocalClientId);
NetworkManager.OnConnectionEvent += OnConnectionEvent;
}
}
public override void OnNetworkDespawn()
{
if (IsServer)
{
NetworkManager.OnClientConnectedCallback -= AddTracker;
NetworkManager.OnClientDisconnectCallback -= RemoveTracker;
NetworkManager.OnConnectionEvent -= OnConnectionEvent;
}
ProgressTrackers.Clear();
onTrackersUpdated?.Invoke();
Expand Down Expand Up @@ -122,6 +119,26 @@ void ClientUpdateTrackersRpc()
}
onTrackersUpdated?.Invoke();
}

void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
if (IsServer)
{
switch (connectionEventData.EventType)
{
case ConnectionEvent.ClientConnected:
{
AddTracker(connectionEventData.ClientId);
break;
}
case ConnectionEvent.ClientDisconnected:
{
RemoveTracker(connectionEventData.ClientId);
break;
}
}
}
}

void AddTracker(ulong clientId)
{
Expand All @@ -141,9 +158,7 @@ void RemoveTracker(ulong clientId)
{
if (ProgressTrackers.ContainsKey(clientId))
{
var tracker = ProgressTrackers[clientId];
ProgressTrackers.Remove(clientId);
tracker.NetworkObject.Despawn();
ClientUpdateTrackersRpc();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public override void OnNetworkSpawn()
{
// Adding this to remove all pending references to a specific client when they disconnect, since objects
// that are destroyed do not generate OnTriggerExit events.
NetworkManager.OnClientDisconnectCallback += RemovePlayer;
NetworkManager.OnConnectionEvent += OnConnectionEvent;

NetworkManager.SceneManager.OnSceneEvent += OnSceneEvent;
m_PlayersInTrigger = new List<ulong>();
Expand All @@ -65,7 +65,7 @@ public override void OnNetworkDespawn()
{
if (IsServer)
{
NetworkManager.OnClientDisconnectCallback -= RemovePlayer;
NetworkManager.OnConnectionEvent -= OnConnectionEvent;
NetworkManager.SceneManager.OnSceneEvent -= OnSceneEvent;
}
}
Expand Down Expand Up @@ -136,11 +136,14 @@ void FixedUpdate()
}
}

void RemovePlayer(ulong clientId)
void OnConnectionEvent(NetworkManager networkManager, ConnectionEventData connectionEventData)
{
// remove all references to this clientId. There could be multiple references if a single client owns
// multiple NetworkObjects with the m_PlayerTag, or if this script's GameObject has overlapping colliders
while (m_PlayersInTrigger.Remove(clientId)) { }
if (connectionEventData.EventType == ConnectionEvent.ClientDisconnected)
{
// remove all references to this clientId. There could be multiple references if a single client owns
// multiple NetworkObjects with the m_PlayerTag, or if this script's GameObject has overlapping colliders
while (m_PlayersInTrigger.Remove(connectionEventData.ClientId)) { }
}
}

IEnumerator WaitToUnloadCoroutine()
Expand Down