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

Помогите Вопрос по nbt .schem worldedit

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

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

    PifPafich Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    steklopaKet32_46
    Нужно прочитать схематику из wordledit на питоне(зачем - рабочий секрет), которая в последствии будет вставлена в мир майнкрафта, но столкнулся с проблемой, что некоторые схематики, работают не коректно, то проподают блоки, то они ставятся хаотично. При дебаге обнаружил, что объем схематики W*L*H меньше, чем массив с id блоков (BlockData). Отсюда думаю, что в массиве блоков затясались какие не нужные блоки, которые и ломают весь процес получения их по индексу.
    Вопрос - а почему так, если we вставляет их без каких либо проблем, а во время чтения возникает такой казус? И как это исправить?
    Код ридера и класса схематики:
    Код:
    from nbt import nbt
    
    
    def read_schema(file_path):
        nbtfile = nbt.NBTFile(file_path, 'rb')
    
        name = nbtfile.name
    
        width = nbtfile['Width'].value
        height = nbtfile['Height'].value
        length = nbtfile['Length'].value
    
        palette = nbtfile["Palette"]
        palette = dict((palette[x].value, x) for x in palette)
        offsets = list(int(x) for x in nbtfile["Offset"])
    
        block_data = list(int(x) for x in nbtfile["BlockData"])
    
    
        print("sizes: {} {} {} volume: {}".format(width, height, length, width*length*height))
        print("data len: {}".format(len(block_data)))
    
        print(nbtfile['Metadata'])
        print(nbtfile['Offset'])
    
        return Schematic(name, file_path, width, height, length, palette, block_data, offsets)
    
    
    class Schematic:
        name: str
        file_path: str
    
        width: int
        height: int
        length: int
    
        palette: dict
        block_data: list[int]
    
        size: int
    
        def __init__(self, name: str, file_path: str, width: int, height: int, length: int,
                     palette: dict, block_data: list, offsets: [int]):
            self.name = name
            self.file_path = file_path
            self.width = width
            self.height = height
            self.length = length
            self.block_data = block_data
            self.offsets = offsets
            self.palette = palette
            self.size = len(block_data)
    
        def getIndex(self, x: int, y: int, z: int):
            return (y * self.length + z) * self.width + x
    
        def getBlockAt(self, x: int, y: int, z: int):
            index = self.getIndex(x, y, z)
    
            block_id = self.block_data[index]
            block = self.palette[block_id]
            return block, block_id
    
    Что должно получиться
    upload_2024-11-5_2-50-20.png

    upload_2024-11-5_2-51-23.png
    Видно странные рисунки из изумрудов, которые должны быть основой для маяка, мб они че скажут, как съехали координаты.
    Еще в оригинали схематики, все до центра оси OY заполняется хорошо, но после ситуация повторяется, так же как и с куском этой схематики, только там до y=3.

    Помогите...
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Так просто вставляй из через апи fawe, если не разбираешься в чанк формате.
     
  3. Автор темы
    PifPafich

    PifPafich Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    steklopaKet32_46
    мне именно прочитать надо ее циклом, а не просто вставить
     
  4. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А можно скрины с одинакового ракурса?
    А по поводу чтения - могу предложить ознакомиться с кодом WE для чтения схематиков и перевести код на питон 1 в 1.
    Ещё один вариант - делать софтину не на питоне, а на джаве или котлине, тогда можно прям из WE код взять или использовать апи, как уже было предложено выше
     
  5. Автор темы
    PifPafich

    PifPafich Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    steklopaKet32_46
    Чет не допер сразу полезть в сурсы we, взял код из него все работает, спасибо
     
  6. Автор темы
    PifPafich

    PifPafich Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    steklopaKet32_46
    спасибо всем
    CLOSED
     
Статус темы:
Закрыта.

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