using Cyber.Entities; using Cyber.Networking.Messages; using System; using System.Collections.Generic; namespace Cyber.Networking.Serverside { /// /// Keeps stuff in-sync over at clients. Periodically collects stuff that needs to be synced and then sends them on the next 'tick.' /// public class ServerSyncer : Syncer { private SyncDB Database; private List QueuedSyncs = new List(); private List DirtySyncBases = new List(); /// /// Creates a Server syncer, constructor only defined because of inheritance of . /// public ServerSyncer() : base(1f / 10) {} /// /// Mark a SyncBase "Dirty", which makes it eligible to sync. /// /// The ID of the SyncBase. See public void DirtSyncBase(int syncBaseID) { if (DirtySyncBases.Contains(syncBaseID)) { return; } DirtySyncBases.Add(syncBaseID); } /// /// Performs a server sync tick. /// /// The number of the tick, which can be used to determine a few things, like when to sync certain things. public override void PerformTick(int Tick) { var Categorized = Database.GetCategorizedDatabase(); List checksummedIds = new List(); List checksums = new List(); 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()); Server.SendToAllByChannel(PktType.Sync, SyncPacket, NetworkChannelID.Unreliable); QueuedSyncs.Clear(); } } /// /// Queue a SyncBase directly, so it will be synced next time a sync tick is called. /// /// The ID of the SyncBase. See public void QueueSyncBase(int SyncBaseID) { QueuedSyncs.Add(SyncBaseID); } private void Start() { Database = GetComponent(); } } }