diff --git a/Facepunch.Steamworks/Structs/Friend.cs b/Facepunch.Steamworks/Structs/Friend.cs
index 4b45627..c7fa414 100644
--- a/Facepunch.Steamworks/Structs/Friend.cs
+++ b/Facepunch.Steamworks/Structs/Friend.cs
@@ -40,7 +40,7 @@ public override string ToString()
///
/// Return true if this user is playing the game we're running
///
- public bool IsPlayingThisGame => GameInfo?.GameID == SteamClient.AppId;
+ public bool IsPlayingThisGame => GameInfo?.GameID is { Type: GameIdType.App } && GameInfo.Value.GameID.AppId == SteamClient.AppId;
///
/// 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 );
+
+ ///
+ /// Returns the player's current Steam name.
+ ///
+ /// Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+ ///
+ ///
public string Name => SteamFriends.Internal.GetFriendPersonaName( Id );
+
+ ///
+ /// Returns the nickname that was set for this Steam player, if any.
+ ///
+ /// Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+ ///
+ ///
+ public string Nickname => SteamFriends.Internal.GetPlayerNickname( Id );
+
+ ///
+ /// Returns the player's Steam name history.
+ ///
public IEnumerable 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;
diff --git a/Facepunch.Steamworks/Structs/GameId.cs b/Facepunch.Steamworks/Structs/GameId.cs
index e5940c7..02b4f7d 100644
--- a/Facepunch.Steamworks/Structs/GameId.cs
+++ b/Facepunch.Steamworks/Structs/GameId.cs
@@ -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
{
- // 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);
+ }
}
-}
\ No newline at end of file
+}