diff --git a/i18n/ru/docusaurus-plugin-content-pages/libraries/index.md b/docs/libraries/DungeonUtility/generations/ItemGeneration.md
similarity index 81%
rename from i18n/ru/docusaurus-plugin-content-pages/libraries/index.md
rename to docs/libraries/DungeonUtility/generations/ItemGeneration.md
index a06984cde..e4f110f1a 100644
--- a/i18n/ru/docusaurus-plugin-content-pages/libraries/index.md
+++ b/docs/libraries/DungeonUtility/generations/ItemGeneration.md
@@ -1,4 +1,6 @@
-# Библиотеки
+---
+hide_title: true
+---
```mdx-code-block
import NotImplemented from "@site/src/components/NotImplemented"
diff --git a/docs/libraries/DungeonUtility/generations/StructurePiece.md b/docs/libraries/DungeonUtility/generations/StructurePiece.md
new file mode 100644
index 000000000..e4f110f1a
--- /dev/null
+++ b/docs/libraries/DungeonUtility/generations/StructurePiece.md
@@ -0,0 +1,9 @@
+---
+hide_title: true
+---
+
+```mdx-code-block
+import NotImplemented from "@site/src/components/NotImplemented"
+
+
+```
diff --git a/src/pages/libraries/index.md b/docs/libraries/DungeonUtility/getting-started.md
similarity index 90%
rename from src/pages/libraries/index.md
rename to docs/libraries/DungeonUtility/getting-started.md
index 0aa1be748..3e3e895c3 100644
--- a/src/pages/libraries/index.md
+++ b/docs/libraries/DungeonUtility/getting-started.md
@@ -1,4 +1,4 @@
-# Libraries
+# Intro
```mdx-code-block
import NotImplemented from "@site/src/components/NotImplemented"
diff --git a/docs/libraries/DungeonUtility/loaders/StructureFormats.md b/docs/libraries/DungeonUtility/loaders/StructureFormats.md
new file mode 100644
index 000000000..e4f110f1a
--- /dev/null
+++ b/docs/libraries/DungeonUtility/loaders/StructureFormats.md
@@ -0,0 +1,9 @@
+---
+hide_title: true
+---
+
+```mdx-code-block
+import NotImplemented from "@site/src/components/NotImplemented"
+
+
+```
diff --git a/docs/libraries/DungeonUtility/loaders/StructureLoader.md b/docs/libraries/DungeonUtility/loaders/StructureLoader.md
new file mode 100644
index 000000000..e4f110f1a
--- /dev/null
+++ b/docs/libraries/DungeonUtility/loaders/StructureLoader.md
@@ -0,0 +1,9 @@
+---
+hide_title: true
+---
+
+```mdx-code-block
+import NotImplemented from "@site/src/components/NotImplemented"
+
+
+```
diff --git a/docs/libraries/readme.md b/docs/libraries/readme.md
new file mode 100644
index 000000000..f35fdb57d
--- /dev/null
+++ b/docs/libraries/readme.md
@@ -0,0 +1,34 @@
+---
+displayed_sidebar: librariesSidebar
+slug: /libraries
+---
+
+# Libraries
+
+
+
+```mdx-code-block
+import DocMap from "@site/src/components/DocMap"
+
+
+```
diff --git a/docusaurus.config.js b/docusaurus.config.js
index 387c44d11..83974356b 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -112,7 +112,7 @@ const config = /** @type {import('@docusaurus/types').Config} */ ({
},
{
position: 'left',
- to: 'libraries',
+ to: 'docs/libraries',
label: 'Libraries'
},
{
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current.json b/i18n/ru/docusaurus-plugin-content-docs/current.json
index a16dc3a22..b5700c517 100644
--- a/i18n/ru/docusaurus-plugin-content-docs/current.json
+++ b/i18n/ru/docusaurus-plugin-content-docs/current.json
@@ -62,5 +62,18 @@
"sidebar.tutorialSidebar.category.Publishing": {
"message": "Публикация",
"description": "The label for category Publishing in sidebar tutorialSidebar"
+ },
+
+ "sidebar.librariesSidebar.category.Upload Structure": {
+ "message": "Загрузка структур",
+ "description": "The label for category Upload Structure in sidebar librariesSidebar"
+ },
+ "sidebar.librariesSidebar.category.Structure Generation": {
+ "message": "Генерация структур",
+ "description": "The label for category Structure Generation in sidebar librariesSidebar"
+ },
+ "sidebar.librariesSidebar.category.Advanced": {
+ "message": "Продвинутые возможности",
+ "description": "The label for category Advanced in sidebar librariesSidebar"
}
}
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/generations/ItemGeneration.md b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/generations/ItemGeneration.md
new file mode 100644
index 000000000..3468d95e7
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/generations/ItemGeneration.md
@@ -0,0 +1,104 @@
+# Генерация предметов
+
+ItemGeneration - класс для создания генераторов предметов и взаимодействия с ними.
+Данный класс может работать только с ванильными контейнерами!
+
+:::info Какие проблемы решает генератор предметов?
+
+1. Известная раньше проблема, это пустые сундуки в структурах, DungeonUtility будет по умолчанию генерировать предметы до тех-пор пока не сгенерирует, что очень удобно.
+2. Интеграция между модами
+3. Просмотр игроком, что ему может выпасть в сундуке
+:::
+
+Разберем базовые методы данного класса, в отдельности разберем создание генератора, на данный момент содержится даже проблема, чтто и в StructureLoader!
+**Поэтому очень важно позаботиться об уникальности имени генератора!**
+
+## Генерация предметов
+
+```ts
+// Создаем генератор по имени example_name, для использования генератора всегда будет необходимо использовать его
+ItemGeneration.newGenerator("example_name");
+```
+
+Теперь разберем данный метод:
+
+```ts
+ItemGeneration.addItem("example_name", VanillaItemID.diamond, .1, {min: 1, max: 5});
+```
+
+Мы обращаемся к генератору по имени example_name и добавляем предмет с идентификатором VanillaItemID.diamond, шансом спавна .1 (это 10%), а последним параметром мы устанавливаем количество падающих предметов (от 1 до 5).
+:::tip
+Помните, что метод использует [**вероятность**](https://ru.wikipedia.org/wiki/Вероятность) спавна, коротко говоря это шанс спавнв деленный на 100(например 1/100 = 1%)
+:::
+
+Теперь разберем метод заполнения сундука:
+
+```ts
+ItemGeneration.fill("example_name", x, y, z, region);
+```
+
+Данный метод заполняет сундук на координатах x, y, z, [region](https://nernar.github.io/ru/docs/environment/modifying-region)
+
+## Интеграция с другими модами
+
+Для того, чтобы не добавлять свои предметы вручную в каждый мод на структуры был добавлен метод:
+
+```ts
+ItemGeneration.setItemIntegration(VanillaItemID.diamond_axe, .1, {min: 1, max: 1});
+```
+
+Тут мы добавляем предмет с идентификатором VanillaItemID.diamond_axe, шансом спавна .1 (это 10%) и следующим параметром мы устанавливаем количество падающих предметов (от 1 до 1).
+
+## Recipe Viewer
+
+Данный метод создаст интеграцию с Recipe Viewer за вас.
+
+```ts
+ItemGeneration.registerRecipeViewer("example_generator", "Title generator");
+```
+
+Данный метод позволит игроку просматрировать предметы в Recipe Viewer, которые он сможет получить с данжей.
+
+## Как заставить генерироваться лут в своей структуре?
+
+```ts
+examplePool.setGlobalPrototype("test_structure", Structure.getPrototypeDefault("example_generator"));
+```
+
+Мы обращаемся к экземпляру StructurePool и устанавливаем ему генерацию предметов `example_generator`.
+
+## Примеры
+
+```ts
+// Помните, что имя генератора должно быть уникально!!!
+ItemGeneration.newGenerator("example_generator");
+
+// Добавляем предметы
+ItemGeneration.addItem("example_generator", VanillaItemID.iron_ingot, .5, {min: 1, max: 3});
+ItemGeneration.addItem("example_generator", VanillaItemID.diamond, .1, {min: 1, max: 1});
+
+// Создаем событие нажатия палкой, теперь палка будет заполнять сундуки
+Item.registerUseFunction(VanillaItemID.stick, (coords, item, block, player) => {
+ // Заполняем сундук на координатах coords в измерении в котором находится игрок player
+ ItemGeneration.fill("example_generator", coords.x, coords.y, coords.z, BlockSource.getDefaultForActor(player));
+});
+
+// Добавляем предмет во все другие моды
+ItemGeneration.setItemIntegration(VanillaItemID.diamond_axe, .1, {min: 1, max: 1});
+
+// Создаем интеграцию с Recipe Viewer
+ItemGeneration.registerRecipeViewer("example_generator", "Title generator");
+
+
+// Создаем StructurePool, ОБРАТИТЕ ВНИМАНИЕ, что у каждого мода должно быть свое уникальное имя!
+let examplePool = new StructurePool("example_pool");
+
+// Устанавливаем путь к папке со структурами, в данном случае папка structures в главной директории мода
+examplePool.setPathStructures(__dir__+"structures");
+
+// Загружаем структуру 'test_structure.struct' из папки указаной выше, структура будет доступна по имени test_structure
+examplePool.upload("test_structure");
+
+// Устанавливаем генерацию предметов в структуре test_structure
+examplePool.setGlobalPrototype("test_structure", Structure.getPrototypeDefault("example_generator"));
+```
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/generations/StructurePiece.md b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/generations/StructurePiece.md
new file mode 100644
index 000000000..d4d2bb408
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/generations/StructurePiece.md
@@ -0,0 +1,108 @@
+# Генерация структуры
+
+DefaultGenerationDescription - класс обеспечит качественную генерацию, которая создается очень просто
+
+::info Какие проблемы решает генератор структур DungeonUtility?
+
+1. Частые появления структуры, раньше могло запсавнится несколько структур в одном месте, что выглидит очень не очень
+2. Половинчитые структуры, структуры могли половинчиться из разных причин, DungeonUtility также предлагает исправление данной проблемы
+:::
+
+## Генерация структур
+
+Начнем, пожалуй, сразу с примера:
+
+```ts
+let examplePool = new StructurePool("example_pool");
+
+// Устанавливаем путь к папке со структурами, в данном случае папка structures в главной директории мода
+examplePool.setPathStructures(__dir__+"structures");
+
+// Загружаем структуру 'test_structure.struct' из папки указаной выше, структура будет доступна по имени test_structure
+examplePool.upload("test_structure");
+
+// Добавляем событие StructureLoadOne, чтобы работать со структурой
+Callback.addCallback("StructureLoadOne", () => {
+ // Создаем DefaultGenerationDescription, даем ему структуру, которую будем генерировать с шансом 1 к 80 (примерно 1 структура на 80 чанков)
+ let example_generation = new DefaultGenerationDescription(examplePool.get("test_structure"), 80);
+
+ example_generation.setIdentifier("my_mod:test_structure");// Задаем уникальный индитификатор, для структуры
+ example_generation.setSurface(true, [VanillaBlockID.grass]);// Задаем блоки на которых будет спавниться структура
+ example_generation.setDistance(90, "my_mod_group");// Задаем минимальное расстояния между структурами my_mod_group
+
+ // Регистрируем генерацию структур, по выше описаным параметрам
+ example_generation.register();
+});
+```
+
+### Разберем код
+
+Для регистрации генерации структуры используется класс DefaultGenerationDescription
+Он принимает структуру, которая будет генерироваться и шанс
+
+:::info
+В шансе спана указывается делитель для получения [**вероятности**](https://ru.wikipedia.org/wiki/Вероятность) спавна структуры
+:::
+Дальше мы устанавливаем уникальный индитификатор мода, это требуется для исправления половинчитых структур
+:::info
+Если ваша структура генерируется очень часто, не рекомендуется это делать
+:::
+
+```ts
+example_generation.setIdentifier("my_mod:test_structure");
+```
+
+Затем мы установили поверхности на которых будет генерироваться структура, в где true - это переключатель между белым списком и черным, в примере белый список
+```ts
+example_generation.setSurface(true, [VanillaBlockID.grass]);
+```
+
+Дальше мы задали групу к которой принадлежит структура и минимальное растояние до ближайшей структуры данной группы(что-бы структуры не спавнились слишком часто)
+
+```ts
+example_generation.setDistance(90, "my_mod_group");
+```
+
+Ну и на последок мы зарегистрировали генерацию структуры
+
+```ts
+example_generation.register();
+```
+
+## Пример с генерацией предметов
+
+```ts
+// Помните, что имя генератора должно быть уникально!!!
+ItemGeneration.newGenerator("example_generator");
+
+// Добавляем предметы
+ItemGeneration.addItem("example_generator", VanillaItemID.iron_ingot, .5, {min: 1, max: 3});
+ItemGeneration.addItem("example_generator", VanillaItemID.diamond, .1, {min: 1, max: 1});
+
+// Создаем интеграцию с Recipe Viewer
+ItemGeneration.registerRecipeViewer("example_generator", "Title generator");
+
+
+// Создаем StructurePool, ОБРАТИТЕ ВНИМАНИЕ, что у каждого мода должно быть свое уникальное имя StructurePool!
+let examplePool = new StructurePool("example_pool");
+// Устанавливаем путь к папке со структурами, в данном случае папка structures в главной директории мода
+examplePool.setPathStructures(__dir__+"structures");
+// Загружаем структуру 'test_structure.struct' из папки указаной выше, структура будет доступна по имени test_structure
+examplePool.upload("test_structure");
+
+// Устанавливаем генерацию предметов в структуре test_structure
+examplePool.setGlobalPrototype("test_structure", Structure.getPrototypeDefault("example_generator"));
+
+// Добавляем событие StructureLoadOne, чтобы работать со структурой
+Callback.addCallback("StructureLoadOne", () => {
+ // Создаем DefaultGenerationDescription, даем ему структуру которую будем генерировать, с шансом 1 к 80(примерно 1 структура на 80 чанков)
+ let example_generation = new DefaultGenerationDescription(examplePool.get("test_structure"), 80);
+
+ example_generation.setIdentifier("my_mod:test_structure");// Задаем уникальный индитификатор, для структуры
+ example_generation.setSurface(true, [VanillaBlockID.grass]);// Задаем блоки на которых будет спавниться структура
+ example_generation.setDistance(90, "my_mod_group");// Задаем минимальное расстояния между структурами my_mod_group
+
+ // Регистрируем генерацию структур, по раннее описанным параметрам
+ example_generation.register();
+});
+```
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/getting-started.md b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/getting-started.md
new file mode 100644
index 000000000..924ce294b
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/getting-started.md
@@ -0,0 +1,90 @@
+# Начало
+
+Dungeon Utility — это мод-библиотека, для создания структур и работы со структурами.
+Библиотека позволяет создавать структуры и устанавливать их в мире с лучшей производительностью, чем аналоги в виде Structures и предшественников мода.
+
+[Декларации TypeScript](https://github.com/Reider745/Dungeon-Utility/tree/main/declarations) — требуются для подсказок в различных средах
+
+Данная документация содержит только основные методы, без дополнительных усложнений, для простоты понимания, документация расчитана на тех кто уже [JavaScript](https://learn.javascript.ru/)
+
+[Старая документация DungeonUtility](https://github.com/Reider745/libs/blob/main/mod_documentation_api/DungeonUtility.md)
+
+:::info Какие возможности включает данная мод-библиотека?**
+
++ Загрузка структур от всех существующих на inner core библиотек
++ Полный контроль над установкой структуры
++ Возможность создавать лут в сундуки
++ Создание качественной генерации структур
+:::
+
+## Преимущества и недостатки DungeonUtility
+
+### Плюсы
+
++ **Проработанное API**: Удобный интерфейс для разработчиков.
++ **Хорошая производительность**: Эффективная работа даже при больших нагрузках.
++ **Поддержка серверного ядра**: Совместимость с [ZoteCoreLoader](https://github.com/Reider745/ZoteCoreLoader).
++ **Разнообразие форматов структур**: Гибкость в использовании различных структур данных.
++ **Открытый исходный код**: Доступный для изучения и модификации [репозиторий](https://github.com/Reider745/Dungeon-Utility).
++ **Поддержка BlockState, extra, CompoundTag**: Широкий функционал для работы с данными.
+
+### Минусы
+
++ **Поддержка только inner core 1.16**: Ограниченная совместимость с другими версиями.
++ **Необходимость делать зависимость от мода**: Дополнительные требования для интеграции.
+
+## Сохранение структур
+
+Сохранение структур происходит в несколько этапов:
+
+1. Вызовите команду `/du` (включает возможность использовать ванильный деревянный топор для выбора точек)
+2. Выберите две крайние точки структуры
+3. Выберите центр структуры, нажав на нужный блок с шифтом (желательно)
+4. Вызовите команду `/struct`
+
+### Команда struct
+
+Сохраняет структуру в файл (в папку output, которая находится в папке мода).
+
+```
+/struct save name:string saveAir:bool specialSeparator:bool type:string compression:bool
+```
+
++ Параметры команды:
+ + name - имя структуры, без пробелов!
+ + saveAir - сохранять ли вместе со структурой блоки воздуха, true или false (указывать необязательно, по умолчанию false).
+ + specialSeparator - красивое оформление JSON, true или false (указывать не обязательно, по умолчанию false).
+ + type - тип формата, в который будет сохранена структура (указывать не обязательно, по умолчанию DungeonUtility).
+ + compression - сжимать ли структуру с помощью алгоритма Хаффмана, true или false (указывать не обязательно, по умолчанию false).
+
+Отображает список загруженных структур:
+
+```
+/struct list
+```
+
+Устанавливает структуру на место, где стоит игрок:
+
+```
+/struct set name:string pool:string
+```
+
++ Параметры команды:
+ + name - имя структуры, без пробелов!
+ + pool - в котором находится структура, без пробелов!
+
+Переводит струтктуру формата DungeonUtility_V2 в текстовый формат (чтобы можно было разобрать содержимое структуры ), берет структуру из папки output.
+
+```
+/struct du2 name:string
+```
+
+# Моды которые используют DungeonUtility
+
++ [Desolation](https://icmods.mineprogramming.org/mod?id=784)
++ [Schematic](https://icmods.mineprogramming.org/mod?id=786)
++ [AppliedEnergistics 2](https://icmods.mineprogramming.org/mod?id=906)
++ [Example Structure](https://icmods.mineprogramming.org/mod?id=992)
++ [Galacticraft 4 PE](https://icmods.mineprogramming.org/mod?id=8556)
++ [Ancient wonders](https://icmods.mineprogramming.org/mod?id=682)
++ [Aether 2 BE](https://icmods.mineprogramming.org/mod?id=195)
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/loaders/StructureFormats.md b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/loaders/StructureFormats.md
new file mode 100644
index 000000000..4ed2236a6
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/loaders/StructureFormats.md
@@ -0,0 +1,114 @@
+# Форматы структур
+
+Формат структуры — это способ хранения и загрузки структуры из файла или любого другого источника.
+
+| Формат | Поддержка BlockState | Поддержка дополнительного блока | Поддержка CompountNBT | Актуаленный формат? |
+|-------------------|----------------------|---------------------------------|-----------------------|---------------------|
+| DungeonUtility_V2 | + | + | + | + |
+| DungeonUtility | + | + | + | + |
+| DungeonCore | + | + | - | - |
+| Structures | - | - | - | + |
+| DungeonUtility | - | - | - | - |
+| DungeonAPI | - | - | - | - |
+| DungeonAPI_V2 | - | - | - | - |
+
+## Зачем существуют различные форматы структур?
+
+Dungeon Utility изначально писался как часть модификации Ancient Wonders/Dungeon craft.
+В случае Ancient wonders, данный мод использовал несколько различных библиотек для структур, что было неприемлемо с точки зрения поддержания работы мода.
+В случае Dungeon craft, мод всегда использовал только одну библиотеку структур, они использовали разные форматы структур, переход был пусть и простым делом, но в один момент при конвертации форматов произошла ошибка, которая была замечена уже после.
+
+DungeonUtility предлагает быстрый переход с разных библиотек, без проблем с форматом структур!
+Примером данного перехода является мод Aether 2 BE, Ancient wonders
+
+## Какой формат лучше использовать?
+
+Формат DungeonUtility является форматом, который используется **по умолчанию**, однако имеет один жирный минус — большой размер файла.
+
+Формат DungeonUtility_V2 - является новым форматом, который имеет достаточно компакнтый размер, при этом обладает неплохой скоростью загрузки.
+Данный формат представляет собой [бинарный файл](https://en.wikipedia.org/wiki/Binary_file)
+
+Исходя из выше сказаного рекомендую использовать формат DungeonUtility_V2, об устройстве формата можете почитать внизу(не требуется для обычных пользователей библиотеки)
+
+## Спецификация формата DungeonUtility_V2
+
+### Типы данных которые используются
+
+| Тип | Размер |
+|-------|--------|
+| byte | 1 |
+| short | 2 |
+| int | 4 |
+
+## Структура файла DungeonUtility_V2
+
+Самый первый byte - версия формата
+
+| Версии |
+|----------|
+| -128 |
+
+### Версия DungeonUtility_V2 -128
+
+После версии индут заголовки зоны
+Зоны - это некоторое количесва байтов, которое определяется в заголовке зоны
+Заголовок зоны - содержат: byte, int. byte - тут это id зоны, int - место где зона заканчивается, в случае не поддержки зоны, чтение зоны пропускается! В случае повреждения int - шансов на чтение файла нет, к счастью это очень маленькая часть файла, шанс на повреждение маленький.
+
+| Зоны | Имя | Предназначение | Приоритет чтения |
+|------|--------------|--------------------------------------|------------------|
+| -1 | EMPTY | Скипующая зона | 0 |
+| - | MAP | Хранение информации по байту | - |
+| 0 | DESCRIPTION | Описание | 10 |
+| 1 | STATES | Описание блоков которые используются | 5 |
+| 2 | PLANE_BLOCKS | Разрез структуры | -5 |
+
+Чем больше приоритет, чем раньше читается зона
+
+### EMPTY
+
+Зона которая скипает чтение информации внутри себя, может использоваться, в случае повреждения байта, отвечающего за id зоны, также может использовать в случае не поддержки зоны
+
+### MAP
+
+Абстракнтая зона, представляющая собой своего рода HashMap.
+Первый byte количество полей, дальше идут поля, каждое поле представляет собой: два byte, первый котороый хранит тип информации, второй байт используется как ключ, по которому, дальше количество байтов и значение зависят от типа
+
+| Тип | Имя | Размер |
+|-----|--------|-----------------------------------------------------------------------|
+| -1 | EMPTY | Не имеет |
+| 0 | BYTE | 1 |
+| 1 | SHORT | 2 |
+| 2 | INT | 4 |
+| 3 | STRING | 2 байта(short) + плюс прочитанный short + минимальное значение short |
+
+#### Чтения строки
+
+Читается short, прибавляется минимальное значение short, получаем последовательность байтов строки
+
+### DESCRIPTION
+
+Наследуется от зоны MAP
+
+| Ключ | Имя |
+|------|----------|
+| 1 | X_OFFSET |
+| 2 | Y_OFFSET |
+
+### STATES
+
+Содержит описание стейтов
+Перый байт, тип данных, который используется для обозначения состояния блока(1 - byte, 2 - short), данный байт очень важен для чтения и используется в PLANE_BLOCKS, дальше этот параметр будет называться как **id состояния**!
+Следующие 2 байта(short) количетсво состояний
+
+Описания состояния: первые байты **id состояния** дальше идет 3 байта, которые обозначают boolean, есть-ли у блока state, есть-ли у блока extra, есть-ли у tag
+Первым читается state, если он есть, вторыи extra, затем tag
+Способ записи BlockState, если id блока больше 8000, то первый байт 1 иначе 0, если равен 1 то дальше идет текстовое id блока, если нет то short id блока, после идет BlockState в виде json
+tag также записывается в виде строки
+
+### PLANE_BLOCKS
+
+Представляет собой двух мерный массив **id состояний**!
+Первый short - это позиция разреза по координате z
+второй и третий short - размеры двух мерного массива
+
+Двухмерный массив содержит **идентификатор состояния**, каждая позиция в массиве это координата блока в структуре, также необходимо вычесть X_OFFSET и Y_OFFSET из DESCRIPTION
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/loaders/StructureLoader.md b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/loaders/StructureLoader.md
new file mode 100644
index 000000000..0f8a5d4cb
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/DungeonUtility/loaders/StructureLoader.md
@@ -0,0 +1,80 @@
+# Загрузка структур
+
+StrcutureLoader — класс который использовался раньше для загрузки структур, сейчас эти методы устарели, но они все еще поддерживаются.
+Класс используетя для манипуляции структрами в файлах.
+Актуальный классом является StructurePool, Данный класс просто хранит структуры по их имени, в дальнейшем их можно будет использовать по имени.
+
+
+
+## Почему StructureLoader Устарел?
+
+Все мы любим назвать свое единственное дерево в моде 'бревно265', что будет если в двух разных модах будет структура 'бревно265'?
+Очень просто, выживит сильнейший!
+
+Чтобы не было подобных ситуаций был создан StructurePool, он имеет свое имя по которому его можно получить в других модификациях, для простоты понимания мы это тоже упустим.
+
+:::info
+
+**Важно чтобы ваше имя StructurePool не совпадало с другими модами! Указывайте имя мода полностью, не сокращая его.**
+:::
+
+Для начала создадим StructurePool, который в дальнейшем будем использовать:
+
+```ts
+let poolInstance = new StructurePool("test_pool");
+```
+
+Для простоты и сокращения кода установим путь к папке со структурами (отсюда они в дальнейшем будут загружаться):
+
+```ts
+poolInstance.setPathStructures(/*ПОЛНЫЙ путь к папке со структурами*/);
+```
+
+Загрузка структуры
+
+```ts
+poolInstance.upload(/*имя файла*/, /*Формат структуры, по умолчанию DungeonUtility*/);
+```
+
+:::info
+
+Формат структуры указывать не обезательно, **по умолчанию используется DungeonUtility**
+:::
+
+Получение структуры, используется везде где нужна структура
+:::info
+
+ВНИМАНИЕ! Загрузка структур НЕ происходит сразу, как только используется `upload`.
+:::
+
+Событие StructureLoadOne вызывается после загрузки структур, работаете со структурами тут!
+
+```ts
+poolInstance.get(/*имя структуры*/);
+```
+
+### Пример использования
+
+```ts
+// Создаем StructurePool, ОБРАТИТЕ ВНИМАНИЕ, что у каждого мода должно быть свое уникальное имя StructurePool!
+let examplePool = new StructurePool("example_pool");
+
+// Устанавливаем путь к папке со структурами, в данном случае папка structures в главной директории мода
+examplePool.setPathStructures(__dir__+"structures");
+
+// Загружаем структуру 'test_structure.struct' из папки указанной выше, структура будет доступна по имени test_structure
+examplePool.upload("test_structure");
+// Загружаем структуру 'legacy_structure.struct' из папки указанной выше, структура будет доступна по имени legacy_structure
+// Обратите внимание, что в данном примере используется формат файла Structures
+examplePool.upload("legacy_structure", "Structures");
+// Загружаем структуру 'test_structure_folder.struct' из папки указанной выше и папки указанной тут, структура будет доступна по имени test_structure_folder
+examplePool.upload("folder/test_structure_folder");
+
+
+Callback.addCallback("StructureLoadOne", () => {
+ // Примеры получения структур загруженных выше!
+ examplePool.get("test_structure");
+ examplePool.get("legacy_structure");
+ examplePool.get("test_structure_folder");
+});
+```
diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/libraries/readme.md b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/readme.md
new file mode 100644
index 000000000..4cf3d6c17
--- /dev/null
+++ b/i18n/ru/docusaurus-plugin-content-docs/current/libraries/readme.md
@@ -0,0 +1,34 @@
+---
+displayed_sidebar: librariesSidebar
+slug: /libraries
+---
+
+# Start your Journey
+
+
+
+```mdx-code-block
+import DocMap from "@site/src/components/DocMap"
+
+
+```
diff --git a/sidebars.js b/sidebars.js
index 334037173..85d4ddaee 100644
--- a/sidebars.js
+++ b/sidebars.js
@@ -240,5 +240,39 @@ module.exports = {
type: 'doc',
id: 'future-steps'
}
+ ],
+ librariesSidebar: [
+ {
+ type: 'category',
+ label: 'Dungeon Utility',
+ link: {
+ type: 'generated-index'
+ },
+ items: [
+ 'libraries/DungeonUtility/getting-started',
+ {
+ type: 'category',
+ label: 'Upload Structure',
+ link: {
+ type: 'generated-index'
+ },
+ items: [
+ 'libraries/DungeonUtility/loaders/StructureFormats',
+ 'libraries/DungeonUtility/loaders/StructureLoader',
+ ]
+ },
+ {
+ type: 'category',
+ label: 'Structure Generation',
+ link: {
+ type: 'generated-index'
+ },
+ items: [
+ 'libraries/DungeonUtility/generations/ItemGeneration',
+ 'libraries/DungeonUtility/generations/StructurePiece'
+ ]
+ }
+ ]
+ }
]
};