using System; using System.Runtime.InteropServices; using System.Linq; namespace SteamNative { internal unsafe class SteamMatchmaking : IDisposable { // // Holds a platform specific implentation // internal Platform.Interface platform; internal Facepunch.Steamworks.BaseSteamworks steamworks; // // Constructor decides which implementation to use based on current platform // internal SteamMatchmaking( Facepunch.Steamworks.BaseSteamworks steamworks, IntPtr pointer ) { this.steamworks = steamworks; if ( Platform.IsWindows64 ) platform = new Platform.Win64( pointer ); else if ( Platform.IsWindows32 ) platform = new Platform.Win32( pointer ); else if ( Platform.IsLinux32 ) platform = new Platform.Linux32( pointer ); else if ( Platform.IsLinux64 ) platform = new Platform.Linux64( pointer ); else if ( Platform.IsOsx ) platform = new Platform.Mac( pointer ); } // // Class is invalid if we don't have a valid implementation // public bool IsValid{ get{ return platform != null && platform.IsValid; } } // // When shutting down clear all the internals to avoid accidental use // public virtual void Dispose() { if ( platform != null ) { platform.Dispose(); platform = null; } } // int public int AddFavoriteGame( AppId_t nAppID /*AppId_t*/, uint nIP /*uint32*/, ushort nConnPort /*uint16*/, ushort nQueryPort /*uint16*/, uint unFlags /*uint32*/, uint rTime32LastPlayedOnServer /*uint32*/ ) { return platform.ISteamMatchmaking_AddFavoriteGame( nAppID.Value, nIP, nConnPort, nQueryPort, unFlags, rTime32LastPlayedOnServer ); } // void public void AddRequestLobbyListCompatibleMembersFilter( CSteamID steamIDLobby /*class CSteamID*/ ) { platform.ISteamMatchmaking_AddRequestLobbyListCompatibleMembersFilter( steamIDLobby.Value ); } // void public void AddRequestLobbyListDistanceFilter( LobbyDistanceFilter eLobbyDistanceFilter /*ELobbyDistanceFilter*/ ) { platform.ISteamMatchmaking_AddRequestLobbyListDistanceFilter( eLobbyDistanceFilter ); } // void public void AddRequestLobbyListFilterSlotsAvailable( int nSlotsAvailable /*int*/ ) { platform.ISteamMatchmaking_AddRequestLobbyListFilterSlotsAvailable( nSlotsAvailable ); } // void public void AddRequestLobbyListNearValueFilter( string pchKeyToMatch /*const char **/, int nValueToBeCloseTo /*int*/ ) { platform.ISteamMatchmaking_AddRequestLobbyListNearValueFilter( pchKeyToMatch, nValueToBeCloseTo ); } // void public void AddRequestLobbyListNumericalFilter( string pchKeyToMatch /*const char **/, int nValueToMatch /*int*/, LobbyComparison eComparisonType /*ELobbyComparison*/ ) { platform.ISteamMatchmaking_AddRequestLobbyListNumericalFilter( pchKeyToMatch, nValueToMatch, eComparisonType ); } // void public void AddRequestLobbyListResultCountFilter( int cMaxResults /*int*/ ) { platform.ISteamMatchmaking_AddRequestLobbyListResultCountFilter( cMaxResults ); } // void public void AddRequestLobbyListStringFilter( string pchKeyToMatch /*const char **/, string pchValueToMatch /*const char **/, LobbyComparison eComparisonType /*ELobbyComparison*/ ) { platform.ISteamMatchmaking_AddRequestLobbyListStringFilter( pchKeyToMatch, pchValueToMatch, eComparisonType ); } // SteamAPICall_t public CallbackHandle CreateLobby( LobbyType eLobbyType /*ELobbyType*/, int cMaxMembers /*int*/, Action CallbackFunction = null /*Action*/ ) { SteamAPICall_t callback = 0; callback = platform.ISteamMatchmaking_CreateLobby( eLobbyType, cMaxMembers ); if ( CallbackFunction == null ) return null; if ( callback == 0 ) return null; return LobbyCreated_t.CallResult( steamworks, callback, CallbackFunction ); } // bool public bool DeleteLobbyData( CSteamID steamIDLobby /*class CSteamID*/, string pchKey /*const char **/ ) { return platform.ISteamMatchmaking_DeleteLobbyData( steamIDLobby.Value, pchKey ); } // bool public bool GetFavoriteGame( int iGame /*int*/, ref AppId_t pnAppID /*AppId_t **/, out uint pnIP /*uint32 **/, out ushort pnConnPort /*uint16 **/, out ushort pnQueryPort /*uint16 **/, out uint punFlags /*uint32 **/, out uint pRTime32LastPlayedOnServer /*uint32 **/ ) { return platform.ISteamMatchmaking_GetFavoriteGame( iGame, ref pnAppID.Value, out pnIP, out pnConnPort, out pnQueryPort, out punFlags, out pRTime32LastPlayedOnServer ); } // int public int GetFavoriteGameCount() { return platform.ISteamMatchmaking_GetFavoriteGameCount(); } // ulong public ulong GetLobbyByIndex( int iLobby /*int*/ ) { return platform.ISteamMatchmaking_GetLobbyByIndex( iLobby ); } // int public int GetLobbyChatEntry( CSteamID steamIDLobby /*class CSteamID*/, int iChatID /*int*/, out CSteamID pSteamIDUser /*class CSteamID **/, IntPtr pvData /*void **/, int cubData /*int*/, out ChatEntryType peChatEntryType /*EChatEntryType **/ ) { return platform.ISteamMatchmaking_GetLobbyChatEntry( steamIDLobby.Value, iChatID, out pSteamIDUser.Value, (IntPtr) pvData, cubData, out peChatEntryType ); } // string // with: Detect_StringReturn public string GetLobbyData( CSteamID steamIDLobby /*class CSteamID*/, string pchKey /*const char **/ ) { IntPtr string_pointer; string_pointer = platform.ISteamMatchmaking_GetLobbyData( steamIDLobby.Value, pchKey ); return Marshal.PtrToStringAnsi( string_pointer ); } // bool // with: Detect_StringFetch False // with: Detect_StringFetch False public bool GetLobbyDataByIndex( CSteamID steamIDLobby /*class CSteamID*/, int iLobbyData /*int*/, out string pchKey /*char **/, out string pchValue /*char **/ ) { bool bSuccess = default( bool ); pchKey = string.Empty; System.Text.StringBuilder pchKey_sb = Helpers.TakeStringBuilder(); int cchKeyBufferSize = 4096; pchValue = string.Empty; System.Text.StringBuilder pchValue_sb = Helpers.TakeStringBuilder(); int cchValueBufferSize = 4096; bSuccess = platform.ISteamMatchmaking_GetLobbyDataByIndex( steamIDLobby.Value, iLobbyData, pchKey_sb, cchKeyBufferSize, pchValue_sb, cchValueBufferSize ); if ( !bSuccess ) return bSuccess; pchValue = pchValue_sb.ToString(); if ( !bSuccess ) return bSuccess; pchKey = pchKey_sb.ToString(); return bSuccess; } // int public int GetLobbyDataCount( CSteamID steamIDLobby /*class CSteamID*/ ) { return platform.ISteamMatchmaking_GetLobbyDataCount( steamIDLobby.Value ); } // bool public bool GetLobbyGameServer( CSteamID steamIDLobby /*class CSteamID*/, out uint punGameServerIP /*uint32 **/, out ushort punGameServerPort /*uint16 **/, out CSteamID psteamIDGameServer /*class CSteamID **/ ) { return platform.ISteamMatchmaking_GetLobbyGameServer( steamIDLobby.Value, out punGameServerIP, out punGameServerPort, out psteamIDGameServer.Value ); } // ulong public ulong GetLobbyMemberByIndex( CSteamID steamIDLobby /*class CSteamID*/, int iMember /*int*/ ) { return platform.ISteamMatchmaking_GetLobbyMemberByIndex( steamIDLobby.Value, iMember ); } // string // with: Detect_StringReturn public string GetLobbyMemberData( CSteamID steamIDLobby /*class CSteamID*/, CSteamID steamIDUser /*class CSteamID*/, string pchKey /*const char **/ ) { IntPtr string_pointer; string_pointer = platform.ISteamMatchmaking_GetLobbyMemberData( steamIDLobby.Value, steamIDUser.Value, pchKey ); return Marshal.PtrToStringAnsi( string_pointer ); } // int public int GetLobbyMemberLimit( CSteamID steamIDLobby /*class CSteamID*/ ) { return platform.ISteamMatchmaking_GetLobbyMemberLimit( steamIDLobby.Value ); } // ulong public ulong GetLobbyOwner( CSteamID steamIDLobby /*class CSteamID*/ ) { return platform.ISteamMatchmaking_GetLobbyOwner( steamIDLobby.Value ); } // int public int GetNumLobbyMembers( CSteamID steamIDLobby /*class CSteamID*/ ) { return platform.ISteamMatchmaking_GetNumLobbyMembers( steamIDLobby.Value ); } // bool public bool InviteUserToLobby( CSteamID steamIDLobby /*class CSteamID*/, CSteamID steamIDInvitee /*class CSteamID*/ ) { return platform.ISteamMatchmaking_InviteUserToLobby( steamIDLobby.Value, steamIDInvitee.Value ); } // SteamAPICall_t public CallbackHandle JoinLobby( CSteamID steamIDLobby /*class CSteamID*/, Action CallbackFunction = null /*Action*/ ) { SteamAPICall_t callback = 0; callback = platform.ISteamMatchmaking_JoinLobby( steamIDLobby.Value ); if ( CallbackFunction == null ) return null; if ( callback == 0 ) return null; return LobbyEnter_t.CallResult( steamworks, callback, CallbackFunction ); } // void public void LeaveLobby( CSteamID steamIDLobby /*class CSteamID*/ ) { platform.ISteamMatchmaking_LeaveLobby( steamIDLobby.Value ); } // bool public bool RemoveFavoriteGame( AppId_t nAppID /*AppId_t*/, uint nIP /*uint32*/, ushort nConnPort /*uint16*/, ushort nQueryPort /*uint16*/, uint unFlags /*uint32*/ ) { return platform.ISteamMatchmaking_RemoveFavoriteGame( nAppID.Value, nIP, nConnPort, nQueryPort, unFlags ); } // bool public bool RequestLobbyData( CSteamID steamIDLobby /*class CSteamID*/ ) { return platform.ISteamMatchmaking_RequestLobbyData( steamIDLobby.Value ); } // SteamAPICall_t public CallbackHandle RequestLobbyList( Action CallbackFunction = null /*Action*/ ) { SteamAPICall_t callback = 0; callback = platform.ISteamMatchmaking_RequestLobbyList(); if ( CallbackFunction == null ) return null; if ( callback == 0 ) return null; return LobbyMatchList_t.CallResult( steamworks, callback, CallbackFunction ); } // bool public bool SendLobbyChatMsg( CSteamID steamIDLobby /*class CSteamID*/, IntPtr pvMsgBody /*const void **/, int cubMsgBody /*int*/ ) { return platform.ISteamMatchmaking_SendLobbyChatMsg( steamIDLobby.Value, (IntPtr) pvMsgBody, cubMsgBody ); } // bool public bool SetLinkedLobby( CSteamID steamIDLobby /*class CSteamID*/, CSteamID steamIDLobbyDependent /*class CSteamID*/ ) { return platform.ISteamMatchmaking_SetLinkedLobby( steamIDLobby.Value, steamIDLobbyDependent.Value ); } // bool public bool SetLobbyData( CSteamID steamIDLobby /*class CSteamID*/, string pchKey /*const char **/, string pchValue /*const char **/ ) { return platform.ISteamMatchmaking_SetLobbyData( steamIDLobby.Value, pchKey, pchValue ); } // void public void SetLobbyGameServer( CSteamID steamIDLobby /*class CSteamID*/, uint unGameServerIP /*uint32*/, ushort unGameServerPort /*uint16*/, CSteamID steamIDGameServer /*class CSteamID*/ ) { platform.ISteamMatchmaking_SetLobbyGameServer( steamIDLobby.Value, unGameServerIP, unGameServerPort, steamIDGameServer.Value ); } // bool public bool SetLobbyJoinable( CSteamID steamIDLobby /*class CSteamID*/, bool bLobbyJoinable /*bool*/ ) { return platform.ISteamMatchmaking_SetLobbyJoinable( steamIDLobby.Value, bLobbyJoinable ); } // void public void SetLobbyMemberData( CSteamID steamIDLobby /*class CSteamID*/, string pchKey /*const char **/, string pchValue /*const char **/ ) { platform.ISteamMatchmaking_SetLobbyMemberData( steamIDLobby.Value, pchKey, pchValue ); } // bool public bool SetLobbyMemberLimit( CSteamID steamIDLobby /*class CSteamID*/, int cMaxMembers /*int*/ ) { return platform.ISteamMatchmaking_SetLobbyMemberLimit( steamIDLobby.Value, cMaxMembers ); } // bool public bool SetLobbyOwner( CSteamID steamIDLobby /*class CSteamID*/, CSteamID steamIDNewOwner /*class CSteamID*/ ) { return platform.ISteamMatchmaking_SetLobbyOwner( steamIDLobby.Value, steamIDNewOwner.Value ); } // bool public bool SetLobbyType( CSteamID steamIDLobby /*class CSteamID*/, LobbyType eLobbyType /*ELobbyType*/ ) { return platform.ISteamMatchmaking_SetLobbyType( steamIDLobby.Value, eLobbyType ); } } }