From ff49401f3a965650a4b2f9f497dfd3a7b2c8a9f2 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Wed, 19 Oct 2022 13:14:16 +0200 Subject: [PATCH] Use objects id mapping for networking to have proper replication of networked object references --- Source/Engine/Networking/NetworkInternal.h | 1 + Source/Engine/Networking/NetworkManager.cpp | 1 + Source/Engine/Networking/NetworkReplicator.cpp | 10 ++++++++++ 3 files changed, 12 insertions(+) diff --git a/Source/Engine/Networking/NetworkInternal.h b/Source/Engine/Networking/NetworkInternal.h index 4e6f26ceb..a2e14140c 100644 --- a/Source/Engine/Networking/NetworkInternal.h +++ b/Source/Engine/Networking/NetworkInternal.h @@ -18,6 +18,7 @@ class NetworkInternal { public: static void NetworkReplicatorClear(); + static void NetworkReplicatorPreUpdate(); static void NetworkReplicatorUpdate(); static void OnNetworkMessageReplicatedObject(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer); }; diff --git a/Source/Engine/Networking/NetworkManager.cpp b/Source/Engine/Networking/NetworkManager.cpp index adb8aabce..18dbb07e5 100644 --- a/Source/Engine/Networking/NetworkManager.cpp +++ b/Source/Engine/Networking/NetworkManager.cpp @@ -320,6 +320,7 @@ void NetworkManagerService::Update() LastUpdateTime = currentTime; NetworkManager::Frame++; auto peer = NetworkManager::Peer; + NetworkInternal::NetworkReplicatorPreUpdate(); // TODO: convert into TaskGraphSystems and use async jobs // Process network messages diff --git a/Source/Engine/Networking/NetworkReplicator.cpp b/Source/Engine/Networking/NetworkReplicator.cpp index 2c6a3f155..0e58729de 100644 --- a/Source/Engine/Networking/NetworkReplicator.cpp +++ b/Source/Engine/Networking/NetworkReplicator.cpp @@ -19,6 +19,7 @@ #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/ScriptingObjectReference.h" #include "Engine/Threading/Threading.h" +#include "Engine/Threading/ThreadLocal.h" // Enables verbose logging for Network Replicator actions (dev-only) #define NETWORK_REPLICATOR_DEBUG_LOG 1 @@ -241,6 +242,12 @@ void NetworkInternal::NetworkReplicatorClear() CachedTargets.Resize(0); } +void NetworkInternal::NetworkReplicatorPreUpdate() +{ + // Inject ObjectsLookupIdMapping to properly map networked object ids into local object ids (deserialization with Scripting::TryFindObject will remap objects) + Scripting::ObjectsLookupIdMapping.Set(&IdsRemappingTable); +} + void NetworkInternal::NetworkReplicatorUpdate() { PROFILE_CPU(); @@ -325,6 +332,9 @@ void NetworkInternal::NetworkReplicatorUpdate() } } } + + // Clear networked objects mapping table + Scripting::ObjectsLookupIdMapping.Set(nullptr); } void NetworkInternal::OnNetworkMessageReplicatedObject(NetworkEvent& event, NetworkClient* client, NetworkPeer* peer)