From b9fff1cc545dbea66746a2df4f7a511978cf6f59 Mon Sep 17 00:00:00 2001 From: PHILIP WHITE Date: Tue, 3 Dec 2024 23:56:13 +0000 Subject: [PATCH] Update Advanced Sessions Steam Plugin --- .../AdvancedSessions/AdvancedSessions.uplugin | 4 +-- .../Classes/AdvancedFriendsGameInstance.h | 7 ++++ .../FindSessionsCallbackProxyAdvanced.h | 4 +-- .../Private/AdvancedFriendsGameInstance.cpp | 35 +++++++++++++++++++ .../FindSessionsCallbackProxyAdvanced.cpp | 12 +++---- 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/Plugins/AdvancedSessions/AdvancedSessions.uplugin b/Plugins/AdvancedSessions/AdvancedSessions.uplugin index 7dc2e3a..a970a4a 100644 --- a/Plugins/AdvancedSessions/AdvancedSessions.uplugin +++ b/Plugins/AdvancedSessions/AdvancedSessions.uplugin @@ -1,8 +1,8 @@ { "FileVersion": 3, "FriendlyName": "Advanced Sessions", - "Version": 5.4, - "VersionName": "5.4", + "Version": 5.5, + "VersionName": "5.5", "Description": "Adds new blueprint functions to handle more advanced session operations.", "Category": "Advanced Sessions Plugin", "CreatedBy": "Joshua Statzer", diff --git a/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h b/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h index be1def9..29d5018 100644 --- a/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/AdvancedFriendsGameInstance.h +++ b/Plugins/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/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h b/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h index e610277..5d225d8 100644 --- a/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h +++ b/Plugins/AdvancedSessions/Source/AdvancedSessions/Classes/FindSessionsCallbackProxyAdvanced.h @@ -28,7 +28,7 @@ class UFindSessionsCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase // Searches for advertised sessions with the default online subsystem and includes an array of filters UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject", AutoCreateRefTerm="Filters"), Category = "Online|AdvancedSessions") - static UFindSessionsCallbackProxyAdvanced* FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int32 MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly = false, bool bNonEmptyServersOnly = false, bool bSecureServersOnly = false, bool bSearchLobbies = true, int MinSlotsAvailable = 0); + static UFindSessionsCallbackProxyAdvanced* FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int32 MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly = false, bool bNonEmptyServersOnly = false, bool bSecureServersOnly = false, /*bool bSearchLobbies = true,*/ int MinSlotsAvailable = 0); static bool CompareVariants(const FVariantData &A, const FVariantData &B, EOnlineComparisonOpRedux Comparator); @@ -99,7 +99,7 @@ private: bool bSecureServersOnly; // Search through lobbies - bool bSearchLobbies; + //bool bSearchLobbies; // Min slots requires to search int MinSlotsAvailable; diff --git a/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp b/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp index 47afb6a..706bae5 100644 --- a/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/AdvancedFriendsGameInstance.cpp +++ b/Plugins/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 { diff --git a/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp b/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp index dc0dc4b..7325caa 100644 --- a/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp +++ b/Plugins/AdvancedSessions/Source/AdvancedSessions/Private/FindSessionsCallbackProxyAdvanced.cpp @@ -16,7 +16,7 @@ UFindSessionsCallbackProxyAdvanced::UFindSessionsCallbackProxyAdvanced(const FOb bIsOnSecondSearch = false; } -UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly, bool bNonEmptyServersOnly, bool bSecureServersOnly, bool bSearchLobbies, int MinSlotsAvailable) +UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray &Filters, bool bEmptyServersOnly, bool bNonEmptyServersOnly, bool bSecureServersOnly, /*bool bSearchLobbies,*/ int MinSlotsAvailable) { UFindSessionsCallbackProxyAdvanced* Proxy = NewObject(); Proxy->PlayerControllerWeakPtr = PlayerController; @@ -28,7 +28,7 @@ UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSess Proxy->bEmptyServersOnly = bEmptyServersOnly, Proxy->bNonEmptyServersOnly = bNonEmptyServersOnly; Proxy->bSecureServersOnly = bSecureServersOnly; - Proxy->bSearchLobbies = bSearchLobbies; + //Proxy->bSearchLobbies = bSearchLobbies; Proxy->MinSlotsAvailable = MinSlotsAvailable; return Proxy; } @@ -114,9 +114,9 @@ void UFindSessionsCallbackProxyAdvanced::Activate() case EBPServerPresenceSearchType::ClientServersOnly: { - tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); + //tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); - if (bSearchLobbies && !IOnlineSubsystem::DoesInstanceExist("STEAM")) + //if (bSearchLobbies)// && !IOnlineSubsystem::DoesInstanceExist("STEAM")) tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals); } break; @@ -140,9 +140,9 @@ void UFindSessionsCallbackProxyAdvanced::Activate() FOnlineSearchSettingsEx DedicatedOnly = tem; - tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); + //tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); - if (bSearchLobbies && !IOnlineSubsystem::DoesInstanceExist("STEAM")) + //if (bSearchLobbies)// && !IOnlineSubsystem::DoesInstanceExist("STEAM")) tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals); //DedicatedOnly.Set(SEARCH_DEDICATED_ONLY, true, EOnlineComparisonOp::Equals);