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' + ] + } + ] + } ] };