From 2475b46375ae8c4b78fd2422e68f3def4342b09b Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Mon, 31 Oct 2022 13:25:29 +0100 Subject: [PATCH] Fix `INetworkSerializable` if class has vtable offset --- Source/Engine/Networking/NetworkReplicator.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Networking/NetworkReplicator.cpp b/Source/Engine/Networking/NetworkReplicator.cpp index 809a508c7..0b99f758e 100644 --- a/Source/Engine/Networking/NetworkReplicator.cpp +++ b/Source/Engine/Networking/NetworkReplicator.cpp @@ -148,12 +148,14 @@ NetworkReplicationService NetworkReplicationServiceInstance; void INetworkSerializable_Serialize(void* instance, NetworkStream* stream, void* tag) { - ((INetworkSerializable*)instance)->Serialize(stream); + const int16 vtableOffset = (int16)tag; + ((INetworkSerializable*)((byte*)instance + vtableOffset))->Serialize(stream); } void INetworkSerializable_Deserialize(void* instance, NetworkStream* stream, void* tag) { - ((INetworkSerializable*)instance)->Deserialize(stream); + const int16 vtableOffset = (int16)tag; + ((INetworkSerializable*)((byte*)instance + vtableOffset))->Deserialize(stream); } NetworkReplicatedObject* ResolveObject(Guid objectId) @@ -320,6 +322,7 @@ bool NetworkReplicator::InvokeSerializer(const ScriptingTypeHandle& typeHandle, { serializer.Methods[0] = INetworkSerializable_Serialize; serializer.Methods[1] = INetworkSerializable_Deserialize; + serializer.Tags[0] = serializer.Tags[1] = (void*)interface->VTableOffset; // Pass VTableOffset to the callback SerializersTable.Add(typeHandle, serializer); } else if (const ScriptingTypeHandle baseTypeHandle = typeHandle.GetType().GetBaseType())