public void ProcessSentences()
        {
            Dictionary <uint, NetFriendlySentence> DictionaryStore = new Dictionary <uint, NetFriendlySentence>();

            if (Sentences.Length > 0)
            {
                //Logger.Log("YOOOOO");
                NetFriendlySentence TOPClientFriendlySentence = Sentences[0];
                DictionaryStore[Sentences[0].SentenceID] = TOPClientFriendlySentence;
                //Logger.LogError(JsonConvert.SerializeObject(Sentences));
                foreach (var bob in Sentences)
                {
                    bob.SetSentences(new List <NetFriendlySentence>());
                    DictionaryStore[bob.SentenceID] = bob;
                }
                foreach (var bob in Sentences)
                {
                    if (bob.SentenceID != 0)
                    {
                        if (DictionaryStore.ContainsKey(bob.HeldBySentenceID))
                        {
                            //Logger.LogError("added" + bob.ValueVariable);
                            DictionaryStore[bob.HeldBySentenceID].GetSentences().Add(bob);
                        }
                    }
                }
                NetFriendlySentence[] _bob = new NetFriendlySentence[1] {
                    TOPClientFriendlySentence
                };
                Sentences = _bob;
                //Logger.Log("TT > " + JsonConvert.SerializeObject(Sentences));
                //Logger.Log(JsonConvert.SerializeObject(Sentences[0].GetSentences()));
            }
        }
    //		public ulong ID;
    //public string ShelfName;
    //public bool IsEnabled;
    //public GameObject Shelf;

    ////public NetFriendlyBookShelf[] ObscuredBookShelves;
    //public string ObscuredBookShelves;
    ////public NetFriendlyBookShelf ObscuredBy;
    //public string ObscuredBy;
    //public NetFriendlyBook[] HeldBooks;

    public static NetFriendlyBook ProcessBook(Librarian.Book _book)
    {
        string Classe;

        Classe = _book.BookClass.GetType().Name;
        NetFriendlyBook Book = new NetFriendlyBook()
        {
            ID            = _book.ID,
            BookClassname = Classe,
            Title         = _book.Title,
            UnGenerated   = _book.UnGenerated
        };

        List <NetFriendlyPage> ListPages = new List <NetFriendlyPage>();

        foreach (var bob in _book.GetBindedPages())
        {
            List <NetFriendlySentence> Sentences = new List <NetFriendlySentence>();
            NetFriendlyPage            Page      = new NetFriendlyPage
            {
                ID           = bob.ID,
                Variable     = bob.Variable.ToString(),
                VariableName = bob.VariableName,
                VariableType = bob.VariableType.ToString()
            };
            if (Librarian.UEGetType(Page.VariableType) == null)
            {
                Page.VariableType = bob.VariableType.AssemblyQualifiedName;
            }
            if (bob.Sentences.Sentences != null && (bob.Sentences.Sentences.Count > 0))
            {
                NetFriendlySentence FriendlySentence = new NetFriendlySentence()
                {
                    HeldBySentenceID = bob.Sentences.SentenceID
                };
                FriendlySentence.OnPageID = 8888888;
                Sentences.Add(FriendlySentence);
                RecursiveSentencePopulate(bob.Sentences, Sentences);
            }
            Page.Sentences = Sentences.ToArray();
            ListPages.Add(Page);
        }
        Book.BindedPages = ListPages.ToArray();

        return(Book);
    }
    public static void RecursiveSentencePopulate(Librarian.Sentence LibrarianSentence, List <NetFriendlySentence> Sentences)
    {
        if (LibrarianSentence.Sentences != null)
        {
            foreach (var _Sentence in LibrarianSentence.Sentences)
            {
                NetFriendlySentence FriendlySentence = new NetFriendlySentence()
                {
                    PagePosition = _Sentence.PagePosition,
                    SentenceID   = _Sentence.SentenceID,

                    ValueVariable     = VVUIElementHandler.Serialise(_Sentence.ValueVariable, _Sentence.ValueVariableType),
                    ValueVariableType = _Sentence.ValueVariableType.ToString(),
                    OnPageID          = _Sentence.OnPageID,
                    HeldBySentenceID  = LibrarianSentence.SentenceID
                };
                if (Librarian.UEGetType(FriendlySentence.ValueVariableType) == null)
                {
                    FriendlySentence.ValueVariableType = _Sentence.ValueVariableType.AssemblyQualifiedName;
                }
                if (_Sentence.KeyVariable != null)
                {
                    FriendlySentence.KeyVariable =
                        VVUIElementHandler.Serialise(_Sentence.KeyVariable, _Sentence.KeyVariableType);
                    FriendlySentence.KeyVariableType = _Sentence.KeyVariableType.ToString();
                    if ((FriendlySentence.KeyVariableType == null) || (Librarian.UEGetType(FriendlySentence.KeyVariableType) == null))
                    {
                        FriendlySentence.KeyVariableType = _Sentence.KeyVariableType.AssemblyQualifiedName;
                    }
                }


                if (_Sentence.Sentences != null)
                {
                    RecursiveSentencePopulate(_Sentence, Sentences);
                }

                Sentences.Add(FriendlySentence);
            }
        }
    }
    public static NetFriendlyBook ProcessBook(Librarian.Book _book)
    {
        string Classe;

        Classe = _book.BookClass.GetType().Name;
        NetFriendlyBook Book = new NetFriendlyBook()
        {
            ID            = _book.ID,
            BookClassname = Classe,
            Title         = _book.Title,
            UnGenerated   = _book.UnGenerated
        };

        // get max possible packet size from current transform
        int maxPacketSize = Mirror.Transport.activeTransport.GetMaxPacketSize(0);
        // set currentSize start value to max TCP header size (60b)
        int currentSize = 60;

        List <NetFriendlyPage> ListPages = new List <NetFriendlyPage>();

        foreach (var bob in _book.GetBindedPages())
        {
            List <NetFriendlySentence> Sentences = new List <NetFriendlySentence>();
            NetFriendlyPage            Page      = new NetFriendlyPage
            {
                ID           = bob.ID,
                Variable     = VVUIElementHandler.Serialise(bob.Variable, bob.VariableType),
                VariableName = bob.VariableName,
                VariableType = bob.VariableType?.ToString(),
                VVHighlight  = bob.VVHighlight
            };
            if (bob.PInfo != null)
            {
                Page.CanWrite = bob.PCanWrite;
            }



            if (Librarian.UEGetType(Page.VariableType) == null)
            {
                Page.VariableType = bob?.VariableType?.AssemblyQualifiedName;
            }
            if (bob.Sentences.Sentences != null && (bob.Sentences.Sentences.Count > 0))
            {
                NetFriendlySentence FriendlySentence = new NetFriendlySentence()
                {
                    HeldBySentenceID = bob.Sentences.SentenceID
                };
                FriendlySentence.OnPageID = 8888888;
                Sentences.Add(FriendlySentence);
                RecursiveSentencePopulate(bob.Sentences, Sentences);
            }
            Page.Sentences = Sentences.ToArray();

            //currentSize += Page.GetSize(); //TODO work out why this causes errors


            // if currentSize is greater than the maxPacketSize - break loop and send message
            if (currentSize > maxPacketSize)
            {
                Logger.LogError("[VariableViewerNetworking.ProcessBook] - message is to big to send in one packet", Category.VariableViewer);
                break;
            }

            ListPages.Add(Page);
        }
        Book.BindedPages = ListPages.ToArray();

        return(Book);
    }