diff --git a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp index 5aab74d4..41e792e4 100644 --- a/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp +++ b/Game/Source/GDKShooter/Private/Deployments/DeploymentsPlayerController.cpp @@ -16,79 +16,30 @@ void ADeploymentsPlayerController::BeginPlay() ActivateTouchInterface(nullptr); bShowMouseCursor = true; - QueryPIT(); -} - -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); + USpatialGameInstance* SpatialGameInstance = GetGameInstance(); + SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection(); - if (controller->GetWorld()->GetTimerManager().IsTimerActive(controller->QueryDeploymentsTimer)) + FString SpatialWorkerType = SpatialGameInstance->GetSpatialWorkerType().ToString(); + SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){ + Populate(Deployments); + if (!GetWorld()->GetTimerManager().IsTimerActive(QueryDeploymentsTimer)) { - controller->GetWorld()->GetTimerManager().ClearTimer(controller->QueryDeploymentsTimer); + GetWorld()->GetTimerManager().SetTimer(QueryDeploymentsTimer, this, &ADeploymentsPlayerController::ScheduleRefreshDeployments, 10.0f, true, 0.0f); } - } -} - -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); + return true; + }); + + // Attempts to load the devAuthToken from the command line. + // If it has not been set, SpatialWorkerConnection will fail to retrieve a PIT. + SpatialWorkerConnection->TrySetupConnectionConfigFromCommandLine(SpatialWorkerType); + SpatialWorkerConnection->Connect(true, 0); } -void ADeploymentsPlayerController::QueryPIT() +void ADeploymentsPlayerController::EndPlay(const EEndPlayReason::Type Reason) { - 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); - } + if (SpatialWorkerConnection != nullptr) + SpatialWorkerConnection->RegisterOnLoginTokensCallback([](const Worker_Alpha_LoginTokensResponse* Deployments){return false;}); + GetWorld()->GetTimerManager().ClearAllTimersForObject(this); } FDeploymentInfo Parse(const Worker_Alpha_LoginTokenDetails LoginToken) @@ -138,12 +89,19 @@ void ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken) { + if (SpatialWorkerConnection == nullptr) + { + UE_LOG(LogGDK, Error, TEXT("Failure: failed to Join Deployment caused by SpatialWorkerConnection is nullptr")); + return; + } + + const FDevAuthConfig& 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(); ClientTravel(TravelURL.ToString(), TRAVEL_Absolute, false); @@ -153,3 +111,9 @@ void ADeploymentsPlayerController::SetLoadingScreen(UUserWidget* LoadingScreen) { GetGameInstance()->GetGameViewportClient()->AddViewportWidgetContent(LoadingScreen->TakeWidget()); } + +void ADeploymentsPlayerController::ScheduleRefreshDeployments() +{ + if (SpatialWorkerConnection != nullptr) + SpatialWorkerConnection->RequestDeploymentLoginTokens(); +} diff --git a/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h b/Game/Source/GDKShooter/Public/Deployments/DeploymentsPlayerController.h index ff493e69..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() @@ -51,19 +53,15 @@ class GDKSHOOTER_API ADeploymentsPlayerController : public APlayerController FString LatestPIToken; const char * LatestPITokenData; - void QueryDeployments(); - FTimerHandle QueryDeploymentsTimer; + USpatialWorkerConnection* SpatialWorkerConnection = nullptr; UFUNCTION(BlueprintCallable) void JoinDeployment(const FString& LoginToken); UFUNCTION(BlueprintCallable) void SetLoadingScreen(UUserWidget* LoadingScreen); - -private: - - void QueryPIT(); - +private: + void ScheduleRefreshDeployments(); };