61 Commits

Author SHA1 Message Date
Joshua (MordenTral) Statzer
76e08581f5 Adding function to get the net id of a session owner 2025-09-26 08:36:59 -04:00
Joshua (MordenTral) Statzer
382ed08217 Merge pull request #48 from Elewyth/master
properly forward UWorld::ServerTravel return value
2022-09-08 14:06:02 -04:00
Marc Etter
f760855494 properly forward UWorld::ServerTravel return value 2022-09-08 19:01:27 +02:00
Joshua
fe76b60b2e ue5 correction 2022-08-30 15:32:43 -04:00
Joshua
7f1b47f42d set cached unique net id in auto login as well 2022-08-30 08:42:41 -04:00
Joshua
3ac5d6c664 ported changes over 2022-08-22 16:00:22 -04:00
Joshua
fd33fc34a5 correct the create session node not passing on bAllowJoingViaPresence 2022-06-24 08:10:11 -04:00
Joshua
bc26be2a12 porting session change to ue5 2022-05-03 08:39:29 -04:00
Joshua
936532f1a0 forcing steam shared on
forcing steam shared on, its off by default and including steam subsystem isn't automatically turning it on.
2022-04-26 09:01:05 -04:00
Joshua
64710df075 whoops 2022-04-08 12:04:03 -04:00
Joshua
ab9de1b344 re-enabling end session 2022-04-08 10:54:04 -04:00
Joshua
bf4d99cba8 adding in pull request manually
https://github.com/mordentral/AdvancedSessionsPlugin/pull/32 manually merging due to changes since creation
2022-04-08 10:53:41 -04:00
Joshua
f7f56e7038 Merge branch 'UE5-ReleaseStaging' 2022-04-05 15:29:19 -04:00
Joshua
90fff579ba manually merging server travel node to ue5 2022-03-11 13:45:01 -05:00
Joshua (MordenTral) Statzer
2520d15e54 Merge pull request #30 from uno1982/master
Add server travel blueprint node.
2022-03-11 13:40:23 -05:00
uno1982
fbbb39c06c Merge pull request #1 from uno1982/uno1982-Servertravel
servertravel changes
2022-03-11 11:04:48 -06:00
uno1982
4922cd2154 Update AdvancedSessionsLibrary.h
Fixed typo on bShouldSkipGameNotify
2022-03-10 20:48:21 -06:00
uno1982
36cb58ea15 Added ServerTravel to library cpp 2022-03-10 20:34:11 -06:00
uno1982
e9747ff440 Update AdvancedSessionsLibrary.h 2022-03-10 20:10:48 -06:00
Joshua
e1ed0f22b6 normalizing EOL 2022-03-07 11:03:10 -05:00
Joshua
0de641f7d9 adding gitattributes 2022-03-07 10:46:44 -05:00
Joshua
295ab98a91 correct this pull request for ue5 2022-03-07 09:22:25 -05:00
Joshua (MordenTral) Statzer
18475eb2ef Merge pull request #24 from lotodore/login_update_playerstate_uniqueid
Update PlayerState UniqueId after Login

Good pull request, accepted
2022-03-07 08:23:56 -05:00
Joshua (MordenTral) Statzer
9784cd2f01 Merge pull request #25 from lotodore/change_type_to_authtype
Rename Login parameter "Type" to "AuthType".

Not a relevant change, it predates EOS, but will merge for clarity
2022-03-07 08:23:56 -05:00
Joshua (MordenTral) Statzer
ee9252a0df Merge pull request #24 from lotodore/login_update_playerstate_uniqueid
Update PlayerState UniqueId after Login

Good pull request, accepted
2022-03-07 08:22:33 -05:00
Joshua (MordenTral) Statzer
b3cc471bf3 Merge pull request #25 from lotodore/change_type_to_authtype
Rename Login parameter "Type" to "AuthType".

Not a relevant change, it predates EOS, but will merge for clarity
2022-03-07 08:20:21 -05:00
Lothar May
9bb2c553cd Rename parameter "Type" to "AuthType". 2022-03-05 14:32:41 +01:00
Lothar May
56639eb4a7 Fixing build of plugin changes on MacOS.
(cherry picked from commit cc311df9699a99305fe3c7d5d83f4fb0bb4b5550)
2022-03-05 13:47:55 +01:00
Lothar May
31c4be3629 Update UniqueId in login callback. See also ShowLoginUICallbackProxy.cpp in UE sources.
(cherry picked from commit 826bef7b861e8c20013033b57dd45cd8fec304e5)
2022-03-05 13:47:47 +01:00
mordentral
2e43a65acd fix include 2022-02-28 17:08:09 -05:00
Joshua
09bbe211a8 fix type and some functions that are soon to be replaced 2022-02-25 15:06:42 -05:00
Joshua
fded4d065b commit to bring to parity 2022-02-07 10:29:19 -05:00
Joshua
b0ae86b017 revert to ue5 EA on this branch, spool up a new one 2022-02-07 10:28:08 -05:00
Joshua
4d913be381 Merge branch 'master' into UE5-Prerelease 2022-01-27 09:15:56 -05:00
Joshua (MordenTral) Statzer
b986d7be2d Merge pull request #19 from mrcodesx/issue-18
Fix: Issue #18 Update session fails with "NO REGISTERED SESSIONS" error
2022-01-21 13:41:54 -05:00
MrCodesX
82b2f9f594 Fix: Issue #18 Update session not finding sessions to update 2022-01-09 00:54:42 -06:00
Joshua (MordenTral) Statzer
ec634238f8 Merge pull request #16 from Ji-Rath/EOS_QOL
EOS QOL
2021-12-21 14:37:19 -05:00
Ji-Rath
21b5b139d9 Add UseLobbiesVoiceChat option for CreateSession
Allows the user to setup voice chat lobbies if the API supports it
2021-12-17 15:47:39 -06:00
Ji-Rath
7b8bebac66 Add AutoLoginUserCallbackProxy
Implement AutoLogin function, can be used to login automatically using the EOS SDK Dev Auth Tool
2021-12-17 15:45:18 -06:00
Ji-Rath
444b632a72 Add type parameter to LoginUser
Add type parameter so EOS can use "accountportal" to authenticate, falls back to default implementation if left blank
2021-12-17 15:27:22 -06:00
Joshua
8192f73ca7 fix bad header 2021-10-25 08:26:13 -04:00
Joshua
f2a33fe1c6 Revert "update for new session option"
This reverts commit b72b0d59fe.
2021-10-22 15:50:52 -04:00
Joshua
c59f4bba43 Revert "fix default value for lobby sessions on create session"
This reverts commit 7b21ee2344.
2021-10-22 15:50:45 -04:00
Joshua
7b21ee2344 fix default value for lobby sessions on create session
fix default value for lobby sessions on create session
2021-10-22 15:32:24 -04:00
Joshua
94fb993ad7 fix default value for lobby sessions on create session
fix default value for lobby sessions on create session
2021-10-22 15:31:22 -04:00
Joshua
b72b0d59fe update for new session option
update for new session option
2021-10-22 15:31:06 -04:00
Louis Raverdy
5b2260079c Update SteamRequestGroupOfficersCallbackProxy.h 2021-10-18 22:02:12 +02:00
Louis Raverdy
c4df122248 Update AdvancedSteamFriendsLibrary.h 2021-10-18 22:01:46 +02:00
Louis Raverdy
6065bd9a36 Update SteamRequestGroupOfficersCallbackProxy.cpp 2021-10-18 22:00:37 +02:00
Joshua
d67c039088 support steam bug on mac
support steam bug on mac
2021-10-12 10:01:02 -04:00
Joshua
6c392ee1fb backing out search lobbies in ue5, it doesn't exist here yet
backing out search lobbies in ue5, it doesn't exist here yet
2021-09-29 08:39:45 -04:00
Joshua
4b7cffc1c0 add lobby search to find
add lobby search to find
2021-09-13 08:21:23 -04:00
Joshua
0be6427845 corrected uplugin versions
corrected uplugin versions
2021-09-01 13:24:33 -04:00
Joshua
816b701963 add lobby search to find
add lobby search to find
2021-08-24 09:22:34 -04:00
Joshua
e9bea6cac0 fix default value for lobby sessions on create session
fix default value for lobby sessions on create session
2021-08-23 08:39:21 -04:00
Joshua
a63bb0916a Merge branch '4.27-Port' 2021-08-19 13:20:53 -04:00
Joshua
1f6b7dbb3b Added new steam sessions functions
IsOverlay Enabled
InitTextFiltering
FilterText
IsSteamInBigPictureMode
2021-08-16 12:52:44 -04:00
Joshua
c391737812 fix ADmissing properties
fix ADmissing properties
2021-08-09 15:35:20 -04:00
Joshua
156025af2d update for new session option
update for new session option
2021-06-10 09:50:13 -04:00
Joshua
ce25430643 packages
packages
2021-06-07 12:27:07 -04:00
Joshua
dfb5ad544a removed win32 check
removed win32 check
2021-05-28 10:03:52 -04:00
56 changed files with 5087 additions and 4680 deletions

2
.gitattributes vendored Normal file
View File

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

View File

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

View File

@@ -0,0 +1,8 @@
[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

@@ -160,6 +160,10 @@ public:
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID")
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
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|PlayerInfo|PlayerID")
static void GetUniqueNetIDFromPlayerState(APlayerState *PlayerState, FBPUniqueNetId &UniqueNetId);
@@ -200,5 +204,10 @@ public:
UFUNCTION(BlueprintPure, Category = "Online|AdvancedSessions|Misc")
static bool HasOnlineSubsystem(FName SubSystemName);
//**** Seamless travel Functions ****//
//Exposes Server travel to blueprint
UFUNCTION(BlueprintCallable, BlueprintAuthorityOnly, Category = "Online|AdvancedSessions|Seamless", meta = (HidePin = "WorldContextObject", DefaultToSelf = "WorldContextObject"))
static bool ServerTravel(UObject* WorldContextObject, const FString& InURL, bool bAbsolute, bool bShouldSkipGameNotify);
};

View File

@@ -0,0 +1,55 @@
// 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
UObject* WorldContextObject;
};

View File

@@ -251,23 +251,31 @@ struct FBPFriendPresenceInfo
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsOnline;
bool bIsOnline = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsPlaying;
bool bIsPlaying = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsPlayingThisGame;
bool bIsPlayingThisGame = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsJoinable;
bool bIsJoinable = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bHasVoiceSupport;
bool bHasVoiceSupport = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
EBPOnlinePresenceState PresenceState;
EBPOnlinePresenceState PresenceState = EBPOnlinePresenceState::Offline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString StatusString;
FBPFriendPresenceInfo()
{
bIsOnline = false;
bIsPlaying = false;
bIsPlayingThisGame = false;
bIsJoinable = false;
bHasVoiceSupport = false;
PresenceState = EBPOnlinePresenceState::Offline;
}
};
USTRUCT(BlueprintType)
struct FBPFriendInfo
{
@@ -280,15 +288,22 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FString RealName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
EBPOnlinePresenceState OnlineState;
EBPOnlinePresenceState OnlineState = EBPOnlinePresenceState::Offline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FBPUniqueNetId UniqueNetId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
bool bIsPlayingSameGame;
bool bIsPlayingSameGame = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Online|Friend")
FBPFriendPresenceInfo PresenceInfo;
FBPFriendInfo()
{
OnlineState = EBPOnlinePresenceState::Offline;
bIsPlayingSameGame = false;
}
};
/** The types of comparison operations for a given search query */
// Used to compare session properties
UENUM(BlueprintType)

View File

@@ -24,20 +24,23 @@ class UCreateSessionCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase
* @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 bUsePresence Must be true for a 'listen' server (Map must be loaded with option 'listen'), false for a 'dedicated' server.
* @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 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")
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);
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);
// UOnlineBlueprintCallProxyBase interface
virtual void Activate() override;
// End of UOnlineBlueprintCallProxyBase interface
private:
// Internal callback when session creation completes, calls StartSession
// Internal callback when session creation completes, optionally calls StartSession
void OnCreateCompleted(FName SessionName, bool bWasSuccessful);
// Internal callback when session creation completes, calls StartSession
// Internal callback when session start completes
void OnStartCompleted(FName SessionName, bool bWasSuccessful);
// The player controller triggering things
@@ -71,6 +74,9 @@ private:
// Whether to use the presence option
bool bUsePresence;
// Whether to prefer the use of lobbies for hosting if the api supports them
bool bUseLobbiesIfAvailable;
// Whether to allow joining via presence
bool bAllowJoinViaPresence;
@@ -86,6 +92,12 @@ private:
// Should advertise server?
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
TArray<FSessionPropertyKeyPair> ExtraSettings;

View File

@@ -19,8 +19,11 @@ class UEndSessionCallbackProxy : public UOnlineBlueprintCallProxyBase
UPROPERTY(BlueprintAssignable)
FEmptyOnlineDelegate OnFailure;
// Ends the current session
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")
/**
* Ends the current sessions, Generally for almost all uses you should be using the engines native Destroy Session node instead.
* 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);
// UOnlineBlueprintCallProxyBase interface

View File

@@ -22,7 +22,7 @@ class UFindSessionsCallbackProxyAdvanced : public UOnlineBlueprintCallProxyBase
// Searches for advertised sessions with the default online subsystem and includes an array of filters
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject", AutoCreateRefTerm="Filters"), Category = "Online|AdvancedSessions")
static UFindSessionsCallbackProxyAdvanced* FindSessionsAdvanced(UObject* WorldContextObject, class APlayerController* PlayerController, int32 MaxResults, bool bUseLAN, EBPServerPresenceSearchType ServerTypeToSearch, const TArray<FSessionsSearchSetting> &Filters, bool bEmptyServersOnly = false, bool bNonEmptyServersOnly = false, bool bSecureServersOnly = false, 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, bool bSearchLobbies = true, int MinSlotsAvailable = 0);
static bool CompareVariants(const FVariantData &A, const FVariantData &B, EOnlineComparisonOpRedux Comparator);
@@ -92,6 +92,9 @@ private:
// Search for secure servers only
bool bSecureServersOnly;
// Search through lobbies
bool bSearchLobbies;
// Min slots requires to search
int MinSlotsAvailable;

View File

@@ -21,8 +21,8 @@ class ULoginUserCallbackProxy : public UOnlineBlueprintCallProxyBase
FEmptyOnlineDelegate OnFailure;
// Logs into the identity interface
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject"), Category = "Online|AdvancedIdentity")
static ULoginUserCallbackProxy* LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken);
UFUNCTION(BlueprintCallable, meta=(BlueprintInternalUseOnly = "true", WorldContext="WorldContextObject", AdvancedDisplay = "AuthType"), Category = "Online|AdvancedIdentity")
static ULoginUserCallbackProxy* LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken, FString AuthType);
// UOnlineBlueprintCallProxyBase interface
virtual void Activate() override;
@@ -42,6 +42,8 @@ private:
// The user pass / token
FString UserToken;
FString AuthType;
// The delegate executed by the online subsystem
FOnLoginCompleteDelegate Delegate;

View File

@@ -0,0 +1,46 @@
#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(const 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
const UObject* WorldContextObject;
};

View File

@@ -451,6 +451,17 @@ 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)
{
if (!PlayerState)
@@ -528,3 +539,20 @@ void UAdvancedSessionsLibrary::GetNumberOfNetworkPlayers(UObject* WorldContextOb
NumNetPlayers = TheWorld->GetGameState()->PlayerArray.Num();
}
bool UAdvancedSessionsLibrary::ServerTravel(UObject* WorldContextObject, const FString& FURL, bool bAbsolute, bool bShouldSkipGameNotify)
{
if (!WorldContextObject)
{
return false;
}
//using a context object to get the world
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::ReturnNull);
if (World)
{
return World->ServerTravel(FURL, bAbsolute, bShouldSkipGameNotify);
}
return false;
}

View File

@@ -0,0 +1,74 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "AutoLoginUserCallbackProxy.h"
#include "Kismet/GameplayStatics.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()
{
auto Identity = Online::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)
{
auto Identity = Online::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();
}
}

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 bAllowJoinViaPresence, bool bAllowJoinViaPresenceFriendsOnly, bool bAntiCheatProtected, bool bUsesStats, bool bShouldAdvertise)
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* Proxy = NewObject<UCreateSessionCallbackProxyAdvanced>();
Proxy->PlayerControllerWeakPtr = PlayerController;
@@ -25,11 +25,14 @@ UCreateSessionCallbackProxyAdvanced* UCreateSessionCallbackProxyAdvanced::Create
Proxy->ExtraSettings = ExtraSettings;
Proxy->bDedicatedServer = bIsDedicatedServer;
Proxy->bUsePresence = bUsePresence;
Proxy->bUseLobbiesIfAvailable = bUseLobbiesIfAvailable;
Proxy->bAllowJoinViaPresence = bAllowJoinViaPresence;
Proxy->bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly;
Proxy->bAntiCheatProtected = bAntiCheatProtected;
Proxy->bUsesStats = bUsesStats;
Proxy->bShouldAdvertise = bShouldAdvertise;
Proxy->bUseLobbiesVoiceChatIfAvailable = bUseLobbiesVoiceChatIfAvailable;
Proxy->bStartAfterCreate = bStartAfterCreate;
return Proxy;
}
@@ -50,21 +53,27 @@ void UCreateSessionCallbackProxyAdvanced::Activate()
FOnlineSessionSettings Settings;
Settings.NumPublicConnections = NumPublicConnections;
Settings.NumPrivateConnections = NumPrivateConnections;
Settings.bShouldAdvertise = true;
Settings.bShouldAdvertise = bShouldAdvertise;
Settings.bAllowJoinInProgress = true;
Settings.bIsLANMatch = bUseLAN;
Settings.bAllowJoinViaPresence = true;
Settings.bAllowJoinViaPresence = bAllowJoinViaPresence;
Settings.bIsDedicated = bDedicatedServer;
if (bDedicatedServer)
{
Settings.bUsesPresence = false;
Settings.bUseLobbiesIfAvailable = false;
}
else
{
Settings.bUsesPresence = bUsePresence;
Settings.bUseLobbiesIfAvailable = bUseLobbiesIfAvailable;
}
Settings.bUseLobbiesVoiceChatIfAvailable = bUseLobbiesIfAvailable ? bUseLobbiesVoiceChatIfAvailable : false;
Settings.bAllowJoinViaPresenceFriendsOnly = bAllowJoinViaPresenceFriendsOnly;
Settings.bAntiCheatProtected = bAntiCheatProtected;
Settings.bUsesStats = bUsesStats;
Settings.bShouldAdvertise = bShouldAdvertise;
// These are about the only changes over the standard Create Sessions Node
Settings.bAllowInvites = bAllowInvites;
@@ -124,8 +133,17 @@ void UCreateSessionCallbackProxyAdvanced::OnCreateCompleted(FName SessionName, b
if (bWasSuccessful)
{
if (this->bStartAfterCreate)
{
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);
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
return;

View File

@@ -15,7 +15,7 @@ UFindSessionsCallbackProxyAdvanced::UFindSessionsCallbackProxyAdvanced(const FOb
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>();
Proxy->PlayerControllerWeakPtr = PlayerController;
@@ -27,6 +27,7 @@ UFindSessionsCallbackProxyAdvanced* UFindSessionsCallbackProxyAdvanced::FindSess
Proxy->bEmptyServersOnly = bEmptyServersOnly,
Proxy->bNonEmptyServersOnly = bNonEmptyServersOnly;
Proxy->bSecureServersOnly = bSecureServersOnly;
Proxy->bSearchLobbies = bSearchLobbies;
Proxy->MinSlotsAvailable = MinSlotsAvailable;
return Proxy;
}
@@ -73,6 +74,17 @@ void UFindSessionsCallbackProxyAdvanced::Activate()
#define SEARCH_USER FName(TEXT("SEARCHUSER"))
// Keywords to match in session search
#define SEARCH_KEYWORDS FName(TEXT("SEARCHKEYWORDS"))*/
/** Keywords to match in session search */
/** The matchmaking queue name to matchmake in, e.g. "TeamDeathmatch" (value is string) */
/** #define SEARCH_MATCHMAKING_QUEUE FName(TEXT("MATCHMAKINGQUEUE"))*/
/** If set, use the named Xbox Live hopper to find a session via matchmaking (value is a string) */
/** #define SEARCH_XBOX_LIVE_HOPPER_NAME FName(TEXT("LIVEHOPPERNAME"))*/
/** Which session template from the service configuration to use */
/** #define SEARCH_XBOX_LIVE_SESSION_TEMPLATE_NAME FName(TEXT("LIVESESSIONTEMPLATE"))*/
/** 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"))*/
/** Whether to use lobbies vs sessions */
/** #define SEARCH_LOBBIES FName(TEXT("LOBBYSEARCH"))*/
if (bEmptyServersOnly)
tem.Set(SEARCH_EMPTY_SERVERS_ONLY, true, EOnlineComparisonOp::Equals);
@@ -86,8 +98,6 @@ void UFindSessionsCallbackProxyAdvanced::Activate()
if (MinSlotsAvailable != 0)
tem.Set(SEARCH_MINSLOTSAVAILABLE, MinSlotsAvailable, EOnlineComparisonOp::GreaterThanEquals);
// Filter results
if (SearchSettings.Num() > 0)
{
@@ -104,6 +114,9 @@ void UFindSessionsCallbackProxyAdvanced::Activate()
case EBPServerPresenceSearchType::ClientServersOnly:
{
tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
if (bSearchLobbies)
tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals);
}
break;
@@ -116,9 +129,8 @@ void UFindSessionsCallbackProxyAdvanced::Activate()
case EBPServerPresenceSearchType::AllServers:
default:
{
// Only steam uses the separate searching flags currently
if (IOnlineSubsystem::DoesInstanceExist("STEAM"))
{
//if (IOnlineSubsystem::DoesInstanceExist("STEAM"))
//{
bRunSecondSearch = true;
SearchObjectDedicated = MakeShareable(new FOnlineSessionSearch);
@@ -126,11 +138,15 @@ void UFindSessionsCallbackProxyAdvanced::Activate()
SearchObjectDedicated->bIsLanQuery = bUseLAN;
FOnlineSearchSettingsEx DedicatedOnly = tem;
tem.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
if (bSearchLobbies)
tem.Set(SEARCH_LOBBIES, true, EOnlineComparisonOp::Equals);
//DedicatedOnly.Set(SEARCH_DEDICATED_ONLY, true, EOnlineComparisonOp::Equals);
SearchObjectDedicated->QuerySettings = DedicatedOnly;
}
//}
}
break;
}

View File

@@ -12,12 +12,13 @@ ULoginUserCallbackProxy::ULoginUserCallbackProxy(const FObjectInitializer& Objec
{
}
ULoginUserCallbackProxy* ULoginUserCallbackProxy::LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken)
ULoginUserCallbackProxy* ULoginUserCallbackProxy::LoginUser(UObject* WorldContextObject, class APlayerController* PlayerController, FString UserID, FString UserToken, FString AuthType)
{
ULoginUserCallbackProxy* Proxy = NewObject<ULoginUserCallbackProxy>();
Proxy->PlayerControllerWeakPtr = PlayerController;
Proxy->UserID = UserID;
Proxy->UserToken = UserToken;
Proxy->AuthType = AuthType;
Proxy->WorldContextObject = WorldContextObject;
return Proxy;
}
@@ -43,8 +44,13 @@ void ULoginUserCallbackProxy::Activate()
if (Identity.IsValid())
{
// Fallback to default AuthType if nothing is specified
if (AuthType.IsEmpty())
{
AuthType = Identity->GetAuthType();
}
DelegateHandle = Identity->AddOnLoginCompleteDelegate_Handle(Player->GetControllerId(), Delegate);
FOnlineAccountCredentials AccountCreds(Identity->GetAuthType(), UserID, UserToken);
FOnlineAccountCredentials AccountCreds(AuthType, UserID, UserToken);
Identity->Login(Player->GetControllerId(), AccountCreds);
return;
}
@@ -59,6 +65,8 @@ void ULoginUserCallbackProxy::OnCompleted(int32 LocalUserNum, bool bWasSuccessfu
{
ULocalPlayer* Player = Cast<ULocalPlayer>(PlayerControllerWeakPtr->Player);
FUniqueNetIdRepl UniqueID(UserId.AsShared());
if (Player)
{
auto Identity = Online::GetIdentityInterface();
@@ -67,6 +75,13 @@ void ULoginUserCallbackProxy::OnCompleted(int32 LocalUserNum, bool bWasSuccessfu
{
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

@@ -0,0 +1,62 @@
#include "StartSessionCallbackProxyAdvanced.h"
UStartSessionCallbackProxyAdvanced::UStartSessionCallbackProxyAdvanced(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, StartCompleteDelegate(FOnStartSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnStartCompleted))
{
}
UStartSessionCallbackProxyAdvanced* UStartSessionCallbackProxyAdvanced::StartAdvancedSession(
const UObject* WorldContextObject)
{
UStartSessionCallbackProxyAdvanced* Proxy = NewObject<UStartSessionCallbackProxyAdvanced>();
Proxy->WorldContextObject = WorldContextObject;
return Proxy;
}
void UStartSessionCallbackProxyAdvanced::Activate()
{
const FOnlineSubsystemBPCallHelperAdvanced Helper(
TEXT("StartSession"),
GEngine->GetWorldFromContextObject(WorldContextObject, 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)
{
const FOnlineSubsystemBPCallHelperAdvanced Helper(
TEXT("StartSessionCallback"),
GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
if (Helper.OnlineSub != nullptr)
{
const auto Sessions = Helper.OnlineSub->GetSessionInterface();
if (Sessions.IsValid())
{
Sessions->ClearOnStartSessionCompleteDelegate_Handle(StartCompleteDelegateHandle);
}
}
if (bWasSuccessful)
{
OnSuccess.Broadcast();
}
else
{
OnFailure.Broadcast();
}
}

View File

@@ -29,9 +29,11 @@ UUpdateSessionCallbackProxyAdvanced* UUpdateSessionCallbackProxyAdvanced::Update
void UUpdateSessionCallbackProxyAdvanced::Activate()
{
const FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("UpdateSession"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
IOnlineSessionPtr Sessions = Online::GetSessionInterface(GetWorld());
if (Helper.OnlineSub != nullptr)
{
const auto Sessions = Helper.OnlineSub->GetSessionInterface();
if (Sessions.IsValid())
{
if (Sessions->GetNumSessions() < 1)
@@ -94,6 +96,7 @@ void UUpdateSessionCallbackProxyAdvanced::Activate()
{
FFrame::KismetExecutionMessage(TEXT("Sessions not supported by Online Subsystem"), ELogVerbosity::Warning);
}
}
// Fail immediately
OnFailure.Broadcast();
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Sessions not supported"));
@@ -101,7 +104,11 @@ void UUpdateSessionCallbackProxyAdvanced::Activate()
void UUpdateSessionCallbackProxyAdvanced::OnUpdateCompleted(FName SessionName, bool bWasSuccessful)
{
IOnlineSessionPtr Sessions = Online::GetSessionInterface(GetWorld());
const FOnlineSubsystemBPCallHelperAdvanced Helper(TEXT("UpdateSessionCallback"), GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull));
if (Helper.OnlineSub != nullptr)
{
const auto Sessions = Helper.OnlineSub->GetSessionInterface();
if (Sessions.IsValid())
{
Sessions->ClearOnUpdateSessionCompleteDelegate_Handle(OnUpdateSessionCompleteDelegateHandle);
@@ -112,6 +119,7 @@ void UUpdateSessionCallbackProxyAdvanced::OnUpdateCompleted(FName SessionName, b
return;
}
}
}
if (!bWasSuccessful)
{

View File

@@ -2,8 +2,8 @@
"FileVersion" : 3,
"FriendlyName" : "Advanced Steam Sessions",
"Version" : 4.26,
"VersionName": "4.26",
"Version" : 5.0,
"VersionName": "5.0",
"Description" : "Adds new blueprint functions to handle more advanced session operations in Steam. REQUIRES ADVANCED SESSIONS",
"Category" : "Advanced Sessions Plugin",
"CreatedBy" : "Joshua Statzer",
@@ -33,6 +33,10 @@
{
"Name": "OnlineSubsystemSteam",
"Enabled": true
},
{
"Name": "SteamShared",
"Enabled": true
}
]
}

View File

@@ -0,0 +1,8 @@
[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

@@ -13,7 +13,7 @@ public class AdvancedSteamSessions : ModuleRules
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "OnlineSubsystem", "CoreUObject", "OnlineSubsystemUtils", "Networking", "Sockets", "AdvancedSessions"/*"Voice", "OnlineSubsystemSteam"*/ });
PrivateDependencyModuleNames.AddRange(new string[] { "OnlineSubsystem", "Sockets", "Networking", "OnlineSubsystemUtils" /*"Voice", "Steamworks","OnlineSubsystemSteam"*/});
if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Linux) || (Target.Platform == UnrealTargetPlatform.Mac))
if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Linux) || (Target.Platform == UnrealTargetPlatform.Mac))
{
PublicDependencyModuleNames.AddRange(new string[] { "Steamworks",/*"Voice",*/ "OnlineSubsystemSteam" });
PublicIncludePaths.AddRange(new string[] { "../Plugins/Online/OnlineSubsystemSteam/Source/Private" });// This is dumb but it isn't very open

View File

@@ -297,11 +297,11 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
FString GroupTag;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
int32 numOnline;
int32 numOnline = 0;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
int32 numInGame;
int32 numInGame = 0;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
int32 numChatting;
int32 numChatting = 0;
};

View File

@@ -55,7 +55,7 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
FBPUniqueNetId OfficerUniqueNetID; // Uint64 representation
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Online|SteamAPI|SteamGroups")
bool bIsOwner;
bool bIsOwner = false;
};

View File

@@ -332,18 +332,22 @@ UTexture2D * UAdvancedSteamFriendsLibrary::GetSteamFriendAvatar(const FBPUniqueN
UTexture2D* Avatar = UTexture2D::CreateTransient(Width, Height, PF_R8G8B8A8);
// Switched to a Memcpy instead of byte by byte transer
uint8* MipData = (uint8*)Avatar->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
if (FTexturePlatformData* PlatformData = Avatar->GetPlatformData())
{
uint8* MipData = (uint8*)PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
FMemory::Memcpy(MipData, (void*)oAvatarRGBA, Height * Width * 4);
Avatar->PlatformData->Mips[0].BulkData.Unlock();
PlatformData->Mips[0].BulkData.Unlock();
// Original implementation was missing this!!
// the hell man......
delete[] oAvatarRGBA;
//Setting some Parameters for the Texture and finally returning it
Avatar->PlatformData->SetNumSlices(1);
PlatformData->SetNumSlices(1);
Avatar->NeverStream = true;
//Avatar->CompressionSettings = TC_EditorIcon;
}
Avatar->UpdateResource();
@@ -395,7 +399,18 @@ bool UAdvancedSteamFriendsLibrary::FilterText(FString TextToFilter, EBPTextFilte
id = *((uint64*)TextSourceID.UniqueNetId->GetBytes());
}
// MAC is bugged with current steam version according to epic, they forced it to be the old steam ver
#if PLATFORM_MAC
// Filters the provided input message and places the filtered result into pchOutFilteredText.
// pchOutFilteredText is where the output will be placed, even if no filtering or censoring is performed
// nByteSizeOutFilteredText is the size (in bytes) of pchOutFilteredText
// pchInputText is the input string that should be filtered, which can be ASCII or UTF-8
// bLegalOnly should be false if you want profanity and legally required filtering (where required) and true if you want legally required filtering only
// Returns the number of characters (not bytes) filtered.
int FilterCount = SteamUtils()->FilterText(OutText, BufferLen, TCHAR_TO_ANSI(*TextToFilter), Context == EBPTextFilteringContext::FContext_GameContent);
#else
int FilterCount = SteamUtils()->FilterText((ETextFilteringContext)Context, id, TCHAR_TO_ANSI(*TextToFilter), OutText, BufferLen);
#endif
if (FilterCount > 0)
{

View File

@@ -1,7 +1,7 @@
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "SteamRequestGroupOfficersCallbackProxy.h"
#include "UObject/CoreOnline.h"
#include "Online/CoreOnline.h"
#include "AdvancedSteamFriendsLibrary.h"
#include "OnlineSubSystemHeader.h"
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX