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 +}