From 7c1a2185530f3e9a603b5d5a76b0e49e12c3129e Mon Sep 17 00:00:00 2001 From: thesupersoup <40295603+thesupersoup@users.noreply.github.com> Date: Wed, 26 Jun 2019 20:31:54 -0700 Subject: [PATCH 1/3] Lobby game server methods, OnLobbyGameCreated event, Achievement progress notification Added SetGameServer and GetGameServer for lobby, added OnLobbyGameCreated event in SteamMatchmaking, added SteamId.IsValid check against default ulong value, added SteamUserStats.IndicateAchievementProgress for progress notification. --- Facepunch.Steamworks/SteamMatchmaking.cs | 7 +++++ Facepunch.Steamworks/SteamNetworking.cs | 7 +++++ Facepunch.Steamworks/SteamUserStats.cs | 17 +++++++++++ Facepunch.Steamworks/Structs/Lobby.cs | 36 ++++++++++++++++++++++++ Facepunch.Steamworks/Structs/SteamId.cs | 2 ++ 5 files changed, 69 insertions(+) diff --git a/Facepunch.Steamworks/SteamMatchmaking.cs b/Facepunch.Steamworks/SteamMatchmaking.cs index 89798e8..1afc770 100644 --- a/Facepunch.Steamworks/SteamMatchmaking.cs +++ b/Facepunch.Steamworks/SteamMatchmaking.cs @@ -45,6 +45,8 @@ namespace Steamworks LobbyEnter_t.Install( x => OnLobbyEntered?.Invoke( new Lobby( x.SteamIDLobby ) ) ); + LobbyGameCreated_t.Install( x => OnLobbyGameCreated?.Invoke( new Lobby( x.SteamIDLobby ), x.IP, x.Port, x.SteamIDGameServer ) ); + LobbyDataUpdate_t.Install( x => { if ( x.Success == 0 ) return; @@ -103,6 +105,11 @@ namespace Steamworks /// public static event Action OnLobbyEntered; + /// + /// A game server has been associated with the lobby + /// + public static event Action OnLobbyGameCreated; + /// /// The lobby metadata has changed /// diff --git a/Facepunch.Steamworks/SteamNetworking.cs b/Facepunch.Steamworks/SteamNetworking.cs index b2b6d37..ee1ceef 100644 --- a/Facepunch.Steamworks/SteamNetworking.cs +++ b/Facepunch.Steamworks/SteamNetworking.cs @@ -54,6 +54,13 @@ namespace Steamworks /// public static bool AcceptP2PSessionWithUser( SteamId user ) => Internal.AcceptP2PSessionWithUser( user ); + /// + /// Allow or disallow P2P connects to fall back on Steam server relay if direct + /// connection or NAT traversal can't be established. Applies to connections + /// created after setting or old connections that need to reconnect. + /// + public static bool AllowP2PPacketRelay( bool allow ) => Internal.AllowP2PPacketRelay( allow ); + /// /// This should be called when you're done communicating with a user, as this will /// free up all of the resources allocated for the connection under-the-hood. diff --git a/Facepunch.Steamworks/SteamUserStats.cs b/Facepunch.Steamworks/SteamUserStats.cs index 26c2f33..163de57 100644 --- a/Facepunch.Steamworks/SteamUserStats.cs +++ b/Facepunch.Steamworks/SteamUserStats.cs @@ -92,6 +92,23 @@ namespace Steamworks } } + /// + /// Show the user a pop-up notification with the current progress toward an achievement. + /// Will return false if RequestCurrentStats has not completed and successfully returned + /// its callback, if the achievement doesn't exist/has unpublished changes in the app's + /// Steamworks Admin page, or if the achievement is unlocked. + /// + public static bool IndicateAchievementProgress( string achName, int curProg, int maxProg ) + { + if ( string.IsNullOrEmpty( achName ) ) + throw new ArgumentNullException( "Achievement string is null or void " ); + + if ( curProg >= maxProg ) + throw new ArgumentException( $" Current progress [{curProg}] arguement toward achievement greater than or equal to max [{maxProg}]" ); + + return Internal.IndicateAchievementProgress( achName, (uint)curProg, (uint)maxProg ); + } + /// /// Tries to get the number of players currently playing this game. /// Or -1 if failed. diff --git a/Facepunch.Steamworks/Structs/Lobby.cs b/Facepunch.Steamworks/Structs/Lobby.cs index e782690..f1bc754 100644 --- a/Facepunch.Steamworks/Structs/Lobby.cs +++ b/Facepunch.Steamworks/Structs/Lobby.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Net; using System.Threading.Tasks; namespace Steamworks.Data @@ -201,6 +202,41 @@ namespace Steamworks.Data return SteamMatchmaking.Internal.SetLobbyJoinable( Id, b ); } + /// + /// [SteamID variant] + /// Allows the owner to set the game server associated with the lobby. Triggers a + /// LobbyGameCreated_t callback. + /// + public void SetGameServer( SteamId steamServer ) + { + if ( !steamServer.IsValid ) + throw new ArgumentException( $"SteamId for server is invalid" ); + + SteamMatchmaking.Internal.SetLobbyGameServer( Id, 0, 0, steamServer ); + } + + /// + /// [IP/Port variant] + /// Allows the owner to set the game server associated with the lobby. Triggers a + /// LobbyGameCreated_t callback. + /// + public void SetGameServer( string ip, ushort port ) + { + if ( !IPAddress.TryParse( ip, out IPAddress add ) ) + throw new ArgumentException( $"IP address for server is invalid" ); + + SteamMatchmaking.Internal.SetLobbyGameServer( Id, add.IpToInt32(), port, new SteamId() ); + } + + /// + /// Gets the details of the lobby's game server, if set. Returns true if the lobby is + /// valid and has a server set, otherwise returns false. + /// + public bool GetGameServer( ref uint ip, ref ushort port, ref SteamId serverId ) + { + return SteamMatchmaking.Internal.GetLobbyGameServer( Id, ref ip, ref port, ref serverId ); + } + /// /// You must be the lobby owner to set the owner /// diff --git a/Facepunch.Steamworks/Structs/SteamId.cs b/Facepunch.Steamworks/Structs/SteamId.cs index 62bdce3..48c0a0c 100644 --- a/Facepunch.Steamworks/Structs/SteamId.cs +++ b/Facepunch.Steamworks/Structs/SteamId.cs @@ -23,5 +23,7 @@ namespace Steamworks public override string ToString() => Value.ToString(); public uint AccountId => (uint) (Value & 0xFFFFFFFFul); + + public bool IsValid => Value != default; } } \ No newline at end of file From 17434b29103d5b9738e7e6b0cd552d24794aeb2a Mon Sep 17 00:00:00 2001 From: thesupersoup <40295603+thesupersoup@users.noreply.github.com> Date: Wed, 26 Jun 2019 20:36:17 -0700 Subject: [PATCH 2/3] Updated summary for SetGameServer, IndicateAchProg exception --- Facepunch.Steamworks/SteamUserStats.cs | 2 +- Facepunch.Steamworks/Structs/Lobby.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Facepunch.Steamworks/SteamUserStats.cs b/Facepunch.Steamworks/SteamUserStats.cs index 163de57..0b9dc9f 100644 --- a/Facepunch.Steamworks/SteamUserStats.cs +++ b/Facepunch.Steamworks/SteamUserStats.cs @@ -101,7 +101,7 @@ namespace Steamworks public static bool IndicateAchievementProgress( string achName, int curProg, int maxProg ) { if ( string.IsNullOrEmpty( achName ) ) - throw new ArgumentNullException( "Achievement string is null or void " ); + throw new ArgumentNullException( "Achievement string is null or empty" ); if ( curProg >= maxProg ) throw new ArgumentException( $" Current progress [{curProg}] arguement toward achievement greater than or equal to max [{maxProg}]" ); diff --git a/Facepunch.Steamworks/Structs/Lobby.cs b/Facepunch.Steamworks/Structs/Lobby.cs index f1bc754..f9f8b98 100644 --- a/Facepunch.Steamworks/Structs/Lobby.cs +++ b/Facepunch.Steamworks/Structs/Lobby.cs @@ -204,8 +204,8 @@ namespace Steamworks.Data /// /// [SteamID variant] - /// Allows the owner to set the game server associated with the lobby. Triggers a - /// LobbyGameCreated_t callback. + /// Allows the owner to set the game server associated with the lobby. Triggers the + /// Steammatchmaking.OnLobbyGameCreated event. /// public void SetGameServer( SteamId steamServer ) { @@ -217,8 +217,8 @@ namespace Steamworks.Data /// /// [IP/Port variant] - /// Allows the owner to set the game server associated with the lobby. Triggers a - /// LobbyGameCreated_t callback. + /// Allows the owner to set the game server associated with the lobby. Triggers the + /// Steammatchmaking.OnLobbyGameCreated event. /// public void SetGameServer( string ip, ushort port ) { From d2e4417ef2207fbc0b326ed9ce5e5321b27854e2 Mon Sep 17 00:00:00 2001 From: thesupersoup <40295603+thesupersoup@users.noreply.github.com> Date: Sun, 30 Jun 2019 03:23:08 -0700 Subject: [PATCH 3/3] Added OnLobbyCreated Added OnLobbyCreated action and handler for associated LobbyCreated_t event --- Facepunch.Steamworks/SteamMatchmaking.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Facepunch.Steamworks/SteamMatchmaking.cs b/Facepunch.Steamworks/SteamMatchmaking.cs index 1afc770..2f3a4d6 100644 --- a/Facepunch.Steamworks/SteamMatchmaking.cs +++ b/Facepunch.Steamworks/SteamMatchmaking.cs @@ -45,6 +45,8 @@ namespace Steamworks LobbyEnter_t.Install( x => OnLobbyEntered?.Invoke( new Lobby( x.SteamIDLobby ) ) ); + LobbyCreated_t.Install( x => OnLobbyCreated?.Invoke( x.Result, new Lobby( x.SteamIDLobby ) ) ); + LobbyGameCreated_t.Install( x => OnLobbyGameCreated?.Invoke( new Lobby( x.SteamIDLobby ), x.IP, x.Port, x.SteamIDGameServer ) ); LobbyDataUpdate_t.Install( x => @@ -105,6 +107,11 @@ namespace Steamworks /// public static event Action OnLobbyEntered; + /// + /// You created a lobby + /// + public static event Action OnLobbyCreated; + /// /// A game server has been associated with the lobby ///