Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

Метки:
Теги Теги
python schematic worldedit
Статус
Закрыто для дальнейших ответов.

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.

Помогите...
 
Так просто вставляй из через апи fawe, если не разбираешься в чанк формате.
 
А можно скрины с одинакового ракурса?
А по поводу чтения - могу предложить ознакомиться с кодом WE для чтения схематиков и перевести код на питон 1 в 1.
Ещё один вариант - делать софтину не на питоне, а на джаве или котлине, тогда можно прям из WE код взять или использовать апи, как уже было предложено выше
 
А можно скрины с одинакового ракурса?
А по поводу чтения - могу предложить ознакомиться с кодом WE для чтения схематиков и перевести код на питон 1 в 1.
Ещё один вариант - делать софтину не на питоне, а на джаве или котлине, тогда можно прям из WE код взять или использовать апи, как уже было предложено выше
Чет не допер сразу полезть в сурсы we, взял код из него все работает, спасибо
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх