From bc219f373d4ea2c75b6b6b415fb24fea8c91027d Mon Sep 17 00:00:00 2001 From: Norman Lansing Date: Sun, 5 Apr 2026 16:43:32 -0400 Subject: [PATCH] Lesson 79 - Handle Game Session Status --- .../Developer/RiderLink/Resources/checksum | 2 +- Plugins/Developer/RiderLink/RiderLink.uplugin | 2 +- .../Private/UI/Portal/PortalManager.cpp | 62 +++++++++++++++++-- .../Public/UI/Portal/PortalManager.h | 6 ++ 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/Plugins/Developer/RiderLink/Resources/checksum b/Plugins/Developer/RiderLink/Resources/checksum index dc1c9539..201646f8 100644 --- a/Plugins/Developer/RiderLink/Resources/checksum +++ b/Plugins/Developer/RiderLink/Resources/checksum @@ -1 +1 @@ -‘×Ã5æL9OHnŸqè \ No newline at end of file +Ü‹Tü¨HçTüµ¢j÷~ \ No newline at end of file diff --git a/Plugins/Developer/RiderLink/RiderLink.uplugin b/Plugins/Developer/RiderLink/RiderLink.uplugin index 55b6e7da..9c90ef82 100644 --- a/Plugins/Developer/RiderLink/RiderLink.uplugin +++ b/Plugins/Developer/RiderLink/RiderLink.uplugin @@ -1,7 +1,7 @@ { "FileVersion": 3, "Version": 1, - "VersionName": "2025.3.0.1708", + "VersionName": "2025.3.3", "FriendlyName": "RiderLink", "Description": "Plugin for establishing IPC connection with JetBrains Rider IDE", "Category": "Programming", diff --git a/Source/DedicatedServers/Private/UI/Portal/PortalManager.cpp b/Source/DedicatedServers/Private/UI/Portal/PortalManager.cpp index e9e54522..3c66bd13 100644 --- a/Source/DedicatedServers/Private/UI/Portal/PortalManager.cpp +++ b/Source/DedicatedServers/Private/UI/Portal/PortalManager.cpp @@ -6,6 +6,7 @@ #include "HttpModule.h" #include "JsonObjectConverter.h" #include "Data/API/APIData.h" +#include "GameFramework/PlayerState.h" #include "GameplayTags/DedicatedServerTags.h" #include "Interfaces/IHttpResponse.h" #include "UI/HTTP/HTTPRequestTypes.h" @@ -30,8 +31,6 @@ void UPortalManager::JoinGameSession() void UPortalManager::FindOrCreateGameSession_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) { - GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Find or Create Game Session Response Received")); - if (!bWasSuccessful) { BroadcastJoinGameSessionMessage.Broadcast(HTTPStatusMessages::SomethingWentWrong, true); @@ -45,8 +44,7 @@ void UPortalManager::FindOrCreateGameSession_Response(FHttpRequestPtr Request, F { BroadcastJoinGameSessionMessage.Broadcast(HTTPStatusMessages::SomethingWentWrong, true); } - DumpMetadata(JsonObject); - + if (JsonObject->HasField(TEXT("GameProperties"))) { auto PropertiesArray = JsonObject->GetArrayField(TEXT("GameProperties")); @@ -66,7 +64,59 @@ void UPortalManager::FindOrCreateGameSession_Response(FHttpRequestPtr Request, F FDSGameSession GameSession; FJsonObjectConverter::JsonObjectToUStruct(JsonObject.ToSharedRef(), &GameSession); - GameSession.Dump(); - BroadcastJoinGameSessionMessage.Broadcast(TEXT("Found Game Session."), false); + + const FString GameSessionId = GameSession.GameSessionId; + const FString GameSessionStatus = GameSession.Status; + const FString UniquePlayerId = GetUniquePlayerId(); + + HandleGameSessionStatus(GameSessionId, GameSessionStatus); + } } + +FString UPortalManager::GetUniquePlayerId() const +{ + APlayerController* LocalPlayerController = GEngine->GetFirstLocalPlayerController(GetWorld()); + if (IsValid(LocalPlayerController)) + { + APlayerState* LocalPlayerState = LocalPlayerController->GetPlayerState(); + if (IsValid(LocalPlayerState) && LocalPlayerState->GetUniqueId().IsValid()) + { + return TEXT("Player_") + FString::FromInt(LocalPlayerState->GetUniqueID()); + } + } + return FString(); +} + +void UPortalManager::HandleGameSessionStatus(const FString& Status, const FString& SessionId) +{ + + if (Status.Equals(TEXT("ACTIVE"))) + { + BroadcastJoinGameSessionMessage.Broadcast(TEXT("Found Active Game Session. Creating Player Session..."), false); + TryCreatePlayerSession(GetUniquePlayerId(), SessionId); + } + else if (Status.Equals(TEXT("ACTIVATING"))) + { + FTimerDelegate CreateSessionDelegate; + CreateSessionDelegate.BindLambda([this]() + { + JoinGameSession(); + }); + APlayerController* LocalPlayerController = GEngine->GetFirstLocalPlayerController(GetWorld()); + if (IsValid(LocalPlayerController)) + { + LocalPlayerController->GetWorldTimerManager().SetTimer(CreateSessionTimer, CreateSessionDelegate, 0.5f, false); + } + + } + else + { + BroadcastJoinGameSessionMessage.Broadcast(HTTPStatusMessages::SomethingWentWrong, true); + + } +} + +void UPortalManager::TryCreatePlayerSession(const FString& PlayerId, const FString& GameSessionId) +{ +} diff --git a/Source/DedicatedServers/Public/UI/Portal/PortalManager.h b/Source/DedicatedServers/Public/UI/Portal/PortalManager.h index 6c1f1c7b..9bb57c93 100644 --- a/Source/DedicatedServers/Public/UI/Portal/PortalManager.h +++ b/Source/DedicatedServers/Public/UI/Portal/PortalManager.h @@ -27,4 +27,10 @@ public: private: void FindOrCreateGameSession_Response(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful); + FString GetUniquePlayerId() const; + void HandleGameSessionStatus(const FString& Status, const FString& SessionId); + void TryCreatePlayerSession(const FString& PlayerId, const FString& GameSessionId); + + FTimerHandle CreateSessionTimer; + };