From b4fdb0cc26a14a3bb80c070c65b1cf1e85a5b680 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Fri, 25 Nov 2022 16:50:30 +0100 Subject: [PATCH] Improvements and fixes for multiplayer networking --- .../Components/NetworkTransform.cpp | 4 ++ .../Engine/Networking/NetworkReplicator.cpp | 70 ++++++++++--------- Source/Engine/Networking/NetworkRpc.h | 1 + 3 files changed, 41 insertions(+), 34 deletions(-) diff --git a/Source/Engine/Networking/Components/NetworkTransform.cpp b/Source/Engine/Networking/Components/NetworkTransform.cpp index 73a42e488..1a6303009 100644 --- a/Source/Engine/Networking/Components/NetworkTransform.cpp +++ b/Source/Engine/Networking/Components/NetworkTransform.cpp @@ -139,6 +139,10 @@ void NetworkTransform::OnUpdate() Transform::Lerp(b0.Value, b1.Value, alpha, transform); Set(transform); } + else if (_buffer.Count() == 1 && _buffer[0].Timestamp <= gameTime) + { + Set(_buffer[0].Value); + } } } diff --git a/Source/Engine/Networking/NetworkReplicator.cpp b/Source/Engine/Networking/NetworkReplicator.cpp index ac0d0c72e..3ca095f04 100644 --- a/Source/Engine/Networking/NetworkReplicator.cpp +++ b/Source/Engine/Networking/NetworkReplicator.cpp @@ -90,9 +90,6 @@ struct NetworkReplicatedObject uint32 LastOwnerFrame = 0; NetworkObjectRole Role; uint8 Spawned = false; -#if NETWORK_REPLICATOR_DEBUG_LOG - uint8 InvalidTypeWarn = false; -#endif DataContainer TargetClientIds; INetworkObject* AsNetworkObject; @@ -138,6 +135,12 @@ struct SpawnItem NetworkObjectRole Role; }; +struct DespawnItem +{ + Guid Id; + DataContainer Targets; +}; + struct RpcItem { ScriptingObjectReference Object; @@ -151,7 +154,7 @@ namespace CriticalSection ObjectsLock; HashSet Objects; Array SpawnQueue; - Array DespawnQueue; + Array DespawnQueue; Array RpcQueue; Dictionary IdsRemappingTable; NetworkStream* CachedWriteStream = nullptr; @@ -226,7 +229,8 @@ NetworkReplicatedObject* ResolveObject(Guid objectId, Guid parentId, char object if (item.LastOwnerFrame == 0 && item.ParentId == parentId && obj && - obj->GetTypeHandle() == objectType) + obj->GetTypeHandle() == objectType && + !IdsRemappingTable.ContainsValue(item.ObjectId)) { // Boost future lookups by using indirection NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Remap object ID={} into object {}:{}", objectId, item.ToString(), obj->GetType().ToString()); @@ -351,8 +355,13 @@ void SendObjectRoleMessage(const NetworkReplicatedObject& item, const NetworkCli } } -FORCE_INLINE void DeleteNetworkObject(ScriptingObject* obj) +void DeleteNetworkObject(ScriptingObject* obj) { + // Remove from the mapping table + const Guid id = obj->GetID(); + IdsRemappingTable.Remove(id); + IdsRemappingTable.RemoveValue(id); + if (obj->Is