Skip to content

Commit 1c921a4

Browse files
committed
Added SpawnAsPlayerObject
1 parent d82feb7 commit 1c921a4

File tree

2 files changed

+78
-19
lines changed

2 files changed

+78
-19
lines changed

MLAPI/MonoBehaviours/Core/NetworkedObject.cs

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -221,44 +221,33 @@ private void OnDestroy()
221221
/// <summary>
222222
/// Spawns this GameObject across the network. Can only be called from the Server
223223
/// </summary>
224-
public void Spawn()
224+
public void Spawn(BitWriter spawnPayload = null)
225225
{
226-
if (NetworkingManager.singleton != null)
227-
SpawnManager.SpawnObject(this);
228-
}
229-
230-
public void Spawn(BitWriter spawnPayload)
231-
{
232-
if (NetworkingManager.singleton != null)
233-
SpawnManager.SpawnObject(this, null, spawnPayload);
226+
SpawnManager.SpawnObject(this, null, spawnPayload);
234227
}
235228

236229
/// <summary>
237230
/// Unspawns this GameObject and destroys it for other clients. This should be used if the object should be kept on the server
238231
/// </summary>
239232
public void UnSpawn()
240233
{
241-
if (NetworkingManager.singleton != null)
242-
SpawnManager.UnSpawnObject(this);
243-
}
234+
SpawnManager.UnSpawnObject(this);
235+
}
244236

245237
/// <summary>
246238
/// Spawns an object across the network with a given owner. Can only be called from server
247239
/// </summary>
248240
/// <param name="clientId">The clientId to own the object</param>
249-
public void SpawnWithOwnership(uint clientId)
241+
public void SpawnWithOwnership(uint clientId, BitWriter spawnPayload = null)
250242
{
251-
if (NetworkingManager.singleton != null)
252-
SpawnManager.SpawnObject(this, clientId);
243+
SpawnManager.SpawnObject(this, clientId, spawnPayload);
253244
}
254245

255-
public void SpawnWithOwnership(uint clientId, BitWriter payload)
246+
public void SpawnAsPlayerObject(uint clientId, BitWriter spawnPayload = null)
256247
{
257-
if (NetworkingManager.singleton != null)
258-
SpawnManager.SpawnObject(this, clientId, payload);
248+
SpawnManager.SpawnPlayerObject(this, clientId, spawnPayload);
259249
}
260250

261-
262251
/// <summary>
263252
/// Removes all ownership of an object from any client. Can only be called from server
264253
/// </summary>

MLAPI/NetworkingManagerComponents/Core/SpawnManager.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)