diff --git a/Facepunch.Steamworks/Enum/SteamNetworking.cs b/Facepunch.Steamworks/Enum/SteamNetworking.cs
index b77a17e..8a8064b 100644
--- a/Facepunch.Steamworks/Enum/SteamNetworking.cs
+++ b/Facepunch.Steamworks/Enum/SteamNetworking.cs
@@ -11,7 +11,7 @@ enum SteamNetworkingGetConfigValueResult
Force32Bit = 0x7fffffff
};
- enum SteamNetworkingConfigDataType
+ enum NetConfigType
{
Int32 = 1,
Int64 = 2,
@@ -37,7 +37,7 @@ enum SteamNetworkingSocketsDebugOutputType : int
Force32Bit = 0x7fffffff
};
- internal enum SteamNetworkingConfigScope : int
+ internal enum NetScope : int
{
Global = 1,
SocketsInterface = 2,
@@ -47,7 +47,7 @@ internal enum SteamNetworkingConfigScope : int
Force32Bit = 0x7fffffff
}
- internal enum SteamNetworkingConfigValue : int
+ internal enum NetConfig : int
{
Invalid = 0,
FakePacketLoss_Send = 2,
diff --git a/Facepunch.Steamworks/Generated/Interfaces/ISteamNetworkingUtils.cs b/Facepunch.Steamworks/Generated/Interfaces/ISteamNetworkingUtils.cs
index bb78c03..322bf72 100644
--- a/Facepunch.Steamworks/Generated/Interfaces/ISteamNetworkingUtils.cs
+++ b/Facepunch.Steamworks/Generated/Interfaces/ISteamNetworkingUtils.cs
@@ -181,45 +181,45 @@ internal void SetDebugOutputFunction( SteamNetworkingSocketsDebugOutputType eDet
#region FunctionMeta
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
[return: MarshalAs( UnmanagedType.I1 )]
- private delegate bool FSetConfigValue( IntPtr self, SteamNetworkingConfigValue eValue, SteamNetworkingConfigScope eScopeType, IntPtr scopeObj, SteamNetworkingConfigDataType eDataType, IntPtr pArg );
+ private delegate bool FSetConfigValue( IntPtr self, NetConfig eValue, NetScope eScopeType, long scopeObj, NetConfigType eDataType, IntPtr pArg );
private FSetConfigValue _SetConfigValue;
#endregion
- internal bool SetConfigValue( SteamNetworkingConfigValue eValue, SteamNetworkingConfigScope eScopeType, IntPtr scopeObj, SteamNetworkingConfigDataType eDataType, IntPtr pArg )
+ internal bool SetConfigValue( NetConfig eValue, NetScope eScopeType, long scopeObj, NetConfigType eDataType, IntPtr pArg )
{
return _SetConfigValue( Self, eValue, eScopeType, scopeObj, eDataType, pArg );
}
#region FunctionMeta
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
- private delegate SteamNetworkingGetConfigValueResult FGetConfigValue( IntPtr self, SteamNetworkingConfigValue eValue, SteamNetworkingConfigScope eScopeType, IntPtr scopeObj, [In,Out] SteamNetworkingConfigDataType[] pOutDataType, IntPtr pResult, ref ulong cbResult );
+ private delegate SteamNetworkingGetConfigValueResult FGetConfigValue( IntPtr self, NetConfig eValue, NetScope eScopeType, long scopeObj, ref NetConfigType pOutDataType, IntPtr pResult, ref ulong cbResult );
private FGetConfigValue _GetConfigValue;
#endregion
- internal SteamNetworkingGetConfigValueResult GetConfigValue( SteamNetworkingConfigValue eValue, SteamNetworkingConfigScope eScopeType, IntPtr scopeObj, [In,Out] SteamNetworkingConfigDataType[] pOutDataType, IntPtr pResult, ref ulong cbResult )
+ internal SteamNetworkingGetConfigValueResult GetConfigValue( NetConfig eValue, NetScope eScopeType, long scopeObj, ref NetConfigType pOutDataType, IntPtr pResult, ref ulong cbResult )
{
- return _GetConfigValue( Self, eValue, eScopeType, scopeObj, pOutDataType, pResult, ref cbResult );
+ return _GetConfigValue( Self, eValue, eScopeType, scopeObj, ref pOutDataType, pResult, ref cbResult );
}
#region FunctionMeta
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
[return: MarshalAs( UnmanagedType.I1 )]
- private delegate bool FGetConfigValueInfo( IntPtr self, SteamNetworkingConfigValue eValue, [In,Out] string[] pOutName, [In,Out] SteamNetworkingConfigDataType[] pOutDataType, [In,Out] SteamNetworkingConfigScope[] pOutScope, [In,Out] SteamNetworkingConfigValue[] pOutNextValue );
+ private delegate bool FGetConfigValueInfo( IntPtr self, NetConfig eValue, [In,Out] string[] pOutName, ref NetConfigType pOutDataType, [In,Out] NetScope[] pOutScope, [In,Out] NetConfig[] pOutNextValue );
private FGetConfigValueInfo _GetConfigValueInfo;
#endregion
- internal bool GetConfigValueInfo( SteamNetworkingConfigValue eValue, [In,Out] string[] pOutName, [In,Out] SteamNetworkingConfigDataType[] pOutDataType, [In,Out] SteamNetworkingConfigScope[] pOutScope, [In,Out] SteamNetworkingConfigValue[] pOutNextValue )
+ internal bool GetConfigValueInfo( NetConfig eValue, [In,Out] string[] pOutName, ref NetConfigType pOutDataType, [In,Out] NetScope[] pOutScope, [In,Out] NetConfig[] pOutNextValue )
{
- return _GetConfigValueInfo( Self, eValue, pOutName, pOutDataType, pOutScope, pOutNextValue );
+ return _GetConfigValueInfo( Self, eValue, pOutName, ref pOutDataType, pOutScope, pOutNextValue );
}
#region FunctionMeta
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
- private delegate SteamNetworkingConfigValue FGetFirstConfigValue( IntPtr self );
+ private delegate NetConfig FGetFirstConfigValue( IntPtr self );
private FGetFirstConfigValue _GetFirstConfigValue;
#endregion
- internal SteamNetworkingConfigValue GetFirstConfigValue()
+ internal NetConfig GetFirstConfigValue()
{
return _GetFirstConfigValue( Self );
}
diff --git a/Facepunch.Steamworks/SteamNetworkingUtils.cs b/Facepunch.Steamworks/SteamNetworkingUtils.cs
index f6a6aea..c2f2bbe 100644
--- a/Facepunch.Steamworks/SteamNetworkingUtils.cs
+++ b/Facepunch.Steamworks/SteamNetworkingUtils.cs
@@ -78,5 +78,139 @@ public static async Task WaitForPingDataAsync( float maxAgeInSeconds = 60 * 5 )
await Task.Delay( 10 );
}
}
+
+ public static SteamNetworkingMicroseconds LocalTimetamp => Internal.GetLocalTimestamp();
+
+
+ ///
+ /// [0 - 100] - Randomly discard N pct of packets
+ ///
+ public static float FakeSendPacketLoss
+ {
+ get => GetConfigFloat( NetConfig.FakePacketLoss_Send );
+ set => SetConfigFloat( NetConfig.FakePacketLoss_Send, value );
+ }
+
+ ///
+ /// [0 - 100] - Randomly discard N pct of packets
+ ///
+ public static float FakeRecvPacketLoss
+ {
+ get => GetConfigFloat( NetConfig.FakePacketLoss_Recv );
+ set => SetConfigFloat( NetConfig.FakePacketLoss_Recv, value );
+ }
+
+ ///
+ /// Delay all packets by N ms
+ ///
+ public static float FakeSendPacketLag
+ {
+ get => GetConfigFloat( NetConfig.FakePacketLag_Send );
+ set => SetConfigFloat( NetConfig.FakePacketLag_Send, value );
+ }
+
+ ///
+ /// Delay all packets by N ms
+ ///
+ public static float FakeRecvPacketLag
+ {
+ get => GetConfigFloat( NetConfig.FakePacketLag_Recv );
+ set => SetConfigFloat( NetConfig.FakePacketLag_Recv, value );
+ }
+
+ #region Config Internals
+
+ internal unsafe static bool GetConfigInt( NetConfig type, int value )
+ {
+ int* ptr = &value;
+ return Internal.SetConfigValue( type, NetScope.Global, 0, NetConfigType.Int32, (IntPtr)ptr );
+ }
+
+ internal unsafe static int GetConfigInt( NetConfig type )
+ {
+ int value = 0;
+ NetConfigType dtype = NetConfigType.Int32;
+ int* ptr = &value;
+ ulong size = sizeof( int );
+ var result = Internal.GetConfigValue( type, NetScope.Global, 0, ref dtype, (IntPtr) ptr, ref size );
+ if ( result != SteamNetworkingGetConfigValueResult.OK )
+ return 0;
+
+ return value;
+ }
+
+ internal unsafe static bool SetConfigFloat( NetConfig type, float value )
+ {
+ float* ptr = &value;
+ return Internal.SetConfigValue( type, NetScope.Global, 0, NetConfigType.Float, (IntPtr)ptr );
+ }
+
+ internal unsafe static float GetConfigFloat( NetConfig type )
+ {
+ float value = 0;
+ NetConfigType dtype = NetConfigType.Float;
+ float* ptr = &value;
+ ulong size = sizeof( float );
+ var result = Internal.GetConfigValue( type, NetScope.Global, 0, ref dtype, (IntPtr)ptr, ref size );
+ if ( result != SteamNetworkingGetConfigValueResult.OK )
+ return 0;
+
+ return value;
+ }
+
+ internal unsafe static bool SetConfigString( NetConfig type, string value )
+ {
+ var bytes = Encoding.UTF8.GetBytes( value );
+
+ fixed ( byte* ptr = bytes )
+ {
+ return Internal.SetConfigValue( type, NetScope.Global, 0, NetConfigType.String, (IntPtr)ptr );
+ }
+ }
+
+ /*
+ internal unsafe static float GetConfigString( NetConfig type )
+ {
+
+ float value = 0;
+ NetConfigType dtype = NetConfigType.Float;
+ float* ptr = &value;
+ ulong size = sizeof( float );
+ var result = Internal.GetConfigValue( type, NetScope.Global, 0, ref dtype, (IntPtr)ptr, ref size );
+ if ( result != SteamNetworkingGetConfigValueResult.OK )
+ return 0;
+
+ return value;
+ }
+ */
+
+
+ /*
+
+ TODO - Connection object
+
+ internal unsafe static bool SetConnectionConfig( uint con, NetConfig type, int value )
+ {
+ int* ptr = &value;
+ return Internal.SetConfigValue( type, NetScope.Connection, con, NetConfigType.Int32, (IntPtr)ptr );
+ }
+
+ internal unsafe static bool SetConnectionConfig( uint con, NetConfig type, float value )
+ {
+ float* ptr = &value;
+ return Internal.SetConfigValue( type, NetScope.Connection, con, NetConfigType.Float, (IntPtr)ptr );
+ }
+
+ internal unsafe static bool SetConnectionConfig( uint con, NetConfig type, string value )
+ {
+ var bytes = Encoding.UTF8.GetBytes( value );
+
+ fixed ( byte* ptr = bytes )
+ {
+ return Internal.SetConfigValue( type, NetScope.Connection, con, NetConfigType.String, (IntPtr)ptr );
+ }
+ }*/
+
+ #endregion
}
}
\ No newline at end of file
diff --git a/Generator/Cleanup.cs b/Generator/Cleanup.cs
index 73aaa6c..2f75c2a 100644
--- a/Generator/Cleanup.cs
+++ b/Generator/Cleanup.cs
@@ -27,6 +27,9 @@ public static string ConvertType( string type )
type = type.Replace( "SteamItemDef_t", "InventoryDefId" );
type = type.Replace( "ChatRoomEnterResponse", "RoomEnter" );
type = type.Replace( "SteamNetworkPingLocation_t", "PingLocation" );
+ type = type.Replace( "SteamNetworkingConfigValue", "NetConfig" );
+ type = type.Replace( "SteamNetworkingConfigScope", "NetScope" );
+ type = type.Replace( "SteamNetworkingConfigDataType", "NetConfigType" );
return type;
}
diff --git a/Generator/CodeWriter/Types/BaseType.cs b/Generator/CodeWriter/Types/BaseType.cs
index 1d17ac3..121c68d 100644
--- a/Generator/CodeWriter/Types/BaseType.cs
+++ b/Generator/CodeWriter/Types/BaseType.cs
@@ -18,7 +18,6 @@ public static BaseType Parse( string type, string varname = null )
type = Cleanup.ConvertType( type );
if ( type == "SteamAPIWarningMessageHook_t" ) return new PointerType { NativeType = type, VarName = varname };
- if ( type == "intptr_t" ) return new PointerType { NativeType = type, VarName = varname };
if ( type == "SteamAPICall_t" ) return new SteamApiCallType { NativeType = type, VarName = varname };
@@ -39,6 +38,8 @@ public static BaseType Parse( string type, string varname = null )
// DANGER DANGER Danger
if ( basicType == "size_t" ) return new ULongType { NativeType = type, VarName = varname };
+ if ( basicType == "intptr_t" ) return new LongType { NativeType = type, VarName = varname };
+ if ( basicType == "ptrdiff_t" ) return new LongType { NativeType = type, VarName = varname };
if ( basicType == "uint64" ) return new ULongType { NativeType = type, VarName = varname };
if ( basicType == "int64" ) return new LongType { NativeType = type, VarName = varname };
@@ -73,6 +74,7 @@ public virtual bool IsVector
if ( VarName == "pOutBuffer" ) return false;
if ( VarName == "pubRGB" ) return false;
if ( VarName == "pOutResultHandle" ) return false;
+ if ( VarName == "pOutDataType" ) return false;
if ( VarName == "psteamIDClans" ) return true;
if ( VarName == "pScoreDetails" ) return true;