Вывод ресурс-пака FreeMinecraftModels
FreeMinecraftModels сейчас пишет сгенерированный пак в папку output, а не outputs.
Пути вывода по умолчанию
Плагин пересобирает эту папку при старте и при /fmm reload:
plugins/FreeMinecraftModels/output/FreeMinecraftModels
После этого он упаковывает её в:
plugins/FreeMinecraftModels/output/FreeMinecraftModels.zip
Именно этот путь к zip ожидает ResourcePackManager при интеграции с FreeMinecraftModels.
Что генерируется
Сгенерированная папка всегда содержит:
pack.mcmetapack.pngassets/minecraft/atlases/blocks.jsonassets/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.0x2.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 граней ограничиваются собственными пиксельными границами исходной текстуры (
0–textureWidth/0–textureHeight), прежде чем масштабироваться в 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 сначала проверяет модели и пропускает сущности без текстур, а не публикует неполную геометрию.