using UnityEngine;
namespace Cyber.Networking {
    /// 
    /// An abstract syncer, used by  and .
    /// 
    public abstract class Syncer : MonoBehaviour {
        private int TickCounter = 0;
        private readonly float TickInterval;
        private float TimeSinceLastTick = 0;
        private int SyncPacketID = 0;
        /// 
        /// Initializes the syncer, basically just sets the .
        /// 
        /// 
        public Syncer(float tickInterval) {
            TickInterval = tickInterval;
            TimeSinceLastTick = tickInterval;
        }
        /// 
        /// Returns the next ID for a sync packet.
        /// 
        /// 
        public int NextSyncID() {
            return SyncPacketID++;
        }
        /// 
        /// Performs a tick on the syncer, called from .
        /// 
        /// The tick number, used to e.g. determine when to sync certain things.
        public abstract void PerformTick(int Tick);
        private void Update() {
            TimeSinceLastTick += Time.deltaTime;
            if (TimeSinceLastTick > TickInterval) {
                PerformTick(TickCounter);
                if (TickCounter < int.MaxValue) {
                    TickCounter++;
                } else {
                    TickCounter = 0;
                }
                TimeSinceLastTick -= TickInterval;
            }
        }
    }
}