From 7f8fce48cd5f5bf2306df25230ee9e0cd6c11776 Mon Sep 17 00:00:00 2001 From: eyakm1 Date: Wed, 31 May 2023 08:20:51 +0300 Subject: [PATCH] Now we can connect to the first session from the list --- .../MyGameInstanceSubsystem.cpp | 35 +++++++++++++++++-- .../MyGameInstanceSubsystem.h | 6 ++-- Source/TurnBasedTutorial/MyMainMenu.cpp | 12 +++++-- Source/TurnBasedTutorial/MyMainMenu.h | 3 ++ .../TurnBasedTutorial/MySessionListWidget.cpp | 28 ++++++++++++++- .../TurnBasedTutorial/MySessionListWidget.h | 5 +++ 6 files changed, 80 insertions(+), 9 deletions(-) diff --git a/Source/TurnBasedTutorial/MyGameInstanceSubsystem.cpp b/Source/TurnBasedTutorial/MyGameInstanceSubsystem.cpp index 4f8f813..3976783 100644 --- a/Source/TurnBasedTutorial/MyGameInstanceSubsystem.cpp +++ b/Source/TurnBasedTutorial/MyGameInstanceSubsystem.cpp @@ -3,6 +3,7 @@ #include "MyGameInstanceSubsystem.h" #include "OnlineSubsystemUtils.h" +#include "Kismet/GameplayStatics.h" UMyGameInstanceSubsystem::UMyGameInstanceSubsystem() : CreateSessionCompleteDelegate( FOnCreateSessionCompleteDelegate::CreateUObject( @@ -45,7 +46,6 @@ void UMyGameInstanceSubsystem::CreateSession(int32 NumPublicConnections, bool bI LastSessionSettings->bAllowJoinInProgress = true; LastSessionSettings->bAllowJoinViaPresence = true; LastSessionSettings->bAllowJoinViaPresenceFriendsOnly = true; - LastSessionSettings->bIsDedicated = false; LastSessionSettings->bUsesPresence = true; LastSessionSettings->bIsLANMatch = bIsLANMatch; LastSessionSettings->bShouldAdvertise = true; @@ -147,8 +147,10 @@ void UMyGameInstanceSubsystem::OnStartSessionCompleted(FName SessionName, bool b { SessionInterface->ClearOnStartSessionCompleteDelegate_Handle(StartSessionCompleteDelegateHandle); } - OnStartSessionCompleteEvent.Broadcast(bSuccessful); + + // TODO: Move this from gameinstance subsystem. This should not be here. + UGameplayStatics::OpenLevel(GetWorld(),"BattleFieldMap", true, "listen"); } @@ -235,7 +237,7 @@ void UMyGameInstanceSubsystem::FindSessions(int32 MaxSearchResults, bool bIsLANQ LastSessionSearch->bIsLanQuery = bIsLANQuery; // Disable dedicated server search (maybe enable later, when dedicated server is implemented) - LastSessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); + // LastSessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController(); if (!SessionInterface->FindSessions(*LocalPlayer->GetPreferredUniqueNetId(), LastSessionSearch.ToSharedRef())) @@ -286,6 +288,33 @@ void UMyGameInstanceSubsystem::JoinSession(const FOnlineSessionSearchResult& Ses } } +void UMyGameInstanceSubsystem::JoinSession(const int32 Index) +{ + const IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); + if (!SessionInterface.IsValid()) + { + OnJoinSessionCompleteEvent.Broadcast(EOnJoinSessionCompleteResult::UnknownError); + return; + } + if (!LastSessionSearch.IsValid() || Index >= LastSessionSearch->SearchResults.Num()) + { + OnJoinSessionCompleteEvent.Broadcast(EOnJoinSessionCompleteResult::UnknownError); + return; + } + + JoinSessionCompleteDelegateHandle = SessionInterface->AddOnJoinSessionCompleteDelegate_Handle( + JoinSessionCompleteDelegate); + + const ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController(); + if (!SessionInterface->JoinSession(*LocalPlayer->GetPreferredUniqueNetId(), NAME_GameSession, + LastSessionSearch->SearchResults[Index])) + { + SessionInterface->ClearOnJoinSessionCompleteDelegate_Handle(JoinSessionCompleteDelegateHandle); + + OnJoinSessionCompleteEvent.Broadcast(EOnJoinSessionCompleteResult::UnknownError); + } +} + void UMyGameInstanceSubsystem::OnJoinSessionCompleted(FName SessionName, EOnJoinSessionCompleteResult::Type Result) { diff --git a/Source/TurnBasedTutorial/MyGameInstanceSubsystem.h b/Source/TurnBasedTutorial/MyGameInstanceSubsystem.h index 7ad7735..10dbc5b 100644 --- a/Source/TurnBasedTutorial/MyGameInstanceSubsystem.h +++ b/Source/TurnBasedTutorial/MyGameInstanceSubsystem.h @@ -48,6 +48,10 @@ public: void JoinSession(const FOnlineSessionSearchResult& SessionSearchResult); + void JoinSession(const int32 Index); + + bool TryConnectToCurrentSession() const; + FMyOnCreateSessionComplete OnCreateSessionCompleteEvent; FMyOnUpdateSessionComplete OnUpdateSessionCompleteEvent; FMyOnStartSessionCompete OnStartSessionCompleteEvent; @@ -71,8 +75,6 @@ protected: void OnJoinSessionCompleted(FName SessionName, EOnJoinSessionCompleteResult::Type Result); - bool TryConnectToCurrentSession() const; - private: FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate; FDelegateHandle CreateSessionCompleteDelegateHandle; diff --git a/Source/TurnBasedTutorial/MyMainMenu.cpp b/Source/TurnBasedTutorial/MyMainMenu.cpp index a7b4750..a80d116 100644 --- a/Source/TurnBasedTutorial/MyMainMenu.cpp +++ b/Source/TurnBasedTutorial/MyMainMenu.cpp @@ -11,15 +11,21 @@ void UMyMainMenu::NativeConstruct() Super::NativeConstruct(); HostOnlineGameButton->OnClicked.AddDynamic(this, &ThisClass::UMyMainMenu::OnHostOnlineGameButtonClicked); + + GetMyGameSubsystem()->OnCreateSessionCompleteEvent.AddDynamic(this, &ThisClass::StartSessionWhenCreatingSessonComplete); } void UMyMainMenu::OnHostOnlineGameButtonClicked() { - GetMyGameSubsystem()->CreateSession(1, true); - UGameplayStatics::OpenLevel(GetWorld(), FName(TEXT("BattleFieldMap"))); - this->RemoveFromParent(); + GetMyGameSubsystem()->CreateSession(2, true); } +void UMyMainMenu::StartSessionWhenCreatingSessonComplete(bool bSuccess) +{ + GetMyGameSubsystem()->StartSession(); +} + + UMyGameInstanceSubsystem* UMyMainMenu::GetMyGameSubsystem() const { const UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(GetWorld()); diff --git a/Source/TurnBasedTutorial/MyMainMenu.h b/Source/TurnBasedTutorial/MyMainMenu.h index aa65ef3..f316b9f 100644 --- a/Source/TurnBasedTutorial/MyMainMenu.h +++ b/Source/TurnBasedTutorial/MyMainMenu.h @@ -26,6 +26,9 @@ protected: UFUNCTION() void OnHostOnlineGameButtonClicked(); + UFUNCTION() + void StartSessionWhenCreatingSessonComplete(bool bSuccess); + private: UMyGameInstanceSubsystem* GetMyGameSubsystem() const; }; diff --git a/Source/TurnBasedTutorial/MySessionListWidget.cpp b/Source/TurnBasedTutorial/MySessionListWidget.cpp index f962ca7..4c69dc5 100644 --- a/Source/TurnBasedTutorial/MySessionListWidget.cpp +++ b/Source/TurnBasedTutorial/MySessionListWidget.cpp @@ -6,15 +6,19 @@ #include "MyGameInstanceSubsystem.h" #include "Components/VerticalBox.h" #include "MySessionListEntryWidget.h" +#include "Components/Button.h" #include "Kismet/GameplayStatics.h" void UMySessionListWidget::NativeConstruct() { Super::NativeConstruct(); + RefreshListButton->OnClicked.AddDynamic(this, &ThisClass::OnRefreshListButtonClicked); + ConnectToSelectedSessionButton->OnClicked.AddDynamic(this, &ThisClass::ConnectToFirstSession); + const auto MyGameInstanceSubsystem = GetMyGameSubsystem(); MyGameInstanceSubsystem->OnFindSessionsCompleteEvent.AddUObject(this, &ThisClass::RefreshList); - + MyGameInstanceSubsystem->OnJoinSessionCompleteEvent.AddUObject(this, &ThisClass::OnJoinSessionSuccess); // Initiate search MyGameInstanceSubsystem->FindSessions(10, true); @@ -43,9 +47,31 @@ void UMySessionListWidget::OnRefreshListButtonClicked() { // TODO: Show that we started searching... // Initiate search + SessionListBox->ClearChildren(); GetMyGameSubsystem()->FindSessions(10, true); } +void UMySessionListWidget::ConnectToFirstSession() +{ + GetMyGameSubsystem()->JoinSession(0); +} + + +void UMySessionListWidget::OnJoinSessionSuccess(EOnJoinSessionCompleteResult::Type Result) +{ + if (Result != EOnJoinSessionCompleteResult::Success) + { + UE_LOG(LogTemp, Error, TEXT("Failed to connect to session!!")); + return; + } + if (!GetMyGameSubsystem()->TryConnectToCurrentSession()) + { + UE_LOG(LogTemp, Error, TEXT("Failed to travel client to session!!")); + return; + } + UE_LOG(LogTemp, Display, TEXT("Connected and travelled to session!!!")); +} + UMyGameInstanceSubsystem* UMySessionListWidget::GetMyGameSubsystem() const { diff --git a/Source/TurnBasedTutorial/MySessionListWidget.h b/Source/TurnBasedTutorial/MySessionListWidget.h index bae8515..e305a8d 100644 --- a/Source/TurnBasedTutorial/MySessionListWidget.h +++ b/Source/TurnBasedTutorial/MySessionListWidget.h @@ -35,10 +35,15 @@ protected: TSubclassOf EntryClass; void RefreshList(const TArray& SessionResults, bool bSuccessful); + + void OnJoinSessionSuccess(EOnJoinSessionCompleteResult::Type Result); private: UMyGameInstanceSubsystem* GetMyGameSubsystem() const; UFUNCTION() void OnRefreshListButtonClicked(); + + UFUNCTION() + void ConnectToFirstSession(); };