| 1516 | } |
| 1517 | |
| 1518 | void NetworkReplicator::DespawnObject(ScriptingObject* obj) |
| 1519 | { |
| 1520 | if (!obj || NetworkManager::IsOffline()) |
| 1521 | return; |
| 1522 | PROFILE_MEM(Networking); |
| 1523 | ScopeLock lock(ObjectsLock); |
| 1524 | const auto it = Objects.Find(obj->GetID()); |
| 1525 | if (it == Objects.End()) |
| 1526 | { |
| 1527 | // Special case if we're just spawning this object |
| 1528 | for (int32 i = 0; i < SpawnQueue.Count(); i++) |
| 1529 | { |
| 1530 | auto& item = SpawnQueue[i]; |
| 1531 | if (item.Object == obj) |
| 1532 | { |
| 1533 | SpawnQueue.RemoveAt(i); |
| 1534 | DeleteNetworkObject(obj); |
| 1535 | break; |
| 1536 | } |
| 1537 | } |
| 1538 | return; |
| 1539 | } |
| 1540 | auto& item = it->Item; |
| 1541 | if (item.Object != obj || !item.Spawned || item.OwnerClientId != NetworkManager::LocalClientId) |
| 1542 | return; |
| 1543 | |
| 1544 | // Register for despawning (batched during update) |
| 1545 | auto& despawn = DespawnQueue.AddOne(); |
| 1546 | despawn.Id = obj->GetID(); |
| 1547 | if (item.TargetClientIds.IsValid()) |
| 1548 | { |
| 1549 | despawn.Targets = item.TargetClientIds; |
| 1550 | } |
| 1551 | else |
| 1552 | { |
| 1553 | // Snapshot current recipients to avoid sending despawn to clients that connect later (and never got the spawn) |
| 1554 | Array<uint32, InlinedAllocation<8>> clientIds; |
| 1555 | for (const NetworkClient* client : NetworkManager::Clients) |
| 1556 | { |
| 1557 | if (client->State == NetworkConnectionState::Connected && client->ClientId != item.OwnerClientId) |
| 1558 | clientIds.Add(client->ClientId); |
| 1559 | } |
| 1560 | despawn.Targets.Copy(clientIds); |
| 1561 | } |
| 1562 | |
| 1563 | // Prevent spawning |
| 1564 | for (int32 i = 0; i < SpawnQueue.Count(); i++) |
| 1565 | { |
| 1566 | if (SpawnQueue[i].Object == obj) |
| 1567 | { |
| 1568 | SpawnQueue.RemoveAt(i); |
| 1569 | break; |
| 1570 | } |
| 1571 | } |
| 1572 | |
| 1573 | // Delete object locally |
| 1574 | NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Despawn object {}", item.ObjectId); |
| 1575 | DespawnedObjects.Add(item.ObjectId); |
nothing calls this directly
no test coverage detected