diff --git a/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs b/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs index 7a7aec8..59026d2 100644 --- a/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs +++ b/ZoFo/GameCore/GameManagers/NetworkManager/ClientNetworkManager.cs @@ -19,7 +19,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager { public class ClientNetworkManager { - private int port = 0; + private int PlayerId; private IPEndPoint endPoint; private IPEndPoint sendingEP; private Socket socket; @@ -71,29 +71,32 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager JToken token = JToken.FromObject(jObj); JToken updateDatas = token["updateDatas"]; Datagramm Dgramm = new Datagramm(); + if (PlayerId == 0) + { + PlayerId = token["PlayerId"].ToObject(); + } Dgramm.isImportant = token["isImportant"].ToObject(); Dgramm.DatagrammId = token["DatagrammId"].ToObject(); - Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]); if (Dgramm.isImportant) { if (Dgramm.DatagrammId == currentServerDatagrammId + 1) { - ExecuteDatagramm(Dgramm); currentServerDatagrammId++; + Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]); + ExecuteDatagramm(Dgramm); CheckDatagramm(); } - else if (Dgramm.DatagrammId > currentServerDatagrammId + 1) + else if (Dgramm.DatagrammId > currentServerDatagrammId + 1 && + waitingDatagramm.Find(x => x.DatagrammId == Dgramm.DatagrammId) == null) { + Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]); waitingDatagramm.Add(Dgramm); } - else - { - Console.WriteLine("Апдейты " + Dgramm.DatagrammId + ", уже приходили, пропускаем"); - } SendAcknowledgement(Dgramm.DatagrammId); } else { + Dgramm.updateDatas = GetSentUpdates(token["updateDatas"]); ExecuteDatagramm(Dgramm); } @@ -162,7 +165,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager public void SendAcknowledgement(int DatagrammId) { - Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId }; + Datagramm Dgramm = new Datagramm() { DatagrammId = DatagrammId, PlayerId = PlayerId }; string data = System.Text.Json.JsonSerializer.Serialize(Dgramm); byte[] buffer = Encoding.UTF8.GetBytes(data); socket.SendTo(buffer, sendingEP); @@ -173,8 +176,9 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager Datagramm orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1); while (orderedDgramm != null) { - ExecuteDatagramm(orderedDgramm); currentServerDatagrammId++; + ExecuteDatagramm(orderedDgramm); + waitingDatagramm.Remove(orderedDgramm); orderedDgramm = waitingDatagramm.Find(x => x.DatagrammId == currentServerDatagrammId + 1); } } diff --git a/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs b/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs index 8035e6c..1d5d850 100644 --- a/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs +++ b/ZoFo/GameCore/GameManagers/NetworkManager/ServerNetworkManager.cs @@ -20,7 +20,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager public class ServerNetworkManager { private Socket socket; - private IPAddress ip = IPAddress.Parse("127.0.0.1"); + private IPAddress ip; private bool isMultiplayer; //Player Id to Player endPoint private List clientsEP; @@ -28,9 +28,8 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager private List commonUpdates; private List importantUpdates; private List sendedData; - private List arrivingDataId = new List(); + private List arrivingDataId; private int currentDatagrammId = 1; - private int nextPlayerId = 0; public delegate void OnDataSend(string data); public event OnDataSend GetDataSend; // event Thread serverThread; @@ -48,6 +47,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager commonUpdates = new List(); importantUpdates = new List(); sendedData = new List(); + arrivingDataId = new List(); GetDataSend += AnalyzeData; @@ -101,37 +101,37 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager #endregion if (arrivingDataId.Count != 0) { - List actualArrivingId = arrivingDataId; + List actualArrivingId = arrivingDataId; for (int i = 0; i < actualArrivingId.Count; i++) { - sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i])); + sendedData.Remove(sendedData.Find(x => x.DatagrammId == actualArrivingId[i].DatagrammId + && x.PlayerId == actualArrivingId[i].PlayerId)); } arrivingDataId.Clear(); } List dataToSend; - if (importantUpdates.Count != 0) + if (importantUpdates.Count != 0 || sendedData.Count != 0) { - Datagramm impDgramm = new Datagramm(); - impDgramm.DatagrammId = currentDatagrammId; - currentDatagrammId++; - dataToSend = new List(); for (int i = 0; i < 200 && i < importantUpdates.Count; i++) dataToSend.Add(importantUpdates[i]); - impDgramm.updateDatas = dataToSend; - impDgramm.isImportant = true; - sendedData.Add(impDgramm); - foreach (Datagramm Dgramm in sendedData) + for (int i = 0; i < clientsEP.Count; i++) { - - string impData = JsonSerializer.Serialize(Dgramm); - byte[] impBuffer = Encoding.UTF8.GetBytes(impData); - foreach (EndPoint sendingEP in clientsEP) + Datagramm impDgramm = new Datagramm(); + impDgramm.DatagrammId = currentDatagrammId; + impDgramm.updateDatas = dataToSend; + impDgramm.isImportant = true; + impDgramm.PlayerId = i + 1; + sendedData.Add(impDgramm); + foreach (Datagramm Dgramm in sendedData.Where(x => x.PlayerId == i+1)) { - socket.SendTo(impBuffer, sendingEP); + string impData = JsonSerializer.Serialize(Dgramm); + byte[] impBuffer = Encoding.UTF8.GetBytes(impData); + socket.SendTo(impBuffer, clientsEP[i]); } } + currentDatagrammId++; for (int i = 0; i < 200 && i < dataToSend.Count; i++) importantUpdates.RemoveAt(0); } @@ -213,7 +213,7 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager if (Dgramm.updateDatas == null) { //Обработка acknowledgement - arrivingDataId.Add(Dgramm.DatagrammId); + arrivingDataId.Add(Dgramm); } else { diff --git a/ZoFo/GameCore/GameManagers/NetworkManager/Updates/Datagramm.cs b/ZoFo/GameCore/GameManagers/NetworkManager/Updates/Datagramm.cs index 8d6317d..9129f34 100644 --- a/ZoFo/GameCore/GameManagers/NetworkManager/Updates/Datagramm.cs +++ b/ZoFo/GameCore/GameManagers/NetworkManager/Updates/Datagramm.cs @@ -11,5 +11,6 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates public int DatagrammId { get; set; } public bool isImportant { get; set; } public List updateDatas { get; set; } + public int PlayerId { get; set; } } }