RDP-Packing fix

This commit is contained in:
AnloGames 2024-08-20 03:17:52 +03:00
parent 5f902bed7a
commit 93125d97cd
3 changed files with 35 additions and 30 deletions

View file

@ -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<int>();
}
Dgramm.isImportant = token["isImportant"].ToObject<bool>();
Dgramm.DatagrammId = token["DatagrammId"].ToObject<int>();
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);
}
}

View file

@ -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<IPEndPoint> clientsEP;
@ -28,9 +28,8 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
private List<UpdateData> commonUpdates;
private List<UpdateData> importantUpdates;
private List<Datagramm> sendedData;
private List<int> arrivingDataId = new List<int>();
private List<Datagramm> 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<UpdateData>();
importantUpdates = new List<UpdateData>();
sendedData = new List<Datagramm>();
arrivingDataId = new List<Datagramm>();
GetDataSend += AnalyzeData;
@ -101,37 +101,37 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager
#endregion
if (arrivingDataId.Count != 0)
{
List<int> actualArrivingId = arrivingDataId;
List<Datagramm> 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<UpdateData> dataToSend;
if (importantUpdates.Count != 0)
if (importantUpdates.Count != 0 || sendedData.Count != 0)
{
Datagramm impDgramm = new Datagramm();
impDgramm.DatagrammId = currentDatagrammId;
currentDatagrammId++;
dataToSend = new List<UpdateData>();
for (int i = 0; i < 200 && i < importantUpdates.Count; i++)
dataToSend.Add(importantUpdates[i]);
for (int i = 0; i < clientsEP.Count; i++)
{
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)
foreach (Datagramm Dgramm in sendedData.Where(x => x.PlayerId == i+1))
{
string impData = JsonSerializer.Serialize(Dgramm);
byte[] impBuffer = Encoding.UTF8.GetBytes(impData);
foreach (EndPoint sendingEP in clientsEP)
{
socket.SendTo(impBuffer, sendingEP);
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
{

View file

@ -11,5 +11,6 @@ namespace ZoFo.GameCore.GameManagers.NetworkManager.Updates
public int DatagrammId { get; set; }
public bool isImportant { get; set; }
public List<UpdateData> updateDatas { get; set; }
public int PlayerId { get; set; }
}
}