From cad972e9aedcb412f7ac04f1400166649479feb8 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Mon, 3 Feb 2020 17:23:13 +0800 Subject: [PATCH 01/16] MBL-19 Remove some hard coded thing in ADeploymentsPlayerController and keep existing features. --- .../DeploymentsPlayerController.cpp | 96 +++++-------------- .../Deployments/DeploymentsPlayerController.h | 12 +-- 2 files changed, 25 insertions(+), 83 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 5aab74d4..14ad6c16 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -15,8 +15,18 @@ void ADeploymentsPlayerController::BeginPlay() ActivateTouchInterface(nullptr); bShowMouseCursor = true; - - QueryPIT(); + + auto SpatialGameInstance = GetGameInstance(); + auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + if (!SpatialWorkerConnection) { + UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); + return; + } + + SpatialWorkerConnection->RegisterOnLoginTokensCallback(std::bind(&ADeploymentsPlayerController::Populate, this, std::placeholders::_1)); + SpatialWorkerConnection->SetConnectionType(ESpatialConnectionType::DevAuthFlow); + SpatialWorkerConnection->DevAuthConfig.DevelopmentAuthToken = TEXT("OGFjOGEwY2UtOTc1Yy00ZDQzLWE5ZTItYzAzMGM2NDU4ZGEzOjozMjE1OWU4Yy1lYmY2LTQzM2ItYjJiZi1hMDM4MjhkYTg1ZWE="); + SpatialWorkerConnection->Connect(true, 0); } void ADeploymentsPlayerController::EndPlay(const EEndPlayReason::Type Reason) @@ -24,73 +34,6 @@ void ADeploymentsPlayerController::EndPlay(const EEndPlayReason::Type Reason) GetWorld()->GetTimerManager().ClearAllTimersForObject(this); } -void OnLoginTokens(void* UserData, const Worker_Alpha_LoginTokensResponse* LoginTokens) -{ - ADeploymentsPlayerController* contoller = static_cast(UserData); - if (LoginTokens->status.code == WORKER_CONNECTION_STATUS_CODE_SUCCESS) - { - UE_LOG(LogGDK, Log, TEXT("Success: Login Token Count %d"), LoginTokens->login_token_count); - contoller->Populate(LoginTokens); - } - else - { - UE_LOG(LogGDK, Log, TEXT("Failure: Error %s"), UTF8_TO_TCHAR(LoginTokens->status.detail)); - } -} - -void OnPlayerIdentityToken(void* UserData, const Worker_Alpha_PlayerIdentityTokenResponse* PIToken) -{ - if (PIToken->status.code == WORKER_CONNECTION_STATUS_CODE_SUCCESS) - { - UE_LOG(LogGDK, Log, TEXT("Success: Received PIToken: %s"), UTF8_TO_TCHAR(PIToken->player_identity_token)); - ADeploymentsPlayerController* controller = static_cast(UserData); - controller->LatestPITokenData = PIToken->player_identity_token; - controller->LatestPIToken = UTF8_TO_TCHAR(PIToken->player_identity_token); - - if (!controller->GetWorld()->GetTimerManager().IsTimerActive(controller->QueryDeploymentsTimer)) - { - controller->GetWorld()->GetTimerManager().SetTimer(controller->QueryDeploymentsTimer, controller, &ADeploymentsPlayerController::QueryDeployments, 5.0f, true, 0.0f); - } - } - else - { - UE_LOG(LogGDK, Log, TEXT("Failure: Error %s"), UTF8_TO_TCHAR(PIToken->status.detail)); - ADeploymentsPlayerController* controller = static_cast(UserData); - - if (controller->GetWorld()->GetTimerManager().IsTimerActive(controller->QueryDeploymentsTimer)) - { - controller->GetWorld()->GetTimerManager().ClearTimer(controller->QueryDeploymentsTimer); - } - } -} - -void ADeploymentsPlayerController::QueryDeployments() -{ - Worker_Alpha_LoginTokensRequest* LTParams = new Worker_Alpha_LoginTokensRequest(); - LTParams->player_identity_token = LatestPITokenData; - LTParams->worker_type = "UnrealClient"; - Worker_Alpha_LoginTokensResponseFuture* LTFuture = Worker_Alpha_CreateDevelopmentLoginTokensAsync("locator.improbable.io", 444, LTParams); - Worker_Alpha_LoginTokensResponseFuture_Get(LTFuture, nullptr, this, OnLoginTokens); -} - -void ADeploymentsPlayerController::QueryPIT() -{ - Worker_Alpha_PlayerIdentityTokenRequest* PITParams = new Worker_Alpha_PlayerIdentityTokenRequest(); - // Replace this string with a dev auth token, see docs for information on how to generate one of these - PITParams->development_authentication_token = "REPLACE ME"; - PITParams->player_id = "Player Id"; - PITParams->display_name = ""; - PITParams->metadata = ""; - PITParams->use_insecure_connection = false; - - Worker_Alpha_PlayerIdentityTokenResponseFuture* PITFuture = Worker_Alpha_CreateDevelopmentPlayerIdentityTokenAsync("locator.improbable.io", 444, PITParams); - - if (PITFuture != nullptr) - { - Worker_Alpha_PlayerIdentityTokenResponseFuture_Get(PITFuture, nullptr, this, OnPlayerIdentityToken); - } -} - FDeploymentInfo Parse(const Worker_Alpha_LoginTokenDetails LoginToken) { FDeploymentInfo DeploymentInfo; @@ -119,7 +62,7 @@ FDeploymentInfo Parse(const Worker_Alpha_LoginTokenDetails LoginToken) return DeploymentInfo; } -void ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensResponse* Deployments) +bool ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensResponse* Deployments) { TArray DeploymentArray; for (int i = 0; i < (int)Deployments->login_token_count; i++) @@ -134,14 +77,23 @@ void ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon }); OnDeploymentsReceived.Broadcast(DeploymentArray); + return true; } void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) { + auto SpatialGameInstance = GetGameInstance(); + auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + if (!SpatialWorkerConnection) { + UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); + return; + } + + const auto& DevAuthConfig = SpatialWorkerConnection->DevAuthConfig; FURL TravelURL; - TravelURL.Host = TEXT("locator.improbable.io"); + TravelURL.Host = DevAuthConfig.LocatorHost; TravelURL.AddOption(TEXT("locator")); - TravelURL.AddOption(*FString::Printf(TEXT("playeridentity=%s"), *LatestPIToken)); + TravelURL.AddOption(*FString::Printf(TEXT("playeridentity=%s"), *DevAuthConfig.PlayerIdentityToken)); TravelURL.AddOption(*FString::Printf(TEXT("login=%s"), *LoginToken)); OnLoadingStarted.Broadcast(); diff --git a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h index ff493e69..e4e64200 100644 --- a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h +++ b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h @@ -47,23 +47,13 @@ class GDKSHOOTER_API ADeploymentsPlayerController : public APlayerController virtual void BeginPlay() override; virtual void EndPlay(const EEndPlayReason::Type Reason) override; - void Populate(const Worker_Alpha_LoginTokensResponse* Deployments); + bool Populate(const Worker_Alpha_LoginTokensResponse* Deployments); FString LatestPIToken; const char * LatestPITokenData; - void QueryDeployments(); - - FTimerHandle QueryDeploymentsTimer; - UFUNCTION(BlueprintCallable) void JoinDeployment(const FString& LoginToken); UFUNCTION(BlueprintCallable) void SetLoadingScreen(UUserWidget* LoadingScreen); - -private: - - void QueryPIT(); - - }; From 8f76b074b0a84eaaf0b4e10c8ebeeff2938412c2 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Mon, 3 Feb 2020 17:31:38 +0800 Subject: [PATCH 02/16] Fix a format issue. --- .../Private/Deployments/DeploymentsPlayerController.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 14ad6c16..c09497ef 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -16,8 +16,8 @@ void ADeploymentsPlayerController::BeginPlay() ActivateTouchInterface(nullptr); bShowMouseCursor = true; - auto SpatialGameInstance = GetGameInstance(); - auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + auto SpatialGameInstance = GetGameInstance(); + auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); if (!SpatialWorkerConnection) { UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); return; From b7e6a7bdadc6e59a4363b5c0b5712de2856890bc Mon Sep 17 00:00:00 2001 From: raymonwang Date: Mon, 3 Feb 2020 18:54:26 +0800 Subject: [PATCH 03/16] * Add some comments. * Remove hard coded dev auth token. --- .../Private/Deployments/DeploymentsPlayerController.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index c09497ef..d4a0dcca 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -23,9 +23,12 @@ void ADeploymentsPlayerController::BeginPlay() return; } + auto SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); + // Register a callback function into SpatialWorkerConnection so it can trigger a custom function written by user when it receive login token from spatial cloud. SpatialWorkerConnection->RegisterOnLoginTokensCallback(std::bind(&ADeploymentsPlayerController::Populate, this, std::placeholders::_1)); - SpatialWorkerConnection->SetConnectionType(ESpatialConnectionType::DevAuthFlow); - SpatialWorkerConnection->DevAuthConfig.DevelopmentAuthToken = TEXT("OGFjOGEwY2UtOTc1Yy00ZDQzLWE5ZTItYzAzMGM2NDU4ZGEzOjozMjE1OWU4Yy1lYmY2LTQzM2ItYjJiZi1hMDM4MjhkYTg1ZWE="); + // We need to call this function to load devAuthToken from command line parameters. + // User should input devAuthToken as one of command line parameters. + SpatialWorkerConnection->TrySetupConnectionConfigFromCommandLine(SpatialWorkerType); SpatialWorkerConnection->Connect(true, 0); } From 5f98cd90e364c700dd7919d00118ff99b384669d Mon Sep 17 00:00:00 2001 From: raymonwang Date: Mon, 3 Feb 2020 19:02:20 +0800 Subject: [PATCH 04/16] Replace spaces with tab. --- .../DeploymentsPlayerController.cpp | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index d4a0dcca..1fe1c7f8 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -12,10 +12,10 @@ void ADeploymentsPlayerController::BeginPlay() { Super::BeginPlay(); - + ActivateTouchInterface(nullptr); bShowMouseCursor = true; - + auto SpatialGameInstance = GetGameInstance(); auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); if (!SpatialWorkerConnection) { @@ -40,11 +40,11 @@ void ADeploymentsPlayerController::EndPlay(const EEndPlayReason::Type Reason) FDeploymentInfo Parse(const Worker_Alpha_LoginTokenDetails LoginToken) { FDeploymentInfo DeploymentInfo; - + DeploymentInfo.DeploymentId = UTF8_TO_TCHAR(LoginToken.deployment_id); DeploymentInfo.DeploymentName = UTF8_TO_TCHAR(LoginToken.deployment_name); DeploymentInfo.LoginToken = UTF8_TO_TCHAR(LoginToken.login_token); - + for (int i = 0; i < (int)LoginToken.tag_count; i++) { FString tag = UTF8_TO_TCHAR(LoginToken.tags[i]); @@ -72,26 +72,26 @@ bool ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon { DeploymentArray.Add(Parse(Deployments->login_tokens[i])); } - - + + DeploymentArray.Sort([](const FDeploymentInfo& lhs, const FDeploymentInfo& rhs) - { + { return lhs.DeploymentName.Compare(rhs.DeploymentName) < 0; }); - + OnDeploymentsReceived.Broadcast(DeploymentArray); - return true; + return true; } void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) { - auto SpatialGameInstance = GetGameInstance(); - auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); - if (!SpatialWorkerConnection) { + auto SpatialGameInstance = GetGameInstance(); + auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + if (!SpatialWorkerConnection) { UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); return; } - + const auto& DevAuthConfig = SpatialWorkerConnection->DevAuthConfig; FURL TravelURL; TravelURL.Host = DevAuthConfig.LocatorHost; @@ -100,7 +100,7 @@ void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) TravelURL.AddOption(*FString::Printf(TEXT("login=%s"), *LoginToken)); OnLoadingStarted.Broadcast(); - + ClientTravel(TravelURL.ToString(), TRAVEL_Absolute, false); } From 1ca89b5eb83ef91401f79059dadad70a8a1b93d8 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Tue, 4 Feb 2020 10:53:54 +0800 Subject: [PATCH 05/16] Fix format issue. --- .../DeploymentsPlayerController.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 1fe1c7f8..c1e3693e 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -12,17 +12,17 @@ void ADeploymentsPlayerController::BeginPlay() { Super::BeginPlay(); - + ActivateTouchInterface(nullptr); bShowMouseCursor = true; - + auto SpatialGameInstance = GetGameInstance(); auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); if (!SpatialWorkerConnection) { UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); return; } - + auto SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); // Register a callback function into SpatialWorkerConnection so it can trigger a custom function written by user when it receive login token from spatial cloud. SpatialWorkerConnection->RegisterOnLoginTokensCallback(std::bind(&ADeploymentsPlayerController::Populate, this, std::placeholders::_1)); @@ -40,11 +40,11 @@ void ADeploymentsPlayerController::EndPlay(const EEndPlayReason::Type Reason) FDeploymentInfo Parse(const Worker_Alpha_LoginTokenDetails LoginToken) { FDeploymentInfo DeploymentInfo; - + DeploymentInfo.DeploymentId = UTF8_TO_TCHAR(LoginToken.deployment_id); DeploymentInfo.DeploymentName = UTF8_TO_TCHAR(LoginToken.deployment_name); DeploymentInfo.LoginToken = UTF8_TO_TCHAR(LoginToken.login_token); - + for (int i = 0; i < (int)LoginToken.tag_count; i++) { FString tag = UTF8_TO_TCHAR(LoginToken.tags[i]); @@ -72,13 +72,13 @@ bool ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon { DeploymentArray.Add(Parse(Deployments->login_tokens[i])); } - - + + DeploymentArray.Sort([](const FDeploymentInfo& lhs, const FDeploymentInfo& rhs) { return lhs.DeploymentName.Compare(rhs.DeploymentName) < 0; }); - + OnDeploymentsReceived.Broadcast(DeploymentArray); return true; } @@ -91,16 +91,16 @@ void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); return; } - + const auto& DevAuthConfig = SpatialWorkerConnection->DevAuthConfig; FURL TravelURL; TravelURL.Host = DevAuthConfig.LocatorHost; TravelURL.AddOption(TEXT("locator")); TravelURL.AddOption(*FString::Printf(TEXT("playeridentity=%s"), *DevAuthConfig.PlayerIdentityToken)); TravelURL.AddOption(*FString::Printf(TEXT("login=%s"), *LoginToken)); - + OnLoadingStarted.Broadcast(); - + ClientTravel(TravelURL.ToString(), TRAVEL_Absolute, false); } From d1beb4d7aec29a25893ca79ad0d9e928497cc990 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Tue, 4 Feb 2020 10:54:56 +0800 Subject: [PATCH 06/16] Set log level to Error. --- .../Private/Deployments/DeploymentsPlayerController.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index c1e3693e..7e7765ba 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -19,7 +19,7 @@ void ADeploymentsPlayerController::BeginPlay() auto SpatialGameInstance = GetGameInstance(); auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); if (!SpatialWorkerConnection) { - UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); + UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); return; } @@ -88,7 +88,7 @@ void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) auto SpatialGameInstance = GetGameInstance(); auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); if (!SpatialWorkerConnection) { - UE_LOG(LogGDK, Log, TEXT("Failure: failed to get SpatialWorkerConnection")); + UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); return; } From 617a44da23882d28b23f3d751b4b64a5e7c0981d Mon Sep 17 00:00:00 2001 From: raymonwang Date: Tue, 4 Feb 2020 13:44:00 +0800 Subject: [PATCH 07/16] Replace std::bind with lambda expression. --- .../Private/Deployments/DeploymentsPlayerController.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 7e7765ba..5b7ecc53 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -25,7 +25,9 @@ void ADeploymentsPlayerController::BeginPlay() auto SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); // Register a callback function into SpatialWorkerConnection so it can trigger a custom function written by user when it receive login token from spatial cloud. - SpatialWorkerConnection->RegisterOnLoginTokensCallback(std::bind(&ADeploymentsPlayerController::Populate, this, std::placeholders::_1)); + SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){ + return Populate(Deployments); + }); // We need to call this function to load devAuthToken from command line parameters. // User should input devAuthToken as one of command line parameters. SpatialWorkerConnection->TrySetupConnectionConfigFromCommandLine(SpatialWorkerType); From ff5748b44dcac7e78d8bc05b5e455321b3a7d669 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Wed, 5 Feb 2020 18:04:41 +0800 Subject: [PATCH 08/16] Delete unused space. --- .../Private/Deployments/DeploymentsPlayerController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 5b7ecc53..fc9facf1 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -77,7 +77,7 @@ bool ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon DeploymentArray.Sort([](const FDeploymentInfo& lhs, const FDeploymentInfo& rhs) - { + { return lhs.DeploymentName.Compare(rhs.DeploymentName) < 0; }); From 69b67becc02f6c71a8c0e54a0c822b495f676508 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Wed, 5 Feb 2020 19:49:47 +0800 Subject: [PATCH 09/16] Remove auto type in our code. --- .../DeploymentsPlayerController.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index fc9facf1..587a164b 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -16,14 +16,15 @@ void ADeploymentsPlayerController::BeginPlay() ActivateTouchInterface(nullptr); bShowMouseCursor = true; - auto SpatialGameInstance = GetGameInstance(); - auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); - if (!SpatialWorkerConnection) { + USpatialGameInstance* SpatialGameInstance = GetGameInstance(); + USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + if (SpatialWorkerConnection == nullptr) + { UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); return; } - auto SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); + FString SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); // Register a callback function into SpatialWorkerConnection so it can trigger a custom function written by user when it receive login token from spatial cloud. SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){ return Populate(Deployments); @@ -87,14 +88,15 @@ bool ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) { - auto SpatialGameInstance = GetGameInstance(); - auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); - if (!SpatialWorkerConnection) { + USpatialGameInstance* SpatialGameInstance = GetGameInstance(); + USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + if (SpatialWorkerConnection == nullptr) + { UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); return; } - const auto& DevAuthConfig = SpatialWorkerConnection->DevAuthConfig; + const FDevAuthConfig& DevAuthConfig = SpatialWorkerConnection->DevAuthConfig; FURL TravelURL; TravelURL.Host = DevAuthConfig.LocatorHost; TravelURL.AddOption(TEXT("locator")); From 3d721bc7f72a202745f84efe6a64c9eaa15e2d6f Mon Sep 17 00:00:00 2001 From: raymonwang Date: Wed, 5 Feb 2020 20:04:13 +0800 Subject: [PATCH 10/16] Remove return in `Populate` function. --- .../Private/Deployments/DeploymentsPlayerController.cpp | 6 +++--- .../Public/Deployments/DeploymentsPlayerController.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 587a164b..655af1e9 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -27,7 +27,8 @@ void ADeploymentsPlayerController::BeginPlay() FString SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); // Register a callback function into SpatialWorkerConnection so it can trigger a custom function written by user when it receive login token from spatial cloud. SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){ - return Populate(Deployments); + Populate(Deployments); + return true; }); // We need to call this function to load devAuthToken from command line parameters. // User should input devAuthToken as one of command line parameters. @@ -68,7 +69,7 @@ FDeploymentInfo Parse(const Worker_Alpha_LoginTokenDetails LoginToken) return DeploymentInfo; } -bool ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensResponse* Deployments) +void ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensResponse* Deployments) { TArray DeploymentArray; for (int i = 0; i < (int)Deployments->login_token_count; i++) @@ -83,7 +84,6 @@ bool ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon }); OnDeploymentsReceived.Broadcast(DeploymentArray); - return true; } void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) diff --git a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h index e4e64200..b7a1c121 100644 --- a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h +++ b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h @@ -47,7 +47,7 @@ class GDKSHOOTER_API ADeploymentsPlayerController : public APlayerController virtual void BeginPlay() override; virtual void EndPlay(const EEndPlayReason::Type Reason) override; - bool Populate(const Worker_Alpha_LoginTokensResponse* Deployments); + void Populate(const Worker_Alpha_LoginTokensResponse* Deployments); FString LatestPIToken; const char * LatestPITokenData; From fbb491d41e29b28c6ef898e98c84737ba50ead53 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Thu, 6 Feb 2020 14:42:19 +0800 Subject: [PATCH 11/16] Clear the callback function to avoid potential crash risk caused by using deleted this ptr. --- .../Deployments/DeploymentsPlayerController.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 655af1e9..89f43830 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -25,19 +25,27 @@ void ADeploymentsPlayerController::BeginPlay() } FString SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); - // Register a callback function into SpatialWorkerConnection so it can trigger a custom function written by user when it receive login token from spatial cloud. SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){ Populate(Deployments); return true; }); - // We need to call this function to load devAuthToken from command line parameters. - // User should input devAuthToken as one of command line parameters. + + // Attempts to load the devAuthToken from the command line. + // If it has not been set, SpatialWorkerConnection would be failed to get PIT. SpatialWorkerConnection->TrySetupConnectionConfigFromCommandLine(SpatialWorkerType); SpatialWorkerConnection->Connect(true, 0); } void ADeploymentsPlayerController::EndPlay(const EEndPlayReason::Type Reason) { + USpatialGameInstance* SpatialGameInstance = GetGameInstance(); + USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + if (SpatialWorkerConnection == nullptr) + { + UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); + return; + } + SpatialWorkerConnection->RegisterOnLoginTokensCallback([](const Worker_Alpha_LoginTokensResponse* Deployments){return false;}); GetWorld()->GetTimerManager().ClearAllTimersForObject(this); } From 671ed8919fff4de5c25059e185baa32475c899e7 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Fri, 7 Feb 2020 16:44:28 +0800 Subject: [PATCH 12/16] Schedule a timer to query new deployments regularly. --- .../Deployments/DeploymentsPlayerController.cpp | 17 +++++++++++++++++ .../Deployments/DeploymentsPlayerController.h | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 89f43830..798ca553 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -27,6 +27,10 @@ void ADeploymentsPlayerController::BeginPlay() FString SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){ Populate(Deployments); + if (!GetWorld()->GetTimerManager().IsTimerActive(QueryDeploymentsTimer)) + { + GetWorld()->GetTimerManager().SetTimer(QueryDeploymentsTimer, this, &ADeploymentsPlayerController::ScheduleRefreshDeployments, 10.0f, true, 0.0f); + } return true; }); @@ -120,3 +124,16 @@ void ADeploymentsPlayerController::SetLoadingScreen(UUserWidget* LoadingScreen) { GetGameInstance()->GetGameViewportClient()->AddViewportWidgetContent(LoadingScreen->TakeWidget()); } + +void ADeploymentsPlayerController::ScheduleRefreshDeployments() +{ + USpatialGameInstance* SpatialGameInstance = GetGameInstance(); + USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); + if (SpatialWorkerConnection == nullptr) + { + UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); + return; + } + + SpatialWorkerConnection->ReuqestDeploymentLoginTokens(); +} diff --git a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h index b7a1c121..772d9a27 100644 --- a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h +++ b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h @@ -51,9 +51,14 @@ class GDKSHOOTER_API ADeploymentsPlayerController : public APlayerController FString LatestPIToken; const char * LatestPITokenData; + FTimerHandle QueryDeploymentsTimer; + UFUNCTION(BlueprintCallable) void JoinDeployment(const FString& LoginToken); UFUNCTION(BlueprintCallable) void SetLoadingScreen(UUserWidget* LoadingScreen); + +private: + void ScheduleRefreshDeployments(); }; From 0330d217eacc0de1a4fe52833666417c3d915fed Mon Sep 17 00:00:00 2001 From: raymonwang Date: Fri, 7 Feb 2020 19:28:42 +0800 Subject: [PATCH 13/16] Change function name. --- .../Private/Deployments/DeploymentsPlayerController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 798ca553..c6b17f15 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -135,5 +135,5 @@ void ADeploymentsPlayerController::ScheduleRefreshDeployments() return; } - SpatialWorkerConnection->ReuqestDeploymentLoginTokens(); + SpatialWorkerConnection->RequestDeploymentLoginTokens(); } From 7878b844696d0a21ab03bca986b546969f5202ed Mon Sep 17 00:00:00 2001 From: raymonwang Date: Tue, 11 Feb 2020 15:27:30 +0800 Subject: [PATCH 14/16] For PR comment. --- .../GDKShooter/Public/Deployments/DeploymentsPlayerController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h index 772d9a27..7c7d847e 100644 --- a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h +++ b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h @@ -52,7 +52,7 @@ class GDKSHOOTER_API ADeploymentsPlayerController : public APlayerController const char * LatestPITokenData; FTimerHandle QueryDeploymentsTimer; - + UFUNCTION(BlueprintCallable) void JoinDeployment(const FString& LoginToken); From 12203ff4a648cb30b13a7939f2ba46894d9bc9b3 Mon Sep 17 00:00:00 2001 From: raymonwang Date: Wed, 12 Feb 2020 18:36:05 +0800 Subject: [PATCH 15/16] Store SpatialWorkerConnection ptr. --- .../DeploymentsPlayerController.cpp | 32 ++++--------------- .../Deployments/DeploymentsPlayerController.h | 3 ++ 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index c6b17f15..c879c366 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -17,12 +17,7 @@ void ADeploymentsPlayerController::BeginPlay() bShowMouseCursor = true; USpatialGameInstance* SpatialGameInstance = GetGameInstance(); - USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); - if (SpatialWorkerConnection == nullptr) - { - UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); - return; - } + SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); FString SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){ @@ -42,14 +37,8 @@ void ADeploymentsPlayerController::BeginPlay() void ADeploymentsPlayerController::EndPlay(const EEndPlayReason::Type Reason) { - USpatialGameInstance* SpatialGameInstance = GetGameInstance(); - USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); - if (SpatialWorkerConnection == nullptr) - { - UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); - return; - } - SpatialWorkerConnection->RegisterOnLoginTokensCallback([](const Worker_Alpha_LoginTokensResponse* Deployments){return false;}); + if (SpatialWorkerConnection != nullptr) + SpatialWorkerConnection->RegisterOnLoginTokensCallback([](const Worker_Alpha_LoginTokensResponse* Deployments){return false;}); GetWorld()->GetTimerManager().ClearAllTimersForObject(this); } @@ -100,11 +89,9 @@ void ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) { - USpatialGameInstance* SpatialGameInstance = GetGameInstance(); - USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); if (SpatialWorkerConnection == nullptr) { - UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); + UE_LOG(LogGDK, Error, TEXT("Failure: failed to Join Deployment caused by SpatialWorkerConnection is nullptr")); return; } @@ -127,13 +114,6 @@ void ADeploymentsPlayerController::SetLoadingScreen(UUserWidget* LoadingScreen) void ADeploymentsPlayerController::ScheduleRefreshDeployments() { - USpatialGameInstance* SpatialGameInstance = GetGameInstance(); - USpatialWorkerConnection* SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); - if (SpatialWorkerConnection == nullptr) - { - UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection")); - return; - } - - SpatialWorkerConnection->RequestDeploymentLoginTokens(); + if (SpatialWorkerConnection != nullptr) + SpatialWorkerConnection->RequestDeploymentLoginTokens(); } diff --git a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h index 7c7d847e..830b0ce5 100644 --- a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h +++ b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h @@ -9,6 +9,8 @@ #include "DeploymentsPlayerController.generated.h" +class USpatialWorkerConnection; + USTRUCT(BlueprintType) struct FDeploymentInfo { GENERATED_BODY() @@ -52,6 +54,7 @@ class GDKSHOOTER_API ADeploymentsPlayerController : public APlayerController const char * LatestPITokenData; FTimerHandle QueryDeploymentsTimer; + USpatialWorkerConnection* SpatialWorkerConnection = nullptr; UFUNCTION(BlueprintCallable) void JoinDeployment(const FString& LoginToken); From 233a294f59a99a634e5a2365ef385c9a69f1c40f Mon Sep 17 00:00:00 2001 From: wangxin Date: Mon, 17 Feb 2020 09:45:56 +0800 Subject: [PATCH 16/16] Update Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp Co-Authored-By: jessicafalk <31853332+jessicafalk@users.noreply.github.com> --- .../Private/Deployments/DeploymentsPlayerController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index c879c366..41e792e4 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -30,7 +30,7 @@ void ADeploymentsPlayerController::BeginPlay() }); // Attempts to load the devAuthToken from the command line. - // If it has not been set, SpatialWorkerConnection would be failed to get PIT. + // If it has not been set, SpatialWorkerConnection will fail to retrieve a PIT. SpatialWorkerConnection->TrySetupConnectionConfigFromCommandLine(SpatialWorkerType); SpatialWorkerConnection->Connect(true, 0); }