mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2024-12-25 06:05:46 +03:00
Broken, some garbage errors or something
This commit is contained in:
parent
14b426b48a
commit
b509b92b38
@ -306,7 +306,9 @@ public void Rules()
|
|||||||
|
|
||||||
for ( int i = 0; i < 1000; i++ )
|
for ( int i = 0; i < 1000; i++ )
|
||||||
{
|
{
|
||||||
|
GC.Collect();
|
||||||
client.Update();
|
client.Update();
|
||||||
|
GC.Collect();
|
||||||
System.Threading.Thread.Sleep( 10 );
|
System.Threading.Thread.Sleep( 10 );
|
||||||
|
|
||||||
if ( query.Responded.Count > 20 )
|
if ( query.Responded.Count > 20 )
|
||||||
@ -320,13 +322,17 @@ public void Rules()
|
|||||||
|
|
||||||
foreach ( var server in query.Responded.Take( 20 ) )
|
foreach ( var server in query.Responded.Take( 20 ) )
|
||||||
{
|
{
|
||||||
|
GC.Collect();
|
||||||
server.FetchRules();
|
server.FetchRules();
|
||||||
|
GC.Collect();
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while ( !server.HasRules )
|
while ( !server.HasRules )
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
|
GC.Collect();
|
||||||
client.Update();
|
client.Update();
|
||||||
|
GC.Collect();
|
||||||
System.Threading.Thread.Sleep( 2 );
|
System.Threading.Thread.Sleep( 2 );
|
||||||
|
|
||||||
if ( i > 100 )
|
if ( i > 100 )
|
||||||
|
@ -119,6 +119,7 @@
|
|||||||
<Compile Include="Client.ServerList.Request.cs" />
|
<Compile Include="Client.ServerList.Request.cs" />
|
||||||
<Compile Include="Client.Auth.cs" />
|
<Compile Include="Client.Auth.cs" />
|
||||||
<Compile Include="Client.cs" />
|
<Compile Include="Client.cs" />
|
||||||
|
<Compile Include="Client.ServerList.Server.cs" />
|
||||||
<Compile Include="Client\App.cs" />
|
<Compile Include="Client\App.cs" />
|
||||||
<Compile Include="Client\Friends.cs" />
|
<Compile Include="Client\Friends.cs" />
|
||||||
<Compile Include="Client\Image.cs" />
|
<Compile Include="Client\Image.cs" />
|
||||||
@ -126,10 +127,11 @@
|
|||||||
<Compile Include="Client\Screenshots.cs" />
|
<Compile Include="Client\Screenshots.cs" />
|
||||||
<Compile Include="Client\Stats.cs" />
|
<Compile Include="Client\Stats.cs" />
|
||||||
<Compile Include="Client\Voice.cs" />
|
<Compile Include="Client\Voice.cs" />
|
||||||
|
<Compile Include="Interop\ServerRules.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Server.cs" />
|
|
||||||
<Compile Include="steam_api_interop.cs" />
|
<Compile Include="steam_api_interop.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
|
142
Facepunch.Steamworks/Interop/ServerRules.cs
Normal file
142
Facepunch.Steamworks/Interop/ServerRules.cs
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Facepunch.Steamworks.Interop
|
||||||
|
{
|
||||||
|
class ServerRules
|
||||||
|
{
|
||||||
|
private GCHandle thisPin;
|
||||||
|
private IntPtr vTablePtr;
|
||||||
|
private GCHandle vTableHandle;
|
||||||
|
|
||||||
|
private ServerList.Server Server;
|
||||||
|
|
||||||
|
public ServerRules( ServerList.Server server, uint address, int queryPort )
|
||||||
|
{
|
||||||
|
Server = server;
|
||||||
|
|
||||||
|
InstallVTable();
|
||||||
|
|
||||||
|
Valve.Interop.NativeEntrypoints.SteamAPI_ISteamMatchmakingServers_ServerRules( Server.Client.native.servers.GetIntPtr(), address, (short) queryPort, GetPtr() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void InstallVTable()
|
||||||
|
{
|
||||||
|
GC.KeepAlive( Server );
|
||||||
|
GC.SuppressFinalize( Server );
|
||||||
|
|
||||||
|
if ( Server.Client.UseThisCall )
|
||||||
|
{
|
||||||
|
var t = new ThisVTable()
|
||||||
|
{
|
||||||
|
m_VTRulesResponded = ( _, k, v ) => InternalOnRulesResponded( k, v ),
|
||||||
|
m_VTRulesFailedToRespond = ( _ ) => InternalOnRulesFailedToRespond(),
|
||||||
|
m_VTRulesRefreshComplete = ( _ ) => InternalOnRulesRefreshComplete(),
|
||||||
|
};
|
||||||
|
vTablePtr = Marshal.AllocHGlobal( Marshal.SizeOf( typeof( ThisVTable ) ) );
|
||||||
|
Marshal.StructureToPtr( t, vTablePtr, false );
|
||||||
|
|
||||||
|
vTableHandle = GCHandle.Alloc( vTablePtr, GCHandleType.Pinned );
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var t = new StdVTable()
|
||||||
|
{
|
||||||
|
m_VTRulesResponded = InternalOnRulesResponded,
|
||||||
|
m_VTRulesFailedToRespond = InternalOnRulesFailedToRespond,
|
||||||
|
m_VTRulesRefreshComplete = InternalOnRulesRefreshComplete
|
||||||
|
};
|
||||||
|
vTablePtr = Marshal.AllocHGlobal( Marshal.SizeOf( typeof( StdVTable ) ) );
|
||||||
|
Marshal.StructureToPtr( t, vTablePtr, false );
|
||||||
|
|
||||||
|
vTableHandle = GCHandle.Alloc( vTablePtr, GCHandleType.Pinned );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Unpin()
|
||||||
|
{
|
||||||
|
if ( vTablePtr != IntPtr.Zero )
|
||||||
|
{
|
||||||
|
Marshal.FreeHGlobal( vTablePtr );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( vTableHandle.IsAllocated )
|
||||||
|
{
|
||||||
|
vTableHandle.Free();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( thisPin.IsAllocated )
|
||||||
|
{
|
||||||
|
thisPin.Free();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InternalOnRulesResponded( IntPtr k, IntPtr v )
|
||||||
|
{
|
||||||
|
// Server.Rules.Add( k, v );
|
||||||
|
}
|
||||||
|
private void InternalOnRulesFailedToRespond()
|
||||||
|
{
|
||||||
|
Server.OnServerRulesReceiveFinished( false );
|
||||||
|
}
|
||||||
|
private void InternalOnRulesRefreshComplete()
|
||||||
|
{
|
||||||
|
Server.OnServerRulesReceiveFinished( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout( LayoutKind.Sequential )]
|
||||||
|
private class StdVTable
|
||||||
|
{
|
||||||
|
[NonSerialized]
|
||||||
|
[MarshalAs(UnmanagedType.FunctionPtr)]
|
||||||
|
public InternalRulesResponded m_VTRulesResponded;
|
||||||
|
|
||||||
|
[NonSerialized]
|
||||||
|
[MarshalAs(UnmanagedType.FunctionPtr)]
|
||||||
|
public InternalRulesFailedToRespond m_VTRulesFailedToRespond;
|
||||||
|
|
||||||
|
[NonSerialized]
|
||||||
|
[MarshalAs(UnmanagedType.FunctionPtr)]
|
||||||
|
public InternalRulesRefreshComplete m_VTRulesRefreshComplete;
|
||||||
|
|
||||||
|
[UnmanagedFunctionPointer( CallingConvention.StdCall )]
|
||||||
|
public delegate void InternalRulesResponded( IntPtr pchRule, IntPtr pchValue );
|
||||||
|
[UnmanagedFunctionPointer( CallingConvention.StdCall )]
|
||||||
|
public delegate void InternalRulesFailedToRespond();
|
||||||
|
[UnmanagedFunctionPointer( CallingConvention.StdCall )]
|
||||||
|
public delegate void InternalRulesRefreshComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout( LayoutKind.Sequential )]
|
||||||
|
private class ThisVTable
|
||||||
|
{
|
||||||
|
[NonSerialized]
|
||||||
|
[MarshalAs(UnmanagedType.FunctionPtr)]
|
||||||
|
public InternalRulesResponded m_VTRulesResponded;
|
||||||
|
|
||||||
|
[NonSerialized]
|
||||||
|
[MarshalAs(UnmanagedType.FunctionPtr)]
|
||||||
|
public InternalRulesFailedToRespond m_VTRulesFailedToRespond;
|
||||||
|
|
||||||
|
[NonSerialized]
|
||||||
|
[MarshalAs(UnmanagedType.FunctionPtr)]
|
||||||
|
public InternalRulesRefreshComplete m_VTRulesRefreshComplete;
|
||||||
|
|
||||||
|
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
||||||
|
public delegate void InternalRulesResponded( IntPtr thisptr, IntPtr pchRule, IntPtr pchValue );
|
||||||
|
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
||||||
|
public delegate void InternalRulesFailedToRespond( IntPtr thisptr );
|
||||||
|
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
||||||
|
public delegate void InternalRulesRefreshComplete( IntPtr thisptr );
|
||||||
|
}
|
||||||
|
|
||||||
|
public System.IntPtr GetPtr()
|
||||||
|
{
|
||||||
|
return vTableHandle.AddrOfPinnedObject();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user