From e3f84eac32f7d6e068f649108ca881062f79ab60 Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Wed, 19 Jul 2017 19:07:59 -0700 Subject: [PATCH 01/24] Initial pass at getting coverage for Client functions in API --- Facepunch.Steamworks/Client.cs | 8 + Facepunch.Steamworks/Client/Lobby.cs | 202 ++++++++++++++++++ .../Client/LobbyList.Lobby.cs | 33 +++ Facepunch.Steamworks/Client/LobbyList.cs | 117 ++++++++++ 4 files changed, 360 insertions(+) create mode 100644 Facepunch.Steamworks/Client/Lobby.cs create mode 100644 Facepunch.Steamworks/Client/LobbyList.Lobby.cs create mode 100644 Facepunch.Steamworks/Client/LobbyList.cs diff --git a/Facepunch.Steamworks/Client.cs b/Facepunch.Steamworks/Client.cs index ecf1bfa..e46e5e4 100644 --- a/Facepunch.Steamworks/Client.cs +++ b/Facepunch.Steamworks/Client.cs @@ -55,6 +55,7 @@ public partial class Client : BaseSteamworks public Voice Voice { get; private set; } public ServerList ServerList { get; private set; } + public LobbyList LobbyList { get; private set; } public App App { get; private set; } public Achievements Achievements { get; private set; } public Stats Stats { get; private set; } @@ -88,6 +89,7 @@ public Client( uint appId ) // Voice = new Voice( this ); ServerList = new ServerList( this ); + LobbyList = new LobbyList(this); App = new App( this ); Stats = new Stats( this ); Achievements = new Achievements( this ); @@ -159,6 +161,12 @@ public override void Dispose() ServerList = null; } + if (LobbyList != null) + { + LobbyList.Dispose(); + LobbyList = null; + } + if ( App != null ) { App.Dispose(); diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs new file mode 100644 index 0000000..72ef977 --- /dev/null +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Text; +using SteamNative; +using Result = SteamNative.Result; + +namespace Facepunch.Steamworks +{ + public partial class Client : IDisposable + { + public void JoinLobby(ulong LobbyID) + { + native.matchmaking.JoinLobby(LobbyID, OnLobbyJoined); + } + + void OnLobbyJoined(LobbyEnter_t callback, bool error) + { + //TODO: + } + + + //The type of lobby you are creating + public enum LobbyType : int + { + Private = SteamNative.LobbyType.Private, + FriendsOnly = SteamNative.LobbyType.FriendsOnly, + Public = SteamNative.LobbyType.Public, + Invisible = SteamNative.LobbyType.Invisible + } + + // Create a lobby, auto joins the created lobby + public Lobby CreateLobby(LobbyType lobbyType, int maxMembers, string name) + { + var lobby = new Lobby(this); + native.matchmaking.CreateLobby((SteamNative.LobbyType)lobbyType, maxMembers, lobby.OnLobbyCreated); + if (lobby.IsValid) + { + lobby.Name = name; + lobby.MaxMembers = maxMembers; + lobby.LobbyType = lobbyType; + } + return lobby; + } + } + public class Lobby : IDisposable + { + internal Client client; + + /// + /// Returns true if we tried to create this lobby but it returned + /// an error. + /// + public bool IsError { get; private set; } + + /// + /// Returns true if this lobby is valid, ie, we've received + /// a positive response from Steam about it. + /// + public bool IsValid => LobbyID != 0; + + /// + /// The CSteamID of the lobby that was created + /// + internal ulong LobbyID { get; private set; } + + /// + /// The name of the lobby as a property for easy getting/setting + /// + public string Name + { + get { return LobbyData["name"]; } + set { SetLobbyData("name", value); } + } + + public Lobby(Client c) + { + client = c; + } + + internal void OnLobbyCreated(LobbyCreated_t callback, bool error) + { + //from SpaceWarClient.cpp 793 + if (error || (callback.Result != Result.OK)) + { + IsError = true; + return; + } + + Owner = client.SteamId; //this is implicitly set on creation but need to cache it here + LobbyID = callback.SteamIDLobby; + } + + Dictionary LobbyData = new Dictionary(); + public void SetLobbyData(string key, string value) + { + if (LobbyData.ContainsKey(key)) + { + if (LobbyData[key] == value) + return; + + LobbyData[key] = value; + } + else + { + LobbyData.Add(key, value); + } + + client.native.matchmaking.SetLobbyData(LobbyID, key, value); + } + + public void RemoveLobbyData(string key) + { + if (LobbyData.ContainsKey(key)) + { + LobbyData.Remove(key); + } + + client.native.matchmaking.DeleteLobbyData(LobbyID, key); + } + + public Client.LobbyType LobbyType + { + get { return _lobbyType; } + set { if (_lobbyType == value) return; client.native.matchmaking.SetLobbyType(LobbyID, (SteamNative.LobbyType)value); _lobbyType = value; } //returns bool + } + Client.LobbyType _lobbyType; + + + //Must be the owner to change the owner + public ulong Owner + { + get + { + if (_owner == 0) + { + _owner = client.native.matchmaking.GetLobbyOwner(LobbyID); + return _owner; + } + return _owner; + } + private set { if (_owner == value) return; client.native.matchmaking.SetLobbyOwner(LobbyID, value); _owner = value; } + } + ulong _owner = 0; + + // Can the lobby be joined by other people + public bool Joinable + { + get { return _joinable; } + set { if (_joinable == value) return; client.native.matchmaking.SetLobbyJoinable(LobbyID, value); _joinable = value; } + } + bool _joinable = true; //steam default + + // How many people can be in the Lobby + public int MaxMembers + { + get { return _maxMembers; } + set { if (_maxMembers == value) return; client.native.matchmaking.SetLobbyMemberLimit(LobbyID, value); _maxMembers = value; } + } + int _maxMembers = 0; + + public void Leave() + { + client.native.matchmaking.LeaveLobby(LobbyID); + } + + public void Dispose() + { + client = null; + } + + /*not implemented + // returns a lobby metadata key/values pair by index + client.native.matchmaking.GetLobbyDataByIndex; + + //set the game server of the lobby + client.native.matchmaking.GetLobbyGameServer; + client.native.matchmaking.SetLobbyGameServer; + + //data for people in the actual lobby - scores/elo/characters/etc. + client.native.matchmaking.SetLobbyMemberData; //local user + client.native.matchmaking.GetLobbyMemberData; //any user in this lobby + + + // returns steamid of member + // note that the current user must be in a lobby to retrieve CSteamIDs of other users in that lobby + client.native.matchmaking.GetLobbyMemberByIndex; + + //for linking lobbies idk havent looked hard yet + client.native.matchmaking.SetLinkedLobby; + + //chat functions + client.native.matchmaking.SendLobbyChatMsg; + client.native.matchmaking.GetLobbyChatEntry; + + //get total data count (why?) + client.native.matchmaking.GetLobbyDataCount + + //invite your frans + client.native.matchmaking.InviteUserToLobby //this invites the user the current lobby the invitee is in + */ + } +} diff --git a/Facepunch.Steamworks/Client/LobbyList.Lobby.cs b/Facepunch.Steamworks/Client/LobbyList.Lobby.cs new file mode 100644 index 0000000..e16dab2 --- /dev/null +++ b/Facepunch.Steamworks/Client/LobbyList.Lobby.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Facepunch.Steamworks +{ + public partial class LobbyList + { + public class Lobby + { + internal Client Client; + public string Name { get; private set; } + public ulong LobbyID { get; private set; } + public ulong Owner { get; private set; } + public int MemberLimit{ get; private set; } + public int NumMembers{ get; private set; } + + internal static Lobby FromSteam(Client client, ulong lobby) + { + return new Lobby() + { + Client = client, + LobbyID = lobby, + Name = client.native.matchmaking.GetLobbyData(lobby, "name"), + MemberLimit = client.native.matchmaking.GetLobbyMemberLimit(lobby), + Owner = client.native.matchmaking.GetLobbyOwner(lobby), + NumMembers = client.native.matchmaking.GetNumLobbyMembers(lobby) + }; + + } + } + } +} diff --git a/Facepunch.Steamworks/Client/LobbyList.cs b/Facepunch.Steamworks/Client/LobbyList.cs new file mode 100644 index 0000000..b4e7fd4 --- /dev/null +++ b/Facepunch.Steamworks/Client/LobbyList.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.Text; +using SteamNative; + +namespace Facepunch.Steamworks +{ + public partial class LobbyList : IDisposable + { + internal Client client; + public List Lobbies = new List(); + + internal LobbyList(Client client) + { + this.client = client; + } + + public void Refresh ( LobbyFilter filter = null) + { + if(filter != null) + { + client.native.matchmaking.AddRequestLobbyListDistanceFilter((SteamNative.LobbyDistanceFilter)filter.DistanceFilter); + client.native.matchmaking.AddRequestLobbyListFilterSlotsAvailable(filter.SlotsAvailable); + client.native.matchmaking.AddRequestLobbyListResultCountFilter(filter.MaxResults); + foreach (KeyValuePair fil in filter.StringFilters) + { + client.native.matchmaking.AddRequestLobbyListStringFilter(fil.Key, fil.Value, SteamNative.LobbyComparison.Equal); + } + foreach (KeyValuePair fil in filter.NearFilters) + { + client.native.matchmaking.AddRequestLobbyListNearValueFilter(fil.Key, fil.Value); + } + foreach (KeyValuePair> fil in filter.NumericalFilters) + { + client.native.matchmaking.AddRequestLobbyListNumericalFilter(fil.Key, fil.Value.Value, (SteamNative.LobbyComparison)fil.Value.Key); + } + } + + // this will never return lobbies that are full (via the actual api) + client.native.matchmaking.RequestLobbyList(OnLobbyList); + + /* + if (filter == null) may need this if we are getting too many lobbies + { + filter = new Filter(); + //filter.Add("appid", client.AppId.ToString()); + }*/ + + } + + void OnLobbyList(LobbyMatchList_t callback, bool error) + { + if (error) return; + Lobbies.Clear(); + uint lobbiesMatching = callback.LobbiesMatching; + // lobbies are returned in order of closeness to the user, so add them to the list in that order + for (int i = 0; i < lobbiesMatching; i++) + { + ulong lobby = client.native.matchmaking.GetLobbyByIndex(i); + Lobby newLobby = Lobby.FromSteam(client, lobby); + if (newLobby.Name != "") + { + Lobbies.Add(newLobby); + } + else + { + //need to sub the lobbyid to the request func + //client.native.matchmaking.RequestLobbyData(lobby) + } + + } + } + + public void Dispose() + { + client = null; + } + + public class LobbyFilter + { + // Filters that match actual metadata keys exactly + public Dictionary StringFilters = new Dictionary(); + // Filters that are of string key and int value for that key to be close to + public Dictionary NearFilters = new Dictionary(); + //Filters that are of string key and int value, with a comparison filter to say how we should relate to the value + public Dictionary> NumericalFilters = new Dictionary>(); + public Distance DistanceFilter { get; set; } + public int SlotsAvailable { get; set; } + public int MaxResults { get; set; } + + public enum Distance : int + { + Close = SteamNative.LobbyDistanceFilter.Close, + Default = SteamNative.LobbyDistanceFilter.Default, + Far = SteamNative.LobbyDistanceFilter.Far, + Worldwide = SteamNative.LobbyDistanceFilter.Worldwide + } + + public enum Comparison : int + { + EqualToOrLessThan = SteamNative.LobbyComparison.EqualToOrLessThan, + LessThan = SteamNative.LobbyComparison.LessThan, + Equal = SteamNative.LobbyComparison.Equal, + GreaterThan = SteamNative.LobbyComparison.GreaterThan, + EqualToOrGreaterThan = SteamNative.LobbyComparison.EqualToOrGreaterThan, + NotEqual = SteamNative.LobbyComparison.NotEqual + } + + public LobbyFilter(Distance distanceFilter, int slotsAvailable, int maxResults) + { + DistanceFilter = distanceFilter; + SlotsAvailable = slotsAvailable; + MaxResults = maxResults; + } + } + } +} From 7e38750f2ee7b4c2a5da988317039ca63d8f3985 Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Tue, 25 Jul 2017 10:09:41 -0700 Subject: [PATCH 02/24] changes lobby initialization and makes lobbylist filter easier --- Facepunch.Steamworks.Test/Client/Lobby.cs | 32 ++++++++++ Facepunch.Steamworks/Client/Lobby.cs | 70 +++++++++++++-------- Facepunch.Steamworks/Client/LobbyList.cs | 74 ++++++++++++----------- 3 files changed, 116 insertions(+), 60 deletions(-) create mode 100644 Facepunch.Steamworks.Test/Client/Lobby.cs diff --git a/Facepunch.Steamworks.Test/Client/Lobby.cs b/Facepunch.Steamworks.Test/Client/Lobby.cs new file mode 100644 index 0000000..8f3e7b7 --- /dev/null +++ b/Facepunch.Steamworks.Test/Client/Lobby.cs @@ -0,0 +1,32 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Facepunch.Steamworks.Test +{ + [DeploymentItem("steam_api.dll")] + [DeploymentItem("steam_api64.dll")] + [DeploymentItem("steam_appid.txt")] + [TestClass] + class Lobby + { + [TestMethod] + public void FriendList() + { + /* + using (var client = new Facepunch.Steamworks.Client(252490)) + { + Assert.IsTrue(client.IsValid); + + client.Friends.Refresh(); + + Assert.IsNotNull(client.Friends.All); + + foreach (var friend in client.Friends.All) + { + Console.WriteLine("{0}: {1} (Friend:{2}) (Blocked:{3})", friend.Id, friend.Name, friend.IsFriend, friend.IsBlocked); + } + } + */ + } + } +} diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 72ef977..5748672 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -18,9 +18,18 @@ void OnLobbyJoined(LobbyEnter_t callback, bool error) //TODO: } - + // Create a lobby, auto joins the created lobby + public Lobby CreateLobby(Lobby.Type lobbyType, int maxMembers) + { + var lobby = new Lobby(this, lobbyType); + native.matchmaking.CreateLobby((SteamNative.LobbyType)lobbyType, maxMembers, lobby.OnLobbyCreatedAPI); + return lobby; + } + } + public class Lobby : IDisposable + { //The type of lobby you are creating - public enum LobbyType : int + public enum Type : int { Private = SteamNative.LobbyType.Private, FriendsOnly = SteamNative.LobbyType.FriendsOnly, @@ -28,22 +37,6 @@ public enum LobbyType : int Invisible = SteamNative.LobbyType.Invisible } - // Create a lobby, auto joins the created lobby - public Lobby CreateLobby(LobbyType lobbyType, int maxMembers, string name) - { - var lobby = new Lobby(this); - native.matchmaking.CreateLobby((SteamNative.LobbyType)lobbyType, maxMembers, lobby.OnLobbyCreated); - if (lobby.IsValid) - { - lobby.Name = name; - lobby.MaxMembers = maxMembers; - lobby.LobbyType = lobbyType; - } - return lobby; - } - } - public class Lobby : IDisposable - { internal Client client; /// @@ -68,16 +61,23 @@ public class Lobby : IDisposable /// public string Name { - get { return LobbyData["name"]; } - set { SetLobbyData("name", value); } + get { return _name; } + set { if (_name == value) return; SetLobbyData("name", value); } } + string _name = ""; - public Lobby(Client c) + /// + /// Callback for when lobby is created + /// + public Action OnLobbyCreated; + + public Lobby(Client c, Type type) { client = c; + LobbyType = type; } - internal void OnLobbyCreated(LobbyCreated_t callback, bool error) + internal void OnLobbyCreatedAPI(LobbyCreated_t callback, bool error) { //from SpaceWarClient.cpp 793 if (error || (callback.Result != Result.OK)) @@ -88,6 +88,10 @@ internal void OnLobbyCreated(LobbyCreated_t callback, bool error) Owner = client.SteamId; //this is implicitly set on creation but need to cache it here LobbyID = callback.SteamIDLobby; + MaxMembers = client.native.matchmaking.GetLobbyMemberLimit(LobbyID); + SetLobbyData("appid", client.AppId.ToString()); + + if (OnLobbyCreated != null) { OnLobbyCreated(); } } Dictionary LobbyData = new Dictionary(); @@ -118,12 +122,21 @@ public void RemoveLobbyData(string key) client.native.matchmaking.DeleteLobbyData(LobbyID, key); } - public Client.LobbyType LobbyType + public Type LobbyType { get { return _lobbyType; } - set { if (_lobbyType == value) return; client.native.matchmaking.SetLobbyType(LobbyID, (SteamNative.LobbyType)value); _lobbyType = value; } //returns bool + set + { + if (_lobbyType == value) return; + //only call the proper method if the lobby is valid, otherwise cache the value + if(IsValid) + { + client.native.matchmaking.SetLobbyType(LobbyID, (SteamNative.LobbyType)value); //returns bool? + } + _lobbyType = value; + } } - Client.LobbyType _lobbyType; + Type _lobbyType; //Must be the owner to change the owner @@ -158,6 +171,13 @@ public int MaxMembers } int _maxMembers = 0; + //How many people are currently in the lobby + public int NumMembers + { + get { return client.native.matchmaking.GetNumLobbyMembers(LobbyID);} + } + + //leave the current lobby public void Leave() { client.native.matchmaking.LeaveLobby(LobbyID); diff --git a/Facepunch.Steamworks/Client/LobbyList.cs b/Facepunch.Steamworks/Client/LobbyList.cs index b4e7fd4..1019c4e 100644 --- a/Facepunch.Steamworks/Client/LobbyList.cs +++ b/Facepunch.Steamworks/Client/LobbyList.cs @@ -15,36 +15,42 @@ internal LobbyList(Client client) this.client = client; } - public void Refresh ( LobbyFilter filter = null) + public void Refresh ( Filter filter = null) { - if(filter != null) + if(filter == null) { - client.native.matchmaking.AddRequestLobbyListDistanceFilter((SteamNative.LobbyDistanceFilter)filter.DistanceFilter); - client.native.matchmaking.AddRequestLobbyListFilterSlotsAvailable(filter.SlotsAvailable); - client.native.matchmaking.AddRequestLobbyListResultCountFilter(filter.MaxResults); - foreach (KeyValuePair fil in filter.StringFilters) - { - client.native.matchmaking.AddRequestLobbyListStringFilter(fil.Key, fil.Value, SteamNative.LobbyComparison.Equal); - } - foreach (KeyValuePair fil in filter.NearFilters) - { - client.native.matchmaking.AddRequestLobbyListNearValueFilter(fil.Key, fil.Value); - } - foreach (KeyValuePair> fil in filter.NumericalFilters) - { - client.native.matchmaking.AddRequestLobbyListNumericalFilter(fil.Key, fil.Value.Value, (SteamNative.LobbyComparison)fil.Value.Key); - } + filter = new Filter(); + filter.StringFilters.Add("appid", client.AppId.ToString()); } + client.native.matchmaking.AddRequestLobbyListDistanceFilter((SteamNative.LobbyDistanceFilter)filter.DistanceFilter); + + if(filter.SlotsAvailable != null) + { + client.native.matchmaking.AddRequestLobbyListFilterSlotsAvailable((int)filter.SlotsAvailable); + } + + if (filter.MaxResults != null) + { + client.native.matchmaking.AddRequestLobbyListResultCountFilter((int)filter.MaxResults); + } + + foreach (KeyValuePair fil in filter.StringFilters) + { + client.native.matchmaking.AddRequestLobbyListStringFilter(fil.Key, fil.Value, SteamNative.LobbyComparison.Equal); + } + foreach (KeyValuePair fil in filter.NearFilters) + { + client.native.matchmaking.AddRequestLobbyListNearValueFilter(fil.Key, fil.Value); + } + foreach (KeyValuePair> fil in filter.NumericalFilters) + { + client.native.matchmaking.AddRequestLobbyListNumericalFilter(fil.Key, fil.Value.Value, (SteamNative.LobbyComparison)fil.Value.Key); + } + + // this will never return lobbies that are full (via the actual api) client.native.matchmaking.RequestLobbyList(OnLobbyList); - - /* - if (filter == null) may need this if we are getting too many lobbies - { - filter = new Filter(); - //filter.Add("appid", client.AppId.ToString()); - }*/ } @@ -69,14 +75,19 @@ void OnLobbyList(LobbyMatchList_t callback, bool error) } } + + if (OnLobbiesRefreshed != null) { OnLobbiesRefreshed(); } } + + public Action OnLobbiesRefreshed; + public void Dispose() { client = null; } - public class LobbyFilter + public class Filter { // Filters that match actual metadata keys exactly public Dictionary StringFilters = new Dictionary(); @@ -84,9 +95,9 @@ public class LobbyFilter public Dictionary NearFilters = new Dictionary(); //Filters that are of string key and int value, with a comparison filter to say how we should relate to the value public Dictionary> NumericalFilters = new Dictionary>(); - public Distance DistanceFilter { get; set; } - public int SlotsAvailable { get; set; } - public int MaxResults { get; set; } + public Distance DistanceFilter = Distance.Worldwide; + public int? SlotsAvailable { get; set; } + public int? MaxResults { get; set; } public enum Distance : int { @@ -105,13 +116,6 @@ public enum Comparison : int EqualToOrGreaterThan = SteamNative.LobbyComparison.EqualToOrGreaterThan, NotEqual = SteamNative.LobbyComparison.NotEqual } - - public LobbyFilter(Distance distanceFilter, int slotsAvailable, int maxResults) - { - DistanceFilter = distanceFilter; - SlotsAvailable = slotsAvailable; - MaxResults = maxResults; - } } } } From e1c738fc8b133639238a2b4da5c117c451c0d93a Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Fri, 28 Jul 2017 02:20:28 -0700 Subject: [PATCH 03/24] Updates Lobby to work for both Lobby members and Lobby Owners Uses a more rigurous approach to LobbyData and uses it as a cache for string-able values to be able to be retrieved by members and set only by the owner. --- Facepunch.Steamworks.Test/Client/Lobby.cs | 29 +- Facepunch.Steamworks/Client/Lobby.cs | 335 +++++++++++++++------- Facepunch.Steamworks/Client/LobbyList.cs | 25 +- 3 files changed, 274 insertions(+), 115 deletions(-) diff --git a/Facepunch.Steamworks.Test/Client/Lobby.cs b/Facepunch.Steamworks.Test/Client/Lobby.cs index 8f3e7b7..3319edb 100644 --- a/Facepunch.Steamworks.Test/Client/Lobby.cs +++ b/Facepunch.Steamworks.Test/Client/Lobby.cs @@ -1,32 +1,41 @@ using System; +using System.Diagnostics; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Facepunch.Steamworks.Test { + [TestClass] [DeploymentItem("steam_api.dll")] [DeploymentItem("steam_api64.dll")] [DeploymentItem("steam_appid.txt")] - [TestClass] - class Lobby + public class Lobby { [TestMethod] - public void FriendList() + public void CreateLobby() { - /* using (var client = new Facepunch.Steamworks.Client(252490)) { Assert.IsTrue(client.IsValid); - client.Friends.Refresh(); + client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); - Assert.IsNotNull(client.Friends.All); - - foreach (var friend in client.Friends.All) + client.Lobby.OnLobbyCreated = (success) => { - Console.WriteLine("{0}: {1} (Friend:{2}) (Blocked:{3})", friend.Id, friend.Name, friend.IsFriend, friend.IsBlocked); + Assert.IsTrue(success); + Assert.IsTrue(client.Lobby.IsValid); + Console.WriteLine(client.Lobby.CurrentLobby); + client.Lobby.Leave(); + }; + + var sw = Stopwatch.StartNew(); + + while (sw.Elapsed.TotalSeconds < 3) + { + client.Update(); + System.Threading.Thread.Sleep(10); } + } - */ } } } diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 5748672..0db6f79 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -8,22 +8,16 @@ namespace Facepunch.Steamworks { public partial class Client : IDisposable { - public void JoinLobby(ulong LobbyID) - { - native.matchmaking.JoinLobby(LobbyID, OnLobbyJoined); - } + Lobby _lobby; - void OnLobbyJoined(LobbyEnter_t callback, bool error) + public Lobby Lobby { - //TODO: - } - - // Create a lobby, auto joins the created lobby - public Lobby CreateLobby(Lobby.Type lobbyType, int maxMembers) - { - var lobby = new Lobby(this, lobbyType); - native.matchmaking.CreateLobby((SteamNative.LobbyType)lobbyType, maxMembers, lobby.OnLobbyCreatedAPI); - return lobby; + get + { + if (_lobby == null) + _lobby = new Steamworks.Lobby(this); + return _lobby; + } } } public class Lobby : IDisposable @@ -34,47 +28,63 @@ public enum Type : int Private = SteamNative.LobbyType.Private, FriendsOnly = SteamNative.LobbyType.FriendsOnly, Public = SteamNative.LobbyType.Public, - Invisible = SteamNative.LobbyType.Invisible + Invisible = SteamNative.LobbyType.Invisible, + None } internal Client client; - /// - /// Returns true if we tried to create this lobby but it returned - /// an error. - /// - public bool IsError { get; private set; } - - /// - /// Returns true if this lobby is valid, ie, we've received - /// a positive response from Steam about it. - /// - public bool IsValid => LobbyID != 0; - - /// - /// The CSteamID of the lobby that was created - /// - internal ulong LobbyID { get; private set; } - - /// - /// The name of the lobby as a property for easy getting/setting - /// - public string Name - { - get { return _name; } - set { if (_name == value) return; SetLobbyData("name", value); } - } - string _name = ""; - - /// - /// Callback for when lobby is created - /// - public Action OnLobbyCreated; - - public Lobby(Client c, Type type) + public Lobby(Client c) { client = c; - LobbyType = type; + SteamNative.LobbyDataUpdate_t.RegisterCallback(client, OnLobbyDataUpdated); + } + + /// + /// The CSteamID of the lobby we're currently in. + /// + public ulong CurrentLobby { get; private set; } + + public LobbyData CurrentLobbyData { get; private set; } + + /// + /// Returns true if this lobby is valid, ie, we've succesffuly created and/or joined a lobby. + /// + public bool IsValid => CurrentLobby != 0; + + /// + /// Join a Lobby through its LobbyID. LobbyJoined is called when the lobby has successfully been joined. + /// + /// CSteamID of lobby to join + public void Join(ulong lobbyID) + { + client.native.matchmaking.JoinLobby(lobbyID, OnLobbyJoinedAPI); + } + + void OnLobbyJoinedAPI(LobbyEnter_t callback, bool error) + { + if (error || (callback.EChatRoomEnterResponse != (uint)(SteamNative.ChatRoomEnterResponse.Success))) + { + if (OnLobbyJoined != null) { OnLobbyJoined(false); } + return; + } + + CurrentLobby = callback.SteamIDLobby; + UpdateLobbyData(); + if (OnLobbyJoined != null) { OnLobbyJoined(true); } + } + + public Action OnLobbyJoined; + + /// + /// Creates a lobby and returns the created lobby. You auto join the created lobby. The lobby is stored in Client.CurrentLobby if successful. + /// + /// The Lobby.Type of Lobby to be created + /// The maximum amount of people you want to be able to be in this lobby, including yourself + public void Create(Lobby.Type lobbyType, int maxMembers) + { + client.native.matchmaking.CreateLobby((SteamNative.LobbyType)lobbyType, maxMembers, OnLobbyCreatedAPI); + LobbyType = lobbyType; } internal void OnLobbyCreatedAPI(LobbyCreated_t callback, bool error) @@ -82,105 +92,239 @@ internal void OnLobbyCreatedAPI(LobbyCreated_t callback, bool error) //from SpaceWarClient.cpp 793 if (error || (callback.Result != Result.OK)) { - IsError = true; + if ( OnLobbyCreated != null) { OnLobbyCreated(false); } return; } - Owner = client.SteamId; //this is implicitly set on creation but need to cache it here - LobbyID = callback.SteamIDLobby; - MaxMembers = client.native.matchmaking.GetLobbyMemberLimit(LobbyID); - SetLobbyData("appid", client.AppId.ToString()); - - if (OnLobbyCreated != null) { OnLobbyCreated(); } + //set owner specific properties + Owner = client.SteamId; + CurrentLobby = callback.SteamIDLobby; + CurrentLobbyData = new LobbyData(client, CurrentLobby); + Name = client.Username + "'s Lobby"; + CurrentLobbyData.SetData("appid", client.AppId.ToString()); + CurrentLobbyData.SetData("lobbytype", LobbyType.ToString()); + if (OnLobbyCreated != null) { OnLobbyCreated(true); } } - Dictionary LobbyData = new Dictionary(); - public void SetLobbyData(string key, string value) + /// + /// Callback for when lobby is created + /// + public Action OnLobbyCreated; + + public class LobbyData { - if (LobbyData.ContainsKey(key)) - { - if (LobbyData[key] == value) - return; + internal Client client; + internal ulong lobby; + internal Dictionary data; - LobbyData[key] = value; - } - else + public LobbyData(Client c, ulong l) { - LobbyData.Add(key, value); + client = c; + lobby = l; + data = new Dictionary(); + } + + public string GetData(string k) + { + if (data.ContainsKey(k)) + { + return data[k]; + } + + return "ERROR: key not found"; + } + + public bool SetData(string k, string v) + { + if (data.ContainsKey(k)) + { + if (data[k] == v) { return true; } + if (client.native.matchmaking.SetLobbyData(lobby, k, v)) + { + data[k] = v; + return true; + } + } + else + { + if (client.native.matchmaking.SetLobbyData(lobby, k, v)) + { + data.Add(k, v); + return true; + } + } + + return false; + } + + public bool RemoveData(string k) + { + if (data.ContainsKey(k)) + { + if (client.native.matchmaking.DeleteLobbyData(lobby, k)) + { + data.Remove(k); + return true; + } + } + + return false; } - client.native.matchmaking.SetLobbyData(LobbyID, key, value); } - public void RemoveLobbyData(string key) + internal void OnLobbyDataUpdated(LobbyDataUpdate_t callback, bool error) { - if (LobbyData.ContainsKey(key)) + if(error) { return; } + if(callback.SteamIDLobby == CurrentLobby) //actual lobby data was updated by owner { - LobbyData.Remove(key); + UpdateLobbyData(); } - client.native.matchmaking.DeleteLobbyData(LobbyID, key); + //TODO: need to check and see if the updated member is in this lobby + } + + /// + /// Updates the LobbyData property to have the data for the current lobby, if any + /// + internal void UpdateLobbyData() + { + int dataCount = client.native.matchmaking.GetLobbyDataCount(CurrentLobby); + CurrentLobbyData = new LobbyData(client, CurrentLobby); + for (int i = 0; i < dataCount; i++) + { + if (client.native.matchmaking.GetLobbyDataByIndex(CurrentLobby, i, out string key, out string value)) + { + CurrentLobbyData.SetData(key, value); + } + } } public Type LobbyType { - get { return _lobbyType; } + get + { + if (!IsValid) { return Type.None; } //if we're currently in a valid server + + //we know that we've set the lobby type via the lobbydata in the creation function + //ps this is important because steam doesn't have an easy way to get lobby type (why idk) + string lobbyType = CurrentLobbyData.GetData("lobbytype"); + switch (lobbyType) + { + case "Private": + return Type.Private; + case "FriendsOnly": + return Type.FriendsOnly; + case "Invisible": + return Type.Invisible; + case "Public": + return Type.Public; + default: + return Type.None; + } + } set { - if (_lobbyType == value) return; - //only call the proper method if the lobby is valid, otherwise cache the value - if(IsValid) + if(!IsValid) { return; } + if(client.native.matchmaking.SetLobbyType(CurrentLobby, (SteamNative.LobbyType)value)) { - client.native.matchmaking.SetLobbyType(LobbyID, (SteamNative.LobbyType)value); //returns bool? + CurrentLobbyData.SetData("lobbytype", value.ToString()); } - _lobbyType = value; } } - Type _lobbyType; + /// + /// The name of the lobby as a property for easy getting/setting. Note that this is setting LobbyData, which you cannot do unless you are the Owner of the lobby + /// + public string Name + { + get + { + if (!IsValid) { return ""; } + return CurrentLobbyData.GetData("name"); + } + set + { + if (!IsValid) { return; } + CurrentLobbyData.SetData("name", value); + } + } - //Must be the owner to change the owner + /// + /// The Owner of the current lobby. Returns 0 if you are not in a valid lobby. + /// public ulong Owner { get { - if (_owner == 0) + if (_owner == 0 && IsValid) { - _owner = client.native.matchmaking.GetLobbyOwner(LobbyID); - return _owner; + _owner = client.native.matchmaking.GetLobbyOwner(CurrentLobby); } return _owner; } - private set { if (_owner == value) return; client.native.matchmaking.SetLobbyOwner(LobbyID, value); _owner = value; } + private set + { + if (_owner == value) return; + if (client.native.matchmaking.SetLobbyOwner(CurrentLobby, value)) { _owner = value; } + } } ulong _owner = 0; // Can the lobby be joined by other people public bool Joinable { - get { return _joinable; } - set { if (_joinable == value) return; client.native.matchmaking.SetLobbyJoinable(LobbyID, value); _joinable = value; } + get + { + if (!IsValid) { return false; } + string joinable = CurrentLobbyData.GetData("joinable"); + switch (joinable) + { + case "true": + return true; + case "false": + return false; + default: + return false; + } + } + set + { + if (!IsValid) { return; } + if (client.native.matchmaking.SetLobbyJoinable(CurrentLobby, value)) + { + CurrentLobbyData.SetData("joinable", value.ToString()); + } + } } - bool _joinable = true; //steam default // How many people can be in the Lobby public int MaxMembers { - get { return _maxMembers; } - set { if (_maxMembers == value) return; client.native.matchmaking.SetLobbyMemberLimit(LobbyID, value); _maxMembers = value; } + get + { + if (!IsValid) { return 0; } //0 is default, but value is inited when lobby is created. + return client.native.matchmaking.GetLobbyMemberLimit(CurrentLobby); + } + set + { + if (!IsValid) { return; } + client.native.matchmaking.SetLobbyMemberLimit(CurrentLobby, value); + } } - int _maxMembers = 0; //How many people are currently in the lobby public int NumMembers { - get { return client.native.matchmaking.GetNumLobbyMembers(LobbyID);} + get { return client.native.matchmaking.GetNumLobbyMembers(CurrentLobby);} } //leave the current lobby public void Leave() { - client.native.matchmaking.LeaveLobby(LobbyID); + client.native.matchmaking.LeaveLobby(CurrentLobby); + _owner = 0; + CurrentLobbyData = null; } public void Dispose() @@ -189,8 +333,6 @@ public void Dispose() } /*not implemented - // returns a lobby metadata key/values pair by index - client.native.matchmaking.GetLobbyDataByIndex; //set the game server of the lobby client.native.matchmaking.GetLobbyGameServer; @@ -199,22 +341,15 @@ public void Dispose() //data for people in the actual lobby - scores/elo/characters/etc. client.native.matchmaking.SetLobbyMemberData; //local user client.native.matchmaking.GetLobbyMemberData; //any user in this lobby - // returns steamid of member // note that the current user must be in a lobby to retrieve CSteamIDs of other users in that lobby client.native.matchmaking.GetLobbyMemberByIndex; - //for linking lobbies idk havent looked hard yet - client.native.matchmaking.SetLinkedLobby; - //chat functions client.native.matchmaking.SendLobbyChatMsg; client.native.matchmaking.GetLobbyChatEntry; - //get total data count (why?) - client.native.matchmaking.GetLobbyDataCount - //invite your frans client.native.matchmaking.InviteUserToLobby //this invites the user the current lobby the invitee is in */ diff --git a/Facepunch.Steamworks/Client/LobbyList.cs b/Facepunch.Steamworks/Client/LobbyList.cs index 1019c4e..7dc9266 100644 --- a/Facepunch.Steamworks/Client/LobbyList.cs +++ b/Facepunch.Steamworks/Client/LobbyList.cs @@ -70,17 +70,32 @@ void OnLobbyList(LobbyMatchList_t callback, bool error) } else { - //need to sub the lobbyid to the request func - //client.native.matchmaking.RequestLobbyData(lobby) + //need to get the info for the missing lobby + client.native.matchmaking.RequestLobbyData(lobby); + SteamNative.LobbyDataUpdate_t.RegisterCallback(client, OnLobbyDataUpdated); } } - if (OnLobbiesRefreshed != null) { OnLobbiesRefreshed(); } + if (OnLobbiesUpdated != null) { OnLobbiesUpdated(); } } - - public Action OnLobbiesRefreshed; + void OnLobbyDataUpdated(LobbyDataUpdate_t callback, bool error) + { + if (callback.Success == 1) //1 if success, 0 if failure + { + Lobby lobby = Lobbies.Find(x => x.LobbyID == callback.SteamIDLobby); + if (lobby == null) //need to add this lobby to the list + { + Lobbies.Add(lobby); + } + + //otherwise lobby data in general was updated and you should listen to see what changed + if (OnLobbiesUpdated != null) { OnLobbiesUpdated(); } + } + } + + public Action OnLobbiesUpdated; public void Dispose() { From c40037784ef91794e35be6498617954961ef1aae Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Mon, 31 Jul 2017 09:28:09 -0700 Subject: [PATCH 04/24] Caches created LobbyType to be assigned as a LobbyData to be referenced by other members in the lobby. Because there is no GetLobbyType, provides a layer in which all users can get a LobbyType from LobbyData. --- Facepunch.Steamworks/Client/Lobby.cs | 36 +++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 0db6f79..4cc1645 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -29,7 +29,7 @@ public enum Type : int FriendsOnly = SteamNative.LobbyType.FriendsOnly, Public = SteamNative.LobbyType.Public, Invisible = SteamNative.LobbyType.Invisible, - None + Error //happens if you try to get this when you aren't in a valid lobby } internal Client client; @@ -37,7 +37,7 @@ public enum Type : int public Lobby(Client c) { client = c; - SteamNative.LobbyDataUpdate_t.RegisterCallback(client, OnLobbyDataUpdated); + SteamNative.LobbyDataUpdate_t.RegisterCallback(client, OnLobbyDataUpdatedAPI); } /// @@ -84,9 +84,11 @@ void OnLobbyJoinedAPI(LobbyEnter_t callback, bool error) public void Create(Lobby.Type lobbyType, int maxMembers) { client.native.matchmaking.CreateLobby((SteamNative.LobbyType)lobbyType, maxMembers, OnLobbyCreatedAPI); - LobbyType = lobbyType; + createdLobbyType = lobbyType; } + internal Type createdLobbyType; + internal void OnLobbyCreatedAPI(LobbyCreated_t callback, bool error) { //from SpaceWarClient.cpp 793 @@ -102,7 +104,9 @@ internal void OnLobbyCreatedAPI(LobbyCreated_t callback, bool error) CurrentLobbyData = new LobbyData(client, CurrentLobby); Name = client.Username + "'s Lobby"; CurrentLobbyData.SetData("appid", client.AppId.ToString()); + LobbyType = createdLobbyType; CurrentLobbyData.SetData("lobbytype", LobbyType.ToString()); + Joinable = true; if (OnLobbyCreated != null) { OnLobbyCreated(true); } } @@ -115,7 +119,7 @@ public class LobbyData { internal Client client; internal ulong lobby; - internal Dictionary data; + internal Dictionary data; public LobbyData(Client c, ulong l) { @@ -134,6 +138,16 @@ public string GetData(string k) return "ERROR: key not found"; } + public List> GetAllData() + { + List> returnData = new List>(); + foreach(KeyValuePair item in data) + { + returnData.Add(new KeyValuePair(item.Key, item.Value)); + } + return returnData; + } + public bool SetData(string k, string v) { if (data.ContainsKey(k)) @@ -173,7 +187,7 @@ public bool RemoveData(string k) } - internal void OnLobbyDataUpdated(LobbyDataUpdate_t callback, bool error) + internal void OnLobbyDataUpdatedAPI(LobbyDataUpdate_t callback, bool error) { if(error) { return; } if(callback.SteamIDLobby == CurrentLobby) //actual lobby data was updated by owner @@ -198,13 +212,19 @@ internal void UpdateLobbyData() CurrentLobbyData.SetData(key, value); } } + + if(OnLobbyDataUpdated != null) { OnLobbyDataUpdated(); } } + //Called when the lobby data itself has been updated. This callback is slower than the actual setting/getting of LobbyData, but it ensures safety. + public Action OnLobbyDataUpdated; + + public Type LobbyType { get { - if (!IsValid) { return Type.None; } //if we're currently in a valid server + if (!IsValid) { return Type.Error; } //if we're currently in a valid server //we know that we've set the lobby type via the lobbydata in the creation function //ps this is important because steam doesn't have an easy way to get lobby type (why idk) @@ -220,12 +240,12 @@ public Type LobbyType case "Public": return Type.Public; default: - return Type.None; + return Type.Error; } } set { - if(!IsValid) { return; } + if(!IsValid) { return; } if(client.native.matchmaking.SetLobbyType(CurrentLobby, (SteamNative.LobbyType)value)) { CurrentLobbyData.SetData("lobbytype", value.ToString()); From beccb5e5e9cc7229e0e7040b294299f26ab659b1 Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Mon, 31 Jul 2017 09:29:53 -0700 Subject: [PATCH 05/24] Gives LobbyList the ability to be queried for if it is Finished or not. A lobby refresh will finish when the number of cached lobbies equals the number of requests. --- Facepunch.Steamworks/Client/LobbyList.cs | 67 ++++++++++++++++++++---- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/Facepunch.Steamworks/Client/LobbyList.cs b/Facepunch.Steamworks/Client/LobbyList.cs index 7dc9266..cdee4da 100644 --- a/Facepunch.Steamworks/Client/LobbyList.cs +++ b/Facepunch.Steamworks/Client/LobbyList.cs @@ -8,16 +8,36 @@ namespace Facepunch.Steamworks public partial class LobbyList : IDisposable { internal Client client; - public List Lobbies = new List(); + + //The list of retrieved lobbies + public List Lobbies { get; private set; } + + //True when all the possible lobbies have had their data updated + //if the number of lobbies is now equal to the initial request number, we've found all lobbies + public bool Finished { get; private set; } + + //The number of possible lobbies we can get data from + internal List requests; internal LobbyList(Client client) { this.client = client; + Lobbies = new List(); + requests = new List(); } + /// + /// Refresh the List of Lobbies. If no filter is passed in, a default one is created that filters based on AppId ("appid"). + /// + /// public void Refresh ( Filter filter = null) { - if(filter == null) + //init out values + Lobbies.Clear(); + requests.Clear(); + Finished = false; + + if (filter == null) { filter = new Filter(); filter.StringFilters.Add("appid", client.AppId.ToString()); @@ -25,7 +45,7 @@ public void Refresh ( Filter filter = null) client.native.matchmaking.AddRequestLobbyListDistanceFilter((SteamNative.LobbyDistanceFilter)filter.DistanceFilter); - if(filter.SlotsAvailable != null) + if (filter.SlotsAvailable != null) { client.native.matchmaking.AddRequestLobbyListFilterSlotsAvailable((int)filter.SlotsAvailable); } @@ -43,10 +63,10 @@ public void Refresh ( Filter filter = null) { client.native.matchmaking.AddRequestLobbyListNearValueFilter(fil.Key, fil.Value); } - foreach (KeyValuePair> fil in filter.NumericalFilters) - { - client.native.matchmaking.AddRequestLobbyListNumericalFilter(fil.Key, fil.Value.Value, (SteamNative.LobbyComparison)fil.Value.Key); - } + //foreach (KeyValuePair> fil in filter.NumericalFilters) + //{ + // client.native.matchmaking.AddRequestLobbyListNumericalFilter(fil.Key, fil.Value.Value, (SteamNative.LobbyComparison)fil.Value.Key); + //} // this will never return lobbies that are full (via the actual api) @@ -54,23 +74,32 @@ public void Refresh ( Filter filter = null) } + void OnLobbyList(LobbyMatchList_t callback, bool error) { if (error) return; - Lobbies.Clear(); + + //how many lobbies matched uint lobbiesMatching = callback.LobbiesMatching; + // lobbies are returned in order of closeness to the user, so add them to the list in that order for (int i = 0; i < lobbiesMatching; i++) { + //add the lobby to the list of requests ulong lobby = client.native.matchmaking.GetLobbyByIndex(i); + requests.Add(lobby); + + //cast to a LobbyList.Lobby Lobby newLobby = Lobby.FromSteam(client, lobby); if (newLobby.Name != "") { + //if the lobby is valid add it to the valid return lobbies Lobbies.Add(newLobby); + checkFinished(); } else { - //need to get the info for the missing lobby + //else we need to get the info for the missing lobby client.native.matchmaking.RequestLobbyData(lobby); SteamNative.LobbyDataUpdate_t.RegisterCallback(client, OnLobbyDataUpdated); } @@ -80,19 +109,35 @@ void OnLobbyList(LobbyMatchList_t callback, bool error) if (OnLobbiesUpdated != null) { OnLobbiesUpdated(); } } + void checkFinished() + { + if (Lobbies.Count == requests.Count) + { + Finished = true; + return; + } + Finished = false; + } + void OnLobbyDataUpdated(LobbyDataUpdate_t callback, bool error) { if (callback.Success == 1) //1 if success, 0 if failure { + //find the lobby that has been updated Lobby lobby = Lobbies.Find(x => x.LobbyID == callback.SteamIDLobby); - if (lobby == null) //need to add this lobby to the list + + //if this lobby isn't yet in the list of lobbies, we know that we should add it + if (lobby == null) { Lobbies.Add(lobby); + checkFinished(); } //otherwise lobby data in general was updated and you should listen to see what changed if (OnLobbiesUpdated != null) { OnLobbiesUpdated(); } } + + } public Action OnLobbiesUpdated; @@ -109,7 +154,7 @@ public class Filter // Filters that are of string key and int value for that key to be close to public Dictionary NearFilters = new Dictionary(); //Filters that are of string key and int value, with a comparison filter to say how we should relate to the value - public Dictionary> NumericalFilters = new Dictionary>(); + //public Dictionary> NumericalFilters = new Dictionary>(); public Distance DistanceFilter = Distance.Worldwide; public int? SlotsAvailable { get; set; } public int? MaxResults { get; set; } From 75484c1e001c2a5aa9f1039953074cb5ef29f544 Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Mon, 31 Jul 2017 09:30:26 -0700 Subject: [PATCH 06/24] Adds in test functions for Lobby functionality in Steamworks --- Facepunch.Steamworks.Test/Client/Lobby.cs | 212 +++++++++++++++++++++- 1 file changed, 211 insertions(+), 1 deletion(-) diff --git a/Facepunch.Steamworks.Test/Client/Lobby.cs b/Facepunch.Steamworks.Test/Client/Lobby.cs index 3319edb..0a05800 100644 --- a/Facepunch.Steamworks.Test/Client/Lobby.cs +++ b/Facepunch.Steamworks.Test/Client/Lobby.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Diagnostics; +using Facepunch.Steamworks; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Facepunch.Steamworks.Test @@ -23,7 +25,10 @@ public void CreateLobby() { Assert.IsTrue(success); Assert.IsTrue(client.Lobby.IsValid); - Console.WriteLine(client.Lobby.CurrentLobby); + Console.WriteLine("lobby created: " + client.Lobby.CurrentLobby); + Console.WriteLine($"Owner: {client.Lobby.Owner}"); + Console.WriteLine($"Max Members: {client.Lobby.MaxMembers}"); + Console.WriteLine($"Num Members: {client.Lobby.NumMembers}"); client.Lobby.Leave(); }; @@ -37,5 +42,210 @@ public void CreateLobby() } } + + [TestMethod] + public void GetCreatedLobbyData() + { + using (var client = new Facepunch.Steamworks.Client(252490)) + { + Assert.IsTrue(client.IsValid); + + client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); + + client.Lobby.OnLobbyCreated = (success) => + { + Assert.IsTrue(success); + Assert.IsTrue(client.Lobby.IsValid); + Console.WriteLine("lobby created: " + client.Lobby.CurrentLobby); + foreach (KeyValuePair data in client.Lobby.CurrentLobbyData.GetAllData()) + { + if (data.Key == "appid") + { + Assert.IsTrue(data.Value == "252490"); + } + Console.WriteLine($"{data.Key} {data.Value}"); + } + client.Lobby.Leave(); + }; + + var sw = Stopwatch.StartNew(); + + while (sw.Elapsed.TotalSeconds < 3) + { + client.Update(); + System.Threading.Thread.Sleep(10); + } + + } + } + + [TestMethod] + public void UpdateLobbyData() + { + using (var client = new Facepunch.Steamworks.Client(252490)) + { + Assert.IsTrue(client.IsValid); + + client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); + + client.Lobby.OnLobbyCreated = (success) => + { + Assert.IsTrue(success); + Assert.IsTrue(client.Lobby.IsValid); + Console.WriteLine("lobby created: " + client.Lobby.CurrentLobby); + + client.Lobby.Name = "My Updated Lobby Name"; + client.Lobby.CurrentLobbyData.SetData("testkey", "testvalue"); + client.Lobby.LobbyType = Steamworks.Lobby.Type.Private; + client.Lobby.MaxMembers = 5; + client.Lobby.Joinable = false; + + foreach (KeyValuePair data in client.Lobby.CurrentLobbyData.GetAllData()) + { + if (data.Key == "appid") + { + Assert.IsTrue(data.Value == "252490"); + } + + if (data.Key == "testkey") + { + Assert.IsTrue(data.Value == "testvalue"); + } + + if (data.Key == "lobbytype") + { + Assert.IsTrue(data.Value == Steamworks.Lobby.Type.Private.ToString()); + } + + Console.WriteLine($"{data.Key} {data.Value}"); + } + + + + }; + + + client.Lobby.OnLobbyDataUpdated = () => + { + Console.WriteLine("lobby data updated"); + Console.WriteLine(client.Lobby.MaxMembers); + Console.WriteLine(client.Lobby.Joinable); + }; + + + + var sw = Stopwatch.StartNew(); + + while (sw.Elapsed.TotalSeconds < 3) + { + client.Update(); + System.Threading.Thread.Sleep(10); + } + + client.Lobby.Leave(); + + } + } + + [TestMethod] + public void RefreshLobbyList() + { + using (var client = new Facepunch.Steamworks.Client(252490)) + { + Assert.IsTrue(client.IsValid); + + client.Lobby.OnLobbyCreated = (success) => + { + Assert.IsTrue(success); + Assert.IsTrue(client.Lobby.IsValid); + Console.WriteLine("lobby created: " + client.Lobby.CurrentLobby); + client.LobbyList.Refresh(); + }; + + client.LobbyList.OnLobbiesUpdated = () => + { + Console.WriteLine("lobbies updating"); + if (client.LobbyList.Finished) + { + Console.WriteLine("lobbies finished updating"); + Console.WriteLine($"found {client.LobbyList.Lobbies.Count} lobbies"); + + foreach (LobbyList.Lobby lobby in client.LobbyList.Lobbies) + { + Console.WriteLine($"Found Lobby: {lobby.Name}"); + } + + client.Lobby.Leave(); + + } + + }; + + client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); + + var sw = Stopwatch.StartNew(); + + while (sw.Elapsed.TotalSeconds < 3) + { + client.Update(); + System.Threading.Thread.Sleep(10); + } + + } + } + + [TestMethod] + public void RefreshLobbyListWithFilter() + { + using (var client = new Facepunch.Steamworks.Client(480)) + { + Assert.IsTrue(client.IsValid); + + client.Lobby.OnLobbyCreated = (success) => + { + Assert.IsTrue(success); + Assert.IsTrue(client.Lobby.IsValid); + Console.WriteLine("lobby created: " + client.Lobby.CurrentLobby); + client.Lobby.CurrentLobbyData.SetData("testkey", "testvalue"); + }; + + client.Lobby.OnLobbyDataUpdated = () => + { + var filter = new LobbyList.Filter(); + filter.StringFilters.Add("testkey", "testvalue"); + client.LobbyList.Refresh(filter); + }; + + client.LobbyList.OnLobbiesUpdated = () => + { + Console.WriteLine("lobbies updating"); + if (client.LobbyList.Finished) + { + Console.WriteLine("lobbies finished updating"); + Console.WriteLine($"found {client.LobbyList.Lobbies.Count} lobbies"); + + foreach (LobbyList.Lobby lobby in client.LobbyList.Lobbies) + { + Console.WriteLine($"Found Lobby: {lobby.Name}"); + } + + } + + }; + + client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); + + var sw = Stopwatch.StartNew(); + + while (sw.Elapsed.TotalSeconds < 5) + { + client.Update(); + System.Threading.Thread.Sleep(10); + } + + client.Lobby.Leave(); + + } + } } } From bcd8495d6eda1e4d34fd83c5551842a61f7bc86c Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Mon, 31 Jul 2017 22:44:46 -0700 Subject: [PATCH 07/24] Adds in ability to send Lobby messages Also adds in some callbacks around being invited to a lobby, as well callbacks for being requested to join a lobby. --- Facepunch.Steamworks.Test/Client/Lobby.cs | 43 +++++- Facepunch.Steamworks/Client/Lobby.cs | 179 +++++++++++++++++++--- 2 files changed, 203 insertions(+), 19 deletions(-) diff --git a/Facepunch.Steamworks.Test/Client/Lobby.cs b/Facepunch.Steamworks.Test/Client/Lobby.cs index 0a05800..b84d089 100644 --- a/Facepunch.Steamworks.Test/Client/Lobby.cs +++ b/Facepunch.Steamworks.Test/Client/Lobby.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using Facepunch.Steamworks; +using System.Text; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Facepunch.Steamworks.Test @@ -197,7 +198,7 @@ public void RefreshLobbyList() [TestMethod] public void RefreshLobbyListWithFilter() { - using (var client = new Facepunch.Steamworks.Client(480)) + using (var client = new Facepunch.Steamworks.Client(252490)) { Assert.IsTrue(client.IsValid); @@ -247,5 +248,45 @@ public void RefreshLobbyListWithFilter() } } + + [TestMethod] + public void SendChatMessage() + { + using (var client = new Facepunch.Steamworks.Client(252490)) + { + Assert.IsTrue(client.IsValid); + string testString = "Hello, World"; + + client.Lobby.OnLobbyCreated = (success) => + { + Assert.IsTrue(success); + Assert.IsTrue(client.Lobby.IsValid); + Console.WriteLine("lobby created: " + client.Lobby.CurrentLobby); + client.Lobby.CurrentLobbyData.SetData("testkey", "testvalue"); + client.Lobby.SendChatMessage(testString); + }; + + client.Lobby.OnChatMessageRecieved = (steamID, bytes, length) => + { + string message = Encoding.UTF8.GetString(bytes, 0, length); + Console.WriteLine("message recieved"); + Assert.IsTrue(message == testString); + }; + + client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); + + var sw = Stopwatch.StartNew(); + + while (sw.Elapsed.TotalSeconds < 5) + { + client.Update(); + System.Threading.Thread.Sleep(10); + } + + client.Lobby.Leave(); + + } + } + } } diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 4cc1645..a7a8c6a 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Text; using SteamNative; -using Result = SteamNative.Result; namespace Facepunch.Steamworks { @@ -38,6 +37,11 @@ public Lobby(Client c) { client = c; SteamNative.LobbyDataUpdate_t.RegisterCallback(client, OnLobbyDataUpdatedAPI); + SteamNative.LobbyChatMsg_t.RegisterCallback(client, OnLobbyChatMessageRecievedAPI); + SteamNative.LobbyChatUpdate_t.RegisterCallback(client, OnLobbyStateUpdatedAPI); + SteamNative.GameLobbyJoinRequested_t.RegisterCallback(client, OnLobbyJoinRequestedAPI); + SteamNative.LobbyInvite_t.RegisterCallback(client, OnUserInvitedToLobbyAPI); + SteamNative.PersonaStateChange_t.RegisterCallback(client, OnLobbyMemberPersonaChangeAPI); } /// @@ -53,11 +57,12 @@ public Lobby(Client c) public bool IsValid => CurrentLobby != 0; /// - /// Join a Lobby through its LobbyID. LobbyJoined is called when the lobby has successfully been joined. + /// Join a Lobby through its LobbyID. OnLobbyJoined is called with the result of the Join attempt. /// /// CSteamID of lobby to join public void Join(ulong lobbyID) { + Leave(); client.native.matchmaking.JoinLobby(lobbyID, OnLobbyJoinedAPI); } @@ -74,6 +79,9 @@ void OnLobbyJoinedAPI(LobbyEnter_t callback, bool error) if (OnLobbyJoined != null) { OnLobbyJoined(true); } } + /// + /// Called when a lobby has been attempted joined. Returns true if lobby was successfuly joined, false if not. + /// public Action OnLobbyJoined; /// @@ -216,9 +224,21 @@ internal void UpdateLobbyData() if(OnLobbyDataUpdated != null) { OnLobbyDataUpdated(); } } - //Called when the lobby data itself has been updated. This callback is slower than the actual setting/getting of LobbyData, but it ensures safety. + internal void UpdateLobbyMemberData() + { + if (OnLobbyMemberDataUpdated != null) { OnLobbyMemberDataUpdated(); } + } + + /// + /// Called when the lobby data itself has been updated. Called when someone has joined/Owner has updated data + /// public Action OnLobbyDataUpdated; + /// + /// Called when a member of the lobby has updated either their personal Lobby metadata or someone's global steam state has changed (like a display name) + /// + public Action OnLobbyMemberDataUpdated; + public Type LobbyType { @@ -253,6 +273,74 @@ public Type LobbyType } } + private unsafe void OnLobbyChatMessageRecievedAPI(LobbyChatMsg_t callback, bool error) + { + //from Client.Networking + if(error || callback.SteamIDLobby != CurrentLobby) { return; } + + byte[] ReceiveBuffer = new byte[1024]; + SteamNative.CSteamID steamid = 1; + ChatEntryType chatEntryType; //not used + int readData = 0; + fixed (byte* p = ReceiveBuffer) + { + readData = client.native.matchmaking.GetLobbyChatEntry(CurrentLobby, (int)callback.ChatID, out steamid, (IntPtr)p, ReceiveBuffer.Length, out chatEntryType); + while (ReceiveBuffer.Length < readData) + { + ReceiveBuffer = new byte[readData + 1024]; + readData = client.native.matchmaking.GetLobbyChatEntry(CurrentLobby, (int)callback.ChatID, out steamid, (IntPtr)p, ReceiveBuffer.Length, out chatEntryType); + } + + } + + if (OnChatMessageRecieved != null) { OnChatMessageRecieved(steamid, ReceiveBuffer, readData); } + + } + + /// + /// Callback to get chat messages. + /// + public Action OnChatMessageRecieved; + + /// + /// Broadcasts a chat message to the all the users in the lobby users in the lobby (including the local user) will receive a LobbyChatMsg_t callback. + /// + /// True if message successfully sent + public unsafe bool SendChatMessage(string message) + { + var data = Encoding.UTF8.GetBytes(message); + fixed (byte* p = data) + { + // pvMsgBody can be binary or text data, up to 4k + // if pvMsgBody is text, cubMsgBody should be strlen( text ) + 1, to include the null terminator + return client.native.matchmaking.SendLobbyChatMsg(CurrentLobby, (IntPtr)p, data.Length); + } + } + + public enum MemberStateChange + { + Entered = ChatMemberStateChange.Entered, + Left = ChatMemberStateChange.Left, + Disconnected = ChatMemberStateChange.Disconnected, + Kicked = ChatMemberStateChange.Kicked, + Banned = ChatMemberStateChange.Banned, + } + + internal void OnLobbyStateUpdatedAPI(LobbyChatUpdate_t callback, bool error) + { + if (error || callback.SteamIDLobby != CurrentLobby) { return; } + MemberStateChange change = (MemberStateChange)callback.GfChatMemberStateChange; + ulong initiator = callback.SteamIDMakingChange; + ulong affected = callback.SteamIDUserChanged; + + if (OnLobbyStateChanged != null) { OnLobbyStateChanged(change, initiator, affected); } + } + + /// + /// Called when the state of the Lobby is somehow shifted. Usually when someone joins or leaves the lobby. + /// + public Action OnLobbyStateChanged; + /// /// The name of the lobby as a property for easy getting/setting. Note that this is setting LobbyData, which you cannot do unless you are the Owner of the lobby /// @@ -291,7 +379,9 @@ private set } ulong _owner = 0; - // Can the lobby be joined by other people + /// + /// Is the Lobby joinable by other people? Defaults to true; + /// public bool Joinable { get @@ -318,7 +408,9 @@ public bool Joinable } } - // How many people can be in the Lobby + /// + /// How many people can be in the Lobby + /// public int MaxMembers { get @@ -333,16 +425,21 @@ public int MaxMembers } } - //How many people are currently in the lobby + /// + /// How many people are currently in the Lobby + /// public int NumMembers { get { return client.native.matchmaking.GetNumLobbyMembers(CurrentLobby);} } - //leave the current lobby + /// + /// Leave the CurrentLobby. + /// public void Leave() { - client.native.matchmaking.LeaveLobby(CurrentLobby); + if (CurrentLobby != 0) { client.native.matchmaking.LeaveLobby(CurrentLobby); } + CurrentLobby = 0; _owner = 0; CurrentLobbyData = null; } @@ -352,6 +449,60 @@ public void Dispose() client = null; } + /// + /// Get an array of all the CSteamIDs in the CurrentLobby. + /// Note that you must be in the Lobby you are trying to request the MemberIDs from + /// + /// + public ulong[] GetMemberIDs() + { + ulong[] memIDs = new ulong[NumMembers]; + for (int i = 0; i < NumMembers; i++) + { + memIDs[i] = client.native.matchmaking.GetLobbyMemberByIndex(CurrentLobby, i); + } + return memIDs; + } + + /// + /// Invites the specified user to the CurrentLobby the user is in. + /// + /// ulong ID of person to invite + public bool InviteUserToLobby(ulong friendID) + { + return client.native.matchmaking.InviteUserToLobby(CurrentLobby, friendID); + } + + internal void OnUserInvitedToLobbyAPI(LobbyInvite_t callback, bool error) + { + if (error || (callback.GameID != client.AppId)) { return; } + if (OnUserInvitedToLobby != null) { OnUserInvitedToLobby(callback.SteamIDLobby, callback.SteamIDUser); } + + } + + /// + /// Called when a user invites the current user to a lobby. The first parameter is the lobby the user was invited to, the second is the CSteamID of the person who invited this user + /// + public Action OnUserInvitedToLobby; + + /// + /// Joins a lobby is a request was made to join the lobby through the friends list or an invite + /// + internal void OnLobbyJoinRequestedAPI(GameLobbyJoinRequested_t callback, bool error) + { + if (error) { return; } + Join(callback.SteamIDLobby); + } + + /// + /// Makes sure we send an update callback if a Lobby user updates their information + /// + internal void OnLobbyMemberPersonaChangeAPI(PersonaStateChange_t callback, bool error) + { + if (error || !client.native.friends.IsUserInSource(callback.SteamID, CurrentLobby)) { return; } + UpdateLobbyMemberData(); + } + /*not implemented //set the game server of the lobby @@ -362,16 +513,8 @@ public void Dispose() client.native.matchmaking.SetLobbyMemberData; //local user client.native.matchmaking.GetLobbyMemberData; //any user in this lobby - // returns steamid of member - // note that the current user must be in a lobby to retrieve CSteamIDs of other users in that lobby - client.native.matchmaking.GetLobbyMemberByIndex; - - //chat functions - client.native.matchmaking.SendLobbyChatMsg; - client.native.matchmaking.GetLobbyChatEntry; - - //invite your frans - client.native.matchmaking.InviteUserToLobby //this invites the user the current lobby the invitee is in + //used with game server stuff + SteamNative.LobbyGameCreated_t */ } } From a1f24c5f24e3982829a09d7916c66f98dea73f5d Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Mon, 31 Jul 2017 23:42:29 -0700 Subject: [PATCH 08/24] Implements ability for a user to set/get individual user metadata for the joined lobby --- Facepunch.Steamworks.Test/Client/Lobby.cs | 38 +++++++++++++ Facepunch.Steamworks/Client/Lobby.cs | 66 +++++++++++++++++------ 2 files changed, 88 insertions(+), 16 deletions(-) diff --git a/Facepunch.Steamworks.Test/Client/Lobby.cs b/Facepunch.Steamworks.Test/Client/Lobby.cs index b84d089..dd2cf04 100644 --- a/Facepunch.Steamworks.Test/Client/Lobby.cs +++ b/Facepunch.Steamworks.Test/Client/Lobby.cs @@ -288,5 +288,43 @@ public void SendChatMessage() } } + [TestMethod] + public void SetGetUserMetadata() + { + using (var client = new Facepunch.Steamworks.Client(252490)) + { + Assert.IsTrue(client.IsValid); + + client.Lobby.OnLobbyCreated = (success) => + { + Assert.IsTrue(success); + Assert.IsTrue(client.Lobby.IsValid); + Console.WriteLine("lobby created: " + client.Lobby.CurrentLobby); + client.Lobby.SetMemberData("testkey", "testvalue"); + }; + + client.Lobby.OnLobbyMemberDataUpdated = (steamID) => + { + string name = client.Friends.GetName(steamID); + Console.WriteLine(name + " updated data"); + Assert.IsTrue(client.Lobby.GetMemberData(steamID, "testkey") == "testvalue"); + Console.WriteLine("testkey is now: " + client.Lobby.GetMemberData(steamID, "testkey")); + }; + + client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); + + var sw = Stopwatch.StartNew(); + + while (sw.Elapsed.TotalSeconds < 5) + { + client.Update(); + System.Threading.Thread.Sleep(10); + } + + client.Lobby.Leave(); + + } + } + } } diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index a7a8c6a..7b3f66b 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -123,6 +123,9 @@ internal void OnLobbyCreatedAPI(LobbyCreated_t callback, bool error) /// public Action OnLobbyCreated; + /// + /// Class to hold global lobby data. This is stuff like maps/modes/etc. Data set here can be filtered by LobbyList. + /// public class LobbyData { internal Client client; @@ -195,15 +198,39 @@ public bool RemoveData(string k) } + /// + /// Sets user data for the Lobby. Things like Character, Skin, Ready, etc. Can only set your own member data + /// + public void SetMemberData(string key, string value) + { + if(CurrentLobby == 0) { return; } + client.native.matchmaking.SetLobbyMemberData(CurrentLobby, key, value); + } + + /// + /// Get the per-user metadata from this lobby. Can get data from any user + /// + /// ulong SteamID of the user you want to get data from + /// String key of the type of data you want to get + /// + public string GetMemberData(ulong steamID, string key) + { + if (CurrentLobby == 0) { return "ERROR: NOT IN ANY LOBBY"; } + return client.native.matchmaking.GetLobbyMemberData(CurrentLobby, steamID, key); + } + internal void OnLobbyDataUpdatedAPI(LobbyDataUpdate_t callback, bool error) { - if(error) { return; } + if(error || (callback.SteamIDLobby != CurrentLobby)) { return; } if(callback.SteamIDLobby == CurrentLobby) //actual lobby data was updated by owner { UpdateLobbyData(); } - //TODO: need to check and see if the updated member is in this lobby + if(UserIsInCurrentLobby(callback.SteamIDMember)) //some member of this lobby updated their information + { + if (OnLobbyMemberDataUpdated != null) { OnLobbyMemberDataUpdated(callback.SteamIDMember); } + } } /// @@ -224,20 +251,15 @@ internal void UpdateLobbyData() if(OnLobbyDataUpdated != null) { OnLobbyDataUpdated(); } } - internal void UpdateLobbyMemberData() - { - if (OnLobbyMemberDataUpdated != null) { OnLobbyMemberDataUpdated(); } - } - /// - /// Called when the lobby data itself has been updated. Called when someone has joined/Owner has updated data + /// Called when the lobby data itself has been updated. Called when someone has joined/left, Owner has updated data, etc. /// public Action OnLobbyDataUpdated; /// - /// Called when a member of the lobby has updated either their personal Lobby metadata or someone's global steam state has changed (like a display name) + /// Called when a member of the lobby has updated either their personal Lobby metadata or someone's global steam state has changed (like a display name). Parameter is the user who changed. /// - public Action OnLobbyMemberDataUpdated; + public Action OnLobbyMemberDataUpdated; public Type LobbyType @@ -456,6 +478,7 @@ public void Dispose() /// public ulong[] GetMemberIDs() { + ulong[] memIDs = new ulong[NumMembers]; for (int i = 0; i < NumMembers; i++) { @@ -464,6 +487,21 @@ public ulong[] GetMemberIDs() return memIDs; } + public bool UserIsInCurrentLobby(ulong steamID) + { + if(CurrentLobby == 0) { return false; } + ulong[] mems = GetMemberIDs(); + for (int i = 0; i < mems.Length; i++) + { + if(mems[i] == steamID) + { + return true; + } + } + + return false; + } + /// /// Invites the specified user to the CurrentLobby the user is in. /// @@ -499,8 +537,8 @@ internal void OnLobbyJoinRequestedAPI(GameLobbyJoinRequested_t callback, bool er /// internal void OnLobbyMemberPersonaChangeAPI(PersonaStateChange_t callback, bool error) { - if (error || !client.native.friends.IsUserInSource(callback.SteamID, CurrentLobby)) { return; } - UpdateLobbyMemberData(); + if (error || !UserIsInCurrentLobby(callback.SteamID)) { return; } + if (OnLobbyMemberDataUpdated != null) { OnLobbyMemberDataUpdated(callback.SteamID); } } /*not implemented @@ -509,10 +547,6 @@ internal void OnLobbyMemberPersonaChangeAPI(PersonaStateChange_t callback, bool client.native.matchmaking.GetLobbyGameServer; client.native.matchmaking.SetLobbyGameServer; - //data for people in the actual lobby - scores/elo/characters/etc. - client.native.matchmaking.SetLobbyMemberData; //local user - client.native.matchmaking.GetLobbyMemberData; //any user in this lobby - //used with game server stuff SteamNative.LobbyGameCreated_t */ From 6aa5bcf1acef0a5c9be3b0323b337b561bdc7843 Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Mon, 31 Jul 2017 23:54:32 -0700 Subject: [PATCH 09/24] Updates Readme with basic Lobby Info --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index ee7bc17..8b170ac 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,33 @@ var server = new Facepunch.Steamworks.Server( 252490, 0, 28015, true, "MyGame453 This will register a secure server for game 252490, any ip, port 28015. Again, more usage in the Facepunch.Steamworks.Test project. +## Lobby + +To create a Lobby do this. +```csharp +var client = new Facepunch.Steamworks.Client( 252490 ); +client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); +``` + +Created lobbies are auto-joined, but if you want to find a friend's lobby, you'd call +```csharp +client.LobbyList.Refresh(); +//wait for the callback +client.LobbyList.OnLobbiesUpdated = () => +{ + if (client.LobbyList.Finished) + { + foreach (LobbyList.Lobby lobby in client.LobbyList.Lobbies) + { + Console.WriteLine($"Found Lobby: {lobby.Name}"); + } + } +}; +//join a lobby you found +client.Lobby.Join(LobbyList.Lobbies[0]); +``` + + # Unity Yeah this works under Unity. That's half the point of it. From abea08d04699ebb632b8d7f5a1c5eeea5cca5dcb Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Tue, 1 Aug 2017 00:19:37 -0700 Subject: [PATCH 10/24] Fixes bug where LobbyList wouldn't report finished if it returned 0 lobbies --- Facepunch.Steamworks/Client/LobbyList.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Facepunch.Steamworks/Client/LobbyList.cs b/Facepunch.Steamworks/Client/LobbyList.cs index cdee4da..905695d 100644 --- a/Facepunch.Steamworks/Client/LobbyList.cs +++ b/Facepunch.Steamworks/Client/LobbyList.cs @@ -106,6 +106,8 @@ void OnLobbyList(LobbyMatchList_t callback, bool error) } + checkFinished(); + if (OnLobbiesUpdated != null) { OnLobbiesUpdated(); } } From cc4fdd532403cbaacb9f3b6f5c14d73e26450fd9 Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Fri, 4 Aug 2017 01:56:14 -0700 Subject: [PATCH 11/24] Cleans up some comments --- Facepunch.Steamworks/Client/Lobby.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 7b3f66b..858fc4b 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -119,7 +119,7 @@ internal void OnLobbyCreatedAPI(LobbyCreated_t callback, bool error) } /// - /// Callback for when lobby is created + /// Callback for when lobby is created. Parameter resolves true when the Lobby was successfully created /// public Action OnLobbyCreated; @@ -320,7 +320,7 @@ private unsafe void OnLobbyChatMessageRecievedAPI(LobbyChatMsg_t callback, bool } /// - /// Callback to get chat messages. + /// Callback to get chat messages. Use Encoding.UTF8.GetString to retrive the message. /// public Action OnChatMessageRecieved; @@ -360,6 +360,8 @@ internal void OnLobbyStateUpdatedAPI(LobbyChatUpdate_t callback, bool error) /// /// Called when the state of the Lobby is somehow shifted. Usually when someone joins or leaves the lobby. + /// The first ulong is the SteamID of the user that initiated the change. + /// The second ulong is the person that was affected /// public Action OnLobbyStateChanged; @@ -473,9 +475,9 @@ public void Dispose() /// /// Get an array of all the CSteamIDs in the CurrentLobby. - /// Note that you must be in the Lobby you are trying to request the MemberIDs from + /// Note that you must be in the Lobby you are trying to request the MemberIDs from. + /// Returns an empty array if you aren't in a lobby. /// - /// public ulong[] GetMemberIDs() { From bef249000afc3b28c24ba8089d0c9761d4268c7b Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Sun, 6 Aug 2017 22:09:13 -0700 Subject: [PATCH 12/24] Simple comment update --- .gitignore | 5 ++++- Facepunch.Steamworks/Client/Lobby.cs | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b4b44f0..059b7d3 100644 --- a/.gitignore +++ b/.gitignore @@ -55,11 +55,14 @@ Facepunch.Steamworks.Test/bin/Release/Facepunch.Steamworks.Test.dll Facepunch.Steamworks.Test/bin/Release/Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll *.user *.cache +*.idea +*.vscode TestResults obj Facepunch.Steamworks/bin/Debug/Facepunch.Steamworks.Api.dll Facepunch.Steamworks/bin/Debug/Facepunch.Steamworks.dll Facepunch.Steamworks/bin/Release/Facepunch.Steamworks.dll +Facepunch.Steamworks/bin *.opendb *.db Facepunch.Steamworks.dll @@ -69,4 +72,4 @@ mscorlib.dll *.nlp packages Generator/bin -*.XML \ No newline at end of file +*.XML diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 858fc4b..fb11536 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -478,6 +478,7 @@ public void Dispose() /// Note that you must be in the Lobby you are trying to request the MemberIDs from. /// Returns an empty array if you aren't in a lobby. /// + /// Array of member SteamIDs public ulong[] GetMemberIDs() { From 5067c32eedc7791d58eab610401ff48110821758 Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Mon, 7 Aug 2017 09:24:28 -0700 Subject: [PATCH 13/24] Small README update and adjusts doc tags for Lobby functions. --- Facepunch.Steamworks/Client/Lobby.cs | 39 +++++++++++++++++++++++++--- README.md | 5 ++-- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index fb11536..1d20130 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -49,6 +49,9 @@ public Lobby(Client c) /// public ulong CurrentLobby { get; private set; } + /// + /// The LobbyData of the CurrentLobby. Note this is the global data for the lobby. Use SetMemberData to set specific member data. + /// public LobbyData CurrentLobbyData { get; private set; } /// @@ -139,6 +142,11 @@ public LobbyData(Client c, ulong l) data = new Dictionary(); } + /// + /// Get the lobby value for the specific key + /// + /// The key to find + /// The value at key public string GetData(string k) { if (data.ContainsKey(k)) @@ -149,16 +157,26 @@ public string GetData(string k) return "ERROR: key not found"; } - public List> GetAllData() + /// + /// Get a list of all the data in the Lobby + /// + /// Dictionary of all the key/value pairs in the data + public Dictionary GetAllData() { - List> returnData = new List>(); + Dictionary returnData = new Dictionary(); foreach(KeyValuePair item in data) { - returnData.Add(new KeyValuePair(item.Key, item.Value)); + returnData.Add(item.Key, item.Value); } return returnData; } + /// + /// Set the value for specified Key. Note that the keys "joinable", "appid", "name", and "lobbytype" are reserved for internal library use. + /// + /// The key to set the value for + /// The value of the Key + /// True if data successfully set public bool SetData(string k, string v) { if (data.ContainsKey(k)) @@ -182,6 +200,11 @@ public bool SetData(string k, string v) return false; } + /// + /// Remove the key from the LobbyData. Note that the keys "joinable", "appid", "name", and "lobbytype" are reserved for internal library use. + /// + /// The key to remove + /// True if Key successfully removed public bool RemoveData(string k) { if (data.ContainsKey(k)) @@ -339,6 +362,9 @@ public unsafe bool SendChatMessage(string message) } } + /// + /// Enums to catch the state of a user when their state has changed + /// public enum MemberStateChange { Entered = ChatMemberStateChange.Entered, @@ -490,6 +516,11 @@ public ulong[] GetMemberIDs() return memIDs; } + /// + /// Check to see if a user is in your CurrentLobby + /// + /// SteamID of the user to check for + /// public bool UserIsInCurrentLobby(ulong steamID) { if(CurrentLobby == 0) { return false; } @@ -527,7 +558,7 @@ internal void OnUserInvitedToLobbyAPI(LobbyInvite_t callback, bool error) public Action OnUserInvitedToLobby; /// - /// Joins a lobby is a request was made to join the lobby through the friends list or an invite + /// Joins a lobby if a request was made to join the lobby through the friends list or an invite /// internal void OnLobbyJoinRequestedAPI(GameLobbyJoinRequested_t callback, bool error) { diff --git a/README.md b/README.md index 8b170ac..30d4f9e 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ You can view examples of everything in the Facepunch.Steamworks.Test project. ## Client -Compile and add the library to your project. To create a client you can do this. +Compile the Facepunch.Steamworks project and add the library to your Unity project. To create a client you can do this. ```csharp var client = new Facepunch.Steamworks.Client( 252490 ); @@ -72,7 +72,6 @@ This will register a secure server for game 252490, any ip, port 28015. Again, m To create a Lobby do this. ```csharp -var client = new Facepunch.Steamworks.Client( 252490 ); client.Lobby.Create(Steamworks.Lobby.Type.Public, 10); ``` @@ -94,6 +93,8 @@ client.LobbyList.OnLobbiesUpdated = () => client.Lobby.Join(LobbyList.Lobbies[0]); ``` +Your can find more examples of Lobby functionality in the Lobby.cs file in the test project. Sending chat messages, assinging lobby data and member data, etc. + # Unity From c5af1f91cf35de5e0df0a580e9e4fbfb264dcd14 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 16 Aug 2017 22:11:00 +0100 Subject: [PATCH 14/24] Nicer shutdown, I think --- Facepunch.Steamworks/Interop/Native.cs | 44 ++++++++++---------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/Facepunch.Steamworks/Interop/Native.cs b/Facepunch.Steamworks/Interop/Native.cs index f79b74b..879febd 100644 --- a/Facepunch.Steamworks/Interop/Native.cs +++ b/Facepunch.Steamworks/Interop/Native.cs @@ -116,27 +116,6 @@ public void FillInterfaces( BaseSteamworks steamworks, int hpipe, int huser ) public void Dispose() { - if ( client != null ) - { - if ( hPipe != 0 ) - { - if ( hUser != 0 ) - { - client.ReleaseUser( hPipe, hUser ); - hUser = 0; - } - - client.BReleaseSteamPipe( hPipe ); - hPipe = 0; - } - - if ( !client.BShutdownIfAllPipesClosed() ) - Console.WriteLine( "BShutdownIfAllPipesClosed returned false" ); - - client.Dispose(); - client = null; - } - if ( user != null ) { user.Dispose(); @@ -186,12 +165,7 @@ public void Dispose() } if ( gameServer != null ) - { - // - // Calling this can cause the process to hang - // - //gameServer.LogOff(); - + { gameServer.Dispose(); gameServer = null; } @@ -232,6 +206,12 @@ public void Dispose() applist = null; } + if ( client != null ) + { + client.Dispose(); + client = null; + } + if ( api != null ) { if ( isServer ) @@ -239,6 +219,16 @@ public void Dispose() else api.SteamAPI_Shutdown(); + // + // The functions above destroy the pipeline handles + // and all of the classes. Trying to call a steam function + // at this point will result in a crash - because any + // pointers we stored are not invalid. + // + + hPipe = 0; + hUser = 0; + api.Dispose(); api = null; } From fd14512e2889971ae88edb5e941b03b16817078b Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Wed, 16 Aug 2017 19:45:35 -0700 Subject: [PATCH 15/24] fixes bug where Lobby Owner was unable to be set --- Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj | 1 + Facepunch.Steamworks/Client/Lobby.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj index 891970f..d60fc27 100644 --- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj +++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj @@ -94,6 +94,7 @@ + diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 1d20130..4dd2725 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -421,7 +421,7 @@ public ulong Owner } return _owner; } - private set + set { if (_owner == value) return; if (client.native.matchmaking.SetLobbyOwner(CurrentLobby, value)) { _owner = value; } From d614b1544b1f956cc461e630cea3f6e7817d788b Mon Sep 17 00:00:00 2001 From: Kyle Kukshtel Date: Wed, 16 Aug 2017 22:26:37 -0700 Subject: [PATCH 16/24] Fixes issue where Lobby Owner was being imporperly cached and not updating with the Lobby state. --- Facepunch.Steamworks/Client/Lobby.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Facepunch.Steamworks/Client/Lobby.cs b/Facepunch.Steamworks/Client/Lobby.cs index 4dd2725..8f7e09e 100644 --- a/Facepunch.Steamworks/Client/Lobby.cs +++ b/Facepunch.Steamworks/Client/Lobby.cs @@ -415,19 +415,18 @@ public ulong Owner { get { - if (_owner == 0 && IsValid) + if (IsValid) { - _owner = client.native.matchmaking.GetLobbyOwner(CurrentLobby); + return client.native.matchmaking.GetLobbyOwner(CurrentLobby); } - return _owner; + return 0; } set { - if (_owner == value) return; - if (client.native.matchmaking.SetLobbyOwner(CurrentLobby, value)) { _owner = value; } + if (Owner == value) return; + client.native.matchmaking.SetLobbyOwner(CurrentLobby, value); } } - ulong _owner = 0; /// /// Is the Lobby joinable by other people? Defaults to true; @@ -490,7 +489,6 @@ public void Leave() { if (CurrentLobby != 0) { client.native.matchmaking.LeaveLobby(CurrentLobby); } CurrentLobby = 0; - _owner = 0; CurrentLobbyData = null; } From 79f398da0424fbcdedeb8ba5f0ae44e6dbf13793 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Thu, 17 Aug 2017 12:00:29 +0100 Subject: [PATCH 17/24] Throw exception if trying to initialize without destroying old instance --- Facepunch.Steamworks/Client.cs | 5 +++++ Facepunch.Steamworks/Server.cs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/Facepunch.Steamworks/Client.cs b/Facepunch.Steamworks/Client.cs index e46e5e4..32419bd 100644 --- a/Facepunch.Steamworks/Client.cs +++ b/Facepunch.Steamworks/Client.cs @@ -65,6 +65,11 @@ public partial class Client : BaseSteamworks public Client( uint appId ) { + if ( Instance != null ) + { + throw new System.Exception( "Only one Facepunch.Steamworks.Client can exist - dispose the old one before trying to create a new one." ); + } + Instance = this; native = new Interop.NativeInterface(); diff --git a/Facepunch.Steamworks/Server.cs b/Facepunch.Steamworks/Server.cs index da274e0..01c21d4 100644 --- a/Facepunch.Steamworks/Server.cs +++ b/Facepunch.Steamworks/Server.cs @@ -26,6 +26,11 @@ public partial class Server : BaseSteamworks /// public Server( uint appId, ServerInit init ) { + if ( Instance != null ) + { + throw new System.Exception( "Only one Facepunch.Steamworks.Server can exist - dispose the old one before trying to create a new one." ); + } + Instance = this; native = new Interop.NativeInterface(); From 4ba430601a0aad171d509c800a58ad237c73b7c3 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Thu, 17 Aug 2017 12:02:32 +0100 Subject: [PATCH 18/24] Console errors on init failure --- Facepunch.Steamworks/Interop/Native.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Facepunch.Steamworks/Interop/Native.cs b/Facepunch.Steamworks/Interop/Native.cs index 879febd..8ac3d77 100644 --- a/Facepunch.Steamworks/Interop/Native.cs +++ b/Facepunch.Steamworks/Interop/Native.cs @@ -39,22 +39,34 @@ internal bool InitClient( BaseSteamworks steamworks ) api = new SteamNative.SteamApi(); if ( !api.SteamAPI_Init() ) + { + Console.Error.WriteLine( "InitClient: SteamAPI_Init returned false" ); return false; + } hUser = api.SteamAPI_GetHSteamUser(); hPipe = api.SteamAPI_GetHSteamPipe(); if ( hPipe == 0 ) + { + Console.Error.WriteLine( "InitClient: hPipe == 0" ); return false; + } FillInterfaces( steamworks, hUser, hPipe ); if ( !user.IsValid ) + { + Console.Error.WriteLine( "InitClient: ISteamUser is null" ); return false; + } // Ensure that the user has logged into Steam. This will always return true if the game is launched // from Steam, but if Steam is at the login prompt when you run your game it will return false. if ( !user.BLoggedOn() ) + { + Console.Error.WriteLine( "InitClient: Not Logged On" ); return false; + } return true; } @@ -67,13 +79,17 @@ internal bool InitServer( BaseSteamworks steamworks, uint IpAddress /*uint32*/, if ( !api.SteamInternal_GameServer_Init( IpAddress, usPort, GamePort, QueryPort, eServerMode, pchVersionString ) ) { + Console.Error.WriteLine( "InitServer: GameServer_Init returned false" ); return false; } hUser = api.SteamGameServer_GetHSteamUser(); hPipe = api.SteamGameServer_GetHSteamPipe(); if ( hPipe == 0 ) + { + Console.Error.WriteLine( "InitServer: hPipe == 0" ); return false; + } FillInterfaces( steamworks, hPipe, hUser ); From c6bd69092a990e7930019288795b8433b6700777 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Thu, 17 Aug 2017 13:21:22 +0100 Subject: [PATCH 19/24] Added ServerRequest.OnServerResponded, OnFinished --- Facepunch.Steamworks/Client/ServerList.Request.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Facepunch.Steamworks/Client/ServerList.Request.cs b/Facepunch.Steamworks/Client/ServerList.Request.cs index 503ef1f..f3da876 100644 --- a/Facepunch.Steamworks/Client/ServerList.Request.cs +++ b/Facepunch.Steamworks/Client/ServerList.Request.cs @@ -91,6 +91,8 @@ internal bool Update( SteamNative.SteamMatchmakingServers servers, Action OnServerResponded; + public Action OnFinished; /// /// A list of servers that responded. If you're only interested in servers that responded since you @@ -181,6 +183,8 @@ private void Update() { Finished = true; client.OnUpdate -= Update; + + OnFinished?.Invoke(); } } @@ -191,7 +195,10 @@ private void OnServer( SteamNative.gameserveritem_t info ) if ( Filter != null && !Filter.Test( info ) ) return; - Responded.Add( Server.FromSteam( client, info ) ); + var s = Server.FromSteam( client, info ); + Responded.Add( s ); + + OnServerResponded?.Invoke( s ); } else { From cc4bdcea8d6b0bc7821e5b3ff2570b277daf35d3 Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Thu, 17 Aug 2017 14:45:58 +0100 Subject: [PATCH 20/24] Use IPAddress --- .../Client/Serverlist.cs | 6 +++-- .../Client/ServerList.Server.cs | 27 +++++-------------- Facepunch.Steamworks/Client/ServerList.cs | 4 +-- Facepunch.Steamworks/Interop/ServerRules.cs | 5 ++-- Facepunch.Steamworks/Utility.cs | 12 +++++++++ 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/Facepunch.Steamworks.Test/Client/Serverlist.cs b/Facepunch.Steamworks.Test/Client/Serverlist.cs index 29614c8..2f13b33 100644 --- a/Facepunch.Steamworks.Test/Client/Serverlist.cs +++ b/Facepunch.Steamworks.Test/Client/Serverlist.cs @@ -47,7 +47,7 @@ public void InternetList() foreach ( var server in query.Responded.Take( 20 ) ) { - Console.WriteLine( "{0} {1}", server.AddressString, server.Name ); + Console.WriteLine( "{0} {1}", server.Address, server.Name ); } query.Dispose(); @@ -370,7 +370,9 @@ public void CustomList() foreach ( var s in query.Responded ) { - Console.WriteLine( "{0} - {1}", s.AddressString, s.Name ); + Console.WriteLine( "{0} - {1}", s.Address, s.Name ); + + Assert.IsTrue( servers.Contains( $"{s.Address}:{s.QueryPort}" ) ); } query.Dispose(); diff --git a/Facepunch.Steamworks/Client/ServerList.Server.cs b/Facepunch.Steamworks/Client/ServerList.Server.cs index 473de8a..a750f2d 100644 --- a/Facepunch.Steamworks/Client/ServerList.Server.cs +++ b/Facepunch.Steamworks/Client/ServerList.Server.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Runtime.InteropServices; using System.Text; @@ -25,7 +26,7 @@ public class Server public int Version { get; set; } public string[] Tags { get; set; } public ulong SteamId { get; set; } - public uint Address { get; set; } + public IPAddress Address { get; set; } public int ConnectionPort { get; set; } public int QueryPort { get; set; } @@ -42,27 +43,13 @@ public bool Favourite internal Client Client; - public string AddressString - { - get - { - return string.Format( "{0}.{1}.{2}.{3}", ( Address >> 24 ) & 0xFFul, ( Address >> 16 ) & 0xFFul, ( Address >> 8 ) & 0xFFul, Address & 0xFFul ); - } - } - public string ConnectionAddress - { - get - { - return string.Format( "{0}.{1}.{2}.{3}:{4}", ( Address >> 24 ) & 0xFFul, ( Address >> 16 ) & 0xFFul, ( Address >> 8 ) & 0xFFul, Address & 0xFFul, ConnectionPort ); - } - } internal static Server FromSteam( Client client, SteamNative.gameserveritem_t item ) { return new Server() { Client = client, - Address = item.NetAdr.IP, + Address = Utility.Int32ToIp( item.NetAdr.IP ), ConnectionPort = item.NetAdr.ConnectionPort, QueryPort = item.NetAdr.QueryPort, Name = item.ServerName, @@ -133,7 +120,7 @@ internal void OnServerRulesReceiveFinished( bool Success ) /// public void AddToHistory() { - Client.native.matchmaking.AddFavoriteGame( AppId, Address, (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagHistory, (uint)Utility.Epoch.Current ); + Client.native.matchmaking.AddFavoriteGame( AppId, Utility.IpToInt32( Address ), (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagHistory, (uint)Utility.Epoch.Current ); Client.ServerList.UpdateFavouriteList(); } @@ -142,7 +129,7 @@ public void AddToHistory() /// public void RemoveFromHistory() { - Client.native.matchmaking.RemoveFavoriteGame( AppId, Address, (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagHistory ); + Client.native.matchmaking.RemoveFavoriteGame( AppId, Utility.IpToInt32( Address ), (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagHistory ); Client.ServerList.UpdateFavouriteList(); } @@ -151,7 +138,7 @@ public void RemoveFromHistory() /// public void AddToFavourites() { - Client.native.matchmaking.AddFavoriteGame( AppId, Address, (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagFavorite, (uint)Utility.Epoch.Current ); + Client.native.matchmaking.AddFavoriteGame( AppId, Utility.IpToInt32( Address ), (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagFavorite, (uint)Utility.Epoch.Current ); Client.ServerList.UpdateFavouriteList(); } @@ -160,7 +147,7 @@ public void AddToFavourites() /// public void RemoveFromFavourites() { - Client.native.matchmaking.RemoveFavoriteGame( AppId, Address, (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagFavorite ); + Client.native.matchmaking.RemoveFavoriteGame( AppId, Utility.IpToInt32( Address ), (ushort)ConnectionPort, (ushort)QueryPort, k_unFavoriteFlagFavorite ); Client.ServerList.UpdateFavouriteList(); } } diff --git a/Facepunch.Steamworks/Client/ServerList.cs b/Facepunch.Steamworks/Client/ServerList.cs index 09f4149..407d98f 100644 --- a/Facepunch.Steamworks/Client/ServerList.cs +++ b/Facepunch.Steamworks/Client/ServerList.cs @@ -248,7 +248,7 @@ public Request Local( Filter filter = null ) internal bool IsFavourite( Server server ) { - ulong encoded = server.Address; + ulong encoded = Utility.IpToInt32( server.Address ); encoded = encoded << 32; encoded = encoded | (uint)server.ConnectionPort; @@ -257,7 +257,7 @@ internal bool IsFavourite( Server server ) internal bool IsHistory( Server server ) { - ulong encoded = server.Address; + ulong encoded = Utility.IpToInt32( server.Address ); encoded = encoded << 32; encoded = encoded | (uint)server.ConnectionPort; diff --git a/Facepunch.Steamworks/Interop/ServerRules.cs b/Facepunch.Steamworks/Interop/ServerRules.cs index 78b8610..2cdb16a 100644 --- a/Facepunch.Steamworks/Interop/ServerRules.cs +++ b/Facepunch.Steamworks/Interop/ServerRules.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Runtime.InteropServices; using System.Text; @@ -20,7 +21,7 @@ class ServerRules : IDisposable // The server that called us private ServerList.Server Server; - public ServerRules( ServerList.Server server, uint address, int queryPort ) + public ServerRules( ServerList.Server server, IPAddress address, int queryPort ) { Server = server; @@ -32,7 +33,7 @@ public ServerRules( ServerList.Server server, uint address, int queryPort ) // // Ask Steam to get the server rules, respond to our fake vtable // - Server.Client.native.servers.ServerRules( address, (ushort)queryPort, GetPtr() ); + Server.Client.native.servers.ServerRules( Utility.IpToInt32( address ), (ushort)queryPort, GetPtr() ); } public void Dispose() diff --git a/Facepunch.Steamworks/Utility.cs b/Facepunch.Steamworks/Utility.cs index e3cf995..c97c51c 100644 --- a/Facepunch.Steamworks/Utility.cs +++ b/Facepunch.Steamworks/Utility.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Text; namespace Facepunch.Steamworks @@ -15,6 +16,17 @@ static internal uint SwapBytes( uint x ) ( ( x & 0xff000000 ) >> 24 ); } + + static internal uint IpToInt32( this IPAddress ipAddress ) + { + return BitConverter.ToUInt32( ipAddress.GetAddressBytes().Reverse().ToArray(), 0 ); + } + + static internal IPAddress Int32ToIp( uint ipAddress ) + { + return new IPAddress( BitConverter.GetBytes( ipAddress ).Reverse().ToArray() ); + } + static internal class Epoch { private static readonly DateTime epoch = new DateTime( 1970, 1, 1, 0, 0, 0, DateTimeKind.Utc ); From 2b4c62bd286746b15131e46c613765f41d1ae5bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20M=C3=B6ller?= Date: Wed, 30 Aug 2017 23:35:47 +0200 Subject: [PATCH 21/24] Added support for publishing workshop items to the main app from another app. --- .../Interfaces/Workshop.Editor.cs | 5 +++-- Facepunch.Steamworks/Interfaces/Workshop.cs | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Facepunch.Steamworks/Interfaces/Workshop.Editor.cs b/Facepunch.Steamworks/Interfaces/Workshop.Editor.cs index 761cb64..e57d2fa 100644 --- a/Facepunch.Steamworks/Interfaces/Workshop.Editor.cs +++ b/Facepunch.Steamworks/Interfaces/Workshop.Editor.cs @@ -24,6 +24,7 @@ public class Editor public ItemType? Type { get; set; } public string Error { get; internal set; } = null; public string ChangeNote { get; set; } = ""; + public uint WorkshopUploadAppId { get; set; } public enum VisibilityType : int { @@ -109,7 +110,7 @@ private void StartCreatingItem() if ( !Type.HasValue ) throw new System.Exception( "Editor.Type must be set when creating a new item!" ); - CreateItem = workshop.ugc.CreateItem( workshop.steamworks.AppId, (SteamNative.WorkshopFileType)(uint)Type, OnItemCreated ); + CreateItem = workshop.ugc.CreateItem( WorkshopUploadAppId, (SteamNative.WorkshopFileType)(uint)Type, OnItemCreated ); } private void OnItemCreated( SteamNative.CreateItemResult_t obj, bool Failed ) @@ -130,7 +131,7 @@ private void OnItemCreated( SteamNative.CreateItemResult_t obj, bool Failed ) private void PublishChanges() { - UpdateHandle = workshop.ugc.StartItemUpdate( workshop.steamworks.AppId, Id ); + UpdateHandle = workshop.ugc.StartItemUpdate(WorkshopUploadAppId, Id ); if ( Title != null ) workshop.ugc.SetItemTitle( UpdateHandle, Title ); diff --git a/Facepunch.Steamworks/Interfaces/Workshop.cs b/Facepunch.Steamworks/Interfaces/Workshop.cs index e35bc4b..c32713a 100644 --- a/Facepunch.Steamworks/Interfaces/Workshop.cs +++ b/Facepunch.Steamworks/Interfaces/Workshop.cs @@ -98,9 +98,20 @@ public Query CreateQuery() /// public Editor CreateItem( ItemType type ) { - return new Editor() { workshop = this, Type = type }; + return CreateItem(this.steamworks.AppId, type); } - + + /// + /// Create a new Editor object with the intention of creating a new item. + /// Your item won't actually be created until you call Publish() on the object. + /// Your item will be published to the provided appId. + /// + /// You need to add app publish permissions for cross app uploading to work. + public Editor CreateItem( uint workshopUploadAppId, ItemType type ) + { + return new Editor() { workshop = this, WorkshopUploadAppId = workshopUploadAppId, Type = type }; + } + /// /// Returns a class representing this ItemId. We don't query /// item name, description etc. We don't verify that item exists. From 1cf213070357b0f29cc638884f09bf3555cd30da Mon Sep 17 00:00:00 2001 From: Garry Newman Date: Wed, 30 Aug 2017 23:10:55 +0100 Subject: [PATCH 22/24] Compile fixes, netstandard2.0 --- .gitignore | 1 + .../Facepunch.Steamworks.Test.csproj | 12 +++---- .../bin/Debug/Newtonsoft.Json.dll | Bin 0 -> 532992 bytes Facepunch.Steamworks.sln | 13 +++----- .../Facepunch.Steamworks.NetCore.csproj | 30 ------------------ .../Facepunch.Steamworks.csproj | 27 ++++++++++++---- Jenkinsfile | 15 ++------- 7 files changed, 35 insertions(+), 63 deletions(-) create mode 100644 Facepunch.Steamworks.Test/bin/Debug/Newtonsoft.Json.dll delete mode 100644 Facepunch.Steamworks/Facepunch.Steamworks.NetCore.csproj diff --git a/.gitignore b/.gitignore index 059b7d3..5bafc8c 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,4 @@ mscorlib.dll packages Generator/bin *.XML +.vs \ No newline at end of file diff --git a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj index d60fc27..ce77f05 100644 --- a/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj +++ b/Facepunch.Steamworks.Test/Facepunch.Steamworks.Test.csproj @@ -108,12 +108,6 @@ - - - {dc2d9fa9-f005-468f-8581-85c79f4e0034} - Facepunch.Steamworks - - @@ -121,6 +115,12 @@ + + + {91962664-eb42-472a-94c8-c4ffeb44cc4b} + Facepunch.Steamworks + + diff --git a/Facepunch.Steamworks.Test/bin/Debug/Newtonsoft.Json.dll b/Facepunch.Steamworks.Test/bin/Debug/Newtonsoft.Json.dll new file mode 100644 index 0000000000000000000000000000000000000000..5523f5c39390a92bc72fa50283059f3f92cc9778 GIT binary patch literal 532992 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
  • vT1u=GpAgaX4~sEdsVKs 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
      t+cN%_nbH3($Cb6Cm`8mRAjFIPaLYyP8<&rtQ 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

      71lIBD+fI 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 - - - netstandard1.6 - true - true - Facepunch.Steamworks - Facepunch.Steamworks - 1.6.0 - $(PackageTargetFallback);dnxcore50 - Facepunch.Steamworks - - False - - - - TRACE;DEBUG;NETSTANDARD1_6;NETCORE - 1701;1702;1705;618;1591 - - - - TRACE;RELEASE;NETSTANDARD1_6;NETCORE - 1701;1702;1705;618;1591 - - - - - - - diff --git a/Facepunch.Steamworks/Facepunch.Steamworks.csproj b/Facepunch.Steamworks/Facepunch.Steamworks.csproj index 4953776..8ad6677 100644 --- a/Facepunch.Steamworks/Facepunch.Steamworks.csproj +++ b/Facepunch.Steamworks/Facepunch.Steamworks.csproj @@ -1,23 +1,36 @@  - net3.5 + + netstandard2.0;net45;net35 true - true Facepunch.Steamworks - Facepunch.Steamworks - $(PackageTargetFallback);dnxcore50 - Facepunch.Steamworks + + true + false + - TRACE;DEBUG;NETSTANDARD1_6;NETCORE + TRACE;DEBUG 1701;1702;1705;618;1591 - TRACE;RELEASE;NETSTANDARD1_6;NETCORE + TRACE;RELEASE 1701;1702;1705;618;1591 + + $(DefineConstants);NET_CORE + + + + + + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client + + diff --git a/Jenkinsfile b/Jenkinsfile index b7ac2fa..3095d5d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -4,22 +4,13 @@ node ( 'vs2017' ) checkout scm stage 'Restore' - bat 'nuget restore Facepunch.Steamworks.sln' + bat "dotnet restore Facepunch.Steamworks/Facepunch.Steamworks.csproj" stage 'Build Release' - bat "\"${tool 'MSBuild'}\" Facepunch.Steamworks/Facepunch.Steamworks.csproj /p:Configuration=Release /p:ProductVersion=1.0.0.${env.BUILD_NUMBER}" + bat "dotnet build Facepunch.Steamworks/Facepunch.Steamworks.csproj --configuration Release" stage 'Build Debug' - bat "\"${tool 'MSBuild'}\" Facepunch.Steamworks/Facepunch.Steamworks.csproj /p:Configuration=Debug /p:ProductVersion=1.0.0.${env.BUILD_NUMBER}" - - stage 'Build Release NetCore' - bat "dotnet restore Facepunch.Steamworks/Facepunch.Steamworks.NetCore.csproj" - - stage 'Build Release NetCore' - bat "dotnet build Facepunch.Steamworks/Facepunch.Steamworks.NetCore.csproj --configuration Release" - - stage 'Build Debug NetCore' - bat "dotnet build Facepunch.Steamworks/Facepunch.Steamworks.NetCore.csproj --configuration Debug" + bat "dotnet build Facepunch.Steamworks/Facepunch.Steamworks.csproj --configuration Debug" stage 'Archive' archiveArtifacts artifacts: 'Facepunch.Steamworks/bin/**/*' From b6c7916684c0d387eeb575720fb4f0eb8dab83d6 Mon Sep 17 00:00:00 2001 From: Phyxion Date: Tue, 5 Sep 2017 13:30:35 +0200 Subject: [PATCH 23/24] Added .NET 4.0 --- Facepunch.Steamworks/Facepunch.Steamworks.csproj | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Facepunch.Steamworks/Facepunch.Steamworks.csproj b/Facepunch.Steamworks/Facepunch.Steamworks.csproj index 8ad6677..a910c47 100644 --- a/Facepunch.Steamworks/Facepunch.Steamworks.csproj +++ b/Facepunch.Steamworks/Facepunch.Steamworks.csproj @@ -2,7 +2,7 @@ - netstandard2.0;net45;net35 + netstandard2.0;net45;net35;net40 true Facepunch.Steamworks @@ -30,7 +30,11 @@ - C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client - + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client + + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client + From 2e65cfe9bb4192fc64c17d81df01b77bda80ae1d Mon Sep 17 00:00:00 2001 From: James King Date: Wed, 16 Aug 2017 12:03:17 +0100 Subject: [PATCH 24/24] NormalizePath fix for non-windows --- Facepunch.Steamworks/Client/RemoteStorage.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Facepunch.Steamworks/Client/RemoteStorage.cs b/Facepunch.Steamworks/Client/RemoteStorage.cs index c33afc5..7110d31 100644 --- a/Facepunch.Steamworks/Client/RemoteStorage.cs +++ b/Facepunch.Steamworks/Client/RemoteStorage.cs @@ -14,7 +14,11 @@ public class RemoteStorage : IDisposable { private static string NormalizePath( string path ) { - return new FileInfo( $"x:/{path}" ).FullName.Substring( 3 ); + // TODO: DUMB HACK ALERT + + return SteamNative.Platform.IsWindows + ? new FileInfo( $"x:/{path}" ).FullName.Substring( 3 ) + : new FileInfo( $"/x/{path}" ).FullName.Substring( 3 ); } internal Client client;

      0vAI9TanO)5Ck}*H(0zV`ZRSYE{yaLf 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