diff --git a/Facepunch.Steamworks/Client.Auth.cs b/Facepunch.Steamworks/Client.Auth.cs
index 0e72aec..e951c67 100644
--- a/Facepunch.Steamworks/Client.Auth.cs
+++ b/Facepunch.Steamworks/Client.Auth.cs
@@ -42,7 +42,7 @@ public unsafe Ticket GetAuthSessionTicket()
fixed ( byte* b = data )
{
uint ticketLength = 0;
- uint ticket = client._user.GetAuthSessionTicket( (IntPtr) b, data.Length, ref ticketLength );
+ uint ticket = client.native.user.GetAuthSessionTicket( (IntPtr) b, data.Length, ref ticketLength );
if ( ticket == 0 )
return null;
@@ -61,7 +61,7 @@ public unsafe Ticket GetAuthSessionTicket()
///
public void CancelAuthTicket( Ticket ticket )
{
- client._user.CancelAuthTicket( ticket.Handle );
+ client.native.user.CancelAuthTicket( ticket.Handle );
ticket.Handle = 0;
ticket.Data = null;
}
diff --git a/Facepunch.Steamworks/Client.Networking.cs b/Facepunch.Steamworks/Client.Networking.cs
index c103e3a..35ee8fa 100644
--- a/Facepunch.Steamworks/Client.Networking.cs
+++ b/Facepunch.Steamworks/Client.Networking.cs
@@ -113,7 +113,7 @@ public unsafe bool SendP2PPacket( ulong steamid, byte[] data, int length, EP2PSe
{
fixed ( byte* p = data )
{
- return client._networking.SendP2PPacket( steamid, (IntPtr) p, (uint)length, (uint)eP2PSendType, nChannel );
+ return client.native.networking.SendP2PPacket( steamid, (IntPtr) p, (uint)length, (uint)eP2PSendType, nChannel );
}
}
@@ -121,7 +121,7 @@ private unsafe bool ReadP2PPacket( MemoryStream ms, int channel = 0 )
{
uint DataAvailable = 0;
- if ( !client._networking.IsP2PPacketAvailable( ref DataAvailable, channel ) || DataAvailable == 0 )
+ if ( !client.native.networking.IsP2PPacketAvailable( ref DataAvailable, channel ) || DataAvailable == 0 )
return false;
if ( ms.Capacity < DataAvailable )
@@ -133,7 +133,7 @@ private unsafe bool ReadP2PPacket( MemoryStream ms, int channel = 0 )
fixed ( byte* p = ms.GetBuffer() )
{
ulong steamid = 1;
- if ( !client._networking.ReadP2PPacket( (IntPtr)p, (uint)DataAvailable, ref DataAvailable, ref steamid, channel ) || DataAvailable == 0 )
+ if ( !client.native.networking.ReadP2PPacket( (IntPtr)p, (uint)DataAvailable, ref DataAvailable, ref steamid, channel ) || DataAvailable == 0 )
return false;
ms.SetLength( DataAvailable );
diff --git a/Facepunch.Steamworks/Client.Overlay.cs b/Facepunch.Steamworks/Client.Overlay.cs
index 8cded37..66a635c 100644
--- a/Facepunch.Steamworks/Client.Overlay.cs
+++ b/Facepunch.Steamworks/Client.Overlay.cs
@@ -25,17 +25,17 @@ public class Overlay
{
internal Client client;
- public void OpenProfile( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "steamid", steamid ); }
- public void OpenChat( ulong steamid ){ client._friends.ActivateGameOverlayToUser( "chat", steamid ); }
- public void OpenTrade( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "jointrade", steamid ); }
- public void OpenStats( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "stats", steamid ); }
- public void OpenAchievements( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "achievements", steamid ); }
+ public void OpenProfile( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "steamid", steamid ); }
+ public void OpenChat( ulong steamid ){ client.native.friends.ActivateGameOverlayToUser( "chat", steamid ); }
+ public void OpenTrade( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "jointrade", steamid ); }
+ public void OpenStats( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "stats", steamid ); }
+ public void OpenAchievements( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "achievements", steamid ); }
- public void AddFriend( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "friendadd", steamid ); }
- public void RemoveFriend( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "friendremove", steamid ); }
- public void AcceptFriendRequest( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "friendrequestaccept", steamid ); }
- public void IgnoreFriendRequest( ulong steamid ) { client._friends.ActivateGameOverlayToUser( "friendrequestignore", steamid ); }
+ public void AddFriend( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "friendadd", steamid ); }
+ public void RemoveFriend( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "friendremove", steamid ); }
+ public void AcceptFriendRequest( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "friendrequestaccept", steamid ); }
+ public void IgnoreFriendRequest( ulong steamid ) { client.native.friends.ActivateGameOverlayToUser( "friendrequestignore", steamid ); }
- public void OpenUrl( string url ) { client._friends.ActivateGameOverlayToWebPage( url ); }
+ public void OpenUrl( string url ) { client.native.friends.ActivateGameOverlayToWebPage( url ); }
}
}
diff --git a/Facepunch.Steamworks/Client.ServerList.Request.cs b/Facepunch.Steamworks/Client.ServerList.Request.cs
index 300b03f..50b8a49 100644
--- a/Facepunch.Steamworks/Client.ServerList.Request.cs
+++ b/Facepunch.Steamworks/Client.ServerList.Request.cs
@@ -136,7 +136,7 @@ public void Dispose()
if ( !Finished && Id != IntPtr.Zero )
{
if ( client.Valid )
- client._servers.CancelQuery( Id );
+ client.native.servers.CancelQuery( Id );
Id = IntPtr.Zero;
}
@@ -170,7 +170,7 @@ private void NonResponsive( IntPtr thisptr, IntPtr RequestId, int iServer )
if ( RequestId != Id )
throw new Exception( "Request ID is invalid!" );
- var info = client._servers.GetServerDetails( Id, iServer );
+ var info = client.native.servers.GetServerDetails( Id, iServer );
Unresponsive.Add( Server.FromSteam( info ) );
}
@@ -179,7 +179,7 @@ private void OnServerResponded( IntPtr thisptr, IntPtr RequestId, int iServer )
if ( RequestId != Id )
throw new Exception( "Request ID is invalid!" );
- var info = client._servers.GetServerDetails( Id, iServer );
+ var info = client.native.servers.GetServerDetails( Id, iServer );
Responded.Add( Server.FromSteam( info ) );
System.Diagnostics.Debug.WriteLine( info.m_szServerName );
diff --git a/Facepunch.Steamworks/Client.ServerList.cs b/Facepunch.Steamworks/Client.ServerList.cs
index ad2ff2f..2e4d2f3 100644
--- a/Facepunch.Steamworks/Client.ServerList.cs
+++ b/Facepunch.Steamworks/Client.ServerList.cs
@@ -53,7 +53,7 @@ public unsafe Request Test()
client = client
};
- request.Id = client._servers.RequestInternetServerList( client.AppId, new IntPtr[] { }, request.GetVTablePointer() );
+ request.Id = client.native.servers.RequestInternetServerList( client.AppId, new IntPtr[] { }, request.GetVTablePointer() );
return request;
}
diff --git a/Facepunch.Steamworks/Client.Voice.cs b/Facepunch.Steamworks/Client.Voice.cs
index cc003ea..5a9a155 100644
--- a/Facepunch.Steamworks/Client.Voice.cs
+++ b/Facepunch.Steamworks/Client.Voice.cs
@@ -39,7 +39,7 @@ public class Voice
///
public uint OptimalSampleRate
{
- get { return client._user.GetVoiceOptimalSampleRate(); }
+ get { return client.native.user.GetVoiceOptimalSampleRate(); }
}
private bool _wantsrecording = false;
@@ -58,11 +58,11 @@ public bool WantsRecording
if ( value )
{
- client._user.StartVoiceRecording();
+ client.native.user.StartVoiceRecording();
}
else
{
- client._user.StopVoiceRecording();
+ client.native.user.StopVoiceRecording();
}
}
}
@@ -86,7 +86,7 @@ internal unsafe void Update()
bufferRegularLastWrite = 0;
bufferCompressedLastWrite = 0;
- Valve.Steamworks.EVoiceResult result = (Valve.Steamworks.EVoiceResult) client._user.GetVoice( OnUncompressedData != null, (IntPtr) pbufferCompressed, (uint) bufferCompressed.Length, ref bufferCompressedLastWrite,
+ Valve.Steamworks.EVoiceResult result = (Valve.Steamworks.EVoiceResult) client.native.user.GetVoice( OnUncompressedData != null, (IntPtr) pbufferCompressed, (uint) bufferCompressed.Length, ref bufferCompressedLastWrite,
OnCompressedData != null, (IntPtr) pbufferRegular, (uint) bufferRegular.Length, ref bufferRegularLastWrite,
DesiredSampleRate == 0 ? OptimalSampleRate : DesiredSampleRate );
diff --git a/Facepunch.Steamworks/Client.cs b/Facepunch.Steamworks/Client.cs
index 2e26673..a4d6c10 100644
--- a/Facepunch.Steamworks/Client.cs
+++ b/Facepunch.Steamworks/Client.cs
@@ -7,16 +7,66 @@ namespace Facepunch.Steamworks
{
public partial class Client : IDisposable
{
- private uint _hpipe;
- private uint _huser;
- internal Valve.Steamworks.ISteamClient _client;
- internal Valve.Steamworks.ISteamUser _user;
- internal Valve.Steamworks.ISteamApps _apps;
- internal Valve.Steamworks.ISteamFriends _friends;
- internal Valve.Steamworks.ISteamMatchmakingServers _servers;
- internal Valve.Steamworks.ISteamInventory _inventory;
- internal Valve.Steamworks.ISteamNetworking _networking;
+
+ internal class Internal : IDisposable
+ {
+ private uint _hpipe;
+ private uint _huser;
+
+ internal Valve.Steamworks.ISteamClient client;
+ internal Valve.Steamworks.ISteamUser user;
+ internal Valve.Steamworks.ISteamApps apps;
+ internal Valve.Steamworks.ISteamFriends friends;
+ internal Valve.Steamworks.ISteamMatchmakingServers servers;
+ internal Valve.Steamworks.ISteamInventory inventory;
+ internal Valve.Steamworks.ISteamNetworking networking;
+
+ internal bool Init()
+ {
+ client = Valve.Steamworks.SteamAPI.SteamClient();
+
+ if ( client.GetIntPtr() == IntPtr.Zero )
+ {
+ client = null;
+ return false;
+ }
+
+ _hpipe = client.CreateSteamPipe();
+ _huser = client.ConnectToGlobalUser( _hpipe );
+
+ friends = client.GetISteamFriends( _huser, _hpipe, "SteamFriends015" );
+ user = client.GetISteamUser( _huser, _hpipe, "SteamUser019" );
+ servers = client.GetISteamMatchmakingServers( _huser, _hpipe, "SteamMatchMakingServers002" );
+ inventory = client.GetISteamInventory( _huser, _hpipe, "STEAMINVENTORY_INTERFACE_V001" );
+ networking = client.GetISteamNetworking( _huser, _hpipe, "SteamNetworking005" );
+ apps = client.GetISteamApps( _huser, _hpipe, "STEAMAPPS_INTERFACE_VERSION008" );
+
+ return true;
+ }
+
+ public void Dispose()
+ {
+ if ( _hpipe > 0 && client != null )
+ {
+ if ( _huser > 0 )
+ client.ReleaseUser( _hpipe, _huser );
+
+ client.BReleaseSteamPipe( _hpipe );
+
+ _huser = 0;
+ _hpipe = 0;
+ }
+
+ if ( client != null )
+ {
+ client.BShutdownIfAllPipesClosed();
+ client = null;
+ }
+ }
+ }
+
+ internal Internal native;
///
/// Current running program's AppId
@@ -47,11 +97,16 @@ public enum MessageType : int
public Client( uint appId )
{
Valve.Steamworks.SteamAPI.Init( appId );
- _client = Valve.Steamworks.SteamAPI.SteamClient();
- if ( _client.GetIntPtr() == IntPtr.Zero )
+ native = new Internal();
+
+ //
+ // Get other interfaces
+ //
+ if ( !native.Init() )
{
- _client = null;
+ native.Dispose();
+ native = null;
return;
}
@@ -59,49 +114,22 @@ public Client( uint appId )
// Set up warning hook callback
//
SteamAPIWarningMessageHook ptr = InternalOnWarning;
- _client.SetWarningMessageHook( Marshal.GetFunctionPointerForDelegate( ptr ) );
+ native.client.SetWarningMessageHook( Marshal.GetFunctionPointerForDelegate( ptr ) );
//
- // Get pipes
+ // Cache common, unchanging info
//
- _hpipe = _client.CreateSteamPipe();
- _huser = _client.ConnectToGlobalUser( _hpipe );
-
-
- //
- // Get other interfaces
- //
- _friends = _client.GetISteamFriends( _huser, _hpipe, "SteamFriends015" );
- _user = _client.GetISteamUser( _huser, _hpipe, "SteamUser019" );
- _servers = _client.GetISteamMatchmakingServers( _huser, _hpipe, "SteamMatchMakingServers002" );
- _inventory = _client.GetISteamInventory( _huser, _hpipe, "STEAMINVENTORY_INTERFACE_V001" );
- _networking = _client.GetISteamNetworking( _huser, _hpipe, "SteamNetworking005" );
- _apps = _client.GetISteamApps( _huser, _hpipe, "STEAMAPPS_INTERFACE_VERSION008" );
-
AppId = appId;
- Username = _friends.GetPersonaName();
- SteamId = _user.GetSteamID();
+ Username = native.friends.GetPersonaName();
+ SteamId = native.user.GetSteamID();
}
public void Dispose()
{
- if ( _client != null )
+ if ( native != null)
{
- if ( _hpipe > 0 )
- {
- if ( _huser > 0 )
- _client.ReleaseUser( _hpipe, _huser );
-
- _client.BReleaseSteamPipe( _hpipe );
-
- _huser = 0;
- _hpipe = 0;
- }
-
- _friends = null;
-
- _client.BShutdownIfAllPipesClosed();
- _client = null;
+ native.Dispose();
+ native = null;
}
}
@@ -129,7 +157,7 @@ public void Update()
public bool Valid
{
- get { return _client != null; }
+ get { return native != null; }
}
internal Action InstallCallback( int type, Delegate action )
diff --git a/Facepunch.Steamworks/Client/App.cs b/Facepunch.Steamworks/Client/App.cs
index 7dd6556..fc4dc99 100644
--- a/Facepunch.Steamworks/Client/App.cs
+++ b/Facepunch.Steamworks/Client/App.cs
@@ -32,7 +32,7 @@ internal App( Client c )
public void MarkContentCorrupt( bool missingFilesOnly = false )
{
- client._apps.MarkContentCorrupt( missingFilesOnly );
+ client.native.apps.MarkContentCorrupt( missingFilesOnly );
}
diff --git a/Facepunch.Steamworks/Client/Inventory.cs b/Facepunch.Steamworks/Client/Inventory.cs
index 576b456..666b752 100644
--- a/Facepunch.Steamworks/Client/Inventory.cs
+++ b/Facepunch.Steamworks/Client/Inventory.cs
@@ -46,7 +46,7 @@ internal Inventory( Client c )
///
public void DropHeartbeat()
{
- client._inventory.SendItemDropHeartbeat();
+ client.native.inventory.SendItemDropHeartbeat();
}
///
@@ -58,8 +58,8 @@ public void DropHeartbeat()
public void TriggerItemDrop( Definition definition )
{
int result = 0;
- client._inventory.TriggerItemDrop( ref result, definition.Id );
- client._inventory.DestroyResult( result );
+ client.native.inventory.TriggerItemDrop( ref result, definition.Id );
+ client.native.inventory.DestroyResult( result );
}
@@ -74,7 +74,7 @@ public void Refresh()
if ( updateRequest != 0 )
return;
- client._inventory.GetAllItems( ref updateRequest );
+ client.native.inventory.GetAllItems( ref updateRequest );
}
internal void LoadItemDefinitions()
@@ -82,10 +82,10 @@ internal void LoadItemDefinitions()
//
// Make sure item definitions are loaded, because we're going to be using them.
//
- client._inventory.LoadItemDefinitions();
+ client.native.inventory.LoadItemDefinitions();
int[] ids;
- if ( !client._inventory.GetItemDefinitionIDs( out ids ) )
+ if ( !client.native.inventory.GetItemDefinitionIDs( out ids ) )
return;
Definitions = ids.Select( x =>
@@ -105,7 +105,7 @@ internal void LoadItemDefinitions()
internal T DefinitionProperty( int i, string name )
{
string val = string.Empty;
- client._inventory.GetItemDefinitionProperty( i, name, out val );
+ client.native.inventory.GetItemDefinitionProperty( i, name, out val );
return (T) Convert.ChangeType( val, typeof( T) );
}
@@ -113,7 +113,7 @@ internal void DestroyResult()
{
if ( updateRequest != 0 )
{
- client._inventory.DestroyResult( updateRequest );
+ client.native.inventory.DestroyResult( updateRequest );
updateRequest = 0;
}
}
@@ -129,7 +129,7 @@ private void UpdateRequest()
if ( updateRequest == 0 )
return;
- var status = (Valve.Steamworks.EResult) client._inventory.GetResultStatus( updateRequest );
+ var status = (Valve.Steamworks.EResult) client.native.inventory.GetResultStatus( updateRequest );
if ( status == Valve.Steamworks.EResult.k_EResultPending )
return;
@@ -165,7 +165,7 @@ private void UpdateRequest()
private unsafe void RetrieveInventory()
{
Valve.Steamworks.SteamItemDetails_t[] items = null;
- client._inventory.GetResultItems( updateRequest, out items );
+ client.native.inventory.GetResultItems( updateRequest, out items );
Items = items.Select( x =>
{
@@ -184,12 +184,12 @@ private unsafe void RetrieveInventory()
// Get a serialized version
//
uint size = 0;
- client._inventory.SerializeResult( updateRequest, IntPtr.Zero, ref size );
+ client.native.inventory.SerializeResult( updateRequest, IntPtr.Zero, ref size );
SerializedItems = new byte[size];
fixed( byte* b = SerializedItems )
{
- client._inventory.SerializeResult( updateRequest, (IntPtr) b, ref size );
+ client.native.inventory.SerializeResult( updateRequest, (IntPtr) b, ref size );
}
SerializedExpireTime = DateTime.Now.Add( TimeSpan.FromMinutes( 60 ) );
@@ -243,7 +243,7 @@ public T GetProperty( string name )
{
string val = string.Empty;
- if ( !client._inventory.GetItemDefinitionProperty( Id, name, out val ) )
+ if ( !client.native.inventory.GetItemDefinitionProperty( Id, name, out val ) )
return default( T );
try