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;