Modding:Концепция WorldGen

From Vintage Story Wiki
This page is a translated version of the page Modding:WorldGen Concept and the translation is 100% complete.

Эта страница проверялась в последний раз для версии Vintage Story 1.15.


Other languages:

В этой статье рассказывается, как обрабатывается генерация мира в истории Vintage, и в какой степени его можно модифицировать. Он также предназначен в качестве общего введения для моддинга в отношении генерации мира.

Терминология

Важная терминология, на которую стоит обратить внимание при чтении этой статьи:

  • Чанк: структура данных, которая содержит 32x32x32. Следует отметить, что фрагменты не охватывают высоту мира.
  • Столбец фрагментов: (набор фрагментов, охватывающих вертикальную высоту мира. Учитывая высоту мира 256, столбец фрагментов будет представлять 8 вертикально расположенных фрагментов)
  • Фрагмент карты: Структура данных, содержащая информацию в столбце фрагмента, например высоту дождя или скопление снега
  • Карта региона: Структура данных, которая хранит информацию в области столбцов фрагментов 16x16, например погоду и карты, необходимые для создания мира

Концепция

Генерация мира — это процесс создания необходимых данных о мире, когда это требуется игроку. Генерация мира выполняется на основе региона, фрагмента карты и столбца фрагмента, каждый из которых действует как значимое подразделение мира. Каждый регион, фрагмент карты и столбец фрагментов создаются только один раз и хранят важные данные об этой области. Генерация мира очень модульная. Почти все сгенерированные части мира, такие как залежи руды, существа или деревья, указываются с помощью модов содержимого JSON. На уровне кодирования каждый этап генерации запускает событие, на которое базовая игра регистрирует обработчики. Обработчики событий можно зарегистрировать или удалить через API, чтобы изменить любую часть генерации.

Модификация контента

Используя моддинг контента, вот различные вещи, которые можно добавить, изменить или удалить из генерации мира. Свойства, относящиеся к генерации мира, обычно находятся по адресу Vintagestory/assets/survival/worldgen.

Модифицируемый контент

Вещь Описание
Депозиты Все, что «откладывается» в земле при генерации, например, руды или участки блоков, таких как гравий и мел.
Структуры Предопределенные структуры, такие как руины, найденные повсюду. На странице «Как использовать WorldEdit» есть инструкции по созданию и экспорту структур.
Деревья Размещение деревьев и кустарников
Слои блоков Слои блоков, обнаруженные над слоем породы
Блочные патчи Патчи блоков, а также растительность
Геологические провинции Геологические атрибуты и размещение
Рельеф План местности и общее обустройство местности

Модификация кода

Используя моддинг кода, можно полностью удалить любую конкретную часть генерации мира из базовой игры, а также добавить новые функции.

Типы мира

На данный момент существует три типа мира — «стандартный», «суперплоский», «пустой». Типы мира существуют в EnumWorldGenPreset. Тип мира должен быть указан при регистрации обработчиков событий для генерации мира.

Проходит

Событие генерации столбца чанка дополнительно подразделяется на проходы. Проходы — это, по сути, слои в создании столбца фрагментов: сначала закладывается слой камня за один проход, а в более поздних проходах выполняются более общие действия с перекрестными фрагментами, такие как заливка их светом или растущие участки травы. Проходы существуют в EnumWorldGenPass. Пропуск должен быть указан при регистрации обработчиков событий для генерации столбца фрагмента.

Индекс Имя Описание Требуются соседние фрагменты
0 Нет Пока ничего не создано false
1 Местность Базовая местность, пласты горных пород, пещеры, слои блоков false
2 Особенности рельефа Месторождения, сооружения, пруды true
3 Растительность Глыбовые участки, кустарники и деревья, ручейки, залитые солнечным светом куски true
4 СоседСолнцеСветНаводнение Слой снега, солнечные лучи заливают близлежащие куски true
5 Готово Закончив генерацию, создайте существ, соседние фрагменты могут по-прежнему генерировать дополнительные вещи true
6 Готово Pass не запускается как событие -

События

Генерация региона ('IMapRegion), фрагмента карты (IMapChunk) или фрагментов, содержащихся в этом столбце фрагментов (IServerChunk и IWorldChunk '), запускает событие (в указанном порядке). Каждый из этих интерфейсов содержит определенные данные о данном регионе. Возможна регистрация обработчиков событий, при этом доступ предоставляется для данного интерфейса. Порядок, в котором назначаются обработчики, основан на порядке выполнения их конкретных систем модов.

Доступ к событиям

class Mod : ModSystem
{
    public override double ExecuteOrder()
    {
        // Make sure all delegates have been assigned
        return 10;
    }

    public override void StartServerSide(ICoreServerAPI api)
    {
        // Get the handler for interacting with world generation.
        IWorldGenHandler handler = api.Event.GetRegisteredWorldGenHandlers("standard");

        // Example registering events using a delegate.
        api.Event.ChunkColumnGeneration(/* Handler here */, EnumWorldGenPass.None, "standard");
        api.Event.MapChunkGeneration(/* Handler here */, "standard");
        api.Event.MapRegionGeneration(/* Handler here */, "standard");

        // Retrieving registered handlers.
        List<MapChunkGeneratorDelegate> onMapChunkGen = handler.OnMapChunkGen;
        List<ChunkColumnGenerationDelegate>[] onChunkColGen = handler.OnChunkColumnGen;
        List<MapRegionGeneratorDelegate> onMapRegionGen = handler.OnMapRegionGen;

        foreach (var deleg in onMapChunkGen)
        {
            // Printing class name of delegate instance.
            // This can be useful for finding and removing any particular event from the list.
            api.Server.LogEvent(deleg.Target.ToString());
        }
    } 
}
Icon Sign.png

Wondering where some links have gone?
The modding navbox is going through some changes! Check out Navigation Box Updates for more info and help finding specific pages.