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()