private void AddOffsetData()
        {
            _initialStates.Clear();

#if SEARCH_INGAMESTATE //TODO: Push to ckeckbox
            if (!SearchInGameState(out var debugRectValueAddress))
            {
                MessageBox.Show("Can't find debug rectangle state in poe (searching InGameState automatically)");
                return;
            }

            //Use debugRectValueAddress in CheatEngine and check who writes to that address and save the offset
            //https://dl.dropboxusercontent.com/s/2h2f9l8wyna10k1/cheatengine-x86_64_2019-06-26_18-44-38.png
            var inGameStateAddr = debugRectValueAddress - 0x568;
#else
            var inGameStateAddr = 0xA8F9242A0;
#endif

            var inGameState = new StructureOffset("InGameState", null, maxStructSize: 0x1000, baseAddress: inGameStateAddr);
            _initialStates.Add(inGameState);

            inGameState.AddStringSearch("State Name", "InGameState");
            inGameState.AddIntSearch("Camera.Width", 2048);
            inGameState.AddIntSearch("Camera.Height", 1099);

            #region UiRoot

            //Check/search child array to have 2 child
            var uiChildAmount = new PointersSearchStrategy(new ArrayLengthDoublePointerCompare(new DefaultValueCompare <int>(compareValue: 2)),
                                                           checkVmt: false);

            //...have a pointer to itself
            var uiSelfReferencingPointer = new PointersSearchStrategy(new SelfReferencingStructPointerValueCompare(), checkVmt: true);

            //...search for Width/Height of UiRoot
            var uiRootWidthValueCompare  = new FloatValueCompare(compareValue: 2560, tolerance: 1);
            var uiRootHeightValueCompare = new FloatValueCompare(compareValue: 1600, tolerance: 1);
            var uiWidthHeightReading     = new MultipleFloatValueReader(uiRootWidthValueCompare, uiRootHeightValueCompare);
            var uiWidthHeightSearch      = new ValueReaderStrategy(uiWidthHeightReading, alignment: 4);

            //...create multi value offset search strategy with this strategies.
            //Strategies should goes in order to expected offset order. If no- change the settings of DefaultMultiValueOffsetsFilter
            var uiMultiValueSearch = new MultiValueStrategy(new DefaultMultiValueOffsetsFilter(), uiSelfReferencingPointer, uiChildAmount,
                                                            uiWidthHeightSearch);

            var uiRoot = new StructureOffset("Ui Root", new SubPointersSearchStrategy(uiMultiValueSearch, subStructSize: 0x300, checkVmt: true),
                                             maxStructSize: 0x300);

            uiRoot.Child.Add(new DataOffset("ChildPtr", uiChildAmount));

            inGameState.Child.Add(uiRoot);

            uiRoot.AddFloatSearch("UiElement.Width", 2560, 1);
            uiRoot.AddFloatSearch("UiElement.Height", 1600, 1);
            uiRoot.AddFloatSearch("UiElement.Scale", 0.686875f, 0.02f);

            #endregion

            #region IngameData

            var inGameData = IngameDataOffsets(inGameState);

            #region Player

            #region ServerData

            ServerDataOffsets(inGameState);

            #endregion

            PlayerOffsets(inGameData);

            #endregion

            //var names = Entity.ReadComponentsNames(0x0000007021B47130);

            #endregion

            Nodes.Clear();

            foreach (var structureOffset in _initialStates)
            {
                Nodes.Add(structureOffset);
            }
        }
        private void ServerDataOffsets(StructureOffset inGameState)
        {
            var serverDataAdapter = new PointersSearchStrategy(new StringValueReader(new DefaultValueCompare <string>(LEAGUE_NAME))).Adapter();

            var serverData = new StructureOffset("ServerData",
                                                 new SubPointersSearchStrategy(serverDataAdapter, subStructSize: 0x8000, checkVmt: true),
                                                 maxStructSize: 0x8000);

            inGameState.Child.Add(serverData);

            serverData.AddStringSearch("League Name", "Standard", true);

            //GUildName
            var serverDataGuildName =
                new PointersSearchStrategy(new StringValueReader(new DefaultValueCompare <string>("Stridemann's GUild"))).Adapter();

            var serverDataGuildSearch = new SubPointersSearchStrategy(serverDataGuildName, subStructSize: 0x8, checkVmt: false);

            serverData.Child.Add(new DataOffset("Guild Name", serverDataGuildSearch));

            //serverData.AddIntSearch("Azurite Amount", 0);
            //serverData.AddUShortSearch("Sulphite Amount", 0);

            var inventId   = new ValueReaderStrategy(new IntValueReader(new DefaultValueCompare <int>(1)), 4);
            var inventId2  = new ValueReaderStrategy(new IntValueReader(new DefaultValueCompare <int>(2)), 4);
            var inventRows = new ValueReaderStrategy(new IntValueReader(new DefaultValueCompare <int>(5)), 4);
            var inventCols = new ValueReaderStrategy(new IntValueReader(new DefaultValueCompare <int>(12)), 4);

            var inventoriesMultiValueSearch = new MultiValueStrategy(new DefaultMultiValueOffsetsFilter(),
                                                                     inventId,
                                                                     new SubPointersSearchStrategy(inventRows.Adapter(), 0x100, false),
                                                                     new SubPointersSearchStrategy(inventCols.Adapter(), 0x100, false),
                                                                     inventId2
                                                                     );

            var inventoryHolderSearch = new SubPointersSearchStrategy(inventoriesMultiValueSearch, 0x100, false);
            var playerInventories     = new StructureOffset("PlayerInventories (InventoryHolder)", inventoryHolderSearch, 0x10);

            serverData.Child.Add(playerInventories);

            playerInventories.AddIntSearch("InventoryHolder.InventType", 1);

            var serverInventoryColsRowsMultiValueSearch = new MultiValueStrategy(new DefaultMultiValueOffsetsFilter(), inventRows);
            var serverInventorySearch = new SubPointersSearchStrategy(serverInventoryColsRowsMultiValueSearch, 0x100, false);
            var serverInventory       = new StructureOffset("InventoryHolder.ServerInventory", serverInventorySearch, 0x100);

            playerInventories.Child.Add(serverInventory);

            serverInventory.AddIntSearch("Rows", 5);
            serverInventory.AddIntSearch("Cols", 12);

            var reader = new MultipleIntValueReader(
                new DefaultValueCompare <int>(0),    //posX
                new DefaultValueCompare <int>(0),    //posY
                new DefaultValueCompare <int>(1),    //sizeX
                new DefaultValueCompare <int>(1))    //sizeY
            ;

            var inventSlotItemSearch = new ValueReaderStrategy(reader, 4).SubStructSearch(0x38, false);
            var readItemsList        = inventSlotItemSearch.SubStructSearch(0x38, false);
            var itemsList            = new StructureOffset("ItemsList", readItemsList, 0x8);

            serverInventory.Child.Add(itemsList);

            var inventSlotItem = new StructureOffset("InventSlotItem", inventSlotItemSearch, 0x8);

            itemsList.Child.Add(inventSlotItem);
        }