1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Deamonish, 13 авг 2017.

Статус темы:
Закрыта.
  1. Автор темы
    Deamonish

    Deamonish Активный участник

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

    Мы берем директорию с регионами. И начинаем последовательно, считывать регионы.
    В каждом регионе, пробегаемся циклом, по чанкам. И ищем tag TileEntities в котором есть
    tag "id == minecraft:sign"
    Исходя из документации от Mojang, в TileEntities у таблички, есть лишь информация о позиции x,y,z
    и теги Text1,2,3,4. О direction информации нет. Совсем.
    Ниже код, для получения позиции, и текста в табличках.
    Код:
    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 записан байтовый массив.
    [​IMG]
    [​IMG]
    Но взглянув на документацию, в этот массив записываются лишь байты, обозначающие тип блока.
    И похоже, что дата блоков, обозначающая направление, хранится в секции Data.
    Но как понять, где среди всех этих байтов, дата принадлежащая определенной табличке?
    И как понять/высчитать, локацию таблички по этим данным?
     
  2. Автор темы
    Deamonish

    Deamonish Активный участник

    Баллы:
    61
    Уже разобрался. Нужно было на основе кординат полученных от тега 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);
    Тему можно смело закрывать.
     
Статус темы:
Закрыта.

Поделиться этой страницей