@@ -1058,7 +1058,8 @@ private bool ProcessEvent()
10581058 }
10591059
10601060 // Set the disconnect event error code
1061- SetDisconnectEvent ( reader . ReadByte ( ) ) ;
1061+ var errorCode = m_UnityTransportNotificationHandler . GetDisconnectEvent ( reader . ReadByte ( ) ) ;
1062+ SetDisconnectEvent ( errorCode ) ;
10621063
10631064 m_ServerClientId = default ;
10641065 m_ReliableReceiveQueues . Remove ( clientId ) ;
@@ -1369,37 +1370,6 @@ public override void DisconnectRemoteClient(ulong clientId)
13691370 }
13701371 }
13711372
1372- private const byte k_ClosedRemoteConnection = 128 ;
1373- private const byte k_TransportShutdown = 129 ;
1374-
1375- internal const string DisconnectedMessage = "Gracefully disconnected." ;
1376- internal const string TimeoutMessage = "Connection closed due to timed out." ;
1377- internal const string MaxConnectionAttemptsMessage = "Connection closed due to maximum connection attempts reached." ;
1378- internal const string ClosedByRemoteMessage = "Connection was closed by remote endpoint." ;
1379- internal const string AuthenticationFailureMessage = "Connection closed due to authentication failure." ;
1380- internal const string ProtocolErrorMessage = "Gracefully disconnected." ;
1381- internal const string ClosedRemoteConnectionMessage = "Local transport closed the remote endpoint connection." ;
1382- internal const string TransportShutdownMessage = "The transport was shutdown." ;
1383-
1384- /// <inheritdoc/>
1385- protected override void OnCreateDisconnectEventMap ( )
1386- {
1387- // Implemented in UTP
1388-
1389- AddDisconnectEventMap ( DisconnectEvents . Disconnected , ( byte ) DisconnectReason . Default , DisconnectedMessage ) ;
1390- AddDisconnectEventMap ( DisconnectEvents . ProtocolTimeout , ( byte ) DisconnectReason . Timeout , TimeoutMessage ) ;
1391- AddDisconnectEventMap ( DisconnectEvents . MaxConnectionAttempts , ( byte ) DisconnectReason . MaxConnectionAttempts , MaxConnectionAttemptsMessage ) ;
1392- AddDisconnectEventMap ( DisconnectEvents . ClosedByRemote , ( byte ) DisconnectReason . ClosedByRemote , ClosedByRemoteMessage ) ;
1393- AddDisconnectEventMap ( DisconnectEvents . AuthenticationFailure , ( byte ) DisconnectReason . AuthenticationFailure , AuthenticationFailureMessage ) ;
1394- AddDisconnectEventMap ( DisconnectEvents . ProtocolError , ( byte ) DisconnectReason . ProtocolError , ProtocolErrorMessage ) ;
1395-
1396- // Not implemented in UTP
1397- AddDisconnectEventMap ( DisconnectEvents . ClosedRemoteConnection , k_ClosedRemoteConnection , ClosedRemoteConnectionMessage ) ;
1398- AddDisconnectEventMap ( DisconnectEvents . TransportShutdown , k_TransportShutdown , TransportShutdownMessage ) ;
1399-
1400- base . OnCreateDisconnectEventMap ( ) ;
1401- }
1402-
14031373 /// <summary>
14041374 /// Gets the current RTT for a specific client
14051375 /// </summary>
@@ -1449,30 +1419,6 @@ public NetworkEndpoint GetEndpoint(ulong clientId)
14491419 return new NetworkEndpoint ( ) ;
14501420 }
14511421
1452- /// <summary>
1453- /// Initializes the transport
1454- /// </summary>
1455- /// <param name="networkManager">The NetworkManager that initialized and owns the transport</param>
1456- public override void Initialize ( NetworkManager networkManager = null )
1457- {
1458- #if DEBUG
1459- if ( sizeof ( ulong ) != UnsafeUtility . SizeOf < NetworkConnection > ( ) )
1460- {
1461- Debug . LogWarning ( $ "Netcode connection id size { sizeof ( ulong ) } does not match UTP connection id size { UnsafeUtility . SizeOf < NetworkConnection > ( ) } !") ;
1462- return ;
1463- }
1464- #endif
1465-
1466- m_NetworkManager = networkManager ;
1467-
1468- if ( m_NetworkManager && m_NetworkManager . PortOverride . Overidden )
1469- {
1470- ConnectionData . Port = m_NetworkManager . PortOverride . Value ;
1471- }
1472-
1473- m_RealTimeProvider = m_NetworkManager ? m_NetworkManager . RealTimeProvider : new RealTimeProvider ( ) ;
1474- }
1475-
14761422 /// <summary>
14771423 /// Polls for incoming events, with an extra output parameter to report the precise time the event was received.
14781424 /// </summary>
@@ -1626,6 +1572,39 @@ public override bool StartServer()
16261572 return succeeded ;
16271573 }
16281574
1575+ private UnityTransportNotificationHandler m_UnityTransportNotificationHandler ;
1576+
1577+ /// <inheritdoc/>
1578+ protected override string OnGetDisconnectEventMessage ( DisconnectEvents disconnectEvent )
1579+ {
1580+ return m_UnityTransportNotificationHandler . GetDisconnectEventMessage ( disconnectEvent ) ;
1581+ }
1582+
1583+ /// <summary>
1584+ /// Initializes the transport
1585+ /// </summary>
1586+ /// <param name="networkManager">The NetworkManager that initialized and owns the transport</param>
1587+ public override void Initialize ( NetworkManager networkManager = null )
1588+ {
1589+ #if DEBUG
1590+ if ( sizeof ( ulong ) != UnsafeUtility . SizeOf < NetworkConnection > ( ) )
1591+ {
1592+ Debug . LogWarning ( $ "Netcode connection id size { sizeof ( ulong ) } does not match UTP connection id size { UnsafeUtility . SizeOf < NetworkConnection > ( ) } !") ;
1593+ return ;
1594+ }
1595+ #endif
1596+
1597+ m_NetworkManager = networkManager ;
1598+
1599+ if ( m_NetworkManager && m_NetworkManager . PortOverride . Overidden )
1600+ {
1601+ ConnectionData . Port = m_NetworkManager . PortOverride . Value ;
1602+ }
1603+
1604+ m_RealTimeProvider = m_NetworkManager ? m_NetworkManager . RealTimeProvider : new RealTimeProvider ( ) ;
1605+ m_UnityTransportNotificationHandler = new UnityTransportNotificationHandler ( ) ;
1606+ }
1607+
16291608 /// <summary>
16301609 /// Shuts down the transport
16311610 /// </summary>
@@ -1663,6 +1642,8 @@ public override void Shutdown()
16631642
16641643 // We must reset this to zero because UTP actually re-uses clientIds if there is a clean disconnect
16651644 m_ServerClientId = default ;
1645+
1646+ m_UnityTransportNotificationHandler = null ;
16661647 }
16671648
16681649 /// <inheritdoc cref="NetworkTransport.OnCurrentTopology"/>
@@ -1849,4 +1830,67 @@ internal static FixedString128Bytes ErrorToFixedString(int error)
18491830 }
18501831 }
18511832 }
1833+
1834+ /// <summary>
1835+ /// Handles mapping <see cref="DisconnectReason"/> to <see cref="NetworkTransport.DisconnectEvents"/> as well
1836+ /// as mapping additional disconnect event message information to each <see cref="NetworkTransport.DisconnectEvents"/>.
1837+ /// </summary>
1838+ internal class UnityTransportNotificationHandler
1839+ {
1840+ private const int k_ClosedRemoteConnection = 128 ;
1841+ private const int k_TransportShutdown = 129 ;
1842+
1843+ internal const string DisconnectedMessage = "Gracefully disconnected." ;
1844+ internal const string TimeoutMessage = "Connection closed due to timed out." ;
1845+ internal const string MaxConnectionAttemptsMessage = "Connection closed due to maximum connection attempts reached." ;
1846+ internal const string ClosedByRemoteMessage = "Connection was closed by remote endpoint." ;
1847+ internal const string AuthenticationFailureMessage = "Connection closed due to authentication failure." ;
1848+ internal const string ProtocolErrorMessage = "Gracefully disconnected." ;
1849+ internal const string ClosedRemoteConnectionMessage = "Local transport closed the remote endpoint connection." ;
1850+ internal const string TransportShutdownMessage = "The transport was shutdown." ;
1851+
1852+ private Dictionary < int , NetworkTransport . DisconnectEvents > m_DisconnectEventMap = new Dictionary < int , NetworkTransport . DisconnectEvents > ( ) ;
1853+ private Dictionary < NetworkTransport . DisconnectEvents , string > m_DisconnectEventMessageMap = new Dictionary < NetworkTransport . DisconnectEvents , string > ( ) ;
1854+
1855+ internal NetworkTransport . DisconnectEvents GetDisconnectEvent ( int disconnectEventId )
1856+ {
1857+ return m_DisconnectEventMap . ContainsKey ( disconnectEventId ) ? m_DisconnectEventMap [ disconnectEventId ] : NetworkTransport . DisconnectEvents . Disconnected ;
1858+ }
1859+
1860+ public string GetDisconnectEventMessage ( NetworkTransport . DisconnectEvents disconnectEvent )
1861+ {
1862+ return string . Empty ;
1863+ }
1864+
1865+ public void ClosingRemoteConnection ( )
1866+ {
1867+
1868+ }
1869+
1870+ private void AddDisconnectEventMap ( NetworkTransport . DisconnectEvents disconnectEvent , int disconnectReason , string message )
1871+ {
1872+ m_DisconnectEventMap . Add ( disconnectReason , disconnectEvent ) ;
1873+ m_DisconnectEventMessageMap . Add ( disconnectEvent , message ) ;
1874+ }
1875+
1876+ private void AddDisconnectEventMap ( NetworkTransport . DisconnectEvents disconnectEvent , DisconnectReason disconnectReason , string message )
1877+ {
1878+ AddDisconnectEventMap ( disconnectEvent , ( int ) disconnectReason , message ) ;
1879+ }
1880+
1881+ public UnityTransportNotificationHandler ( )
1882+ {
1883+ // Implemented in UTP
1884+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . Disconnected , DisconnectReason . Default , DisconnectedMessage ) ;
1885+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . ProtocolTimeout , DisconnectReason . Timeout , TimeoutMessage ) ;
1886+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . MaxConnectionAttempts , DisconnectReason . MaxConnectionAttempts , MaxConnectionAttemptsMessage ) ;
1887+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . ClosedByRemote , DisconnectReason . ClosedByRemote , ClosedByRemoteMessage ) ;
1888+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . AuthenticationFailure , DisconnectReason . AuthenticationFailure , AuthenticationFailureMessage ) ;
1889+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . ProtocolError , DisconnectReason . ProtocolError , ProtocolErrorMessage ) ;
1890+
1891+ // Not implemented in UTP
1892+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . ClosedRemoteConnection , k_ClosedRemoteConnection , ClosedRemoteConnectionMessage ) ;
1893+ AddDisconnectEventMap ( NetworkTransport . DisconnectEvents . TransportShutdown , k_TransportShutdown , TransportShutdownMessage ) ;
1894+ }
1895+ }
18521896}
0 commit comments