From d8e3d9cbff293ebbc560b3656f623a7946e5af36 Mon Sep 17 00:00:00 2001 From: Uno1982 Date: Sun, 29 Sep 2024 20:19:35 -0500 Subject: [PATCH] Join and Invite Steam FriendsUI sub menu support --- .../Classes/AdvancedFriendsGameInstance.h | 7 ++++ .../Private/AdvancedFriendsGameInstance.cpp | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h b/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h index be1def9..29d5018 100644 --- a/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h +++ b/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h @@ -52,6 +52,13 @@ public: FOnSessionInviteReceivedDelegate SessionInviteReceivedDelegate; FDelegateHandle SessionInviteReceivedDelegateHandle; + // custom handle to join directly from steam ui "Join Game" + FDelegateHandle OnJoinSessionCompleteDelegateHandle; + // custom Steam UI Join User function #Self invite# + void OnSessionUserInviteAccepted(const bool bWasSuccessful, const int32 ControllerId, FUniqueNetIdPtr UserId, const FOnlineSessionSearchResult& InviteResult); + // custom Steam UI function to client travel #Self invite# + void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result); + //const FUniqueNetId& /*UserId*/, const FUniqueNetId& /*FromId*/, const FString& /*AppId*/, const FOnlineSessionSearchResult& /*InviteResult*/ void OnSessionInviteReceivedMaster(const FUniqueNetId & PersonInvited, const FUniqueNetId & PersonInviting, const FString & AppId, const FOnlineSessionSearchResult& SessionToJoin); diff --git a/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp b/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp index 47afb6a..706bae5 100644 --- a/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp +++ b/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp @@ -20,6 +20,37 @@ UAdvancedFriendsGameInstance::UAdvancedFriendsGameInstance(const FObjectInitiali { } +void UAdvancedFriendsGameInstance::OnSessionUserInviteAccepted(const bool bWasSuccessful, const int32 ControllerId, FUniqueNetIdPtr UserId, const FOnlineSessionSearchResult& InviteResult) +{ + IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); + if (SessionInterface.IsValid()) + { + SessionInterface->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle); + OnJoinSessionCompleteDelegateHandle = SessionInterface->AddOnJoinSessionCompleteDelegate_Handle( + FOnJoinSessionCompleteDelegate::CreateUObject(this, &UAdvancedFriendsGameInstance::OnJoinSessionComplete)); + + SessionInterface->JoinSession(0, NAME_GameSession, InviteResult); + } + UE_LOG(AdvancedFriendsInterfaceLog, Log, TEXT("Called Join Session for Steam Friends List UI InviteResults: %s, UserId: %s"), *InviteResult.GetSessionIdStr(), *UserId->ToString()); +} + +void UAdvancedFriendsGameInstance::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result) +{ + IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); + if (SessionInterface.IsValid()) + { + FString ConnectInfo; + if (SessionInterface->GetResolvedConnectString(NAME_GameSession, ConnectInfo)) + { + APlayerController* PlayerController = GetFirstLocalPlayerController(); + if (PlayerController) + { + PlayerController->ClientTravel(ConnectInfo, ETravelType::TRAVEL_Absolute); + } + } + } +} + void UAdvancedFriendsGameInstance::Shutdown() { IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); @@ -34,6 +65,7 @@ void UAdvancedFriendsGameInstance::Shutdown() // Clear all of the delegate handles here SessionInterface->ClearOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegateHandle); SessionInterface->ClearOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegateHandle); + SessionInterface->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle); } @@ -80,6 +112,9 @@ void UAdvancedFriendsGameInstance::Init() SessionInviteAcceptedDelegateHandle = SessionInterface->AddOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegate); SessionInviteReceivedDelegateHandle = SessionInterface->AddOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegate); + + // Custom steam join game delegate + SessionInterface->OnSessionUserInviteAcceptedDelegates.AddUObject(this, &UAdvancedFriendsGameInstance::OnSessionUserInviteAccepted); } else {