Преобразование Java в Bedrock
ResourcePackManager может преобразовать собранный Java-пак ресурсов в ресурс-пак Bedrock, чтобы клиенты GeyserMC видели то же пользовательское содержимое, что и клиенты Java. По умолчанию эта функция включена.
Что преобразуется
Конвертер больше не ограничен только FreeMinecraftModels. Он последовательно запускает два конвейера по собранному Java-паку:
- Сканер костей FreeMinecraftModels — забирает костные модели FMM в
assets/freeminecraftmodels/models/и преобразует каждую кость в Bedrock attachable. - Универсальный конвейер определений предметов — обходит каждый файл
assets/<namespace>/items/*.jsonв формате 1.21.4+ (пропуская пространства имёнminecraftиfreeminecraftmodels). Для каждой листовой модели он либо:- выдаёт плоскую иконку инвентаря Bedrock (для обычных
minecraft:item/generatedи подобных flat-builtin родителей), либо - выдаёт Bedrock-геометрию, attachable, файл анимации и программно отрендеренную 2D-иконку инвентаря (для настоящих 3D-моделей).
- выдаёт плоскую иконку инвентаря Bedrock (для обычных
Уникальный Bedrock-идентификатор генерируется для каждой пары (модель × базовый предмет), поэтому, например, одна модель меча, зарегистрированная для нескольких базовых предметов, не конфликтует на стороне Geyser.
Кастомные комплекты брони обнаруживаются при наличии соседнего файла assets/<namespace>/equipment/<material>.json. Конвертер собирает броневый attachable, который комбинирует ванильную геометрию брони с Java-текстурой в качестве видимого слоя, поэтому игроки Bedrock видят правильную текстуру брони при её ношении.
UUID манифеста Bedrock-пака детерминированно выводится из имени пака, поэтому остаётся стабильным между сборками; обновляется только тройка версии при каждой сборке (cache-bust токен, выводимый из времени сборки).
Посессионная живая раздача
Когда обнаружен Geyser-Spigot, ResourcePackManager регистрирует подписчика на SessionLoadResourcePacksEvent. Каждый игрок Bedrock, подключающийся после свежей сборки, получает последний Bedrock-пак, раздаваемый прямо с диска, — перезапуск сервера для правок текстур или моделей не нужен.
Маппинги кастомных предметов Geyser (JSON в custom_mappings/) по-прежнему «замораживаются» при загрузке, поэтому добавление новых или удаление существующих кастомных предметов требует перезапуска сервера, прежде чем клиенты Bedrock увидят эти изменения. RSPM заранее раскладывает файл маппингов от предыдущего запуска на ранней стадии старта, чтобы регистрация кастомных предметов Geyser при загрузке автоматически его подхватила.
Игроки Bedrock, уже подключённые в момент пересборки, остаются с тем паком, который получили на своём входе, — это ограничение Bedrock-протокола, плагин не может его переопределить посреди сессии.
Выходные файлы
После успешной сборки файлы Bedrock находятся в:
plugins/ResourcePackManager/output/ResourcePackManager_Bedrock.zip
plugins/ResourcePackManager/output/rspm_geyser_mappings.json
Если авто-развёртывание включено и Geyser обнаружен, файл маппингов также копируется в:
<geyser-folder>/custom_mappings/rspm_geyser_mappings.json
Сам zip Bedrock-пака не копируется в <geyser-folder>/packs/ — вместо этого он раздаётся вживую посессионно. RSPM также удаляет любую устаревшую копию, оставленную старыми версиями плагина в этой папке, чтобы Geyser в итоге не раздавал пак дважды (дублирующиеся UUID путали бы Bedrock-клиент).
Настройки в config.yml
# Полностью включает/выключает преобразование Java в Bedrock.
bedrockConversionEnabled: true
# Копирует файл кастомных маппингов Geyser в обнаруженную папку Geyser в
# каталог custom_mappings/ при каждой сборке.
bedrockAutoDeployToGeyser: true
# Ручное переопределение для папки данных Geyser. Пусто = авто-определение.
# Может быть абсолютным или относительным к каталогу plugins/.
bedrockGeyserFolder: ""
Авто-определение проверяет, по порядку:
bedrockGeyserFolder, если задан (рассматривается сначала как абсолютный путь, затем как путь относительноplugins/).plugins/Geyser-Spigot/plugins/Geyser-*/(любой вариант)config/Geyser-*/(для установок Fabric/NeoForge)
Настройка отображения предмета в руке: bedrock_display_offsets.yml
Bedrock рендерит предмет в руке через родительскую кость, чьи rest-позы отличаются от Java-трансформаций от первого/третьего лица, поэтому алгоритмическое преобразование должно применять базовое смещение поверх того, что задаёт Java-модельная трансформация display. Значения по умолчанию подходят для типичных праворуких Java-моделей, но в нестандартных случаях может потребоваться настройка.
Виды от первого и третьего лица — это два полностью отдельных Bedrock-прохода рендеринга (разные родительские кости, разные rest-позы), поэтому у каждого есть свой независимый набор из шести параметров. Настройка одного не влияет на другой.
# ===== Вид от первого лица (правая рука, видит держащий) =====
firstPersonBaseRotationX: -90.0 # тангаж (наклон к/от камеры). По умолчанию отменяет родительский поворот.
firstPersonBaseRotationY: 0.0 # рыскание (вращение вокруг вертикальной оси)
firstPersonBaseRotationZ: 0.0 # крен (вокруг оси «вперёд от камеры»)
firstPersonBasePositionX: 0.0 # вертикаль на экране (положительное = вверх)
firstPersonBasePositionY: 12.5 # глубина (положительное = дальше в сцену)
firstPersonBasePositionZ: 0.0 # горизонталь на экране (положительное = вправо)
# ===== Вид от третьего лица (правая рука, видят другие игроки / F5) =====
thirdPersonBaseRotationX: 90.0 # тангаж, как его видят наблюдатели
thirdPersonBaseRotationY: 0.0 # рыскание
thirdPersonBaseRotationZ: 0.0 # крен вокруг длинной оси предмета
thirdPersonBasePositionX: 0.0 # горизонталь поперёк тела держащего (положительное = наружу)
thirdPersonBasePositionY: 12.5 # вертикаль (положительное = поднимает модель)
thirdPersonBasePositionZ: 0.0 # глубина относительно держащего (положительное = вперёд)
Значения позиций — в пикселях, где 1 пиксель = 1/16 блока. Повороты — в градусах.
Bedrock-клиент перечитывает JSON attachable вживую без перезапуска. Если тестовый Bedrock-клиент в игре, измените значение, выполните /rspm reload, и следующий вход с Bedrock (а в некоторых случаях тот же подключённый игрок после небольшого действия в мире, которое заново привяжет attachable) покажет новое смещение. Итерируйте, пока не будет выглядеть правильно.
Ограничения и известное поведение
- 3D-иконки инвентаря программно рендерятся из Java-модельной трансформации
display.gui. Рендер разумный, но не пиксель-в-пиксель; если иконка выглядит неправильно, самая частая причина — отсутствующая/неправильно названная текстура, на которую ссылается модель. - Flipbook-текстуры, используемые как иконки предметов, обрезаются до кадра 0 —
item_texture.jsonв Bedrock не поддерживает анимированные иконки, только анимированные текстуры блоков/террейна черезflipbook_textures.json. - Версия формата геометрии attachable зафиксирована на
1.21.0(в старых версиях плагина была1.16.0); обновите Geyser, если ваша установка не может её распарсить. - Ванильные модели предметов (
shield.json,crossbow.json) не объединяются рекурсивно между паками во избежание порчи кросс-пакового дерева предикатов; для этих двух конкретно выигрывает копия пака с наивысшим приоритетом. - Если конвертер не может разрешить файл текстуры или модели, на который есть ссылка, этот лист пропускается и записывается предупреждение
[BedrockConverter]; остальной конвейер продолжает работать.