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

Частицы FreeMinecraftModels

FreeMinecraftModels воспроизводит ключевые кадры частиц из анимаций модели Blockbench. Это относится к пользовательским сущностям, реквизиту и предметам в руке. Игроки Java видят частицы как спрайты, существующие только в пакетах, которые FMM симулирует на сервере. Игроки Bedrock получают исходный эффект Snowstorm, который отрисовывает их собственный клиент.

Имена анимаций и правила воспроизведения описаны в разделе Анимации. О локаторах и остальных требованиях импорта см. Заметки по созданию моделей.

Создание в Blockbench​

  1. Создайте эффект в редакторе частиц Blockbench (Snowstorm) и сохраните его как файл частиц .json.
  2. Добавьте в модель локатор в том месте, откуда должен исходить эффект. Локатор внутри кости движется вместе с анимацией этой кости, поэтому локатор на вращающейся руке оставляет след вдоль её траектории.
  3. В анимации откройте аниматор Effects и добавьте ключевой кадр particle. Укажите имя эффекта, локатор и файл частиц. Необязательное поле скрипта выполняется как Molang перед запуском эффекта, например v.size = 2;.
  4. Положите файл частиц и PNG его текстуры рядом с .bbmodel (или в папку particles/ рядом с ним) и поставляйте их вместе с моделью.

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

Где FMM ищет файлы частиц​

Blockbench сохраняет только локальный путь автора к файлу частиц, поэтому FMM ищет по имени файла. Для каждого эффекта он пробует по порядку следующие варианты — сначала в папке модели, затем в папке particles/ рядом с ней:

  1. Имя файла, сохранённое в ключевом кадре
  2. <effect>.particle.json
  3. <effect>.json

.json, не являющийся файлом частиц (например, модель отображения с тем же именем, что и эффект), пропускается. Если ничего не найдено, консоль сообщает Particle effect '<effect>' used by animation '<animation>' in <model> was not found, эти ключевые кадры отбрасываются, а остальная модель загружается как обычно.

Текстуры​

basic_render_parameters.texture файла частиц сопоставляется по последнему сегменту пути: textures/particle/spark означает, что FMM ищет spark.png — сначала рядом с файлом частиц, затем рядом с моделью, затем в папке particles/ модели.

Если PNG отсутствует, игроки Java видят простые белые спрайты, окрашенные в цвет эффекта, а консоль выводит предупреждение. Bedrock сохраняет исходный путь текстуры, поэтому ванильная текстура Bedrock, например textures/blocks/wool_colored_white, там по-прежнему работает. Чтобы на Java был тот же вид, поставляйте PNG с соответствующим именем.

Когда воспроизводятся эффекты​

  • Эффект запускается, когда его анимация доходит до ключевого кадра. В зацикленной анимации ключевой кадр срабатывает на каждом цикле, и его эмиттер перезапускается.
  • Когда анимация останавливается или сменяется, зацикленные эмиттеры перестают создавать частицы. Частицы, уже находящиеся в воздухе, доживают свой срок.
  • Эмиттеры приостанавливаются, пока ни один игрок Java не видит модель. filmicMode сохраняет видимость всех загруженных моделей, поэтому их частицы тоже продолжают работать.
  • Удаление модели сразу удаляет её эмиттеры и все спрайты частиц. Это касается смерти, деспавна, выгрузки чанка и /fmm deleteall.

Реквизит​

Реквизит сам по себе воспроизводит только idle. Поместите ключевые кадры частиц в idle или запускайте анимацию с ними из Lua-скрипта реквизита:

context.prop:play_animation("sparkle", true, true)

Предметы в руке​

Частицы также воспроизводятся на пользовательских предметах FMM, то есть на предметах, выданных через /fmm giveitem или меню администратора. В модели предмета должны быть ключевые кадры частиц. FMM читает преобразования thirdperson_righthand и thirdperson_lefthand его модели отображения (сопутствующего .json), чтобы определить, где предмет находится в руке. Без модели отображения Java размещает частицы так, будто у предмета нет преобразования отображения, а Bedrock не получает частиц для предмета в руке.

  • FMM циклически воспроизводит анимацию модели held, пока предмет находится в любой руке. Если анимации held с ключевыми кадрами частиц нет, используется первая по имени анимация, в которой они есть.
  • Кости на предмете в руке не анимируются. Локаторы остаются на предмете в положении покоя.
  • Java: сервер не может знать, находится ли игрок от первого лица, от третьего лица или в режиме фронтальной камеры. FMM размещает частицы на кончике предмета в позе от третьего лица, исходя из поворота тела держащего, приседания, руки, в которой находится предмет, его атрибута scale и преобразований модели отображения. Все игроки Java, включая держащего, видят частицы в этой одной позиции. От первого лица держащий видит их там, где находится его рука в виде от третьего лица, а не на предмете в виде от первого лица. Взмахи руки и позы использования предмета не отслеживаются, поэтому при движении руки частицы могут немного отставать от предмета. Частицы видят игроки Java в пределах 48 блоков от держащего.
  • Bedrock: частицы добавляются в attachable предмета для Bedrock, и клиент Bedrock отрисовывает их на настоящей руке при любом виде камеры. Для этого нужна конвертация Bedrock в ResourcePackManager.

Отрисовка на Java​

  • Каждая частица — это пакетная сущность item_display. Она никогда не существует в мире, поэтому другие плагины не могут её ударить, сохранить или удалить.
  • FMM перемещает частицы каждые 2 тика, а клиент сглаживает движение между ними.
  • UV-выражения при загрузке сэмплируются максимум в 16 вариантов текстуры на эффект, и каждый кадр flipbook каждого варианта становится отдельным спрайтом. Эти спрайты попадают в ресурс-пак в assets/freeminecraftmodels/items/particle/<model>/<effect>/, а их текстура — в textures/entity/fmm_particles/<model>/<effect>.png. FMM также записывает assets/freeminecraftmodels/rspm_item_java_only/particle/<model>/<effect>.json, который сообщает ResourcePackManager, что предметы-спрайты не нужно превращать в пользовательские предметы Bedrock.
  • Частицы отрисовываются с полной яркостью, если у эффекта нет minecraft:particle_appearance_lighting.
  • Один эффект на одной модели показывает не более maxParticlesPerEmitter частиц или собственного max_particles файла, если он меньше. Одному игроку Java показывается не более maxParticlesPerViewer частиц для всех моделей вместе. После этого предела новые частицы для этого игрока пропускаются, пока не исчезнут старые.
  • particleEffectsEnabled: false отключает все эффекты без редактирования моделей.

Компоненты, поддерживаемые на Java​

КомпонентПоддержка на Java
emitter_rate_instant, emitter_rate_steadyПолная
emitter_lifetime_once, emitter_lifetime_looping, emitter_lifetime_expressionПолная
emitter_initializationВыражения при создании и при каждом обновлении
emitter_local_spaceПозиция и поворот
emitter_shape_point, _sphere, _box, _disc, _customСмещение, радиус, половинные размеры, нормаль плоскости, surface_only, а также направление outwards, inwards или пользовательское
particle_initializationВыражения при каждом обновлении и при каждой отрисовке
particle_initial_speed, particle_initial_spinПолная
particle_motion_dynamicЛинейное ускорение и сопротивление, ускорение и сопротивление вращения
particle_lifetime_expressionmax_lifetime и expiration_expression
particle_appearance_billboardРазмер, режим ориентации, направление и UV, включая flipbook
particle_appearance_tintingФиксированные цвета, выражения по каналам и градиенты
particle_appearance_lightingОтключает полную яркость по умолчанию

Другие компоненты на Java игнорируются, например particle_motion_parametric, particle_motion_collision, emitter_rate_manual и emitter_shape_entity_aabb. Консоль перечисляет их по именам при загрузке модели. Игроки Bedrock по-прежнему видят эффект полностью.

Режимы ориентации отображаются на billboard display-сущностей. rotate_xyz, lookat_xyz и lookat_direction поворачиваются к камере. rotate_y и lookat_y поворачиваются только вокруг вертикальной оси. direction_x, direction_y, direction_z и режимы emitter_transform_* сохраняют фиксированную ориентацию по направлению частицы или повороту эмиттера.

Molang​

Выражения поддерживают арифметику, сравнения, ?:, ??, присваивания и return. Математические функции:

abs, acos, asin, atan, atan2, ceil, clamp, cos, die_roll, die_roll_integer, exp, floor, hermite_blend, lerp, lerprotate, ln, max, min, mod, pow, random, random_integer, round, sin, sqrt, trunc и константа math.pi.

Тригонометрия работает в градусах, как в Bedrock. Встроенные переменные:

  • variable.particle_age, variable.particle_lifetime, variable.particle_random_1–_4
  • variable.emitter_age, variable.emitter_lifetime, variable.emitter_random_1–_4

Ваши собственные переменные v. из выражений инициализации и скриптов ключевых кадров работают, как и кривые (linear, catmull_rom, bezier, bezier_chain). Неизвестные переменные и запросы читаются как 0.

Bedrock​

При включённом sendCustomModelsToBedrockClientsV2 комплект Bedrock содержит каждый эффект как particles/<model>_<effect>.json с идентификатором fmm:<model>_<effect>. Он также содержит текстуру частиц, локаторы на костях геометрии и ключевые кадры частиц в анимациях Bedrock. Затем клиенты Bedrock воспроизводят эффект нативно, включая компоненты, которые Java пропускает.

Для предметов в руке FMM записывает assets/freeminecraftmodels/rspm_item_particles/display/<item>.json в свой Java-вывод. ResourcePackManager читает его при конвертации предмета и добавляет локаторы и зацикленную анимацию частиц в attachable предмета.

Устранение неполадок​

Particle effect '<effect>' ... was not found. FMM не смог найти файл частиц. Положите его рядом с моделью как <effect>.json или <effect>.particle.json либо под именем файла, сохранённым в ключевом кадре. См. Где FMM ищет файлы частиц.

... uses <components>, which Java players do not see yet. Это информационное сообщение. Java воспроизводит всё остальное в эффекте, а Bedrock — эффект целиком.

... uses texture '<path>', which is not next to <file>. Положите PNG текстуры рядом с файлом частиц и назовите его по последнему сегменту этого пути.

... follows locator '<name>', which the model does not have. Локатор был переименован или удалён. Эффект воспроизводится в начале координат модели, пока ключевой кадр не укажет существующий локатор.

Частицы моего реквизита никогда не появляются. Реквизит сам по себе воспроизводит только idle. Перенесите ключевые кадры в idle или запускайте анимацию из скрипта.

Частицы предмета в руке отлетают от предмета при виде от первого лица. На Java это ожидаемо. Сервер размещает их у руки в виде от третьего лица. Другие игроки и вид от третьего лица видят их на предмете.

Предмет в руке не показывает частиц. Предмет должен быть пользовательским предметом FMM (с fmm_item_id), и в одной из анимаций его модели должны быть ключевые кадры частиц, файлы которых FMM нашёл.