Помогите NBTTags блоков..

Статус
Закрыто для дальнейших ответов.

Deamonish

Активный участник
Баллы
61
Помогите, с определением направлений табличек.
У меня есть код, который считывает NBTTags мира.
Для обертки данных, использую апи: https://github.com/wytrem/NBTReader

Мы берем директорию с регионами. И начинаем последовательно, считывать регионы.
В каждом регионе, пробегаемся циклом, по чанкам. И ищем tag TileEntities в котором есть
tag "id == minecraft:sign"
Исходя из документации от Mojang, в TileEntities у таблички, есть лишь информация о позиции x,y,z
и теги Text1,2,3,4. О direction информации нет. Совсем.
Ниже код, для получения позиции, и текста в табличках.
Java:
public void scanMap(Rating rating){
 
File catalog = new File(rating.getDirMap() + File.separator + "region");
if(catalog.isDirectory() && catalog.listFiles() != null) {
   for(File fileRegion : catalog.listFiles()) {
      RegionFile file = new RegionFile(fileRegion);

       //Обходим чанки в регионах.
      for(int x = 0; x < 32; x++) {
         for(int z = 0; z < 32; z++) {
            if(file.hasChunk(x, z)) {
               DataInputStream chunk = file.getChunkDataInputStream(x, z);
               NBTTagCompound tag = CompressedStreamTools.read(chunk);
               NBTTagList tagCompound = tag.getCompoundTag("Level").getTagList("TileEntities");

               if(!tagCompound.toString().contains("TAG_End")){
                  NBTTagList list = tag.getCompoundTag("Level").getTagList("TileEntities");
                  for(NBTBase nbtBase : list.getTagList()) {
                     NBTTagCompound compound = (NBTTagCompound) nbtBase;
                     String id = ((NBTTagString) compound.getTag("id")).data;

                     if(id.contains("sign")) {
                        int posX = ((NBTTagInt) compound.getTag("x")).data;
                        int posY = ((NBTTagInt) compound.getTag("y")).data;
                        int posZ = ((NBTTagInt) compound.getTag("z")).data;

                        String[] sign = new String[4];
                        String text1 = ((NBTTagString) compound.getTag("Text1")).data;
                        String text2 = (NBTTagString) compound.getTag("Text2")).data;
                        String text3 = ((NBTTagString) compound.getTag("Text3")).data;
                        String text4 = ((NBTTagString) compound.getTag("Text4")).data;
                     }
                  }
               }
               chunk.close();

            }
         }
      }
      file.close();
   }
 }
}
Но Как узнать направление таблички?

Как я понял, для этого, необходимо брать секцию Blocks. Она имеет такую структуру:
Код:
Level: {
   Sections: {
       Blocks: {}
     }
 }
В секции Blocks записан байтовый массив.
i_XraD5eXHg.jpg

g804lb

Но взглянув на документацию, в этот массив записываются лишь байты, обозначающие тип блока.
И похоже, что дата блоков, обозначающая направление, хранится в секции Data.
Но как понять, где среди всех этих байтов, дата принадлежащая определенной табличке?
И как понять/высчитать, локацию таблички по этим данным?
 
Уже разобрался. Нужно было на основе кординат полученных от тега TileEntity. Высчитать относительные координаты в чанке, и по псевдокоду(из вики) ниже, высчитать индекс даты, в байтовом массиве.
Код:
byte Nibble4(byte[] arr, int index){ return index%2 == 0 ? arr[index/2]&0x0F : (arr[index/2]>>4)&0x0F; }
int BlockPos = y*16*16 + z*16 + x;
byte BlockID_a = Blocks[BlockPos];
byte BlockID_b = Nibble4(Add, BlockPos);
short BlockID = BlockID_a + (BlockID_b << 8);
byte BlockData = Nibble4(Data, BlockPos);
byte Blocklight = Nibble4(BlockLight, BlockPos);
byte Skylight = Nibble4(SkyLight, BlockPos);
Тему можно смело закрывать.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх