Skip to content

Commit e8ce7d0

Browse files
authored
Merge pull request #184 from jaglitegrann/feat/readd-destroyWithScene-setting
Readd DestroyWithScene
2 parents bc73083 + 5b9d5cd commit e8ce7d0

File tree

5 files changed

+44
-16
lines changed

5 files changed

+44
-16
lines changed

MLAPI/MonoBehaviours/Core/NetworkedObject.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ internal set
126126
/// Gets if the object is a SceneObject, null if it's not yet spawned but is a scene object.
127127
/// </summary>
128128
public bool? IsSceneObject { get; internal set; }
129+
/// <summary>
130+
/// Gets whether or not the object should be automatically removed when the scene is unloaded.
131+
/// </summary>
132+
public bool DestroyWithScene { get; internal set; }
129133

130134
/// <summary>
131135
/// Delegate type for checking visibility
@@ -226,12 +230,13 @@ private void OnDestroy()
226230
/// Spawns this GameObject across the network. Can only be called from the Server
227231
/// </summary>
228232
/// <param name="spawnPayload">The writer containing the spawn payload</param>
229-
public void Spawn(Stream spawnPayload = null)
233+
/// <param name="destroyWithScene">Should the object be destroyd when the scene is changed</param>
234+
public void Spawn(Stream spawnPayload = null, bool destroyWithScene = false)
230235
{
231236
if (spawnPayload != null)
232237
spawnPayload.Position = 0;
233238

234-
SpawnManager.SpawnNetworkedObjectLocally(this, SpawnManager.GetNetworkObjectId(), false, false, NetworkingManager.Singleton.ServerClientId, spawnPayload, spawnPayload != null, spawnPayload == null ? 0 : (int)spawnPayload.Length, false);
239+
SpawnManager.SpawnNetworkedObjectLocally(this, SpawnManager.GetNetworkObjectId(), false, false, NetworkingManager.Singleton.ServerClientId, spawnPayload, spawnPayload != null, spawnPayload == null ? 0 : (int)spawnPayload.Length, false, destroyWithScene);
235240

236241
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
237242
{
@@ -261,7 +266,7 @@ public void SpawnWithOwnership(uint clientId, Stream spawnPayload = null, bool d
261266
if (spawnPayload != null)
262267
spawnPayload.Position = 0;
263268

264-
SpawnManager.SpawnNetworkedObjectLocally(this, SpawnManager.GetNetworkObjectId(), false, false, clientId, spawnPayload, spawnPayload != null, spawnPayload == null ? 0 : (int)spawnPayload.Length, false);
269+
SpawnManager.SpawnNetworkedObjectLocally(this, SpawnManager.GetNetworkObjectId(), false, false, clientId, spawnPayload, spawnPayload != null, spawnPayload == null ? 0 : (int)spawnPayload.Length, false, destroyWithScene);
265270

266271
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
267272
{
@@ -277,12 +282,13 @@ public void SpawnWithOwnership(uint clientId, Stream spawnPayload = null, bool d
277282
/// </summary>
278283
/// <param name="clientId">The clientId whos player object this is</param>
279284
/// <param name="spawnPayload">The writer containing the spawn payload</param>
280-
public void SpawnAsPlayerObject(uint clientId, Stream spawnPayload = null)
285+
/// <param name="destroyWithScene">Should the object be destroyd when the scene is changed</param>
286+
public void SpawnAsPlayerObject(uint clientId, Stream spawnPayload = null, bool destroyWithScene = false)
281287
{
282288
if (spawnPayload != null)
283289
spawnPayload.Position = 0;
284290

285-
SpawnManager.SpawnNetworkedObjectLocally(this, SpawnManager.GetNetworkObjectId(), false, true, clientId, spawnPayload, spawnPayload != null, spawnPayload == null ? 0 : (int)spawnPayload.Length, false);
291+
SpawnManager.SpawnNetworkedObjectLocally(this, SpawnManager.GetNetworkObjectId(), false, true, clientId, spawnPayload, spawnPayload != null, spawnPayload == null ? 0 : (int)spawnPayload.Length, false, destroyWithScene);
286292

287293
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
288294
{

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ public void StartHost(Vector3? position = null, Quaternion? rotation = null, ulo
555555
ConnectedClientsList.Add(ConnectedClients[hostClientId]);
556556

557557
NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(false, 0, (prefabHash == null ? NetworkConfig.PlayerPrefabHash : prefabHash.Value), position, rotation);
558-
SpawnManager.SpawnNetworkedObjectLocally(netObject, SpawnManager.GetNetworkObjectId(), false, true, hostClientId, payloadStream, payloadStream != null, payloadStream == null ? 0 : (int)payloadStream.Length, false);
558+
SpawnManager.SpawnNetworkedObjectLocally(netObject, SpawnManager.GetNetworkObjectId(), false, true, hostClientId, payloadStream, payloadStream != null, payloadStream == null ? 0 : (int)payloadStream.Length, false, false);
559559

560560
if (netObject.CheckObjectVisibility == null || netObject.CheckObjectVisibility(hostClientId))
561561
{
@@ -1054,7 +1054,7 @@ internal void HandleApproval(uint clientId, ulong? prefabHash, bool approved, Ve
10541054
ConnectedClientsList.Add(client);
10551055

10561056
NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(false, 0, (prefabHash == null ? NetworkConfig.PlayerPrefabHash : prefabHash.Value), position, rotation);
1057-
SpawnManager.SpawnNetworkedObjectLocally(netObject, SpawnManager.GetNetworkObjectId(), false, true, clientId, null, false, 0, false);
1057+
SpawnManager.SpawnNetworkedObjectLocally(netObject, SpawnManager.GetNetworkObjectId(), false, true, clientId, null, false, 0, false, false);
10581058

10591059
ConnectedClients[clientId].PlayerObject = netObject;
10601060

@@ -1109,6 +1109,8 @@ internal void HandleApproval(uint clientId, ulong? prefabHash, bool approved, Ve
11091109
}
11101110
}
11111111

1112+
writer.WriteBool(_observedObjects[i].DestroyWithScene);
1113+
11121114
writer.WriteSinglePacked(_observedObjects[i].transform.position.x);
11131115
writer.WriteSinglePacked(_observedObjects[i].transform.position.y);
11141116
writer.WriteSinglePacked(_observedObjects[i].transform.position.z);
@@ -1153,6 +1155,8 @@ internal void HandleApproval(uint clientId, ulong? prefabHash, bool approved, Ve
11531155
writer.WriteUInt64Packed(prefabHash == null ? NetworkConfig.PlayerPrefabHash : prefabHash.Value);
11541156
}
11551157

1158+
writer.WriteBool(false); //Object won't have DestroyWithScene enabled.
1159+
11561160
writer.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.x);
11571161
writer.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.y);
11581162
writer.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.z);

MLAPI/NetworkingManagerComponents/Core/InternalMessageHandler.Receive.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,11 +260,13 @@ void DelayedSpawnAction(Stream continuationStream)
260260
}
261261
}
262262

263+
bool destroyWithScene = continuationReader.ReadBool();
264+
263265
Vector3 pos = new Vector3(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked());
264266
Quaternion rot = Quaternion.Euler(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked());
265267

266268
NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(softSync, instanceId, prefabHash, pos, rot);
267-
SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, continuationStream, false, 0, true);
269+
SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, continuationStream, false, 0, true, destroyWithScene);
268270
}
269271

270272
NetworkingManager.Singleton.IsConnectedClient = true;
@@ -334,14 +336,16 @@ internal static void HandleAddObject(uint clientId, Stream stream, int channelId
334336
}
335337
}
336338

339+
bool destroyWithScene = reader.ReadBool();
340+
337341
Vector3 pos = new Vector3(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
338342
Quaternion rot = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
339343

340344
bool hasPayload = reader.ReadBool();
341345
int payLoadLength = hasPayload ? reader.ReadInt32Packed() : 0;
342346

343347
NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(softSync, instanceId, prefabHash, pos, rot);
344-
SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, stream, hasPayload, payLoadLength, true);
348+
SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, stream, hasPayload, payLoadLength, true, destroyWithScene);
345349

346350
/*
347351
NetworkedObject netObject = SpawnManager.CreateSpawnedObject(SpawnManager.GetNetworkedPrefabIndexOfHash(prefabHash), networkId, ownerId, isPlayerObject,
@@ -440,6 +444,8 @@ internal static void HandleAddObjects(uint clientId, Stream stream, int channelI
440444
}
441445
}
442446

447+
bool destroyWithScene = reader.ReadBool();
448+
443449
Vector3 pos = new Vector3(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
444450
Quaternion rot = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
445451

@@ -449,7 +455,7 @@ internal static void HandleAddObjects(uint clientId, Stream stream, int channelI
449455
*/
450456

451457
NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(softSync, instanceId, prefabHash, pos, rot);
452-
SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, stream, false, 0, true);
458+
SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, stream, false, 0, true, destroyWithScene);
453459
}
454460
}
455461
}

MLAPI/NetworkingManagerComponents/Core/NetworkSceneManager.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ private static void OnSceneUnloadServer(AsyncOperation operation, Guid switchSce
178178
{
179179
if (networkedObjects[i].IsSceneObject == null)
180180
{
181-
SpawnManager.SpawnNetworkedObjectLocally(networkedObjects[i], SpawnManager.GetNetworkObjectId(), true, false, NetworkingManager.Singleton.ServerClientId, null, false, 0, false);
181+
SpawnManager.SpawnNetworkedObjectLocally(networkedObjects[i], SpawnManager.GetNetworkObjectId(), true, false, NetworkingManager.Singleton.ServerClientId, null, false, 0, false, true);
182182

183183
newSceneObjects.Add(networkedObjects[i]);
184184
}
@@ -218,6 +218,8 @@ private static void OnSceneUnloadServer(AsyncOperation operation, Guid switchSce
218218

219219
writer.WriteUInt64Packed(newSceneObjects[i].PrefabHash);
220220

221+
writer.WriteBool(newSceneObjects[i].DestroyWithScene);
222+
221223
writer.WriteSinglePacked(newSceneObjects[i].transform.position.x);
222224
writer.WriteSinglePacked(newSceneObjects[i].transform.position.y);
223225
writer.WriteSinglePacked(newSceneObjects[i].transform.position.z);
@@ -236,6 +238,8 @@ private static void OnSceneUnloadServer(AsyncOperation operation, Guid switchSce
236238

237239
writer.WriteUInt64Packed(newSceneObjects[i].NetworkedInstanceId);
238240

241+
writer.WriteBool(newSceneObjects[i].DestroyWithScene);
242+
239243
newSceneObjects[i].WriteNetworkedVarData(stream, NetworkingManager.Singleton.ConnectedClientsList[j].ClientId);
240244
}
241245
}
@@ -279,11 +283,13 @@ private static void OnSceneUnloadClient(AsyncOperation operation, Guid switchSce
279283

280284
ulong prefabHash = reader.ReadUInt64Packed();
281285

286+
bool destroyWithScene = reader.ReadBool();
287+
282288
Vector3 position = new Vector3(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
283289
Quaternion rotation = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
284290

285291
NetworkedObject networkedObject = SpawnManager.CreateLocalNetworkedObject(false, 0, prefabHash, position, rotation);
286-
SpawnManager.SpawnNetworkedObjectLocally(networkedObject, networkId, true, isPlayerObject, owner, objectStream, false, 0, true);
292+
SpawnManager.SpawnNetworkedObjectLocally(networkedObject, networkId, true, isPlayerObject, owner, objectStream, false, 0, true, destroyWithScene);
287293
}
288294
}
289295
}
@@ -305,8 +311,10 @@ private static void OnSceneUnloadClient(AsyncOperation operation, Guid switchSce
305311

306312
ulong instanceId = reader.ReadUInt64Packed();
307313

314+
bool destroyWithScene = reader.ReadBool();
315+
308316
NetworkedObject networkedObject = SpawnManager.CreateLocalNetworkedObject(true, instanceId, 0, null, null);
309-
SpawnManager.SpawnNetworkedObjectLocally(networkedObject, networkId, true, isPlayerObject, owner, objectStream, false, 0, true);
317+
SpawnManager.SpawnNetworkedObjectLocally(networkedObject, networkId, true, isPlayerObject, owner, objectStream, false, 0, true, destroyWithScene);
310318
}
311319
}
312320
}

MLAPI/NetworkingManagerComponents/Core/SpawnManager.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ internal static NetworkedObject CreateLocalNetworkedObject(bool softCreate, ulon
255255
}
256256

257257
// Ran on both server and client
258-
internal static void SpawnNetworkedObjectLocally(NetworkedObject netObject, ulong networkId, bool sceneObject, bool playerObject, uint ownerClientId, Stream dataStream, bool readPayload, int payloadLength, bool readNetworkedVar)
258+
internal static void SpawnNetworkedObjectLocally(NetworkedObject netObject, ulong networkId, bool sceneObject, bool playerObject, uint ownerClientId, Stream dataStream, bool readPayload, int payloadLength, bool readNetworkedVar, bool destroyWithScene)
259259
{
260260
if (netObject == null)
261261
{
@@ -277,6 +277,8 @@ internal static void SpawnNetworkedObjectLocally(NetworkedObject netObject, ulon
277277
netObject.IsSceneObject = sceneObject;
278278
netObject.NetworkId = networkId;
279279

280+
netObject.DestroyWithScene = sceneObject || destroyWithScene;
281+
280282
netObject.OwnerClientId = ownerClientId;
281283
netObject.IsPlayerObject = playerObject;
282284

@@ -340,6 +342,8 @@ internal static void SendSpawnCallForObject(uint clientId, NetworkedObject netOb
340342
}
341343
}
342344

345+
writer.WriteBool(netObject.DestroyWithScene);
346+
343347
writer.WriteSinglePacked(netObject.transform.position.x);
344348
writer.WriteSinglePacked(netObject.transform.position.y);
345349
writer.WriteSinglePacked(netObject.transform.position.z);
@@ -384,7 +388,7 @@ internal static void ServerDestroySpawnedSceneObjects()
384388
{
385389
for (int i = 0; i < SpawnedObjectsList.Count; i++)
386390
{
387-
if (SpawnedObjectsList[i].IsSceneObject != null && SpawnedObjectsList[i].IsSceneObject == true)
391+
if ((SpawnedObjectsList[i].IsSceneObject != null && SpawnedObjectsList[i].IsSceneObject == true) || SpawnedObjectsList[i].DestroyWithScene)
388392
{
389393
if (customDestroyHandlers.ContainsKey(SpawnedObjectsList[i].PrefabHash))
390394
{
@@ -449,7 +453,7 @@ internal static void ServerSpawnSceneObjectsOnStartSweep()
449453
{
450454
if (networkedObjects[i].IsSceneObject == null)
451455
{
452-
SpawnNetworkedObjectLocally(networkedObjects[i], GetNetworkObjectId(), true, false, NetworkingManager.Singleton.ServerClientId, null, false, 0, false);
456+
SpawnNetworkedObjectLocally(networkedObjects[i], GetNetworkObjectId(), true, false, NetworkingManager.Singleton.ServerClientId, null, false, 0, false, true);
453457
}
454458
}
455459
}

0 commit comments

Comments
 (0)