Skip to content

Commit f34ffd0

Browse files
Fix UPROPERTY initialization and new Blueprint Library for FContextBase (#3287)
# Description of Changes Closes: clockworklabs/SpacetimeDBPrivate#2058 - Updated the generation code to setup basic initialization to properties for Unreal Blueprints - Added new Blueprint library to interact with FContextBase to allow access to inherited properties from all contexts in Blueprint # API and ABI breaking changes No breaking changes # Expected complexity level and risk 2 - Updates the generation code # Testing - [x] Ran Unreal tests to confirm no breaking changes
1 parent f9cc08d commit f34ffd0

95 files changed

Lines changed: 771 additions & 651 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

crates/codegen/src/unrealcpp.rs

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -609,10 +609,10 @@ impl Lang for UnrealCpp<'_> {
609609
// First, collect and generate all optional types
610610
let optional_types = collect_optional_types(module);
611611
for optional_name in optional_types {
612-
let module_name_pascal = self.module_name.to_case(Case::Pascal);
613-
let filename = format!(
614-
"Source/{module_name_pascal}/Public/ModuleBindings/Optionals/{module_name_pascal}{optional_name}.g.h"
615-
);
612+
let module_name = &self.module_name;
613+
let module_name_pascal = module_name.to_case(Case::Pascal);
614+
let filename =
615+
format!("Source/{module_name}/Public/ModuleBindings/Optionals/{module_name_pascal}{optional_name}.g.h");
616616

617617
let content = generate_optional_type(&optional_name, module, &self.get_api_macro(), self.module_name);
618618
files.push(OutputFile {
@@ -1033,7 +1033,10 @@ fn generate_context_structs(output: &mut UnrealCppAutogen, module: &ModuleDef, a
10331033
writeln!(output, "{{");
10341034
writeln!(output, "\tGENERATED_BODY()");
10351035
writeln!(output);
1036-
writeln!(output, "\tFContextBase() = default;");
1036+
writeln!(
1037+
output,
1038+
"\tFContextBase() : Db(nullptr), Reducers(nullptr), SetReducerFlags(nullptr), Conn(nullptr) {{}};"
1039+
);
10371040
writeln!(output, "\tFContextBase(UDbConnection* InConn);");
10381041
writeln!(output);
10391042
writeln!(output, "\tUPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")");
@@ -1061,6 +1064,44 @@ fn generate_context_structs(output: &mut UnrealCppAutogen, module: &ModuleDef, a
10611064
writeln!(output, "}};");
10621065
writeln!(output);
10631066

1067+
// BPLib for FContextBase - Needed to allow inheritance in Blueprint
1068+
writeln!(output, "UCLASS()");
1069+
writeln!(
1070+
output,
1071+
"class {api_macro} UContextBaseBpLib : public UBlueprintFunctionLibrary"
1072+
);
1073+
writeln!(output, "{{");
1074+
writeln!(output, "\tGENERATED_BODY()");
1075+
writeln!(output);
1076+
writeln!(output, "private:");
1077+
1078+
writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")");
1079+
writeln!(
1080+
output,
1081+
"\tstatic URemoteTables* GetDb(const FContextBase& Ctx) {{ return Ctx.Db; }}"
1082+
);
1083+
writeln!(output);
1084+
writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")");
1085+
writeln!(
1086+
output,
1087+
"\tstatic URemoteReducers* GetReducers(const FContextBase& Ctx) {{ return Ctx.Reducers; }}"
1088+
);
1089+
writeln!(output);
1090+
writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")");
1091+
writeln!(
1092+
output,
1093+
"\tstatic USetReducerFlags* GetSetReducerFlags(const FContextBase& Ctx) {{ return Ctx.SetReducerFlags; }}"
1094+
);
1095+
writeln!(output);
1096+
writeln!(output, "\tUFUNCTION(BlueprintPure, Category=\"SpacetimeDB\")");
1097+
writeln!(
1098+
output,
1099+
"\tstatic bool IsActive(const FContextBase& Ctx) {{ return Ctx.IsActive(); }}"
1100+
);
1101+
1102+
writeln!(output, "}};");
1103+
writeln!(output);
1104+
10641105
// ---------------------------------------------------------------------
10651106
// Per-module typed Reducer tagged union + typed Event
10661107
// ---------------------------------------------------------------------
@@ -1091,7 +1132,7 @@ fn generate_context_structs(output: &mut UnrealCppAutogen, module: &ModuleDef, a
10911132
writeln!(output);
10921133
writeln!(output, "public:");
10931134
writeln!(output, " UPROPERTY(BlueprintReadOnly, Category = \"SpacetimeDB\")");
1094-
writeln!(output, " EReducerTag Tag;");
1135+
writeln!(output, " EReducerTag Tag = static_cast<EReducerTag>(0);");
10951136
writeln!(output);
10961137
write!(output, " TVariant<");
10971138
{
@@ -3485,7 +3526,8 @@ fn autogen_cpp_struct(
34853526
for (orig_name, ty) in product_type.into_iter() {
34863527
let field_name = orig_name.deref().to_case(Case::Pascal);
34873528
let ty_str = cpp_ty_fmt_with_module(module, ty, module_name).to_string();
3488-
let field_decl = format!("{ty_str} {field_name}");
3529+
let init_str = cpp_ty_init_fmt_impl(ty);
3530+
let field_decl = format!("{ty_str} {field_name}{init_str}");
34893531

34903532
// Check if the type is blueprintable
34913533
if is_blueprintable(module, ty) {
@@ -3818,7 +3860,10 @@ fn autogen_cpp_sum(
38183860

38193861
writeln!(output);
38203862

3821-
writeln!(output, " UPROPERTY(BlueprintReadOnly)\n E{name}Tag Tag;\n");
3863+
writeln!(
3864+
output,
3865+
" UPROPERTY(BlueprintReadOnly)\n E{name}Tag Tag = static_cast<E{name}Tag>(0);\n"
3866+
);
38223867

38233868
/* 4a. Static factories per variant -------------------------------- */
38243869
for (variant_name, variant_type) in &sum_type.variants {
@@ -4157,6 +4202,43 @@ fn cpp_ty_fmt_impl<'a>(
41574202
})
41584203
}
41594204

4205+
// For UPROPERTY() Unreal expects initialization values for certain types
4206+
// (e.g. bools default to true if not explicitly initialized to false).
4207+
fn cpp_ty_init_fmt_impl<'a>(ty: &'a AlgebraicTypeUse) -> impl fmt::Display + 'a {
4208+
fmt_fn(move |f| match ty {
4209+
AlgebraicTypeUse::Primitive(p) => f.write_str(match p {
4210+
PrimitiveType::Bool => " = false",
4211+
PrimitiveType::I8 => " = 0",
4212+
PrimitiveType::U8 => " = 0",
4213+
PrimitiveType::I16 => " = 0",
4214+
PrimitiveType::U16 => " = 0",
4215+
PrimitiveType::I32 => " = 0",
4216+
PrimitiveType::U32 => " = 0",
4217+
PrimitiveType::I64 => " = 0",
4218+
PrimitiveType::U64 => " = 0",
4219+
PrimitiveType::F32 => " = 0.0f",
4220+
PrimitiveType::F64 => " = 0.0",
4221+
PrimitiveType::I128 => "",
4222+
PrimitiveType::U128 => "",
4223+
PrimitiveType::I256 => "",
4224+
PrimitiveType::U256 => "",
4225+
}),
4226+
AlgebraicTypeUse::Array(_elem) => f.write_str(""),
4227+
AlgebraicTypeUse::String => f.write_str(""),
4228+
AlgebraicTypeUse::Identity => f.write_str(""),
4229+
AlgebraicTypeUse::ConnectionId => f.write_str(""),
4230+
AlgebraicTypeUse::Timestamp => f.write_str(""),
4231+
AlgebraicTypeUse::TimeDuration => f.write_str(""),
4232+
AlgebraicTypeUse::ScheduleAt => f.write_str(""),
4233+
AlgebraicTypeUse::Unit => f.write_str(""),
4234+
// --------- references to user-defined types ---------
4235+
AlgebraicTypeUse::Ref(_r) => f.write_str(""),
4236+
// Options use the generated optional types
4237+
AlgebraicTypeUse::Option(_inner) => f.write_str(""),
4238+
AlgebraicTypeUse::Never => unreachable!("never type"),
4239+
})
4240+
}
4241+
41604242
// Given an `AlgebraicTypeUse`, add every referenced type’s generated
41614243
// header name (`"<FTypeName>.g.h"`) into `out` (a `HashSet` avoids dups).
41624244
fn collect_includes_for_type(

demo/Blackholio/client-unreal/Source/client_unreal/Private/Gameplay/LeaderboardWidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ void ULeaderboardWidget::CollectPlayers(TArray<FLeaderboardEntry>& Out) const
8181
// 4) Keep top 10
8282
if (Out.Num() > 10)
8383
{
84-
Out.SetNum(10, /*bAllowShrinking*/ false);
84+
Out.SetNum(10, EAllowShrinking::No);
8585
}
8686

8787
// 5) Append local player if not already present and has Mass > 0

demo/Blackholio/client-unreal/Source/client_unreal/Private/ModuleBindings/SpacetimeDBClient.g.cpp

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
#include "BSATN/UEBSATNHelpers.h"
77
#include "ModuleBindings/Tables/EntityTable.g.h"
88
#include "ModuleBindings/Tables/MoveAllPlayersTimerTable.g.h"
9-
#include "ModuleBindings/Tables/CircleDecayTimerTable.g.h"
10-
#include "ModuleBindings/Tables/EntityTable.g.h"
11-
#include "ModuleBindings/Tables/FoodTable.g.h"
12-
#include "ModuleBindings/Tables/CircleRecombineTimerTable.g.h"
13-
#include "ModuleBindings/Tables/ConfigTable.g.h"
9+
#include "ModuleBindings/Tables/ConsumeEntityTimerTable.g.h"
1410
#include "ModuleBindings/Tables/PlayerTable.g.h"
11+
#include "ModuleBindings/Tables/ConfigTable.g.h"
12+
#include "ModuleBindings/Tables/FoodTable.g.h"
1513
#include "ModuleBindings/Tables/CircleTable.g.h"
16-
#include "ModuleBindings/Tables/PlayerTable.g.h"
17-
#include "ModuleBindings/Tables/ConsumeEntityTimerTable.g.h"
1814
#include "ModuleBindings/Tables/SpawnFoodTimerTable.g.h"
15+
#include "ModuleBindings/Tables/CircleDecayTimerTable.g.h"
16+
#include "ModuleBindings/Tables/CircleRecombineTimerTable.g.h"
17+
#include "ModuleBindings/Tables/EntityTable.g.h"
1918
#include "ModuleBindings/Tables/CircleTable.g.h"
19+
#include "ModuleBindings/Tables/PlayerTable.g.h"
2020

2121
static FReducer DecodeReducer(const FReducerEvent& Event)
2222
{
@@ -110,17 +110,17 @@ UDbConnection::UDbConnection(const FObjectInitializer& ObjectInitializer) : Supe
110110

111111
RegisterTable<FEntityType, UEntityTable, FEventContext>(TEXT("logged_out_entity"), Db->LoggedOutEntity);
112112
RegisterTable<FMoveAllPlayersTimerType, UMoveAllPlayersTimerTable, FEventContext>(TEXT("move_all_players_timer"), Db->MoveAllPlayersTimer);
113-
RegisterTable<FCircleDecayTimerType, UCircleDecayTimerTable, FEventContext>(TEXT("circle_decay_timer"), Db->CircleDecayTimer);
114-
RegisterTable<FEntityType, UEntityTable, FEventContext>(TEXT("entity"), Db->Entity);
113+
RegisterTable<FConsumeEntityTimerType, UConsumeEntityTimerTable, FEventContext>(TEXT("consume_entity_timer"), Db->ConsumeEntityTimer);
114+
RegisterTable<FPlayerType, UPlayerTable, FEventContext>(TEXT("player"), Db->Player);
115+
RegisterTable<FConfigType, UConfigTable, FEventContext>(TEXT("config"), Db->Config);
115116
RegisterTable<FFoodType, UFoodTable, FEventContext>(TEXT("food"), Db->Food);
117+
RegisterTable<FCircleType, UCircleTable, FEventContext>(TEXT("circle"), Db->Circle);
118+
RegisterTable<FSpawnFoodTimerType, USpawnFoodTimerTable, FEventContext>(TEXT("spawn_food_timer"), Db->SpawnFoodTimer);
119+
RegisterTable<FCircleDecayTimerType, UCircleDecayTimerTable, FEventContext>(TEXT("circle_decay_timer"), Db->CircleDecayTimer);
116120
RegisterTable<FCircleRecombineTimerType, UCircleRecombineTimerTable, FEventContext>(TEXT("circle_recombine_timer"), Db->CircleRecombineTimer);
117-
RegisterTable<FConfigType, UConfigTable, FEventContext>(TEXT("config"), Db->Config);
118-
RegisterTable<FPlayerType, UPlayerTable, FEventContext>(TEXT("logged_out_player"), Db->LoggedOutPlayer);
121+
RegisterTable<FEntityType, UEntityTable, FEventContext>(TEXT("entity"), Db->Entity);
119122
RegisterTable<FCircleType, UCircleTable, FEventContext>(TEXT("logged_out_circle"), Db->LoggedOutCircle);
120-
RegisterTable<FPlayerType, UPlayerTable, FEventContext>(TEXT("player"), Db->Player);
121-
RegisterTable<FConsumeEntityTimerType, UConsumeEntityTimerTable, FEventContext>(TEXT("consume_entity_timer"), Db->ConsumeEntityTimer);
122-
RegisterTable<FSpawnFoodTimerType, USpawnFoodTimerTable, FEventContext>(TEXT("spawn_food_timer"), Db->SpawnFoodTimer);
123-
RegisterTable<FCircleType, UCircleTable, FEventContext>(TEXT("circle"), Db->Circle);
123+
RegisterTable<FPlayerType, UPlayerTable, FEventContext>(TEXT("logged_out_player"), Db->LoggedOutPlayer);
124124
}
125125

126126
FContextBase::FContextBase(UDbConnection* InConn)
@@ -157,33 +157,33 @@ void URemoteTables::Initialize()
157157
/** Creating tables */
158158
LoggedOutEntity = NewObject<UEntityTable>(this);
159159
MoveAllPlayersTimer = NewObject<UMoveAllPlayersTimerTable>(this);
160-
CircleDecayTimer = NewObject<UCircleDecayTimerTable>(this);
161-
Entity = NewObject<UEntityTable>(this);
160+
ConsumeEntityTimer = NewObject<UConsumeEntityTimerTable>(this);
161+
Player = NewObject<UPlayerTable>(this);
162+
Config = NewObject<UConfigTable>(this);
162163
Food = NewObject<UFoodTable>(this);
164+
Circle = NewObject<UCircleTable>(this);
165+
SpawnFoodTimer = NewObject<USpawnFoodTimerTable>(this);
166+
CircleDecayTimer = NewObject<UCircleDecayTimerTable>(this);
163167
CircleRecombineTimer = NewObject<UCircleRecombineTimerTable>(this);
164-
Config = NewObject<UConfigTable>(this);
165-
LoggedOutPlayer = NewObject<UPlayerTable>(this);
168+
Entity = NewObject<UEntityTable>(this);
166169
LoggedOutCircle = NewObject<UCircleTable>(this);
167-
Player = NewObject<UPlayerTable>(this);
168-
ConsumeEntityTimer = NewObject<UConsumeEntityTimerTable>(this);
169-
SpawnFoodTimer = NewObject<USpawnFoodTimerTable>(this);
170-
Circle = NewObject<UCircleTable>(this);
170+
LoggedOutPlayer = NewObject<UPlayerTable>(this);
171171
/**/
172172

173173
/** Initialization */
174174
LoggedOutEntity->PostInitialize();
175175
MoveAllPlayersTimer->PostInitialize();
176-
CircleDecayTimer->PostInitialize();
177-
Entity->PostInitialize();
176+
ConsumeEntityTimer->PostInitialize();
177+
Player->PostInitialize();
178+
Config->PostInitialize();
178179
Food->PostInitialize();
180+
Circle->PostInitialize();
181+
SpawnFoodTimer->PostInitialize();
182+
CircleDecayTimer->PostInitialize();
179183
CircleRecombineTimer->PostInitialize();
180-
Config->PostInitialize();
181-
LoggedOutPlayer->PostInitialize();
184+
Entity->PostInitialize();
182185
LoggedOutCircle->PostInitialize();
183-
Player->PostInitialize();
184-
ConsumeEntityTimer->PostInitialize();
185-
SpawnFoodTimer->PostInitialize();
186-
Circle->PostInitialize();
186+
LoggedOutPlayer->PostInitialize();
187187
/**/
188188
}
189189

demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/SpacetimeDBClient.g.h

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
22
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
33

4-
// This was generated using spacetimedb cli version 1.4.0 (commit dc59211c1453848981aeb2efce2249c9a07947b2).
4+
// This was generated using spacetimedb cli version 1.4.0 (commit 26e99fe5e5b8848cccde94ec4c1a56148977dfa1).
55

66
#pragma once
77
#include "CoreMinimal.h"
@@ -79,7 +79,7 @@ struct CLIENT_UNREAL_API FContextBase
7979
{
8080
GENERATED_BODY()
8181

82-
FContextBase() = default;
82+
FContextBase() : Db(nullptr), Reducers(nullptr), SetReducerFlags(nullptr), Conn(nullptr) {};
8383
FContextBase(UDbConnection* InConn);
8484

8585
UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB")
@@ -103,6 +103,25 @@ struct CLIENT_UNREAL_API FContextBase
103103

104104
};
105105

106+
UCLASS()
107+
class CLIENT_UNREAL_API UContextBaseBpLib : public UBlueprintFunctionLibrary
108+
{
109+
GENERATED_BODY()
110+
111+
private:
112+
UFUNCTION(BlueprintPure, Category="SpacetimeDB")
113+
static URemoteTables* GetDb(const FContextBase& Ctx) { return Ctx.Db; }
114+
115+
UFUNCTION(BlueprintPure, Category="SpacetimeDB")
116+
static URemoteReducers* GetReducers(const FContextBase& Ctx) { return Ctx.Reducers; }
117+
118+
UFUNCTION(BlueprintPure, Category="SpacetimeDB")
119+
static USetReducerFlags* GetSetReducerFlags(const FContextBase& Ctx) { return Ctx.SetReducerFlags; }
120+
121+
UFUNCTION(BlueprintPure, Category="SpacetimeDB")
122+
static bool IsActive(const FContextBase& Ctx) { return Ctx.IsActive(); }
123+
};
124+
106125
UENUM(BlueprintType, Category = "SpacetimeDB")
107126
enum class EReducerTag : uint8
108127
{
@@ -127,7 +146,7 @@ struct CLIENT_UNREAL_API FReducer
127146

128147
public:
129148
UPROPERTY(BlueprintReadOnly, Category = "SpacetimeDB")
130-
EReducerTag Tag;
149+
EReducerTag Tag = static_cast<EReducerTag>(0);
131150

132151
TVariant<FCircleDecayArgs, FCircleRecombineArgs, FConnectArgs, FConsumeEntityArgs, FDisconnectArgs, FEnterGameArgs, FMoveAllPlayersArgs, FPlayerSplitArgs, FRespawnArgs, FSpawnFoodArgs, FSuicideArgs, FUpdatePlayerInputArgs> Data;
133152

@@ -899,37 +918,37 @@ class CLIENT_UNREAL_API URemoteTables : public UObject
899918
UMoveAllPlayersTimerTable* MoveAllPlayersTimer;
900919

901920
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
902-
UCircleDecayTimerTable* CircleDecayTimer;
921+
UConsumeEntityTimerTable* ConsumeEntityTimer;
903922

904923
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
905-
UEntityTable* Entity;
924+
UPlayerTable* Player;
906925

907926
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
908-
UFoodTable* Food;
927+
UConfigTable* Config;
909928

910929
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
911-
UCircleRecombineTimerTable* CircleRecombineTimer;
930+
UFoodTable* Food;
912931

913932
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
914-
UConfigTable* Config;
933+
UCircleTable* Circle;
915934

916935
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
917-
UPlayerTable* LoggedOutPlayer;
936+
USpawnFoodTimerTable* SpawnFoodTimer;
918937

919938
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
920-
UCircleTable* LoggedOutCircle;
939+
UCircleDecayTimerTable* CircleDecayTimer;
921940

922941
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
923-
UPlayerTable* Player;
942+
UCircleRecombineTimerTable* CircleRecombineTimer;
924943

925944
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
926-
UConsumeEntityTimerTable* ConsumeEntityTimer;
945+
UEntityTable* Entity;
927946

928947
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
929-
USpawnFoodTimerTable* SpawnFoodTimer;
948+
UCircleTable* LoggedOutCircle;
930949

931950
UPROPERTY(BlueprintReadOnly, Category="SpacetimeDB")
932-
UCircleTable* Circle;
951+
UPlayerTable* LoggedOutPlayer;
933952

934953
};
935954

demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/CircleTable.g.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class CLIENT_UNREAL_API UCircleTable : public URemoteTable
9797

9898
void PostInitialize();
9999

100-
/** Update function for circle table*/
100+
/** Update function for logged_out_circle table*/
101101
FTableAppliedDiff<FCircleType> Update(TArray<FWithBsatn<FCircleType>> InsertsRef, TArray<FWithBsatn<FCircleType>> DeletesRef);
102102

103103
/** Number of subscribed rows currently in the cache */
@@ -135,7 +135,7 @@ class CLIENT_UNREAL_API UCircleTable : public URemoteTable
135135
FOnCircleDelete OnDelete;
136136

137137
private:
138-
const FString TableName = TEXT("circle");
138+
const FString TableName = TEXT("logged_out_circle");
139139

140140
TSharedPtr<UClientCache<FCircleType>> Data;
141141
};

demo/Blackholio/client-unreal/Source/client_unreal/Public/ModuleBindings/Tables/PlayerTable.g.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ class CLIENT_UNREAL_API UPlayerTable : public URemoteTable
100100

101101
void PostInitialize();
102102

103-
/** Update function for player table*/
103+
/** Update function for logged_out_player table*/
104104
FTableAppliedDiff<FPlayerType> Update(TArray<FWithBsatn<FPlayerType>> InsertsRef, TArray<FWithBsatn<FPlayerType>> DeletesRef);
105105

106106
/** Number of subscribed rows currently in the cache */
@@ -138,7 +138,7 @@ class CLIENT_UNREAL_API UPlayerTable : public URemoteTable
138138
FOnPlayerDelete OnDelete;
139139

140140
private:
141-
const FString TableName = TEXT("player");
141+
const FString TableName = TEXT("logged_out_player");
142142

143143
TSharedPtr<UClientCache<FPlayerType>> Data;
144144
};

0 commit comments

Comments
 (0)