@@ -208,6 +208,76 @@ internal static void UnSpawnObject(NetworkedObject netObject)
208
208
OnDestroyObject ( netObject . networkId , false ) ;
209
209
}
210
210
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
+
211
281
internal static void SpawnObject ( NetworkedObject netObject , uint ? clientOwnerId = null , BitWriter payload = null )
212
282
{
213
283
if ( netObject . isSpawned )
0 commit comments