diff --git a/CopperMatchmaking/CopperMatchmaking.csproj b/CopperMatchmaking/CopperMatchmaking.csproj index 4a4c455..236cbbc 100644 --- a/CopperMatchmaking/CopperMatchmaking.csproj +++ b/CopperMatchmaking/CopperMatchmaking.csproj @@ -2,7 +2,7 @@ CopperMatchmaking - 1.4.2 + 1.4.3 copperdev netstandard2.1 enable @@ -12,7 +12,7 @@ https://github.com/copperdevs/CopperMatchmaking game;networking;game development;matchmaking; nuget-readme.md - 1.4.2 + 1.4.3 CopperMatchmaking Simple matchmaking server for creating two even player count teams for use in peer to peer MIT diff --git a/CopperMatchmaking/Server/MatchmakerServer.cs b/CopperMatchmaking/Server/MatchmakerServer.cs index 70181be..df97f94 100644 --- a/CopperMatchmaking/Server/MatchmakerServer.cs +++ b/CopperMatchmaking/Server/MatchmakerServer.cs @@ -23,6 +23,7 @@ public partial class MatchmakerServer internal readonly ServerQueueManager QueueManager = null!; internal readonly ServerLobbyManager LobbyManager = null!; internal readonly ServerHandler Handler; + private readonly ServerClientCounter clientCounter; internal readonly ServerMessageHandlers MessageHandlers; @@ -76,6 +77,9 @@ public MatchmakerServer(ServerHandler handler, byte lobbySize = 10, ushort maxCl Server.ClientDisconnected += QueueManager.ClientDisconnected; Server.ClientDisconnected += LobbyManager.ClientDisconnected; Server.MessageReceived += MessageHandlers.ServerReceivedMessageHandler; + + // created last so everything else is setup + clientCounter = new ServerClientCounter(this); } ~MatchmakerServer() @@ -101,6 +105,7 @@ public void Update() // components and crap ig UpdateComponents(); + clientCounter.PlayerCountUpdateCheck(); // networking! Server.Update(); diff --git a/CopperMatchmaking/Server/ServerClientCounter.cs b/CopperMatchmaking/Server/ServerClientCounter.cs new file mode 100644 index 0000000..a2507c2 --- /dev/null +++ b/CopperMatchmaking/Server/ServerClientCounter.cs @@ -0,0 +1,50 @@ +using System.Linq; +using CopperMatchmaking.Info; +using Riptide; + +namespace CopperMatchmaking.Server +{ + internal class ServerClientCounter + { + private readonly MatchmakerServer server; + private ServerLobbyManager LobbyManager => server.LobbyManager; + private ServerQueueManager QueueManager => server.QueueManager; + private ServerHandler Handler => server.Handler; + + private int currentLobbyPlayerCount; + private int currentQueuePlayerCount; + + public ServerClientCounter(MatchmakerServer server) + { + this.server = server; + + server.Server.ClientConnected += ClientConnected; + server.Server.ClientDisconnected += ClientDisconnected; + } + + ~ServerClientCounter() + { + server.Server.ClientConnected -= ClientConnected; + server.Server.ClientDisconnected -= ClientDisconnected; + } + + private void ClientConnected(object sender, ServerConnectedEventArgs serverConnectedEventArgs) => PlayerCountUpdateCheck(); + + private void ClientDisconnected(object sender, ServerDisconnectedEventArgs serverDisconnectedEventArgs) => PlayerCountUpdateCheck(); + + internal void PlayerCountUpdateCheck() + { + var lobbyPlayerCount = LobbyManager.Lobbies.Values.Sum(lobby => lobby.Count()); + var queuePlayerCount = QueueManager.RankQueues.Values.Sum(queues => queues.Count); + + if (lobbyPlayerCount == currentLobbyPlayerCount && currentQueuePlayerCount == queuePlayerCount) + return; + + currentLobbyPlayerCount = lobbyPlayerCount; + currentQueuePlayerCount = queuePlayerCount; + + Handler.PlayerQueueCountUpdated(currentLobbyPlayerCount, currentQueuePlayerCount); + Log.Info($"Current player count has been updated | Lobby player count: {currentLobbyPlayerCount} | Queue player count: {currentQueuePlayerCount}"); + } + } +} \ No newline at end of file diff --git a/CopperMatchmaking/Server/ServerHandler.cs b/CopperMatchmaking/Server/ServerHandler.cs index bc44660..ecdbe87 100644 --- a/CopperMatchmaking/Server/ServerHandler.cs +++ b/CopperMatchmaking/Server/ServerHandler.cs @@ -46,5 +46,14 @@ public virtual void LobbyJoinCodeReceived(CreatedLobby lobby, string lobbyJoinCo { } + + /// + /// Ran when the number of players in queue is updated + /// + /// Current count of players in a lobby waiting for a host to send a join code + /// Current count of players in queue waiting for a lobby + public virtual void PlayerQueueCountUpdated(int lobbyPlayerCount, int queuePlayerCount) + { + } } } \ No newline at end of file diff --git a/unity/Server/MatchmakerServer.cs b/unity/Server/MatchmakerServer.cs index 70181be..6fed187 100644 --- a/unity/Server/MatchmakerServer.cs +++ b/unity/Server/MatchmakerServer.cs @@ -23,6 +23,7 @@ public partial class MatchmakerServer internal readonly ServerQueueManager QueueManager = null!; internal readonly ServerLobbyManager LobbyManager = null!; internal readonly ServerHandler Handler; + private readonly ServerClientCounter clientCounter; internal readonly ServerMessageHandlers MessageHandlers; @@ -76,6 +77,9 @@ public MatchmakerServer(ServerHandler handler, byte lobbySize = 10, ushort maxCl Server.ClientDisconnected += QueueManager.ClientDisconnected; Server.ClientDisconnected += LobbyManager.ClientDisconnected; Server.MessageReceived += MessageHandlers.ServerReceivedMessageHandler; + + // created last so everything else is setup + clientCounter = new ServerClientCounter(this); } ~MatchmakerServer() diff --git a/unity/Server/ServerClientCounter.cs b/unity/Server/ServerClientCounter.cs new file mode 100644 index 0000000..a2507c2 --- /dev/null +++ b/unity/Server/ServerClientCounter.cs @@ -0,0 +1,50 @@ +using System.Linq; +using CopperMatchmaking.Info; +using Riptide; + +namespace CopperMatchmaking.Server +{ + internal class ServerClientCounter + { + private readonly MatchmakerServer server; + private ServerLobbyManager LobbyManager => server.LobbyManager; + private ServerQueueManager QueueManager => server.QueueManager; + private ServerHandler Handler => server.Handler; + + private int currentLobbyPlayerCount; + private int currentQueuePlayerCount; + + public ServerClientCounter(MatchmakerServer server) + { + this.server = server; + + server.Server.ClientConnected += ClientConnected; + server.Server.ClientDisconnected += ClientDisconnected; + } + + ~ServerClientCounter() + { + server.Server.ClientConnected -= ClientConnected; + server.Server.ClientDisconnected -= ClientDisconnected; + } + + private void ClientConnected(object sender, ServerConnectedEventArgs serverConnectedEventArgs) => PlayerCountUpdateCheck(); + + private void ClientDisconnected(object sender, ServerDisconnectedEventArgs serverDisconnectedEventArgs) => PlayerCountUpdateCheck(); + + internal void PlayerCountUpdateCheck() + { + var lobbyPlayerCount = LobbyManager.Lobbies.Values.Sum(lobby => lobby.Count()); + var queuePlayerCount = QueueManager.RankQueues.Values.Sum(queues => queues.Count); + + if (lobbyPlayerCount == currentLobbyPlayerCount && currentQueuePlayerCount == queuePlayerCount) + return; + + currentLobbyPlayerCount = lobbyPlayerCount; + currentQueuePlayerCount = queuePlayerCount; + + Handler.PlayerQueueCountUpdated(currentLobbyPlayerCount, currentQueuePlayerCount); + Log.Info($"Current player count has been updated | Lobby player count: {currentLobbyPlayerCount} | Queue player count: {currentQueuePlayerCount}"); + } + } +} \ No newline at end of file diff --git a/unity/Server/ServerClientCounter.cs.meta b/unity/Server/ServerClientCounter.cs.meta new file mode 100644 index 0000000..8e0fb31 --- /dev/null +++ b/unity/Server/ServerClientCounter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f20db65b21662e847a213429159c9c71 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/unity/Server/ServerHandler.cs b/unity/Server/ServerHandler.cs index 3261377..ecdbe87 100644 --- a/unity/Server/ServerHandler.cs +++ b/unity/Server/ServerHandler.cs @@ -36,5 +36,24 @@ public virtual int ChooseLobbyHost(List lobbyClients) { return 0; } + + /// + /// Function ran when a lobby join code is received + /// + /// Created lobby + /// Created lobby join code + public virtual void LobbyJoinCodeReceived(CreatedLobby lobby, string lobbyJoinCode) + { + + } + + /// + /// Ran when the number of players in queue is updated + /// + /// Current count of players in a lobby waiting for a host to send a join code + /// Current count of players in queue waiting for a lobby + public virtual void PlayerQueueCountUpdated(int lobbyPlayerCount, int queuePlayerCount) + { + } } } \ No newline at end of file diff --git a/unity/Server/ServerLobbyManager.cs b/unity/Server/ServerLobbyManager.cs index 42b9efe..cf899f0 100644 --- a/unity/Server/ServerLobbyManager.cs +++ b/unity/Server/ServerLobbyManager.cs @@ -77,6 +77,7 @@ internal void HandleClientHostResponse(uint lobbyId, string hostedLobbyId) server.Server.DisconnectClient(client); } + server.Handler.LobbyJoinCodeReceived(Lobbies[lobbyId], hostedLobbyId); Lobbies.Remove(lobbyId); }