3 Commits

Author SHA1 Message Date
Joshua
76cf3f6b4c correct the create session node not passing on bAllowJoingViaPresence 2022-06-24 08:10:45 -04:00
Joshua (MordenTral) Statzer
9210d88f3f Merge pull request #30 from uno1982/master
Add server travel blueprint node.
2022-03-11 13:45:35 -05:00
mordentral
f9e794cd4a fixed wrong steam api call
fixed wrong steam api call
2021-10-19 21:32:24 -04:00
65 changed files with 4734 additions and 5693 deletions

2
.gitattributes vendored
View File

@@ -1,2 +0,0 @@
* text=auto
*.bat eol=crlf

View File

@@ -1,34 +1,30 @@
{ {
"FileVersion": 3, "FileVersion" : 3,
"FriendlyName": "Advanced Sessions",
"Version": 5.5, "FriendlyName" : "Advanced Sessions",
"VersionName": "5.5", "Version" : 4.26,
"Description": "Adds new blueprint functions to handle more advanced session operations.", "VersionName": "4.26",
"Category": "Advanced Sessions Plugin", "Description" : "Adds new blueprint functions to handle more advanced session operations.",
"CreatedBy": "Joshua Statzer", "Category" : "Advanced Sessions Plugin",
"CreatedByURL": "N/A", "CreatedBy" : "Joshua Statzer",
"Modules": [ "CreatedByURL" : "N/A",
{
"Name": "AdvancedSessions", "Modules" :
"Type": "Runtime", [
"LoadingPhase": "PreDefault" {
} "Name" : "AdvancedSessions",
], "Type" : "RunTime",
"Plugins": [ "LoadingPhase" : "PreDefault"
{ }
"Name": "OnlineSubsystem", ],
"Enabled": true "Plugins": [
}, {
{ "Name": "OnlineSubsystem",
"Name": "OnlineSubsystemUtils", "Enabled": true
"Enabled": true },
} {
], "Name": "OnlineSubsystemUtils",
"DocsURL": "", "Enabled": true
"MarketplaceURL": "", }
"SupportURL": "", ]
"CanContainContent": false,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": false
} }

View File

@@ -1,8 +0,0 @@
[FilterPlugin]
; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and
; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively.
;
; Examples:
; /README.txt
; /Extras/...
; /Binaries/ThirdParty/*.dll

View File

@@ -1,20 +1,18 @@
using UnrealBuildTool; using UnrealBuildTool;
using System.IO; using System.IO;
public class AdvancedSessions : ModuleRules public class AdvancedSessions : ModuleRules
{ {
public AdvancedSessions(ReadOnlyTargetRules Target) : base(Target) public AdvancedSessions(ReadOnlyTargetRules Target) : base(Target)
{ {
DefaultBuildSettings = BuildSettingsVersion.Latest; PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
IncludeOrderVersion = EngineIncludeOrderVersion.Latest; //bEnforceIWYU = true;
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PublicDefinitions.Add("WITH_ADVANCED_SESSIONS=1");
//bEnforceIWYU = true;
// PrivateIncludePaths.AddRange(new string[] { "AdvancedSessions/Private"/*, "OnlineSubsystemSteam/Private"*/ });
PublicDefinitions.Add("WITH_ADVANCED_SESSIONS=1"); // PublicIncludePaths.AddRange(new string[] { "AdvancedSessions/Public" });
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "OnlineSubsystem", "CoreUObject", "OnlineSubsystemUtils", "Networking", "Sockets"/*"Voice", "OnlineSubsystemSteam"*/ });
// PrivateIncludePaths.AddRange(new string[] { "AdvancedSessions/Private"/*, "OnlineSubsystemSteam/Private"*/ }); PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "Sockets", "Networking", "OnlineSubsystemUtils" /*"Voice", "Steamworks","OnlineSubsystemSteam"*/});
// PublicIncludePaths.AddRange(new string[] { "AdvancedSessions/Public" }); }
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "OnlineSubsystem", "CoreUObject", "OnlineSubsystemUtils", "Networking", "Sockets"/*"Voice", "OnlineSubsystemSteam"*/ });
}
} }

View File

@@ -1,63 +1,63 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "Online.h" #include "Online.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
//#include "OnlineFriendsInterface.h" //#include "OnlineFriendsInterface.h"
//#include "OnlineUserInterface.h" //#include "OnlineUserInterface.h"
//#include "OnlineMessageInterface.h" //#include "OnlineMessageInterface.h"
//#include "OnlinePresenceInterface.h" //#include "OnlinePresenceInterface.h"
//#include "Engine/GameInstance.h" //#include "Engine/GameInstance.h"
#include "Interfaces/OnlineSessionInterface.h" #include "Interfaces/OnlineSessionInterface.h"
//#include "UObjectIterator.h" //#include "UObjectIterator.h"
#include "AdvancedExternalUILibrary.generated.h" #include "AdvancedExternalUILibrary.generated.h"
//General Advanced Sessions Log //General Advanced Sessions Log
DECLARE_LOG_CATEGORY_EXTERN(AdvancedExternalUILog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedExternalUILog, Log, All);
UCLASS() UCLASS()
class UAdvancedExternalUILibrary : public UBlueprintFunctionLibrary class UAdvancedExternalUILibrary : public UBlueprintFunctionLibrary
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
//********* External UI Functions *************// //********* External UI Functions *************//
// Show the UI that handles the Friends list // Show the UI that handles the Friends list
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result"))
static void ShowFriendsUI(UObject* WorldContextObject, APlayerController *PlayerController, EBlueprintResultSwitch &Result); static void ShowFriendsUI(APlayerController *PlayerController, EBlueprintResultSwitch &Result);
// Show the UI that handles inviting people to your game // Show the UI that handles inviting people to your game
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result"))
static void ShowInviteUI(UObject* WorldContextObject, APlayerController *PlayerController, EBlueprintResultSwitch &Result); static void ShowInviteUI(APlayerController *PlayerController, EBlueprintResultSwitch &Result);
// Show the UI that shows the leaderboard (doesn't work with steam) // Show the UI that shows the leaderboard (doesn't work with steam)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result"))
static void ShowLeaderBoardUI(UObject* WorldContextObject, FString LeaderboardName, EBlueprintResultSwitch &Result); static void ShowLeaderBoardUI(FString LeaderboardName, EBlueprintResultSwitch &Result);
// Show the UI that shows a web URL // Show the UI that shows a web URL
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result", AutoCreateRefTerm = "AllowedDomains", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result", AutoCreateRefTerm = "AllowedDomains"))
static void ShowWebURLUI(UObject* WorldContextObject, FString URLToShow, EBlueprintResultSwitch &Result, TArray<FString>& AllowedDomains, bool bEmbedded = false , bool bShowBackground = false, bool bShowCloseButton = false, int32 OffsetX = 0, int32 OffsetY = 0, int32 SizeX = 0, int32 SizeY = 0); static void ShowWebURLUI(FString URLToShow, EBlueprintResultSwitch &Result, TArray<FString>& AllowedDomains, bool bEmbedded = false , bool bShowBackground = false, bool bShowCloseButton = false, int32 OffsetX = 0, int32 OffsetY = 0, int32 SizeX = 0, int32 SizeY = 0);
// Show the UI that shows a web URL // Show the UI that shows a web URL
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI")
static void CloseWebURLUI(UObject* WorldContextObject); static void CloseWebURLUI();
// Show the UI that shows the profile of a uniquenetid // Show the UI that shows the profile of a uniquenetid
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result"))
static void ShowProfileUI(UObject* WorldContextObject, const FBPUniqueNetId PlayerViewingProfile, const FBPUniqueNetId PlayerToViewProfileOf, EBlueprintResultSwitch &Result); static void ShowProfileUI(const FBPUniqueNetId PlayerViewingProfile, const FBPUniqueNetId PlayerToViewProfileOf, EBlueprintResultSwitch &Result);
// Show the UI that shows the account upgrade UI (doesn't work with steam) // Show the UI that shows the account upgrade UI (doesn't work with steam)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedExternalUI", meta = (ExpandEnumAsExecs = "Result"))
static void ShowAccountUpgradeUI(UObject* WorldContextObject, const FBPUniqueNetId PlayerRequestingAccountUpgradeUI, EBlueprintResultSwitch &Result); static void ShowAccountUpgradeUI(const FBPUniqueNetId PlayerRequestingAccountUpgradeUI, EBlueprintResultSwitch &Result);
}; };

View File

@@ -1,157 +1,145 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Engine/Engine.h" #include "Engine/Engine.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "Online.h" #include "Online.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "Interfaces/OnlineFriendsInterface.h" #include "Interfaces/OnlineFriendsInterface.h"
#include "Interfaces/OnlineUserInterface.h" #include "Interfaces/OnlineUserInterface.h"
#include "Interfaces/OnlineMessageInterface.h" #include "Interfaces/OnlineMessageInterface.h"
#include "Interfaces/OnlinePresenceInterface.h" #include "Interfaces/OnlinePresenceInterface.h"
#include "Engine/GameInstance.h" #include "Engine/GameInstance.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "Interfaces/OnlineSessionInterface.h" #include "Interfaces/OnlineSessionInterface.h"
#include "OnlineSessionSettings.h" #include "OnlineSessionSettings.h"
#include "UObject/UObjectIterator.h" #include "UObject/UObjectIterator.h"
#include "AdvancedFriendsInterface.h" #include "AdvancedFriendsInterface.h"
#include "AdvancedFriendsGameInstance.generated.h" #include "AdvancedFriendsGameInstance.generated.h"
//General Advanced Sessions Log //General Advanced Sessions Log
DECLARE_LOG_CATEGORY_EXTERN(AdvancedFriendsInterfaceLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedFriendsInterfaceLog, Log, All);
UCLASS() UCLASS()
class ADVANCEDSESSIONS_API UAdvancedFriendsGameInstance : public UGameInstance class ADVANCEDSESSIONS_API UAdvancedFriendsGameInstance : public UGameInstance
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
UAdvancedFriendsGameInstance(const FObjectInitializer& ObjectInitializer); UAdvancedFriendsGameInstance(const FObjectInitializer& ObjectInitializer);
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface)
bool bCallFriendInterfaceEventsOnPlayerControllers; bool bCallFriendInterfaceEventsOnPlayerControllers;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface)
bool bCallIdentityInterfaceEventsOnPlayerControllers; bool bCallIdentityInterfaceEventsOnPlayerControllers;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface)
bool bCallVoiceInterfaceEventsOnPlayerControllers; bool bCallVoiceInterfaceEventsOnPlayerControllers;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedVoiceInterface) UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedVoiceInterface)
bool bEnableTalkingStatusDelegate; bool bEnableTalkingStatusDelegate;
// If true we will auto travel to a game session when an invite is received. //virtual void PostLoad() override;
// This can get in the way of Beacon Sessions, you may want to disable it. virtual void Shutdown() override;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = AdvancedFriendsInterface) virtual void Init() override;
bool bAutoTravelOnAcceptedUserInviteReceived = true;
//*** Session invite received by local ***//
//virtual void PostLoad() override; FOnSessionInviteReceivedDelegate SessionInviteReceivedDelegate;
virtual void Shutdown() override; FDelegateHandle SessionInviteReceivedDelegateHandle;
virtual void Init() override;
//const FUniqueNetId& /*UserId*/, const FUniqueNetId& /*FromId*/, const FString& /*AppId*/, const FOnlineSessionSearchResult& /*InviteResult*/
//*** Session invite received by local ***// void OnSessionInviteReceivedMaster(const FUniqueNetId & PersonInvited, const FUniqueNetId & PersonInviting, const FString & AppId, const FOnlineSessionSearchResult& SessionToJoin);
FOnSessionInviteReceivedDelegate SessionInviteReceivedDelegate;
FDelegateHandle SessionInviteReceivedDelegateHandle; // After a session invite has been accepted by the local player this event is triggered, call JoinSession on the session result to join it
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
// custom handle to join directly from steam ui "Join Game" void OnSessionInviteReceived(int32 LocalPlayerNum, FBPUniqueNetId PersonInviting, const FString& AppId, const FBlueprintSessionResult& SessionToJoin);
FDelegateHandle OnJoinSessionCompleteDelegateHandle;
// custom Steam UI Join User function #Self invite# //*** Session invite accepted by local ***//
void OnSessionUserInviteAccepted(const bool bWasSuccessful, const int32 ControllerId, FUniqueNetIdPtr UserId, const FOnlineSessionSearchResult& InviteResult); FOnSessionUserInviteAcceptedDelegate SessionInviteAcceptedDelegate;
// custom Steam UI function to client travel #Self invite# FDelegateHandle SessionInviteAcceptedDelegateHandle;
void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);
void OnSessionInviteAcceptedMaster(const bool bWasSuccessful, int32 LocalPlayer, TSharedPtr<const FUniqueNetId> PersonInviting, const FOnlineSessionSearchResult& SessionToJoin);
//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); // After a session invite has been accepted by the local player this event is triggered, call JoinSession on the session result to join it
// This function is currently not hooked up in any of Epics default subsystems, it is here for custom subsystems
// After a session invite has been accepted by the local player this event is triggered, call JoinSession on the session result to join it UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends") void OnSessionInviteAccepted(int32 LocalPlayerNum, FBPUniqueNetId PersonInvited, const FBlueprintSessionResult& SessionToJoin);
void OnSessionInviteReceived(int32 LocalPlayerNum, FBPUniqueNetId PersonInviting, const FString& AppId, const FBlueprintSessionResult& SessionToJoin);
//*** Session invite accepted by local ***// // After a voice status has changed this event is triggered if the bEnableTalkingStatusDelegate property is true
FOnSessionUserInviteAcceptedDelegate SessionInviteAcceptedDelegate; UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedVoice")
FDelegateHandle SessionInviteAcceptedDelegateHandle; void OnPlayerTalkingStateChanged(FBPUniqueNetId PlayerId, bool bIsTalking);
void OnSessionInviteAcceptedMaster(const bool bWasSuccessful, int32 LocalPlayer, TSharedPtr<const FUniqueNetId> PersonInviting, const FOnlineSessionSearchResult& SessionToJoin); void OnPlayerTalkingStateChangedMaster(TSharedRef<const FUniqueNetId> PlayerId, bool bIsTalking);
// After a session invite has been accepted by the local player this event is triggered, call JoinSession on the session result to join it FOnPlayerTalkingStateChangedDelegate PlayerTalkingStateChangedDelegate;
// This function is currently not hooked up in any of Epics default subsystems, it is here for custom subsystems FDelegateHandle PlayerTalkingStateChangedDelegateHandle;
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
void OnSessionInviteAccepted(int32 LocalPlayerNum, FBPUniqueNetId PersonInvited, const FBlueprintSessionResult& SessionToJoin);
// Called when the designated LocalUser has changed login state
UFUNCTION(BlueprintImplementableEvent , Category = "AdvancedIdentity", meta = (DisplayName = "OnPlayerLoginChanged"))
// After a voice status has changed this event is triggered if the bEnableTalkingStatusDelegate property is true void OnPlayerLoginChanged(int32 PlayerNum);
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedVoice")
void OnPlayerTalkingStateChanged(FBPUniqueNetId PlayerId, bool bIsTalking); void OnPlayerLoginChangedMaster(int32 PlayerNum);
FOnLoginChangedDelegate PlayerLoginChangedDelegate;
void OnPlayerTalkingStateChangedMaster(TSharedRef<const FUniqueNetId> PlayerId, bool bIsTalking); FDelegateHandle PlayerLoginChangedDelegateHandle;
FOnPlayerTalkingStateChangedDelegate PlayerTalkingStateChangedDelegate; // Called when the designated LocalUser has changed login status
FDelegateHandle PlayerTalkingStateChangedDelegateHandle; UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedIdentity", meta = (DisplayName = "OnPlayerLoginStatusChanged"))
void OnPlayerLoginStatusChanged(int32 PlayerNum, EBPLoginStatus PreviousStatus, EBPLoginStatus NewStatus, FBPUniqueNetId NewPlayerUniqueNetID);
// Called when the designated LocalUser has changed login state void OnPlayerLoginStatusChangedMaster(int32 PlayerNum, ELoginStatus::Type PreviousStatus, ELoginStatus::Type NewStatus, const FUniqueNetId & NewPlayerUniqueNetID);
UFUNCTION(BlueprintImplementableEvent , Category = "AdvancedIdentity", meta = (DisplayName = "OnPlayerLoginChanged")) FOnLoginStatusChangedDelegate PlayerLoginStatusChangedDelegate;
void OnPlayerLoginChanged(int32 PlayerNum); FDelegateHandle PlayerLoginStatusChangedDelegateHandle;
void OnPlayerLoginChangedMaster(int32 PlayerNum);
FOnLoginChangedDelegate PlayerLoginChangedDelegate; //*** Session Invite Received From Friend ***//
FDelegateHandle PlayerLoginChangedDelegateHandle; // REMOVED BECAUSE IT NEVER GETS CALLED
/*FOnSessionInviteReceivedDelegate SessionInviteReceivedDelegate;
// Called when the designated LocalUser has changed login status FDelegateHandle SessionInviteReceivedDelegateHandle;
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedIdentity", meta = (DisplayName = "OnPlayerLoginStatusChanged"))
void OnPlayerLoginStatusChanged(int32 PlayerNum, EBPLoginStatus PreviousStatus, EBPLoginStatus NewStatus, FBPUniqueNetId NewPlayerUniqueNetID); void OnSessionInviteReceivedMaster(const FUniqueNetId &InvitedPlayer, const FUniqueNetId &FriendInviting, const FOnlineSessionSearchResult& Session);
void OnPlayerLoginStatusChangedMaster(int32 PlayerNum, ELoginStatus::Type PreviousStatus, ELoginStatus::Type NewStatus, const FUniqueNetId & NewPlayerUniqueNetID); // After a session invite has been sent from a friend this event is triggered, call JoinSession on the session result to join it
FOnLoginStatusChangedDelegate PlayerLoginStatusChangedDelegate; UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
FDelegateHandle PlayerLoginStatusChangedDelegateHandle; void OnSessionInviteReceived(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &FriendInviting, const FBlueprintSessionResult &Session);
*/
//*** Session Invite Received From Friend ***// //*** Friend Invite Accepted ***//
// REMOVED BECAUSE IT NEVER GETS CALLED /*FOnInviteAcceptedDelegate FriendInviteAcceptedDelegate;
/*FOnSessionInviteReceivedDelegate SessionInviteReceivedDelegate; FDelegateHandle FriendInviteAcceptedDelegateHandle;
FDelegateHandle SessionInviteReceivedDelegateHandle;
void OnFriendInviteAcceptedDelegateMaster(const FUniqueNetId& LocalPlayer, const FUniqueNetId &PlayerInvited);
void OnSessionInviteReceivedMaster(const FUniqueNetId &InvitedPlayer, const FUniqueNetId &FriendInviting, const FOnlineSessionSearchResult& Session);
// After a session invite has been accepted by a friend this event is triggered
// After a session invite has been sent from a friend this event is triggered, call JoinSession on the session result to join it UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends") void OnFriendInviteAccepted(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &PlayerInvited);
void OnSessionInviteReceived(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &FriendInviting, const FBlueprintSessionResult &Session); */
*/
//*** Friend Invite Rejected ***//
//*** Friend Invite Accepted ***// /*FOnInviteRejectedDelegate SessionInviteRejectedByFriendDelegate;
/*FOnInviteAcceptedDelegate FriendInviteAcceptedDelegate; FDelegateHandle InviteRejectedByFriendDelegateHandle;
FDelegateHandle FriendInviteAcceptedDelegateHandle;
void OnFriendInviteRejectedDelegateMaster(const FUniqueNetId& LocalPlayer, const FUniqueNetId &PlayerDeclined);
void OnFriendInviteAcceptedDelegateMaster(const FUniqueNetId& LocalPlayer, const FUniqueNetId &PlayerInvited);
// After a friend invite has been rejected this event is triggered
// After a session invite has been accepted by a friend this event is triggered UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends") void OnFriendInviteRejected(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &PlayerDeclined);
void OnFriendInviteAccepted(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &PlayerInvited); */
*/
//*** Removed By Friend ***//
//*** Friend Invite Rejected ***// /*FOnFriendRemovedDelegate RemovedByFriendDelegate;
/*FOnInviteRejectedDelegate SessionInviteRejectedByFriendDelegate; FDelegateHandle RemovedByFriendDelegateHandle;
FDelegateHandle InviteRejectedByFriendDelegateHandle;
void OnRemovedByFriendDelegateMaster(const FUniqueNetId& LocalPlayer, const FUniqueNetId &FriendRemoved);
void OnFriendInviteRejectedDelegateMaster(const FUniqueNetId& LocalPlayer, const FUniqueNetId &PlayerDeclined);
// After a friend removed the player this event is triggered
// After a friend invite has been rejected this event is triggered UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends") void OnRemovedByFriend(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &FriendRemoved);*/
void OnFriendInviteRejected(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &PlayerDeclined); };
*/
//*** Removed By Friend ***//
/*FOnFriendRemovedDelegate RemovedByFriendDelegate;
FDelegateHandle RemovedByFriendDelegateHandle;
void OnRemovedByFriendDelegateMaster(const FUniqueNetId& LocalPlayer, const FUniqueNetId &FriendRemoved);
// After a friend removed the player this event is triggered
UFUNCTION(BlueprintImplementableEvent, Category = "AdvancedFriends")
void OnRemovedByFriend(const FBPUniqueNetId &InvitedPlayer, const FBPUniqueNetId &FriendRemoved);*/
};

View File

@@ -1,56 +1,56 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "Online.h" #include "Online.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "Interfaces/OnlineFriendsInterface.h" #include "Interfaces/OnlineFriendsInterface.h"
#include "Interfaces/OnlineUserInterface.h" #include "Interfaces/OnlineUserInterface.h"
#include "Interfaces/OnlineMessageInterface.h" #include "Interfaces/OnlineMessageInterface.h"
#include "Interfaces/OnlinePresenceInterface.h" #include "Interfaces/OnlinePresenceInterface.h"
#include "Engine/GameInstance.h" #include "Engine/GameInstance.h"
#include "Interfaces/OnlineSessionInterface.h" #include "Interfaces/OnlineSessionInterface.h"
#include "OnlineSessionSettings.h" #include "OnlineSessionSettings.h"
#include "UObject/UObjectIterator.h" #include "UObject/UObjectIterator.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "AdvancedFriendsInterface.generated.h" #include "AdvancedFriendsInterface.generated.h"
UINTERFACE(MinimalAPI) UINTERFACE(MinimalAPI)
class UAdvancedFriendsInterface : public UInterface class UAdvancedFriendsInterface : public UInterface
{ {
GENERATED_UINTERFACE_BODY() GENERATED_UINTERFACE_BODY()
}; };
class IAdvancedFriendsInterface class IAdvancedFriendsInterface
{ {
GENERATED_IINTERFACE_BODY() GENERATED_IINTERFACE_BODY()
public: public:
// Called when the designated LocalUser has accepted a session invite, use JoinSession on result to connect // Called when the designated LocalUser has accepted a session invite, use JoinSession on result to connect
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnSessionInviteReceived")) UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnSessionInviteReceived"))
void OnSessionInviteReceived(FBPUniqueNetId PersonInviting, const FBlueprintSessionResult& SearchResult); void OnSessionInviteReceived(FBPUniqueNetId PersonInviting, const FBlueprintSessionResult& SearchResult);
// Called when the designated LocalUser has accepted a session invite, use JoinSession on result to connect // Called when the designated LocalUser has accepted a session invite, use JoinSession on result to connect
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnSessionInviteAccepted")) UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnSessionInviteAccepted"))
void OnSessionInviteAccepted(FBPUniqueNetId PersonInvited, const FBlueprintSessionResult& SearchResult); void OnSessionInviteAccepted(FBPUniqueNetId PersonInvited, const FBlueprintSessionResult& SearchResult);
// Called when the designated LocalUser has accepted a session invite, use JoinSession on result to connect // Called when the designated LocalUser has accepted a session invite, use JoinSession on result to connect
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnPlayerVoiceStateChanged")) UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnPlayerVoiceStateChanged"))
void OnPlayerVoiceStateChanged(FBPUniqueNetId PlayerId, bool bIsTalking); void OnPlayerVoiceStateChanged(FBPUniqueNetId PlayerId, bool bIsTalking);
// Called when the designated LocalUser has changed login state // Called when the designated LocalUser has changed login state
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnPlayerLoginChanged")) UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnPlayerLoginChanged"))
void OnPlayerLoginChanged(int32 PlayerNum); void OnPlayerLoginChanged(int32 PlayerNum);
// Called when the designated LocalUser has changed login state // Called when the designated LocalUser has changed login state
UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnPlayerLoginStatusChanged")) UFUNCTION(BlueprintImplementableEvent, meta = (DisplayName = "OnPlayerLoginStatusChanged"))
void OnPlayerLoginStatusChanged(EBPLoginStatus PreviousStatus, EBPLoginStatus NewStatus, FBPUniqueNetId PlayerUniqueNetID); void OnPlayerLoginStatusChanged(EBPLoginStatus PreviousStatus, EBPLoginStatus NewStatus, FBPUniqueNetId PlayerUniqueNetID);
// REMOVED BECAUSE IT WAS NEVER BEING CALLED // REMOVED BECAUSE IT WAS NEVER BEING CALLED
// Called when the designated LocalUser has received a session invite, use JoinSession on result to connect // Called when the designated LocalUser has received a session invite, use JoinSession on result to connect
//UFUNCTION(BlueprintImplementableEvent, meta = (FriendlyName = "OnSessionInviteReceived")) //UFUNCTION(BlueprintImplementableEvent, meta = (FriendlyName = "OnSessionInviteReceived"))
//void OnSessionInviteReceived(const FBPUniqueNetId &FriendInviting, const FBlueprintSessionResult &Session); //void OnSessionInviteReceived(const FBPUniqueNetId &FriendInviting, const FBlueprintSessionResult &Session);
}; };

View File

@@ -1,56 +1,56 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "Online.h" #include "Online.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "Interfaces/OnlineFriendsInterface.h" #include "Interfaces/OnlineFriendsInterface.h"
#include "Interfaces/OnlineUserInterface.h" #include "Interfaces/OnlineUserInterface.h"
#include "Interfaces/OnlineMessageInterface.h" #include "Interfaces/OnlineMessageInterface.h"
#include "Interfaces/OnlinePresenceInterface.h" #include "Interfaces/OnlinePresenceInterface.h"
#include "Engine/GameInstance.h" #include "Engine/GameInstance.h"
#include "Interfaces/OnlineSessionInterface.h" #include "Interfaces/OnlineSessionInterface.h"
#include "UObject/UObjectIterator.h" #include "UObject/UObjectIterator.h"
#include "AdvancedFriendsLibrary.generated.h" #include "AdvancedFriendsLibrary.generated.h"
//General Advanced Sessions Log //General Advanced Sessions Log
DECLARE_LOG_CATEGORY_EXTERN(AdvancedFriendsLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedFriendsLog, Log, All);
UCLASS() UCLASS()
class UAdvancedFriendsLibrary : public UBlueprintFunctionLibrary class UAdvancedFriendsLibrary : public UBlueprintFunctionLibrary
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
//********* Friend List Functions *************// //********* Friend List Functions *************//
// Sends an Invite to the current online session to a list of friends // Sends an Invite to the current online session to a list of friends
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList", meta = (ExpandEnumAsExecs = "Result")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList", meta = (ExpandEnumAsExecs = "Result"))
static void SendSessionInviteToFriends(APlayerController *PlayerController, const TArray<FBPUniqueNetId> &Friends, EBlueprintResultSwitch &Result); static void SendSessionInviteToFriends(APlayerController *PlayerController, const TArray<FBPUniqueNetId> &Friends, EBlueprintResultSwitch &Result);
// Sends an Invite to the current online session to a friend // Sends an Invite to the current online session to a friend
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList", meta = (ExpandEnumAsExecs = "Result")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList", meta = (ExpandEnumAsExecs = "Result"))
static void SendSessionInviteToFriend(APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId, EBlueprintResultSwitch &Result); static void SendSessionInviteToFriend(APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId, EBlueprintResultSwitch &Result);
// Get a friend from the previously read/saved friends list (Must Call GetFriends first for this to return anything) // Get a friend from the previously read/saved friends list (Must Call GetFriends first for this to return anything)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList") UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList")
static void GetFriend(APlayerController *PlayerController, const FBPUniqueNetId FriendUniqueNetId, FBPFriendInfo &Friend); static void GetFriend(APlayerController *PlayerController, const FBPUniqueNetId FriendUniqueNetId, FBPFriendInfo &Friend);
// Get the previously read/saved friends list (Must Call GetFriends first for this to return anything) // Get the previously read/saved friends list (Must Call GetFriends first for this to return anything)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList") UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|FriendsList")
static void GetStoredFriendsList(APlayerController *PlayerController, TArray<FBPFriendInfo> &FriendsList); static void GetStoredFriendsList(APlayerController *PlayerController, TArray<FBPFriendInfo> &FriendsList);
// Get the previously read/saved recent players list (Must Call GetRecentPlayers first for this to return anything) // Get the previously read/saved recent players list (Must Call GetRecentPlayers first for this to return anything)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|RecentPlayersList") UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|RecentPlayersList")
static void GetStoredRecentPlayersList(FBPUniqueNetId UniqueNetId, TArray<FBPOnlineRecentPlayer> &PlayersList); static void GetStoredRecentPlayersList(FBPUniqueNetId UniqueNetId, TArray<FBPOnlineRecentPlayer> &PlayersList);
// Check if a UniqueNetId is a friend // Check if a UniqueNetId is a friend
UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|FriendsList") UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|FriendsList")
static void IsAFriend(APlayerController *PlayerController, const FBPUniqueNetId UniqueNetId, bool &IsFriend); static void IsAFriend(APlayerController *PlayerController, const FBPUniqueNetId UniqueNetId, bool &IsFriend);
}; };

View File

@@ -1,81 +1,81 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "Online.h" #include "Online.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "Interfaces/OnlineIdentityInterface.h" #include "Interfaces/OnlineIdentityInterface.h"
#include "Interfaces/OnlineUserInterface.h" #include "Interfaces/OnlineUserInterface.h"
#include "Interfaces/OnlinePresenceInterface.h" #include "Interfaces/OnlinePresenceInterface.h"
#include "Engine/GameInstance.h" #include "Engine/GameInstance.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "UObject/UObjectIterator.h" #include "UObject/UObjectIterator.h"
#include "AdvancedIdentityLibrary.generated.h" #include "AdvancedIdentityLibrary.generated.h"
//General Advanced Sessions Log //General Advanced Sessions Log
DECLARE_LOG_CATEGORY_EXTERN(AdvancedIdentityLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedIdentityLog, Log, All);
UCLASS() UCLASS()
class UAdvancedIdentityLibrary : public UBlueprintFunctionLibrary class UAdvancedIdentityLibrary : public UBlueprintFunctionLibrary
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
//********* Identity Functions *************// //********* Identity Functions *************//
// Get the login status of a local player // Get the login status of a local player
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity", meta = (ExpandEnumAsExecs = "Result"))
static void GetLoginStatus(UObject* WorldContextObject, const FBPUniqueNetId & UniqueNetID, EBPLoginStatus & LoginStatus, EBlueprintResultSwitch &Result); static void GetLoginStatus(const FBPUniqueNetId & UniqueNetID, EBPLoginStatus & LoginStatus, EBlueprintResultSwitch &Result);
// Get the auth token for a local player // Get the auth token for a local player
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity", meta = (ExpandEnumAsExecs = "Result"))
static void GetPlayerAuthToken(UObject* WorldContextObject, APlayerController * PlayerController, FString & AuthToken, EBlueprintResultSwitch &Result); static void GetPlayerAuthToken(APlayerController * PlayerController, FString & AuthToken, EBlueprintResultSwitch &Result);
// Get a players nickname // Get a players nickname
UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity")
static void GetPlayerNickname(UObject* WorldContextObject, const FBPUniqueNetId & UniqueNetID, FString & PlayerNickname); static void GetPlayerNickname(const FBPUniqueNetId & UniqueNetID, FString & PlayerNickname);
//********* User Account Functions *************// //********* User Account Functions *************//
// Get a users account // Get a users account
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result"))
static void GetUserAccount(UObject* WorldContextObject, const FBPUniqueNetId & UniqueNetId, FBPUserOnlineAccount & AccountInfo, EBlueprintResultSwitch &Result); static void GetUserAccount(const FBPUniqueNetId & UniqueNetId, FBPUserOnlineAccount & AccountInfo, EBlueprintResultSwitch &Result);
// Get all known users accounts // Get all known users accounts
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result", WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result"))
static void GetAllUserAccounts(UObject* WorldContextObject, TArray<FBPUserOnlineAccount> & AccountInfos, EBlueprintResultSwitch &Result); static void GetAllUserAccounts(TArray<FBPUserOnlineAccount> & AccountInfos, EBlueprintResultSwitch &Result);
// Get a user account access token // Get a user account access token
UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount") UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount")
static void GetUserAccountAccessToken(const FBPUserOnlineAccount & AccountInfo, FString & AccessToken); static void GetUserAccountAccessToken(const FBPUserOnlineAccount & AccountInfo, FString & AccessToken);
// Get a user account Auth attribute (depends on subsystem) // Get a user account Auth attribute (depends on subsystem)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result"))
static void GetUserAccountAuthAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AuthAttribute, EBlueprintResultSwitch &Result); static void GetUserAccountAuthAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AuthAttribute, EBlueprintResultSwitch &Result);
// Set a user account attribute (depends on subsystem) // Set a user account attribute (depends on subsystem)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result"))
static void SetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, const FString & NewAttributeValue, EBlueprintResultSwitch &Result); static void SetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, const FString & NewAttributeValue, EBlueprintResultSwitch &Result);
// Get user ID // Get user ID
UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount") UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount")
static void GetUserID(const FBPUserOnlineAccount & AccountInfo, FBPUniqueNetId & UniqueNetID); static void GetUserID(const FBPUserOnlineAccount & AccountInfo, FBPUniqueNetId & UniqueNetID);
// Get user accounts real name if possible // Get user accounts real name if possible
UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount") UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount")
static void GetUserAccountRealName(const FBPUserOnlineAccount & AccountInfo, FString & UserName); static void GetUserAccountRealName(const FBPUserOnlineAccount & AccountInfo, FString & UserName);
// Get user account display name if possible // Get user account display name if possible
UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount") UFUNCTION(BlueprintPure, Category = "Online|AdvancedIdentity|UserAccount")
static void GetUserAccountDisplayName(const FBPUserOnlineAccount & AccountInfo, FString & DisplayName); static void GetUserAccountDisplayName(const FBPUserOnlineAccount & AccountInfo, FString & DisplayName);
// Get user account attribute (depends on subsystem) // Get user account attribute (depends on subsystem)
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedIdentity|UserAccount", meta = (ExpandEnumAsExecs = "Result"))
static void GetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AttributeValue, EBlueprintResultSwitch &Result); static void GetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AttributeValue, EBlueprintResultSwitch &Result);
}; };

View File

@@ -1,11 +1,11 @@
#pragma once #pragma once
#include "Modules/ModuleManager.h" #include "Modules/ModuleManager.h"
class AdvancedSessions : public IModuleInterface class AdvancedSessions : public IModuleInterface
{ {
public: public:
/** IModuleInterface implementation */ /** IModuleInterface implementation */
void StartupModule(); void StartupModule();
void ShutdownModule(); void ShutdownModule();
}; };

View File

@@ -160,10 +160,6 @@ public:
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID") UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID")
static void GetUniqueNetID(APlayerController *PlayerController, FBPUniqueNetId &UniqueNetId); static void GetUniqueNetID(APlayerController *PlayerController, FBPUniqueNetId &UniqueNetId);
// Get the unique net id of a network player attached to the given controller
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID")
static void GetUniqueNetIdOfSessionOwner(FBlueprintSessionResult SessionResult, FBPUniqueNetId& UniqueNetId);
// Get the unique net id of a network player who is assigned the the given player state // Get the unique net id of a network player who is assigned the the given player state
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID") UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID")
static void GetUniqueNetIDFromPlayerState(APlayerState *PlayerState, FBPUniqueNetId &UniqueNetId); static void GetUniqueNetIDFromPlayerState(APlayerState *PlayerState, FBPUniqueNetId &UniqueNetId);
@@ -176,10 +172,6 @@ public:
UFUNCTION(BlueprintPure, meta = (DisplayName = "Equal Unique Net ID", CompactNodeTitle = "==", Keywords = "== equal"), Category = "Online|AdvancedSessions|PlayerInfo|PlayerID") UFUNCTION(BlueprintPure, meta = (DisplayName = "Equal Unique Net ID", CompactNodeTitle = "==", Keywords = "== equal"), Category = "Online|AdvancedSessions|PlayerInfo|PlayerID")
static bool EqualEqual_UNetIDUnetID(const FBPUniqueNetId &A, const FBPUniqueNetId &B); static bool EqualEqual_UNetIDUnetID(const FBPUniqueNetId &A, const FBPUniqueNetId &B);
/** Converts a FBPUniqueNetID into a FUniqueNetID_Repl */
UFUNCTION(BlueprintPure, meta = (DisplayName = "ToUniqueNetIDRepl (Unique Net ID)", CompactNodeTitle = "->", BlueprintAutocast), Category = "Online|AdvancedSessions|PlayerInfo|PlayerID")
static FUniqueNetIdRepl Conv_BPUniqueIDToUniqueNetIDRepl(const FBPUniqueNetId& InUniqueID);
// Check if a UniqueNetId is a friend // Check if a UniqueNetId is a friend
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|UniqueNetId") UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|UniqueNetId")
static void UniqueNetIdToString(const FBPUniqueNetId &UniqueNetId, FString &String); static void UniqueNetIdToString(const FBPUniqueNetId &UniqueNetId, FString &String);
@@ -207,11 +199,12 @@ public:
// Checks if the stated session subsystem is active // Checks if the stated session subsystem is active
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|Misc") UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|Misc")
static bool HasOnlineSubsystem(FName SubSystemName); static bool HasOnlineSubsystem(FName SubSystemName);
//**** Seamless travel Functions ****// //**** Seamless travel Functions ****//
//Exposes Server travel to blueprint //Exposes Server travel to blueprint
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Online|AdvancedSessions|Seamless", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject")) UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Online|AdvancedSessions|Seamless", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static bool ServerTravel(UObject* WorldContextObject, const FString& InURL, bool bAbsolute, bool bShouldSkipGameNotify); static bool ServerTravel(UObject* WorldContextObject, const FString& InURL, bool bAbsolute, bool bShouldSkipGameNotify);
}; };

View File

@@ -1,99 +1,99 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Online.h" #include "Online.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "Interfaces/VoiceInterface.h" #include "Interfaces/VoiceInterface.h"
//#include "OnlineFriendsInterface.h" //#include "OnlineFriendsInterface.h"
//#include "OnlineUserInterface.h" //#include "OnlineUserInterface.h"
//#include "OnlineMessageInterface.h" //#include "OnlineMessageInterface.h"
//#include "OnlinePresenceInterface.h" //#include "OnlinePresenceInterface.h"
#include "Engine/GameInstance.h" #include "Engine/GameInstance.h"
//#include "OnlineSessionInterface.h" //#include "OnlineSessionInterface.h"
#include "UObject/UObjectIterator.h" #include "UObject/UObjectIterator.h"
#include "AdvancedVoiceLibrary.generated.h" #include "AdvancedVoiceLibrary.generated.h"
//General Advanced Sessions Log //General Advanced Sessions Log
DECLARE_LOG_CATEGORY_EXTERN(AdvancedVoiceLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedVoiceLog, Log, All);
UCLASS() UCLASS()
class UAdvancedVoiceLibrary : public UBlueprintFunctionLibrary class UAdvancedVoiceLibrary : public UBlueprintFunctionLibrary
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
//********* Voice Library Functions *************// //********* Voice Library Functions *************//
// Get if a headset is present for the specified local user // Get if a headset is present for the specified local user
UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo")
static void IsHeadsetPresent(UObject* WorldContextObject, bool & bHasHeadset, uint8 LocalPlayerNum = 0); static void IsHeadsetPresent(bool & bHasHeadset, uint8 LocalPlayerNum = 0);
// Starts networked voice, allows push to talk in coordination with StopNetworkedVoice // Starts networked voice, allows push to talk in coordination with StopNetworkedVoice
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static void StartNetworkedVoice(UObject* WorldContextObject, uint8 LocalPlayerNum = 0); static void StartNetworkedVoice(uint8 LocalPlayerNum = 0);
// Stops networked voice, allows push to talk in coordination with StartNetworkedVoice // Stops networked voice, allows push to talk in coordination with StartNetworkedVoice
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static void StopNetworkedVoice(UObject* WorldContextObject, uint8 LocalPlayerNum = 0); static void StopNetworkedVoice(uint8 LocalPlayerNum = 0);
// Registers a local player as someone interested in voice data // Registers a local player as someone interested in voice data
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static bool RegisterLocalTalker(UObject* WorldContextObject, uint8 LocalPlayerNum = 0); static bool RegisterLocalTalker(uint8 LocalPlayerNum = 0);
// Registers all signed in players as local talkers // Registers all signed in players as local talkers
// This is already done automatically, only do it manually if you unregistered someone // This is already done automatically, only do it manually if you unregistered someone
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static void RegisterAllLocalTalkers(UObject* WorldContextObject); static void RegisterAllLocalTalkers();
// UnRegisters local player as a local talker // UnRegisters local player as a local talker
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static void UnRegisterLocalTalker(UObject* WorldContextObject, uint8 LocalPlayerNum = 0); static void UnRegisterLocalTalker(uint8 LocalPlayerNum = 0);
// UnRegisters all signed in players as local talkers // UnRegisters all signed in players as local talkers
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static void UnRegisterAllLocalTalkers(UObject* WorldContextObject); static void UnRegisterAllLocalTalkers();
// Registers a remote player as a talker // Registers a remote player as a talker
// This is already done automatically, only do it manually if you unregistered someone // This is already done automatically, only do it manually if you unregistered someone
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static bool RegisterRemoteTalker(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId); static bool RegisterRemoteTalker(const FBPUniqueNetId& UniqueNetId);
// UnRegisters a remote player as a talker // UnRegisters a remote player as a talker
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static bool UnRegisterRemoteTalker(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId); static bool UnRegisterRemoteTalker(const FBPUniqueNetId& UniqueNetId);
// UnRegisters all remote players as talkers // UnRegisters all remote players as talkers
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static void RemoveAllRemoteTalkers(UObject* WorldContextObject); static void RemoveAllRemoteTalkers();
// Returns whether a local player is currently talking // Returns whether a local player is currently talking
UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo")
static bool IsLocalPlayerTalking(UObject* WorldContextObject, uint8 LocalPlayerNum); static bool IsLocalPlayerTalking(uint8 LocalPlayerNum);
// Returns whether a remote player is currently talking // Returns whether a remote player is currently talking
UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo")
static bool IsRemotePlayerTalking(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId); static bool IsRemotePlayerTalking(const FBPUniqueNetId& UniqueNetId);
// Returns whether a player is muted for the specified local player // Returns whether a player is muted for the specified local player
UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo")
static bool IsPlayerMuted(UObject* WorldContextObject, uint8 LocalUserNumChecking, const FBPUniqueNetId& UniqueNetId); static bool IsPlayerMuted(uint8 LocalUserNumChecking, const FBPUniqueNetId& UniqueNetId);
// Mutes the player associated with the uniquenetid for the specified local player, if IsSystemWide is true then it will attempt to mute globally for the player // Mutes the player associated with the uniquenetid for the specified local player, if IsSystemWide is true then it will attempt to mute globally for the player
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static bool MuteRemoteTalker(UObject* WorldContextObject, uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide = false); static bool MuteRemoteTalker(uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide = false);
// UnMutes the player associated with the uniquenetid for the specified local player, if IsSystemWide is true then it will attempt to unmute globally for the player // UnMutes the player associated with the uniquenetid for the specified local player, if IsSystemWide is true then it will attempt to unmute globally for the player
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintCallable, Category = "Online|AdvancedVoice")
static bool UnMuteRemoteTalker(UObject* WorldContextObject, uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide = false); static bool UnMuteRemoteTalker(uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide = false);
// Gets the number of local talkers for this system // Gets the number of local talkers for this system
UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo", meta = (WorldContext = "WorldContextObject")) UFUNCTION(BlueprintPure, Category = "Online|AdvancedVoice|VoiceInfo")
static void GetNumLocalTalkers(UObject* WorldContextObject, int32 & NumLocalTalkers); static void GetNumLocalTalkers(int32 & NumLocalTalkers);
}; };

View File

@@ -1,55 +0,0 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h"
#include "Interfaces/OnlineIdentityInterface.h"
#include "Engine/LocalPlayer.h"
#include "AutoLoginUserCallbackProxy.generated.h"
UCLASS(MinimalAPI)
class UAutoLoginUserCallbackProxy : public UOnlineBlueprintCallProxyBase
{
GENERATED_UCLASS_BODY()
// Called when there is a successful destroy
UPROPERTY(BlueprintAssignable)
FEmptyOnlineDelegate OnSuccess;
// Called when there is an unsuccessful destroy
UPROPERTY(BlueprintAssignable)
FEmptyOnlineDelegate OnFailure;
/**
* Logs the player into the online service using parameters passed on the
* command line. Expects -AUTH_LOGIN=<UserName> -AUTH_PASSWORD=<password>. If either
* are missing, the function returns false and doesn't start the login
* process
*
* @param LocalUserNum the controller number of the associated user
*
*/
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedIdentity")
static UAutoLoginUserCallbackProxy* AutoLoginUser(UObject* WorldContextObject, int32 LocalUserNum);
// UOnlineBlueprintCallProxyBase interface
virtual void Activate() override;
// End of UOnlineBlueprintCallProxyBase interface
private:
// Internal callback when the operation completes, calls out to the public success/failure callbacks
void OnCompleted(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& ErrorVal);
private:
// The controller number of the associated user
int32 LocalUserNumber;
// The delegate executed by the online subsystem
FOnLoginCompleteDelegate Delegate;
// Handle to the registered OnDestroySessionComplete delegate
FDelegateHandle DelegateHandle;
// The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject;
};

View File

@@ -1,435 +1,420 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
//#include "EngineMinimal.h" //#include "EngineMinimal.h"
#include "Engine/Engine.h" #include "Engine/Engine.h"
#include "GameFramework/PlayerState.h" #include "GameFramework/PlayerState.h"
//#include "Core.h" //#include "Core.h"
#include "Interfaces/OnlineSessionInterface.h" #include "Interfaces/OnlineSessionInterface.h"
#include "OnlineSessionSettings.h" #include "OnlineSessionSettings.h"
#include "OnlineDelegateMacros.h" #include "OnlineDelegateMacros.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "OnlineSubsystemImpl.h" #include "OnlineSubsystemImpl.h"
#include "OnlineSubsystemUtils.h" #include "OnlineSubsystemUtils.h"
#include "OnlineSubsystemUtilsModule.h" #include "OnlineSubsystemUtilsModule.h"
#include "GameFramework/PlayerController.h" #include "GameFramework/PlayerController.h"
#include "Modules/ModuleManager.h" #include "Modules/ModuleManager.h"
#include "OnlineSubsystemUtilsClasses.h" #include "OnlineSubsystemUtilsClasses.h"
#include "BlueprintDataDefinitions.generated.h" #include "BlueprintDataDefinitions.generated.h"
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EBPUserPrivileges : uint8 enum class EBPUserPrivileges : uint8
{ {
/** Whether the user can play at all, online or offline - may be age restricted */ /** Whether the user can play at all, online or offline - may be age restricted */
CanPlay, CanPlay,
/** Whether the user can play in online modes */ /** Whether the user can play in online modes */
CanPlayOnline, CanPlayOnline,
/** Whether the user can use voice and text chat */ /** Whether the user can use voice and text chat */
CanCommunicateOnline, CanCommunicateOnline,
/** Whether the user can use content generated by other users */ /** Whether the user can use content generated by other users */
CanUseUserGeneratedContent CanUseUserGeneratedContent
}; };
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EBPLoginStatus : uint8 enum class EBPLoginStatus : uint8
{ {
/** Player has not logged in or chosen a local profile */ /** Player has not logged in or chosen a local profile */
NotLoggedIn, NotLoggedIn,
/** Player is using a local profile but is not logged in */ /** Player is using a local profile but is not logged in */
UsingLocalProfile, UsingLocalProfile,
/** Player has been validated by the platform specific authentication service */ /** Player has been validated by the platform specific authentication service */
LoggedIn LoggedIn
}; };
USTRUCT(BlueprintType) USTRUCT(BlueprintType)
struct FBPUserOnlineAccount struct FBPUserOnlineAccount
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
public: public:
TSharedPtr<FUserOnlineAccount> UserAccountInfo; TSharedPtr<FUserOnlineAccount> UserAccountInfo;
FBPUserOnlineAccount() FBPUserOnlineAccount()
{ {
} }
FBPUserOnlineAccount(TSharedPtr<FUserOnlineAccount> UserAccount) FBPUserOnlineAccount(TSharedPtr<FUserOnlineAccount> UserAccount)
{ {
UserAccountInfo = UserAccount; UserAccountInfo = UserAccount;
} }
}; };
UENUM() UENUM()
enum class ESessionSettingSearchResult : uint8 enum class ESessionSettingSearchResult : uint8
{ {
// Found the setting // Found the setting
Found, Found,
// Did not find the setting // Did not find the setting
NotFound, NotFound,
// Was not the correct type // Was not the correct type
WrongType WrongType
}; };
// This makes a lot of the blueprint functions cleaner // This makes a lot of the blueprint functions cleaner
UENUM() UENUM()
enum class EBlueprintResultSwitch : uint8 enum class EBlueprintResultSwitch : uint8
{ {
// On Success // On Success
OnSuccess, OnSuccess,
// On Failure // On Failure
OnFailure OnFailure
}; };
// This makes a lot of the blueprint functions cleaner // This makes a lot of the blueprint functions cleaner
UENUM() UENUM()
enum class EBlueprintAsyncResultSwitch : uint8 enum class EBlueprintAsyncResultSwitch : uint8
{ {
// On Success // On Success
OnSuccess, OnSuccess,
// Still loading // Still loading
AsyncLoading, AsyncLoading,
// On Failure // On Failure
OnFailure OnFailure
}; };
// This is to define server type searches // This is to define server type searches
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EBPServerPresenceSearchType : uint8 enum class EBPServerPresenceSearchType : uint8
{ {
AllServers, AllServers,
ClientServersOnly, ClientServersOnly,
DedicatedServersOnly DedicatedServersOnly
}; };
// Wanted this to be switchable in the editor // Wanted this to be switchable in the editor
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EBPOnlinePresenceState : uint8 enum class EBPOnlinePresenceState : uint8
{ {
Online, Online,
Offline, Offline,
Away, Away,
ExtendedAway, ExtendedAway,
DoNotDisturb, DoNotDisturb,
Chat Chat
}; };
UENUM(BlueprintType) UENUM(BlueprintType)
enum class EBPOnlineSessionState : uint8 enum class EBPOnlineSessionState : uint8
{ {
/** An online session has not been created yet */ /** An online session has not been created yet */
NoSession, NoSession,
/** An online session is in the process of being created */ /** An online session is in the process of being created */
Creating, Creating,
/** Session has been created but the session hasn't started (pre match lobby) */ /** Session has been created but the session hasn't started (pre match lobby) */
Pending, Pending,
/** Session has been asked to start (may take time due to communication with backend) */ /** Session has been asked to start (may take time due to communication with backend) */
Starting, Starting,
/** The current session has started. Sessions with join in progress disabled are no longer joinable */ /** The current session has started. Sessions with join in progress disabled are no longer joinable */
InProgress, InProgress,
/** The session is still valid, but the session is no longer being played (post match lobby) */ /** The session is still valid, but the session is no longer being played (post match lobby) */
Ending, Ending,
/** The session is closed and any stats committed */ /** The session is closed and any stats committed */
Ended, Ended,
/** The session is being destroyed */ /** The session is being destroyed */
Destroying Destroying
}; };
// Boy oh boy is this a dirty hack, but I can't figure out a good way to do it otherwise at the moment // Boy oh boy is this a dirty hack, but I can't figure out a good way to do it otherwise at the moment
// The UniqueNetId is an abstract class so I can't exactly re-initialize it to make a shared pointer on some functions // The UniqueNetId is an abstract class so I can't exactly re-initialize it to make a shared pointer on some functions
// So I made the blueprintable UniqueNetID into a dual variable struct with access functions and I am converting the const var for the pointer // So I made the blueprintable UniqueNetID into a dual variable struct with access functions and I am converting the const var for the pointer
// I really need to re-think this later // I really need to re-think this later
USTRUCT(BlueprintType) USTRUCT(BlueprintType)
struct FBPUniqueNetId struct FBPUniqueNetId
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
private: private:
bool bUseDirectPointer; bool bUseDirectPointer;
public: public:
TSharedPtr<const FUniqueNetId> UniqueNetId; TSharedPtr<const FUniqueNetId> UniqueNetId;
const FUniqueNetId * UniqueNetIdPtr; const FUniqueNetId * UniqueNetIdPtr;
void SetUniqueNetId(const TSharedPtr<const FUniqueNetId> &ID) void SetUniqueNetId(const TSharedPtr<const FUniqueNetId> &ID)
{ {
bUseDirectPointer = false; bUseDirectPointer = false;
UniqueNetIdPtr = nullptr; UniqueNetIdPtr = nullptr;
UniqueNetId = ID; UniqueNetId = ID;
} }
void SetUniqueNetId(const FUniqueNetId *ID) void SetUniqueNetId(const FUniqueNetId *ID)
{ {
bUseDirectPointer = true; bUseDirectPointer = true;
UniqueNetIdPtr = ID; UniqueNetIdPtr = ID;
} }
bool IsValid() const bool IsValid() const
{ {
if (bUseDirectPointer && UniqueNetIdPtr != nullptr && UniqueNetIdPtr->IsValid()) if (bUseDirectPointer && UniqueNetIdPtr != nullptr && UniqueNetIdPtr->IsValid())
{ {
return true; return true;
} }
else if (UniqueNetId.IsValid()) else if (UniqueNetId.IsValid())
{ {
return true; return true;
} }
else else
return false; return false;
} }
const FUniqueNetId* GetUniqueNetId() const const FUniqueNetId* GetUniqueNetId() const
{ {
if (bUseDirectPointer && UniqueNetIdPtr != nullptr) if (bUseDirectPointer && UniqueNetIdPtr != nullptr)
{ {
// No longer converting to non const as all functions now pass const UniqueNetIds // No longer converting to non const as all functions now pass const UniqueNetIds
return /*const_cast<FUniqueNetId*>*/(UniqueNetIdPtr); return /*const_cast<FUniqueNetId*>*/(UniqueNetIdPtr);
} }
else if (UniqueNetId.IsValid()) else if (UniqueNetId.IsValid())
{ {
return UniqueNetId.Get(); return UniqueNetId.Get();
} }
else else
return nullptr; return nullptr;
} }
// Adding in a compare operator so that std functions will work with this struct // Adding in a compare operator so that std functions will work with this struct
FORCEINLINE bool operator==(const FBPUniqueNetId& Other) const FORCEINLINE bool operator==(const FBPUniqueNetId& Other) const
{ {
return (IsValid() && Other.IsValid() && (*GetUniqueNetId() == *Other.GetUniqueNetId())); return (IsValid() && Other.IsValid() && (*GetUniqueNetId() == *Other.GetUniqueNetId()));
} }
FORCEINLINE bool operator!=(const FBPUniqueNetId& Other) const FORCEINLINE bool operator!=(const FBPUniqueNetId& Other) const
{ {
return !(IsValid() && Other.IsValid() && (*GetUniqueNetId() == *Other.GetUniqueNetId())); return !(IsValid() && Other.IsValid() && (*GetUniqueNetId() == *Other.GetUniqueNetId()));
} }
FBPUniqueNetId() FBPUniqueNetId()
{ {
bUseDirectPointer = false; bUseDirectPointer = false;
UniqueNetIdPtr = nullptr; UniqueNetIdPtr = nullptr;
} }
}; };
USTRUCT(BluePrintType) USTRUCT(BluePrintType)
struct FBPOnlineUser struct FBPOnlineUser
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
public: public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FBPUniqueNetId UniqueNetId; FBPUniqueNetId UniqueNetId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString DisplayName; FString DisplayName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString RealName; FString RealName;
}; };
USTRUCT(BluePrintType) USTRUCT(BluePrintType)
struct FBPOnlineRecentPlayer : public FBPOnlineUser struct FBPOnlineRecentPlayer : public FBPOnlineUser
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
public: public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString LastSeen; FString LastSeen;
}; };
USTRUCT(BlueprintType) USTRUCT(BlueprintType)
struct FBPFriendPresenceInfo struct FBPFriendPresenceInfo
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
public: public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsOnline = false; bool bIsOnline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsPlaying = false; bool bIsPlaying;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsPlayingThisGame = false; bool bIsPlayingThisGame;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsJoinable = false; bool bIsJoinable;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bHasVoiceSupport = false; bool bHasVoiceSupport;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
EBPOnlinePresenceState PresenceState = EBPOnlinePresenceState::Offline; EBPOnlinePresenceState PresenceState;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString StatusString; FString StatusString;
};
FBPFriendPresenceInfo()
{
bIsOnline = false;
bIsPlaying = false; USTRUCT(BlueprintType)
bIsPlayingThisGame = false; struct FBPFriendInfo
bIsJoinable = false; {
bHasVoiceSupport = false; GENERATED_USTRUCT_BODY()
PresenceState = EBPOnlinePresenceState::Offline;
} public:
};
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
USTRUCT(BlueprintType) FString DisplayName;
struct FBPFriendInfo UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
{ FString RealName;
GENERATED_USTRUCT_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
EBPOnlinePresenceState OnlineState;
public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FBPUniqueNetId UniqueNetId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString DisplayName; bool bIsPlayingSameGame;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString RealName; FBPFriendPresenceInfo PresenceInfo;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") };
EBPOnlinePresenceState OnlineState = EBPOnlinePresenceState::Offline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") /** The types of comparison operations for a given search query */
FBPUniqueNetId UniqueNetId; // Used to compare session properties
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") UENUM(BlueprintType)
bool bIsPlayingSameGame = false; enum class EOnlineComparisonOpRedux : uint8
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend") {
FBPFriendPresenceInfo PresenceInfo; Equals,
NotEquals,
FBPFriendInfo() GreaterThan,
{ GreaterThanEquals,
OnlineState = EBPOnlinePresenceState::Offline; LessThan,
bIsPlayingSameGame = false; LessThanEquals,
} };
};
// Used to store session properties before converting to FVariantData
/** The types of comparison operations for a given search query */ USTRUCT(BlueprintType)
// Used to compare session properties struct FSessionPropertyKeyPair
UENUM(BlueprintType) {
enum class EOnlineComparisonOpRedux : uint8 GENERATED_USTRUCT_BODY()
{
Equals, FName Key;
NotEquals, FVariantData Data;
GreaterThan, };
GreaterThanEquals,
LessThan,
LessThanEquals, // Sent to the FindSessionsAdvanced to filter the end results
}; USTRUCT(BlueprintType)
struct FSessionsSearchSetting
{
// Used to store session properties before converting to FVariantData GENERATED_USTRUCT_BODY()
USTRUCT(BlueprintType) //UPROPERTY()
struct FSessionPropertyKeyPair
{
GENERATED_USTRUCT_BODY() // Had to make a copy of this to account for the original not being exposed to blueprints
/** How is this session setting compared on the backend searches */
FName Key; EOnlineComparisonOpRedux ComparisonOp;
FVariantData Data;
}; // The key pair to search for
FSessionPropertyKeyPair PropertyKeyPair;
};
// Sent to the FindSessionsAdvanced to filter the end results
USTRUCT(BlueprintType) // Couldn't use the default one as it is not exposed to other modules, had to re-create it here
struct FSessionsSearchSetting // Helper class for various methods to reduce the call hierarchy
{ struct FOnlineSubsystemBPCallHelperAdvanced
GENERATED_USTRUCT_BODY() {
//UPROPERTY() public:
FOnlineSubsystemBPCallHelperAdvanced(const TCHAR* CallFunctionContext, UWorld* World, FName SystemName = NAME_None)
: OnlineSub(Online::GetSubsystem(World, SystemName))
// Had to make a copy of this to account for the original not being exposed to blueprints , FunctionContext(CallFunctionContext)
/** How is this session setting compared on the backend searches */ {
EOnlineComparisonOpRedux ComparisonOp; if (OnlineSub == nullptr)
{
// The key pair to search for FFrame::KismetExecutionMessage(*FString::Printf(TEXT("%s - Invalid or uninitialized OnlineSubsystem"), FunctionContext), ELogVerbosity::Warning);
FSessionPropertyKeyPair PropertyKeyPair; }
}; }
// Couldn't use the default one as it is not exposed to other modules, had to re-create it here void QueryIDFromPlayerController(APlayerController* PlayerController)
// Helper class for various methods to reduce the call hierarchy {
struct FOnlineSubsystemBPCallHelperAdvanced UserID.Reset();
{ //return const_cast<FUniqueNetId*>(UniqueNetIdPtr);
public: if (APlayerState* PlayerState = (PlayerController != NULL) ? PlayerController->PlayerState : NULL)
FOnlineSubsystemBPCallHelperAdvanced(const TCHAR* CallFunctionContext, UWorld* World, FName SystemName = NAME_None) {
: OnlineSub(Online::GetSubsystem(World, SystemName)) UserID = PlayerState->GetUniqueId().GetUniqueNetId();
, FunctionContext(CallFunctionContext) if (!UserID.IsValid())
{ {
if (OnlineSub == nullptr) FFrame::KismetExecutionMessage(*FString::Printf(TEXT("%s - Cannot map local player to unique net ID"), FunctionContext), ELogVerbosity::Warning);
{ }
FFrame::KismetExecutionMessage(*FString::Printf(TEXT("%s - Invalid or uninitialized OnlineSubsystem"), FunctionContext), ELogVerbosity::Warning); }
} else
} {
FFrame::KismetExecutionMessage(*FString::Printf(TEXT("%s - Invalid player state"), FunctionContext), ELogVerbosity::Warning);
void QueryIDFromPlayerController(APlayerController* PlayerController) }
{ }
UserID.Reset();
//return const_cast<FUniqueNetId*>(UniqueNetIdPtr);
if (APlayerState* PlayerState = (PlayerController != NULL) ? PlayerController->PlayerState : NULL) bool IsValid() const
{ {
UserID = PlayerState->GetUniqueId().GetUniqueNetId(); return UserID.IsValid() && (OnlineSub != nullptr);
if (!UserID.IsValid()) }
{
FFrame::KismetExecutionMessage(*FString::Printf(TEXT("%s - Cannot map local player to unique net ID"), FunctionContext), ELogVerbosity::Warning); public:
} //TSharedPtr<const FUniqueNetId>& GetUniqueNetId()
} TSharedPtr</*class*/ const FUniqueNetId> UserID;
else IOnlineSubsystem* const OnlineSub;
{ const TCHAR* FunctionContext;
FFrame::KismetExecutionMessage(*FString::Printf(TEXT("%s - Invalid player state"), FunctionContext), ELogVerbosity::Warning); };
} class FOnlineSearchSettingsEx : public FOnlineSearchSettings
} {
/**
* Sets a key value pair combination that defines a search parameter
bool IsValid() const *
{ * @param Key key for the setting
return UserID.IsValid() && (OnlineSub != nullptr); * @param Value value of the setting
} * @param InType type of comparison
*/
public: public:
//TSharedPtr<const FUniqueNetId>& GetUniqueNetId()
TSharedPtr</*class*/ const FUniqueNetId> UserID; void HardSet(FName Key, const FVariantData& Value, EOnlineComparisonOpRedux CompOp)
IOnlineSubsystem* const OnlineSub; {
const TCHAR* FunctionContext; FOnlineSessionSearchParam* SearchParam = SearchParams.Find(Key);
};
class FOnlineSearchSettingsEx : public FOnlineSearchSettings TEnumAsByte<EOnlineComparisonOp::Type> op;
{
/** switch (CompOp)
* Sets a key value pair combination that defines a search parameter {
* case EOnlineComparisonOpRedux::Equals: op = EOnlineComparisonOp::Equals; break;
* @param Key key for the setting case EOnlineComparisonOpRedux::GreaterThan: op = EOnlineComparisonOp::GreaterThan; break;
* @param Value value of the setting case EOnlineComparisonOpRedux::GreaterThanEquals: op = EOnlineComparisonOp::GreaterThanEquals; break;
* @param InType type of comparison case EOnlineComparisonOpRedux::LessThan: op = EOnlineComparisonOp::LessThan; break;
*/ case EOnlineComparisonOpRedux::LessThanEquals: op = EOnlineComparisonOp::LessThanEquals; break;
public: case EOnlineComparisonOpRedux::NotEquals: op = EOnlineComparisonOp::NotEquals; break;
default: op = EOnlineComparisonOp::Equals; break;
void HardSet(FName Key, const FVariantData& Value, EOnlineComparisonOpRedux CompOp) }
{
FOnlineSessionSearchParam* SearchParam = SearchParams.Find(Key); if (SearchParam)
{
TEnumAsByte<EOnlineComparisonOp::Type> op; SearchParam->Data = Value;
SearchParam->ComparisonOp = op;
switch (CompOp) }
{ else
case EOnlineComparisonOpRedux::Equals: op = EOnlineComparisonOp::Equals; break; {
case EOnlineComparisonOpRedux::GreaterThan: op = EOnlineComparisonOp::GreaterThan; break; FOnlineSessionSearchParam searchSetting((int)0, op);
case EOnlineComparisonOpRedux::GreaterThanEquals: op = EOnlineComparisonOp::GreaterThanEquals; break; searchSetting.Data = Value;
case EOnlineComparisonOpRedux::LessThan: op = EOnlineComparisonOp::LessThan; break; SearchParams.Add(Key, searchSetting);
case EOnlineComparisonOpRedux::LessThanEquals: op = EOnlineComparisonOp::LessThanEquals; break; }
case EOnlineComparisonOpRedux::NotEquals: op = EOnlineComparisonOp::NotEquals; break; }
default: op = EOnlineComparisonOp::Equals; break; };
}
if (SearchParam)
{
SearchParam->Data = Value;
SearchParam->ComparisonOp = op;
}
else
{
FOnlineSessionSearchParam searchSetting((int)0, op);
searchSetting.Data = Value;
SearchParams.Add(Key, searchSetting);
}
}
};
#define INVALID_INDEX -1 #define INVALID_INDEX -1

View File

@@ -42,5 +42,5 @@ private:
FDelegateHandle DelegateHandle; FDelegateHandle DelegateHandle;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -19,28 +19,25 @@ class UCreateSessionCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FEmptyOnlineDelegate OnFailure; FEmptyOnlineDelegate OnFailure;
/** /**
* Creates a session with the default online subsystem with advanced optional inputs, for dedicated servers leave UsePresence as false and set IsDedicatedServer to true. Dedicated servers don't use presence. * Creates a session with the default online subsystem with advanced optional inputs, for dedicated servers leave UsePresence as false and set IsDedicatedServer to true. Dedicated servers don't use presence.
* @param PublicConnections When doing a 'listen' server, this must be >=2 (ListenServer itself counts as a connection) * @param PublicConnections When doing a 'listen' server, this must be >=2 (ListenServer itself counts as a connection)
* @param bUseLAN When you want to play LAN, the level to play on must be loaded with option 'bIsLanMatch' * @param bUseLAN When you want to play LAN, the level to play on must be loaded with option 'bIsLanMatch'
* @param bUseLobbiesIfAvailable Used to flag the subsystem to use a lobby api instead of general hosting if the API supports it, generally true on steam for listen servers and false for dedicated * @param bUsePresence Must be true for a 'listen' server (Map must be loaded with option 'listen'), false for a 'dedicated' server.
* Must be true for a 'listen' server (Map must be loaded with option 'listen'), false for a 'dedicated' server. * @param bShouldAdvertise Set to true when the OnlineSubsystem should list your server when someone is searching for servers. Otherwise the server is hidden and only join via invite is possible.
* @param bShouldAdvertise Set to true when the OnlineSubsystem should list your server when someone is searching for servers. Otherwise the server is hidden and only join via invite is possible.
* @param bUseLobbiesVoiceChatIfAvailable Set to true to setup voice chat lobbies if the API supports it
* @param bStartAfterCreate Set to true to start the session after it's created. If false you need to manually call StartSession when ready.
*/ */
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject",AutoCreateRefTerm="ExtraSettings"), Category = "Online|AdvancedSessions") UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject",AutoCreateRefTerm="ExtraSettings"), Category = "Online|AdvancedSessions")
static UCreateSessionCallbackProxyAdvanced* CreateAdvancedSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair>& ExtraSettings, class APlayerController* PlayerController = NULL, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = true, bool bIsDedicatedServer = false, /*bool bUsePresence = true,*/ bool bUseLobbiesIfAvailable = true, bool bAllowJoinViaPresence = true, bool bAllowJoinViaPresenceFriendsOnly = false, bool bAntiCheatProtected = false, bool bUsesStats = false, bool bShouldAdvertise = true, bool bUseLobbiesVoiceChatIfAvailable = false, bool bStartAfterCreate = true); static UCreateSessionCallbackProxyAdvanced* CreateAdvancedSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair> &ExtraSettings, class APlayerController* PlayerController = NULL, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = true, bool bIsDedicatedServer = false, bool bUsePresence = true, bool bAllowJoinViaPresence = true, bool bAllowJoinViaPresenceFriendsOnly = false, bool bAntiCheatProtected = false, bool bUsesStats = false, bool bShouldAdvertise = true);
// UOnlineBlueprintCallProxyBase interface // UOnlineBlueprintCallProxyBase interface
virtual void Activate() override; virtual void Activate() override;
// End of UOnlineBlueprintCallProxyBase interface // End of UOnlineBlueprintCallProxyBase interface
private: private:
// Internal callback when session creation completes, optionally calls StartSession // Internal callback when session creation completes, calls StartSession
void OnCreateCompleted(FName SessionName, bool bWasSuccessful); void OnCreateCompleted(FName SessionName, bool bWasSuccessful);
// Internal callback when session start completes // Internal callback when session creation completes, calls StartSession
void OnStartCompleted(FName SessionName, bool bWasSuccessful); void OnStartCompleted(FName SessionName, bool bWasSuccessful);
// The player controller triggering things // The player controller triggering things
@@ -74,9 +71,6 @@ private:
// Whether to use the presence option // Whether to use the presence option
bool bUsePresence; bool bUsePresence;
// Whether to prefer the use of lobbies for hosting if the api supports them
bool bUseLobbiesIfAvailable;
// Whether to allow joining via presence // Whether to allow joining via presence
bool bAllowJoinViaPresence; bool bAllowJoinViaPresence;
@@ -92,16 +86,10 @@ private:
// Should advertise server? // Should advertise server?
bool bShouldAdvertise; bool bShouldAdvertise;
// Whether to prefer the use of voice chat lobbies if the api supports them
bool bUseLobbiesVoiceChatIfAvailable;
// Whether to start the session automatically after it is created
bool bStartAfterCreate;
// Store extra settings // Store extra settings
TArray<FSessionPropertyKeyPair> ExtraSettings; TArray<FSessionPropertyKeyPair> ExtraSettings;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -19,11 +19,8 @@ class UEndSessionCallbackProxy : public UOnlineBlueprintCallProxyBase
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FEmptyOnlineDelegate OnFailure; FEmptyOnlineDelegate OnFailure;
/** // Ends the current session
* Ends the current sessions, Generally for almost all uses you should be using the engines native Destroy Session node instead. UFUNCTION(BlueprintCallable, meta=(DeprecatedFunction,DeprecationMessage = "This function is deprecated, I realized that people have been using it wrong and it doesn't have much use in blueprints. Use Destroy Session only instead.",BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedSessions|Deprecated")
* This exists for people using StartSession and optionally hand managing the session state.
*/
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedSessions")
static UEndSessionCallbackProxy* EndSession(UObject* WorldContextObject, class APlayerController* PlayerController); static UEndSessionCallbackProxy* EndSession(UObject* WorldContextObject, class APlayerController* PlayerController);
// UOnlineBlueprintCallProxyBase interface // UOnlineBlueprintCallProxyBase interface
@@ -45,5 +42,5 @@ private:
FDelegateHandle DelegateHandle; FDelegateHandle DelegateHandle;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -1,51 +1,51 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "FindFriendSessionCallbackProxy.generated.h" #include "FindFriendSessionCallbackProxy.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(AdvancedFindFriendSessionLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedFindFriendSessionLog, Log, All);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintFindFriendSessionDelegate, const TArray<FBlueprintSessionResult> &, SessionInfo); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintFindFriendSessionDelegate, const TArray<FBlueprintSessionResult> &, SessionInfo);
UCLASS(MinimalAPI) UCLASS(MinimalAPI)
class UFindFriendSessionCallbackProxy : public UOnlineBlueprintCallProxyBase class UFindFriendSessionCallbackProxy : public UOnlineBlueprintCallProxyBase
{ {
GENERATED_UCLASS_BODY() GENERATED_UCLASS_BODY()
// Called when the friends list successfully was retrieved // Called when the friends list successfully was retrieved
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintFindFriendSessionDelegate OnSuccess; FBlueprintFindFriendSessionDelegate OnSuccess;
// Called when there was an error retrieving the friends list // Called when there was an error retrieving the friends list
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintFindFriendSessionDelegate OnFailure; FBlueprintFindFriendSessionDelegate OnFailure;
// Attempts to get the current session that a friend is in // Attempts to get the current session that a friend is in
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends") UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends")
static UFindFriendSessionCallbackProxy* FindFriendSession(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId); static UFindFriendSessionCallbackProxy* FindFriendSession(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId);
virtual void Activate() override; virtual void Activate() override;
private: private:
// Internal callback when the friends list is retrieved // Internal callback when the friends list is retrieved
void OnFindFriendSessionCompleted(int32 LocalPlayer, bool bWasSuccessful, const TArray<FOnlineSessionSearchResult>& SessionInfo); void OnFindFriendSessionCompleted(int32 LocalPlayer, bool bWasSuccessful, const TArray<FOnlineSessionSearchResult>& SessionInfo);
// The player controller triggering things // The player controller triggering things
TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr; TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr;
// The UniqueNetID of the person to invite // The UniqueNetID of the person to invite
FBPUniqueNetId cUniqueNetId; FBPUniqueNetId cUniqueNetId;
// The delegate to call on completion // The delegate to call on completion
FOnFindFriendSessionCompleteDelegate OnFindFriendSessionCompleteDelegate; FOnFindFriendSessionCompleteDelegate OnFindFriendSessionCompleteDelegate;
// Handles to the registered delegates above // Handles to the registered delegates above
FDelegateHandle FindFriendSessionCompleteDelegateHandle; FDelegateHandle FindFriendSessionCompleteDelegateHandle;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -7,12 +7,6 @@
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "FindSessionsCallbackProxyAdvanced.generated.h" #include "FindSessionsCallbackProxyAdvanced.generated.h"
FORCEINLINE bool operator==(const FBlueprintSessionResult& A, const FBlueprintSessionResult& B)
{
return (A.OnlineResult.IsValid() == B.OnlineResult.IsValid() && (A.OnlineResult.GetSessionIdStr() == B.OnlineResult.GetSessionIdStr()));
}
UCLASS(MinimalAPI) UCLASS(MinimalAPI)
class UFindSessionsCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase class UFindSessionsCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase
{ {
@@ -28,7 +22,7 @@ class UFindSessionsCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase
// Searches for advertised sessions with the default online subsystem and includes an array of filters // 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") 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<FSessionsSearchSetting> &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<FSessionsSearchSetting> &Filters, bool bEmptyServersOnly = false, bool bNonEmptyServersOnly = false, bool bSecureServersOnly = false, int MinSlotsAvailable = 0);
static bool CompareVariants(const FVariantData &A, const FVariantData &B, EOnlineComparisonOpRedux Comparator); static bool CompareVariants(const FVariantData &A, const FVariantData &B, EOnlineComparisonOpRedux Comparator);
@@ -58,9 +52,9 @@ private:
// Internal callback when the session search completes, calls out to the public success/failure callbacks // Internal callback when the session search completes, calls out to the public success/failure callbacks
void OnCompleted(bool bSuccess); void OnCompleted(bool bSuccess);
bool bRunSecondSearch; bool bRunSecondSearch;
bool bIsOnSecondSearch; bool bIsOnSecondSearch;
TArray<FBlueprintSessionResult> SessionSearchResults; TArray<FBlueprintSessionResult> SessionSearchResults;
private: private:
@@ -98,12 +92,9 @@ private:
// Search for secure servers only // Search for secure servers only
bool bSecureServersOnly; bool bSecureServersOnly;
// Search through lobbies
//bool bSearchLobbies;
// Min slots requires to search // Min slots requires to search
int MinSlotsAvailable; int MinSlotsAvailable;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -1,49 +1,49 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "GetFriendsCallbackProxy.generated.h" #include "GetFriendsCallbackProxy.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(AdvancedGetFriendsLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedGetFriendsLog, Log, All);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintGetFriendsListDelegate, const TArray<FBPFriendInfo>&, Results); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintGetFriendsListDelegate, const TArray<FBPFriendInfo>&, Results);
UCLASS(MinimalAPI) UCLASS(MinimalAPI)
class UGetFriendsCallbackProxy : public UOnlineBlueprintCallProxyBase class UGetFriendsCallbackProxy : public UOnlineBlueprintCallProxyBase
{ {
GENERATED_UCLASS_BODY() GENERATED_UCLASS_BODY()
// Called when the friends list successfully was retrieved // Called when the friends list successfully was retrieved
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintGetFriendsListDelegate OnSuccess; FBlueprintGetFriendsListDelegate OnSuccess;
// Called when there was an error retrieving the friends list // Called when there was an error retrieving the friends list
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintGetFriendsListDelegate OnFailure; FBlueprintGetFriendsListDelegate OnFailure;
// Gets the players list of friends from the OnlineSubsystem and returns it, can be retrieved later with GetStoredFriendsList // Gets the players list of friends from the OnlineSubsystem and returns it, can be retrieved later with GetStoredFriendsList
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends") UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends")
static UGetFriendsCallbackProxy* GetAndStoreFriendsList(UObject* WorldContextObject, class APlayerController* PlayerController); static UGetFriendsCallbackProxy* GetAndStoreFriendsList(UObject* WorldContextObject, class APlayerController* PlayerController);
virtual void Activate() override; virtual void Activate() override;
private: private:
// Internal callback when the friends list is retrieved // Internal callback when the friends list is retrieved
void OnReadFriendsListCompleted(int32 LocalUserNum, bool bWasSuccessful, const FString& ListName, const FString& ErrorString); void OnReadFriendsListCompleted(int32 LocalUserNum, bool bWasSuccessful, const FString& ListName, const FString& ErrorString);
// The player controller triggering things // The player controller triggering things
TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr; TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr;
// The delegate executed // The delegate executed
FOnReadFriendsListComplete FriendListReadCompleteDelegate; FOnReadFriendsListComplete FriendListReadCompleteDelegate;
// The Type of friends list to get // The Type of friends list to get
// Removed because all but the facebook interfaces don't even currently support anything but the default friends list. // Removed because all but the facebook interfaces don't even currently support anything but the default friends list.
//EBPFriendsLists FriendListToGet; //EBPFriendsLists FriendListToGet;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -1,49 +1,49 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "GetRecentPlayersCallbackProxy.generated.h" #include "GetRecentPlayersCallbackProxy.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(AdvancedGetRecentPlayersLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedGetRecentPlayersLog, Log, All);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintGetRecentPlayersDelegate, const TArray<FBPOnlineRecentPlayer>&, Results); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBlueprintGetRecentPlayersDelegate, const TArray<FBPOnlineRecentPlayer>&, Results);
UCLASS(MinimalAPI) UCLASS(MinimalAPI)
class UGetRecentPlayersCallbackProxy : public UOnlineBlueprintCallProxyBase class UGetRecentPlayersCallbackProxy : public UOnlineBlueprintCallProxyBase
{ {
GENERATED_UCLASS_BODY() GENERATED_UCLASS_BODY()
// Called when the friends list successfully was retrieved // Called when the friends list successfully was retrieved
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintGetRecentPlayersDelegate OnSuccess; FBlueprintGetRecentPlayersDelegate OnSuccess;
// Called when there was an error retrieving the friends list // Called when there was an error retrieving the friends list
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintGetRecentPlayersDelegate OnFailure; FBlueprintGetRecentPlayersDelegate OnFailure;
// Gets the list of recent players from the OnlineSubsystem and returns it, can be retrieved later with GetStoredRecentPlayersList, can fail if no recent players are found // Gets the list of recent players from the OnlineSubsystem and returns it, can be retrieved later with GetStoredRecentPlayersList, can fail if no recent players are found
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends") UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends")
static UGetRecentPlayersCallbackProxy* GetAndStoreRecentPlayersList(UObject* WorldContextObject, const FBPUniqueNetId &UniqueNetId); static UGetRecentPlayersCallbackProxy* GetAndStoreRecentPlayersList(UObject* WorldContextObject, const FBPUniqueNetId &UniqueNetId);
virtual void Activate() override; virtual void Activate() override;
private: private:
// Internal callback when the friends list is retrieved // Internal callback when the friends list is retrieved
void OnQueryRecentPlayersCompleted(const FUniqueNetId &UserID, const FString &Namespace, bool bWasSuccessful, const FString& ErrorString); void OnQueryRecentPlayersCompleted(const FUniqueNetId &UserID, const FString &Namespace, bool bWasSuccessful, const FString& ErrorString);
// Handle to the registered OnFindSessionsComplete delegate // Handle to the registered OnFindSessionsComplete delegate
FDelegateHandle DelegateHandle; FDelegateHandle DelegateHandle;
// The player controller triggering things // The player controller triggering things
//TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr; //TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr;
// The UniqueNetID of the person to get recent players for // The UniqueNetID of the person to get recent players for
FBPUniqueNetId cUniqueNetId; FBPUniqueNetId cUniqueNetId;
// The delegate executed // The delegate executed
FOnQueryRecentPlayersCompleteDelegate QueryRecentPlayersCompleteDelegate; FOnQueryRecentPlayersCompleteDelegate QueryRecentPlayersCompleteDelegate;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -41,5 +41,5 @@ private:
EBPUserPrivileges UserPrivilege; EBPUserPrivileges UserPrivilege;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -21,8 +21,8 @@ class ULoginUserCallbackProxy : public UOnlineBlueprintCallProxyBase
FEmptyOnlineDelegate OnFailure; FEmptyOnlineDelegate OnFailure;
// Logs into the identity interface // Logs into the identity interface
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject", AdvancedDisplay = "AuthType"), Category = "Online|AdvancedIdentity") UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedIdentity")
static ULoginUserCallbackProxy* LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken, FString AuthType); static ULoginUserCallbackProxy* LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken);
// UOnlineBlueprintCallProxyBase interface // UOnlineBlueprintCallProxyBase interface
virtual void Activate() override; virtual void Activate() override;
@@ -42,8 +42,6 @@ private:
// The user pass / token // The user pass / token
FString UserToken; FString UserToken;
FString AuthType;
// The delegate executed by the online subsystem // The delegate executed by the online subsystem
FOnLoginCompleteDelegate Delegate; FOnLoginCompleteDelegate Delegate;
@@ -51,5 +49,5 @@ private:
FDelegateHandle DelegateHandle; FDelegateHandle DelegateHandle;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -43,5 +43,5 @@ private:
FDelegateHandle DelegateHandle; FDelegateHandle DelegateHandle;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -1,27 +1,27 @@
#pragma once #pragma once
//#include "EngineMinimal.h" //#include "EngineMinimal.h"
//#include "Core.h" //#include "Core.h"
//#include "OnlineSessionInterface.h" //#include "OnlineSessionInterface.h"
//#include "OnlineSessionSettings.h" //#include "OnlineSessionSettings.h"
//#include "OnlineDelegateMacros.h" //#include "OnlineDelegateMacros.h"
//#include "OnlineSubsystem.h" //#include "OnlineSubsystem.h"
//#include "OnlineSubsystemImpl.h" //#include "OnlineSubsystemImpl.h"
//#include "OnlineSubsystemUtils.h" //#include "OnlineSubsystemUtils.h"
//#include "OnlineSubsystemUtilsModule.h" //#include "OnlineSubsystemUtilsModule.h"
//#include "ModuleManager.h" //#include "ModuleManager.h"
//#include "OnlineSubsystemUtilsClasses.h" //#include "OnlineSubsystemUtilsClasses.h"
//#include "BlueprintDataDefinitions.h" //#include "BlueprintDataDefinitions.h"
/*#include "VoiceEngineImpl.h" /*#include "VoiceEngineImpl.h"
#include "VoiceInterfaceImpl.h" #include "VoiceInterfaceImpl.h"
#include "Voice.h"" #include "Voice.h""
*/ */
// Found this in the steam controller, seems like a nice thought since steam is throwing errors // Found this in the steam controller, seems like a nice thought since steam is throwing errors
// Disable crazy warnings that claim that standard C library is "deprecated". // Disable crazy warnings that claim that standard C library is "deprecated".
//#ifdef _MSC_VER //#ifdef _MSC_VER
//#pragma warning(push) //#pragma warning(push)
//#pragma warning(disable:4996) //#pragma warning(disable:4996)
//#endif //#endif

View File

@@ -1,49 +1,49 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "SendFriendInviteCallbackProxy.generated.h" #include "SendFriendInviteCallbackProxy.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(AdvancedSendFriendInviteLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedSendFriendInviteLog, Log, All);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FBlueprintSendFriendInviteDelegate); DECLARE_DYNAMIC_MULTICAST_DELEGATE(FBlueprintSendFriendInviteDelegate);
UCLASS(MinimalAPI) UCLASS(MinimalAPI)
class USendFriendInviteCallbackProxy : public UOnlineBlueprintCallProxyBase class USendFriendInviteCallbackProxy : public UOnlineBlueprintCallProxyBase
{ {
GENERATED_UCLASS_BODY() GENERATED_UCLASS_BODY()
// Called when the friends list successfully was retrieved // Called when the friends list successfully was retrieved
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintSendFriendInviteDelegate OnSuccess; FBlueprintSendFriendInviteDelegate OnSuccess;
// Called when there was an error retrieving the friends list // Called when there was an error retrieving the friends list
UPROPERTY(BlueprintAssignable) UPROPERTY(BlueprintAssignable)
FBlueprintSendFriendInviteDelegate OnFailure; FBlueprintSendFriendInviteDelegate OnFailure;
// Adds a friend who is using the defined UniqueNetId, some interfaces do now allow this function to be called (INCLUDING STEAM) // Adds a friend who is using the defined UniqueNetId, some interfaces do now allow this function to be called (INCLUDING STEAM)
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends") UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedFriends")
static USendFriendInviteCallbackProxy* SendFriendInvite(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &UniqueNetIDInvited); static USendFriendInviteCallbackProxy* SendFriendInvite(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &UniqueNetIDInvited);
virtual void Activate() override; virtual void Activate() override;
private: private:
// Internal callback when the friends list is retrieved // Internal callback when the friends list is retrieved
void OnSendInviteComplete(int32 LocalPlayerNum, bool bWasSuccessful, const FUniqueNetId &InvitedPlayer, const FString &ListName, const FString &ErrorString); void OnSendInviteComplete(int32 LocalPlayerNum, bool bWasSuccessful, const FUniqueNetId &InvitedPlayer, const FString &ListName, const FString &ErrorString);
// The player controller triggering things // The player controller triggering things
TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr; TWeakObjectPtr<APlayerController> PlayerControllerWeakPtr;
// The UniqueNetID of the person to invite // The UniqueNetID of the person to invite
FBPUniqueNetId cUniqueNetId; FBPUniqueNetId cUniqueNetId;
// The delegate to call on completion // The delegate to call on completion
FOnSendInviteComplete OnSendInviteCompleteDelegate; FOnSendInviteComplete OnSendInviteCompleteDelegate;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -1,46 +0,0 @@
#pragma once
#include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h"
#include "StartSessionCallbackProxyAdvanced.generated.h"
UCLASS(MinimalAPI)
class UStartSessionCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase
{
GENERATED_UCLASS_BODY()
// Called when the session starts successfully
UPROPERTY(BlueprintAssignable)
FEmptyOnlineDelegate OnSuccess;
// Called when there is an error starting the session
UPROPERTY(BlueprintAssignable)
FEmptyOnlineDelegate OnFailure;
/**
* Starts a session with the default online subsystem. The session needs to be previously created by calling the "CreateAdvancedSession" node.
* @param WorldContextObject
*/
UFUNCTION(
BlueprintCallable
, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject")
, Category = "Online|AdvancedSessions"
)
static UStartSessionCallbackProxyAdvanced* StartAdvancedSession(UObject* WorldContextObject);
// UOnlineBlueprintCallProxyBase interface
virtual void Activate() override;
// End of UOnlineBlueprintCallProxyBase interface
private:
// Internal callback when session start completes
void OnStartCompleted(FName SessionName, bool bWasSuccessful);
// The delegate executed by the online subsystem
FOnStartSessionCompleteDelegate StartCompleteDelegate;
// Handles to the registered delegates above
FDelegateHandle StartCompleteDelegateHandle;
// The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject;
};

View File

@@ -21,7 +21,7 @@ class UUpdateSessionCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase
// Creates a session with the default online subsystem with advanced optional inputs, you MUST fill in all categories or it will pass in values that you didn't want as default values // Creates a session with the default online subsystem with advanced optional inputs, you MUST fill in all categories or it will pass in values that you didn't want as default values
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject",AutoCreateRefTerm="ExtraSettings"), Category = "Online|AdvancedSessions") UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject",AutoCreateRefTerm="ExtraSettings"), Category = "Online|AdvancedSessions")
static UUpdateSessionCallbackProxyAdvanced* UpdateSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair> &ExtraSettings, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = false, bool bAllowJoinInProgress = false, bool bRefreshOnlineData = true, bool bIsDedicatedServer = false, bool bShouldAdvertise = true, bool bAllowJoinViaPresence = true, bool bAllowJoinViaPresenceFriendsOnly = false); static UUpdateSessionCallbackProxyAdvanced* UpdateSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair> &ExtraSettings, int32 PublicConnections = 100, int32 PrivateConnections = 0, bool bUseLAN = false, bool bAllowInvites = false, bool bAllowJoinInProgress = false, bool bRefreshOnlineData = true, bool bIsDedicatedServer = false);
// UOnlineBlueprintCallProxyBase interface // UOnlineBlueprintCallProxyBase interface
virtual void Activate() override; virtual void Activate() override;
@@ -38,38 +38,30 @@ private:
FDelegateHandle OnUpdateSessionCompleteDelegateHandle; FDelegateHandle OnUpdateSessionCompleteDelegateHandle;
// Number of public connections // Number of public connections
int NumPublicConnections = 100; int NumPublicConnections;
// Number of private connections // Number of private connections
int NumPrivateConnections = 0; int NumPrivateConnections;
// Whether or not to search LAN // Whether or not to search LAN
bool bUseLAN = false; bool bUseLAN;
// Whether or not to allow invites // Whether or not to allow invites
bool bAllowInvites = true; bool bAllowInvites;
// Store extra settings // Store extra settings
TArray<FSessionPropertyKeyPair> ExtraSettings; TArray<FSessionPropertyKeyPair> ExtraSettings;
// Whether to update the online data // Whether to update the online data
bool bRefreshOnlineData = true; bool bRefreshOnlineData;
// Allow joining in progress // Allow joining in progress
bool bAllowJoinInProgress = true; bool bAllowJoinInProgress;
// Allow joining in progress
bool bAllowJoinViaPresence = true;
// Allow joining in progress
bool bAllowJoinViaPresenceFriendsOnly = false;
// Update whether this is a dedicated server or not // Update whether this is a dedicated server or not
bool bDedicatedServer = false; bool bDedicatedServer;
bool bShouldAdvertise = true;
// The world context object in which this call is taking place // The world context object in which this call is taking place
TWeakObjectPtr<UObject> WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -1,209 +1,160 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedExternalUILibrary.h" #include "AdvancedExternalUILibrary.h"
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
//General Log //General Log
DEFINE_LOG_CATEGORY(AdvancedExternalUILog); DEFINE_LOG_CATEGORY(AdvancedExternalUILog);
void UAdvancedExternalUILibrary::ShowAccountUpgradeUI(UObject* WorldContextObject, const FBPUniqueNetId PlayerRequestingAccountUpgradeUI, EBlueprintResultSwitch &Result) void UAdvancedExternalUILibrary::ShowAccountUpgradeUI(const FBPUniqueNetId PlayerRequestingAccountUpgradeUI, EBlueprintResultSwitch &Result)
{ {
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface();
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World)) if (!ExternalUIInterface.IsValid())
{ {
Result = EBlueprintResultSwitch::OnFailure; UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowAccountUpgradeUI Failed to get External UI interface!"));
return; Result = EBlueprintResultSwitch::OnFailure;
} return;
}
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface(World);
ExternalUIInterface->ShowAccountUpgradeUI(*PlayerRequestingAccountUpgradeUI.GetUniqueNetId());
if (!ExternalUIInterface.IsValid()) Result = EBlueprintResultSwitch::OnSuccess;
{ }
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowAccountUpgradeUI Failed to get External UI interface!"));
Result = EBlueprintResultSwitch::OnFailure; void UAdvancedExternalUILibrary::ShowProfileUI(const FBPUniqueNetId PlayerViewingProfile, const FBPUniqueNetId PlayerToViewProfileOf, EBlueprintResultSwitch &Result)
return; {
}
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface();
ExternalUIInterface->ShowAccountUpgradeUI(*PlayerRequestingAccountUpgradeUI.GetUniqueNetId());
Result = EBlueprintResultSwitch::OnSuccess; if (!ExternalUIInterface.IsValid())
} {
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowProfileUI Failed to get External UI interface!"));
void UAdvancedExternalUILibrary::ShowProfileUI(UObject* WorldContextObject, const FBPUniqueNetId PlayerViewingProfile, const FBPUniqueNetId PlayerToViewProfileOf, EBlueprintResultSwitch &Result) Result = EBlueprintResultSwitch::OnFailure;
{ return;
}
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World)) ExternalUIInterface->ShowProfileUI(*PlayerViewingProfile.GetUniqueNetId(), *PlayerToViewProfileOf.GetUniqueNetId(), NULL);
{ Result = EBlueprintResultSwitch::OnSuccess;
Result = EBlueprintResultSwitch::OnFailure; }
return;
}
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface(World); void UAdvancedExternalUILibrary::ShowWebURLUI(FString URLToShow, EBlueprintResultSwitch &Result, TArray<FString>& AllowedDomains, bool bEmbedded, bool bShowBackground, bool bShowCloseButton, int32 OffsetX, int32 OffsetY, int32 SizeX, int32 SizeY)
{
if (!ExternalUIInterface.IsValid()) IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface();
{
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowProfileUI Failed to get External UI interface!")); if (!ExternalUIInterface.IsValid())
Result = EBlueprintResultSwitch::OnFailure; {
return; UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowWebURLUI Failed to get External UI interface!"));
} Result = EBlueprintResultSwitch::OnFailure;
return;
ExternalUIInterface->ShowProfileUI(*PlayerViewingProfile.GetUniqueNetId(), *PlayerToViewProfileOf.GetUniqueNetId(), NULL); }
Result = EBlueprintResultSwitch::OnSuccess;
} URLToShow = URLToShow.Replace(TEXT("http://"), TEXT(""));
URLToShow = URLToShow.Replace(TEXT("https://"), TEXT(""));
FShowWebUrlParams Params;
void UAdvancedExternalUILibrary::ShowWebURLUI(UObject* WorldContextObject, FString URLToShow, EBlueprintResultSwitch &Result, TArray<FString>& AllowedDomains, bool bEmbedded, bool bShowBackground, bool bShowCloseButton, int32 OffsetX, int32 OffsetY, int32 SizeX, int32 SizeY) Params.AllowedDomains = AllowedDomains;
{ Params.bEmbedded = bEmbedded;
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); Params.bShowBackground = bShowBackground;
if (!IsValid(World)) Params.bShowCloseButton = bShowCloseButton;
{ Params.OffsetX = OffsetX;
Result = EBlueprintResultSwitch::OnFailure; Params.OffsetY = OffsetY;
return; Params.SizeX = SizeX;
} Params.SizeY = SizeY;
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface(World); ExternalUIInterface->ShowWebURL(URLToShow, Params);
Result = EBlueprintResultSwitch::OnSuccess;
if (!ExternalUIInterface.IsValid()) }
{
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowWebURLUI Failed to get External UI interface!")); void UAdvancedExternalUILibrary::CloseWebURLUI()
Result = EBlueprintResultSwitch::OnFailure; {
return; IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface();
}
if (!ExternalUIInterface.IsValid())
URLToShow = URLToShow.Replace(TEXT("http://"), TEXT("")); {
URLToShow = URLToShow.Replace(TEXT("https://"), TEXT("")); UE_LOG(AdvancedExternalUILog, Warning, TEXT("CloseWebURLUI Failed to get External UI interface!"));
return;
FShowWebUrlParams Params; }
Params.AllowedDomains = AllowedDomains;
Params.bEmbedded = bEmbedded; ExternalUIInterface->CloseWebURL();
Params.bShowBackground = bShowBackground; }
Params.bShowCloseButton = bShowCloseButton;
Params.OffsetX = OffsetX; void UAdvancedExternalUILibrary::ShowLeaderBoardUI(FString LeaderboardName, EBlueprintResultSwitch &Result)
Params.OffsetY = OffsetY; {
Params.SizeX = SizeX; IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface();
Params.SizeY = SizeY;
if (!ExternalUIInterface.IsValid())
ExternalUIInterface->ShowWebURL(URLToShow, Params); {
Result = EBlueprintResultSwitch::OnSuccess; UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowLeaderboardsUI Failed to get External UI interface!"));
} Result = EBlueprintResultSwitch::OnFailure;
return;
void UAdvancedExternalUILibrary::CloseWebURLUI(UObject* WorldContextObject) }
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); ExternalUIInterface->ShowLeaderboardUI(LeaderboardName);
if (!IsValid(World)) Result = EBlueprintResultSwitch::OnSuccess;
{
return; }
}
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface(World); void UAdvancedExternalUILibrary::ShowInviteUI(APlayerController *PlayerController, EBlueprintResultSwitch &Result)
{
if (!ExternalUIInterface.IsValid()) if (!PlayerController)
{ {
UE_LOG(AdvancedExternalUILog, Warning, TEXT("CloseWebURLUI Failed to get External UI interface!")); UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowInviteUI Had a bad Player Controller!"));
return; Result = EBlueprintResultSwitch::OnFailure;
} return;
}
ExternalUIInterface->CloseWebURL();
} IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface();
void UAdvancedExternalUILibrary::ShowLeaderBoardUI(UObject* WorldContextObject, FString LeaderboardName, EBlueprintResultSwitch &Result) if (!ExternalUIInterface.IsValid())
{ {
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowInviteUI Failed to get External UI interface!"));
if (!IsValid(World)) Result = EBlueprintResultSwitch::OnFailure;
{ return;
Result = EBlueprintResultSwitch::OnFailure; }
return;
} ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface(World); if (!Player)
{
if (!ExternalUIInterface.IsValid()) UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowInviteUI Failed to get ULocalPlayer for the given PlayerController!"));
{ Result = EBlueprintResultSwitch::OnFailure;
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowLeaderboardsUI Failed to get External UI interface!")); return;
Result = EBlueprintResultSwitch::OnFailure; }
return;
} ExternalUIInterface->ShowInviteUI(Player->GetControllerId(), NAME_GameSession);
Result = EBlueprintResultSwitch::OnSuccess;
ExternalUIInterface->ShowLeaderboardUI(LeaderboardName); }
Result = EBlueprintResultSwitch::OnSuccess;
void UAdvancedExternalUILibrary::ShowFriendsUI(APlayerController *PlayerController, EBlueprintResultSwitch &Result)
} {
if (!PlayerController)
{
void UAdvancedExternalUILibrary::ShowInviteUI(UObject* WorldContextObject, APlayerController *PlayerController, EBlueprintResultSwitch &Result) UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowFriendsUI Had a bad Player Controller!"));
{ Result = EBlueprintResultSwitch::OnFailure;
if (!PlayerController) return;
{ }
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowInviteUI Had a bad Player Controller!"));
Result = EBlueprintResultSwitch::OnFailure; IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface();
return;
} if (!ExternalUIInterface.IsValid())
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowFriendsUI Failed to get External UI interface!"));
if (!IsValid(World)) Result = EBlueprintResultSwitch::OnFailure;
{ return;
Result = EBlueprintResultSwitch::OnFailure; }
return;
} ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface(World); if (!Player)
{
if (!ExternalUIInterface.IsValid()) UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowFriendsUI Failed to get ULocalPlayer for the given PlayerController!"));
{ Result = EBlueprintResultSwitch::OnFailure;
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowInviteUI Failed to get External UI interface!")); return;
Result = EBlueprintResultSwitch::OnFailure; }
return;
} ExternalUIInterface->ShowFriendsUI(Player->GetControllerId());
Result = EBlueprintResultSwitch::OnSuccess;
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player)
{
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowInviteUI Failed to get ULocalPlayer for the given PlayerController!"));
Result = EBlueprintResultSwitch::OnFailure;
return;
}
ExternalUIInterface->ShowInviteUI(Player->GetControllerId(), NAME_GameSession);
Result = EBlueprintResultSwitch::OnSuccess;
}
void UAdvancedExternalUILibrary::ShowFriendsUI(UObject* WorldContextObject, APlayerController *PlayerController, EBlueprintResultSwitch &Result)
{
if (!PlayerController)
{
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowFriendsUI Had a bad Player Controller!"));
Result = EBlueprintResultSwitch::OnFailure;
return;
}
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World))
{
Result = EBlueprintResultSwitch::OnFailure;
return;
}
IOnlineExternalUIPtr ExternalUIInterface = Online::GetExternalUIInterface(World);
if (!ExternalUIInterface.IsValid())
{
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowFriendsUI Failed to get External UI interface!"));
Result = EBlueprintResultSwitch::OnFailure;
return;
}
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player)
{
UE_LOG(AdvancedExternalUILog, Warning, TEXT("ShowFriendsUI Failed to get ULocalPlayer for the given PlayerController!"));
Result = EBlueprintResultSwitch::OnFailure;
return;
}
ExternalUIInterface->ShowFriendsUI(Player->GetControllerId());
Result = EBlueprintResultSwitch::OnSuccess;
} }

View File

@@ -1,401 +1,334 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedFriendsGameInstance.h" #include "AdvancedFriendsGameInstance.h"
#include "Kismet/GameplayStatics.h" #include "Kismet/GameplayStatics.h"
#include "GameFramework/PlayerController.h" #include "GameFramework/PlayerController.h"
//General Log //General Log
DEFINE_LOG_CATEGORY(AdvancedFriendsInterfaceLog); DEFINE_LOG_CATEGORY(AdvancedFriendsInterfaceLog);
UAdvancedFriendsGameInstance::UAdvancedFriendsGameInstance(const FObjectInitializer& ObjectInitializer) UAdvancedFriendsGameInstance::UAdvancedFriendsGameInstance(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer) : Super(ObjectInitializer)
, bCallFriendInterfaceEventsOnPlayerControllers(true) , bCallFriendInterfaceEventsOnPlayerControllers(true)
, bCallIdentityInterfaceEventsOnPlayerControllers(true) , bCallIdentityInterfaceEventsOnPlayerControllers(true)
, bCallVoiceInterfaceEventsOnPlayerControllers(true) , bCallVoiceInterfaceEventsOnPlayerControllers(true)
, bEnableTalkingStatusDelegate(true) , bEnableTalkingStatusDelegate(true)
, SessionInviteReceivedDelegate(FOnSessionInviteReceivedDelegate::CreateUObject(this, &ThisClass::OnSessionInviteReceivedMaster)) , SessionInviteReceivedDelegate(FOnSessionInviteReceivedDelegate::CreateUObject(this, &ThisClass::OnSessionInviteReceivedMaster))
, SessionInviteAcceptedDelegate(FOnSessionUserInviteAcceptedDelegate::CreateUObject(this, &ThisClass::OnSessionInviteAcceptedMaster)) , SessionInviteAcceptedDelegate(FOnSessionUserInviteAcceptedDelegate::CreateUObject(this, &ThisClass::OnSessionInviteAcceptedMaster))
, PlayerTalkingStateChangedDelegate(FOnPlayerTalkingStateChangedDelegate::CreateUObject(this, &ThisClass::OnPlayerTalkingStateChangedMaster)) , PlayerTalkingStateChangedDelegate(FOnPlayerTalkingStateChangedDelegate::CreateUObject(this, &ThisClass::OnPlayerTalkingStateChangedMaster))
, PlayerLoginChangedDelegate(FOnLoginChangedDelegate::CreateUObject(this, &ThisClass::OnPlayerLoginChangedMaster)) , PlayerLoginChangedDelegate(FOnLoginChangedDelegate::CreateUObject(this, &ThisClass::OnPlayerLoginChangedMaster))
, PlayerLoginStatusChangedDelegate(FOnLoginStatusChangedDelegate::CreateUObject(this, &ThisClass::OnPlayerLoginStatusChangedMaster)) , PlayerLoginStatusChangedDelegate(FOnLoginStatusChangedDelegate::CreateUObject(this, &ThisClass::OnPlayerLoginStatusChangedMaster))
{ {
} }
void UAdvancedFriendsGameInstance::OnSessionUserInviteAccepted(const bool bWasSuccessful, const int32 ControllerId, FUniqueNetIdPtr UserId, const FOnlineSessionSearchResult& InviteResult) void UAdvancedFriendsGameInstance::Shutdown()
{ {
IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld());
if (SessionInterface.IsValid())
{ if (!SessionInterface.IsValid())
SessionInterface->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle); {
OnJoinSessionCompleteDelegateHandle = SessionInterface->AddOnJoinSessionCompleteDelegate_Handle( UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsGameInstance Failed to get session system!"));
FOnJoinSessionCompleteDelegate::CreateUObject(this, &UAdvancedFriendsGameInstance::OnJoinSessionComplete)); //return;
}
// Temp for 5.5, they aren't filling in the struct correctly else
if (!InviteResult.Session.SessionSettings.bIsDedicated) {
{ // Clear all of the delegate handles here
FOnlineSessionSearchResult ModResult = InviteResult; SessionInterface->ClearOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegateHandle);
ModResult.Session.SessionSettings.bUsesPresence = true; SessionInterface->ClearOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegateHandle);
ModResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; }
SessionInterface->JoinSession(0, NAME_GameSession, ModResult);
}
else if (bEnableTalkingStatusDelegate)
{ {
SessionInterface->JoinSession(0, NAME_GameSession, InviteResult); IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(GetWorld());
}
} if (VoiceInterface.IsValid())
UE_LOG(AdvancedFriendsInterfaceLog, Log, TEXT("Called Join Session for Steam Friends List UI InviteResults: %s, UserId: %s"), *InviteResult.GetSessionIdStr(), *UserId->ToString()); {
} VoiceInterface->ClearOnPlayerTalkingStateChangedDelegate_Handle(PlayerTalkingStateChangedDelegateHandle);
}
void UAdvancedFriendsGameInstance::OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result) else
{ {
// If we don't want to auto travel to the session instance then exit out UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get voice interface!"));
if (!bAutoTravelOnAcceptedUserInviteReceived) }
{ }
return;
} IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(GetWorld());
IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); if (IdentityInterface.IsValid())
if (SessionInterface.IsValid()) {
{ IdentityInterface->ClearOnLoginChangedDelegate_Handle(PlayerLoginChangedDelegateHandle);
FString ConnectInfo;
if (SessionInterface->GetResolvedConnectString(NAME_GameSession, ConnectInfo))
{ // I am just defaulting to player 1
APlayerController* PlayerController = GetFirstLocalPlayerController(); IdentityInterface->ClearOnLoginStatusChangedDelegate_Handle(0, PlayerLoginStatusChangedDelegateHandle);
if (PlayerController) }
{
PlayerController->ClientTravel(ConnectInfo, ETravelType::TRAVEL_Absolute);
} Super::Shutdown();
} }
}
} void UAdvancedFriendsGameInstance::Init()
{
void UAdvancedFriendsGameInstance::Shutdown() IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld());//OnlineSub->GetSessionInterface();
{
IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld()); if (SessionInterface.IsValid())
{
if (!SessionInterface.IsValid()) // Currently doesn't store a handle or assign a delegate to any local player beyond the first.....should handle?
{ // Thought about directly handling it but friends for multiple players probably isn't required
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsGameInstance Failed to get session system!")); // Iterating through the local player TArray only works if it has had players assigned to it, most of the online interfaces don't support
//return; // Multiple logins either (IE: Steam)
} SessionInviteAcceptedDelegateHandle = SessionInterface->AddOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegate);
else
{ SessionInviteReceivedDelegateHandle = SessionInterface->AddOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegate);
// Clear all of the delegate handles here }
SessionInterface->ClearOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegateHandle); else
SessionInterface->ClearOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegateHandle); {
SessionInterface->ClearOnJoinSessionCompleteDelegate_Handle(OnJoinSessionCompleteDelegateHandle); UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get session interface!"));
} //return;
}
if (bEnableTalkingStatusDelegate) // Beginning work on the voice interface
{ if (bEnableTalkingStatusDelegate)
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(GetWorld()); {
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(GetWorld());
if (VoiceInterface.IsValid())
{ if (VoiceInterface.IsValid())
VoiceInterface->ClearOnPlayerTalkingStateChangedDelegate_Handle(PlayerTalkingStateChangedDelegateHandle); {
} PlayerTalkingStateChangedDelegateHandle = VoiceInterface->AddOnPlayerTalkingStateChangedDelegate_Handle(PlayerTalkingStateChangedDelegate);
else }
{ else
{
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get voice interface!"));
} UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get voice interface!"));
} }
}
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(GetWorld());
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(GetWorld());
if (IdentityInterface.IsValid())
{ if (IdentityInterface.IsValid())
IdentityInterface->ClearOnLoginChangedDelegate_Handle(PlayerLoginChangedDelegateHandle); {
PlayerLoginChangedDelegateHandle = IdentityInterface->AddOnLoginChangedDelegate_Handle(PlayerLoginChangedDelegate);
// I am just defaulting to player 1 // Just defaulting to player 1
IdentityInterface->ClearOnLoginStatusChangedDelegate_Handle(0, PlayerLoginStatusChangedDelegateHandle); PlayerLoginStatusChangedDelegateHandle = IdentityInterface->AddOnLoginStatusChangedDelegate_Handle(0, PlayerLoginStatusChangedDelegate);
} }
else
{
Super::Shutdown(); UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get identity interface!"));
} }
void UAdvancedFriendsGameInstance::Init()
{ Super::Init();
IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(GetWorld());//OnlineSub->GetSessionInterface(); }
if (SessionInterface.IsValid()) /*void UAdvancedFriendsGameInstance::PostLoad()
{ {
// Currently doesn't store a handle or assign a delegate to any local player beyond the first.....should handle? Super::PostLoad();
// Thought about directly handling it but friends for multiple players probably isn't required }*/
// Iterating through the local player TArray only works if it has had players assigned to it, most of the online interfaces don't support
// Multiple logins either (IE: Steam)
SessionInviteAcceptedDelegateHandle = SessionInterface->AddOnSessionUserInviteAcceptedDelegate_Handle(SessionInviteAcceptedDelegate); // Removed because it never gets called by the online subsystems
/*void UAdvancedFriendsGameInstance::OnSessionInviteReceivedMaster(const FUniqueNetId &InvitedPlayer, const FUniqueNetId &FriendInviting, const FOnlineSessionSearchResult& Session)
SessionInviteReceivedDelegateHandle = SessionInterface->AddOnSessionInviteReceivedDelegate_Handle(SessionInviteReceivedDelegate); {
// Just call the blueprint event to let the user handle this
// Custom steam join game delegate
SessionInterface->OnSessionUserInviteAcceptedDelegates.AddUObject(this, &UAdvancedFriendsGameInstance::OnSessionUserInviteAccepted); FBPUniqueNetId IP, FI;
}
else IP.SetUniqueNetId(&InvitedPlayer);
{
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get session interface!")); FI.SetUniqueNetId(&FriendInviting);
//return;
} FBlueprintSessionResult BPS;
BPS.OnlineResult = Session;
// Beginning work on the voice interface OnSessionInviteReceived(IP,FI,BPS);
if (bEnableTalkingStatusDelegate)
{ TArray<class APlayerState*>& PlayerArray = GetWorld()->GetGameState()->PlayerArray;
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(GetWorld()); const TArray<class ULocalPlayer*>&ControllerArray = this->GetLocalPlayers();
if (VoiceInterface.IsValid()) for (int i = 0; i < ControllerArray.Num(); i++)
{ {
PlayerTalkingStateChangedDelegateHandle = VoiceInterface->AddOnPlayerTalkingStateChangedDelegate_Handle(PlayerTalkingStateChangedDelegate); if (*PlayerArray[ControllerArray[i]->PlayerController->NetPlayerIndex]->UniqueId.GetUniqueNetId().Get() == InvitedPlayer)
} {
else //Run the Event specific to the actor, if the actor has the interface, otherwise ignore
{ if (ControllerArray[i]->PlayerController->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
{
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get voice interface!")); IAdvancedFriendsInterface::Execute_OnSessionInviteReceived(ControllerArray[i]->PlayerController, FI, BPS);
} }
} break;
}
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(GetWorld()); }
}*/
if (IdentityInterface.IsValid())
{ void UAdvancedFriendsGameInstance::OnPlayerLoginStatusChangedMaster(int32 PlayerNum, ELoginStatus::Type PreviousStatus, ELoginStatus::Type NewStatus, const FUniqueNetId & NewPlayerUniqueNetID)
PlayerLoginChangedDelegateHandle = IdentityInterface->AddOnLoginChangedDelegate_Handle(PlayerLoginChangedDelegate); {
EBPLoginStatus OrigStatus = (EBPLoginStatus)PreviousStatus;
// Just defaulting to player 1 EBPLoginStatus CurrentStatus = (EBPLoginStatus)NewStatus;
PlayerLoginStatusChangedDelegateHandle = IdentityInterface->AddOnLoginStatusChangedDelegate_Handle(0, PlayerLoginStatusChangedDelegate); FBPUniqueNetId PlayerID;
} PlayerID.SetUniqueNetId(&NewPlayerUniqueNetID);
else
{ OnPlayerLoginStatusChanged(PlayerNum, OrigStatus,CurrentStatus,PlayerID);
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get identity interface!"));
}
if (bCallIdentityInterfaceEventsOnPlayerControllers)
{
Super::Init(); APlayerController* Player = UGameplayStatics::GetPlayerController(GetWorld(), PlayerNum);
}
if (Player != NULL)
/*void UAdvancedFriendsGameInstance::PostLoad() {
{ //Run the Event specific to the actor, if the actor has the interface, otherwise ignore
Super::PostLoad(); if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
}*/ {
IAdvancedFriendsInterface::Execute_OnPlayerLoginStatusChanged(Player, OrigStatus, CurrentStatus, PlayerID);
}
// Removed because it never gets called by the online subsystems }
/*void UAdvancedFriendsGameInstance::OnSessionInviteReceivedMaster(const FUniqueNetId &InvitedPlayer, const FUniqueNetId &FriendInviting, const FOnlineSessionSearchResult& Session) else
{ {
// Just call the blueprint event to let the user handle this UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnPlayerLoginStatusChangedMaster!"));
}
FBPUniqueNetId IP, FI; }
}
IP.SetUniqueNetId(&InvitedPlayer);
void UAdvancedFriendsGameInstance::OnPlayerLoginChangedMaster(int32 PlayerNum)
FI.SetUniqueNetId(&FriendInviting); {
OnPlayerLoginChanged(PlayerNum);
FBlueprintSessionResult BPS;
BPS.OnlineResult = Session; if (bCallIdentityInterfaceEventsOnPlayerControllers)
OnSessionInviteReceived(IP,FI,BPS); {
APlayerController* Player = UGameplayStatics::GetPlayerController(GetWorld(), PlayerNum);
TArray<class APlayerState*>& PlayerArray = GetWorld()->GetGameState()->PlayerArray;
const TArray<class ULocalPlayer*>&ControllerArray = this->GetLocalPlayers(); if (Player != NULL)
{
for (int i = 0; i < ControllerArray.Num(); i++) //Run the Event specific to the actor, if the actor has the interface, otherwise ignore
{ if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
if (*PlayerArray[ControllerArray[i]->PlayerController->NetPlayerIndex]->UniqueId.GetUniqueNetId().Get() == InvitedPlayer) {
{ IAdvancedFriendsInterface::Execute_OnPlayerLoginChanged(Player, PlayerNum);
//Run the Event specific to the actor, if the actor has the interface, otherwise ignore }
if (ControllerArray[i]->PlayerController->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass())) }
{ else
IAdvancedFriendsInterface::Execute_OnSessionInviteReceived(ControllerArray[i]->PlayerController, FI, BPS); {
} UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnPlayerLoginChanged!"));
break; }
} }
} }
}*/
void UAdvancedFriendsGameInstance::OnPlayerTalkingStateChangedMaster(TSharedRef<const FUniqueNetId> PlayerId, bool bIsTalking)
void UAdvancedFriendsGameInstance::OnPlayerLoginStatusChangedMaster(int32 PlayerNum, ELoginStatus::Type PreviousStatus, ELoginStatus::Type NewStatus, const FUniqueNetId & NewPlayerUniqueNetID) {
{ FBPUniqueNetId PlayerTalking;
EBPLoginStatus OrigStatus = (EBPLoginStatus)PreviousStatus; PlayerTalking.SetUniqueNetId(PlayerId);
EBPLoginStatus CurrentStatus = (EBPLoginStatus)NewStatus; OnPlayerTalkingStateChanged(PlayerTalking, bIsTalking);
FBPUniqueNetId PlayerID;
PlayerID.SetUniqueNetId(&NewPlayerUniqueNetID); if (bCallVoiceInterfaceEventsOnPlayerControllers)
{
OnPlayerLoginStatusChanged(PlayerNum, OrigStatus,CurrentStatus,PlayerID); APlayerController* Player = NULL;
for (const ULocalPlayer* LPlayer : LocalPlayers)
if (bCallIdentityInterfaceEventsOnPlayerControllers) {
{ Player = UGameplayStatics::GetPlayerController(GetWorld(), LPlayer->GetControllerId());
APlayerController* Player = UGameplayStatics::GetPlayerController(GetWorld(), PlayerNum);
if (Player != NULL)
if (Player != NULL) {
{ //Run the Event specific to the actor, if the actor has the interface, otherwise ignore
//Run the Event specific to the actor, if the actor has the interface, otherwise ignore if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass())) {
{ IAdvancedFriendsInterface::Execute_OnPlayerVoiceStateChanged(Player, PlayerTalking, bIsTalking);
IAdvancedFriendsInterface::Execute_OnPlayerLoginStatusChanged(Player, OrigStatus, CurrentStatus, PlayerID); }
} }
} else
else {
{ UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnVoiceStateChanged!"));
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnPlayerLoginStatusChangedMaster!")); }
} }
} }
} }
void UAdvancedFriendsGameInstance::OnPlayerLoginChangedMaster(int32 PlayerNum) void UAdvancedFriendsGameInstance::OnSessionInviteReceivedMaster(const FUniqueNetId & PersonInvited, const FUniqueNetId & PersonInviting, const FString& AppId, const FOnlineSessionSearchResult& SessionToJoin)
{ {
OnPlayerLoginChanged(PlayerNum); if (SessionToJoin.IsValid())
{
if (bCallIdentityInterfaceEventsOnPlayerControllers) FBlueprintSessionResult BluePrintResult;
{ BluePrintResult.OnlineResult = SessionToJoin;
APlayerController* Player = UGameplayStatics::GetPlayerController(GetWorld(), PlayerNum);
FBPUniqueNetId PInvited;
if (Player != NULL) PInvited.SetUniqueNetId(&PersonInvited);
{
//Run the Event specific to the actor, if the actor has the interface, otherwise ignore FBPUniqueNetId PInviting;
if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass())) PInviting.SetUniqueNetId(&PersonInviting);
{
IAdvancedFriendsInterface::Execute_OnPlayerLoginChanged(Player, PlayerNum);
} TArray<APlayerController*> PlayerList;
} GEngine->GetAllLocalPlayerControllers(PlayerList);
else
{ APlayerController* Player = NULL;
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnPlayerLoginChanged!"));
} int32 LocalPlayer = 0;
} for (int i = 0; i < PlayerList.Num(); i++)
} {
if (*PlayerList[i]->PlayerState->GetUniqueId().GetUniqueNetId() == PersonInvited)
void UAdvancedFriendsGameInstance::OnPlayerTalkingStateChangedMaster(TSharedRef<const FUniqueNetId> PlayerId, bool bIsTalking) {
{ LocalPlayer = i;
FBPUniqueNetId PlayerTalking; Player = PlayerList[i];
PlayerTalking.SetUniqueNetId(PlayerId); break;
OnPlayerTalkingStateChanged(PlayerTalking, bIsTalking); }
}
if (bCallVoiceInterfaceEventsOnPlayerControllers)
{ OnSessionInviteReceived(LocalPlayer, PInviting, AppId, BluePrintResult);
APlayerController* Player = NULL;
//IAdvancedFriendsInterface* TheInterface = NULL;
for (const ULocalPlayer* LPlayer : LocalPlayers)
{ if (Player != NULL)
Player = UGameplayStatics::GetPlayerController(GetWorld(), LPlayer->GetControllerId()); {
//Run the Event specific to the actor, if the actor has the interface, otherwise ignore
if (Player != NULL) if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
{ {
//Run the Event specific to the actor, if the actor has the interface, otherwise ignore IAdvancedFriendsInterface::Execute_OnSessionInviteReceived(Player, PInviting, BluePrintResult);
if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass())) }
{ }
IAdvancedFriendsInterface::Execute_OnPlayerVoiceStateChanged(Player, PlayerTalking, bIsTalking); else
} {
} UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnSessionInviteReceived!"));
else }
{ }
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnVoiceStateChanged!")); else
} {
} UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Return a bad search result in OnSessionInviteReceived!"));
} }
} }
void UAdvancedFriendsGameInstance::OnSessionInviteReceivedMaster(const FUniqueNetId & PersonInvited, const FUniqueNetId & PersonInviting, const FString& AppId, const FOnlineSessionSearchResult& SessionToJoin) void UAdvancedFriendsGameInstance::OnSessionInviteAcceptedMaster(const bool bWasSuccessful, int32 LocalPlayer, TSharedPtr<const FUniqueNetId> PersonInvited, const FOnlineSessionSearchResult& SessionToJoin)
{ {
if (SessionToJoin.IsValid()) if (bWasSuccessful)
{ {
FBlueprintSessionResult BluePrintResult; if (SessionToJoin.IsValid())
BluePrintResult.OnlineResult = SessionToJoin; {
FBPUniqueNetId PInvited; FBlueprintSessionResult BluePrintResult;
PInvited.SetUniqueNetId(&PersonInvited); BluePrintResult.OnlineResult = SessionToJoin;
FBPUniqueNetId PInviting; FBPUniqueNetId PInvited;
PInviting.SetUniqueNetId(&PersonInviting); PInvited.SetUniqueNetId(PersonInvited);
OnSessionInviteAccepted(LocalPlayer,PInvited, BluePrintResult);
TArray<APlayerController*> PlayerList;
GEngine->GetAllLocalPlayerControllers(PlayerList); APlayerController* Player = UGameplayStatics::GetPlayerController(GetWorld(), LocalPlayer);
APlayerController* Player = NULL; //IAdvancedFriendsInterface* TheInterface = NULL;
int32 LocalPlayer = 0; if (Player != NULL)
for (int i = 0; i < PlayerList.Num(); i++) {
{ //Run the Event specific to the actor, if the actor has the interface, otherwise ignore
if (*PlayerList[i]->PlayerState->GetUniqueId().GetUniqueNetId() == PersonInvited) if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
{ {
LocalPlayer = i; IAdvancedFriendsInterface::Execute_OnSessionInviteAccepted(Player,PInvited, BluePrintResult);
Player = PlayerList[i]; }
break; }
} else
} {
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnSessionInviteAccepted!"));
// Temp for 5.5, they aren't filling in the struct correctly }
if (!BluePrintResult.OnlineResult.Session.SessionSettings.bIsDedicated) }
{ else
BluePrintResult.OnlineResult.Session.SessionSettings.bUsesPresence = true; {
BluePrintResult.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Return a bad search result in OnSessionInviteAccepted!"));
} }
}
OnSessionInviteReceived(LocalPlayer, PInviting, AppId, BluePrintResult);
//IAdvancedFriendsInterface* TheInterface = NULL;
if (Player != NULL)
{
//Run the Event specific to the actor, if the actor has the interface, otherwise ignore
if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
{
IAdvancedFriendsInterface::Execute_OnSessionInviteReceived(Player, PInviting, BluePrintResult);
}
}
else
{
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnSessionInviteReceived!"));
}
}
else
{
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Return a bad search result in OnSessionInviteReceived!"));
}
}
void UAdvancedFriendsGameInstance::OnSessionInviteAcceptedMaster(const bool bWasSuccessful, int32 LocalPlayer, TSharedPtr<const FUniqueNetId> PersonInvited, const FOnlineSessionSearchResult& SessionToJoin)
{
if (bWasSuccessful)
{
if (SessionToJoin.IsValid())
{
FBlueprintSessionResult BluePrintResult;
BluePrintResult.OnlineResult = SessionToJoin;
FBPUniqueNetId PInvited;
PInvited.SetUniqueNetId(PersonInvited);
// Temp for 5.5, they aren't filling in the struct correctly
if (!BluePrintResult.OnlineResult.Session.SessionSettings.bIsDedicated)
{
BluePrintResult.OnlineResult.Session.SessionSettings.bUsesPresence = true;
BluePrintResult.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true;
}
OnSessionInviteAccepted(LocalPlayer,PInvited, BluePrintResult);
APlayerController* Player = UGameplayStatics::GetPlayerController(GetWorld(), LocalPlayer);
//IAdvancedFriendsInterface* TheInterface = NULL;
if (Player != NULL)
{
//Run the Event specific to the actor, if the actor has the interface, otherwise ignore
if (Player->GetClass()->ImplementsInterface(UAdvancedFriendsInterface::StaticClass()))
{
IAdvancedFriendsInterface::Execute_OnSessionInviteAccepted(Player,PInvited, BluePrintResult);
}
}
else
{
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Failed to get a controller with the specified index in OnSessionInviteAccepted!"));
}
}
else
{
UE_LOG(AdvancedFriendsInterfaceLog, Warning, TEXT("UAdvancedFriendsInstance Return a bad search result in OnSessionInviteAccepted!"));
}
}
} }

View File

@@ -1,9 +1,9 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedFriendsInterface.h" #include "AdvancedFriendsInterface.h"
UAdvancedFriendsInterface::UAdvancedFriendsInterface(const class FObjectInitializer& ObjectInitializer) UAdvancedFriendsInterface::UAdvancedFriendsInterface(const class FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer) : Super(ObjectInitializer)
{ {
} }

View File

@@ -1,281 +1,274 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedFriendsLibrary.h" #include "AdvancedFriendsLibrary.h"
// This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro // This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro
//General Log //General Log
DEFINE_LOG_CATEGORY(AdvancedFriendsLog); DEFINE_LOG_CATEGORY(AdvancedFriendsLog);
void UAdvancedFriendsLibrary::SendSessionInviteToFriends(APlayerController *PlayerController, const TArray<FBPUniqueNetId> &Friends, EBlueprintResultSwitch &Result) void UAdvancedFriendsLibrary::SendSessionInviteToFriends(APlayerController *PlayerController, const TArray<FBPUniqueNetId> &Friends, EBlueprintResultSwitch &Result)
{ {
if (!PlayerController) if (!PlayerController)
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had a bad Player Controller!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had a bad Player Controller!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
if (Friends.Num() < 1) if (Friends.Num() < 1)
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had no friends in invitation array!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had no friends in invitation array!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(); IOnlineSessionPtr SessionInterface = Online::GetSessionInterface();
if (!SessionInterface.IsValid()) if (!SessionInterface.IsValid())
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Failed to get session interface!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Failed to get session interface!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player); ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player) if (!Player)
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend failed to get LocalPlayer!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend failed to get LocalPlayer!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
TArray<TSharedRef<const FUniqueNetId>> List; TArray<TSharedRef<const FUniqueNetId>> List;
for (int i = 0; i < Friends.Num(); i++) for (int i = 0; i < Friends.Num(); i++)
{ {
TSharedRef<const FUniqueNetId> val(Friends[i].UniqueNetId.ToSharedRef()); TSharedRef<const FUniqueNetId> val(Friends[i].UniqueNetId.ToSharedRef());
//TSharedRef<const FUniqueNetId> val(Friends[i].GetUniqueNetId()); //TSharedRef<const FUniqueNetId> val(Friends[i].GetUniqueNetId());
List.Add(val); List.Add(val);
} }
if (SessionInterface->SendSessionInviteToFriends(Player->GetControllerId(), NAME_GameSession, List)) if (SessionInterface->SendSessionInviteToFriends(Player->GetControllerId(), NAME_GameSession, List))
{ {
Result = EBlueprintResultSwitch::OnSuccess; Result = EBlueprintResultSwitch::OnSuccess;
return; return;
} }
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
void UAdvancedFriendsLibrary::SendSessionInviteToFriend(APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId, EBlueprintResultSwitch &Result) void UAdvancedFriendsLibrary::SendSessionInviteToFriend(APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId, EBlueprintResultSwitch &Result)
{ {
if (!PlayerController) if (!PlayerController)
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had a bad Player Controller!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had a bad Player Controller!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
if (!FriendUniqueNetId.IsValid()) if (!FriendUniqueNetId.IsValid())
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had a bad UniqueNetId!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Had a bad UniqueNetId!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(); IOnlineSessionPtr SessionInterface = Online::GetSessionInterface();
if (!SessionInterface.IsValid()) if (!SessionInterface.IsValid())
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Failed to get session interface!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend Failed to get session interface!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player); ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player) if (!Player)
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend failed to get LocalPlayer!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("SendSessionInviteToFriend failed to get LocalPlayer!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
if (SessionInterface->SendSessionInviteToFriend(Player->GetControllerId(), NAME_GameSession, *FriendUniqueNetId.GetUniqueNetId())) if (SessionInterface->SendSessionInviteToFriend(Player->GetControllerId(), NAME_GameSession, *FriendUniqueNetId.GetUniqueNetId()))
{ {
Result = EBlueprintResultSwitch::OnSuccess; Result = EBlueprintResultSwitch::OnSuccess;
return; return;
} }
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
void UAdvancedFriendsLibrary::GetFriend(APlayerController *PlayerController, const FBPUniqueNetId FriendUniqueNetId, FBPFriendInfo &Friend) void UAdvancedFriendsLibrary::GetFriend(APlayerController *PlayerController, const FBPUniqueNetId FriendUniqueNetId, FBPFriendInfo &Friend)
{ {
if (!PlayerController) if (!PlayerController)
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend Had a bad Player Controller!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend Had a bad Player Controller!"));
return; return;
} }
if (!FriendUniqueNetId.IsValid()) if (!FriendUniqueNetId.IsValid())
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend Had a bad UniqueNetId!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend Had a bad UniqueNetId!"));
return; return;
} }
IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface(); IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface();
if (!FriendsInterface.IsValid()) if (!FriendsInterface.IsValid())
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend Failed to get friends interface!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend Failed to get friends interface!"));
return; return;
} }
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player); ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player) if (!Player)
{ {
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend failed to get LocalPlayer!")); UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriend failed to get LocalPlayer!"));
return; return;
} }
TSharedPtr<FOnlineFriend> fr = FriendsInterface->GetFriend(Player->GetControllerId(), *FriendUniqueNetId.GetUniqueNetId(), EFriendsLists::ToString(EFriendsLists::Default)); TSharedPtr<FOnlineFriend> fr = FriendsInterface->GetFriend(Player->GetControllerId(), *FriendUniqueNetId.GetUniqueNetId(), EFriendsLists::ToString(EFriendsLists::Default));
if (fr.IsValid()) if (fr.IsValid())
{ {
const FOnlineUserPresence& pres = fr->GetPresence(); FOnlineUserPresence pres = fr->GetPresence();
Friend.DisplayName = fr->GetDisplayName(); Friend.DisplayName = fr->GetDisplayName();
Friend.OnlineState = ((EBPOnlinePresenceState)((int32)pres.Status.State)); Friend.OnlineState = ((EBPOnlinePresenceState)((int32)pres.Status.State));
Friend.RealName = fr->GetRealName(); Friend.RealName = fr->GetRealName();
Friend.UniqueNetId.SetUniqueNetId(fr->GetUserId()); Friend.UniqueNetId.SetUniqueNetId(fr->GetUserId());
Friend.bIsPlayingSameGame = pres.bIsPlayingThisGame; Friend.bIsPlayingSameGame = pres.bIsPlayingThisGame;
Friend.PresenceInfo.bHasVoiceSupport = pres.bHasVoiceSupport; Friend.PresenceInfo.bHasVoiceSupport = pres.bHasVoiceSupport;
Friend.PresenceInfo.bIsJoinable = pres.bIsJoinable; Friend.PresenceInfo.bIsJoinable = pres.bIsJoinable;
Friend.PresenceInfo.bIsOnline = pres.bIsOnline; Friend.PresenceInfo.bIsOnline = pres.bIsOnline;
Friend.PresenceInfo.bIsPlaying = pres.bIsPlaying; Friend.PresenceInfo.bIsPlaying = pres.bIsPlaying;
Friend.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame; Friend.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame;
Friend.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State)); Friend.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State));
// #TODO: Check back in on this in shipping, epic is missing the UTF8_TO_TCHAR call on converting this and its making an invalid string Friend.PresenceInfo.StatusString = pres.Status.StatusStr;
//Friend.PresenceInfo.StatusString = pres.Status.StatusStr; }
} }
}
void UAdvancedFriendsLibrary::IsAFriend(APlayerController *PlayerController, const FBPUniqueNetId UniqueNetId, bool &IsFriend)
void UAdvancedFriendsLibrary::IsAFriend(APlayerController *PlayerController, const FBPUniqueNetId UniqueNetId, bool &IsFriend) {
{ if (!PlayerController)
if (!PlayerController) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Had a bad Player Controller!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Had a bad Player Controller!")); return;
return; }
}
if (!UniqueNetId.IsValid())
if (!UniqueNetId.IsValid()) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Had a bad UniqueNetId!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Had a bad UniqueNetId!")); return;
return; }
}
IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface();
IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface();
if (!FriendsInterface.IsValid())
if (!FriendsInterface.IsValid()) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Failed to get friends interface!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Failed to get friends interface!")); return;
return; }
}
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player)
if (!Player) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Failed to get LocalPlayer!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("IsAFriend Failed to get LocalPlayer!")); return;
return; }
}
IsFriend = FriendsInterface->IsFriend(Player->GetControllerId(), *UniqueNetId.GetUniqueNetId(), EFriendsLists::ToString(EFriendsLists::Default));
IsFriend = FriendsInterface->IsFriend(Player->GetControllerId(), *UniqueNetId.GetUniqueNetId(), EFriendsLists::ToString(EFriendsLists::Default)); }
}
void UAdvancedFriendsLibrary::GetStoredRecentPlayersList(FBPUniqueNetId UniqueNetId, TArray<FBPOnlineRecentPlayer> &PlayersList)
void UAdvancedFriendsLibrary::GetStoredRecentPlayersList(FBPUniqueNetId UniqueNetId, TArray<FBPOnlineRecentPlayer> &PlayersList) {
{ IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface();
IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface();
if (!FriendsInterface.IsValid())
if (!FriendsInterface.IsValid()) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetRecentPlayersList Failed to get friends interface!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetRecentPlayersList Failed to get friends interface!")); return;
return; }
}
if (!UniqueNetId.IsValid())
if (!UniqueNetId.IsValid()) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetRecentPlayersList Failed was given an invalid UniqueNetId!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetRecentPlayersList Failed was given an invalid UniqueNetId!")); return;
return; }
}
TArray< TSharedRef<FOnlineRecentPlayer> > PlayerList;
TArray< TSharedRef<FOnlineRecentPlayer> > PlayerList;
// For now getting all namespaces
// For now getting all namespaces FriendsInterface->GetRecentPlayers(*(UniqueNetId.GetUniqueNetId()),"", PlayerList);
FriendsInterface->GetRecentPlayers(*(UniqueNetId.GetUniqueNetId()),"", PlayerList);
for (int32 i = 0; i < PlayerList.Num(); i++)
for (int32 i = 0; i < PlayerList.Num(); i++) {
{ TSharedRef<FOnlineRecentPlayer> Player = PlayerList[i];
TSharedRef<FOnlineRecentPlayer> Player = PlayerList[i]; FBPOnlineRecentPlayer BPF;
FBPOnlineRecentPlayer BPF; BPF.DisplayName = Player->GetDisplayName();
BPF.DisplayName = Player->GetDisplayName(); BPF.RealName = Player->GetRealName();
BPF.RealName = Player->GetRealName(); BPF.UniqueNetId.SetUniqueNetId(Player->GetUserId());
BPF.UniqueNetId.SetUniqueNetId(Player->GetUserId()); PlayersList.Add(BPF);
PlayersList.Add(BPF); }
} }
}
void UAdvancedFriendsLibrary::GetStoredFriendsList(APlayerController *PlayerController, TArray<FBPFriendInfo> &FriendsList)
void UAdvancedFriendsLibrary::GetStoredFriendsList(APlayerController *PlayerController, TArray<FBPFriendInfo> &FriendsList) {
{
if (!PlayerController)
if (!PlayerController) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriendsList Had a bad Player Controller!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriendsList Had a bad Player Controller!")); return;
return; }
}
IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface();
IOnlineFriendsPtr FriendsInterface = Online::GetFriendsInterface();
if (!FriendsInterface.IsValid())
if (!FriendsInterface.IsValid()) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriendsList Failed to get friends interface!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriendsList Failed to get friends interface!")); return;
return; }
}
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player)
if (!Player) {
{ UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriendsList Failed to get LocalPlayer!"));
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriendsList Failed to get LocalPlayer!")); return;
return; }
}
TArray< TSharedRef<FOnlineFriend> > FriendList;
TArray< TSharedRef<FOnlineFriend> > FriendList; FriendsInterface->GetFriendsList(Player->GetControllerId(), EFriendsLists::ToString((EFriendsLists::Default)), FriendList);
if (FriendsInterface->GetFriendsList(Player->GetControllerId(), EFriendsLists::ToString((EFriendsLists::Default)), FriendList))
{ for (int32 i = 0; i < FriendList.Num(); i++)
for (int32 i = 0; i < FriendList.Num(); i++) {
{ TSharedRef<FOnlineFriend> Friend = FriendList[i];
FBPFriendInfo BPF; FBPFriendInfo BPF;
const FOnlineUserPresence& pres = FriendList[i]->GetPresence(); FOnlineUserPresence pres = Friend->GetPresence();
BPF.OnlineState = ((EBPOnlinePresenceState)((int32)pres.Status.State)); BPF.OnlineState = ((EBPOnlinePresenceState)((int32)pres.Status.State));
BPF.DisplayName = FriendList[i]->GetDisplayName(); BPF.DisplayName = Friend->GetDisplayName();
BPF.RealName = FriendList[i]->GetRealName(); BPF.RealName = Friend->GetRealName();
BPF.UniqueNetId.SetUniqueNetId(FriendList[i]->GetUserId()); BPF.UniqueNetId.SetUniqueNetId(Friend->GetUserId());
BPF.bIsPlayingSameGame = pres.bIsPlayingThisGame; BPF.bIsPlayingSameGame = pres.bIsPlayingThisGame;
BPF.PresenceInfo.bIsOnline = pres.bIsOnline; BPF.PresenceInfo.bIsOnline = pres.bIsOnline;
BPF.PresenceInfo.bHasVoiceSupport = pres.bHasVoiceSupport; BPF.PresenceInfo.bHasVoiceSupport = pres.bHasVoiceSupport;
BPF.PresenceInfo.bIsPlaying = pres.bIsPlaying; BPF.PresenceInfo.bIsPlaying = pres.bIsPlaying;
BPF.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State)); BPF.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State));
// #TODO: Check back in on this in shipping, epic is missing the UTF8_TO_TCHAR call on converting this and its making an invalid string BPF.PresenceInfo.StatusString = pres.Status.StatusStr;
//BPF.PresenceInfo.StatusString = pres.Status.StatusStr; BPF.PresenceInfo.bIsJoinable = pres.bIsJoinable;
BPF.PresenceInfo.bIsJoinable = pres.bIsJoinable; BPF.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame;
BPF.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame;
FriendsList.Add(BPF);
FriendsList.Add(BPF); }
}
return;
}
UE_LOG(AdvancedFriendsLog, Warning, TEXT("GetFriendsList Failed to get any friends!"));
return;
} }

View File

@@ -1,271 +1,235 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedIdentityLibrary.h" #include "AdvancedIdentityLibrary.h"
//General Log //General Log
DEFINE_LOG_CATEGORY(AdvancedIdentityLog); DEFINE_LOG_CATEGORY(AdvancedIdentityLog);
void UAdvancedIdentityLibrary::GetPlayerAuthToken(UObject* WorldContextObject, APlayerController * PlayerController, FString & AuthToken, EBlueprintResultSwitch &Result) void UAdvancedIdentityLibrary::GetPlayerAuthToken(APlayerController * PlayerController, FString & AuthToken, EBlueprintResultSwitch &Result)
{ {
if (!PlayerController) if (!PlayerController)
{ {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerAuthToken was passed a bad player controller!")); UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerAuthToken was passed a bad player controller!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player); ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerController->Player);
if (!Player) if (!Player)
{ {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerAuthToken failed to get LocalPlayer!")); UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerAuthToken failed to get LocalPlayer!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface();
if (!IsValid(World))
{ if (!IdentityInterface.IsValid())
Result = EBlueprintResultSwitch::OnFailure; {
return; UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerAuthToken Failed to get identity interface!"));
} Result = EBlueprintResultSwitch::OnFailure;
return;
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(World); }
if (!IdentityInterface.IsValid()) AuthToken = IdentityInterface->GetAuthToken(Player->GetControllerId());
{ Result = EBlueprintResultSwitch::OnSuccess;
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerAuthToken Failed to get identity interface!")); }
Result = EBlueprintResultSwitch::OnFailure;
return; void UAdvancedIdentityLibrary::GetPlayerNickname(const FBPUniqueNetId & UniqueNetID, FString & PlayerNickname)
} {
if (!UniqueNetID.IsValid())
AuthToken = IdentityInterface->GetAuthToken(Player->GetControllerId()); {
Result = EBlueprintResultSwitch::OnSuccess; UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerNickname was passed a bad player uniquenetid!"));
} return;
}
void UAdvancedIdentityLibrary::GetPlayerNickname(UObject* WorldContextObject, const FBPUniqueNetId & UniqueNetID, FString & PlayerNickname)
{ IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface();
if (!UniqueNetID.IsValid())
{ if (!IdentityInterface.IsValid())
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerNickname was passed a bad player uniquenetid!")); {
return; UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerNickname Failed to get identity interface!"));
} return;
}
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); PlayerNickname = IdentityInterface->GetPlayerNickname(*UniqueNetID.GetUniqueNetId());
if (!IsValid(World)) }
{
return;
} void UAdvancedIdentityLibrary::GetLoginStatus(const FBPUniqueNetId & UniqueNetID, EBPLoginStatus & LoginStatus, EBlueprintResultSwitch &Result)
{
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(World); if (!UniqueNetID.IsValid())
{
if (!IdentityInterface.IsValid()) UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetLoginStatus was passed a bad player uniquenetid!"));
{ Result = EBlueprintResultSwitch::OnFailure;
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetPlayerNickname Failed to get identity interface!")); return;
return; }
}
PlayerNickname = IdentityInterface->GetPlayerNickname(*UniqueNetID.GetUniqueNetId()); IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface();
}
if (!IdentityInterface.IsValid())
{
void UAdvancedIdentityLibrary::GetLoginStatus(UObject* WorldContextObject, const FBPUniqueNetId & UniqueNetID, EBPLoginStatus & LoginStatus, EBlueprintResultSwitch &Result) UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetLoginStatus Failed to get identity interface!"));
{ Result = EBlueprintResultSwitch::OnFailure;
if (!UniqueNetID.IsValid()) return;
{ }
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetLoginStatus was passed a bad player uniquenetid!"));
Result = EBlueprintResultSwitch::OnFailure; LoginStatus = (EBPLoginStatus)IdentityInterface->GetLoginStatus(*UniqueNetID.GetUniqueNetId());
return; Result = EBlueprintResultSwitch::OnSuccess;
} }
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World)) void UAdvancedIdentityLibrary::GetAllUserAccounts(TArray<FBPUserOnlineAccount> & AccountInfos, EBlueprintResultSwitch &Result)
{ {
Result = EBlueprintResultSwitch::OnFailure; IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface();
return;
} if (!IdentityInterface.IsValid())
{
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(World); UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetAllUserAccounts Failed to get identity interface!"));
Result = EBlueprintResultSwitch::OnFailure;
if (!IdentityInterface.IsValid()) return;
{ }
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetLoginStatus Failed to get identity interface!"));
Result = EBlueprintResultSwitch::OnFailure; TArray<TSharedPtr<FUserOnlineAccount>> accountInfos = IdentityInterface->GetAllUserAccounts();
return;
} for (int i = 0; i < accountInfos.Num(); ++i)
{
LoginStatus = (EBPLoginStatus)IdentityInterface->GetLoginStatus(*UniqueNetID.GetUniqueNetId()); AccountInfos.Add(FBPUserOnlineAccount(accountInfos[i]));
Result = EBlueprintResultSwitch::OnSuccess; }
}
Result = EBlueprintResultSwitch::OnSuccess;
}
void UAdvancedIdentityLibrary::GetAllUserAccounts(UObject* WorldContextObject, TArray<FBPUserOnlineAccount> & AccountInfos, EBlueprintResultSwitch &Result)
{ void UAdvancedIdentityLibrary::GetUserAccount(const FBPUniqueNetId & UniqueNetId, FBPUserOnlineAccount & AccountInfo, EBlueprintResultSwitch &Result)
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface();
if (!IsValid(World))
{ if(!UniqueNetId.IsValid())
Result = EBlueprintResultSwitch::OnFailure; {
return; UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccount was passed a bad unique net id!"));
} Result = EBlueprintResultSwitch::OnFailure;
return;
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(World); }
if (!IdentityInterface.IsValid()) if (!IdentityInterface.IsValid())
{ {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetAllUserAccounts Failed to get identity interface!")); UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccount Failed to get identity interface!"));
Result = EBlueprintResultSwitch::OnFailure; Result = EBlueprintResultSwitch::OnFailure;
return; return;
} }
TArray<TSharedPtr<FUserOnlineAccount>> accountInfos = IdentityInterface->GetAllUserAccounts(); TSharedPtr<FUserOnlineAccount> accountInfo = IdentityInterface->GetUserAccount(*UniqueNetId.GetUniqueNetId());
for (int i = 0; i < accountInfos.Num(); ++i) if (!accountInfo.IsValid())
{ {
AccountInfos.Add(FBPUserOnlineAccount(accountInfos[i])); UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccount Failed to get the account!"));
} Result = EBlueprintResultSwitch::OnFailure;
return;
Result = EBlueprintResultSwitch::OnSuccess; }
}
AccountInfo.UserAccountInfo = accountInfo;
void UAdvancedIdentityLibrary::GetUserAccount(UObject* WorldContextObject, const FBPUniqueNetId & UniqueNetId, FBPUserOnlineAccount & AccountInfo, EBlueprintResultSwitch &Result) Result = EBlueprintResultSwitch::OnSuccess;
{ }
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); void UAdvancedIdentityLibrary::GetUserAccountAccessToken(const FBPUserOnlineAccount & AccountInfo, FString & AccessToken)
if (!IsValid(World)) {
{ if (!AccountInfo.UserAccountInfo.IsValid())
Result = EBlueprintResultSwitch::OnFailure; {
return; UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAccessToken was passed an invalid account!"));
} return;
}
IOnlineIdentityPtr IdentityInterface = Online::GetIdentityInterface(World);
AccessToken = AccountInfo.UserAccountInfo->GetAccessToken();
if(!UniqueNetId.IsValid()) }
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccount was passed a bad unique net id!")); void UAdvancedIdentityLibrary::GetUserAccountAuthAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AuthAttribute, EBlueprintResultSwitch &Result)
Result = EBlueprintResultSwitch::OnFailure; {
return; if (!AccountInfo.UserAccountInfo.IsValid())
} {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAuthAttribute was passed an invalid account!"));
if (!IdentityInterface.IsValid()) Result = EBlueprintResultSwitch::OnFailure;
{ return;
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccount Failed to get identity interface!")); }
Result = EBlueprintResultSwitch::OnFailure;
return; if (!AccountInfo.UserAccountInfo->GetAuthAttribute(AttributeName, AuthAttribute))
} {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAuthAttribute couldn't find the attribute!"));
TSharedPtr<FUserOnlineAccount> accountInfo = IdentityInterface->GetUserAccount(*UniqueNetId.GetUniqueNetId()); Result = EBlueprintResultSwitch::OnFailure;
return;
if (!accountInfo.IsValid()) }
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccount Failed to get the account!")); Result = EBlueprintResultSwitch::OnSuccess;
Result = EBlueprintResultSwitch::OnFailure; }
return;
} void UAdvancedIdentityLibrary::SetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, const FString & NewAttributeValue, EBlueprintResultSwitch &Result)
{
AccountInfo.UserAccountInfo = accountInfo; if (!AccountInfo.UserAccountInfo.IsValid())
Result = EBlueprintResultSwitch::OnSuccess; {
} UE_LOG(AdvancedIdentityLog, Warning, TEXT("SetUserAccountAuthAttribute was passed an invalid account!"));
Result = EBlueprintResultSwitch::OnFailure;
void UAdvancedIdentityLibrary::GetUserAccountAccessToken(const FBPUserOnlineAccount & AccountInfo, FString & AccessToken) return;
{ }
if (!AccountInfo.UserAccountInfo.IsValid())
{ if (!AccountInfo.UserAccountInfo->SetUserAttribute(AttributeName, NewAttributeValue))
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAccessToken was passed an invalid account!")); {
return; UE_LOG(AdvancedIdentityLog, Warning, TEXT("SetUserAccountAuthAttribute was unable to set the attribute!"));
} Result = EBlueprintResultSwitch::OnFailure;
return;
AccessToken = AccountInfo.UserAccountInfo->GetAccessToken(); }
}
Result = EBlueprintResultSwitch::OnSuccess;
void UAdvancedIdentityLibrary::GetUserAccountAuthAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AuthAttribute, EBlueprintResultSwitch &Result) }
{
if (!AccountInfo.UserAccountInfo.IsValid()) void UAdvancedIdentityLibrary::GetUserID(const FBPUserOnlineAccount & AccountInfo, FBPUniqueNetId & UniqueNetID)
{ {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAuthAttribute was passed an invalid account!")); if (!AccountInfo.UserAccountInfo.IsValid())
Result = EBlueprintResultSwitch::OnFailure; {
return; UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserID was passed an invalid account!"));
} return;
}
if (!AccountInfo.UserAccountInfo->GetAuthAttribute(AttributeName, AuthAttribute))
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAuthAttribute couldn't find the attribute!")); UniqueNetID.SetUniqueNetId(AccountInfo.UserAccountInfo->GetUserId());
Result = EBlueprintResultSwitch::OnFailure; }
return;
} void UAdvancedIdentityLibrary::GetUserAccountRealName(const FBPUserOnlineAccount & AccountInfo, FString & UserName)
{
Result = EBlueprintResultSwitch::OnSuccess; if (!AccountInfo.UserAccountInfo.IsValid())
} {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountRealName was passed an invalid account!"));
void UAdvancedIdentityLibrary::SetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, const FString & NewAttributeValue, EBlueprintResultSwitch &Result) return;
{ }
if (!AccountInfo.UserAccountInfo.IsValid())
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("SetUserAccountAuthAttribute was passed an invalid account!")); UserName = AccountInfo.UserAccountInfo->GetRealName();
Result = EBlueprintResultSwitch::OnFailure; }
return;
} void UAdvancedIdentityLibrary::GetUserAccountDisplayName(const FBPUserOnlineAccount & AccountInfo, FString & DisplayName)
{
if (!AccountInfo.UserAccountInfo->SetUserAttribute(AttributeName, NewAttributeValue)) if (!AccountInfo.UserAccountInfo.IsValid())
{ {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("SetUserAccountAuthAttribute was unable to set the attribute!")); UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountDisplayName was passed an invalid account!"));
Result = EBlueprintResultSwitch::OnFailure; return;
return; }
}
Result = EBlueprintResultSwitch::OnSuccess; DisplayName = AccountInfo.UserAccountInfo->GetDisplayName();
} }
void UAdvancedIdentityLibrary::GetUserID(const FBPUserOnlineAccount & AccountInfo, FBPUniqueNetId & UniqueNetID) void UAdvancedIdentityLibrary::GetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AttributeValue, EBlueprintResultSwitch &Result)
{ {
if (!AccountInfo.UserAccountInfo.IsValid()) if (!AccountInfo.UserAccountInfo.IsValid())
{ {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserID was passed an invalid account!")); UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAttribute was passed an invalid account!"));
return; Result = EBlueprintResultSwitch::OnFailure;
} return;
}
UniqueNetID.SetUniqueNetId(AccountInfo.UserAccountInfo->GetUserId()); if (!AccountInfo.UserAccountInfo->GetUserAttribute(AttributeName, AttributeValue))
} {
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAttribute failed to get user attribute!"));
void UAdvancedIdentityLibrary::GetUserAccountRealName(const FBPUserOnlineAccount & AccountInfo, FString & UserName) Result = EBlueprintResultSwitch::OnFailure;
{ return;
if (!AccountInfo.UserAccountInfo.IsValid()) }
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountRealName was passed an invalid account!")); Result = EBlueprintResultSwitch::OnSuccess;
return;
}
UserName = AccountInfo.UserAccountInfo->GetRealName();
}
void UAdvancedIdentityLibrary::GetUserAccountDisplayName(const FBPUserOnlineAccount & AccountInfo, FString & DisplayName)
{
if (!AccountInfo.UserAccountInfo.IsValid())
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountDisplayName was passed an invalid account!"));
return;
}
DisplayName = AccountInfo.UserAccountInfo->GetDisplayName();
}
void UAdvancedIdentityLibrary::GetUserAccountAttribute(const FBPUserOnlineAccount & AccountInfo, const FString & AttributeName, FString & AttributeValue, EBlueprintResultSwitch &Result)
{
if (!AccountInfo.UserAccountInfo.IsValid())
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAttribute was passed an invalid account!"));
Result = EBlueprintResultSwitch::OnFailure;
return;
}
if (!AccountInfo.UserAccountInfo->GetUserAttribute(AttributeName, AttributeValue))
{
UE_LOG(AdvancedIdentityLog, Warning, TEXT("GetUserAccountAttribute failed to get user attribute!"));
Result = EBlueprintResultSwitch::OnFailure;
return;
}
Result = EBlueprintResultSwitch::OnSuccess;
} }

View File

@@ -1,12 +1,12 @@
//#include "StandAlonePrivatePCH.h" //#include "StandAlonePrivatePCH.h"
#include "AdvancedSessions.h" #include "AdvancedSessions.h"
void AdvancedSessions::StartupModule() void AdvancedSessions::StartupModule()
{ {
} }
void AdvancedSessions::ShutdownModule() void AdvancedSessions::ShutdownModule()
{ {
} }
IMPLEMENT_MODULE(AdvancedSessions, AdvancedSessions) IMPLEMENT_MODULE(AdvancedSessions, AdvancedSessions)

View File

@@ -451,17 +451,6 @@ void UAdvancedSessionsLibrary::GetUniqueNetID(APlayerController *PlayerControlle
} }
} }
void UAdvancedSessionsLibrary::GetUniqueNetIdOfSessionOwner(FBlueprintSessionResult SessionResult, FBPUniqueNetId& UniqueNetId)
{
FBPUniqueNetId ReturnID;
if (SessionResult.OnlineResult.IsValid())
{
ReturnID.SetUniqueNetId(SessionResult.OnlineResult.Session.OwningUserId);
}
UniqueNetId = ReturnID;
}
void UAdvancedSessionsLibrary::GetUniqueNetIDFromPlayerState(APlayerState *PlayerState, FBPUniqueNetId &UniqueNetId) void UAdvancedSessionsLibrary::GetUniqueNetIDFromPlayerState(APlayerState *PlayerState, FBPUniqueNetId &UniqueNetId)
{ {
if (!PlayerState) if (!PlayerState)
@@ -488,11 +477,6 @@ bool UAdvancedSessionsLibrary::EqualEqual_UNetIDUnetID(const FBPUniqueNetId &A,
return ((A.IsValid() && B.IsValid()) && (*A.GetUniqueNetId() == *B.GetUniqueNetId())); return ((A.IsValid() && B.IsValid()) && (*A.GetUniqueNetId() == *B.GetUniqueNetId()));
} }
FUniqueNetIdRepl UAdvancedSessionsLibrary::Conv_BPUniqueIDToUniqueNetIDRepl(const FBPUniqueNetId& InUniqueID)
{
return FUniqueNetIdRepl(InUniqueID.GetUniqueNetId()->AsShared());
}
void UAdvancedSessionsLibrary::SetPlayerName(APlayerController *PlayerController, FString PlayerName) void UAdvancedSessionsLibrary::SetPlayerName(APlayerController *PlayerController, FString PlayerName)
{ {
if (!PlayerController) if (!PlayerController)
@@ -547,17 +531,11 @@ void UAdvancedSessionsLibrary::GetNumberOfNetworkPlayers(UObject* WorldContextOb
bool UAdvancedSessionsLibrary::ServerTravel(UObject* WorldContextObject, const FString& FURL, bool bAbsolute, bool bShouldSkipGameNotify) bool UAdvancedSessionsLibrary::ServerTravel(UObject* WorldContextObject, const FString& FURL, bool bAbsolute, bool bShouldSkipGameNotify)
{ {
if (!WorldContextObject) if (!WorldContextObject) return false;
{
return false;
}
//using a context object to get the world //using a context object to get the world
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull); UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull);
if (World) if (!World) return false;
{ World->ServerTravel(FURL,bAbsolute,bShouldSkipGameNotify);
return World->ServerTravel(FURL, bAbsolute, bShouldSkipGameNotify); return true;
} }
return false;
}

View File

@@ -1,359 +1,254 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedVoiceLibrary.h" #include "AdvancedVoiceLibrary.h"
//General Log //General Log
DEFINE_LOG_CATEGORY(AdvancedVoiceLog); DEFINE_LOG_CATEGORY(AdvancedVoiceLog);
void UAdvancedVoiceLibrary::IsHeadsetPresent(UObject* WorldContextObject, bool & bHasHeadset, uint8 LocalPlayerNum) void UAdvancedVoiceLibrary::IsHeadsetPresent(bool & bHasHeadset, uint8 LocalPlayerNum)
{ {
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World)) if (!VoiceInterface.IsValid())
{ {
return; bHasHeadset = false;
} UE_LOG(AdvancedVoiceLog, Warning, TEXT("Check For Headset couldn't get the voice interface!"));
return;
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); }
if (!VoiceInterface.IsValid()) bHasHeadset = VoiceInterface->IsHeadsetPresent(LocalPlayerNum);
{ }
bHasHeadset = false;
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Check For Headset couldn't get the voice interface!")); void UAdvancedVoiceLibrary::StartNetworkedVoice(uint8 LocalPlayerNum)
return; {
} IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
bHasHeadset = VoiceInterface->IsHeadsetPresent(LocalPlayerNum); if (!VoiceInterface.IsValid())
} {
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Start Networked Voice couldn't get the voice interface!"));
void UAdvancedVoiceLibrary::StartNetworkedVoice(UObject* WorldContextObject, uint8 LocalPlayerNum) return;
{ }
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); VoiceInterface->StartNetworkedVoice(LocalPlayerNum);
if (!IsValid(World)) }
{
return; void UAdvancedVoiceLibrary::StopNetworkedVoice(uint8 LocalPlayerNum)
} {
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World);
if (!VoiceInterface.IsValid())
if (!VoiceInterface.IsValid()) {
{ UE_LOG(AdvancedVoiceLog, Warning, TEXT("Start Networked Voice couldn't get the voice interface!"));
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Start Networked Voice couldn't get the voice interface!")); return;
return; }
}
VoiceInterface->StopNetworkedVoice(LocalPlayerNum);
VoiceInterface->StartNetworkedVoice(LocalPlayerNum); }
}
bool UAdvancedVoiceLibrary::RegisterLocalTalker(uint8 LocalPlayerNum)
void UAdvancedVoiceLibrary::StopNetworkedVoice(UObject* WorldContextObject, uint8 LocalPlayerNum) {
{ IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); if (!VoiceInterface.IsValid())
if (!IsValid(World)) {
{ UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Local Talker couldn't get the voice interface!"));
return; return false;
} }
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); return VoiceInterface->RegisterLocalTalker(LocalPlayerNum);
}
if (!VoiceInterface.IsValid())
{ void UAdvancedVoiceLibrary::RegisterAllLocalTalkers()
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Start Networked Voice couldn't get the voice interface!")); {
return; IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
}
if (!VoiceInterface.IsValid())
VoiceInterface->StopNetworkedVoice(LocalPlayerNum); {
} UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Local Talkers couldn't get the voice interface!"));
return;
bool UAdvancedVoiceLibrary::RegisterLocalTalker(UObject* WorldContextObject, uint8 LocalPlayerNum) }
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); VoiceInterface->RegisterLocalTalkers();
if (!IsValid(World)) }
{
return false;
} void UAdvancedVoiceLibrary::UnRegisterLocalTalker(uint8 LocalPlayerNum)
{
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
if (!VoiceInterface.IsValid()) if (!VoiceInterface.IsValid())
{ {
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Local Talker couldn't get the voice interface!")); UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unregister Local Talker couldn't get the voice interface!"));
return false; return;
} }
return VoiceInterface->RegisterLocalTalker(LocalPlayerNum); VoiceInterface->UnregisterLocalTalker(LocalPlayerNum);
} }
void UAdvancedVoiceLibrary::RegisterAllLocalTalkers(UObject* WorldContextObject) void UAdvancedVoiceLibrary::UnRegisterAllLocalTalkers()
{ {
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World)) if (!VoiceInterface.IsValid())
{ {
return; UE_LOG(AdvancedVoiceLog, Warning, TEXT("UnRegister All Local Talkers couldn't get the voice interface!"));
} return;
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World);
VoiceInterface->UnregisterLocalTalkers();
if (!VoiceInterface.IsValid()) }
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Local Talkers couldn't get the voice interface!")); bool UAdvancedVoiceLibrary::RegisterRemoteTalker(const FBPUniqueNetId& UniqueNetId)
return; {
} if (!UniqueNetId.IsValid())
{
VoiceInterface->RegisterLocalTalkers(); UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Remote Talker was passed an invalid unique net id!"));
} return false;
}
void UAdvancedVoiceLibrary::UnRegisterLocalTalker(UObject* WorldContextObject, uint8 LocalPlayerNum) IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
{
if (!VoiceInterface.IsValid())
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); {
if (!IsValid(World)) UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Remote Talker couldn't get the voice interface!"));
{ return false;
return; }
}
return VoiceInterface->RegisterRemoteTalker(*UniqueNetId.GetUniqueNetId());
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); }
if (!VoiceInterface.IsValid()) bool UAdvancedVoiceLibrary::UnRegisterRemoteTalker(const FBPUniqueNetId& UniqueNetId)
{ {
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unregister Local Talker couldn't get the voice interface!")); if (!UniqueNetId.IsValid())
return; {
} UE_LOG(AdvancedVoiceLog, Warning, TEXT("UnRegister Remote Talker was passed an invalid unique net id!"));
return false;
VoiceInterface->UnregisterLocalTalker(LocalPlayerNum); }
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
void UAdvancedVoiceLibrary::UnRegisterAllLocalTalkers(UObject* WorldContextObject)
{ if (!VoiceInterface.IsValid())
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); UE_LOG(AdvancedVoiceLog, Warning, TEXT("UnRegister Remote Talker couldn't get the voice interface!"));
if (!IsValid(World)) return false;
{ }
return;
} return VoiceInterface->UnregisterRemoteTalker(*UniqueNetId.GetUniqueNetId());
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World);
void UAdvancedVoiceLibrary::RemoveAllRemoteTalkers()
if (!VoiceInterface.IsValid()) {
{ IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
UE_LOG(AdvancedVoiceLog, Warning, TEXT("UnRegister All Local Talkers couldn't get the voice interface!"));
return; if (!VoiceInterface.IsValid())
} {
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Remove All Remote Talkers couldn't get the voice interface!"));
VoiceInterface->UnregisterLocalTalkers(); return;
} }
bool UAdvancedVoiceLibrary::RegisterRemoteTalker(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId) VoiceInterface->RemoveAllRemoteTalkers();
{ }
if (!UniqueNetId.IsValid())
{ bool UAdvancedVoiceLibrary::IsLocalPlayerTalking(uint8 LocalPlayerNum)
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Remote Talker was passed an invalid unique net id!")); {
return false; IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
}
if (!VoiceInterface.IsValid())
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); {
if (!IsValid(World)) UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Local Player Talking couldn't get the voice interface!"));
{ return false;
return false; }
}
return VoiceInterface->IsLocalPlayerTalking(LocalPlayerNum);
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); }
if (!VoiceInterface.IsValid()) bool UAdvancedVoiceLibrary::IsRemotePlayerTalking(const FBPUniqueNetId& UniqueNetId)
{ {
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Register Remote Talker couldn't get the voice interface!")); if (!UniqueNetId.IsValid())
return false; {
} UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Remote Player Talking was passed an invalid unique net id!"));
return false;
return VoiceInterface->RegisterRemoteTalker(*UniqueNetId.GetUniqueNetId()); }
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
bool UAdvancedVoiceLibrary::UnRegisterRemoteTalker(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId)
{ if (!VoiceInterface.IsValid())
if (!UniqueNetId.IsValid()) {
{ UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Remote Player Talking couldn't get the voice interface!"));
UE_LOG(AdvancedVoiceLog, Warning, TEXT("UnRegister Remote Talker was passed an invalid unique net id!")); return false;
return false; }
}
return VoiceInterface->IsRemotePlayerTalking(*UniqueNetId.GetUniqueNetId());
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); }
if (!IsValid(World))
{ bool UAdvancedVoiceLibrary::IsPlayerMuted(uint8 LocalUserNumChecking, const FBPUniqueNetId& UniqueNetId)
return false; {
} if (!UniqueNetId.IsValid())
{
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Player Muted was passed an invalid unique net id!"));
return false;
if (!VoiceInterface.IsValid()) }
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("UnRegister Remote Talker couldn't get the voice interface!")); IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
return false;
} if (!VoiceInterface.IsValid())
{
return VoiceInterface->UnregisterRemoteTalker(*UniqueNetId.GetUniqueNetId()); UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Player Muted couldn't get the voice interface!"));
} return false;
}
void UAdvancedVoiceLibrary::RemoveAllRemoteTalkers(UObject* WorldContextObject)
{ return VoiceInterface->IsMuted(LocalUserNumChecking, *UniqueNetId.GetUniqueNetId());
}
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World)) bool UAdvancedVoiceLibrary::MuteRemoteTalker(uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide)
{ {
return; if (!UniqueNetId.IsValid())
} {
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Mute Remote Talker was passed an invalid unique net id!"));
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); return false;
}
if (!VoiceInterface.IsValid())
{ IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Remove All Remote Talkers couldn't get the voice interface!"));
return; if (!VoiceInterface.IsValid())
} {
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Mute Remote Talker couldn't get the voice interface!"));
VoiceInterface->RemoveAllRemoteTalkers(); return false;
} }
bool UAdvancedVoiceLibrary::IsLocalPlayerTalking(UObject* WorldContextObject, uint8 LocalPlayerNum) return VoiceInterface->MuteRemoteTalker(LocalUserNum, *UniqueNetId.GetUniqueNetId(), bIsSystemWide);
{ }
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); bool UAdvancedVoiceLibrary::UnMuteRemoteTalker(uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide)
if (!IsValid(World)) {
{ if (!UniqueNetId.IsValid())
return false; {
} UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unmute Remote Talker was passed an invalid unique net id!"));
return false;
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); }
if (!VoiceInterface.IsValid()) IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Local Player Talking couldn't get the voice interface!")); if (!VoiceInterface.IsValid())
return false; {
} UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unmute Remote Talker couldn't get the voice interface!"));
return false;
return VoiceInterface->IsLocalPlayerTalking(LocalPlayerNum); }
}
return VoiceInterface->UnmuteRemoteTalker(LocalUserNum, *UniqueNetId.GetUniqueNetId(), bIsSystemWide);
bool UAdvancedVoiceLibrary::IsRemotePlayerTalking(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId) }
{
if (!UniqueNetId.IsValid())
{ void UAdvancedVoiceLibrary::GetNumLocalTalkers(int32 & NumLocalTalkers)
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Remote Player Talking was passed an invalid unique net id!")); {
return false; IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface();
}
if (!VoiceInterface.IsValid())
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); {
if (!IsValid(World)) NumLocalTalkers = 0;
{ UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unmute Remote Talker couldn't get the voice interface!"));
return false; return;
} }
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World); NumLocalTalkers = VoiceInterface->GetNumLocalTalkers();
if (!VoiceInterface.IsValid())
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Remote Player Talking couldn't get the voice interface!"));
return false;
}
return VoiceInterface->IsRemotePlayerTalking(*UniqueNetId.GetUniqueNetId());
}
bool UAdvancedVoiceLibrary::IsPlayerMuted(UObject* WorldContextObject, uint8 LocalUserNumChecking, const FBPUniqueNetId& UniqueNetId)
{
if (!UniqueNetId.IsValid())
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Player Muted was passed an invalid unique net id!"));
return false;
}
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World))
{
return false;
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World);
if (!VoiceInterface.IsValid())
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Is Player Muted couldn't get the voice interface!"));
return false;
}
return VoiceInterface->IsMuted(LocalUserNumChecking, *UniqueNetId.GetUniqueNetId());
}
bool UAdvancedVoiceLibrary::MuteRemoteTalker(UObject* WorldContextObject, uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide)
{
if (!UniqueNetId.IsValid())
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Mute Remote Talker was passed an invalid unique net id!"));
return false;
}
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World))
{
return false;
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World);
if (!VoiceInterface.IsValid())
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Mute Remote Talker couldn't get the voice interface!"));
return false;
}
return VoiceInterface->MuteRemoteTalker(LocalUserNum, *UniqueNetId.GetUniqueNetId(), bIsSystemWide);
}
bool UAdvancedVoiceLibrary::UnMuteRemoteTalker(UObject* WorldContextObject, uint8 LocalUserNum, const FBPUniqueNetId& UniqueNetId, bool bIsSystemWide)
{
if (!UniqueNetId.IsValid())
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unmute Remote Talker was passed an invalid unique net id!"));
return false;
}
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World))
{
return false;
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World);
if (!VoiceInterface.IsValid())
{
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unmute Remote Talker couldn't get the voice interface!"));
return false;
}
return VoiceInterface->UnmuteRemoteTalker(LocalUserNum, *UniqueNetId.GetUniqueNetId(), bIsSystemWide);
}
void UAdvancedVoiceLibrary::GetNumLocalTalkers(UObject* WorldContextObject, int32 & NumLocalTalkers)
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
if (!IsValid(World))
{
return;
}
IOnlineVoicePtr VoiceInterface = Online::GetVoiceInterface(World);
if (!VoiceInterface.IsValid())
{
NumLocalTalkers = 0;
UE_LOG(AdvancedVoiceLog, Warning, TEXT("Unmute Remote Talker couldn't get the voice interface!"));
return;
}
NumLocalTalkers = VoiceInterface->GetNumLocalTalkers();
} }

View File

@@ -1,91 +0,0 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "AutoLoginUserCallbackProxy.h"
#include "Kismet/GameplayStatics.h"
#include "Online.h"
//////////////////////////////////////////////////////////////////////////
// ULoginUserCallbackProxy
UAutoLoginUserCallbackProxy::UAutoLoginUserCallbackProxy(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, Delegate(FOnLoginCompleteDelegate::CreateUObject(this, &ThisClass::OnCompleted))
{
}
UAutoLoginUserCallbackProxy* UAutoLoginUserCallbackProxy::AutoLoginUser(UObject* WorldContextObject, int32 LocalUserNum)
{
UAutoLoginUserCallbackProxy* Proxy = NewObject<UAutoLoginUserCallbackProxy>();
Proxy->LocalUserNumber = LocalUserNum;
Proxy->WorldContextObject = WorldContextObject;
return Proxy;
}
void UAutoLoginUserCallbackProxy::Activate()
{
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("AutoLoginUser"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull));
if (Helper.OnlineSub != nullptr)
{
auto Identity = Helper.OnlineSub->GetIdentityInterface();
if (Identity.IsValid())
{
DelegateHandle = Identity->AddOnLoginCompleteDelegate_Handle(LocalUserNumber, Delegate);
Identity->AutoLogin(LocalUserNumber);
return;
}
}
// Fail immediately
OnFailure.Broadcast();
}
void UAutoLoginUserCallbackProxy::OnCompleted(int32 LocalUserNum, bool bWasSuccessful, const FUniqueNetId& UserId, const FString& ErrorVal)
{
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("AutoLoginUser"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull));
if (Helper.OnlineSub != nullptr)
{
auto Identity = Helper.OnlineSub->GetIdentityInterface();
if (Identity.IsValid())
{
Identity->ClearOnLoginCompleteDelegate_Handle(LocalUserNum, DelegateHandle);
}
if (APlayerController* PController = UGameplayStatics::GetPlayerController(WorldContextObject->GetWorld(), LocalUserNum))
{
ULocalPlayer* Player = Cast<ULocalPlayer>(PController->Player);
FUniqueNetIdRepl uniqueId(UserId.AsShared());
if (Player)
{
Player->SetCachedUniqueNetId(uniqueId);
}
if (APlayerState* State = PController->PlayerState)
{
// Update UniqueId. See also ShowLoginUICallbackProxy.cpp
State->SetUniqueId(uniqueId);
}
}
if (bWasSuccessful)
{
OnSuccess.Broadcast();
}
else
{
OnFailure.Broadcast();
}
return;
}
OnFailure.Broadcast();
}

View File

@@ -21,7 +21,7 @@ UCancelFindSessionsCallbackProxy* UCancelFindSessionsCallbackProxy::CancelFindSe
void UCancelFindSessionsCallbackProxy::Activate() void UCancelFindSessionsCallbackProxy::Activate()
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CancelFindSessions"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CancelFindSessions"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
if (Helper.IsValid()) if (Helper.IsValid())
@@ -47,7 +47,7 @@ void UCancelFindSessionsCallbackProxy::Activate()
void UCancelFindSessionsCallbackProxy::OnCompleted(bool bWasSuccessful) void UCancelFindSessionsCallbackProxy::OnCompleted(bool bWasSuccessful)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CancelFindSessionsCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CancelFindSessionsCallback"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
if (Helper.IsValid()) if (Helper.IsValid())

View File

@@ -13,7 +13,7 @@ UCreateSessionCallbackProxyAdvanced::UCreateSessionCallbackProxyAdvanced(const F
{ {
} }
UCreateSessionCallbackProxyAdvanced* UCreateSessionCallbackProxyAdvanced::CreateAdvancedSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair>& ExtraSettings, class APlayerController* PlayerController, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bIsDedicatedServer, /*bool bUsePresence,*/ bool bUseLobbiesIfAvailable, bool bAllowJoinViaPresence, bool bAllowJoinViaPresenceFriendsOnly, bool bAntiCheatProtected, bool bUsesStats, bool bShouldAdvertise, bool bUseLobbiesVoiceChatIfAvailable, bool bStartAfterCreate) UCreateSessionCallbackProxyAdvanced* UCreateSessionCallbackProxyAdvanced::CreateAdvancedSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair> &ExtraSettings, class APlayerController* PlayerController, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bIsDedicatedServer, bool bUsePresence, bool bAllowJoinViaPresence, bool bAllowJoinViaPresenceFriendsOnly, bool bAntiCheatProtected, bool bUsesStats, bool bShouldAdvertise)
{ {
UCreateSessionCallbackProxyAdvanced* Proxy = NewObject<UCreateSessionCallbackProxyAdvanced>(); UCreateSessionCallbackProxyAdvanced* Proxy = NewObject<UCreateSessionCallbackProxyAdvanced>();
Proxy->PlayerControllerWeakPtr = PlayerController; Proxy->PlayerControllerWeakPtr = PlayerController;
@@ -24,21 +24,18 @@ UCreateSessionCallbackProxyAdvanced* UCreateSessionCallbackProxyAdvanced::Create
Proxy->bAllowInvites = bAllowInvites; Proxy->bAllowInvites = bAllowInvites;
Proxy->ExtraSettings = ExtraSettings; Proxy->ExtraSettings = ExtraSettings;
Proxy->bDedicatedServer = bIsDedicatedServer; Proxy->bDedicatedServer = bIsDedicatedServer;
/*Proxy->bUsePresence = bUsePresence;*/ Proxy->bUsePresence = bUsePresence;
Proxy->bUseLobbiesIfAvailable = bUseLobbiesIfAvailable;
Proxy->bAllowJoinViaPresence = bAllowJoinViaPresence; Proxy->bAllowJoinViaPresence = bAllowJoinViaPresence;
Proxy->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly; Proxy->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly;
Proxy->bAntiCheatProtected = bAntiCheatProtected; Proxy->bAntiCheatProtected = bAntiCheatProtected;
Proxy->bUsesStats = bUsesStats; Proxy->bUsesStats = bUsesStats;
Proxy->bShouldAdvertise = bShouldAdvertise; Proxy->bShouldAdvertise = bShouldAdvertise;
Proxy->bUseLobbiesVoiceChatIfAvailable = bUseLobbiesVoiceChatIfAvailable;
Proxy->bStartAfterCreate = bStartAfterCreate;
return Proxy; return Proxy;
} }
void UCreateSessionCallbackProxyAdvanced::Activate() void UCreateSessionCallbackProxyAdvanced::Activate()
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CreateSession"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CreateSession"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
if (PlayerControllerWeakPtr.IsValid() ) if (PlayerControllerWeakPtr.IsValid() )
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
@@ -53,27 +50,21 @@ void UCreateSessionCallbackProxyAdvanced::Activate()
FOnlineSessionSettings Settings; FOnlineSessionSettings Settings;
Settings.NumPublicConnections = NumPublicConnections; Settings.NumPublicConnections = NumPublicConnections;
Settings.NumPrivateConnections = NumPrivateConnections; Settings.NumPrivateConnections = NumPrivateConnections;
Settings.bShouldAdvertise = bShouldAdvertise; Settings.bShouldAdvertise = true;
Settings.bAllowJoinInProgress = true; Settings.bAllowJoinInProgress = true;
Settings.bIsLANMatch = bUseLAN; Settings.bIsLANMatch = bUseLAN;
Settings.bAllowJoinViaPresence = bAllowJoinViaPresence; Settings.bAllowJoinViaPresence = bAllowJoinViaPresence;
Settings.bIsDedicated = bDedicatedServer; Settings.bIsDedicated = bDedicatedServer;
if (bDedicatedServer) if (bDedicatedServer)
{
Settings.bUseLobbiesIfAvailable = false;
Settings.bUsesPresence = false; Settings.bUsesPresence = false;
}
else else
{ Settings.bUsesPresence = bUsePresence;
Settings.bUseLobbiesIfAvailable = bUseLobbiesIfAvailable;
Settings.bUsesPresence = bUseLobbiesIfAvailable;
}
Settings.bUseLobbiesVoiceChatIfAvailable = bUseLobbiesIfAvailable ? bUseLobbiesVoiceChatIfAvailable : false;
Settings.bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly; Settings.bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly;
Settings.bAntiCheatProtected = bAntiCheatProtected; Settings.bAntiCheatProtected = bAntiCheatProtected;
Settings.bUsesStats = bUsesStats; Settings.bUsesStats = bUsesStats;
Settings.bShouldAdvertise = bShouldAdvertise;
// These are about the only changes over the standard Create Sessions Node // These are about the only changes over the standard Create Sessions Node
Settings.bAllowInvites = bAllowInvites; Settings.bAllowInvites = bAllowInvites;
@@ -121,7 +112,7 @@ void UCreateSessionCallbackProxyAdvanced::Activate()
void UCreateSessionCallbackProxyAdvanced::OnCreateCompleted(FName SessionName, bool bWasSuccessful) void UCreateSessionCallbackProxyAdvanced::OnCreateCompleted(FName SessionName, bool bWasSuccessful)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CreateSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("CreateSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
//Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); //Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
if (Helper.OnlineSub != nullptr) if (Helper.OnlineSub != nullptr)
@@ -133,17 +124,8 @@ void UCreateSessionCallbackProxyAdvanced::OnCreateCompleted(FName SessionName, b
if (bWasSuccessful) if (bWasSuccessful)
{ {
if (this->bStartAfterCreate) StartCompleteDelegateHandle = Sessions->AddOnStartSessionCompleteDelegate_Handle(StartCompleteDelegate);
{ Sessions->StartSession(NAME_GameSession);
UE_LOG_ONLINE_SESSION(Display, TEXT("Session creation completed. Automatic start is turned on, starting session now."));
StartCompleteDelegateHandle = Sessions->AddOnStartSessionCompleteDelegate_Handle(StartCompleteDelegate);
Sessions->StartSession(NAME_GameSession); // We'll call `OnSuccess.Broadcast()` when start succeeds.
}
else
{
UE_LOG_ONLINE_SESSION(Display, TEXT("Session creation completed. Automatic start is turned off, to start the session call 'StartSession'."));
OnSuccess.Broadcast();
}
// OnStartCompleted will get called, nothing more to do now // OnStartCompleted will get called, nothing more to do now
return; return;
@@ -159,7 +141,7 @@ void UCreateSessionCallbackProxyAdvanced::OnCreateCompleted(FName SessionName, b
void UCreateSessionCallbackProxyAdvanced::OnStartCompleted(FName SessionName, bool bWasSuccessful) void UCreateSessionCallbackProxyAdvanced::OnStartCompleted(FName SessionName, bool bWasSuccessful)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("StartSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("StartSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
//Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); //Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
if (Helper.OnlineSub != nullptr) if (Helper.OnlineSub != nullptr)

View File

@@ -21,7 +21,7 @@ UEndSessionCallbackProxy* UEndSessionCallbackProxy::EndSession(UObject* WorldCon
void UEndSessionCallbackProxy::Activate() void UEndSessionCallbackProxy::Activate()
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("EndSession"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("EndSession"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
if (Helper.IsValid()) if (Helper.IsValid())
@@ -55,7 +55,7 @@ void UEndSessionCallbackProxy::Activate()
void UEndSessionCallbackProxy::OnCompleted(FName SessionName, bool bWasSuccessful) void UEndSessionCallbackProxy::OnCompleted(FName SessionName, bool bWasSuccessful)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("EndSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("EndSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
if (Helper.IsValid()) if (Helper.IsValid())

View File

@@ -1,138 +1,107 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "FindFriendSessionCallbackProxy.h" #include "FindFriendSessionCallbackProxy.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// UGetRecentPlayersCallbackProxy // UGetRecentPlayersCallbackProxy
DEFINE_LOG_CATEGORY(AdvancedFindFriendSessionLog); DEFINE_LOG_CATEGORY(AdvancedFindFriendSessionLog);
UFindFriendSessionCallbackProxy::UFindFriendSessionCallbackProxy(const FObjectInitializer& ObjectInitializer) UFindFriendSessionCallbackProxy::UFindFriendSessionCallbackProxy(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer) : Super(ObjectInitializer)
, OnFindFriendSessionCompleteDelegate(FOnFindFriendSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnFindFriendSessionCompleted)) , OnFindFriendSessionCompleteDelegate(FOnFindFriendSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnFindFriendSessionCompleted))
{ {
} }
UFindFriendSessionCallbackProxy* UFindFriendSessionCallbackProxy::FindFriendSession(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId) UFindFriendSessionCallbackProxy* UFindFriendSessionCallbackProxy::FindFriendSession(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &FriendUniqueNetId)
{ {
UFindFriendSessionCallbackProxy* Proxy = NewObject<UFindFriendSessionCallbackProxy>(); UFindFriendSessionCallbackProxy* Proxy = NewObject<UFindFriendSessionCallbackProxy>();
Proxy->PlayerControllerWeakPtr = PlayerController; Proxy->PlayerControllerWeakPtr = PlayerController;
Proxy->cUniqueNetId = FriendUniqueNetId; Proxy->cUniqueNetId = FriendUniqueNetId;
Proxy->WorldContextObject = WorldContextObject; Proxy->WorldContextObject = WorldContextObject;
return Proxy; return Proxy;
} }
void UFindFriendSessionCallbackProxy::Activate() void UFindFriendSessionCallbackProxy::Activate()
{ {
if (!cUniqueNetId.IsValid()) if (!cUniqueNetId.IsValid())
{ {
// Fail immediately // Fail immediately
UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed received a bad UniqueNetId!")); UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed received a bad UniqueNetId!"));
TArray<FBlueprintSessionResult> EmptyResult; TArray<FBlueprintSessionResult> EmptyResult;
OnFailure.Broadcast(EmptyResult); OnFailure.Broadcast(EmptyResult);
return; return;
} }
if (!PlayerControllerWeakPtr.IsValid()) if (!PlayerControllerWeakPtr.IsValid())
{ {
// Fail immediately // Fail immediately
UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed received a bad playercontroller!")); UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed received a bad playercontroller!"));
TArray<FBlueprintSessionResult> EmptyResult; TArray<FBlueprintSessionResult> EmptyResult;
OnFailure.Broadcast(EmptyResult); OnFailure.Broadcast(EmptyResult);
return; return;
} }
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("EndSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); IOnlineSessionPtr Sessions = Online::GetSessionInterface(GetWorld());
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
if (Sessions.IsValid())
if (!Helper.IsValid()) {
{ ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
// Fail immediately
TArray<FBlueprintSessionResult> EmptyResult; if (!Player)
OnFailure.Broadcast(EmptyResult); {
return; // Fail immediately
} UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed couldn't cast to ULocalPlayer!"));
TArray<FBlueprintSessionResult> EmptyResult;
IOnlineSessionPtr Sessions = Helper.OnlineSub->GetSessionInterface(); OnFailure.Broadcast(EmptyResult);
return;
if (Sessions.IsValid()) }
{
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player); FindFriendSessionCompleteDelegateHandle = Sessions->AddOnFindFriendSessionCompleteDelegate_Handle(Player->GetControllerId(), OnFindFriendSessionCompleteDelegate);
if (!Player) Sessions->FindFriendSession(Player->GetControllerId(), *cUniqueNetId.GetUniqueNetId());
{
// Fail immediately return;
UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed couldn't cast to ULocalPlayer!")); }
TArray<FBlueprintSessionResult> EmptyResult;
OnFailure.Broadcast(EmptyResult); // Fail immediately
return; TArray<FBlueprintSessionResult> EmptyResult;
} OnFailure.Broadcast(EmptyResult);
}
FindFriendSessionCompleteDelegateHandle = Sessions->AddOnFindFriendSessionCompleteDelegate_Handle(Player->GetControllerId(), OnFindFriendSessionCompleteDelegate);
Sessions->FindFriendSession(Player->GetControllerId(), *cUniqueNetId.GetUniqueNetId()); void UFindFriendSessionCallbackProxy::OnFindFriendSessionCompleted(int32 LocalPlayer, bool bWasSuccessful, const TArray<FOnlineSessionSearchResult>& SessionInfo)
{
return; IOnlineSessionPtr Sessions = Online::GetSessionInterface(GetWorld());
}
if (Sessions.IsValid())
// Fail immediately Sessions->ClearOnFindFriendSessionCompleteDelegate_Handle(LocalPlayer, FindFriendSessionCompleteDelegateHandle);
TArray<FBlueprintSessionResult> EmptyResult;
OnFailure.Broadcast(EmptyResult); if ( bWasSuccessful )
} {
TArray<FBlueprintSessionResult> Result;
void UFindFriendSessionCallbackProxy::OnFindFriendSessionCompleted(int32 LocalPlayer, bool bWasSuccessful, const TArray<FOnlineSessionSearchResult>& SessionInfo) for (auto& Sesh : SessionInfo)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("EndSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); if (Sesh.IsValid())
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); {
FBlueprintSessionResult BSesh;
if (Helper.IsValid()) BSesh.OnlineResult = Sesh;
{ Result.Add(BSesh);
IOnlineSessionPtr Sessions = Helper.OnlineSub->GetSessionInterface(); }
}
if (Sessions.IsValid())
Sessions->ClearOnFindFriendSessionCompleteDelegate_Handle(LocalPlayer, FindFriendSessionCompleteDelegateHandle); if(Result.Num() > 0)
OnSuccess.Broadcast(Result);
if (bWasSuccessful) else
{ {
TArray<FBlueprintSessionResult> Result; UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed, returned an invalid session."));
OnFailure.Broadcast(Result);
for (auto& Sesh : SessionInfo) }
{ }
if (Sesh.IsValid()) else
{ {
FBlueprintSessionResult BSesh; UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed"));
BSesh.OnlineResult = Sesh; TArray<FBlueprintSessionResult> EmptyResult;
OnFailure.Broadcast(EmptyResult);
// Temp for 5.5, force the values if epic isn't setting them, lobbies should always have these true }
if (!BSesh.OnlineResult.Session.SessionSettings.bIsDedicated) }
{
BSesh.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true;
BSesh.OnlineResult.Session.SessionSettings.bUsesPresence = true;
}
Result.Add(BSesh);
}
}
if (Result.Num() > 0)
OnSuccess.Broadcast(Result);
else
{
UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed, returned an invalid session."));
OnFailure.Broadcast(Result);
}
}
else
{
UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed"));
TArray<FBlueprintSessionResult> EmptyResult;
OnFailure.Broadcast(EmptyResult);
}
}
else
{
UE_LOG(AdvancedFindFriendSessionLog, Warning, TEXT("FindFriendSession Failed"));
TArray<FBlueprintSessionResult> EmptyResult;
OnFailure.Broadcast(EmptyResult);
}
}

View File

@@ -1,451 +1,420 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "FindSessionsCallbackProxyAdvanced.h" #include "FindSessionsCallbackProxyAdvanced.h"
#include "Online/OnlineSessionNames.h"
//////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// // UFindSessionsCallbackProxyAdvanced
// UFindSessionsCallbackProxyAdvanced
UFindSessionsCallbackProxyAdvanced::UFindSessionsCallbackProxyAdvanced(const FObjectInitializer& ObjectInitializer)
UFindSessionsCallbackProxyAdvanced::UFindSessionsCallbackProxyAdvanced(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
: Super(ObjectInitializer) , Delegate(FOnFindSessionsCompleteDelegate::CreateUObject(this, &ThisClass::OnCompleted))
, Delegate(FOnFindSessionsCompleteDelegate::CreateUObject(this, &ThisClass::OnCompleted)) , bUseLAN(false)
, bUseLAN(false) {
{ bRunSecondSearch = false;
bRunSecondSearch = false; bIsOnSecondSearch = false;
bIsOnSecondSearch = false; }
}
UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray<FSessionsSearchSetting> &Filters, bool bEmptyServersOnly, bool bNonEmptyServersOnly, bool bSecureServersOnly, int MinSlotsAvailable)
UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray<FSessionsSearchSetting> &Filters, bool bEmptyServersOnly, bool bNonEmptyServersOnly, bool bSecureServersOnly, /*bool bSearchLobbies,*/ int MinSlotsAvailable) {
{ UFindSessionsCallbackProxyAdvanced* Proxy = NewObject<UFindSessionsCallbackProxyAdvanced>();
UFindSessionsCallbackProxyAdvanced* Proxy = NewObject<UFindSessionsCallbackProxyAdvanced>(); Proxy->PlayerControllerWeakPtr = PlayerController;
Proxy->PlayerControllerWeakPtr = PlayerController; Proxy->bUseLAN = bUseLAN;
Proxy->bUseLAN = bUseLAN; Proxy->MaxResults = MaxResults;
Proxy->MaxResults = MaxResults; Proxy->WorldContextObject = WorldContextObject;
Proxy->WorldContextObject = WorldContextObject; Proxy->SearchSettings = Filters;
Proxy->SearchSettings = Filters; Proxy->ServerSearchType = ServerTypeToSearch;
Proxy->ServerSearchType = ServerTypeToSearch; Proxy->bEmptyServersOnly = bEmptyServersOnly,
Proxy->bEmptyServersOnly = bEmptyServersOnly, Proxy->bNonEmptyServersOnly = bNonEmptyServersOnly;
Proxy->bNonEmptyServersOnly = bNonEmptyServersOnly; Proxy->bSecureServersOnly = bSecureServersOnly;
Proxy->bSecureServersOnly = bSecureServersOnly; Proxy->MinSlotsAvailable = MinSlotsAvailable;
//Proxy->bSearchLobbies = bSearchLobbies; return Proxy;
Proxy->MinSlotsAvailable = MinSlotsAvailable; }
return Proxy;
} void UFindSessionsCallbackProxyAdvanced::Activate()
{
void UFindSessionsCallbackProxyAdvanced::Activate() FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("FindSessions"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
{ Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("FindSessions"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull));
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); if (Helper.IsValid())
{
if (Helper.IsValid()) auto Sessions = Helper.OnlineSub->GetSessionInterface();
{ if (Sessions.IsValid())
auto Sessions = Helper.OnlineSub->GetSessionInterface(); {
if (Sessions.IsValid()) // Re-initialize here, otherwise I think there might be issues with people re-calling search for some reason before it is destroyed
{ bRunSecondSearch = false;
// Re-initialize here, otherwise I think there might be issues with people re-calling search for some reason before it is destroyed bIsOnSecondSearch = false;
bRunSecondSearch = false;
bIsOnSecondSearch = false; DelegateHandle = Sessions->AddOnFindSessionsCompleteDelegate_Handle(Delegate);
DelegateHandle = Sessions->AddOnFindSessionsCompleteDelegate_Handle(Delegate); SearchObject = MakeShareable(new FOnlineSessionSearch);
SearchObject->MaxSearchResults = MaxResults;
SearchObject = MakeShareable(new FOnlineSessionSearch); SearchObject->bIsLanQuery = bUseLAN;
SearchObject->MaxSearchResults = MaxResults; //SearchObject->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
SearchObject->bIsLanQuery = bUseLAN;
//SearchObject->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); // Create temp filter variable, because I had to re-define a blueprint version of this, it is required.
FOnlineSearchSettingsEx tem;
// Create temp filter variable, because I had to re-define a blueprint version of this, it is required.
FOnlineSearchSettingsEx tem; /* // Search only for dedicated servers (value is true/false)
#define SEARCH_DEDICATED_ONLY FName(TEXT("DEDICATEDONLY"))
/* // Search only for dedicated servers (value is true/false) // Search for empty servers only (value is true/false)
#define SEARCH_DEDICATED_ONLY FName(TEXT("DEDICATEDONLY")) #define SEARCH_EMPTY_SERVERS_ONLY FName(TEXT("EMPTYONLY"))
// Search for empty servers only (value is true/false) // Search for non empty servers only (value is true/false)
#define SEARCH_EMPTY_SERVERS_ONLY FName(TEXT("EMPTYONLY")) #define SEARCH_NONEMPTY_SERVERS_ONLY FName(TEXT("NONEMPTYONLY"))
// Search for non empty servers only (value is true/false) // Search for secure servers only (value is true/false)
#define SEARCH_NONEMPTY_SERVERS_ONLY FName(TEXT("NONEMPTYONLY")) #define SEARCH_SECURE_SERVERS_ONLY FName(TEXT("SECUREONLY"))
// Search for secure servers only (value is true/false) // Search for presence sessions only (value is true/false)
#define SEARCH_SECURE_SERVERS_ONLY FName(TEXT("SECUREONLY")) #define SEARCH_PRESENCE FName(TEXT("PRESENCESEARCH"))
// Search for presence sessions only (value is true/false) // Search for a match with min player availability (value is int)
#define SEARCH_PRESENCE FName(TEXT("PRESENCESEARCH")) #define SEARCH_MINSLOTSAVAILABLE FName(TEXT("MINSLOTSAVAILABLE"))
// Search for a match with min player availability (value is int) // Exclude all matches where any unique ids in a given array are present (value is string of the form "uniqueid1;uniqueid2;uniqueid3")
#define SEARCH_MINSLOTSAVAILABLE FName(TEXT("MINSLOTSAVAILABLE")) #define SEARCH_EXCLUDE_UNIQUEIDS FName(TEXT("EXCLUDEUNIQUEIDS"))
// Exclude all matches where any unique ids in a given array are present (value is string of the form "uniqueid1;uniqueid2;uniqueid3") // User ID to search for session of
#define SEARCH_EXCLUDE_UNIQUEIDS FName(TEXT("EXCLUDEUNIQUEIDS")) #define SEARCH_USER FName(TEXT("SEARCHUSER"))
// User ID to search for session of // Keywords to match in session search
#define SEARCH_USER FName(TEXT("SEARCHUSER")) #define SEARCH_KEYWORDS FName(TEXT("SEARCHKEYWORDS"))*/
// Keywords to match in session search
#define SEARCH_KEYWORDS FName(TEXT("SEARCHKEYWORDS"))*/ if (bEmptyServersOnly)
/** Keywords to match in session search */ tem.Set(SEARCH_EMPTY_SERVERS_ONLY, true, EOnlineComparisonOp::Equals);
/** The matchmaking queue name to matchmake in, e.g. "TeamDeathmatch" (value is string) */
/** #define SEARCH_MATCHMAKING_QUEUE FName(TEXT("MATCHMAKINGQUEUE"))*/ if (bNonEmptyServersOnly)
/** If set, use the named Xbox Live hopper to find a session via matchmaking (value is a string) */ tem.Set(SEARCH_NONEMPTY_SERVERS_ONLY, true, EOnlineComparisonOp::Equals);
/** #define SEARCH_XBOX_LIVE_HOPPER_NAME FName(TEXT("LIVEHOPPERNAME"))*/
/** Which session template from the service configuration to use */ if (bSecureServersOnly)
/** #define SEARCH_XBOX_LIVE_SESSION_TEMPLATE_NAME FName(TEXT("LIVESESSIONTEMPLATE"))*/ tem.Set(SEARCH_SECURE_SERVERS_ONLY, true, EOnlineComparisonOp::Equals);
/** Selection method used to determine which match to join when multiple are returned (valid only on Switch) */
/** #define SEARCH_SWITCH_SELECTION_METHOD FName(TEXT("SWITCHSELECTIONMETHOD"))*/ if (MinSlotsAvailable != 0)
/** Whether to use lobbies vs sessions */ tem.Set(SEARCH_MINSLOTSAVAILABLE, MinSlotsAvailable, EOnlineComparisonOp::GreaterThanEquals);
/** #define SEARCH_LOBBIES FName(TEXT("LOBBYSEARCH"))*/
if (bEmptyServersOnly)
tem.Set(SEARCH_EMPTY_SERVERS_ONLY, true, EOnlineComparisonOp::Equals);
// Filter results
if (bNonEmptyServersOnly) if (SearchSettings.Num() > 0)
tem.Set(SEARCH_NONEMPTY_SERVERS_ONLY, true, EOnlineComparisonOp::Equals); {
for (int i = 0; i < SearchSettings.Num(); i++)
if (bSecureServersOnly) {
tem.Set(SEARCH_SECURE_SERVERS_ONLY, true, EOnlineComparisonOp::Equals); // Function that was added to make directly adding a FVariant possible
tem.HardSet(SearchSettings[i].PropertyKeyPair.Key, SearchSettings[i].PropertyKeyPair.Data, SearchSettings[i].ComparisonOp);
if (MinSlotsAvailable != 0) }
tem.Set(SEARCH_MINSLOTSAVAILABLE, MinSlotsAvailable, EOnlineComparisonOp::GreaterThanEquals); }
// Filter results switch (ServerSearchType)
if (SearchSettings.Num() > 0) {
{
for (int i = 0; i < SearchSettings.Num(); i++) case EBPServerPresenceSearchType::ClientServersOnly:
{ {
// Function that was added to make directly adding a FVariant possible tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
tem.HardSet(SearchSettings[i].PropertyKeyPair.Key, SearchSettings[i].PropertyKeyPair.Data, SearchSettings[i].ComparisonOp); }
} break;
}
case EBPServerPresenceSearchType::DedicatedServersOnly:
switch (ServerSearchType) {
{ //tem.Set(SEARCH_DEDICATED_ONLY, true, EOnlineComparisonOp::Equals);
}
case EBPServerPresenceSearchType::ClientServersOnly: break;
{
//tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); case EBPServerPresenceSearchType::AllServers:
default:
//if (bSearchLobbies)// && !IOnlineSubsystem::DoesInstanceExist("STEAM")) {
tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals); // Only steam uses the separate searching flags currently
} if (IOnlineSubsystem::DoesInstanceExist("STEAM"))
break; {
bRunSecondSearch = true;
case EBPServerPresenceSearchType::DedicatedServersOnly:
{ SearchObjectDedicated = MakeShareable(new FOnlineSessionSearch);
//tem.Set(SEARCH_DEDICATED_ONLY, true, EOnlineComparisonOp::Equals); SearchObjectDedicated->MaxSearchResults = MaxResults;
} SearchObjectDedicated->bIsLanQuery = bUseLAN;
break;
FOnlineSearchSettingsEx DedicatedOnly = tem;
case EBPServerPresenceSearchType::AllServers: tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
default:
{ //DedicatedOnly.Set(SEARCH_DEDICATED_ONLY, true, EOnlineComparisonOp::Equals);
//if (IOnlineSubsystem::DoesInstanceExist("STEAM")) SearchObjectDedicated->QuerySettings = DedicatedOnly;
//{ }
bRunSecondSearch = true; }
break;
SearchObjectDedicated = MakeShareable(new FOnlineSessionSearch); }
SearchObjectDedicated->MaxSearchResults = MaxResults;
SearchObjectDedicated->bIsLanQuery = bUseLAN; // Copy the derived temp variable over to it's base class
SearchObject->QuerySettings = tem;
FOnlineSearchSettingsEx DedicatedOnly = tem;
Sessions->FindSessions(*Helper.UserID, SearchObject.ToSharedRef());
//tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
// OnQueryCompleted will get called, nothing more to do now
//if (bSearchLobbies)// && !IOnlineSubsystem::DoesInstanceExist("STEAM")) return;
tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals); }
else
//DedicatedOnly.Set(SEARCH_DEDICATED_ONLY, true, EOnlineComparisonOp::Equals); {
SearchObjectDedicated->QuerySettings = DedicatedOnly; FFrame::KismetExecutionMessage(TEXT("Sessions not supported by Online Subsystem"), ELogVerbosity::Warning);
//} }
} }
break;
} // Fail immediately
OnFailure.Broadcast(SessionSearchResults);
// Copy the derived temp variable over to it's base class }
SearchObject->QuerySettings = tem;
void UFindSessionsCallbackProxyAdvanced::OnCompleted(bool bSuccess)
Sessions->FindSessions(*Helper.UserID, SearchObject.ToSharedRef()); {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("FindSessionsCallback"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
// OnQueryCompleted will get called, nothing more to do now Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
return;
} if (!bRunSecondSearch && Helper.IsValid())
else {
{ auto Sessions = Helper.OnlineSub->GetSessionInterface();
FFrame::KismetExecutionMessage(TEXT("Sessions not supported by Online Subsystem"), ELogVerbosity::Warning); if (Sessions.IsValid())
} {
} Sessions->ClearOnFindSessionsCompleteDelegate_Handle(DelegateHandle);
}
// Fail immediately }
OnFailure.Broadcast(SessionSearchResults);
} if (bSuccess)
{
void UFindSessionsCallbackProxyAdvanced::OnCompleted(bool bSuccess) if (bIsOnSecondSearch)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("FindSessionsCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); if (SearchObjectDedicated.IsValid())
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get()); {
// Just log the results for now, will need to add a blueprint-compatible search result struct
if (!Helper.IsValid()) for (auto& Result : SearchObjectDedicated->SearchResults)
{ {
// Fail immediately FString ResultText = FString::Printf(TEXT("Found a session. Ping is %d"), Result.PingInMs);
OnFailure.Broadcast(SessionSearchResults);
return; FFrame::KismetExecutionMessage(*ResultText, ELogVerbosity::Log);
}
FBlueprintSessionResult BPResult;
if (!bRunSecondSearch && Helper.IsValid()) BPResult.OnlineResult = Result;
{ SessionSearchResults.Add(BPResult);
auto Sessions = Helper.OnlineSub->GetSessionInterface(); }
if (Sessions.IsValid()) OnSuccess.Broadcast(SessionSearchResults);
{ return;
Sessions->ClearOnFindSessionsCompleteDelegate_Handle(DelegateHandle); }
} }
} else
{
if (bSuccess) if (SearchObject.IsValid())
{ {
if (bIsOnSecondSearch) // Just log the results for now, will need to add a blueprint-compatible search result struct
{ for (auto& Result : SearchObject->SearchResults)
if (SearchObjectDedicated.IsValid()) {
{ FString ResultText = FString::Printf(TEXT("Found a session. Ping is %d"), Result.PingInMs);
// Just log the results for now, will need to add a blueprint-compatible search result struct
for (auto& Result : SearchObjectDedicated->SearchResults) FFrame::KismetExecutionMessage(*ResultText, ELogVerbosity::Log);
{
FString ResultText = FString::Printf(TEXT("Found a session. Ping is %d"), Result.PingInMs); FBlueprintSessionResult BPResult;
BPResult.OnlineResult = Result;
FFrame::KismetExecutionMessage(*ResultText, ELogVerbosity::Log); SessionSearchResults.Add(BPResult);
}
FBlueprintSessionResult BPResult; if (!bRunSecondSearch)
BPResult.OnlineResult = Result; {
SessionSearchResults.AddUnique(BPResult); OnSuccess.Broadcast(SessionSearchResults);
} return;
OnSuccess.Broadcast(SessionSearchResults); }
return; }
} }
} }
else else
{ {
if (SearchObject.IsValid()) if (!bRunSecondSearch)
{ {
// Just log the results for now, will need to add a blueprint-compatible search result struct // Need to account for only one of the searches failing
for (auto& Result : SearchObject->SearchResults) if (SessionSearchResults.Num() > 0)
{ OnSuccess.Broadcast(SessionSearchResults);
FString ResultText = FString::Printf(TEXT("Found a session. Ping is %d"), Result.PingInMs); else
OnFailure.Broadcast(SessionSearchResults);
FFrame::KismetExecutionMessage(*ResultText, ELogVerbosity::Log); return;
}
FBlueprintSessionResult BPResult; }
BPResult.OnlineResult = Result;
if (Helper.IsValid() && bRunSecondSearch && ServerSearchType == EBPServerPresenceSearchType::AllServers)
// Temp for 5.5, force the values if epic isn't setting them, lobbies should always have these true {
if (ServerSearchType != EBPServerPresenceSearchType::DedicatedServersOnly ) bRunSecondSearch = false;
{ bIsOnSecondSearch = true;
BPResult.OnlineResult.Session.SessionSettings.bUseLobbiesIfAvailable = true; auto Sessions = Helper.OnlineSub->GetSessionInterface();
BPResult.OnlineResult.Session.SessionSettings.bUsesPresence = true; Sessions->FindSessions(*Helper.UserID, SearchObjectDedicated.ToSharedRef());
} }
else // We lost our player controller
SessionSearchResults.AddUnique(BPResult); {
} if (bSuccess && SessionSearchResults.Num() > 0)
if (!bRunSecondSearch) OnSuccess.Broadcast(SessionSearchResults);
{ else
OnSuccess.Broadcast(SessionSearchResults); OnFailure.Broadcast(SessionSearchResults);
return; }
} }
}
}
} void UFindSessionsCallbackProxyAdvanced::FilterSessionResults(const TArray<FBlueprintSessionResult> &SessionResults, const TArray<FSessionsSearchSetting> &Filters, TArray<FBlueprintSessionResult> &FilteredResults)
else {
{ for (int j = 0; j < SessionResults.Num(); j++)
if (!bRunSecondSearch) {
{ bool bAddResult = true;
// Need to account for only one of the searches failing
if (SessionSearchResults.Num() > 0) // Filter results
OnSuccess.Broadcast(SessionSearchResults); if (Filters.Num() > 0)
else {
OnFailure.Broadcast(SessionSearchResults); const FOnlineSessionSetting * setting;
return; for (int i = 0; i < Filters.Num(); i++)
} {
} setting = SessionResults[j].OnlineResult.Session.SessionSettings.Settings.Find(Filters[i].PropertyKeyPair.Key);
if (Helper.IsValid() && bRunSecondSearch && ServerSearchType == EBPServerPresenceSearchType::AllServers) // Couldn't find this key
{ if (!setting)
bRunSecondSearch = false; continue;
bIsOnSecondSearch = true;
auto Sessions = Helper.OnlineSub->GetSessionInterface(); if (!CompareVariants(setting->Data, Filters[i].PropertyKeyPair.Data, Filters[i].ComparisonOp))
Sessions->FindSessions(*Helper.UserID, SearchObjectDedicated.ToSharedRef()); {
} bAddResult = false;
else // We lost our player controller break;
{ }
if (bSuccess && SessionSearchResults.Num() > 0) }
OnSuccess.Broadcast(SessionSearchResults); }
else
OnFailure.Broadcast(SessionSearchResults); if (bAddResult)
} FilteredResults.Add(SessionResults[j]);
} }
return;
void UFindSessionsCallbackProxyAdvanced::FilterSessionResults(const TArray<FBlueprintSessionResult> &SessionResults, const TArray<FSessionsSearchSetting> &Filters, TArray<FBlueprintSessionResult> &FilteredResults) }
{
for (int j = 0; j < SessionResults.Num(); j++)
{ bool UFindSessionsCallbackProxyAdvanced::CompareVariants(const FVariantData &A, const FVariantData &B, EOnlineComparisonOpRedux Comparator)
bool bAddResult = true; {
if (A.GetType() != B.GetType())
// Filter results return false;
if (Filters.Num() > 0)
{ switch (A.GetType())
const FOnlineSessionSetting * setting; {
for (int i = 0; i < Filters.Num(); i++) case EOnlineKeyValuePairDataType::Bool:
{ {
setting = SessionResults[j].OnlineResult.Session.SessionSettings.Settings.Find(Filters[i].PropertyKeyPair.Key); bool bA, bB;
A.GetValue(bA);
// Couldn't find this key B.GetValue(bB);
if (!setting) switch (Comparator)
continue; {
case EOnlineComparisonOpRedux::Equals:
if (!CompareVariants(setting->Data, Filters[i].PropertyKeyPair.Data, Filters[i].ComparisonOp)) return bA == bB; break;
{ case EOnlineComparisonOpRedux::NotEquals:
bAddResult = false; return bA != bB; break;
break; default:
} return false;break;
} }
} }
case EOnlineKeyValuePairDataType::Double:
if (bAddResult) {
FilteredResults.Add(SessionResults[j]); double bA, bB;
} A.GetValue(bA);
B.GetValue(bB);
return; switch (Comparator)
} {
case EOnlineComparisonOpRedux::Equals:
return bA == bB; break;
bool UFindSessionsCallbackProxyAdvanced::CompareVariants(const FVariantData &A, const FVariantData &B, EOnlineComparisonOpRedux Comparator) case EOnlineComparisonOpRedux::NotEquals:
{ return bA != bB; break;
if (A.GetType() != B.GetType()) case EOnlineComparisonOpRedux::GreaterThanEquals:
return false; return (bA == bB || bA > bB); break;
case EOnlineComparisonOpRedux::LessThanEquals:
switch (A.GetType()) return (bA == bB || bA < bB); break;
{ case EOnlineComparisonOpRedux::GreaterThan:
case EOnlineKeyValuePairDataType::Bool: return bA > bB; break;
{ case EOnlineComparisonOpRedux::LessThan:
bool bA, bB; return bA < bB; break;
A.GetValue(bA); default:
B.GetValue(bB); return false; break;
switch (Comparator) }
{ }
case EOnlineComparisonOpRedux::Equals: case EOnlineKeyValuePairDataType::Float:
return bA == bB; break; {
case EOnlineComparisonOpRedux::NotEquals: float tbA, tbB;
return bA != bB; break; double bA, bB;
default: A.GetValue(tbA);
return false;break; B.GetValue(tbB);
} bA = (double)tbA;
} bB = (double)tbB;
case EOnlineKeyValuePairDataType::Double: switch (Comparator)
{ {
double bA, bB; case EOnlineComparisonOpRedux::Equals:
A.GetValue(bA); return bA == bB; break;
B.GetValue(bB); case EOnlineComparisonOpRedux::NotEquals:
switch (Comparator) return bA != bB; break;
{ case EOnlineComparisonOpRedux::GreaterThanEquals:
case EOnlineComparisonOpRedux::Equals: return (bA == bB || bA > bB); break;
return bA == bB; break; case EOnlineComparisonOpRedux::LessThanEquals:
case EOnlineComparisonOpRedux::NotEquals: return (bA == bB || bA < bB); break;
return bA != bB; break; case EOnlineComparisonOpRedux::GreaterThan:
case EOnlineComparisonOpRedux::GreaterThanEquals: return bA > bB; break;
return (bA == bB || bA > bB); break; case EOnlineComparisonOpRedux::LessThan:
case EOnlineComparisonOpRedux::LessThanEquals: return bA < bB; break;
return (bA == bB || bA < bB); break; default:
case EOnlineComparisonOpRedux::GreaterThan: return false; break;
return bA > bB; break; }
case EOnlineComparisonOpRedux::LessThan: }
return bA < bB; break; case EOnlineKeyValuePairDataType::Int32:
default: {
return false; break; int32 bA, bB;
} A.GetValue(bA);
} B.GetValue(bB);
case EOnlineKeyValuePairDataType::Float: switch (Comparator)
{ {
float tbA, tbB; case EOnlineComparisonOpRedux::Equals:
double bA, bB; return bA == bB; break;
A.GetValue(tbA); case EOnlineComparisonOpRedux::NotEquals:
B.GetValue(tbB); return bA != bB; break;
bA = (double)tbA; case EOnlineComparisonOpRedux::GreaterThanEquals:
bB = (double)tbB; return (bA == bB || bA > bB); break;
switch (Comparator) case EOnlineComparisonOpRedux::LessThanEquals:
{ return (bA == bB || bA < bB); break;
case EOnlineComparisonOpRedux::Equals: case EOnlineComparisonOpRedux::GreaterThan:
return bA == bB; break; return bA > bB; break;
case EOnlineComparisonOpRedux::NotEquals: case EOnlineComparisonOpRedux::LessThan:
return bA != bB; break; return bA < bB; break;
case EOnlineComparisonOpRedux::GreaterThanEquals: default:
return (bA == bB || bA > bB); break; return false; break;
case EOnlineComparisonOpRedux::LessThanEquals: }
return (bA == bB || bA < bB); break; }
case EOnlineComparisonOpRedux::GreaterThan: case EOnlineKeyValuePairDataType::Int64:
return bA > bB; break; {
case EOnlineComparisonOpRedux::LessThan: uint64 bA, bB;
return bA < bB; break; A.GetValue(bA);
default: B.GetValue(bB);
return false; break; switch (Comparator)
} {
} case EOnlineComparisonOpRedux::Equals:
case EOnlineKeyValuePairDataType::Int32: return bA == bB; break;
{ case EOnlineComparisonOpRedux::NotEquals:
int32 bA, bB; return bA != bB; break;
A.GetValue(bA); case EOnlineComparisonOpRedux::GreaterThanEquals:
B.GetValue(bB); return (bA == bB || bA > bB); break;
switch (Comparator) case EOnlineComparisonOpRedux::LessThanEquals:
{ return (bA == bB || bA < bB); break;
case EOnlineComparisonOpRedux::Equals: case EOnlineComparisonOpRedux::GreaterThan:
return bA == bB; break; return bA > bB; break;
case EOnlineComparisonOpRedux::NotEquals: case EOnlineComparisonOpRedux::LessThan:
return bA != bB; break; return bA < bB; break;
case EOnlineComparisonOpRedux::GreaterThanEquals: default:
return (bA == bB || bA > bB); break; return false; break;
case EOnlineComparisonOpRedux::LessThanEquals: }
return (bA == bB || bA < bB); break; }
case EOnlineComparisonOpRedux::GreaterThan:
return bA > bB; break; case EOnlineKeyValuePairDataType::String:
case EOnlineComparisonOpRedux::LessThan: {
return bA < bB; break; FString bA, bB;
default: A.GetValue(bA);
return false; break; B.GetValue(bB);
} switch (Comparator)
} {
case EOnlineKeyValuePairDataType::Int64: case EOnlineComparisonOpRedux::Equals:
{ return bA == bB; break;
uint64 bA, bB; case EOnlineComparisonOpRedux::NotEquals:
A.GetValue(bA); return bA != bB; break;
B.GetValue(bB); default:
switch (Comparator) return false; break;
{ }
case EOnlineComparisonOpRedux::Equals: }
return bA == bB; break;
case EOnlineComparisonOpRedux::NotEquals: case EOnlineKeyValuePairDataType::Empty:
return bA != bB; break; case EOnlineKeyValuePairDataType::Blob:
case EOnlineComparisonOpRedux::GreaterThanEquals: default:
return (bA == bB || bA > bB); break; return false; break;
case EOnlineComparisonOpRedux::LessThanEquals: }
return (bA == bB || bA < bB); break;
case EOnlineComparisonOpRedux::GreaterThan:
return bA > bB; break;
case EOnlineComparisonOpRedux::LessThan:
return bA < bB; break;
default:
return false; break;
}
}
case EOnlineKeyValuePairDataType::String:
{
FString bA, bB;
A.GetValue(bA);
B.GetValue(bB);
switch (Comparator)
{
case EOnlineComparisonOpRedux::Equals:
return bA == bB; break;
case EOnlineComparisonOpRedux::NotEquals:
return bA != bB; break;
default:
return false; break;
}
}
case EOnlineKeyValuePairDataType::Empty:
case EOnlineKeyValuePairDataType::Blob:
default:
return false; break;
}
} }

View File

@@ -1,114 +1,94 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "GetFriendsCallbackProxy.h" #include "GetFriendsCallbackProxy.h"
#include "Online.h"
#include "Interfaces/OnlineFriendsInterface.h" //////////////////////////////////////////////////////////////////////////
#include "Interfaces/OnlinePresenceInterface.h" // UGetFriendsCallbackProxy
DEFINE_LOG_CATEGORY(AdvancedGetFriendsLog);
//////////////////////////////////////////////////////////////////////////
// UGetFriendsCallbackProxy UGetFriendsCallbackProxy::UGetFriendsCallbackProxy(const FObjectInitializer& ObjectInitializer)
DEFINE_LOG_CATEGORY(AdvancedGetFriendsLog); : Super(ObjectInitializer)
, FriendListReadCompleteDelegate(FOnReadFriendsListComplete::CreateUObject(this, &ThisClass::OnReadFriendsListCompleted))
UGetFriendsCallbackProxy::UGetFriendsCallbackProxy(const FObjectInitializer& ObjectInitializer) {
: Super(ObjectInitializer) }
, FriendListReadCompleteDelegate(FOnReadFriendsListComplete::CreateUObject(this, &ThisClass::OnReadFriendsListCompleted))
{ UGetFriendsCallbackProxy* UGetFriendsCallbackProxy::GetAndStoreFriendsList(UObject* WorldContextObject, class APlayerController* PlayerController)
} {
UGetFriendsCallbackProxy* Proxy = NewObject<UGetFriendsCallbackProxy>();
UGetFriendsCallbackProxy* UGetFriendsCallbackProxy::GetAndStoreFriendsList(UObject* WorldContextObject, class APlayerController* PlayerController) Proxy->PlayerControllerWeakPtr = PlayerController;
{ Proxy->WorldContextObject = WorldContextObject;
UGetFriendsCallbackProxy* Proxy = NewObject<UGetFriendsCallbackProxy>(); return Proxy;
Proxy->PlayerControllerWeakPtr = PlayerController; }
Proxy->WorldContextObject = WorldContextObject;
return Proxy; void UGetFriendsCallbackProxy::Activate()
} {
if (!PlayerControllerWeakPtr.IsValid())
void UGetFriendsCallbackProxy::Activate() {
{ // Fail immediately
if (!PlayerControllerWeakPtr.IsValid()) UE_LOG(AdvancedGetFriendsLog, Warning, TEXT("GetFriends Failed received a bad player controller!"));
{ TArray<FBPFriendInfo> EmptyArray;
// Fail immediately OnFailure.Broadcast(EmptyArray);
UE_LOG(AdvancedGetFriendsLog, Warning, TEXT("GetFriends Failed received a bad player controller!")); return;
TArray<FBPFriendInfo> EmptyArray; }
OnFailure.Broadcast(EmptyArray);
return; IOnlineFriendsPtr Friends = Online::GetFriendsInterface();
} if (Friends.IsValid())
{
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("GetFriends"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
Friends->ReadFriendsList(Player->GetControllerId(), EFriendsLists::ToString((EFriendsLists::Default)), FriendListReadCompleteDelegate);
if (Helper.IsValid()) return;
{ }
IOnlineFriendsPtr Friends = Helper.OnlineSub->GetFriendsInterface();
if (Friends.IsValid()) // Fail immediately
{ TArray<FBPFriendInfo> EmptyArray;
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
OnFailure.Broadcast(EmptyArray);
Friends->ReadFriendsList(Player->GetControllerId(), EFriendsLists::ToString((EFriendsLists::Default)), FriendListReadCompleteDelegate); }
return;
} void UGetFriendsCallbackProxy::OnReadFriendsListCompleted(int32 LocalUserNum, bool bWasSuccessful, const FString& ListName, const FString& ErrorString)
} {
if (bWasSuccessful)
// Fail immediately {
TArray<FBPFriendInfo> EmptyArray; IOnlineFriendsPtr Friends = Online::GetFriendsInterface();
OnFailure.Broadcast(EmptyArray); if (Friends.IsValid())
} {
// Not actually needed anymore, plus was not being validated and causing a crash
void UGetFriendsCallbackProxy::OnReadFriendsListCompleted(int32 LocalUserNum, bool bWasSuccessful, const FString& ListName, const FString& ErrorString) //ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
{
if (bWasSuccessful) TArray<FBPFriendInfo> FriendsListOut;
{ TArray< TSharedRef<FOnlineFriend> > FriendList;
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("GetFriends"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); Friends->GetFriendsList(LocalUserNum, ListName, FriendList);
Helper.QueryIDFromPlayerController(PlayerControllerWeakPtr.Get());
for (int32 i = 0; i < FriendList.Num(); i++)
if (!Helper.IsValid()) {
{ TSharedRef<FOnlineFriend> Friend = FriendList[i];
TArray<FBPFriendInfo> EmptyArray; FBPFriendInfo BPF;
OnFailure.Broadcast(EmptyArray); FOnlineUserPresence pres = Friend->GetPresence();
return; BPF.OnlineState = ((EBPOnlinePresenceState)((int32)pres.Status.State));
} BPF.DisplayName = Friend->GetDisplayName();
BPF.RealName = Friend->GetRealName();
auto Friends = Helper.OnlineSub->GetFriendsInterface(); BPF.UniqueNetId.SetUniqueNetId(Friend->GetUserId());
if (Friends.IsValid()) BPF.bIsPlayingSameGame = pres.bIsPlayingThisGame;
{
// Not actually needed anymore, plus was not being validated and causing a crash BPF.PresenceInfo.bIsOnline = pres.bIsOnline;
//ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player); BPF.PresenceInfo.bHasVoiceSupport = pres.bHasVoiceSupport;
BPF.PresenceInfo.bIsPlaying = pres.bIsPlaying;
TArray<FBPFriendInfo> FriendsListOut; BPF.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State));
TArray< TSharedRef<FOnlineFriend> > FriendList; BPF.PresenceInfo.StatusString = pres.Status.StatusStr;
if (Friends->GetFriendsList(LocalUserNum, ListName, FriendList)) BPF.PresenceInfo.bIsJoinable = pres.bIsJoinable;
{ BPF.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame;
for (int32 i = 0; i < FriendList.Num(); i++)
{
FBPFriendInfo BPF; FriendsListOut.Add(BPF);
const FOnlineUserPresence& pres = FriendList[i]->GetPresence(); }
BPF.OnlineState = ((EBPOnlinePresenceState)((int32)pres.Status.State));
BPF.DisplayName = FriendList[i]->GetDisplayName(); OnSuccess.Broadcast(FriendsListOut);
BPF.RealName = FriendList[i]->GetRealName(); }
BPF.UniqueNetId.SetUniqueNetId(FriendList[i]->GetUserId()); }
BPF.bIsPlayingSameGame = pres.bIsPlayingThisGame; else
{
BPF.PresenceInfo.bIsOnline = pres.bIsOnline; TArray<FBPFriendInfo> EmptyArray;
BPF.PresenceInfo.bHasVoiceSupport = pres.bHasVoiceSupport; OnFailure.Broadcast(EmptyArray);
BPF.PresenceInfo.bIsPlaying = pres.bIsPlaying; }
BPF.PresenceInfo.PresenceState = ((EBPOnlinePresenceState)((int32)pres.Status.State)); }
// #TODO: Check back in on this in shipping, epic is missing the UTF8_TO_TCHAR call on converting this and its making an invalid string
//BPF.PresenceInfo.StatusString = pres.Status.StatusStr;
BPF.PresenceInfo.bIsJoinable = pres.bIsJoinable;
BPF.PresenceInfo.bIsPlayingThisGame = pres.bIsPlayingThisGame;
FriendsListOut.Add(BPF);
}
}
OnSuccess.Broadcast(FriendsListOut);
}
}
else
{
TArray<FBPFriendInfo> EmptyArray;
OnFailure.Broadcast(EmptyArray);
}
}

View File

@@ -1,104 +1,85 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "GetRecentPlayersCallbackProxy.h" #include "GetRecentPlayersCallbackProxy.h"
#include "Online.h"
//////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// // UGetRecentPlayersCallbackProxy
// UGetRecentPlayersCallbackProxy DEFINE_LOG_CATEGORY(AdvancedGetRecentPlayersLog);
DEFINE_LOG_CATEGORY(AdvancedGetRecentPlayersLog);
UGetRecentPlayersCallbackProxy::UGetRecentPlayersCallbackProxy(const FObjectInitializer& ObjectInitializer)
UGetRecentPlayersCallbackProxy::UGetRecentPlayersCallbackProxy(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
: Super(ObjectInitializer) , QueryRecentPlayersCompleteDelegate(FOnQueryRecentPlayersCompleteDelegate::CreateUObject(this, &ThisClass::OnQueryRecentPlayersCompleted))
, QueryRecentPlayersCompleteDelegate(FOnQueryRecentPlayersCompleteDelegate::CreateUObject(this, &ThisClass::OnQueryRecentPlayersCompleted)) {
{ }
}
UGetRecentPlayersCallbackProxy* UGetRecentPlayersCallbackProxy::GetAndStoreRecentPlayersList(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId)
UGetRecentPlayersCallbackProxy* UGetRecentPlayersCallbackProxy::GetAndStoreRecentPlayersList(UObject* WorldContextObject, const FBPUniqueNetId& UniqueNetId) {
{ UGetRecentPlayersCallbackProxy* Proxy = NewObject<UGetRecentPlayersCallbackProxy>();
UGetRecentPlayersCallbackProxy* Proxy = NewObject<UGetRecentPlayersCallbackProxy>(); Proxy->cUniqueNetId = UniqueNetId;
Proxy->cUniqueNetId = UniqueNetId; Proxy->WorldContextObject = WorldContextObject;
Proxy->WorldContextObject = WorldContextObject; return Proxy;
return Proxy; }
}
void UGetRecentPlayersCallbackProxy::Activate()
void UGetRecentPlayersCallbackProxy::Activate() {
{ if (!cUniqueNetId.IsValid())
if (!cUniqueNetId.IsValid()) {
{ // Fail immediately
// Fail immediately UE_LOG(AdvancedGetRecentPlayersLog, Warning, TEXT("GetRecentPlayers Failed received a bad UniqueNetId!"));
UE_LOG(AdvancedGetRecentPlayersLog, Warning, TEXT("GetRecentPlayers Failed received a bad UniqueNetId!")); TArray<FBPOnlineRecentPlayer> EmptyArray;
TArray<FBPOnlineRecentPlayer> EmptyArray; OnFailure.Broadcast(EmptyArray);
OnFailure.Broadcast(EmptyArray); return;
return; }
}
IOnlineFriendsPtr Friends = Online::GetFriendsInterface();
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("GetRecentPlayers"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); if (Friends.IsValid())
{
if (!Helper.OnlineSub) DelegateHandle = Friends->AddOnQueryRecentPlayersCompleteDelegate_Handle(QueryRecentPlayersCompleteDelegate);
{
TArray<FBPOnlineRecentPlayer> EmptyArray; // Testing with null namespace
OnFailure.Broadcast(EmptyArray); Friends->QueryRecentPlayers(*(cUniqueNetId.GetUniqueNetId()), "");
return; return;
} }
// Fail immediately
IOnlineFriendsPtr Friends = Helper.OnlineSub->GetFriendsInterface(); TArray<FBPOnlineRecentPlayer> EmptyArray;
if (Friends.IsValid()) OnFailure.Broadcast(EmptyArray);
{ }
DelegateHandle = Friends->AddOnQueryRecentPlayersCompleteDelegate_Handle(QueryRecentPlayersCompleteDelegate);
void UGetRecentPlayersCallbackProxy::OnQueryRecentPlayersCompleted(const FUniqueNetId &UserID, const FString &Namespace, bool bWasSuccessful, const FString& ErrorString)
// Testing with null namespace {
Friends->QueryRecentPlayers(*(cUniqueNetId.GetUniqueNetId()), "");
return; IOnlineFriendsPtr Friends = Online::GetFriendsInterface();
} if (Friends.IsValid())
// Fail immediately Friends->ClearOnQueryRecentPlayersCompleteDelegate_Handle(DelegateHandle);
TArray<FBPOnlineRecentPlayer> EmptyArray;
OnFailure.Broadcast(EmptyArray);
} if (bWasSuccessful)
{
void UGetRecentPlayersCallbackProxy::OnQueryRecentPlayersCompleted(const FUniqueNetId &UserID, const FString &Namespace, bool bWasSuccessful, const FString& ErrorString) // WHOOPS
{ //IOnlineFriendsPtr Friends = Online::GetFriendsInterface();
if (Friends.IsValid())
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("GetRecentPlayers"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); {
TArray<FBPOnlineRecentPlayer> PlayersListOut;
if (!Helper.OnlineSub) TArray< TSharedRef<FOnlineRecentPlayer> > PlayerList;
{
TArray<FBPOnlineRecentPlayer> EmptyArray; Friends->GetRecentPlayers(*(cUniqueNetId.GetUniqueNetId()), "", PlayerList);
OnFailure.Broadcast(EmptyArray);
return; for (int32 i = 0; i < PlayerList.Num(); i++)
} {
TSharedRef<FOnlineRecentPlayer> Player = PlayerList[i];
IOnlineFriendsPtr Friends = Helper.OnlineSub->GetFriendsInterface(); FBPOnlineRecentPlayer BPF;
if (Friends.IsValid()) BPF.DisplayName = Player->GetDisplayName();
Friends->ClearOnQueryRecentPlayersCompleteDelegate_Handle(DelegateHandle); BPF.RealName = Player->GetRealName();
BPF.UniqueNetId.SetUniqueNetId(Player->GetUserId());
PlayersListOut.Add(BPF);
if (bWasSuccessful) }
{
// WHOOPS OnSuccess.Broadcast(PlayersListOut);
//IOnlineFriendsPtr Friends = Online::GetFriendsInterface(); }
if (Friends.IsValid()) }
{ else
TArray<FBPOnlineRecentPlayer> PlayersListOut; {
TArray< TSharedRef<FOnlineRecentPlayer> > PlayerList; TArray<FBPOnlineRecentPlayer> EmptyArray;
OnFailure.Broadcast(EmptyArray);
Friends->GetRecentPlayers(*(cUniqueNetId.GetUniqueNetId()), "", PlayerList); }
}
for (int32 i = 0; i < PlayerList.Num(); i++)
{
TSharedRef<FOnlineRecentPlayer> Player = PlayerList[i];
FBPOnlineRecentPlayer BPF;
BPF.DisplayName = Player->GetDisplayName();
BPF.RealName = Player->GetRealName();
BPF.UniqueNetId.SetUniqueNetId(Player->GetUserId());
PlayersListOut.Add(BPF);
}
OnSuccess.Broadcast(PlayersListOut);
}
}
else
{
TArray<FBPOnlineRecentPlayer> EmptyArray;
OnFailure.Broadcast(EmptyArray);
}
}

View File

@@ -2,7 +2,6 @@
#include "GetUserPrivilegeCallbackProxy.h" #include "GetUserPrivilegeCallbackProxy.h"
#include "Online.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// UGetUserPrivilegeCallbackProxy // UGetUserPrivilegeCallbackProxy
@@ -23,14 +22,7 @@ UGetUserPrivilegeCallbackProxy* UGetUserPrivilegeCallbackProxy::GetUserPrivilege
void UGetUserPrivilegeCallbackProxy::Activate() void UGetUserPrivilegeCallbackProxy::Activate()
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("GetUserPrivilege"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); auto Identity = Online::GetIdentityInterface();
if (!Helper.OnlineSub)
{
OnFailure.Broadcast();
return;
}
auto Identity = Helper.OnlineSub->GetIdentityInterface();
if (Identity.IsValid()) if (Identity.IsValid())
{ {

View File

@@ -2,7 +2,6 @@
#include "LoginUserCallbackProxy.h" #include "LoginUserCallbackProxy.h"
#include "Online.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// ULoginUserCallbackProxy // ULoginUserCallbackProxy
@@ -13,13 +12,12 @@ ULoginUserCallbackProxy::ULoginUserCallbackProxy(const FObjectInitializer& Objec
{ {
} }
ULoginUserCallbackProxy* ULoginUserCallbackProxy::LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken, FString AuthType) ULoginUserCallbackProxy* ULoginUserCallbackProxy::LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken)
{ {
ULoginUserCallbackProxy* Proxy = NewObject<ULoginUserCallbackProxy>(); ULoginUserCallbackProxy* Proxy = NewObject<ULoginUserCallbackProxy>();
Proxy->PlayerControllerWeakPtr = PlayerController; Proxy->PlayerControllerWeakPtr = PlayerController;
Proxy->UserID = UserID; Proxy->UserID = UserID;
Proxy->UserToken = UserToken; Proxy->UserToken = UserToken;
Proxy->AuthType = AuthType;
Proxy->WorldContextObject = WorldContextObject; Proxy->WorldContextObject = WorldContextObject;
return Proxy; return Proxy;
} }
@@ -41,24 +39,12 @@ void ULoginUserCallbackProxy::Activate()
return; return;
} }
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("LoginUser"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); auto Identity = Online::GetIdentityInterface();
if (!Helper.OnlineSub)
{
OnFailure.Broadcast();
return;
}
auto Identity = Helper.OnlineSub->GetIdentityInterface();
if (Identity.IsValid()) if (Identity.IsValid())
{ {
// Fallback to default AuthType if nothing is specified
if (AuthType.IsEmpty())
{
AuthType = Identity->GetAuthType();
}
DelegateHandle = Identity->AddOnLoginCompleteDelegate_Handle(Player->GetControllerId(), Delegate); DelegateHandle = Identity->AddOnLoginCompleteDelegate_Handle(Player->GetControllerId(), Delegate);
FOnlineAccountCredentials AccountCreds(AuthType, UserID, UserToken); FOnlineAccountCredentials AccountCreds(Identity->GetAuthType(), UserID, UserToken);
Identity->Login(Player->GetControllerId(), AccountCreds); Identity->Login(Player->GetControllerId(), AccountCreds);
return; return;
} }
@@ -73,30 +59,14 @@ void ULoginUserCallbackProxy::OnCompleted(int32 LocalUserNum, bool bWasSuccessfu
{ {
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player); ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
FUniqueNetIdRepl UniqueID(UserId.AsShared());
if (Player) if (Player)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("GetUserPrivilege"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); auto Identity = Online::GetIdentityInterface();
if (!Helper.OnlineSub)
{
OnFailure.Broadcast();
return;
}
auto Identity = Helper.OnlineSub->GetIdentityInterface();
if (Identity.IsValid()) if (Identity.IsValid())
{ {
Identity->ClearOnLoginCompleteDelegate_Handle(Player->GetControllerId(), DelegateHandle); Identity->ClearOnLoginCompleteDelegate_Handle(Player->GetControllerId(), DelegateHandle);
} }
Player->SetCachedUniqueNetId(UniqueID);
}
if (APlayerState* State = PlayerControllerWeakPtr->PlayerState)
{
// Update UniqueId. See also ShowLoginUICallbackProxy.cpp
State->SetUniqueId(UniqueID);
} }
} }

View File

@@ -2,7 +2,6 @@
#include "LogoutUserCallbackProxy.h" #include "LogoutUserCallbackProxy.h"
#include "Online.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// ULogoutUserCallbackProxy // ULogoutUserCallbackProxy
@@ -30,6 +29,7 @@ void ULogoutUserCallbackProxy::Activate()
return; return;
} }
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player); ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
if (!Player) if (!Player)
@@ -38,14 +38,7 @@ void ULogoutUserCallbackProxy::Activate()
return; return;
} }
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("LogoutUser"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); auto Identity = Online::GetIdentityInterface();
if (!Helper.OnlineSub)
{
OnFailure.Broadcast();
return;
}
auto Identity = Helper.OnlineSub->GetIdentityInterface();
if (Identity.IsValid()) if (Identity.IsValid())
{ {
@@ -67,14 +60,7 @@ void ULogoutUserCallbackProxy::OnCompleted(int LocalUserNum, bool bWasSuccessful
if (Player) if (Player)
{ {
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("LogoutUser"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); auto Identity = Online::GetIdentityInterface();
if (!Helper.OnlineSub)
{
OnFailure.Broadcast();
return;
}
auto Identity = Helper.OnlineSub->GetIdentityInterface();
if (Identity.IsValid()) if (Identity.IsValid())
{ {

View File

@@ -1,82 +1,73 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "SendFriendInviteCallbackProxy.h" #include "SendFriendInviteCallbackProxy.h"
#include "Online.h"
//////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// // UGetRecentPlayersCallbackProxy
// UGetRecentPlayersCallbackProxy DEFINE_LOG_CATEGORY(AdvancedSendFriendInviteLog);
DEFINE_LOG_CATEGORY(AdvancedSendFriendInviteLog);
USendFriendInviteCallbackProxy::USendFriendInviteCallbackProxy(const FObjectInitializer& ObjectInitializer)
USendFriendInviteCallbackProxy::USendFriendInviteCallbackProxy(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
: Super(ObjectInitializer) , OnSendInviteCompleteDelegate(FOnSendInviteComplete::CreateUObject(this, &ThisClass::OnSendInviteComplete))
, OnSendInviteCompleteDelegate(FOnSendInviteComplete::CreateUObject(this, &ThisClass::OnSendInviteComplete)) {
{ }
}
USendFriendInviteCallbackProxy* USendFriendInviteCallbackProxy::SendFriendInvite(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &UniqueNetIDInvited)
USendFriendInviteCallbackProxy* USendFriendInviteCallbackProxy::SendFriendInvite(UObject* WorldContextObject, APlayerController *PlayerController, const FBPUniqueNetId &UniqueNetIDInvited) {
{ USendFriendInviteCallbackProxy* Proxy = NewObject<USendFriendInviteCallbackProxy>();
USendFriendInviteCallbackProxy* Proxy = NewObject<USendFriendInviteCallbackProxy>(); Proxy->PlayerControllerWeakPtr = PlayerController;
Proxy->PlayerControllerWeakPtr = PlayerController; Proxy->cUniqueNetId = UniqueNetIDInvited;
Proxy->cUniqueNetId = UniqueNetIDInvited; Proxy->WorldContextObject = WorldContextObject;
Proxy->WorldContextObject = WorldContextObject; return Proxy;
return Proxy; }
}
void USendFriendInviteCallbackProxy::Activate()
void USendFriendInviteCallbackProxy::Activate() {
{ if (!cUniqueNetId.IsValid())
if (!cUniqueNetId.IsValid()) {
{ // Fail immediately
// Fail immediately UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed received a bad UniqueNetId!"));
UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed received a bad UniqueNetId!")); OnFailure.Broadcast();
OnFailure.Broadcast(); return;
return; }
}
if (!PlayerControllerWeakPtr.IsValid())
if (!PlayerControllerWeakPtr.IsValid()) {
{ // Fail immediately
// Fail immediately UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed received a bad playercontroller!"));
UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed received a bad playercontroller!")); OnFailure.Broadcast();
OnFailure.Broadcast(); return;
return; }
}
IOnlineFriendsPtr Friends = Online::GetFriendsInterface();
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("SendFriendInvite"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); if (Friends.IsValid())
{
if (!Helper.OnlineSub) ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
{
OnFailure.Broadcast(); if (!Player)
return; {
} // Fail immediately
UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed couldn't cast to ULocalPlayer!"));
auto Friends = Helper.OnlineSub->GetFriendsInterface(); OnFailure.Broadcast();
if (Friends.IsValid()) return;
{ }
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
Friends->SendInvite(Player->GetControllerId(), *cUniqueNetId.GetUniqueNetId(), EFriendsLists::ToString((EFriendsLists::Default)), OnSendInviteCompleteDelegate);
if (!Player) return;
{ }
// Fail immediately // Fail immediately
UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed couldn't cast to ULocalPlayer!")); OnFailure.Broadcast();
OnFailure.Broadcast(); }
return;
} void USendFriendInviteCallbackProxy::OnSendInviteComplete(int32 LocalPlayerNum, bool bWasSuccessful, const FUniqueNetId &InvitedPlayer, const FString &ListName, const FString &ErrorString)
{
Friends->SendInvite(Player->GetControllerId(), *cUniqueNetId.GetUniqueNetId(), EFriendsLists::ToString((EFriendsLists::Default)), OnSendInviteCompleteDelegate); if ( bWasSuccessful )
return; {
} OnSuccess.Broadcast();
// Fail immediately }
OnFailure.Broadcast(); else
} {
UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed with error: %s"), *ErrorString);
void USendFriendInviteCallbackProxy::OnSendInviteComplete(int32 LocalPlayerNum, bool bWasSuccessful, const FUniqueNetId &InvitedPlayer, const FString &ListName, const FString &ErrorString) OnFailure.Broadcast();
{ }
if ( bWasSuccessful ) }
{
OnSuccess.Broadcast();
}
else
{
UE_LOG(AdvancedSendFriendInviteLog, Warning, TEXT("SendFriendInvite Failed with error: %s"), *ErrorString);
OnFailure.Broadcast();
}
}

View File

@@ -1,58 +0,0 @@
#include "StartSessionCallbackProxyAdvanced.h"
UStartSessionCallbackProxyAdvanced::UStartSessionCallbackProxyAdvanced(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, StartCompleteDelegate(FOnStartSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnStartCompleted))
{
}
UStartSessionCallbackProxyAdvanced* UStartSessionCallbackProxyAdvanced::StartAdvancedSession(
UObject* WorldContextObject)
{
UStartSessionCallbackProxyAdvanced* Proxy = NewObject<UStartSessionCallbackProxyAdvanced>();
Proxy->WorldContextObject = WorldContextObject;
return Proxy;
}
void UStartSessionCallbackProxyAdvanced::Activate()
{
const FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("StartSession"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull));
if (Helper.OnlineSub != nullptr)
{
const auto Sessions = Helper.OnlineSub->GetSessionInterface();
if (Sessions.IsValid())
{
StartCompleteDelegateHandle = Sessions->AddOnStartSessionCompleteDelegate_Handle(StartCompleteDelegate);
Sessions->StartSession(NAME_GameSession);
return;
}
FFrame::KismetExecutionMessage(TEXT("Sessions not supported by Online Subsystem"), ELogVerbosity::Warning);
}
// Fail immediately
OnFailure.Broadcast();
}
void UStartSessionCallbackProxyAdvanced::OnStartCompleted(FName SessionName, bool bWasSuccessful)
{
FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("StartSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull));
if (Helper.OnlineSub != nullptr)
{
auto Sessions = Helper.OnlineSub->GetSessionInterface();
if (Sessions.IsValid())
{
Sessions->ClearOnStartSessionCompleteDelegate_Handle(StartCompleteDelegateHandle);
}
}
if (bWasSuccessful)
{
OnSuccess.Broadcast();
}
else
{
OnFailure.Broadcast();
}
}

View File

@@ -12,7 +12,7 @@ UUpdateSessionCallbackProxyAdvanced::UUpdateSessionCallbackProxyAdvanced(const F
{ {
} }
UUpdateSessionCallbackProxyAdvanced* UUpdateSessionCallbackProxyAdvanced::UpdateSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair> &ExtraSettings, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bAllowJoinInProgress, bool bRefreshOnlineData, bool bIsDedicatedServer, bool bShouldAdvertise, bool bAllowJoinViaPresence, bool bAllowJoinViaPresenceFriendsOnly) UUpdateSessionCallbackProxyAdvanced* UUpdateSessionCallbackProxyAdvanced::UpdateSession(UObject* WorldContextObject, const TArray<FSessionPropertyKeyPair> &ExtraSettings, int32 PublicConnections, int32 PrivateConnections, bool bUseLAN, bool bAllowInvites, bool bAllowJoinInProgress, bool bRefreshOnlineData, bool bIsDedicatedServer)
{ {
UUpdateSessionCallbackProxyAdvanced* Proxy = NewObject<UUpdateSessionCallbackProxyAdvanced>(); UUpdateSessionCallbackProxyAdvanced* Proxy = NewObject<UUpdateSessionCallbackProxyAdvanced>();
Proxy->NumPublicConnections = PublicConnections; Proxy->NumPublicConnections = PublicConnections;
@@ -24,84 +24,75 @@ UUpdateSessionCallbackProxyAdvanced* UUpdateSessionCallbackProxyAdvanced::Update
Proxy->bRefreshOnlineData = bRefreshOnlineData; Proxy->bRefreshOnlineData = bRefreshOnlineData;
Proxy->bAllowJoinInProgress = bAllowJoinInProgress; Proxy->bAllowJoinInProgress = bAllowJoinInProgress;
Proxy->bDedicatedServer = bIsDedicatedServer; Proxy->bDedicatedServer = bIsDedicatedServer;
Proxy->bShouldAdvertise = bShouldAdvertise;
Proxy->bAllowJoinViaPresence = bAllowJoinViaPresence;
Proxy->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly;
return Proxy; return Proxy;
} }
void UUpdateSessionCallbackProxyAdvanced::Activate() void UUpdateSessionCallbackProxyAdvanced::Activate()
{ {
const FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("UpdateSession"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull));
if (Helper.OnlineSub != nullptr) IOnlineSessionPtr Sessions = Online::GetSessionInterface(GetWorld());
if (Sessions.IsValid())
{ {
const auto Sessions = Helper.OnlineSub->GetSessionInterface(); if (Sessions->GetNumSessions() < 1)
if (Sessions.IsValid())
{ {
if (Sessions->GetNumSessions() < 1) OnFailure.Broadcast();
{ GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("NO REGISTERED SESSIONS!"));
OnFailure.Broadcast();
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("NO REGISTERED SESSIONS!"));
return;
}
// This gets the actual session itself
//FNamedOnlineSession * curSession = Sessions->GetNamedSession(NAME_GameSession);
FOnlineSessionSettings* Settings = Sessions->GetSessionSettings(NAME_GameSession);
if (!Settings)
{
// Fail immediately
OnFailure.Broadcast();
return;
}
OnUpdateSessionCompleteDelegateHandle = Sessions->AddOnUpdateSessionCompleteDelegate_Handle(OnUpdateSessionCompleteDelegate);
// FOnlineSessionSettings Settings;
//Settings->BuildUniqueId = GetBuildUniqueId();
Settings->NumPublicConnections = NumPublicConnections;
Settings->NumPrivateConnections = NumPrivateConnections;
Settings->bShouldAdvertise = bShouldAdvertise;
Settings->bAllowJoinInProgress = bAllowJoinInProgress;
Settings->bIsLANMatch = bUseLAN;
//Settings->bUsesPresence = true;
Settings->bAllowInvites = bAllowInvites;
Settings->bAllowJoinInProgress = bAllowJoinInProgress;
Settings->bIsDedicated = bDedicatedServer;
// Added in 5.6
Settings->bAllowJoinViaPresence = bAllowJoinViaPresence;
Settings->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly;
FOnlineSessionSetting * fSetting = NULL;
FOnlineSessionSetting ExtraSetting;
for (int i = 0; i < ExtraSettings.Num(); i++)
{
fSetting = Settings->Settings.Find(ExtraSettings[i].Key);
if (fSetting)
{
fSetting->Data = ExtraSettings[i].Data;
}
else
{
ExtraSetting.Data = ExtraSettings[i].Data;
ExtraSetting.AdvertisementType = EOnlineDataAdvertisementType::ViaOnlineService;
Settings->Settings.Add(ExtraSettings[i].Key, ExtraSetting);
}
}
Sessions->UpdateSession(NAME_GameSession, *Settings, bRefreshOnlineData);
// OnUpdateCompleted will get called, nothing more to do now
return; return;
} }
else
// This gets the actual session itself
//FNamedOnlineSession * curSession = Sessions->GetNamedSession(NAME_GameSession);
FOnlineSessionSettings* Settings = Sessions->GetSessionSettings(NAME_GameSession);
if (!Settings)
{ {
FFrame::KismetExecutionMessage(TEXT("Sessions not supported by Online Subsystem"), ELogVerbosity::Warning); // Fail immediately
OnFailure.Broadcast();
return;
} }
OnUpdateSessionCompleteDelegateHandle = Sessions->AddOnUpdateSessionCompleteDelegate_Handle(OnUpdateSessionCompleteDelegate);
// FOnlineSessionSettings Settings;
//Settings->BuildUniqueId = GetBuildUniqueId();
Settings->NumPublicConnections = NumPublicConnections;
Settings->NumPrivateConnections = NumPrivateConnections;
//Settings->bShouldAdvertise = true;
Settings->bAllowJoinInProgress = bAllowJoinInProgress;
Settings->bIsLANMatch = bUseLAN;
//Settings->bUsesPresence = true;
//Settings->bAllowJoinViaPresence = true;
Settings->bAllowInvites = bAllowInvites;
Settings->bAllowJoinInProgress = bAllowJoinInProgress;
Settings->bIsDedicated = bDedicatedServer;
FOnlineSessionSetting * fSetting = NULL;
FOnlineSessionSetting ExtraSetting;
for (int i = 0; i < ExtraSettings.Num(); i++)
{
fSetting = Settings->Settings.Find(ExtraSettings[i].Key);
if (fSetting)
{
fSetting->Data = ExtraSettings[i].Data;
}
else
{
ExtraSetting.Data = ExtraSettings[i].Data;
ExtraSetting.AdvertisementType = EOnlineDataAdvertisementType::ViaOnlineService;
Settings->Settings.Add(ExtraSettings[i].Key, ExtraSetting);
}
}
Sessions->UpdateSession(NAME_GameSession, *Settings, bRefreshOnlineData);
// OnUpdateCompleted will get called, nothing more to do now
return;
}
else
{
FFrame::KismetExecutionMessage(TEXT("Sessions not supported by Online Subsystem"), ELogVerbosity::Warning);
} }
// Fail immediately // Fail immediately
OnFailure.Broadcast(); OnFailure.Broadcast();
@@ -110,20 +101,15 @@ void UUpdateSessionCallbackProxyAdvanced::Activate()
void UUpdateSessionCallbackProxyAdvanced::OnUpdateCompleted(FName SessionName, bool bWasSuccessful) void UUpdateSessionCallbackProxyAdvanced::OnUpdateCompleted(FName SessionName, bool bWasSuccessful)
{ {
const FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("UpdateSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject.Get(), EGetWorldErrorMode::LogAndReturnNull)); IOnlineSessionPtr Sessions = Online::GetSessionInterface(GetWorld());
if (Sessions.IsValid())
if (Helper.OnlineSub != nullptr)
{ {
const auto Sessions = Helper.OnlineSub->GetSessionInterface(); Sessions->ClearOnUpdateSessionCompleteDelegate_Handle(OnUpdateSessionCompleteDelegateHandle);
if (Sessions.IsValid())
if (bWasSuccessful)
{ {
Sessions->ClearOnUpdateSessionCompleteDelegate_Handle(OnUpdateSessionCompleteDelegateHandle); OnSuccess.Broadcast();
return;
if (bWasSuccessful)
{
OnSuccess.Broadcast();
return;
}
} }
} }

View File

@@ -1,42 +1,38 @@
{ {
"FileVersion" : 3, "FileVersion" : 3,
"FriendlyName" : "Advanced Steam Sessions", "FriendlyName" : "Advanced Steam Sessions",
"Version" : 5.4, "Version" : 4.26,
"VersionName": "5.4", "VersionName": "4.26",
"Description" : "Adds new blueprint functions to handle more advanced session operations in Steam. REQUIRES ADVANCED SESSIONS", "Description" : "Adds new blueprint functions to handle more advanced session operations in Steam. REQUIRES ADVANCED SESSIONS",
"Category" : "Advanced Sessions Plugin", "Category" : "Advanced Sessions Plugin",
"CreatedBy" : "Joshua Statzer", "CreatedBy" : "Joshua Statzer",
"CreatedByURL" : "N/A", "CreatedByURL" : "N/A",
"Modules" : "Modules" :
[ [
{ {
"Name": "AdvancedSteamSessions", "Name" : "AdvancedSteamSessions",
"Type": "RunTime", "Type" : "RunTime",
"LoadingPhase": "PostDefault" "LoadingPhase" : "PreDefault"
} }
], ],
"Plugins": [ "Plugins": [
{ {
"Name": "AdvancedSessions", "Name": "AdvancedSessions",
"Enabled": true "Enabled": true
}, },
{ {
"Name": "OnlineSubsystem", "Name": "OnlineSubsystem",
"Enabled": true "Enabled": true
}, },
{ {
"Name": "OnlineSubsystemSteam", "Name": "OnlineSubsystemUtils",
"Enabled": true "Enabled": true
}, },
{ {
"Name": "OnlineSubsystemUtils", "Name": "OnlineSubsystemSteam",
"Enabled": true "Enabled": true
}, }
{ ]
"Name": "SteamShared",
"Enabled": true
}
]
} }

View File

@@ -1,8 +0,0 @@
[FilterPlugin]
; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and
; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively.
;
; Examples:
; /README.txt
; /Extras/...
; /Binaries/ThirdParty/*.dll

View File

@@ -1,26 +1,22 @@
using UnrealBuildTool; using UnrealBuildTool;
using System.IO; using System.IO;
public class AdvancedSteamSessions : ModuleRules public class AdvancedSteamSessions : ModuleRules
{ {
public AdvancedSteamSessions(ReadOnlyTargetRules Target) : base(Target) public AdvancedSteamSessions(ReadOnlyTargetRules Target) : base(Target)
{ {
DefaultBuildSettings = BuildSettingsVersion.Latest; PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
IncludeOrderVersion = EngineIncludeOrderVersion.Latest; //bEnforceIWYU = true;
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PublicDefinitions.Add("WITH_ADVANCED_STEAM_SESSIONS=1");
//bEnforceIWYU = true;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "OnlineSubsystem", "CoreUObject", "OnlineSubsystemUtils", "Networking", "Sockets", "AdvancedSessions"/*"Voice", "OnlineSubsystemSteam"*/ });
PublicDefinitions.Add("WITH_ADVANCED_STEAM_SESSIONS=1"); PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "Sockets", "Networking", "OnlineSubsystemUtils" /*"Voice", "Steamworks","OnlineSubsystemSteam"*/});
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "OnlineSubsystem", "CoreUObject", "OnlineSubsystemUtils", "Networking", "Sockets", "AdvancedSessions"/*"Voice", "OnlineSubsystemSteam"*/ }); if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Linux) || (Target.Platform == UnrealTargetPlatform.Mac))
PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "Sockets", "Networking", "OnlineSubsystemUtils" /*"Voice", "Steamworks","OnlineSubsystemSteam"*/}); {
PublicDependencyModuleNames.AddRange(new string[] { "Steamworks",/*"Voice",*/ "OnlineSubsystemSteam" });
if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Linux) || (Target.Platform == UnrealTargetPlatform.Mac)) PublicIncludePaths.AddRange(new string[] { "../Plugins/Online/OnlineSubsystemSteam/Source/Private" });// This is dumb but it isn't very open
{ }
PublicDependencyModuleNames.AddRange(new string[] { "SteamShared", "Steamworks", "OnlineSubsystemSteam" }); }
AddEngineThirdPartyPrivateStaticDependencies(Target, "Steamworks");
//PublicIncludePaths.AddRange(new string[] { "../Plugins/Online/OnlineSubsystemSteam/Source/Private" });// This is dumb but it isn't very open
}
}
} }

View File

@@ -1,57 +1,57 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "Online.h" #include "Online.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#include "Interfaces/OnlineFriendsInterface.h" #include "Interfaces/OnlineFriendsInterface.h"
#include "Interfaces/OnlineUserInterface.h" #include "Interfaces/OnlineUserInterface.h"
#include "Interfaces/OnlineMessageInterface.h" #include "Interfaces/OnlineMessageInterface.h"
#include "Interfaces/OnlinePresenceInterface.h" #include "Interfaces/OnlinePresenceInterface.h"
#include "Engine/GameInstance.h" #include "Engine/GameInstance.h"
#include "Interfaces/OnlineSessionInterface.h" #include "Interfaces/OnlineSessionInterface.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "UObject/UObjectIterator.h" #include "UObject/UObjectIterator.h"
// This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro // This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro
// @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just // @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just
// disable the warnings locally. Remove when this is fixed in the SDK // disable the warnings locally. Remove when this is fixed in the SDK
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(push) #pragma warning(push)
#pragma warning(disable:4996) #pragma warning(disable:4996)
// #TODO check back on this at some point // #TODO check back on this at some point
#pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on.... #pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on....
#endif #endif
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
#pragma push_macro("ARRAY_COUNT") #pragma push_macro("ARRAY_COUNT")
#undef ARRAY_COUNT #undef ARRAY_COUNT
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(push)) MSVC_PRAGMA(warning(push))
MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS)) MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#include <steam/steam_api.h> #include <steam/steam_api.h>
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(pop)) MSVC_PRAGMA(warning(pop))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#include <steam/isteamapps.h> #include <steam/isteamapps.h>
#include <steam/isteamapplist.h> #include <steam/isteamapplist.h>
//#include <OnlineSubsystemSteamTypes.h> //#include <OnlineSubsystemSteamTypes.h>
#pragma pop_macro("ARRAY_COUNT") #pragma pop_macro("ARRAY_COUNT")
// @todo Steam: See above // @todo Steam: See above
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(pop) #pragma warning(pop)
#endif #endif
// Making a copy of this here since the original is still in a private folder and is screwing with things // Making a copy of this here since the original is still in a private folder and is screwing with things
/** /**
* Steam specific implementation of the unique net id * Steam specific implementation of the unique net id
*/ */
@@ -194,10 +194,11 @@ public:
} }
} }
/** Needed for TMap::GetTypeHash() */
virtual uint32 GetTypeHash() const override friend uint32 GetTypeHash(const FUniqueNetIdSteam2& A)
{ {
return ::GetTypeHash(UniqueNetId); return GetTypeHash(A.UniqueNetId);
//return (uint32)(A.UniqueNetId) + ((uint32)((A.UniqueNetId) >> 32) * 23);
} }
/** Convenience cast to CSteamID */ /** Convenience cast to CSteamID */
@@ -228,162 +229,159 @@ public:
{ {
return Ar << UserId.UniqueNetId; return Ar << UserId.UniqueNetId;
} }
}; };
#endif #endif
#include "AdvancedSteamFriendsLibrary.generated.h" #include "AdvancedSteamFriendsLibrary.generated.h"
//General Advanced Sessions Log //General Advanced Sessions Log
DECLARE_LOG_CATEGORY_EXTERN(AdvancedSteamFriendsLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedSteamFriendsLog, Log, All);
UENUM(Blueprintable) UENUM(Blueprintable)
enum class SteamAvatarSize : uint8 enum class SteamAvatarSize : uint8
{ {
SteamAvatar_INVALID = 0, SteamAvatar_INVALID = 0,
SteamAvatar_Small = 1, SteamAvatar_Small = 1,
SteamAvatar_Medium = 2, SteamAvatar_Medium = 2,
SteamAvatar_Large = 3 SteamAvatar_Large = 3
}; };
UENUM(Blueprintable) UENUM(Blueprintable)
enum class ESteamUserOverlayType : uint8 enum class ESteamUserOverlayType : uint8
{ {
/*Opens the overlay web browser to the specified user or groups profile.*/ /*Opens the overlay web browser to the specified user or groups profile.*/
steamid, steamid,
/*Opens a chat window to the specified user, or joins the group chat.*/ /*Opens a chat window to the specified user, or joins the group chat.*/
chat, chat,
/*Opens a window to a Steam Trading session that was started with the ISteamEconomy / StartTrade Web API.*/ /*Opens a window to a Steam Trading session that was started with the ISteamEconomy / StartTrade Web API.*/
jointrade, jointrade,
/*Opens the overlay web browser to the specified user's stats.*/ /*Opens the overlay web browser to the specified user's stats.*/
stats, stats,
/*Opens the overlay web browser to the specified user's achievements.*/ /*Opens the overlay web browser to the specified user's achievements.*/
achievements, achievements,
/*Opens the overlay in minimal mode prompting the user to add the target user as a friend.*/ /*Opens the overlay in minimal mode prompting the user to add the target user as a friend.*/
friendadd, friendadd,
/*Opens the overlay in minimal mode prompting the user to remove the target friend.*/ /*Opens the overlay in minimal mode prompting the user to remove the target friend.*/
friendremove, friendremove,
/*Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.*/ /*Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.*/
friendrequestaccept, friendrequestaccept,
/*Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.*/ /*Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.*/
friendrequestignore, friendrequestignore
/*Opens the invite overlay, invitations sent from this dialog will be for the provided lobby*/ };
invitetolobby
}; static FString EnumToString(const FString& enumName, uint8 value)
{
static FString EnumToString(const FString& enumName, uint8 value) const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *enumName, true);
{
if (!EnumPtr)
const UEnum* EnumPtr = FindFirstObject<UEnum>(*enumName, EFindFirstObjectOptions::None, ELogVerbosity::Warning, TEXT("EumtoString")); return FString();
if (!EnumPtr) FString EnumName = EnumPtr->GetNameStringByIndex(value);
return FString(); return EnumName;
}
FString EnumName = EnumPtr->GetNameStringByIndex(value);
return EnumName;
} USTRUCT(BlueprintType, Category = "Online|SteamAPI|SteamGroups")
struct FBPSteamGroupInfo
{
USTRUCT(BlueprintType, Category = "Online|SteamAPI|SteamGroups") GENERATED_USTRUCT_BODY()
struct FBPSteamGroupInfo
{ public:
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
public: FBPUniqueNetId GroupID; // Uint64 representation
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") FString GroupName;
FBPUniqueNetId GroupID; // Uint64 representation UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") FString GroupTag;
FString GroupName; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") int32 numOnline;
FString GroupTag; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") int32 numInGame;
int32 numOnline = 0; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") int32 numChatting;
int32 numInGame = 0;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") };
int32 numChatting = 0;
UENUM(Blueprintable)
}; enum class EBPTextFilteringContext : uint8
{
UENUM(Blueprintable) /*Unknown context.*/
enum class EBPTextFilteringContext : uint8 FContext_Unknown = 0,
{ /*Game content, only legally required filtering is performed.*/
/*Unknown context.*/ FContext_GameContent = 1,
FContext_Unknown = 0, /*Char from another player.*/
/*Game content, only legally required filtering is performed.*/ FContext_Chat = 2,
FContext_GameContent = 1, /*Character or item name.*/
/*Char from another player.*/ FContext_Name = 3
FContext_Chat = 2, };
/*Character or item name.*/
FContext_Name = 3 UCLASS()
}; class UAdvancedSteamFriendsLibrary : public UBlueprintFunctionLibrary
{
UCLASS() GENERATED_BODY()
class UAdvancedSteamFriendsLibrary : public UBlueprintFunctionLibrary public:
{
GENERATED_BODY() //********* Friend List Functions *************//
public:
// Get a texture of a valid friends avatar, STEAM ONLY, Returns invalid texture if the subsystem hasn't loaded that size of avatar yet
//********* Friend List Functions *************// UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI", meta = (ExpandEnumAsExecs = "Result"))
static UTexture2D * GetSteamFriendAvatar(const FBPUniqueNetId UniqueNetId, EBlueprintAsyncResultSwitch &Result, SteamAvatarSize AvatarSize = SteamAvatarSize::SteamAvatar_Medium);
// Get a texture of a valid friends avatar, STEAM ONLY, Returns invalid texture if the subsystem hasn't loaded that size of avatar yet
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI", meta = (ExpandEnumAsExecs = "Result")) // Preloads the avatar and name of a steam friend, return whether it is already available or not, STEAM ONLY, Takes time to actually load everything after this is called.
static UTexture2D * GetSteamFriendAvatar(const FBPUniqueNetId UniqueNetId, EBlueprintAsyncResultSwitch &Result, SteamAvatarSize AvatarSize = SteamAvatarSize::SteamAvatar_Medium); UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI")
static bool RequestSteamFriendInfo(const FBPUniqueNetId UniqueNetId, bool bRequireNameOnly = false);
// Preloads the avatar and name of a steam friend, return whether it is already available or not, STEAM ONLY, Takes time to actually load everything after this is called.
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI") // Opens the steam overlay to go to the specified user dialog
static bool RequestSteamFriendInfo(const FBPUniqueNetId UniqueNetId, bool bRequireNameOnly = false); UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI")
static bool OpenSteamUserOverlay(const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType);
// Opens the steam overlay to go to the specified user dialog
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI", meta = (WorldContext = "WorldContextObject")) // Returns if the steam overlay is currently active (this can return false during initial overlay hooking)
static bool OpenSteamUserOverlay(UObject* WorldContextObject, const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType); UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|SteamAPI")
static bool IsOverlayEnabled();
// Returns if the steam overlay is currently active (this can return false during initial overlay hooking)
UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|SteamAPI") // Gets the level of a friends steam account, STEAM ONLY, Returns -1 if the steam level is not known, might need RequestSteamFriendInfo called first.
static bool IsOverlayEnabled(); UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI")
static int32 GetFriendSteamLevel(const FBPUniqueNetId UniqueNetId);
// Gets the level of a friends steam account, STEAM ONLY, Returns -1 if the steam level is not known, might need RequestSteamFriendInfo called first.
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI") // Gets the persona name of a steam ID, STEAM ONLY, Returns empty if no result, might need RequestSteamFriendInfo called first.
static int32 GetFriendSteamLevel(const FBPUniqueNetId UniqueNetId); UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI")
static FString GetSteamPersonaName(const FBPUniqueNetId UniqueNetId);
// Gets the persona name of a steam ID, STEAM ONLY, Returns empty if no result, might need RequestSteamFriendInfo called first.
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI") // Creates a unique steam id directly from a string holding a uint64 value, useful for testing
static FString GetSteamPersonaName(const FBPUniqueNetId UniqueNetId); UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|SteamAPI")
static FBPUniqueNetId CreateSteamIDFromString(const FString SteamID64);
// Creates a unique steam id directly from a string holding a uint64 value, useful for testing
UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|SteamAPI") // Retreives the local steam ID from steam
static FBPUniqueNetId CreateSteamIDFromString(const FString SteamID64); UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|SteamAPI")
static FBPUniqueNetId GetLocalSteamIDFromSteam();
// Retreives the local steam ID from steam
UFUNCTION(BlueprintPure, Category = "Online|AdvancedFriends|SteamAPI") /* Gets the current game played by a friend - AppID is int32 even though steam ids are uint32, can't be helped in blueprint currently
static FBPUniqueNetId GetLocalSteamIDFromSteam(); * can use the AppID with the WebAPI GetAppList request.
*/
/* Gets the current game played by a friend - AppID is int32 even though steam ids are uint32, can't be helped in blueprint currently UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI", meta = (ExpandEnumAsExecs = "Result"))
* can use the AppID with the WebAPI GetAppList request. static void GetSteamFriendGamePlayed(const FBPUniqueNetId UniqueNetId, EBlueprintResultSwitch &Result/*, FString & GameName*/, int32 & AppID);
*/
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedFriends|SteamAPI", meta = (ExpandEnumAsExecs = "Result")) // Get a full list of steam groups
static void GetSteamFriendGamePlayed(const FBPUniqueNetId UniqueNetId, EBlueprintResultSwitch &Result/*, FString & GameName*/, int32 & AppID); UFUNCTION(BlueprintCallable, Category = "Online|SteamAPI|SteamGroups")
static void GetSteamGroups(TArray<FBPSteamGroupInfo> & SteamGroups);
// Get a full list of steam groups
UFUNCTION(BlueprintCallable, Category = "Online|SteamAPI|SteamGroups") // Initializes text filtering (pre-loading dictonaries)
static void GetSteamGroups(TArray<FBPSteamGroupInfo> & SteamGroups); // Returns if it succeeded, false if filtering is unavailable for the games language
UFUNCTION(BlueprintCallable, Category = "Online|SteamAPI|TextFiltering")
// Initializes text filtering (pre-loading dictonaries) static bool InitTextFiltering();
// Returns if it succeeded, false if filtering is unavailable for the games language
UFUNCTION(BlueprintCallable, Category = "Online|SteamAPI|TextFiltering") // Attempts to filter a string with the given filtering context
static bool InitTextFiltering(); // Returns true if the text has been filtered, false if it hasn't (no filtering required or operation failed)
// If false it will still output the original text
// Attempts to filter a string with the given filtering context // Textsource is the steam id that is the source of the text (player name / chat)
// Returns true if the text has been filtered, false if it hasn't (no filtering required or operation failed) // Requires that InitTextFiltering be called first!!
// If false it will still output the original text UFUNCTION(BlueprintCallable, Category = "Online|SteamAPI|TextFiltering")
// Textsource is the steam id that is the source of the text (player name / chat) static bool FilterText(FString TextToFilter, EBPTextFilteringContext Context, const FBPUniqueNetId TextSourceID, FString& FilteredText);
// Requires that InitTextFiltering be called first!!
UFUNCTION(BlueprintCallable, Category = "Online|SteamAPI|TextFiltering") // Returns if steam is running in big picture mode
static bool FilterText(FString TextToFilter, EBPTextFilteringContext Context, const FBPUniqueNetId TextSourceID, FString& FilteredText); UFUNCTION(BlueprintPure, Category = "Online|SteamAPI")
static bool IsSteamInBigPictureMode();
// Returns if steam is running in big picture mode };
UFUNCTION(BlueprintPure, Category = "Online|SteamAPI")
static bool IsSteamInBigPictureMode();
};

View File

@@ -1,12 +1,12 @@
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Modules/ModuleManager.h" #include "Modules/ModuleManager.h"
class AdvancedSteamSessions : public IModuleInterface class AdvancedSteamSessions : public IModuleInterface
{ {
public: public:
/** IModuleInterface implementation */ /** IModuleInterface implementation */
void StartupModule(); void StartupModule();
void ShutdownModule(); void ShutdownModule();
}; };

View File

@@ -1,351 +1,351 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#pragma once #pragma once
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
#include "Kismet/BlueprintFunctionLibrary.h" #include "Kismet/BlueprintFunctionLibrary.h"
#include "Online.h" #include "Online.h"
#include "OnlineSubsystem.h" #include "OnlineSubsystem.h"
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
#include "steam/isteamugc.h" #include "steam/isteamugc.h"
#include "steam/isteamremotestorage.h" #include "steam/isteamremotestorage.h"
#endif #endif
#include "Interfaces/OnlineSessionInterface.h" #include "Interfaces/OnlineSessionInterface.h"
// @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just // @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just
// disable the warnings locally. Remove when this is fixed in the SDK // disable the warnings locally. Remove when this is fixed in the SDK
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(push) #pragma warning(push)
#pragma warning(disable:4996) #pragma warning(disable:4996)
// #TODO check back on this at some point // #TODO check back on this at some point
#pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on.... #pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on....
#endif #endif
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
#pragma push_macro("ARRAY_COUNT") #pragma push_macro("ARRAY_COUNT")
#undef ARRAY_COUNT #undef ARRAY_COUNT
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(push)) MSVC_PRAGMA(warning(push))
MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS)) MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#include <steam/steam_api.h> #include <steam/steam_api.h>
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(pop)) MSVC_PRAGMA(warning(pop))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#pragma pop_macro("ARRAY_COUNT") #pragma pop_macro("ARRAY_COUNT")
#endif #endif
// @todo Steam: See above // @todo Steam: See above
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(pop) #pragma warning(pop)
#endif #endif
#include "AdvancedSteamWorkshopLibrary.generated.h" #include "AdvancedSteamWorkshopLibrary.generated.h"
//General Advanced Sessions Log //General Advanced Sessions Log
DECLARE_LOG_CATEGORY_EXTERN(AdvancedSteamWorkshopLog, Log, All); DECLARE_LOG_CATEGORY_EXTERN(AdvancedSteamWorkshopLog, Log, All);
// Using a custom struct because uint32 isn't blueprint supported and I don't want to cast to int32 // Using a custom struct because uint32 isn't blueprint supported and I don't want to cast to int32
// due to the size of the workshop it could end up overflowing? // due to the size of the workshop it could end up overflowing?
USTRUCT(BlueprintType) USTRUCT(BlueprintType)
struct FBPSteamWorkshopID struct FBPSteamWorkshopID
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
public: public:
uint64 SteamWorkshopID; uint64 SteamWorkshopID;
FBPSteamWorkshopID() FBPSteamWorkshopID()
{ {
} }
FBPSteamWorkshopID(uint64 ID) FBPSteamWorkshopID(uint64 ID)
{ {
SteamWorkshopID = ID; SteamWorkshopID = ID;
} }
}; };
// General result codes - Copying steams version over // General result codes - Copying steams version over
// Check these to future proof // Check these to future proof
UENUM(BlueprintType) UENUM(BlueprintType)
enum class FBPSteamResult : uint8 enum class FBPSteamResult : uint8
{ {
K_EResultInvalid = 0, K_EResultInvalid = 0,
k_EResultOK = 1, // success k_EResultOK = 1, // success
k_EResultFail = 2, // generic failure k_EResultFail = 2, // generic failure
k_EResultNoConnection = 3, // no/failed network connection k_EResultNoConnection = 3, // no/failed network connection
// k_EResultNoConnectionRetry = 4, // OBSOLETE - removed // k_EResultNoConnectionRetry = 4, // OBSOLETE - removed
k_EResultInvalidPassword = 5, // password/ticket is invalid k_EResultInvalidPassword = 5, // password/ticket is invalid
k_EResultLoggedInElsewhere = 6, // same user logged in elsewhere k_EResultLoggedInElsewhere = 6, // same user logged in elsewhere
k_EResultInvalidProtocolVer = 7, // protocol version is incorrect k_EResultInvalidProtocolVer = 7, // protocol version is incorrect
k_EResultInvalidParam = 8, // a parameter is incorrect k_EResultInvalidParam = 8, // a parameter is incorrect
k_EResultFileNotFound = 9, // file was not found k_EResultFileNotFound = 9, // file was not found
k_EResultBusy = 10, // called method busy - action not taken k_EResultBusy = 10, // called method busy - action not taken
k_EResultInvalidState = 11, // called object was in an invalid state k_EResultInvalidState = 11, // called object was in an invalid state
k_EResultInvalidName = 12, // name is invalid k_EResultInvalidName = 12, // name is invalid
k_EResultInvalidEmail = 13, // email is invalid k_EResultInvalidEmail = 13, // email is invalid
k_EResultDuplicateName = 14, // name is not unique k_EResultDuplicateName = 14, // name is not unique
k_EResultAccessDenied = 15, // access is denied k_EResultAccessDenied = 15, // access is denied
k_EResultTimeout = 16, // operation timed out k_EResultTimeout = 16, // operation timed out
k_EResultBanned = 17, // VAC2 banned k_EResultBanned = 17, // VAC2 banned
k_EResultAccountNotFound = 18, // account not found k_EResultAccountNotFound = 18, // account not found
k_EResultInvalidSteamID = 19, // steamID is invalid k_EResultInvalidSteamID = 19, // steamID is invalid
k_EResultServiceUnavailable = 20, // The requested service is currently unavailable k_EResultServiceUnavailable = 20, // The requested service is currently unavailable
k_EResultNotLoggedOn = 21, // The user is not logged on k_EResultNotLoggedOn = 21, // The user is not logged on
k_EResultPending = 22, // Request is pending (may be in process, or waiting on third party) k_EResultPending = 22, // Request is pending (may be in process, or waiting on third party)
k_EResultEncryptionFailure = 23, // Encryption or Decryption failed k_EResultEncryptionFailure = 23, // Encryption or Decryption failed
k_EResultInsufficientPrivilege = 24, // Insufficient privilege k_EResultInsufficientPrivilege = 24, // Insufficient privilege
k_EResultLimitExceeded = 25, // Too much of a good thing k_EResultLimitExceeded = 25, // Too much of a good thing
k_EResultRevoked = 26, // Access has been revoked (used for revoked guest passes) k_EResultRevoked = 26, // Access has been revoked (used for revoked guest passes)
k_EResultExpired = 27, // License/Guest pass the user is trying to access is expired k_EResultExpired = 27, // License/Guest pass the user is trying to access is expired
k_EResultAlreadyRedeemed = 28, // Guest pass has already been redeemed by account, cannot be acked again k_EResultAlreadyRedeemed = 28, // Guest pass has already been redeemed by account, cannot be acked again
k_EResultDuplicateRequest = 29, // The request is a duplicate and the action has already occurred in the past, ignored this time k_EResultDuplicateRequest = 29, // The request is a duplicate and the action has already occurred in the past, ignored this time
k_EResultAlreadyOwned = 30, // All the games in this guest pass redemption request are already owned by the user k_EResultAlreadyOwned = 30, // All the games in this guest pass redemption request are already owned by the user
k_EResultIPNotFound = 31, // IP address not found k_EResultIPNotFound = 31, // IP address not found
k_EResultPersistFailed = 32, // failed to write change to the data store k_EResultPersistFailed = 32, // failed to write change to the data store
k_EResultLockingFailed = 33, // failed to acquire access lock for this operation k_EResultLockingFailed = 33, // failed to acquire access lock for this operation
k_EResultLogonSessionReplaced = 34, k_EResultLogonSessionReplaced = 34,
k_EResultConnectFailed = 35, k_EResultConnectFailed = 35,
k_EResultHandshakeFailed = 36, k_EResultHandshakeFailed = 36,
k_EResultIOFailure = 37, k_EResultIOFailure = 37,
k_EResultRemoteDisconnect = 38, k_EResultRemoteDisconnect = 38,
k_EResultShoppingCartNotFound = 39, // failed to find the shopping cart requested k_EResultShoppingCartNotFound = 39, // failed to find the shopping cart requested
k_EResultBlocked = 40, // a user didn't allow it k_EResultBlocked = 40, // a user didn't allow it
k_EResultIgnored = 41, // target is ignoring sender k_EResultIgnored = 41, // target is ignoring sender
k_EResultNoMatch = 42, // nothing matching the request found k_EResultNoMatch = 42, // nothing matching the request found
k_EResultAccountDisabled = 43, k_EResultAccountDisabled = 43,
k_EResultServiceReadOnly = 44, // this service is not accepting content changes right now k_EResultServiceReadOnly = 44, // this service is not accepting content changes right now
k_EResultAccountNotFeatured = 45, // account doesn't have value, so this feature isn't available k_EResultAccountNotFeatured = 45, // account doesn't have value, so this feature isn't available
k_EResultAdministratorOK = 46, // allowed to take this action, but only because requester is admin k_EResultAdministratorOK = 46, // allowed to take this action, but only because requester is admin
k_EResultContentVersion = 47, // A Version mismatch in content transmitted within the Steam protocol. k_EResultContentVersion = 47, // A Version mismatch in content transmitted within the Steam protocol.
k_EResultTryAnotherCM = 48, // The current CM can't service the user making a request, user should try another. k_EResultTryAnotherCM = 48, // The current CM can't service the user making a request, user should try another.
k_EResultPasswordRequiredToKickSession = 49,// You are already logged in elsewhere, this cached credential login has failed. k_EResultPasswordRequiredToKickSession = 49,// You are already logged in elsewhere, this cached credential login has failed.
k_EResultAlreadyLoggedInElsewhere = 50, // You are already logged in elsewhere, you must wait k_EResultAlreadyLoggedInElsewhere = 50, // You are already logged in elsewhere, you must wait
k_EResultSuspended = 51, // Long running operation (content download) suspended/paused k_EResultSuspended = 51, // Long running operation (content download) suspended/paused
k_EResultCancelled = 52, // Operation canceled (typically by user: content download) k_EResultCancelled = 52, // Operation canceled (typically by user: content download)
k_EResultDataCorruption = 53, // Operation canceled because data is ill formed or unrecoverable k_EResultDataCorruption = 53, // Operation canceled because data is ill formed or unrecoverable
k_EResultDiskFull = 54, // Operation canceled - not enough disk space. k_EResultDiskFull = 54, // Operation canceled - not enough disk space.
k_EResultRemoteCallFailed = 55, // an remote call or IPC call failed k_EResultRemoteCallFailed = 55, // an remote call or IPC call failed
k_EResultPasswordUnset = 56, // Password could not be verified as it's unset server side k_EResultPasswordUnset = 56, // Password could not be verified as it's unset server side
k_EResultExternalAccountUnlinked = 57, // External account (PSN, Facebook...) is not linked to a Steam account k_EResultExternalAccountUnlinked = 57, // External account (PSN, Facebook...) is not linked to a Steam account
k_EResultPSNTicketInvalid = 58, // PSN ticket was invalid k_EResultPSNTicketInvalid = 58, // PSN ticket was invalid
k_EResultExternalAccountAlreadyLinked = 59, // External account (PSN, Facebook...) is already linked to some other account, must explicitly request to replace/delete the link first k_EResultExternalAccountAlreadyLinked = 59, // External account (PSN, Facebook...) is already linked to some other account, must explicitly request to replace/delete the link first
k_EResultRemoteFileConflict = 60, // The sync cannot resume due to a conflict between the local and remote files k_EResultRemoteFileConflict = 60, // The sync cannot resume due to a conflict between the local and remote files
k_EResultIllegalPassword = 61, // The requested new password is not legal k_EResultIllegalPassword = 61, // The requested new password is not legal
k_EResultSameAsPreviousValue = 62, // new value is the same as the old one ( secret question and answer ) k_EResultSameAsPreviousValue = 62, // new value is the same as the old one ( secret question and answer )
k_EResultAccountLogonDenied = 63, // account login denied due to 2nd factor authentication failure k_EResultAccountLogonDenied = 63, // account login denied due to 2nd factor authentication failure
k_EResultCannotUseOldPassword = 64, // The requested new password is not legal k_EResultCannotUseOldPassword = 64, // The requested new password is not legal
k_EResultInvalidLoginAuthCode = 65, // account login denied due to auth code invalid k_EResultInvalidLoginAuthCode = 65, // account login denied due to auth code invalid
k_EResultAccountLogonDeniedNoMail = 66, // account login denied due to 2nd factor auth failure - and no mail has been sent k_EResultAccountLogonDeniedNoMail = 66, // account login denied due to 2nd factor auth failure - and no mail has been sent
k_EResultHardwareNotCapableOfIPT = 67, // k_EResultHardwareNotCapableOfIPT = 67, //
k_EResultIPTInitError = 68, // k_EResultIPTInitError = 68, //
k_EResultParentalControlRestricted = 69, // operation failed due to parental control restrictions for current user k_EResultParentalControlRestricted = 69, // operation failed due to parental control restrictions for current user
k_EResultFacebookQueryError = 70, // Facebook query returned an error k_EResultFacebookQueryError = 70, // Facebook query returned an error
k_EResultExpiredLoginAuthCode = 71, // account login denied due to auth code expired k_EResultExpiredLoginAuthCode = 71, // account login denied due to auth code expired
k_EResultIPLoginRestrictionFailed = 72, k_EResultIPLoginRestrictionFailed = 72,
k_EResultAccountLockedDown = 73, k_EResultAccountLockedDown = 73,
k_EResultAccountLogonDeniedVerifiedEmailRequired = 74, k_EResultAccountLogonDeniedVerifiedEmailRequired = 74,
k_EResultNoMatchingURL = 75, k_EResultNoMatchingURL = 75,
k_EResultBadResponse = 76, // parse failure, missing field, etc. k_EResultBadResponse = 76, // parse failure, missing field, etc.
k_EResultRequirePasswordReEntry = 77, // The user cannot complete the action until they re-enter their password k_EResultRequirePasswordReEntry = 77, // The user cannot complete the action until they re-enter their password
k_EResultValueOutOfRange = 78, // the value entered is outside the acceptable range k_EResultValueOutOfRange = 78, // the value entered is outside the acceptable range
k_EResultUnexpectedError = 79, // something happened that we didn't expect to ever happen k_EResultUnexpectedError = 79, // something happened that we didn't expect to ever happen
k_EResultDisabled = 80, // The requested service has been configured to be unavailable k_EResultDisabled = 80, // The requested service has been configured to be unavailable
k_EResultInvalidCEGSubmission = 81, // The set of files submitted to the CEG server are not valid ! k_EResultInvalidCEGSubmission = 81, // The set of files submitted to the CEG server are not valid !
k_EResultRestrictedDevice = 82, // The device being used is not allowed to perform this action k_EResultRestrictedDevice = 82, // The device being used is not allowed to perform this action
k_EResultRegionLocked = 83, // The action could not be complete because it is region restricted k_EResultRegionLocked = 83, // The action could not be complete because it is region restricted
k_EResultRateLimitExceeded = 84, // Temporary rate limit exceeded, try again later, different from k_EResultLimitExceeded which may be permanent k_EResultRateLimitExceeded = 84, // Temporary rate limit exceeded, try again later, different from k_EResultLimitExceeded which may be permanent
k_EResultAccountLoginDeniedNeedTwoFactor = 85, // Need two-factor code to login k_EResultAccountLoginDeniedNeedTwoFactor = 85, // Need two-factor code to login
k_EResultItemDeleted = 86, // The thing we're trying to access has been deleted k_EResultItemDeleted = 86, // The thing we're trying to access has been deleted
k_EResultAccountLoginDeniedThrottle = 87, // login attempt failed, try to throttle response to possible attacker k_EResultAccountLoginDeniedThrottle = 87, // login attempt failed, try to throttle response to possible attacker
k_EResultTwoFactorCodeMismatch = 88, // two factor code mismatch k_EResultTwoFactorCodeMismatch = 88, // two factor code mismatch
k_EResultTwoFactorActivationCodeMismatch = 89, // activation code for two-factor didn't match k_EResultTwoFactorActivationCodeMismatch = 89, // activation code for two-factor didn't match
k_EResultAccountAssociatedToMultiplePartners = 90, // account has been associated with multiple partners k_EResultAccountAssociatedToMultiplePartners = 90, // account has been associated with multiple partners
k_EResultNotModified = 91, // data not modified k_EResultNotModified = 91, // data not modified
}; };
// Check these to future proof // Check these to future proof
UENUM(BlueprintType) UENUM(BlueprintType)
enum class FBPWorkshopFileType : uint8 enum class FBPWorkshopFileType : uint8
{ {
k_EWorkshopFileTypeCommunity = 0, k_EWorkshopFileTypeCommunity = 0,
k_EWorkshopFileTypeMicrotransaction = 1, k_EWorkshopFileTypeMicrotransaction = 1,
k_EWorkshopFileTypeCollection = 2, k_EWorkshopFileTypeCollection = 2,
k_EWorkshopFileTypeArt = 3, k_EWorkshopFileTypeArt = 3,
k_EWorkshopFileTypeVideo = 4, k_EWorkshopFileTypeVideo = 4,
k_EWorkshopFileTypeScreenshot = 5, k_EWorkshopFileTypeScreenshot = 5,
k_EWorkshopFileTypeGame = 6, k_EWorkshopFileTypeGame = 6,
k_EWorkshopFileTypeSoftware = 7, k_EWorkshopFileTypeSoftware = 7,
k_EWorkshopFileTypeConcept = 8, k_EWorkshopFileTypeConcept = 8,
k_EWorkshopFileTypeWebGuide = 9, k_EWorkshopFileTypeWebGuide = 9,
k_EWorkshopFileTypeIntegratedGuide = 10, k_EWorkshopFileTypeIntegratedGuide = 10,
k_EWorkshopFileTypeMerch = 11, k_EWorkshopFileTypeMerch = 11,
k_EWorkshopFileTypeControllerBinding = 12, k_EWorkshopFileTypeControllerBinding = 12,
k_EWorkshopFileTypeSteamworksAccessInvite = 13, k_EWorkshopFileTypeSteamworksAccessInvite = 13,
k_EWorkshopFileTypeSteamVideo = 14, k_EWorkshopFileTypeSteamVideo = 14,
// Update k_EWorkshopFileTypeMax if you add values. // Update k_EWorkshopFileTypeMax if you add values.
k_EWorkshopFileTypeMax = 15 k_EWorkshopFileTypeMax = 15
}; };
// WorkshopItemDetails Struct // WorkshopItemDetails Struct
USTRUCT(BlueprintType) USTRUCT(BlueprintType)
struct FBPSteamWorkshopItemDetails struct FBPSteamWorkshopItemDetails
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
public: public:
FBPSteamWorkshopItemDetails() FBPSteamWorkshopItemDetails()
{ {
ResultOfRequest = FBPSteamResult::k_EResultOK; ResultOfRequest = FBPSteamResult::k_EResultOK;
FileType = FBPWorkshopFileType::k_EWorkshopFileTypeMax; FileType = FBPWorkshopFileType::k_EWorkshopFileTypeMax;
CreatorAppID = 0; CreatorAppID = 0;
ConsumerAppID = 0; ConsumerAppID = 0;
VotesUp = 0; VotesUp = 0;
VotesDown = 0; VotesDown = 0;
CalculatedScore = 0.f; CalculatedScore = 0.f;
bBanned = false; bBanned = false;
bAcceptedForUse = false; bAcceptedForUse = false;
bTagsTruncated = false; bTagsTruncated = false;
} }
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
FBPSteamWorkshopItemDetails(SteamUGCDetails_t &hUGCDetails) FBPSteamWorkshopItemDetails(SteamUGCDetails_t &hUGCDetails)
{ {
ResultOfRequest = (FBPSteamResult)hUGCDetails.m_eResult; ResultOfRequest = (FBPSteamResult)hUGCDetails.m_eResult;
FileType = (FBPWorkshopFileType)hUGCDetails.m_eFileType; FileType = (FBPWorkshopFileType)hUGCDetails.m_eFileType;
CreatorAppID = (int32)hUGCDetails.m_nCreatorAppID; CreatorAppID = (int32)hUGCDetails.m_nCreatorAppID;
ConsumerAppID = (int32)hUGCDetails.m_nConsumerAppID; ConsumerAppID = (int32)hUGCDetails.m_nConsumerAppID;
Title = FString(hUGCDetails.m_rgchTitle, k_cchPublishedDocumentTitleMax); Title = FString(hUGCDetails.m_rgchTitle, k_cchPublishedDocumentTitleMax);
Description = FString(hUGCDetails.m_rgchDescription, k_cchPublishedDocumentDescriptionMax); Description = FString(hUGCDetails.m_rgchDescription, k_cchPublishedDocumentDescriptionMax);
ItemUrl = FString(hUGCDetails.m_rgchURL, k_cchPublishedFileURLMax); ItemUrl = FString(hUGCDetails.m_rgchURL, k_cchPublishedFileURLMax);
VotesUp = (int32)hUGCDetails.m_unVotesUp; VotesUp = (int32)hUGCDetails.m_unVotesUp;
VotesDown = (int32)hUGCDetails.m_unVotesDown; VotesDown = (int32)hUGCDetails.m_unVotesDown;
CalculatedScore = hUGCDetails.m_flScore; CalculatedScore = hUGCDetails.m_flScore;
bBanned = hUGCDetails.m_bBanned; bBanned = hUGCDetails.m_bBanned;
bAcceptedForUse = hUGCDetails.m_bAcceptedForUse; bAcceptedForUse = hUGCDetails.m_bAcceptedForUse;
bTagsTruncated = hUGCDetails.m_bTagsTruncated; bTagsTruncated = hUGCDetails.m_bTagsTruncated;
CreatorSteamID = FString::Printf(TEXT("%llu"), hUGCDetails.m_ulSteamIDOwner); CreatorSteamID = FString::Printf(TEXT("%llu"), hUGCDetails.m_ulSteamIDOwner);
} }
FBPSteamWorkshopItemDetails(const SteamUGCDetails_t &hUGCDetails) FBPSteamWorkshopItemDetails(const SteamUGCDetails_t &hUGCDetails)
{ {
ResultOfRequest = (FBPSteamResult)hUGCDetails.m_eResult; ResultOfRequest = (FBPSteamResult)hUGCDetails.m_eResult;
FileType = (FBPWorkshopFileType)hUGCDetails.m_eFileType; FileType = (FBPWorkshopFileType)hUGCDetails.m_eFileType;
CreatorAppID = (int32)hUGCDetails.m_nCreatorAppID; CreatorAppID = (int32)hUGCDetails.m_nCreatorAppID;
ConsumerAppID = (int32)hUGCDetails.m_nConsumerAppID; ConsumerAppID = (int32)hUGCDetails.m_nConsumerAppID;
Title = FString(hUGCDetails.m_rgchTitle, k_cchPublishedDocumentTitleMax); Title = FString(hUGCDetails.m_rgchTitle, k_cchPublishedDocumentTitleMax);
Description = FString(hUGCDetails.m_rgchDescription, k_cchPublishedDocumentDescriptionMax); Description = FString(hUGCDetails.m_rgchDescription, k_cchPublishedDocumentDescriptionMax);
ItemUrl = FString(hUGCDetails.m_rgchURL, k_cchPublishedFileURLMax); ItemUrl = FString(hUGCDetails.m_rgchURL, k_cchPublishedFileURLMax);
VotesUp = (int32)hUGCDetails.m_unVotesUp; VotesUp = (int32)hUGCDetails.m_unVotesUp;
VotesDown = (int32)hUGCDetails.m_unVotesDown; VotesDown = (int32)hUGCDetails.m_unVotesDown;
CalculatedScore = hUGCDetails.m_flScore; CalculatedScore = hUGCDetails.m_flScore;
bBanned = hUGCDetails.m_bBanned; bBanned = hUGCDetails.m_bBanned;
bAcceptedForUse = hUGCDetails.m_bAcceptedForUse; bAcceptedForUse = hUGCDetails.m_bAcceptedForUse;
bTagsTruncated = hUGCDetails.m_bTagsTruncated; bTagsTruncated = hUGCDetails.m_bTagsTruncated;
CreatorSteamID = FString::Printf(TEXT("%llu"), hUGCDetails.m_ulSteamIDOwner); CreatorSteamID = FString::Printf(TEXT("%llu"), hUGCDetails.m_ulSteamIDOwner);
} }
#endif #endif
// Result of obtaining the details // Result of obtaining the details
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
FBPSteamResult ResultOfRequest; FBPSteamResult ResultOfRequest;
// Type of file // Type of file
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
FBPWorkshopFileType FileType; FBPWorkshopFileType FileType;
// These two are listed as baked to an int, but is stored as a uint, think its safe to keep int // These two are listed as baked to an int, but is stored as a uint, think its safe to keep int
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
int32 CreatorAppID; int32 CreatorAppID;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
int32 ConsumerAppID; int32 ConsumerAppID;
// Title of item // Title of item
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
FString Title; FString Title;
// Description of item // Description of item
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
FString Description; FString Description;
//Url for a video of website //Url for a video of website
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
FString ItemUrl; FString ItemUrl;
// Votes will be unlikely to go above signed limited // Votes will be unlikely to go above signed limited
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
int32 VotesUp; int32 VotesUp;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
int32 VotesDown; int32 VotesDown;
// Calculated score // Calculated score
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
float CalculatedScore; float CalculatedScore;
// whether the file was banned // whether the file was banned
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
bool bBanned; bool bBanned;
// developer has specifically flagged this item as accepted in the Workshop // developer has specifically flagged this item as accepted in the Workshop
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
bool bAcceptedForUse; bool bAcceptedForUse;
// whether the list of tags was too long to be returned in the provided buffer // whether the list of tags was too long to be returned in the provided buffer
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
bool bTagsTruncated; bool bTagsTruncated;
// Steam ID of the user who created this content. // Steam ID of the user who created this content.
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|AdvancedSteamWorkshop")
FString CreatorSteamID; FString CreatorSteamID;
/* /*
PublishedFileId_t m_nPublishedFileId; PublishedFileId_t m_nPublishedFileId;
uint32 m_rtimeCreated; // time when the published file was created uint32 m_rtimeCreated; // time when the published file was created
uint32 m_rtimeUpdated; // time when the published file was last updated uint32 m_rtimeUpdated; // time when the published file was last updated
uint32 m_rtimeAddedToUserList; // time when the user added the published file to their list (not always applicable) uint32 m_rtimeAddedToUserList; // time when the user added the published file to their list (not always applicable)
ERemoteStoragePublishedFileVisibility m_eVisibility; // visibility ERemoteStoragePublishedFileVisibility m_eVisibility; // visibility
char m_rgchTags[k_cchTagListMax]; // comma separated list of all tags associated with this file char m_rgchTags[k_cchTagListMax]; // comma separated list of all tags associated with this file
// file/url information // file/url information
UGCHandle_t m_hFile; // The handle of the primary file UGCHandle_t m_hFile; // The handle of the primary file
UGCHandle_t m_hPreviewFile; // The handle of the preview file UGCHandle_t m_hPreviewFile; // The handle of the preview file
char m_pchFileName[k_cchFilenameMax]; // The cloud filename of the primary file char m_pchFileName[k_cchFilenameMax]; // The cloud filename of the primary file
int32 m_nFileSize; // Size of the primary file int32 m_nFileSize; // Size of the primary file
int32 m_nPreviewFileSize; // Size of the preview file int32 m_nPreviewFileSize; // Size of the preview file
uint32 m_unNumChildren; // if m_eFileType == k_EWorkshopFileTypeCollection, then this number will be the number of children contained within the collection uint32 m_unNumChildren; // if m_eFileType == k_EWorkshopFileTypeCollection, then this number will be the number of children contained within the collection
*/ */
}; };
UCLASS() UCLASS()
class UAdvancedSteamWorkshopLibrary : public UBlueprintFunctionLibrary class UAdvancedSteamWorkshopLibrary : public UBlueprintFunctionLibrary
{ {
GENERATED_BODY() GENERATED_BODY()
public: public:
//********* Steam Functions *************// //********* Steam Functions *************//
// Returns IDs for subscribed workshop items, TArray length dictates how many // Returns IDs for subscribed workshop items, TArray length dictates how many
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedSteamWorkshop") UFUNCTION(BlueprintCallable, Category = "Online|AdvancedSteamWorkshop")
static TArray<FBPSteamWorkshopID> GetSubscribedWorkshopItems(int32 & NumberOfItems); static TArray<FBPSteamWorkshopID> GetSubscribedWorkshopItems(int32 & NumberOfItems);
UFUNCTION(BlueprintCallable, Category = "Online|AdvancedSteamWorkshop") UFUNCTION(BlueprintCallable, Category = "Online|AdvancedSteamWorkshop")
static void GetNumSubscribedWorkshopItems(int32 & NumberOfItems); static void GetNumSubscribedWorkshopItems(int32 & NumberOfItems);
}; };

View File

@@ -1,101 +0,0 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
#include <steam/steam_api.h>
#endif
#include "SteamNotificationsSubsystem.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSteamOverlayActivated, bool, bOverlayState);
UCLASS()
class ADVANCEDSTEAMSESSIONS_API USteamNotificationsSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
// Event thrown when the steam overlay switches states
UPROPERTY(BlueprintAssignable, Category = "SteamEvents")
FOnSteamOverlayActivated OnSteamOverlayActivated_Bind;
USteamNotificationsSubsystem() : Super()
{
}
class cSteamEventsStore
{
public:
USteamNotificationsSubsystem* ParentSubsystem = nullptr;
void Initialize(USteamNotificationsSubsystem* MyParent)
{
ParentSubsystem = MyParent;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
OnExternalUITriggeredCallback.Register(this, &USteamNotificationsSubsystem::cSteamEventsStore::OnExternalUITriggered);
#endif
}
void UnInitialize(USteamNotificationsSubsystem* MyParent)
{
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
OnExternalUITriggeredCallback.Unregister();
#endif
}
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
cSteamEventsStore()
{}
//:
/*OnExternalUITriggeredCallback(this, &cSteamEventsStore::OnExternalUITriggered)
{
}*/
#else
//cSteamEventsStore()
//{
//}
#endif
//~cSteamEventsStore(){}
private:
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
//STEAM_CALLBACK(cSteamEventsStore, OnExternalUITriggered, GameOverlayActivated_t, OnExternalUITriggeredCallback);
STEAM_CALLBACK_MANUAL(cSteamEventsStore, OnExternalUITriggered, GameOverlayActivated_t, OnExternalUITriggeredCallback);
#endif
};
cSteamEventsStore MyEvents;
/** Implement this for initialization of instances of the system */
virtual void Initialize(FSubsystemCollectionBase& Collection) override
{
MyEvents.Initialize(this);
}
/** Implement this for deinitialization of instances of the system */
virtual void Deinitialize() override
{
MyEvents.UnInitialize(this);
}
};
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
void USteamNotificationsSubsystem::cSteamEventsStore::OnExternalUITriggered(GameOverlayActivated_t* CallbackData)
{
if (ParentSubsystem)
{
ParentSubsystem->OnSteamOverlayActivated_Bind.Broadcast((bool)CallbackData->m_bActive);
}
}
#endif

View File

@@ -4,59 +4,59 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
// This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro // This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro
// @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just // @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just
// disable the warnings locally. Remove when this is fixed in the SDK // disable the warnings locally. Remove when this is fixed in the SDK
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(push) #pragma warning(push)
#pragma warning(disable:4996) #pragma warning(disable:4996)
// #TODO check back on this at some point // #TODO check back on this at some point
#pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on.... #pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on....
#endif #endif
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
//#include "OnlineSubsystemSteam.h" #include "OnlineSubsystemSteam.h"
#pragma push_macro("ARRAY_COUNT") #pragma push_macro("ARRAY_COUNT")
#undef ARRAY_COUNT #undef ARRAY_COUNT
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(push)) MSVC_PRAGMA(warning(push))
MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS)) MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#include <steam/steam_api.h> #include <steam/steam_api.h>
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(pop)) MSVC_PRAGMA(warning(pop))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#pragma pop_macro("ARRAY_COUNT") #pragma pop_macro("ARRAY_COUNT")
#endif #endif
// @todo Steam: See above // @todo Steam: See above
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(pop) #pragma warning(pop)
#endif #endif
#include "SteamRequestGroupOfficersCallbackProxy.generated.h" #include "SteamRequestGroupOfficersCallbackProxy.generated.h"
USTRUCT(BlueprintType, Category = "Online|SteamAPI|SteamGroups") USTRUCT(BlueprintType, Category = "Online|SteamAPI|SteamGroups")
struct FBPSteamGroupOfficer struct FBPSteamGroupOfficer
{ {
GENERATED_USTRUCT_BODY() GENERATED_USTRUCT_BODY()
public: public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
FBPUniqueNetId OfficerUniqueNetID; // Uint64 representation FBPUniqueNetId OfficerUniqueNetID; // Uint64 representation
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups") UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
bool bIsOwner = false; bool bIsOwner;
}; };
@@ -87,8 +87,8 @@ class USteamRequestGroupOfficersCallbackProxy : public UOnlineBlueprintCallProxy
private: private:
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
void OnRequestGroupOfficerDetails( ClanOfficerListResponse_t *pResult, bool bIOFailure); void OnRequestGroupOfficerDetails( ClanOfficerListResponse_t *pResult, bool bIOFailure);
CCallResult<USteamRequestGroupOfficersCallbackProxy, ClanOfficerListResponse_t> m_callResultGroupOfficerRequestDetails; CCallResult<USteamRequestGroupOfficersCallbackProxy, ClanOfficerListResponse_t> m_callResultGroupOfficerRequestDetails;
#endif #endif
@@ -97,4 +97,4 @@ private:
FBPUniqueNetId GroupUniqueID; FBPUniqueNetId GroupUniqueID;
UObject* WorldContextObject; UObject* WorldContextObject;
}; };

View File

@@ -5,43 +5,43 @@
#include "AdvancedSteamWorkshopLibrary.h" #include "AdvancedSteamWorkshopLibrary.h"
#include "BlueprintDataDefinitions.h" #include "BlueprintDataDefinitions.h"
// This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro // This is taken directly from UE4 - OnlineSubsystemSteamPrivatePCH.h as a fix for the array_count macro
// @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just // @todo Steam: Steam headers trigger secure-C-runtime warnings in Visual C++. Rather than mess with _CRT_SECURE_NO_WARNINGS, we'll just
// disable the warnings locally. Remove when this is fixed in the SDK // disable the warnings locally. Remove when this is fixed in the SDK
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(push) #pragma warning(push)
#pragma warning(disable:4996) #pragma warning(disable:4996)
// #TODO check back on this at some point // #TODO check back on this at some point
#pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on.... #pragma warning(disable:4265) // SteamAPI CCallback< specifically, this warning is off by default but 4.17 turned it on....
#endif #endif
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
//#include "OnlineSubsystemSteam.h" #include "OnlineSubsystemSteam.h"
#pragma push_macro("ARRAY_COUNT") #pragma push_macro("ARRAY_COUNT")
#undef ARRAY_COUNT #undef ARRAY_COUNT
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(push)) MSVC_PRAGMA(warning(push))
MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS)) MSVC_PRAGMA(warning(disable : ALL_CODE_ANALYSIS_WARNINGS))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#include <steam/steam_api.h> #include <steam/steam_api.h>
#if USING_CODE_ANALYSIS #if USING_CODE_ANALYSIS
MSVC_PRAGMA(warning(pop)) MSVC_PRAGMA(warning(pop))
#endif // USING_CODE_ANALYSIS #endif // USING_CODE_ANALYSIS
#pragma pop_macro("ARRAY_COUNT") #pragma pop_macro("ARRAY_COUNT")
#endif #endif
// @todo Steam: See above // @todo Steam: See above
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma warning(pop) #pragma warning(pop)
#endif #endif
@@ -72,10 +72,10 @@ class USteamWSRequestUGCDetailsCallbackProxy : public UOnlineBlueprintCallProxyB
private: private:
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
// Internal callback when the operation completes, calls out to the public success/failure callbacks // Internal callback when the operation completes, calls out to the public success/failure callbacks
void OnUGCRequestUGCDetails(SteamUGCQueryCompleted_t *pResult, bool bIOFailure); void OnUGCRequestUGCDetails(SteamUGCQueryCompleted_t *pResult, bool bIOFailure);
CCallResult<USteamWSRequestUGCDetailsCallbackProxy, SteamUGCQueryCompleted_t> m_callResultUGCRequestDetails; CCallResult<USteamWSRequestUGCDetailsCallbackProxy, SteamUGCQueryCompleted_t> m_callResultUGCRequestDetails;
#endif #endif

View File

@@ -1,454 +1,428 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedSteamFriendsLibrary.h" #include "AdvancedSteamFriendsLibrary.h"
#include "OnlineSubSystemHeader.h" #include "OnlineSubSystemHeader.h"
#include "OnlineSubsystemTypes.h"
#include "Engine/Texture.h" //General Log
#include "Engine/Texture2D.h" DEFINE_LOG_CATEGORY(AdvancedSteamFriendsLog);
#include "TextureResource.h"
#include "PixelFormat.h"
// Clan functions, add in soon
//General Log /*int32 UAdvancedSteamFriendsLibrary::GetFriendSteamLevel(const FBPUniqueNetId UniqueNetId)
DEFINE_LOG_CATEGORY(AdvancedSteamFriendsLog); {
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
// Clan functions, add in soon if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
/*int32 UAdvancedSteamFriendsLibrary::GetFriendSteamLevel(const FBPUniqueNetId UniqueNetId) {
{ UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("IsAFriend Had a bad UniqueNetId!"));
return 0;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
{ if (SteamAPI_Init())
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("IsAFriend Had a bad UniqueNetId!")); {
return 0; uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
}
if (SteamAPI_Init()) // clan (group) iteration and access functions
{ //virtual int GetClanCount() = 0;
uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes()); //virtual CSteamID GetClanByIndex(int iClan) = 0;
//virtual const char *GetClanName(CSteamID steamIDClan) = 0;
//virtual const char *GetClanTag(CSteamID steamIDClan) = 0;
// clan (group) iteration and access functions // returns the most recent information we have about what's happening in a clan
//virtual int GetClanCount() = 0; //virtual bool GetClanActivityCounts(CSteamID steamIDClan, int *pnOnline, int *pnInGame, int *pnChatting) = 0;
//virtual CSteamID GetClanByIndex(int iClan) = 0; // for clans a user is a member of, they will have reasonably up-to-date information, but for others you'll have to download the info to have the latest
//virtual const char *GetClanName(CSteamID steamIDClan) = 0; //virtual SteamAPICall_t DownloadClanActivityCounts(ARRAY_COUNT(cClansToRequest) CSteamID *psteamIDClans, int cClansToRequest) = 0;
//virtual const char *GetClanTag(CSteamID steamIDClan) = 0;
// returns the most recent information we have about what's happening in a clan // requests information about a clan officer list
//virtual bool GetClanActivityCounts(CSteamID steamIDClan, int *pnOnline, int *pnInGame, int *pnChatting) = 0; // when complete, data is returned in ClanOfficerListResponse_t call result
// for clans a user is a member of, they will have reasonably up-to-date information, but for others you'll have to download the info to have the latest // this makes available the calls below
//virtual SteamAPICall_t DownloadClanActivityCounts(ARRAY_COUNT(cClansToRequest) CSteamID *psteamIDClans, int cClansToRequest) = 0; // you can only ask about clans that a user is a member of
// note that this won't download avatars automatically; if you get an officer,
// requests information about a clan officer list // and no avatar image is available, call RequestUserInformation( steamID, false ) to download the avatar
// when complete, data is returned in ClanOfficerListResponse_t call result //virtual SteamAPICall_t RequestClanOfficerList(CSteamID steamIDClan) = 0;
// this makes available the calls below
// you can only ask about clans that a user is a member of
// note that this won't download avatars automatically; if you get an officer, // returns the steamID of the clan owner
// and no avatar image is available, call RequestUserInformation( steamID, false ) to download the avatar //virtual CSteamID GetClanOwner(CSteamID steamIDClan) = 0;
//virtual SteamAPICall_t RequestClanOfficerList(CSteamID steamIDClan) = 0; // returns the number of officers in a clan (including the owner)
//virtual int GetClanOfficerCount(CSteamID steamIDClan) = 0;
// returns the steamID of a clan officer, by index, of range [0,GetClanOfficerCount)
// returns the steamID of the clan owner //virtual CSteamID GetClanOfficerByIndex(CSteamID steamIDClan, int iOfficer) = 0;
//virtual CSteamID GetClanOwner(CSteamID steamIDClan) = 0;
// returns the number of officers in a clan (including the owner)
//virtual int GetClanOfficerCount(CSteamID steamIDClan) = 0; return SteamFriends()->GetFriendSteamLevel(id);
// returns the steamID of a clan officer, by index, of range [0,GetClanOfficerCount) }
//virtual CSteamID GetClanOfficerByIndex(CSteamID steamIDClan, int iOfficer) = 0; #endif
return 0;
return SteamFriends()->GetFriendSteamLevel(id); }*/
}
#endif void UAdvancedSteamFriendsLibrary::GetSteamGroups(TArray<FBPSteamGroupInfo> & SteamGroups)
{
return 0;
}*/ #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
void UAdvancedSteamFriendsLibrary::GetSteamGroups(TArray<FBPSteamGroupInfo> & SteamGroups) if (SteamAPI_Init())
{ {
int numClans = SteamFriends()->GetClanCount();
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
for (int i = 0; i < numClans; i++)
if (SteamAPI_Init()) {
{ CSteamID SteamGroupID = SteamFriends()->GetClanByIndex(i);
int numClans = SteamFriends()->GetClanCount();
if(!SteamGroupID.IsValid())
for (int i = 0; i < numClans; i++) continue;
{
CSteamID SteamGroupID = SteamFriends()->GetClanByIndex(i); FBPSteamGroupInfo GroupInfo;
if(!SteamGroupID.IsValid()) TSharedPtr<const FUniqueNetId> ValueID(new const FUniqueNetIdSteam2(SteamGroupID));
continue; GroupInfo.GroupID.SetUniqueNetId(ValueID);
SteamFriends()->GetClanActivityCounts(SteamGroupID, &GroupInfo.numOnline, &GroupInfo.numInGame, &GroupInfo.numChatting);
FBPSteamGroupInfo GroupInfo; GroupInfo.GroupName = FString(UTF8_TO_TCHAR(SteamFriends()->GetClanName(SteamGroupID)));
GroupInfo.GroupTag = FString(UTF8_TO_TCHAR(SteamFriends()->GetClanTag(SteamGroupID)));
TSharedPtr<const FUniqueNetId> ValueID(new const FUniqueNetIdSteam2(SteamGroupID));
GroupInfo.GroupID.SetUniqueNetId(ValueID); SteamGroups.Add(GroupInfo);
SteamFriends()->GetClanActivityCounts(SteamGroupID, &GroupInfo.numOnline, &GroupInfo.numInGame, &GroupInfo.numChatting); }
GroupInfo.GroupName = FString(UTF8_TO_TCHAR(SteamFriends()->GetClanName(SteamGroupID))); }
GroupInfo.GroupTag = FString(UTF8_TO_TCHAR(SteamFriends()->GetClanTag(SteamGroupID))); #endif
SteamGroups.Add(GroupInfo); }
}
} void UAdvancedSteamFriendsLibrary::GetSteamFriendGamePlayed(const FBPUniqueNetId UniqueNetId, EBlueprintResultSwitch &Result/*, FString & GameName*/, int32 & AppID)
#endif {
} #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
void UAdvancedSteamFriendsLibrary::GetSteamFriendGamePlayed(const FBPUniqueNetId UniqueNetId, EBlueprintResultSwitch &Result/*, FString & GameName*/, int32 & AppID) {
{ UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("GetSteamFriendGamePlayed Had a bad UniqueNetId!"));
Result = EBlueprintResultSwitch::OnFailure;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED return;
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM) }
{
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("GetSteamFriendGamePlayed Had a bad UniqueNetId!")); if (SteamAPI_Init())
Result = EBlueprintResultSwitch::OnFailure; {
return; uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
}
FriendGameInfo_t GameInfo;
if (SteamAPI_Init()) bool bIsInGame = SteamFriends()->GetFriendGamePlayed(id, &GameInfo);
{
uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes()); if (bIsInGame && GameInfo.m_gameID.IsValid())
{
FriendGameInfo_t GameInfo; AppID = GameInfo.m_gameID.AppID();
bool bIsInGame = SteamFriends()->GetFriendGamePlayed(id, &GameInfo);
// Forgot this test and left it in, it is incorrect, you would need restricted access
if (bIsInGame && GameInfo.m_gameID.IsValid()) // And it would only find games in the local library anyway
{ /*char NameBuffer[512];
AppID = GameInfo.m_gameID.AppID(); int Len = SteamAppList()->GetAppName(GameInfo.m_gameID.AppID(), NameBuffer, 512);
// Forgot this test and left it in, it is incorrect, you would need restricted access if (Len != -1) // Invalid
// And it would only find games in the local library anyway {
/*char NameBuffer[512]; GameName = FString(UTF8_TO_TCHAR(NameBuffer));
int Len = SteamAppList()->GetAppName(GameInfo.m_gameID.AppID(), NameBuffer, 512); }*/
if (Len != -1) // Invalid Result = EBlueprintResultSwitch::OnSuccess;
{ return;
GameName = FString(UTF8_TO_TCHAR(NameBuffer)); }
}*/
}
Result = EBlueprintResultSwitch::OnSuccess; #endif
return;
} Result = EBlueprintResultSwitch::OnFailure;
}
}
#endif int32 UAdvancedSteamFriendsLibrary::GetFriendSteamLevel(const FBPUniqueNetId UniqueNetId)
{
Result = EBlueprintResultSwitch::OnFailure;
} #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
int32 UAdvancedSteamFriendsLibrary::GetFriendSteamLevel(const FBPUniqueNetId UniqueNetId) {
{ UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("IsAFriend Had a bad UniqueNetId!"));
return 0;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
{ if (SteamAPI_Init())
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("IsAFriend Had a bad UniqueNetId!")); {
return 0; uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
}
return SteamFriends()->GetFriendSteamLevel(id);
if (SteamAPI_Init()) }
{ #endif
uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
return 0;
return SteamFriends()->GetFriendSteamLevel(id); }
}
#endif FString UAdvancedSteamFriendsLibrary::GetSteamPersonaName(const FBPUniqueNetId UniqueNetId)
{
return 0;
} #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
FString UAdvancedSteamFriendsLibrary::GetSteamPersonaName(const FBPUniqueNetId UniqueNetId) {
{ UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("GetSteamPersonaName Had a bad UniqueNetId!"));
return FString(TEXT(""));
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
{ if (SteamAPI_Init())
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("GetSteamPersonaName Had a bad UniqueNetId!")); {
return FString(TEXT("")); uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
} const char* PersonaName = SteamFriends()->GetFriendPersonaName(id);
return FString(UTF8_TO_TCHAR(PersonaName));
if (SteamAPI_Init()) }
{ #endif
uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
const char* PersonaName = SteamFriends()->GetFriendPersonaName(id); return FString(TEXT(""));
return FString(UTF8_TO_TCHAR(PersonaName)); }
}
#endif FBPUniqueNetId UAdvancedSteamFriendsLibrary::CreateSteamIDFromString(const FString SteamID64)
{
return FString(TEXT("")); FBPUniqueNetId netId;
}
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
FBPUniqueNetId UAdvancedSteamFriendsLibrary::CreateSteamIDFromString(const FString SteamID64) if (!(SteamID64.Len() > 0))
{ {
FBPUniqueNetId netId; UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("CreateSteamIDFromString Had a bad UniqueNetId!"));
return netId;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (!(SteamID64.Len() > 0))
{ if (SteamAPI_Init())
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("CreateSteamIDFromString Had a bad UniqueNetId!")); {
return netId; // Already does the conversion
} TSharedPtr<const FUniqueNetId> ValueID(new const FUniqueNetIdSteam2(SteamID64));
//FCString::Atoi64(*SteamID64));
if (SteamAPI_Init())
{ netId.SetUniqueNetId(ValueID);
// Already does the conversion return netId;
TSharedPtr<const FUniqueNetId> ValueID(new const FUniqueNetIdSteam2(SteamID64)); }
//FCString::Atoi64(*SteamID64)); #endif
netId.SetUniqueNetId(ValueID); return netId;
return netId; }
}
#endif FBPUniqueNetId UAdvancedSteamFriendsLibrary::GetLocalSteamIDFromSteam()
{
return netId; FBPUniqueNetId netId;
}
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
FBPUniqueNetId UAdvancedSteamFriendsLibrary::GetLocalSteamIDFromSteam() if (SteamAPI_Init())
{ {
FBPUniqueNetId netId; TSharedPtr<const FUniqueNetId> SteamID(new const FUniqueNetIdSteam2(SteamUser()->GetSteamID()));
netId.SetUniqueNetId(SteamID);
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (SteamAPI_Init()) #endif
{
TSharedPtr<const FUniqueNetId> SteamID(new const FUniqueNetIdSteam2(SteamUser()->GetSteamID())); return netId;
netId.SetUniqueNetId(SteamID); }
}
#endif bool UAdvancedSteamFriendsLibrary::RequestSteamFriendInfo(const FBPUniqueNetId UniqueNetId, bool bRequireNameOnly)
{
return netId; #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
} if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
{
bool UAdvancedSteamFriendsLibrary::RequestSteamFriendInfo(const FBPUniqueNetId UniqueNetId, bool bRequireNameOnly) UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("RequestSteamFriendInfo Had a bad UniqueNetId!"));
{ return false;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
{ if (SteamAPI_Init())
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("RequestSteamFriendInfo Had a bad UniqueNetId!")); {
return false; uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
}
return !SteamFriends()->RequestUserInformation(id, bRequireNameOnly);
if (SteamAPI_Init()) }
{ #endif
uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("RequestSteamFriendInfo Couldn't init steamAPI!"));
return !SteamFriends()->RequestUserInformation(id, bRequireNameOnly); return false;
} }
#endif
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("RequestSteamFriendInfo Couldn't init steamAPI!")); bool UAdvancedSteamFriendsLibrary::OpenSteamUserOverlay(const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType)
return false; {
} #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
{
bool UAdvancedSteamFriendsLibrary::OpenSteamUserOverlay(UObject* WorldContextObject,const FBPUniqueNetId UniqueNetId, ESteamUserOverlayType DialogType) UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("OpenSteamUserOverlay Had a bad UniqueNetId!"));
{ return false;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
{ if (SteamAPI_Init())
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("OpenSteamUserOverlay Had a bad UniqueNetId!")); {
return false; uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
} FString DialogName = EnumToString("ESteamUserOverlayType", (uint8)DialogType);
SteamFriends()->ActivateGameOverlayToUser(TCHAR_TO_ANSI(*DialogName), id);
if (SteamAPI_Init()) return true;
{ }
if (DialogType == ESteamUserOverlayType::invitetolobby) #endif
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("OpenSteamUserOverlay Couldn't init steamAPI!"));
IOnlineSessionPtr SessionInterface = Online::GetSessionInterface(World); return false;
if (SessionInterface.IsValid()) }
{
FNamedOnlineSession* CurrentSession = SessionInterface->GetNamedSession(NAME_GameSession); bool UAdvancedSteamFriendsLibrary::IsOverlayEnabled()
{
if (CurrentSession && CurrentSession->SessionInfo->GetSessionId().IsValid()) #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
{ if (SteamAPI_Init())
uint64 id = *((uint64*)CurrentSession->SessionInfo->GetSessionId().GetBytes()); {
SteamFriends()->ActivateGameOverlayInviteDialog(id); return SteamUtils()->IsOverlayEnabled();
} }
} #endif
}
else UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("OpenSteamUserOverlay Couldn't init steamAPI!"));
{ return false;
uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes()); }
FString DialogName = EnumToString("ESteamUserOverlayType", (uint8)DialogType);
SteamFriends()->ActivateGameOverlayToUser(TCHAR_TO_ANSI(*DialogName), id); UTexture2D * UAdvancedSteamFriendsLibrary::GetSteamFriendAvatar(const FBPUniqueNetId UniqueNetId, EBlueprintAsyncResultSwitch &Result, SteamAvatarSize AvatarSize)
} {
return true; #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
} if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM)
#endif {
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("GetSteamFriendAvatar Had a bad UniqueNetId!"));
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("OpenSteamUserOverlay Couldn't init steamAPI!")); Result = EBlueprintAsyncResultSwitch::OnFailure;
return false; return nullptr;
} }
bool UAdvancedSteamFriendsLibrary::IsOverlayEnabled() uint32 Width = 0;
{ uint32 Height = 0;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
if (SteamAPI_Init()) if (SteamAPI_Init())
{ {
return SteamUtils()->IsOverlayEnabled(); //Getting the PictureID from the SteamAPI and getting the Size with the ID
} //virtual bool RequestUserInformation( CSteamID steamIDUser, bool bRequireNameOnly ) = 0;
#endif
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("OpenSteamUserOverlay Couldn't init steamAPI!")); uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes());
return false; int Picture = 0;
}
switch(AvatarSize)
UTexture2D * UAdvancedSteamFriendsLibrary::GetSteamFriendAvatar(const FBPUniqueNetId UniqueNetId, EBlueprintAsyncResultSwitch &Result, SteamAvatarSize AvatarSize) {
{ case SteamAvatarSize::SteamAvatar_Small: Picture = SteamFriends()->GetSmallFriendAvatar(id); break;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED case SteamAvatarSize::SteamAvatar_Medium: Picture = SteamFriends()->GetMediumFriendAvatar(id); break;
if (!UniqueNetId.IsValid() || !UniqueNetId.UniqueNetId->IsValid() || UniqueNetId.UniqueNetId->GetType() != STEAM_SUBSYSTEM) case SteamAvatarSize::SteamAvatar_Large: Picture = SteamFriends()->GetLargeFriendAvatar(id); break;
{ default: break;
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("GetSteamFriendAvatar Had a bad UniqueNetId!")); }
Result = EBlueprintAsyncResultSwitch::OnFailure;
return nullptr; if (Picture == -1)
} {
Result = EBlueprintAsyncResultSwitch::AsyncLoading;
uint32 Width = 0; return NULL;
uint32 Height = 0; }
if (SteamAPI_Init()) SteamUtils()->GetImageSize(Picture, &Width, &Height);
{
//Getting the PictureID from the SteamAPI and getting the Size with the ID // STOLEN FROM ANSWERHUB :p, then fixed because answerhub wasn't releasing the memory O.o
//virtual bool RequestUserInformation( CSteamID steamIDUser, bool bRequireNameOnly ) = 0; // Also fixed image pixel format and switched to a memcpy instead of manual iteration.
// At some point I should probably reply to that answerhub post with these fixes to prevent people killing their games.....
uint64 id = *((uint64*)UniqueNetId.UniqueNetId->GetBytes()); if (Width > 0 && Height > 0)
int Picture = 0; {
//Creating the buffer "oAvatarRGBA" and then filling it with the RGBA Stream from the Steam Avatar
switch(AvatarSize) uint8 *oAvatarRGBA = new uint8[Width * Height * 4];
{
case SteamAvatarSize::SteamAvatar_Small: Picture = SteamFriends()->GetSmallFriendAvatar(id); break;
case SteamAvatarSize::SteamAvatar_Medium: Picture = SteamFriends()->GetMediumFriendAvatar(id); break; //Filling the buffer with the RGBA Stream from the Steam Avatar and creating a UTextur2D to parse the RGBA Steam in
case SteamAvatarSize::SteamAvatar_Large: Picture = SteamFriends()->GetLargeFriendAvatar(id); break; SteamUtils()->GetImageRGBA(Picture, (uint8*)oAvatarRGBA, 4 * Height * Width * sizeof(char));
default: break;
}
// Removed as I changed the image bit code to be RGB, I think the original author was unaware that there were different pixel formats
if (Picture == -1) /*
{ //Swap R and B channels because for some reason the games whack
Result = EBlueprintAsyncResultSwitch::AsyncLoading; for (uint32 i = 0; i < (Width * Height * 4); i += 4)
return NULL; {
} uint8 Temp = oAvatarRGBA[i + 0];
oAvatarRGBA[i + 0] = oAvatarRGBA[i + 2];
SteamUtils()->GetImageSize(Picture, &Width, &Height); oAvatarRGBA[i + 2] = Temp;
}*/
// STOLEN FROM ANSWERHUB :p, then fixed because answerhub wasn't releasing the memory O.o
// Also fixed image pixel format and switched to a memcpy instead of manual iteration. UTexture2D* Avatar = UTexture2D::CreateTransient(Width, Height, PF_R8G8B8A8);
// At some point I should probably reply to that answerhub post with these fixes to prevent people killing their games..... // Switched to a Memcpy instead of byte by byte transer
uint8* MipData = (uint8*)Avatar->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
if (Width > 0 && Height > 0) FMemory::Memcpy(MipData, (void*)oAvatarRGBA, Height * Width * 4);
{ Avatar->PlatformData->Mips[0].BulkData.Unlock();
//Creating the buffer "oAvatarRGBA" and then filling it with the RGBA Stream from the Steam Avatar
uint8 *oAvatarRGBA = new uint8[Width * Height * 4]; // Original implementation was missing this!!
// the hell man......
delete[] oAvatarRGBA;
//Filling the buffer with the RGBA Stream from the Steam Avatar and creating a UTextur2D to parse the RGBA Steam in
SteamUtils()->GetImageRGBA(Picture, (uint8*)oAvatarRGBA, 4 * Height * Width * sizeof(char)); //Setting some Parameters for the Texture and finally returning it
Avatar->PlatformData->SetNumSlices(1);
Avatar->NeverStream = true;
// Removed as I changed the image bit code to be RGB, I think the original author was unaware that there were different pixel formats //Avatar->CompressionSettings = TC_EditorIcon;
/*
//Swap R and B channels because for some reason the games whack Avatar->UpdateResource();
for (uint32 i = 0; i < (Width * Height * 4); i += 4)
{ Result = EBlueprintAsyncResultSwitch::OnSuccess;
uint8 Temp = oAvatarRGBA[i + 0]; return Avatar;
oAvatarRGBA[i + 0] = oAvatarRGBA[i + 2]; }
oAvatarRGBA[i + 2] = Temp; else
}*/ {
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("Bad Height / Width with steam avatar!"));
UTexture2D* Avatar = UTexture2D::CreateTransient(Width, Height, PF_R8G8B8A8); }
// Switched to a Memcpy instead of byte by byte transer
Result = EBlueprintAsyncResultSwitch::OnFailure;
if (FTexturePlatformData* PlatformData = Avatar->GetPlatformData()) return nullptr;
{ }
uint8* MipData = (uint8*)PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE); #endif
FMemory::Memcpy(MipData, (void*)oAvatarRGBA, Height * Width * 4);
PlatformData->Mips[0].BulkData.Unlock(); UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("STEAM Couldn't be verified as initialized"));
Result = EBlueprintAsyncResultSwitch::OnFailure;
//Setting some Parameters for the Texture and finally returning it return nullptr;
PlatformData->SetNumSlices(1); }
Avatar->NeverStream = true;
//Avatar->CompressionSettings = TC_EditorIcon; bool UAdvancedSteamFriendsLibrary::InitTextFiltering()
} {
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
// Free RGBA buffer regardless of whether it was used or not
delete[] oAvatarRGBA; if (SteamAPI_Init())
{
Avatar->UpdateResource(); return SteamUtils()->InitFilterText();
}
Result = EBlueprintAsyncResultSwitch::OnSuccess;
return Avatar; #endif
}
else return false;
{ }
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("Bad Height / Width with steam avatar!"));
} bool UAdvancedSteamFriendsLibrary::FilterText(FString TextToFilter, EBPTextFilteringContext Context, const FBPUniqueNetId TextSourceID, FString& FilteredText)
{
Result = EBlueprintAsyncResultSwitch::OnFailure; #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
return nullptr;
} if (SteamAPI_Init())
#endif {
uint32 BufferLen = TextToFilter.Len() + 10; // Docs say 1 byte excess min, going with 10
UE_LOG(AdvancedSteamFriendsLog, Warning, TEXT("STEAM Couldn't be verified as initialized")); char* OutText = new char[BufferLen];
Result = EBlueprintAsyncResultSwitch::OnFailure;
return nullptr; uint64 id = 0;
}
if (TextSourceID.IsValid())
bool UAdvancedSteamFriendsLibrary::InitTextFiltering() {
{ id = *((uint64*)TextSourceID.UniqueNetId->GetBytes());
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED }
if (SteamAPI_Init()) int FilterCount = SteamUtils()->FilterText(OutText, BufferLen, TCHAR_TO_ANSI(*TextToFilter), Context == EBPTextFilteringContext::FContext_GameContent);
{
return SteamUtils()->InitFilterText(); if (FilterCount > 0)
} {
FilteredText = FString(UTF8_TO_TCHAR(OutText));
#endif delete[] OutText;
return true;
return false; }
}
delete[] OutText;
bool UAdvancedSteamFriendsLibrary::FilterText(FString TextToFilter, EBPTextFilteringContext Context, const FBPUniqueNetId TextSourceID, FString& FilteredText) }
{
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #endif
if (SteamAPI_Init()) FilteredText = TextToFilter;
{ return false;
uint32 BufferLen = TextToFilter.Len() + 10; // Docs say 1 byte excess min, going with 10 }
char* OutText = new char[BufferLen];
bool UAdvancedSteamFriendsLibrary::IsSteamInBigPictureMode()
uint64 id = 0; {
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (TextSourceID.IsValid())
{ if (SteamAPI_Init())
id = *((uint64*)TextSourceID.UniqueNetId->GetBytes()); {
} return SteamUtils()->IsSteamInBigPictureMode();
}
int FilterCount = SteamUtils()->FilterText((ETextFilteringContext)Context, id, TCHAR_TO_ANSI(*TextToFilter), OutText, BufferLen);
#endif
if (FilterCount > 0)
{ return false;
FilteredText = FString(UTF8_TO_TCHAR(OutText));
delete[] OutText;
return true;
}
delete[] OutText;
}
#endif
FilteredText = TextToFilter;
return false;
}
bool UAdvancedSteamFriendsLibrary::IsSteamInBigPictureMode()
{
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED
if (SteamAPI_Init())
{
return SteamUtils()->IsSteamInBigPictureMode();
}
#endif
return false;
} }

View File

@@ -1,12 +1,12 @@
//#include "StandAlonePrivatePCH.h" //#include "StandAlonePrivatePCH.h"
#include "AdvancedSteamSessions.h" #include "AdvancedSteamSessions.h"
void AdvancedSteamSessions::StartupModule() void AdvancedSteamSessions::StartupModule()
{ {
} }
void AdvancedSteamSessions::ShutdownModule() void AdvancedSteamSessions::ShutdownModule()
{ {
} }
IMPLEMENT_MODULE(AdvancedSteamSessions, AdvancedSteamSessions) IMPLEMENT_MODULE(AdvancedSteamSessions, AdvancedSteamSessions)

View File

@@ -1,69 +1,69 @@
// Fill out your copyright notice in the Description page of Project Settings. // Fill out your copyright notice in the Description page of Project Settings.
#include "AdvancedSteamWorkshopLibrary.h" #include "AdvancedSteamWorkshopLibrary.h"
#include "OnlineSubSystemHeader.h" #include "OnlineSubSystemHeader.h"
//General Log //General Log
DEFINE_LOG_CATEGORY(AdvancedSteamWorkshopLog); DEFINE_LOG_CATEGORY(AdvancedSteamWorkshopLog);
void UAdvancedSteamWorkshopLibrary::GetNumSubscribedWorkshopItems(int32 & NumberOfItems) void UAdvancedSteamWorkshopLibrary::GetNumSubscribedWorkshopItems(int32 & NumberOfItems)
{ {
NumberOfItems = 0; NumberOfItems = 0;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (SteamAPI_Init()) if (SteamAPI_Init())
{ {
NumberOfItems = SteamUGC()->GetNumSubscribedItems(); NumberOfItems = SteamUGC()->GetNumSubscribedItems();
return; return;
} }
else else
{ {
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetNumSubscribedWorkshopItemCount : SteamAPI is not Inited!")); UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetNumSubscribedWorkshopItemCount : SteamAPI is not Inited!"));
return; return;
} }
#else #endif
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetNumSubscribedWorkshopItemCount : Called on an incompatible platform"));
return; UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetNumSubscribedWorkshopItemCount : Called on an incompatible platform"));
#endif return;
} }
TArray<FBPSteamWorkshopID> UAdvancedSteamWorkshopLibrary::GetSubscribedWorkshopItems(int32 & NumberOfItems) TArray<FBPSteamWorkshopID> UAdvancedSteamWorkshopLibrary::GetSubscribedWorkshopItems(int32 & NumberOfItems)
{ {
TArray<FBPSteamWorkshopID> outArray; TArray<FBPSteamWorkshopID> outArray;
NumberOfItems = 0; NumberOfItems = 0;
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (SteamAPI_Init()) if (SteamAPI_Init())
{ {
uint32 NumItems = SteamUGC()->GetNumSubscribedItems(); uint32 NumItems = SteamUGC()->GetNumSubscribedItems();
if (NumItems == 0) if (NumItems == 0)
return outArray; return outArray;
// Not using the actual variable above in case someone somehow goes past int32 limits // Not using the actual variable above in case someone somehow goes past int32 limits
// Don't want to go negative on the iteration. // Don't want to go negative on the iteration.
NumberOfItems = NumItems; NumberOfItems = NumItems;
PublishedFileId_t *fileIds = new PublishedFileId_t[NumItems]; PublishedFileId_t *fileIds = new PublishedFileId_t[NumItems];
uint32 subItems = SteamUGC()->GetSubscribedItems(fileIds, NumItems); uint32 subItems = SteamUGC()->GetSubscribedItems(fileIds, NumItems);
for (uint32 i = 0; i < subItems; ++i) for (uint32 i = 0; i < subItems; ++i)
{ {
outArray.Add(FBPSteamWorkshopID(fileIds[i])); outArray.Add(FBPSteamWorkshopID(fileIds[i]));
} }
delete[] fileIds; delete[] fileIds;
return outArray; return outArray;
} }
else else
{ {
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetSubscribedWorkshopItemCount : SteamAPI is not Inited!")); UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetSubscribedWorkshopItemCount : SteamAPI is not Inited!"));
return outArray; return outArray;
} }
#else #endif
UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetSubscribedWorkshopItemCount : Called on an incompatible platform"));
return outArray; UE_LOG(AdvancedSteamWorkshopLog, Warning, TEXT("Error in GetSubscribedWorkshopItemCount : Called on an incompatible platform"));
#endif return outArray;
} }

View File

@@ -1,10 +1,10 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. // Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "SteamRequestGroupOfficersCallbackProxy.h" #include "SteamRequestGroupOfficersCallbackProxy.h"
#include "Online/CoreOnline.h" #include "UObject/CoreOnline.h"
#include "AdvancedSteamFriendsLibrary.h" #include "AdvancedSteamFriendsLibrary.h"
#include "OnlineSubSystemHeader.h" #include "OnlineSubSystemHeader.h"
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
#include "steam/isteamfriends.h" #include "steam/isteamfriends.h"
#endif #endif
//#include "OnlineSubsystemSteamTypes.h" //#include "OnlineSubsystemSteamTypes.h"
@@ -30,13 +30,13 @@ USteamRequestGroupOfficersCallbackProxy* USteamRequestGroupOfficersCallbackProxy
} }
void USteamRequestGroupOfficersCallbackProxy::Activate() void USteamRequestGroupOfficersCallbackProxy::Activate()
{ {
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (SteamAPI_Init()) if (SteamAPI_Init())
{ {
uint64 id = *((uint64*)GroupUniqueID.UniqueNetId->GetBytes()); uint64 id = *((uint64*)GroupUniqueID.UniqueNetId->GetBytes());
SteamAPICall_t hSteamAPICall = SteamFriends()->RequestClanOfficerList(id); SteamAPICall_t hSteamAPICall = SteamFriends()->RequestClanOfficerList(id);
m_callResultGroupOfficerRequestDetails.Set(hSteamAPICall, this, &USteamRequestGroupOfficersCallbackProxy::OnRequestGroupOfficerDetails); m_callResultGroupOfficerRequestDetails.Set(hSteamAPICall, this, &USteamRequestGroupOfficersCallbackProxy::OnRequestGroupOfficerDetails);
return; return;
} }
@@ -45,77 +45,77 @@ void USteamRequestGroupOfficersCallbackProxy::Activate()
OnFailure.Broadcast(EmptyArray); OnFailure.Broadcast(EmptyArray);
} }
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
void USteamRequestGroupOfficersCallbackProxy::OnRequestGroupOfficerDetails(ClanOfficerListResponse_t *pResult, bool bIOFailure) void USteamRequestGroupOfficersCallbackProxy::OnRequestGroupOfficerDetails(ClanOfficerListResponse_t *pResult, bool bIOFailure)
{ {
TArray<FBPSteamGroupOfficer> OfficerArray; TArray<FBPSteamGroupOfficer> OfficerArray;
//FOnlineSubsystemSteam* SteamSubsystem = (FOnlineSubsystemSteam*)(IOnlineSubsystem::Get(STEAM_SUBSYSTEM)); FOnlineSubsystemSteam* SteamSubsystem = (FOnlineSubsystemSteam*)(IOnlineSubsystem::Get(STEAM_SUBSYSTEM));
if (bIOFailure || !pResult || !pResult->m_bSuccess) if (bIOFailure || !pResult || !pResult->m_bSuccess)
{ {
//if (SteamSubsystem != nullptr) if (SteamSubsystem != nullptr)
{ {
// SteamSubsystem->ExecuteNextTick([this]() SteamSubsystem->ExecuteNextTick([this]()
//{ {
TArray<FBPSteamGroupOfficer> FailureArray; TArray<FBPSteamGroupOfficer> FailureArray;
OnFailure.Broadcast(FailureArray); OnFailure.Broadcast(FailureArray);
//}); });
} }
//OnFailure.Broadcast(OfficerArray); //OnFailure.Broadcast(OfficerArray);
return; return;
} }
if (SteamAPI_Init()) if (SteamAPI_Init())
{ {
uint64 id = *((uint64*)GroupUniqueID.UniqueNetId->GetBytes()); uint64 id = *((uint64*)GroupUniqueID.UniqueNetId->GetBytes());
FBPSteamGroupOfficer Officer; FBPSteamGroupOfficer Officer;
CSteamID ClanOwner = SteamFriends()->GetClanOwner(id); CSteamID ClanOwner = SteamFriends()->GetClanOwner(id);
Officer.bIsOwner = true; Officer.bIsOwner = true;
TSharedPtr<const FUniqueNetId> ValueID(new const FUniqueNetIdSteam2(ClanOwner)); TSharedPtr<const FUniqueNetId> ValueID(new const FUniqueNetIdSteam2(ClanOwner));
Officer.OfficerUniqueNetID.SetUniqueNetId(ValueID); Officer.OfficerUniqueNetID.SetUniqueNetId(ValueID);
OfficerArray.Add(Officer); OfficerArray.Add(Officer);
for (int i = 0; i < pResult->m_cOfficers; i++) for (int i = 0; i < pResult->m_cOfficers; i++)
{ {
CSteamID OfficerSteamID = SteamFriends()->GetClanOfficerByIndex(id, i); CSteamID OfficerSteamID = SteamFriends()->GetClanOfficerByIndex(id, i);
Officer.bIsOwner = false; Officer.bIsOwner = false;
TSharedPtr<const FUniqueNetId> newValueID(new const FUniqueNetIdSteam2(OfficerSteamID)); TSharedPtr<const FUniqueNetId> newValueID(new const FUniqueNetIdSteam2(OfficerSteamID));
Officer.OfficerUniqueNetID.SetUniqueNetId(newValueID); Officer.OfficerUniqueNetID.SetUniqueNetId(newValueID);
OfficerArray.Add(Officer); OfficerArray.Add(Officer);
} }
//if (SteamSubsystem != nullptr) if (SteamSubsystem != nullptr)
//{ {
//SteamSubsystem->ExecuteNextTick([OfficerArray, this]() SteamSubsystem->ExecuteNextTick([OfficerArray, this]()
//{ {
OnSuccess.Broadcast(OfficerArray); OnSuccess.Broadcast(OfficerArray);
//}); });
//} }
//OnSuccess.Broadcast(OfficerArray); //OnSuccess.Broadcast(OfficerArray);
return; return;
} }
else else
{ {
//if (SteamSubsystem != nullptr) if (SteamSubsystem != nullptr)
{ {
//SteamSubsystem->ExecuteNextTick([this]() SteamSubsystem->ExecuteNextTick([this]()
//{ {
TArray<FBPSteamGroupOfficer> FailureArray; TArray<FBPSteamGroupOfficer> FailureArray;
OnFailure.Broadcast(FailureArray); OnFailure.Broadcast(FailureArray);
//}); });
} }
} }
// Should never hit this anyway // Should never hit this anyway
//OnFailure.Broadcast(OfficerArray); //OnFailure.Broadcast(OfficerArray);
} }
#endif #endif

View File

@@ -2,7 +2,7 @@
#include "SteamWSRequestUGCDetailsCallbackProxy.h" #include "SteamWSRequestUGCDetailsCallbackProxy.h"
#include "OnlineSubSystemHeader.h" #include "OnlineSubSystemHeader.h"
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
#include "steam/isteamugc.h" #include "steam/isteamugc.h"
#endif #endif
@@ -24,13 +24,13 @@ USteamWSRequestUGCDetailsCallbackProxy* USteamWSRequestUGCDetailsCallbackProxy::
} }
void USteamWSRequestUGCDetailsCallbackProxy::Activate() void USteamWSRequestUGCDetailsCallbackProxy::Activate()
{ {
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
if (SteamAPI_Init()) if (SteamAPI_Init())
{ {
// #TODO: Support arrays instead in the future? // #TODO: Support arrays instead in the future?
UGCQueryHandle_t hQueryHandle = SteamUGC()->CreateQueryUGCDetailsRequest((PublishedFileId_t *)&WorkShopID.SteamWorkshopID, 1); UGCQueryHandle_t hQueryHandle = SteamUGC()->CreateQueryUGCDetailsRequest((PublishedFileId_t *)&WorkShopID.SteamWorkshopID, 1);
// #TODO: add search settings here by calling into the handle? // #TODO: add search settings here by calling into the handle?
SteamAPICall_t hSteamAPICall = SteamUGC()->SendQueryUGCRequest(hQueryHandle); SteamAPICall_t hSteamAPICall = SteamUGC()->SendQueryUGCRequest(hQueryHandle);
// Need to release the query // Need to release the query
@@ -49,53 +49,53 @@ void USteamWSRequestUGCDetailsCallbackProxy::Activate()
OnFailure.Broadcast(FBPSteamWorkshopItemDetails()); OnFailure.Broadcast(FBPSteamWorkshopItemDetails());
} }
#if (PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX) && STEAM_SDK_INSTALLED #if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
void USteamWSRequestUGCDetailsCallbackProxy::OnUGCRequestUGCDetails(SteamUGCQueryCompleted_t *pResult, bool bIOFailure) void USteamWSRequestUGCDetailsCallbackProxy::OnUGCRequestUGCDetails(SteamUGCQueryCompleted_t *pResult, bool bIOFailure)
{ {
//FOnlineSubsystemSteam* SteamSubsystem = (FOnlineSubsystemSteam*)(IOnlineSubsystem::Get(STEAM_SUBSYSTEM)); FOnlineSubsystemSteam* SteamSubsystem = (FOnlineSubsystemSteam*)(IOnlineSubsystem::Get(STEAM_SUBSYSTEM));
if (bIOFailure || !pResult || pResult->m_unNumResultsReturned <= 0) if (bIOFailure || !pResult || pResult->m_unNumResultsReturned <= 0)
{ {
//if (SteamSubsystem != nullptr) if (SteamSubsystem != nullptr)
{
SteamSubsystem->ExecuteNextTick([this]()
{
OnFailure.Broadcast(FBPSteamWorkshopItemDetails());
});
}
//OnFailure.Broadcast(FBPSteamWorkshopItemDetails());
return;
}
if (SteamAPI_Init())
{
SteamUGCDetails_t Details;
if (SteamUGC()->GetQueryUGCResult(pResult->m_handle, 0, &Details))
{ {
// SteamSubsystem->ExecuteNextTick([this]() if (SteamSubsystem != nullptr)
//{ {
OnFailure.Broadcast(FBPSteamWorkshopItemDetails()); SteamSubsystem->ExecuteNextTick([Details, this]()
//}); {
} OnSuccess.Broadcast(FBPSteamWorkshopItemDetails(Details));
//OnFailure.Broadcast(FBPSteamWorkshopItemDetails()); });
return; }
}
if (SteamAPI_Init()) //OnSuccess.Broadcast(FBPSteamWorkshopItemDetails(Details));
return;
}
}
else
{ {
SteamUGCDetails_t Details; if (SteamSubsystem != nullptr)
if (SteamUGC()->GetQueryUGCResult(pResult->m_handle, 0, &Details)) {
{ SteamSubsystem->ExecuteNextTick([this]()
//if (SteamSubsystem != nullptr) {
{ OnFailure.Broadcast(FBPSteamWorkshopItemDetails());
//SteamSubsystem->ExecuteNextTick([Details, this]() });
//{ }
OnSuccess.Broadcast(FBPSteamWorkshopItemDetails(Details)); }
//});
} // Not needed, should never hit here
//OnFailure.Broadcast(FBPSteamWorkshopItemDetails());
//OnSuccess.Broadcast(FBPSteamWorkshopItemDetails(Details));
return;
}
}
else
{
//if (SteamSubsystem != nullptr)
{
//SteamSubsystem->ExecuteNextTick([this]()
//{
OnFailure.Broadcast(FBPSteamWorkshopItemDetails());
//});
}
}
// Not needed, should never hit here
//OnFailure.Broadcast(FBPSteamWorkshopItemDetails());
} }
#endif #endif

View File

@@ -1,19 +1,19 @@
Copyright Joshua Statzer Copyright Joshua Statzer
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.