diff --git a/Source/Engine/Networking/NetworkReplicator.cpp b/Source/Engine/Networking/NetworkReplicator.cpp index f87b53bcf..b5d277f67 100644 --- a/Source/Engine/Networking/NetworkReplicator.cpp +++ b/Source/Engine/Networking/NetworkReplicator.cpp @@ -269,7 +269,6 @@ void NetworkReplicator::AddObject(ScriptingObject* obj, ScriptingObject* parent) { if (!obj || NetworkManager::State == NetworkConnectionState::Offline) return; - CHECK(parent && parent != obj); ScopeLock lock(ObjectsLock); if (Objects.Contains(obj)) return; @@ -278,11 +277,11 @@ void NetworkReplicator::AddObject(ScriptingObject* obj, ScriptingObject* parent) NetworkReplicatedObject item; item.Object = obj; item.ObjectId = obj->GetID(); - item.ParentId = parent->GetID(); + item.ParentId = parent ? parent->GetID() : Guid::Empty; item.OwnerClientId = NetworkManager::ServerClientId; // Server owns objects by default item.Role = NetworkManager::IsClient() ? NetworkObjectRole::Replicated : NetworkObjectRole::OwnedAuthoritative; #if NETWORK_REPLICATOR_DEBUG_LOG - LOG(Info, "[NetworkReplicator] Add new object {}:{}, parent {}:{}", item.ToString(), obj->GetType().ToString(), item.ParentId.ToString(), parent->GetType().ToString()); + LOG(Info, "[NetworkReplicator] Add new object {}:{}, parent {}:{}", item.ToString(), obj->GetType().ToString(), item.ParentId.ToString(), parent ? parent->GetType().ToString() : String::Empty); #endif Objects.Add(MoveTemp(item)); } @@ -296,7 +295,7 @@ void NetworkReplicator::SpawnObject(ScriptingObject* obj) if (it == Objects.End()) { // Ensure that object is added to the replication locally - AddObject(obj, nullptr); + AddObject(obj); it = Objects.Find(obj->GetID()); } @@ -660,6 +659,8 @@ void NetworkInternal::OnNetworkMessageObjectReplicate(NetworkEvent& event, Netwo } #endif } + + // TODO: speed up replication of client-owned object to other clients from server } else { diff --git a/Source/Engine/Networking/NetworkReplicator.h b/Source/Engine/Networking/NetworkReplicator.h index db38682a9..64c4a8600 100644 --- a/Source/Engine/Networking/NetworkReplicator.h +++ b/Source/Engine/Networking/NetworkReplicator.h @@ -57,7 +57,7 @@ public: /// Does nothing if network is offline. /// The object to replicate. /// The parent of the object (eg. player that spawned it). - API_FUNCTION() static void AddObject(ScriptingObject* obj, ScriptingObject* parent); + API_FUNCTION() static void AddObject(ScriptingObject* obj, ScriptingObject* parent = nullptr); /// /// Spawns the object to the other clients. Can be spawned by the owner who locally created it (eg. from prefab).