@@ -946,6 +946,37 @@ internal void ProcessClientsToDisconnect()
946946 m_ClientsToDisconnect . Clear ( ) ;
947947 }
948948
949+ /// <summary>
950+ /// The checks to find the right GlobalObjectIdHash value
951+ /// are complex enough to deserve a method that includes
952+ /// an easy to follow logical flow.
953+ /// This also makes it a quick check to determine if there
954+ /// even is a player prefab to spawn (it is valid to not
955+ /// have any player spawned upon connection).
956+ /// </summary>
957+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
958+ private ( bool IsValid , uint GlobalObjectIdHash ) GetPlayerPrefabHash ( uint ? playerPrefabHash )
959+ {
960+ if ( playerPrefabHash != null && playerPrefabHash . HasValue )
961+ {
962+ return ( true , playerPrefabHash . Value ) ;
963+ }
964+ else
965+ if ( NetworkManager . NetworkConfig . PlayerPrefab != null )
966+ {
967+ var networkObject = NetworkManager . NetworkConfig . PlayerPrefab . GetComponent < NetworkObject > ( ) ;
968+ if ( networkObject != null )
969+ {
970+ return ( true , networkObject . GlobalObjectIdHash ) ;
971+ }
972+ else
973+ {
974+ NetworkManager . Log . Error ( new Logging . Context ( LogLevel . Error , $ "Player prefab { NetworkManager . NetworkConfig . PlayerPrefab . name } has no { nameof ( NetworkObject ) } !") ) ;
975+ }
976+ }
977+ return ( false , 0 ) ;
978+ }
979+
949980 /// <summary>
950981 /// Server Side: Handles the approval of a client
951982 /// </summary>
@@ -972,10 +1003,10 @@ internal void HandleConnectionApproval(ulong ownerClientId, bool createPlayerObj
9721003 }
9731004
9741005 // Server-side spawning (only if there is a prefab hash or player prefab provided)
975- var idHashToSpawn = ( playerPrefabHash != null && playerPrefabHash . HasValue ) ? playerPrefabHash . Value : NetworkManager . NetworkConfig . PlayerPrefab != null ? NetworkManager . NetworkConfig . PlayerPrefab . GetComponent < NetworkObject > ( ) ? . GlobalObjectIdHash : null ;
976- if ( ! NetworkManager . DistributedAuthorityMode && createPlayerObject && idHashToSpawn . HasValue )
1006+ var idHashToSpawn = GetPlayerPrefabHash ( playerPrefabHash ) ;
1007+ if ( ! NetworkManager . DistributedAuthorityMode && createPlayerObject && idHashToSpawn . IsValid )
9771008 {
978- var playerObject = NetworkManager . SpawnManager . GetNetworkObjectToSpawn ( idHashToSpawn . Value , ownerClientId , playerPosition , playerRotation ) ;
1009+ var playerObject = NetworkManager . SpawnManager . GetNetworkObjectToSpawn ( idHashToSpawn . GlobalObjectIdHash , ownerClientId , playerPosition , playerRotation ) ;
9791010
9801011 if ( playerObject == null )
9811012 {
0 commit comments