diff --git a/Server/Client.cs b/Server/Client.cs index 1a00c74..787e8eb 100644 --- a/Server/Client.cs +++ b/Server/Client.cs @@ -27,7 +27,7 @@ namespace CoopServer private long CallbacksCount = 0; internal readonly Dictionary> Callbacks = new(); internal bool FilesReceived = false; - public bool FilesSent = false; + internal bool FilesSent = false; #region CUSTOMDATA FUNCTIONS public void SetData(string name, T data) diff --git a/Server/DownloadManager.cs b/Server/DownloadManager.cs index e93ef5f..bd814e2 100644 --- a/Server/DownloadManager.cs +++ b/Server/DownloadManager.cs @@ -8,7 +8,8 @@ namespace CoopServer { internal static class DownloadManager { - private static readonly List _clients = new(); + public static readonly List ClientsToDelete = new(); + private static List _clients = new(); private static readonly List _files = new(); public static bool AnyFileExists = false; @@ -79,14 +80,30 @@ namespace CoopServer public static void Tick() { + lock (ClientsToDelete) + { + foreach (long nethandle in ClientsToDelete) + { + DownloadClient client = _clients.FirstOrDefault(x => x.NetHandle == nethandle); + if (client != null) + { + _clients.Remove(client); + } + } + ClientsToDelete.Clear(); + } + _clients.ForEach(client => { if (!client.SendFiles()) { - Client x = Server.Clients.FirstOrDefault(x => x.NetHandle == client.NetHandle); - if (x != null) + lock (Server.Clients) { - x.FilesReceived = true; + Client x = Server.Clients.FirstOrDefault(x => x.NetHandle == client.NetHandle); + if (x != null) + { + x.FilesReceived = true; + } } } }); @@ -136,23 +153,29 @@ namespace CoopServer _files = files; NetConnection conn = Server.MainNetServer.Connections.FirstOrDefault(x => x.RemoteUniqueIdentifier == NetHandle); - if (conn != null) + if (conn == null) { - _files.ForEach(file => + lock (DownloadManager.ClientsToDelete) { - NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage(); - - new Packets.FileTransferRequest() - { - ID = file.FileID, - FileType = (byte)Packets.DataFileType.Script, - FileName = file.FileName, - FileLength = file.FileLength - }.PacketToNetOutGoingMessage(outgoingMessage); - - Server.MainNetServer.SendMessage(outgoingMessage, conn, NetDeliveryMethod.ReliableOrdered, (byte)ConnectionChannel.File); - }); + DownloadManager.ClientsToDelete.Add(NetHandle); + } + return; } + + _files.ForEach(file => + { + NetOutgoingMessage outgoingMessage = Server.MainNetServer.CreateMessage(); + + new Packets.FileTransferRequest() + { + ID = file.FileID, + FileType = (byte)Packets.DataFileType.Script, + FileName = file.FileName, + FileLength = file.FileLength + }.PacketToNetOutGoingMessage(outgoingMessage); + + Server.MainNetServer.SendMessage(outgoingMessage, conn, NetDeliveryMethod.ReliableOrdered, (byte)ConnectionChannel.File); + }); } /// @@ -186,6 +209,10 @@ namespace CoopServer NetConnection conn = Server.MainNetServer.Connections.FirstOrDefault(x => x.RemoteUniqueIdentifier == nethandle); if (conn == null) { + lock (DownloadManager.ClientsToDelete) + { + DownloadManager.ClientsToDelete.Add(NetHandle); + } return; } diff --git a/Server/Server.cs b/Server/Server.cs index 8c62a59..8492be5 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -271,7 +271,10 @@ namespace CoopServer { long nethandle = message.SenderConnection.RemoteUniqueIdentifier; - DownloadManager.RemoveClient(nethandle); + lock (DownloadManager.ClientsToDelete) + { + DownloadManager.ClientsToDelete.Add(nethandle); + } SendPlayerDisconnectPacket(nethandle); } @@ -736,20 +739,20 @@ namespace CoopServer } // Send all players a message that someone has left the server - private static void SendPlayerDisconnectPacket(long clientID) + private static void SendPlayerDisconnectPacket(long nethandle) { - List clients = MainNetServer.Connections; + List clients = MainNetServer.Connections.FindAll(x => x.RemoteUniqueIdentifier != nethandle); if (clients.Count > 0) { NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); new Packets.PlayerDisconnect() { - NetHandle = clientID + NetHandle = nethandle }.PacketToNetOutGoingMessage(outgoingMessage); MainNetServer.SendMessage(outgoingMessage, clients, NetDeliveryMethod.ReliableOrdered, 0); } - Client localClient = Clients.Find(x => x.NetHandle == clientID); + Client localClient = Clients.FirstOrDefault(x => x.NetHandle == nethandle); if (localClient == null) { return;