Skip to content

Commit

Permalink
Feat: Добавлена документация по основным методом DungeonUtility
Browse files Browse the repository at this point in the history
  • Loading branch information
Reider745 authored and MaXFeeD committed Aug 23, 2024
1 parent c699cb3 commit 8055154
Show file tree
Hide file tree
Showing 15 changed files with 615 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# Библиотеки
---
hide_title: true
---

```mdx-code-block
import NotImplemented from "@site/src/components/NotImplemented"
<NotImplemented />
```
```
9 changes: 9 additions & 0 deletions docs/libraries/DungeonUtility/generations/StructurePiece.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
hide_title: true
---

```mdx-code-block
import NotImplemented from "@site/src/components/NotImplemented"
<NotImplemented />
```
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Libraries
# Intro

```mdx-code-block
import NotImplemented from "@site/src/components/NotImplemented"
Expand Down
Empty file.
9 changes: 9 additions & 0 deletions docs/libraries/DungeonUtility/loaders/StructureLoader.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
hide_title: true
---

```mdx-code-block
import NotImplemented from "@site/src/components/NotImplemented"
<NotImplemented />
```
34 changes: 34 additions & 0 deletions docs/libraries/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
displayed_sidebar: librariesSidebar
slug: /libraries
---

# Libraries

<!--
Inner Core Docs: Inner Core, Core Engine and Horizon documentation
Copyright (C) 2022 Nernar (https://github.com/nernar)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Maintained and distributed by MaXFeeD ([email protected])
-->

```mdx-code-block
import DocMap from "@site/src/components/DocMap"
<DocMap exploreCategories={ true } />
```
3 changes: 2 additions & 1 deletion docusaurus.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const darkCodeTheme = require('prism-react-renderer/themes/vsDark');
const logger = require('@docusaurus/logger');
const path = require('path');
const fs = require('fs');
const sidebars = require('./sidebars');

const baseUrl = process.env.BASE_URL ?? '/';

Expand Down Expand Up @@ -112,7 +113,7 @@ const config = /** @type {import('@docusaurus/types').Config} */ ({
},
{
position: 'left',
to: 'libraries',
to: 'docs/libraries',
label: 'Libraries'
},
{
Expand Down
13 changes: 13 additions & 0 deletions i18n/ru/docusaurus-plugin-content-docs/current.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
---
title: Генерация предметов
---

ItemGeneration - класс для создания генераторов предметов и взаимодействия с ними.
Данный класс может работать только с ванильными контейнерами!

## Какие проблемы решает генератор предметов?

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 и добавляем предмет с id из VanillaItemID.diamond, с шансом спавна .1(это 10%) и следующим параметром мы устанавливаем количество падающих предметов, а именно от 1 до 5.
> Помните, что метод использует [**вероятность**](https://ru.wikipedia.org/wiki/Вероятность) спавна, коротко говоря это шанс спавнв деленный на 100(например 1/100 = 1%)
Теперь разберем метод заполнения сундука

```ts
ItemGeneration.fill("example_name", x, y, z, region);
```

Данный метод заполняет сундук на координатах x, y, z и в измерении region(BlockSource)

## Интеграция с другими модами

Для того, чтобы не добавлять свои предметы в ручную в каждый мод на структуры был добавлен метод
```ts
ItemGeneration.setItemIntegration(VanillaItemID.diamond_axe, .1, {min: 1, max: 1});
```
Тут мы добавляем предмет с id из VanillaItemID.diamond_axe, с шансом спавна .1(это 10%) и следующим параметром мы устанавливаем количество падающих предметов, а именно от 1 до 1.

## Recipe Viewer

Данный метод создаст интеграцию с RecipeViewer за вас!

```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});

// Создаем интеграцию с RecipeViewer
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"));
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
---
title: Генерация структуры
---

DefaultGenerationDescription - класс обеспечит качественную генерацию, которая создается очень просто

## Какие проблемы решает генератор структур 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
Он принимает структуру, которая будет генерироваться и шанс

> В шансе спана указывается делитель для получения [**вероятности**](https://ru.wikipedia.org/wiki/Вероятность) спавна структуры
Дальше мы устанавливаем уникальный индитификатор мода, это требуется для исправления половинчитых структур
> **Если ваша структура генерируется очень часто, не рекомендую это делать**
> example_generation.setIdentifier("my_mod:test_structure");
Затем мы установили поверхности на которых будет генерироваться структура, в где true - это переключатель между белым списком и черным, в примере белый список
> example_generation.setSurface(true, [VanillaBlockID.grass]);
Дальше мы задали групу к которой принадлежит структура и минимальное растояние до ближайшей структуры данной группы(что-бы структуры не спавнились слишком часто)
> example_generation.setDistance(90, "my_mod_group");
Ну и на последок мы зарегистрировали генерацию структуры

> 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});

// Создаем интеграцию с RecipeViewer
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();
});
```
Loading

0 comments on commit 8055154

Please sign in to comment.