Как декодировать байты данных (т.е. состояния блока) в файле схемы Minecraft (nbt)? - PullRequest
11 голосов
/ 23 апреля 2019

Я анализирую schematic file со следующей структурой

Формат файла .schematic был создан сообществом для хранения разделов мира Minecraft для использования со сторонними программами. Схемы в формате NBT

Формат файла Named Binary Tag (NBT) - это чрезвычайно простой структурированный двоичный формат, используемый игрой Minecraft для множества вещей

Блок Data Value с определяет части местности в Minecraft.

Я извлекаю block data каждого блока Minecraft, и мне нужно выяснить, как декодировать эти байты. Это пример для Stairs Minecraft Block

Например данные блока лестниц включают в себя:

enter image description here

Я могу использовать nbt-js для анализа всего файла схемы, что позволяет мне получить доступ к данным блока следующим образом:

var b = schem.value.Data.value[index];

Я декодирую Данные блока лестниц бит данных с помощью следующего кода

var facing = b & 0x03;
var half = (b >> 2) & 0x01;
var shape = (b >> 3) & 0x03;

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

block.rotateX(facing);

Однако, биты интерпретируются по-разному для каждого типа блока, и это нигде не определено, что я могу найти.

Ответы [ 2 ]

4 голосов
/ 27 апреля 2019

Не существует сопоставления, которое бы работало для всех блоков

И вам просто придется иметь с ним дело

Это причинапочему 1.13 и «Сглаживание» полностью удаляют метаданные, что приводит к тому, что все блочные состояния, кодируемые в виде строк, при сериализации (NBT - это сериализованный формат данных, который используется практически для всего до достижения формата Anvil).Во время выполнения эти состояния анализируются и превращаются в истинные Object экземпляры, что устраняет необходимость в магических значениях.

Таким образом, вам не придется решать, что facing = b & 0x03; вместо этого вы получите {"facing":"east"}

К сожалению, если вы работаете ниже 1.13, вам придется иметь дело с магическими значениями метаданных, и нет никакого решения, если у вас нет доступа к игре во время выполнения и вы можете вызвать getStateFromMeta() (с 1.10 по 1.12; не уверены, где1.8 и 1.9 сидят, как я никогда не моддировал для этих версий).

0 голосов
/ 26 апреля 2019

Мне не известно ни о каком существующем jslib, который выполняет этот "полный анализ".

Если вы хотите получить blockState для всех блоков, вам нужно будет создать собственную логику (как вы это сделали с лестницами), анализируя blockState на основе blockId для каждого блока, который вы хотите поддерживать.

Может быть, вы хотите создать класс для каждого blockState и проанализировать необработанное значение, возвращая правильный объект блока. Так делают Minecraft, Minecraft Server, Bukkit / Spigot.

Вы можете использовать эту страницу как ссылку на все blockStates: https://minecraft.gamepedia.com/Block_states

...