Exemple #1
0
        /// <summary>
        /// Applies the SyncPkt.
        /// </summary>
        /// <param name="reader"></param>
        public void ApplySync(NetworkReader reader)
        {
            byte[][] ByteArray = new byte[4][];
            ByteArray[0]    = reader.ReadBytesAndSize();
            ByteArray[1]    = reader.ReadBytesAndSize();
            ByteArray[2]    = reader.ReadBytesAndSize();
            ByteArray[3]    = reader.ReadBytesAndSize();
            SyncedSyncBases = NetworkHelper.DeserializeIntArray(ByteArray);

            foreach (int syncId in SyncedSyncBases)
            {
                SyncDB.Get(syncId).Deserialize(reader);
            }

            bool checksums = reader.ReadBoolean();

            if (checksums)
            {
                byte[][] SummedIdsByteArray = new byte[4][];
                SummedIdsByteArray[0] = reader.ReadBytesAndSize();
                SummedIdsByteArray[1] = reader.ReadBytesAndSize();
                SummedIdsByteArray[2] = reader.ReadBytesAndSize();
                SummedIdsByteArray[3] = reader.ReadBytesAndSize();

                byte[][] SumsByteArray = new byte[4][];
                SumsByteArray[0] = reader.ReadBytesAndSize();
                SumsByteArray[1] = reader.ReadBytesAndSize();
                SumsByteArray[2] = reader.ReadBytesAndSize();
                SumsByteArray[3] = reader.ReadBytesAndSize();

                ChecksummedSyncBases = NetworkHelper.DeserializeIntArray(SummedIdsByteArray);
                Checksums            = NetworkHelper.DeserializeIntArray(SumsByteArray);
            }
        }
Exemple #2
0
        /// <summary>
        /// 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);

                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()));
                    }
                }

                LastTimestamp = SyncPacket.Timestamp;

                LastPing = NetworkHelper.GetTime() - LastTimestamp;

                LastSyncID = SyncPacket.SyncPacketID;
                if (SmallestSyncID == -1)
                {
                    SmallestSyncID = SyncPacket.SyncPacketID;
                }
                SyncPacketsTotal++;
            }
            // Otherwise disregard the sync.
        }
Exemple #3
0
        /// <summary>
        /// Performs a server sync tick.
        /// </summary>
        /// <param name="Tick">The number of the tick, which can be used to determine a few things, like when to sync certain things.</param>
        public override void PerformTick(int Tick)
        {
            var        Categorized    = Database.GetCategorizedDatabase();
            List <int> checksummedIds = new List <int>();
            List <int> checksums      = new List <int>();

            foreach (Type type in Categorized.Keys)
            {
                SyncHandletype Handletype = Database.GetSyncHandletypes()[type];
                if (Tick % Handletype.TickInterval == 0)
                {
                    foreach (int SyncBaseID in Categorized[type])
                    {
                        bool Contains = DirtySyncBases.Contains(SyncBaseID);
                        if (Contains == Handletype.RequireHash || Contains)
                        {
                            QueueSyncBase(SyncBaseID);
                            if (Contains)
                            {
                                DirtySyncBases.Remove(SyncBaseID);
                            }
                        }
                        if (Handletype.RequireHash)
                        {
                            checksummedIds.Add(SyncBaseID);
                            checksums.Add(Database.Get(SyncBaseID).GenerateChecksum());
                        }
                    }
                }
            }

            if (QueuedSyncs.Count > 0)
            {
                int[]   SyncIDs    = QueuedSyncs.ToArray();
                SyncPkt SyncPacket = new SyncPkt(Database, SyncIDs, checksummedIds.ToArray(),
                                                 checksums.ToArray(), NextSyncID(), NetworkHelper.GetTime());
                Server.SendToAllByChannel(PktType.Sync, SyncPacket, NetworkChannelID.Unreliable);

                QueuedSyncs.Clear();
            }
        }