Files
UnrealEngine/Engine/Plugins/Online/OnlineSubsystemSteam/Source/Private/SteamSessionKeys.h
2025-05-18 13:04:45 +08:00

142 lines
4.2 KiB
C

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Interfaces/OnlineSessionInterface.h"
#include "OnlineSubsystemSteamPrivate.h" // IWYU pragma: keep
#include "OnlineSessionSettings.h"
/** Internal Steam session keys for advertising */
/** Well defined lobby/server keys for use with Steam lobby/server data (NOTE: Steam expects UTF8) */
#define STEAMKEY_NUMPUBLICCONNECTIONS "NUMPUBCONN"
#define STEAMKEY_NUMPRIVATECONNECTIONS "NUMPRIVCONN"
#define STEAMKEY_SESSIONFLAGS "SESSIONFLAGS"
#define STEAMKEY_OWNINGUSERID "OWNINGID"
#define STEAMKEY_OWNINGUSERNAME "OWNINGNAME"
#define STEAMKEY_NUMOPENPRIVATECONNECTIONS "NUMOPENPRIVCONN"
#define STEAMKEY_NUMOPENPUBLICCONNECTIONS "NUMOPENPUBCONN"
#define STEAMKEY_BUILDUNIQUEID "BUILDID"
/** Number of keys above required for valid lobby session */
#define STEAMKEY_NUMREQUIREDLOBBYKEYS 9
#define STEAMKEY_NUMREQUIREDSERVERKEYS 4
/** Optional keys (depends on lobby/advertised server session) */
#define STEAMKEY_HOSTIP "HOSTIP"
#define STEAMKEY_HOSTPORT "HOSTPORT"
#define STEAMKEY_P2PADDR "P2PADDR"
#define STEAMKEY_P2PPORT "P2PPORT"
#define STEAMKEY_P2PPING "P2PPING"
#define STEAMKEY_CONNECTIONMETHOD "CONMETHOD"
/**
* Converts an engine key and its data type to an appropriate Steam key for use with lobbies/gameservers
* Encoded as key in the form <keyname>_<datatype> so that it is known client side
*
* @param Key online key
* @param Data data associated with the key
* @param KeyStr output Steam key for use with Steam lobbies
*
* @return true if successful, false if data type unknown/unsupported
*/
inline bool SessionKeyToSteamKey(const FName Key, const FVariantData& Data, FString& KeyStr)
{
switch (Data.GetType())
{
case EOnlineKeyValuePairDataType::Int32:
KeyStr = FString::Printf(TEXT("%s_i"), *Key.ToString());
break;
case EOnlineKeyValuePairDataType::Int64:
KeyStr = FString::Printf(TEXT("%s_l"), *Key.ToString());
break;
case EOnlineKeyValuePairDataType::Double:
KeyStr = FString::Printf(TEXT("%s_d"), *Key.ToString());
break;
case EOnlineKeyValuePairDataType::String:
KeyStr = FString::Printf(TEXT("%s_s"), *Key.ToString());
break;
case EOnlineKeyValuePairDataType::Float:
KeyStr = FString::Printf(TEXT("%s_f"), *Key.ToString());
break;
case EOnlineKeyValuePairDataType::Bool:
KeyStr = FString::Printf(TEXT("%s_b"), *Key.ToString());
break;
case EOnlineKeyValuePairDataType::Empty:
case EOnlineKeyValuePairDataType::Blob:
default:
return false;
}
return true;
}
/**
* Converts Steam key/value data back to its appropriate online key and its associated data
* see SessionKeyToSteamKey() above
*
* @param SteamKey key in Steam string format
* @param SteamValue data associated with the SteamKey
* @param Key output key for use with online subsystem
* @param Setting output data associated with Key
*
* @return true if successful, false if data type unknown/unsupported
*/
inline bool SteamKeyToSessionSetting(const TCHAR* SteamKey, const ANSICHAR* SteamValue, FName& Key, FOnlineSessionSetting& Setting)
{
bool bSuccess = false;
TCHAR SteamKeyCopy[1024];
FCString::Strncpy(SteamKeyCopy, SteamKey, UE_ARRAY_COUNT(SteamKeyCopy));
TCHAR* DataType = FCString::Strrchr(SteamKeyCopy, '_');
if (DataType)
{
bSuccess = true;
// NULL Terminate the key
*DataType = '\0';
Key = FName(SteamKeyCopy);
// Advance to the data type
DataType += 1;
switch(DataType[0])
{
case 'i':
Setting.Data.SetValue((int32)0);
Setting.Data.FromString(ANSI_TO_TCHAR(SteamValue));
break;
case 'l':
Setting.Data.SetValue((uint64)0);
Setting.Data.FromString(ANSI_TO_TCHAR(SteamValue));
break;
case 'd':
Setting.Data.SetValue((double)0);
Setting.Data.FromString(ANSI_TO_TCHAR(SteamValue));
break;
case 's':
Setting.Data.SetValue(ANSI_TO_TCHAR(SteamValue));
break;
case 'f':
Setting.Data.SetValue((float)0);
Setting.Data.FromString(ANSI_TO_TCHAR(SteamValue));
break;
case 'b':
Setting.Data.SetValue(false);
Setting.Data.FromString(ANSI_TO_TCHAR(SteamValue));
break;
default:
bSuccess = false;
}
}
if (!bSuccess)
{
UE_LOG_ONLINE_SESSION(Warning, TEXT("Unknown or unsupported data type from Steam key data %s %s"), SteamKey, ANSI_TO_TCHAR(SteamValue));
}
return bSuccess;
}