UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetTokenStore.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
7#include "UObject/NameTypes.h"
8#include "Containers/Array.h"
9#include "Containers/Map.h"
10#include "Templates/Tuple.h"
11
12#include "NetTokenStore.generated.h"
13
34/* NetBitArray validation support. */
35#ifndef UE_NET_VALIDATE_NETTOKENTYPE
36#if (UE_BUILD_SHIPPING || UE_BUILD_TEST)
37# define UE_NET_VALIDATE_NETTOKENTYPE 0
38#else
39# define UE_NET_VALIDATE_NETTOKENTYPE 1
40#endif
41#endif
42
43
45namespace UE::Net
46{
47 class FNetTokenDataStore;
48 class FNetTokenStore;
49 class FNetTokenStoreState;
50 class FNetSerializationContext;
51
52 namespace Private
53 {
54 class FNetExportContext;
55 }
56}
57
58USTRUCT()
60{
62 UPROPERTY()
63 FString StoreTypeName;
64 UPROPERTY()
65 uint32 TypeID = 0;
66 bool operator<(const FNetTokenStoreTypeIdPair& Other) const
67 {
68 return TypeID < Other.TypeID;
69 }
70};
71
72UCLASS(Transient, MinimalAPI, config=Engine)
74{
76
77public:
78 UPROPERTY(Config)
80
81 uint32 GetTypeID(const FString& TypeName) const;
82 uint32 GetTypeID(const FName& TypeName) const
83 {
84 return GetTypeID(TypeName.ToString());
85 }
86
87protected:
88 bool ReservedTypeIdsAppearValid() const;
89};
90
91namespace UE::Net
92{
98{
99public:
101 {
102 public:
103 enum { InvalidKeyIndex = 0U };
104
106 : KeyIndex(InvalidKeyIndex)
107 {
108 }
109
111 : KeyIndex(InKeyIndex)
112 {
113 }
114
116 {
117 return KeyIndex;
118 }
119
120 bool IsValid() const
121 {
122 return KeyIndex != InvalidKeyIndex;
123 }
124
125 bool operator==(const FNetTokenStoreKey& Other) const = default;
126
127 private:
128 uint32 KeyIndex = InvalidKeyIndex;
129 };
130
132
133 // Serialization methods for NetTokens that does not include the TypeId as this is known by the NetTokenDataStore.
134
135 // Write NetToken
137
138 // Read NetToken
140
141 // Write NetToken
143
144 // Read NetToken
146
147protected:
148
150
153
154 //Do not export things through the UPackageMap. This will break things.
155 virtual void WriteTokenData(FArchive& Ar, FNetTokenStoreKey Key, UPackageMap* Map = nullptr) const = 0;
157
159
161 {
162 return TypeId;
163 }
164
165 // Create new NetToken
166 IRISCORE_API FNetToken CreateAndStoreTokenForKey(FNetTokenStoreKey Key);
167 IRISCORE_API void StoreTokenForKey(FNetTokenStoreKey Key, FNetToken NetToken);
168 IRISCORE_API FNetToken GetNetTokenFromKey(FNetTokenStoreKey) const;
169
170 // Allocate next TokenStoreKey
172
173protected:
174 // Maps from FNetTokenStoreKey (index) to NetToken, this typically is the locally assigned NetToken, but can be overridden if we receive a token from the authority.
177
178private:
179 friend FNetTokenStore;
180 FNetToken::FTypeId TypeId;
181};
182
189{
191public:
194
201 IRISCORE_API void Init(FInitParams& InitParams);
202
204 bool IsAuthority() const
205 {
207 }
208
210 bool IsLocalToken(const FNetToken NetToken) const
211 {
212 return !NetToken.IsValid() || IsAuthority() == NetToken.IsAssignedByAuthority();
213 }
214
217
220
223
226
228 template<typename T>
230 {
232
233 return RegisterDataStore(MakeUnique<T>(*this), T::GetTokenStoreName());
234 }
235
237 template<typename T>
239 {
240 return UnRegisterDataStore(T::GetTokenStoreName());
241 }
242
244 template<typename T>
246 {
247 return static_cast<T*>(GetDataStore(T::GetTokenStoreName()));
248 }
249
251 template<typename T>
252 const T* GetDataStore() const
253 {
254 return static_cast<const T*>(GetDataStore(T::GetTokenStoreName()));
255 }
256
257 // FNetTokenStoreState maps from NetTokenIndex -> NetTokenStoreKey (Index)
258 // Remote and local NetTokens use separate NetTokensStore states.
259
262 {
263 return LocalNetTokenStoreState.Get();
264 }
265
268 {
269 return LocalNetTokenStoreState.Get();
270 }
271
274
277
280
283
285 IRISCORE_API void ReadTokenData(FNetSerializationContext& Context, const FNetToken NetToken, FNetTokenStoreState& RemoteNetTokenStoreState);
286
288 IRISCORE_API void WriteTokenData(FArchive& Ar, const FNetToken NetToken, UPackageMap* Map = nullptr) const;
289
291 IRISCORE_API void ReadTokenData(FArchive& Ar, const FNetToken NetToken, FNetTokenStoreState& RemoteNetTokenStoreState, UPackageMap* Map = nullptr);
292
295
298
301
306 template <typename T>
308 {
309#if UE_NET_VALIDATE_NETTOKENTYPE
310 // We only verify this in dev builds as it should trap most programmer errors.
311 if (NetToken.IsValid())
312 {
313 const T* DataStore = GetDataStore<T>();
314 if (!DataStore || (DataStore->GetTypeId() != NetToken.GetTypeId()))
315 {
316 UE_LOG(LogNetToken, Error, TEXT("Tried to write NetToken %s using invalid NetTokenStore %s"), *NetToken.ToString(), *(T::GetTokenStoreName().ToString()));
317 // Just to get some attention to the log.
318 ensure(DataStore && (DataStore->GetTypeId() == NetToken.GetTypeId()));
319 }
320 }
321#endif
322 const bool bWriteTypeId = false;
323 FNetTokenStore::InternalWriteNetToken(Context, NetToken, bWriteTypeId);
324 }
325
329 template <typename T>
331 {
332 FNetToken NetToken;
333 if (T* DataStore = GetDataStore<T>())
334 {
335 NetToken = DataStore->ReadNetToken(Context);
336 }
337 else
338 {
339 UE_LOG(LogNetToken, Error, TEXT("ReadNetTokenWithKnownType Tried to read NetToken using invalid NetTokenStore %s"), *(T::GetTokenStoreName().ToString()));
340 // Just to get some attention to the log.
341 ensure(DataStore);
342 }
343
344 return NetToken;
345 }
346
349 {
350 const bool bWriteTypeId = true;
351 FNetTokenStore::InternalWriteNetToken(Context, NetToken, bWriteTypeId);
352 }
353
356 {
357 return InternalReadNetToken(Context, FNetToken::InvalidTokenTypeId);
358 }
359
361 void WriteNetToken(FArchive& Ar, FNetToken NetToken) const
362 {
363 const bool bWriteTypeId = true;
364 FNetTokenStore::InternalWriteNetToken(Ar, NetToken, bWriteTypeId);
365 }
366
369 {
370 return InternalReadNetToken(Ar, FNetToken::InvalidTokenTypeId);
371 }
372
373private:
374
375 friend UNetTokenDataStream;
376 friend FNetTokenDataStore;
377
378 using FNetTokenStoreKey = FNetTokenDataStore::FNetTokenStoreKey;
379
380 // Internal method to write a NetToken, if bWriteTokenType is true it will write the TypeId as well.
381 IRISCORE_API static void InternalWriteNetToken(UE::Net::FNetSerializationContext& Context, FNetToken Token, bool bWriteTokenType);
382 IRISCORE_API static void InternalWriteNetToken(FArchive& Ar, FNetToken Token, bool bWriteTokenType);
383
384 // Internal method to read a NetToken, if the TokenTypeId is valid it will be used instead of reading it from the bitstream
386 IRISCORE_API static FNetToken InternalReadNetToken(FArchive& Ar, FNetToken::FTypeId TokenTypeId);
387
388 bool ValidateAndStoreNetTokenData(FNetTokenDataStore& DataStore, FNetTokenStoreState& RemoteNetTokenStoreState, const FNetToken NetToken, const FNetTokenStoreKey StoreKey);
389
390 TArray<FNetToken> GetAllNetTokens() const;
391
392 static FNetToken MakeNetToken(uint32 TypeId, uint32 Index, FNetToken::ENetTokenAuthority Authority)
393 {
395 {
396 return FNetToken(TypeId, Index, Authority);
397 }
398
399 return FNetToken();
400 }
401
402 TUniquePtr<FNetTokenStoreState> LocalNetTokenStoreState;
403 TArray<TUniquePtr<FNetTokenStoreState>> RemoteNetTokenStoreStates;
405 FInitParams Params;
406};
407
423}
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
#define TEXT(x)
Definition Platform.h:1272
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UCLASS(...)
Definition ObjectMacros.h:776
#define USTRUCT(...)
Definition ObjectMacros.h:746
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Engine.Build.cs:7
Definition Archive.h:1208
Definition NameTypes.h:617
Definition Array.h:670
Definition UniquePtr.h:107
Definition NetSerializationContext.h:31
uint32 GetKeyIndex() const
Definition NetTokenStore.h:115
bool operator==(const FNetTokenStoreKey &Other) const =default
bool IsValid() const
Definition NetTokenStore.h:120
FNetTokenStoreKey(uint32 InKeyIndex)
Definition NetTokenStore.h:110
@ InvalidKeyIndex
Definition NetTokenStore.h:103
FNetTokenStoreKey()
Definition NetTokenStore.h:105
Definition NetTokenStore.h:98
IRISCORE_API void StoreTokenForKey(FNetTokenStoreKey Key, FNetToken NetToken)
Definition NetTokenStore.cpp:110
IRISCORE_API FNetToken CreateAndStoreTokenForKey(FNetTokenStoreKey Key)
Definition NetTokenStore.cpp:87
FNetTokenStore & TokenStore
Definition NetTokenStore.h:176
virtual void WriteTokenData(FNetSerializationContext &Context, FNetTokenStoreKey Key) const =0
IRISCORE_API FNetToken ReadNetToken(UE::Net::FNetSerializationContext &Context)
Definition NetTokenStore.cpp:218
virtual FNetTokenDataStore::FNetTokenStoreKey ReadTokenData(FArchive &Ar, const FNetToken &NetToken, UPackageMap *Map=nullptr)=0
virtual IRISCORE_API ~FNetTokenDataStore()
Definition NetTokenStore.cpp:67
TArray< FNetToken > StoredTokens
Definition NetTokenStore.h:175
IRISCORE_API void WriteNetToken(UE::Net::FNetSerializationContext &Context, FNetToken Token)
Definition NetTokenStore.cpp:223
FNetToken::FTypeId GetTypeId() const
Definition NetTokenStore.h:160
virtual FNetTokenDataStore::FNetTokenStoreKey ReadTokenData(FNetSerializationContext &Context, const FNetToken &NetToken)=0
FNetTokenDataStore::FNetTokenStoreKey GetNextNetTokenStoreKey()
Definition NetTokenStore.h:408
IRISCORE_API FNetTokenDataStore::FNetTokenStoreKey GetTokenKey(FNetToken Token, const FNetTokenStoreState &TokenStoreState) const
Definition NetTokenStore.cpp:71
IRISCORE_API FNetToken GetNetTokenFromKey(FNetTokenStoreKey) const
Definition NetTokenStore.cpp:116
virtual void WriteTokenData(FArchive &Ar, FNetTokenStoreKey Key, UPackageMap *Map=nullptr) const =0
Definition NetTokenStore.cpp:22
Definition NetTokenStore.h:189
const FNetTokenStoreState * GetLocalNetTokenStoreState() const
Definition NetTokenStore.h:261
FNetToken ReadNetToken(FArchive &Ar) const
Definition NetTokenStore.h:368
void WriteNetTokenWithKnownType(FNetSerializationContext &Context, FNetToken NetToken)
Definition NetTokenStore.h:307
IRISCORE_API bool UnRegisterDataStore(FName TokenStoreName)
Definition NetTokenStore.cpp:353
bool CreateAndRegisterDataStore()
Definition NetTokenStore.h:229
IRISCORE_API void ConditionalReadNetTokenData(FNetSerializationContext &Context, const FNetToken NetToken)
Definition NetTokenStore.cpp:519
IRISCORE_API ~FNetTokenStore()
Definition NetTokenStore.cpp:245
IRISCORE_API FNetTokenStore()
Definition NetTokenStore.cpp:240
FNetToken ReadNetTokenWithKnownType(FNetSerializationContext &Context)
Definition NetTokenStore.h:330
IRISCORE_API void ConditionalWriteNetTokenData(FNetSerializationContext &Context, Private::FNetExportContext *ExportContext, const FNetToken NetToken) const
Definition NetTokenStore.cpp:493
void WriteNetToken(FNetSerializationContext &Context, FNetToken NetToken) const
Definition NetTokenStore.h:348
bool IsAuthority() const
Definition NetTokenStore.h:204
IRISCORE_API void ReadTokenData(FNetSerializationContext &Context, const FNetToken NetToken, FNetTokenStoreState &RemoteNetTokenStoreState)
Definition NetTokenStore.cpp:436
static IRISCORE_API void AppendExport(FNetSerializationContext &, FNetToken NetToken)
Definition NetTokenStore.cpp:537
IRISCORE_API bool RegisterDataStore(TUniquePtr< FNetTokenDataStore > DataStore, FName TokenStoreName)
Definition NetTokenStore.cpp:300
void WriteNetToken(FArchive &Ar, FNetToken NetToken) const
Definition NetTokenStore.h:361
T * GetDataStore()
Definition NetTokenStore.h:245
FNetTokenStoreState * GetLocalNetTokenStoreState()
Definition NetTokenStore.h:267
IRISCORE_API const FNetTokenStoreState * GetRemoteNetTokenStoreState(uint32 ConnectionId) const
Definition NetTokenStore.cpp:270
bool DeleteAndUnRegisterDataStore()
Definition NetTokenStore.h:238
bool IsLocalToken(const FNetToken NetToken) const
Definition NetTokenStore.h:210
const T * GetDataStore() const
Definition NetTokenStore.h:252
IRISCORE_API void InitRemoteNetTokenStoreState(uint32 ConnectionId)
Definition NetTokenStore.cpp:255
IRISCORE_API void WriteTokenData(FNetSerializationContext &Context, const FNetToken NetToken) const
Definition NetTokenStore.cpp:372
FNetToken ReadNetToken(FNetSerializationContext &Context) const
Definition NetTokenStore.h:355
Definition NetToken.h:22
FTypeId GetTypeId() const
Definition NetToken.h:67
bool IsValid() const
Definition NetToken.h:52
ENetTokenAuthority
Definition NetToken.h:41
@ MaxNetTokenCount
Definition NetToken.h:38
bool IsAssignedByAuthority() const
Definition NetToken.h:57
@ InvalidTokenTypeId
Definition NetToken.h:28
uint32 FTypeId
Definition NetToken.h:24
@ MaxTypeIdCount
Definition NetToken.h:37
FString ToString() const
Definition NetToken.h:118
Definition NetExportContext.h:17
Definition NetTokenDataStream.h:26
Definition NetTokenStore.h:74
Definition Object.h:95
Definition CoreNet.h:191
Definition OverriddenPropertySet.cpp:45
Definition NetworkVersion.cpp:28
U16 Index
Definition radfft.cpp:71
Definition NetTokenStore.h:60
uint32 TypeID
Definition NetTokenStore.h:65
Definition NetTokenStore.h:197
uint32 MaxConnections
Definition NetTokenStore.h:199
FNetToken::ENetTokenAuthority Authority
Definition NetTokenStore.h:198