Перейти к основному содержимому

Вывод ресурс-пака FreeMinecraftModels

FreeMinecraftModels сейчас пишет сгенерированный пак в папку output, а не outputs.

Пути вывода по умолчанию

Плагин пересобирает эту папку при старте и при /fmm reload:

plugins/FreeMinecraftModels/output/FreeMinecraftModels

После этого он упаковывает её в:

plugins/FreeMinecraftModels/output/FreeMinecraftModels.zip

Именно этот путь к zip ожидает ResourcePackManager при интеграции с FreeMinecraftModels.

Что генерируется

Сгенерированная папка всегда содержит:

  • pack.mcmeta
  • pack.png
  • assets/minecraft/atlases/blocks.json
  • assets/freeminecraftmodels/... вывод моделей и текстур

Для Minecraft 1.21.4+ FreeMinecraftModels генерирует файлы определения item-модели в:

assets/freeminecraftmodels/items

Для более старых серверов используется устаревший путь с моделью-перекрытием для leather-horse-armor.

Вывод display-модели (1.21.4+)

Когда у модели есть соседний .json файл display-модели (см. Заметки по созданию моделей), FMM копирует этот JSON (с переписанными ссылками на текстуры под извлечённые) в:

assets/freeminecraftmodels/models/display/{modelId}.json

Также он генерирует соответствующее определение предмета в:

assets/freeminecraftmodels/items/display/{modelId}.json

DisplayModelRegistry отслеживает, у каких моделей есть display JSON во время выполнения, чтобы можно было вызывать ItemMeta.setItemModel() на ItemStack-ах и придавать им правильный вид в руке и в инвентаре.

Комплект кастомных сущностей Bedrock

Наряду с ассетами Java-пака FreeMinecraftModels экспортирует комплект кастомных Bedrock-сущностей для каждой преобразованной модели в:

plugins/FreeMinecraftModels/output/FreeMinecraftModels/assets/freeminecraftmodels/rspm_bedrock_pack

Каждая модель вносит свои текстуры, геометрию, render controller, анимации, animation controllers и определение сущности — всё в пространстве имён freeminecraftmodels: (freeminecraftmodels:<model_id>).

Что важно при создании контента:

  • Модель без текстур пропускается, с сообщением Skipping Bedrock custom entity export for <id>: model has no textures. в консоли
  • Геометрия Bedrock исключает кости посадочных мест (m_), созданные кости имён (fmm_nametag_bone_*) и hitbox. Авторские якоря tag_ остаются в геометрии, часто без кубов.
  • Модель без анимаций всё равно экспортирует единственный слот анимации idle
  • Ширина/высота хитбокса Bedrock-сущности во время выполнения берутся из кости hitbox модели; без неё используется запасной вариант 1.0 x 2.0

Бэкенду Bedrock нужен включённый плагин с именем floodgate, Geyser-Spigot или Geyser. Проверка не учитывает регистр, но другое имя не подходит. На сервере только с Java FMM экспортирует файлы пакета, однако не создаёт и не обновляет этот бэкенд.

Условный вывод предметов для луков и арбалетов

Когда FMM обнаруживает набор моделей состояний лука или арбалета (см. Заметки по созданию моделей), он генерирует одно JSON-определение предмета для модели _idle, которое условно переключается между всеми состояниями на уровне ресурс-пака. Серверная работа с пакетами не нужна — клиент сам управляет переходами состояний.

Вывод для лука

Для луков сгенерированное определение предмета использует minecraft:condition на using_item с minecraft:range_dispatch по use_duration (масштаб 0.05):

УсловиеИспользуемая модель
Предмет не используется_idle
Используется, fallback (только начали)_draw_start
Используется, порог 0.65_draw_half
Используется, порог 0.9_draw_full

Вывод для арбалета

Для арбалетов сгенерированное определение предмета использует minecraft:select на charge_type. Когда заряжен (стрелой или ракетой), показывается модель _charged. Незаряженный fallback использует minecraft:range_dispatch на crossbow/pull:

УсловиеИспользуемая модель
Не используется, не заряжен_idle
Используется, fallback (только начали)_draw_start
Используется, порог 0.58_draw_half
Используется, порог 1.0_draw_full
Заряжен (стрелой или ракетой)_charged

Расположение вывода

Сгенерированное условное определение предмета пишется рядом с другими определениями предметов в:

assets/freeminecraftmodels/items/display/{baseModelId}_idle.json

Файл определения предмета получает только модель _idle. Модели натяжения и заряженной формы упоминаются внутри неё как условные записи.

Совместимость с Minecraft 26.1+

Генератор пака применяет два автоматических исправления совместимости для Minecraft 26.1 и новее:

  • Clamping UV: UV граней ограничиваются собственными пиксельными границами исходной текстуры (0textureWidth / 0textureHeight), прежде чем масштабироваться в UV-пространство Minecraft 16x16. Некоторые авторы .bbmodel оставляют в гранях отрицательные или превышающие размер UV — атлас изменили в размере, autouv вышел за край и так далее, — что более строгий валидатор 26.1 отклоняет. Ограничение позволяет модели собраться; грань с выходящим за границы UV теряет максимум несколько пикселей детализации текстуры.
  • Пустые и якорные кости пропускаются: кость без кубов не записывает JSON геометрии, поэтому запись определения модели предмета для неё оставила бы висящую ссылку. 1.21.x молча это терпел; 26.1+ логирует каждую такую как Missing block model: freeminecraftmodels:.... Теперь генератор пропускает и файл геометрии, и определение предмета для таких костей. Это также покрывает кости hitbox (только для коллизий), позиционные якоря tag_name, автогенерируемые FMM варианты fmm_nametag_bone_* и чисто обёрточные/якорные кости.
примечание

Пропуск этих костей — причина, по которой кости тега имени tag_ никогда не нужны кубы: это позиционный якорь, и генератор намеренно ничего для неё не пишет. См. Для тегов имён нужна кость tag_.

Эти исправления применяются автоматически, конфигурации не требуется.

Детерминированный вывод

Генерируемый пак побайтово стабилен: повторная генерация из неизменённых моделей даёт идентичный zip и, следовательно, идентичный SHA1.

Это важно, потому что ResourcePackManager пропускает повторную загрузку пака, чей SHA1 уже совпадает с тем, что есть у удалённого хоста. Если байты «плавают», эта проверка никогда не совпадает, RSPM перезагружает пак при каждом перезапуске, и каждый игрок заново скачивает пак, содержимое которого не менялось.

Два места в генераторе пишут JSON прямо на диск, поэтому порядок обхода их map и есть байтовый порядок файла:

  • определения моделей предметов по костям в assets/freeminecraftmodels/items
  • блок display в JSON модели по костям в assets/freeminecraftmodels/models

Оба теперь используют map с сохранением порядка вставки. Раньше они использовали Map.of, за которым стоит java.util.ImmutableCollections — он засеивает случайную соль на JVM и пробирует от зависящего от соли индекса, поэтому одна и та же горстка ключей выходила в разном порядке при каждом старте сервера. Ключи вроде translation / scale и type / index / default менялись местами при каждой загрузке, переписывая каждое определение предмета и каждый файл модели без всякой причины.

Если вы раньше замечали, что игроки заново скачивают ресурс-пак после каждого перезапуска, хотя вы ничего не меняли, — вот почему.

примечание

Детерминизм действует, только если ваш набор моделей не изменился. Добавление, удаление, переименование или правка модели закономерно меняют байты пака и должны вызывать повторную загрузку.

Поведение при перезагрузке

При перезагрузке FreeMinecraftModels:

  • повторно прогоняет шаг импорта контента
  • пересобирает папку output/FreeMinecraftModels
  • пересоздаёт output/FreeMinecraftModels.zip
  • вызывает resourcepackmanager reload, если установлен ResourcePackManager

Именно поэтому современные связки FMM + ResourcePackManager больше не требуют ручного копирования zip.

После успешной перестройки вызывается FmmReloadedEvent. Экспорт Bedrock сначала проверяет модели и пропускает сущности без текстур, а не публикует неполную геометрию.