Minecraft Как хранятся фрагменты фрагментов

В настоящее время я создаю программу для обработки фрагментов Minecraft, и я хотел бы знать, как хранятся фрагменты фрагментов Minecraft.

Из статьи Minecraft Wiki о том, как Minecraft хранит свои фрагменты.

Разделы: список составных тегов, каждый тег представляет собой своего рода подфрагмент.

Отдельный раздел.

Y: Индекс Y (не координата) этого раздела. Диапазон от 0 до 15 (снизу вверх), без дубликатов, но некоторые разделы могут отсутствовать, если они пусты.

Блоки: 4096 байт идентификаторов блоков, определяющих местность. 8 бит на блок плюс ? биты из приведенного ниже Добавить тег.

Дополнение: Может не существовать. 2048 байт дополнительных данных идентификатора блока. Значение, которое нужно добавить (объединить) с указанным выше идентификатором блока для формирования истинного идентификатора блока в диапазоне от 0 до 4095. 4 бита на блок. Объединение выполняется путем сдвига этого значения на 8 бит влево и последующего добавления его к идентификатору блока сверху.

Данные: 2048 байт блочных данных, дополнительно определяющих части рельефа. 4 бита на блок.

BlockLight: 2048 байт, записывающих количество излучаемого блоком света в каждом блоке. Сокращает время загрузки по сравнению с пересчетом во время загрузки. 4 бита на блок.

SkyLight: 2048 байт, записывающих количество солнечного или лунного света, падающего на каждый блок. 4 бита на блок.

Но я не понимаю, как Blocks читается. Каждая секция в чанке имеет размер 16 x 16 x 16 блоков. Но вместо этого Minecraft хранит блоки в разделе массива 1-d.


person frogocomics    schedule 08.09.2015    source источник


Ответы (1)


Трехмерный массив также хранится линейно в оперативной памяти. Вам нужно преобразовать координаты в индекс. Для тега «Блоки» это формула:

Index = Ycoord * 256 + Zcoord * 16 + Xcoord

Это называется YZX-ордер. Теги «HeightMap» или «Biomes» используют ZX-порядок (Index = Zcoord * 16 + X)

person Mystery    schedule 19.09.2015