@@ -208,6 +208,76 @@ internal static void UnSpawnObject(NetworkedObject netObject)
208208 OnDestroyObject ( netObject . networkId , false ) ;
209209 }
210210
211+ //Server only
212+ internal static void SpawnPlayerObject ( NetworkedObject netObject , uint clientId , BitWriter payload = null )
213+ {
214+ if ( netObject . isSpawned )
215+ {
216+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Object already spawned" ) ;
217+ return ;
218+ }
219+ else if ( ! netManager . isServer )
220+ {
221+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Only server can spawn objects" ) ;
222+ return ;
223+ }
224+ else if ( ! netManager . NetworkConfig . NetworkPrefabIds . ContainsKey ( netObject . NetworkedPrefabName ) )
225+ {
226+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "The prefab name " + netObject . NetworkedPrefabName + " does not exist as a networkedPrefab" ) ;
227+ return ;
228+ }
229+ else if ( ! netManager . NetworkConfig . HandleObjectSpawning )
230+ {
231+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "NetworkConfig is set to not handle object spawning" ) ;
232+ return ;
233+ }
234+ else if ( netManager . connectedClients [ clientId ] . PlayerObject != null )
235+ {
236+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Client already have a player object" ) ;
237+ return ;
238+ }
239+ uint netId = GetNetworkObjectId ( ) ;
240+ netObject . networkId = netId ;
241+ spawnedObjects . Add ( netId , netObject ) ;
242+ netObject . _isSpawned = true ;
243+ netObject . sceneObject = false ;
244+ netObject . _isPlayerObject = true ;
245+ netManager . connectedClients [ clientId ] . PlayerObject = netObject . gameObject ;
246+
247+ if ( payload == null ) netObject . InvokeBehaviourNetworkSpawn ( null ) ;
248+ else using ( BitReader payloadReader = BitReader . Get ( payload . Finalize ( ) ) ) netObject . InvokeBehaviourNetworkSpawn ( payloadReader ) ;
249+
250+ foreach ( var client in netManager . connectedClients )
251+ {
252+ using ( BitWriter writer = BitWriter . Get ( ) )
253+ {
254+ writer . WriteBool ( true ) ;
255+ writer . WriteUInt ( netObject . NetworkId ) ;
256+ writer . WriteUInt ( netObject . OwnerClientId ) ;
257+ writer . WriteInt ( netManager . NetworkConfig . NetworkPrefabIds [ netObject . NetworkedPrefabName ] ) ;
258+ writer . WriteBool ( netObject . sceneObject == null ? true : netObject . sceneObject . Value ) ;
259+ writer . WriteBool ( netObject . observers . Contains ( client . Key ) ) ;
260+
261+ writer . WriteFloat ( netObject . transform . position . x ) ;
262+ writer . WriteFloat ( netObject . transform . position . y ) ;
263+ writer . WriteFloat ( netObject . transform . position . z ) ;
264+
265+ writer . WriteFloat ( netObject . transform . rotation . eulerAngles . x ) ;
266+ writer . WriteFloat ( netObject . transform . rotation . eulerAngles . y ) ;
267+ writer . WriteFloat ( netObject . transform . rotation . eulerAngles . z ) ;
268+
269+ writer . WriteBool ( payload != null ) ;
270+
271+ if ( netObject . observers . Contains ( client . Key ) )
272+ netObject . WriteFormattedSyncedVarData ( writer ) ;
273+
274+ if ( payload != null ) writer . WriteWriter ( payload ) ;
275+
276+ InternalMessageHandler . Send ( client . Key , "MLAPI_ADD_OBJECT" , "MLAPI_INTERNAL" , writer , null ) ;
277+ }
278+ }
279+ }
280+
211281 internal static void SpawnObject ( NetworkedObject netObject , uint ? clientOwnerId = null , BitWriter payload = null )
212282 {
213283 if ( netObject . isSpawned )
0 commit comments