Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MBL-19 Remove some hard coded logics in ADeploymentsPlayerController. #94

Merged
merged 17 commits into from
Feb 19, 2020
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -16,79 +16,27 @@ 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<ADeploymentsPlayerController*>(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<ADeploymentsPlayerController*>(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);
}
auto SpatialGameInstance = GetGameInstance<USpatialGameInstance>();
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection();
if (!SpatialWorkerConnection) {
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection"));
return;
}
else
{
UE_LOG(LogGDK, Log, TEXT("Failure: Error %s"), UTF8_TO_TCHAR(PIToken->status.detail));
ADeploymentsPlayerController* controller = static_cast<ADeploymentsPlayerController*>(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);
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.
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
SpatialWorkerConnection->RegisterOnLoginTokensCallback([this](const Worker_Alpha_LoginTokensResponse* Deployments){
return Populate(Deployments);
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
});
// We need to call this function to load devAuthToken from command line parameters.
// User should input devAuthToken as one of command line parameters.
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
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);
}
GetWorld()->GetTimerManager().ClearAllTimersForObject(this);
}

FDeploymentInfo Parse(const Worker_Alpha_LoginTokenDetails LoginToken)
Expand Down Expand Up @@ -119,7 +67,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<FDeploymentInfo> DeploymentArray;
for (int i = 0; i < (int)Deployments->login_token_count; i++)
Expand All @@ -134,16 +82,25 @@ void ADeploymentsPlayerController::Populate(const Worker_Alpha_LoginTokensRespon
});

OnDeploymentsReceived.Broadcast(DeploymentArray);
return true;
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
}

void ADeploymentsPlayerController::JoinDeployment(const FString& LoginToken)
{
auto SpatialGameInstance = GetGameInstance<USpatialGameInstance>();
auto SpatialWorkerConnection = SpatialGameInstance->GetSpatialWorkerConnection();
if (!SpatialWorkerConnection) {
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
UE_LOG(LogGDK, Error, TEXT("Failure: failed to get SpatialWorkerConnection"));
return;
}

const auto& DevAuthConfig = SpatialWorkerConnection->DevAuthConfig;
FURL TravelURL;
TravelURL.Host = TEXT("locator.improbable.io");
TravelURL.Host = DevAuthConfig.LocatorHost;
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
TravelURL.AddOption(TEXT("locator"));
TravelURL.AddOption(*FString::Printf(TEXT("playeridentity=%s"), *LatestPIToken));
TravelURL.AddOption(*FString::Printf(TEXT("playeridentity=%s"), *DevAuthConfig.PlayerIdentityToken));
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
TravelURL.AddOption(*FString::Printf(TEXT("login=%s"), *LoginToken));

OnLoadingStarted.Broadcast();

ClientTravel(TravelURL.ToString(), TRAVEL_Absolute, false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
raymonwang marked this conversation as resolved.
Show resolved Hide resolved
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();


};