Оптимизация добавления объектов

Версия Minecraft
1.16.5
API
Forge
40
1
7
Всем добра!

Подскажите, может быть я что-то не так понимаю, но как большие мододелы добавляют несколько тысяч предметов?
Я попробовал добавить 37 блоков руд и потратил на это около часа.

Может быть я что-то не так делаю?
Сссылка на Github код
 
@Mr.Toad Ну я думал, мб какие то есть фишки типа генераторов объектов из схем. К примеру прописать json и потом кодом генерировать.
Генераторы всего для блоков(blockstate, model и др.) есть, но с 1.19 или даже позже.
 
Самописные генераторы никто не запрещал.
Где-то у меня был собственный самокостыль не питончике, чтобы 1-им кликом делать json-модели ... увы не сохранился
 
Где-то у меня был собственный самокостыль не питончике, чтобы 1-им кликом делать json-модели ... увы не сохранился
Я уже написал. Но его подстраивать надо под каждую задачу. Не универсальный.

Мб кому пригодится кстати.

generate_block.py:
import os
import json
import shutil

import structlog

from improved_logging.loggers import InitLoggers

logger: structlog.BoundLogger = structlog.getLogger(InitLoggers.main.name)


class BlockGenerator:
    def [B]init[/B](self, input_file: str):
        """
        Инициализация генератора блоков.
        :param input_file: Путь к файлу JSON с описанием блоков.
        """
        self.input_file = input_file
        self.base_path = os.getcwd()
        self.asset_structure = [
            "assets/moringtech/blockstates",
            "assets/moringtech/models/block",
            "assets/moringtech/models/item",
            "assets/moringtech/textures/block",
            "assets/moringtech/textures/item",
        ]

    def create_directory_structure(self):
        """Создает базовую структуру папок для блоков."""
        logger.info("Создание базовой структуры папок...")
        for path in self.asset_structure:
            os.makedirs(path, exist_ok=True)
            logger.info("Папка создана", path=os.path.join(self.base_path, path))

    def read_input_file(self) -> dict:
        """
        Читает JSON файл и возвращает его содержимое.
        :return: Данные из JSON файла.
        """
        logger.info("Чтение файла ввода", file=self.input_file)
        with open(self.input_file, 'r', encoding='utf-8') as f:
            data = json.load(f)
        logger.info("Файл успешно прочитан")
        return data

    def generate_block_files(self, blocks: dict):
        """Генерирует файлы для блоков из переданного словаря."""
        def recursive_generation(prefix: str, value):
            """
            Рекурсивно обрабатывает вложенные словари для генерации структуры и файлов.
            :param prefix: Текущий префикс для путей и блоков.
            :param value: Список или словарь значений.
            """
            if isinstance(value, dict):
                for key, nested_value in value.items():
                    recursive_generation(f"{prefix}/{key}", nested_value)
            elif isinstance(value, list):
                for block_name in value:
                    self._generate_json_files(prefix, block_name)

        logger.info("Генерация файлов блоков...")
        recursive_generation("block", blocks)

    def _generate_json_files(self, path_prefix: str, block_name: str):
        """
        Создает необходимые JSON файлы для указанного блока.
        :param path_prefix: Путь к папке блока.
        :param block_name: Имя блока.
        """
        folder_suffix = path_prefix.replace("block", "").strip("/")
        os.makedirs(f"assets/moringtech/blockstates/{folder_suffix}", exist_ok=True)
        os.makedirs(f"assets/moringtech/models/block/{folder_suffix}", exist_ok=True)
        os.makedirs(f"assets/moringtech/models/item/{folder_suffix}", exist_ok=True)
        os.makedirs(f"assets/moringtech/textures/block/{folder_suffix}", exist_ok=True)

        # Создание blockstates файла
        blockstates_path = f"assets/moringtech/blockstates/{folder_suffix}/{block_name}.json"
        self._write_json_file(blockstates_path, {
            "variants": {
                "": {"model": f"moringtech:{path_prefix}/{block_name}"}
            }
        })

        # Создание models.block файла
        models_block_path = f"assets/moringtech/models/block/{folder_suffix}/{block_name}.json"
        self._write_json_file(models_block_path, {
            "parent": "block/cube_all",
            "textures": {
                "all": f"moringtech:{path_prefix}/{block_name}"
            }
        })

        # Создание models.item файла
        models_item_path = f"assets/moringtech/models/item/{folder_suffix}/{block_name}.json"
        self._write_json_file(models_item_path, {
            "parent": f"moringtech:{path_prefix}/{block_name}"
        })

        logger.info("Файлы успешно созданы", block_name=block_name)

    def _write_json_file(self, path: str, content: dict):
        """
        Записывает JSON файл с указанным содержимым.
        :param path: Путь к файлу.
        :param content: Содержимое JSON файла.
        """
        with open(path, 'w', encoding='utf-8') as f:
            json.dump(content, f, indent=2)
        logger.info("JSON файл создан", path=path)

    def print_block_names(self, blocks: dict):
        """
        Выводит имена блоков в формате "block.moringtech.<path>.<block>": "<block>"
        """

        def recursive_collect(prefix: str, value):
            if isinstance(value, dict):
                for key, nested_value in value.items():
                    recursive_collect(f"{prefix}.{key}", nested_value)
            elif isinstance(value, list):
                for block_name in value:
                    formatted_name = f'block.moringtech{prefix}.{block_name}'
                    print(f'"{formatted_name}": "{block_name}",')

        recursive_collect("", blocks)

    def run(self):
        """Запуск процесса генерации."""
        self.create_directory_structure()
        data = self.read_input_file()
        blocks = data.get("blocks", {})
        self.generate_block_files(blocks)
        self.print_block_names(blocks)

if [B]name[/B] == "[B]main[/B]":
    InitLoggers()

    shutil.rmtree("assets", ignore_errors=True)

    generator = BlockGenerator("input.json")
    generator.run()

pip install structlog
Настройка structlog : Gist


input.json:
{
    "blocks": {
        "ore": [
            "spodumene",
            "sperrylite",
            "columbite_tantalite"
        ]
    }
}
 
Назад
Сверху