UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
StructNetTokenDataStoreHelper.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
9#include "Net/RepLayout.h"
12
13namespace UE::Net
14{
15
16// Helper for Serializing the NetTokenStructs
17template <typename T>
19{
20public:
21
23
25 {
28
29 UNetConnection* NetConnection = MapClient->GetConnection();
30 check(::IsValid(NetConnection));
31 check(::IsValid(NetConnection->GetDriver()));
32
34 const TSharedPtr<FRepLayout> RepLayout = NetConnection->GetDriver()->GetStructRepLayout(Struct);
35 check(RepLayout.IsValid());
36
37 bool bHasUnmapped = false;
38 RepLayout->SerializePropertiesForStruct(Struct, static_cast<FBitArchive&>(Ar), Map, &InOutData, bHasUnmapped);
39 }
40public:
42 {
44 {
46 }
47
49 {
50 UE_LOG(LogNetToken, Warning, TEXT("NetSerializer registries have not been initialized for %s"), *DataStoreType::GetTokenStoreName().ToString());
51 }
52
53 if (Ar.IsSaving())
54 {
56 FNetTokenStore* NetTokenStore = ExportContext ? ExportContext->GetNetTokenStore() : nullptr;
57 DataStoreType* StateTokenStore = NetTokenStore ? NetTokenStore->GetDataStore<DataStoreType>() : nullptr;
58 if (!StateTokenStore)
59 {
60 return false;
61 }
62
64 if (PackageMapClient && PackageMapClient->GetConnection() && PackageMapClient->GetConnection()->IsReplay())
65 {
67 }
68
70 StateTokenStore->WriteNetToken(Ar, StateToken);
72 }
73 else
74 {
75 const FNetTokenResolveContext* NetTokenResolveContext = Map ? Map->GetNetTokenResolveContext() : nullptr;
76 FNetTokenStore* NetTokenStore = NetTokenResolveContext ? NetTokenResolveContext->NetTokenStore : nullptr;
77 DataStoreType* StateTokenStore = NetTokenStore ? NetTokenStore->GetDataStore<DataStoreType>() : nullptr;
78 if (!StateTokenStore)
79 {
80 return false;
81 }
82
84 if (PackageMapClient && PackageMapClient->GetConnection() && PackageMapClient->GetConnection()->IsReplay())
85 {
87 }
88
89 FNetToken StateToken = StateTokenStore->ReadNetToken(Ar);
90 if (Ar.IsError())
91 {
92 return false;
93 }
94 InOutStateData = StateTokenStore->ResolveRemoteToken(StateToken, *NetTokenResolveContext->RemoteNetTokenStoreState);
95 }
96 return true;
97 }
98
99 // Helpers for Replay Support
101 {
103 if (Ar.IsSaving())
104 {
105 if (!NetFieldExportGroup.IsValid())
106 {
108 }
110 StateTokenStore->WriteNetToken(Ar, StateToken);
111
112 if (!NetFieldExportGroup->NetFieldExports.IsValidIndex(StateToken.GetIndex()))
113 {
114 NetFieldExportGroup->NetFieldExports.SetNum(StateToken.GetIndex() + 1, EAllowShrinking::No);
115 NetFieldExportGroup->bDirtyForReplay = true;
116 }
117 FNetFieldExport& NetFieldExport = NetFieldExportGroup->NetFieldExports[StateToken.GetIndex()];
118
120 PackageMapClient.TrackNetFieldExport(NetFieldExportGroup.Get(), StateToken.GetIndex());
121
122 return true;
123 }
124 else if (Ar.IsLoading())
125 {
126 FNetToken StateToken = StateTokenStore->ReadNetToken(Ar);
127 if (Ar.IsError())
128 {
129 return false;
130 }
131 if (!NetFieldExportGroup.IsValid())
132 {
133 return false;
134 }
135
136 if (StateToken.IsValid())
137 {
139 {
140 return true;
141 }
143 return false;
144 }
145 }
146 return false;
147 }
148
150 {
151 if (!NetFieldExportGroup.IsValid())
152 {
153 return false;
154 }
155 const uint32 TagTokenIndex = StateToken.GetIndex();
156 if (static_cast<int32>(TagTokenIndex) >= NetFieldExportGroup->NetFieldExports.Num())
157 {
158 return false;
159 }
160 FNetFieldExport& NetFieldExport = NetFieldExportGroup->NetFieldExports[StateToken.GetIndex()];
162 TArray<uint8>& Data = NetFieldExportGroup->NetFieldExports[TagTokenIndex].Blob;
163 TempAr.SetData(Data.GetData(),Data.NumBytes()*8);
164 StateTokenStore->ReadTokenData(TempAr, StateToken, &Map);
165 OutData = StateTokenStore->ResolveToken(StateToken);
166 return true;
167 }
168
170 {
171 if (!NetFieldExportGroup.IsValid())
172 {
173 return false;
174 }
175 FNetToken StateToken = StateTokenStore->GetOrCreateToken(InData);
176 if (static_cast<int32>(StateToken.GetIndex()) >= NetFieldExportGroup->NetFieldExports.Num())
177 {
178 NetFieldExportGroup->NetFieldExports.SetNum(StateToken.GetIndex() + 1, EAllowShrinking::No);
179 }
180 FNetFieldExport& NetFieldExport = NetFieldExportGroup->NetFieldExports[StateToken.GetIndex()];
181 if (NetFieldExport.bExported)
182 {
183 return false;
184 }
185
187 StateTokenStore->WriteTokenData(TempAr, StateTokenStore->GetOrCreatePersistentState(InData), &Map);
188
189 NetFieldExport = FNetFieldExport(StateToken.GetIndex(),0,NAME_None,*TempAr.GetBuffer());
190 NetFieldExportGroup->bDirtyForReplay = true;
191 UE_LOG(LogNetToken, Verbose, TEXT("Replay> Exported for %s as NetFieldIndex %u"), *DataStoreType::GetTokenStoreName().ToString(), StateToken.GetIndex());
192 return true;
193 }
194
196 {
199 if (NetFieldExportGroup.IsValid())
200 {
201 return true;
202 }
204 NetFieldExportGroup->PathName = StoreName;
205 NetFieldExportGroup->NetFieldExports.SetNum(StateTokenStore->StoredStates.Num());
206 for (auto& Pair : StateTokenStore->StoredStates)
207 {
209 }
210 PackageMapClient.AddNetFieldExportGroup(StoreName, NetFieldExportGroup);
211 return true;
212 }
213};
214
215}
#define check(expr)
Definition AssertionMacros.h:314
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
UE_FORCEINLINE_HINT bool IsSaving() const
Definition Archive.h:248
UE_FORCEINLINE_HINT bool IsError() const
Definition Archive.h:362
Definition BitArchive.h:13
CORE_API FString ToString() const
Definition UnrealNames.cpp:3537
Definition CoreNet.h:415
Definition CoreNet.h:384
Definition PackageMapClient.h:44
Definition Array.h:670
Definition SharedPointer.h:692
UE_FORCEINLINE_HINT const bool IsValid() const
Definition SharedPointer.h:1085
Definition NetTokenExportContext.h:21
NETCORE_API void AddNetTokenPendingExport(UE::Net::FNetToken NetToken)
Definition NetTokenExportContext.cpp:62
FNetTokenStore * GetNetTokenStore()
Definition NetTokenExportContext.h:56
static NETCORE_API FNetTokenExportContext * GetNetTokenExportContext(FArchive &Ar)
Definition NetTokenExportContext.cpp:42
Definition NetToken.h:112
FNetTokenStore * NetTokenStore
Definition NetToken.h:114
const FNetTokenStoreState * RemoteNetTokenStoreState
Definition NetToken.h:115
Definition NetTokenStore.h:189
IRISCORE_API const FNetTokenDataStore * GetDataStore(FName Name) const
Definition NetTokenStore.cpp:288
Definition NetToken.h:22
Definition StructNetTokenDataStoreHelper.h:19
static bool SetupReplayExportGroup(DataStoreType *StateTokenStore, UPackageMapClient &PackageMapClient)
Definition StructNetTokenDataStoreHelper.h:195
static bool AddStateToReplayExportGroup(DataStoreType *StateTokenStore, T &InData, TSharedPtr< FNetFieldExportGroup > NetFieldExportGroup, UPackageMapClient &Map)
Definition StructNetTokenDataStoreHelper.h:169
static bool GetStateFromReplayExportGroup(DataStoreType *StateTokenStore, T &OutData, FNetToken &StateToken, TSharedPtr< FNetFieldExportGroup > NetFieldExportGroup, UPackageMapClient &Map)
Definition StructNetTokenDataStoreHelper.h:149
static bool NetSerializeAndExportToken(FArchive &Ar, UPackageMap *Map, T &InOutStateData)
Definition StructNetTokenDataStoreHelper.h:41
static void SerializeHelper(T &InOutData, FArchive &Ar, UPackageMap *Map)
Definition StructNetTokenDataStoreHelper.h:24
static bool NetSerializeStateDataAsReplayData(DataStoreType *StateTokenStore, T &InOutStateData, FArchive &Ar, UPackageMapClient &PackageMapClient)
Definition StructNetTokenDataStoreHelper.h:100
Definition StructNetTokenDataStore.h:153
static const T & GetInvalidState()
Definition StructNetTokenDataStore.h:216
static TNetSerializeTokenType NetSerializeScriptDelegate
Definition StructNetTokenDataStore.h:224
static FName GetTokenStoreName()
Definition StructNetTokenDataStore.h:211
Definition NetConnection.h:284
UNetDriver * GetDriver()
Definition NetConnection.h:1349
ENGINE_API TSharedPtr< FRepLayout > GetStructRepLayout(UStruct *Struct)
Definition NetDriver.cpp:7707
Definition PackageMapClient.h:465
Definition CoreNet.h:191
Definition Class.h:1720
Definition NetworkVersion.cpp:28