/// <summary>
        /// Reads from a DarkRift reader and updates the given instance (which has to implement ISync) and as tag it uses the parameter tag
        /// </summary>
        /// <param name="sync"></param>
        /// <param name="reader"></param>
        /// <param name="tag"></param>
        public static void ReadSerializableSmart(this ISync sync, DarkRiftReader reader, int tag)
        {
            ExtraSyncData _extraSyncData = (ExtraSyncData)reader.ReadByte();
            int           _typeID;
            int           _tag;

            switch (_extraSyncData)
            {
            case ExtraSyncData.Nothing:
                sync.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.TypeID:
                _typeID = reader.ReadInt32();
                sync.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.Tag:
                _tag = reader.ReadInt32();
                sync.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.TypeIDANDTag:
                _typeID = reader.ReadInt32();
                _tag    = reader.ReadInt32();
                sync.DeserializeOptional(reader, tag);
                break;
            }
        }
        /// <summary>
        /// Reads from a DarkRift reader and creates a new instance of the type written in the buffer (which has to implement ISync) and as tag it uses the parameter tag
        /// </summary>
        /// <param name="reader">The DarkRift reader to read from</param>
        /// <param name="tag">The tag to use in DeserializeOptional</param>
        /// <returns></returns>
        public static ISync ReadSerializableSmart(this DarkRiftReader reader, int tag)
        {
            ExtraSyncData _extraSyncData = (ExtraSyncData)reader.ReadByte();
            ISync         _syncObject    = default;
            int           _typeID;
            int           _tag;

            switch (_extraSyncData)
            {
            case ExtraSyncData.Nothing:
                Console.WriteLine("No TypeID provided!");
                break;

            case ExtraSyncData.TypeID:
                _typeID     = reader.ReadInt32();
                _syncObject = (ISync)Activator.CreateInstance(MLAPI.SyncTypes[_typeID]);
                _syncObject.DeserializeOptional(reader, tag);
                break;

            case ExtraSyncData.Tag:
                Console.WriteLine("No TypeID provided!");
                break;

            case ExtraSyncData.TypeIDANDTag:
                _typeID     = reader.ReadInt32();
                _tag        = reader.ReadInt32();
                _syncObject = (ISync)Activator.CreateInstance(MLAPI.SyncTypes[_typeID]);
                _syncObject.DeserializeOptional(reader, tag);
                break;
            }

            return(_syncObject);
        }