Add Friend.Nickname to get Steam nicknames for players

Expose FriendGameInfo.GameID so you can see what appID friends are playing
This commit is contained in:
Rohan Singh 2024-12-10 15:03:47 -05:00
parent ee6572a380
commit 520ac1ca51
2 changed files with 79 additions and 19 deletions

View File

@ -40,7 +40,7 @@ public override string ToString()
/// <summary>
/// Return true if this user is playing the game we're running
/// </summary>
public bool IsPlayingThisGame => GameInfo?.GameID == SteamClient.AppId;
public bool IsPlayingThisGame => GameInfo?.GameID is { Type: GameIdType.App } && GameInfo.Value.GameID.AppId == SteamClient.AppId;
/// <summary>
/// Returns true if this friend is online
@ -75,7 +75,26 @@ public async Task RequestInfoAsync()
public Relationship Relationship => SteamFriends.Internal.GetFriendRelationship( Id );
public FriendState State => SteamFriends.Internal.GetFriendPersonaState( Id );
/// <summary>
/// Returns the player's current Steam name.
/// <remarks>
/// Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
/// </remarks>
/// </summary>
public string Name => SteamFriends.Internal.GetFriendPersonaName( Id );
/// <summary>
/// Returns the nickname that was set for this Steam player, if any.
/// <remarks>
/// Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
/// </remarks>
/// </summary>
public string Nickname => SteamFriends.Internal.GetPlayerNickname( Id );
/// <summary>
/// Returns the player's Steam name history.
/// </summary>
public IEnumerable<string> NameHistory
{
get
@ -114,10 +133,10 @@ public bool IsIn( SteamId group_or_room )
public struct FriendGameInfo
{
internal ulong GameID; // m_gameID class CGameID
internal uint GameIP; // m_unGameIP uint32
internal ulong SteamIDLobby; // m_steamIDLobby class CSteamID
public GameId GameID;
public int ConnectionPort;
public int QueryPort;

View File

@ -1,25 +1,18 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace Steamworks.Data
{
public struct GameId
public enum GameIdType : byte
{
App = 0,
GameMod = 1,
Shortcut = 2,
P2P = 3,
}
public struct GameId : IEquatable<GameId>
{
// TODO - Be able to access these vars
/*
enum EGameIDType
{
k_EGameIDTypeApp = 0,
k_EGameIDTypeGameMod = 1,
k_EGameIDTypeShortcut = 2,
k_EGameIDTypeP2P = 3,
};
# ifdef VALVE_BIG_ENDIAN
unsigned int m_nModID : 32;
unsigned int m_nType : 8;
@ -30,8 +23,31 @@ enum EGameIDType
unsigned int m_nModID : 32;
#endif
*/
// 0xAAAAAAAA_BBCCCCCC
// A = m_nModID
// B = m_nType
// C = m_nAppID
public ulong Value;
public GameIdType Type
{
get => (GameIdType)(byte)( Value >> 24 );
set => Value = ( Value & 0xFFFFFFFF_00FFFFFF ) | ( (ulong)(byte)value << 24 );
}
public uint AppId
{
get => (uint)( Value & 0x00000000_00FFFFFF );
set => Value = ( Value & 0xFFFFFFFF_FF000000 ) | (value & 0x00000000_00FFFFFF);
}
public uint ModId
{
get => (uint)( Value >> 32 );
set => Value = ( Value & 0x00000000_FFFFFFFF ) | ( (ulong)value << 32 );
}
public static implicit operator GameId( ulong value )
{
return new GameId { Value = value };
@ -41,5 +57,30 @@ public static implicit operator ulong( GameId value )
{
return value.Value;
}
public bool Equals(GameId other)
{
return Value == other.Value;
}
public override bool Equals(object obj)
{
return obj is GameId other && Equals(other);
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
public static bool operator ==(GameId left, GameId right)
{
return left.Equals(right);
}
public static bool operator !=(GameId left, GameId right)
{
return !left.Equals(right);
}
}
}
}