Cyber/Assets/Scripts/Networking/Clientside/SyncHandler.cs

91 lines
2.9 KiB
C#
Raw Normal View History


using Cyber.Entities;
2017-05-14 00:59:30 +02:00
using Cyber.Entities.SyncBases;
using Cyber.Networking.Messages;
2017-05-14 00:59:30 +02:00
using System.Collections.Generic;
2017-05-16 23:25:29 +02:00
using UnityEngine;
using UnityEngine.Networking;
namespace Cyber.Networking.Clientside {
/// <summary>
/// A Short clientside class for handling sync packages.
/// It simply keeps track of sync-packages and will not apply them if they are too old.
/// </summary>
public class SyncHandler {
2017-05-16 23:25:29 +02:00
public static double LastTimestamp = NetworkHelper.GetTime();
private SyncDB SyncDB;
private int LatestSyncID = -1;
2017-05-16 23:25:29 +02:00
private int SmallestSyncID = -1;
private int LastSyncID = -1;
private int SyncPacketsTotal = -1;
2017-05-17 00:33:45 +02:00
private double LastPing = 0;
/// <summary>
/// Creates the SyncHandler with SyncDB.
/// </summary>
/// <param name="syncDB"></param>
public SyncHandler(SyncDB syncDB) {
SyncDB = syncDB;
}
/// <summary>
2017-05-11 21:00:52 +02:00
/// Handle a given Network message. Must be checked to be <see cref="PktType.Sync"/> first.
/// </summary>
/// <param name="message"></param>
public void HandleSyncPkt(NetworkMessage message) {
SyncPkt SyncPacket = new SyncPkt(SyncDB);
SyncPacket.Deserialize(message.reader);
if (LatestSyncID < SyncPacket.SyncPacketID) {
LatestSyncID = SyncPacket.SyncPacketID;
SyncPacket.ApplySync(message.reader);
2017-05-14 00:59:30 +02:00
int[] SyncBases = SyncPacket.ChecksummedSyncBases;
int[] Checksums = SyncPacket.Checksums;
if (SyncBases.Length > 0) {
List<int> FailedSyncBases = new List<int>();
for (int i = 0; i < SyncBases.Length; i++) {
SyncBase SyncBase = SyncDB.Get(SyncBases[i]);
if (SyncBase.GenerateChecksum() != Checksums[i]) {
FailedSyncBases.Add(SyncBase.ID);
}
}
if (FailedSyncBases.Count > 0) {
Client.Send(PktType.FailedChecksums, new IntListPkt(FailedSyncBases.ToArray()));
}
2017-05-16 23:25:29 +02:00
}
LastTimestamp = SyncPacket.Timestamp;
2017-05-17 00:33:45 +02:00
LastPing = NetworkHelper.GetTime() - LastTimestamp;
2017-05-16 23:25:29 +02:00
LastSyncID = SyncPacket.SyncPacketID;
if (SmallestSyncID == -1) {
SmallestSyncID = SyncPacket.SyncPacketID;
2017-05-14 00:59:30 +02:00
}
2017-05-16 23:25:29 +02:00
SyncPacketsTotal++;
}
// Otherwise disregard the sync.
}
2017-05-17 00:33:45 +02:00
public double GetPing() {
return LastPing * 1000.0;
2017-05-16 23:25:29 +02:00
}
public float GetPacketLoss() {
return 1f - (SyncPacketsTotal * 1f / (LastSyncID - SmallestSyncID));
}
public int GetSyncPacketsReceived() {
return SyncPacketsTotal;
}
}
}