Перейти к основному содержанию

Форматы структур

Формат структуры — это способ хранения и загрузки структуры из файла или любого другого источника.

ФорматBlockStateДополнительные блокиCompountTagАктуальный формат?
DungeonUtility_V2++++
DungeonUtility++++
DungeonCore++--
Structures---+
DungeonUtility----
DungeonAPI----
DungeonAPI_V2----

Зачем существуют различные форматы структур?

Dungeon Utility изначально писался как часть модификации Ancient Wonders/Dungeon craft. В случае Ancient wonders — мод использовал несколько различных библиотек для структур, что было крайне неудобно при его разработке и поддержании стабильности работы генерации. В случае Dungeon craft — мод всегда использовал только одну библиотеку структур, а из-за использования разных форматов в ней работа и загрузка структур могла быть нестабильной.

Dungeon Utility предлагает быстрый переход с разных библиотек без проблем с форматами структур.

Какой формат лучше использовать?

Формат DungeonUtility является форматом, который используется по умолчанию, однако имеет минус — весомый размер файла.

Формат DungeonUtility_V2 является новым форматом, который имеет достаточно компактный размер, при этом обладая неплохой скоростью загрузки. Формат представляет собой набор байтов.

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


Спецификация формата DungeonUtility_V2

Типы данных которые используются

ТипРазмер
byte1
short2
int4

Структура файла DungeonUtility_V2

Самый первый байт — версия формата.

Версии
-128

Версия DungeonUtility_V2 -128

После версии индут заголовки зоны. Зоны — это некоторое количество байтов, которое определяется в заголовке зоны. Заголовок зоны содержит: byte, int. byte определяет идентификатор зоны, int место где она заканчивается (если зона не поддерживается, ее чтение пропускается). Если заголовочный участок поврежден, чтение файла не предоставляется возможным.

ЗонаИмяПредназначениеПриоритет чтения
-1EMPTYПропускающая зона0
-MAPХранение информации по байту-
0DESCRIPTIONОписание10
1STATESОписание блоков, которые используются5
2PLANE_BLOCKSРазрез структуры-5

Чем больше приоритет, тем раньше читается зона.

EMPTY

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

MAP

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

ТипИмяРазмер
-1EMPTYНе имеет
0BYTE1
1SHORT2
2INT4
3STRING2 байта (short) + прочитанный шорт + минимальное значение шорт
Чтение этой последовательности

Читается шорт, прибавляется минимальное значение шорт, получается последовательность байтов строки.

DESCRIPTION

Наследуется от зоны MAP.

КлючИмя
1X_OFFSET
2Y_OFFSET

STATES

Содержит описание блокстейтов. Первый байт: тип данных, который используется для обозначения состояния блока (1 byte, 2 short), данный байт очень важен для чтения и используется в PLANE_BLOCKS, далее этот параметр будет называться как идентификатор состояния! Следующие 2 байта (short) количество состояний.

Описание состояния: первые байты идентификатор состояния дальше идут 3 байта, которые обозначают буль: есть ли у блока блокстейт, есть ли экстра блок, есть ли NBT. Первым читается блокстейт (если он есть), вторым экстра блок, затем NBT. Способ записи BlockState зависит от того, является ли идентификатор блоком из модов: если да, первый байт 1 иначе 0 (если равен 1, то дальше идет текстовый идентификатор блока, если нет, то шорт идентификатора ванильного блока, после идет BlockState в виде JSON-строки). NBT также записывается в виде специально сериализованной строки.

PLANE_BLOCKS

Представляет собой двухмерный массив идентификатора состояний. Первый шорт: позиция разреза по координате z. Второй и третий шорт: размеры двухмерного массива.

Двухмерный массив содержит идентификатор состояния, каждая позиция в массиве это координата блока в структуре, также необходимо вычесть X_OFFSET и Y_OFFSET из DESCRIPTION от этих координат.