Файл поведения решает, что моб делает. Файл клиентской сущности решает, как он выглядит: какая у него модель, скин, анимации и как выглядит его яйцо призыва. Этот файл живёт в пакете ресурсов.
Представь его как список коротких прозвищ. Здесь ты даёшь каждой модели, текстуре и анимации короткое имя, а остальные файлы пакета ресурсов используют эти имена.
Файлы
RP/
entity/
ruby_golem.entity.json
models/
entity/
ruby_golem.geo.json
textures/
entity/
ruby_golem.png
ruby_golem_angry.png
animations/
ruby_golem.animation.json
animation_controllers/
ruby_golem.animation_controllers.json
render_controllers/
ruby_golem.render_controllers.jsonОбязательны только файл в entity, модель и текстура. Остальные необязательны: вместо своих анимаций и контроллеров рендера можно взять ванильные.
Название файла может быть любым. С пакетом поведения его связывает identifier.
Полный пример
Вот клиентский файл для рубинового голема из гайда Файл сущности. Он показывает злую текстуру, когда свойство голема wiki:mood равно angry.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "wiki:ruby_golem",
"materials": {
"default": "entity_alphatest"
},
"textures": {
"default": "textures/entity/ruby_golem",
"angry": "textures/entity/ruby_golem_angry"
},
"geometry": {
"default": "geometry.wiki.ruby_golem"
},
"animations": {
"walk": "animation.wiki.ruby_golem.walk",
"attack": "animation.wiki.ruby_golem.attack",
"look_at_target": "animation.common.look_at_target",
"attack_controller": "controller.animation.wiki.ruby_golem.attack"
},
"scripts": {
"scale": "1.2",
"animate": [
{ "walk": "q.modified_move_speed" },
"look_at_target",
"attack_controller"
]
},
"render_controllers": ["controller.render.wiki.ruby_golem"],
"spawn_egg": {
"base_color": "#9b111e",
"overlay_color": "#f4c2c2"
}
}
}
}Большинство ванильных клиентских файлов используют "format_version": "1.10.0", и для твоего это тоже хороший выбор. Дальше на странице разбирается каждое поле.
identifier
ID моба, в точности как в пакете поведения: wiki:ruby_golem. Если они не совпадают, моб будет невидимым.
materials
Материал говорит игре, как рисовать пиксели: непрозрачными, прозрачными, светящимися и так далее. Ты выбираешь из материалов, которые уже есть в игре, и даёшь каждому короткое имя.
"materials": {
"default": "entity_alphatest",
"glow": "entity_emissive_alpha"
}| Материал | Для чего |
|---|---|
entity | Полностью непрозрачные скины без прозрачных пикселей |
entity_alphatest | Скины с полностью прозрачными дырками. Самый надёжный вариант по умолчанию. |
entity_alphablend | Полупрозрачные пиксели, как у стекла или слизня |
entity_emissive_alpha | Части, которые светятся в темноте, задаются альфа-каналом текстуры |
У многих ванильных мобов есть материалы, названные в их честь (pig, iron_golem). Они настроены под одного моба, так что для своего моба используй общие entity....
textures
Короткие имена для каждого скина. Пути начинаются от корня пакета ресурсов и пишутся без .png.
"textures": {
"default": "textures/entity/ruby_golem",
"angry": "textures/entity/ruby_golem_angry"
}Можно указать сколько угодно. Какой из них показывается, решает контроллер рендера. Советы по рисованию скинов - в гайде Пиксельные текстуры.
geometry
Короткие имена для каждой модели. Значение - это identifier, записанный внутри файла .geo.json, а не название файла.
"geometry": {
"default": "geometry.wiki.ruby_golem"
}У моба может быть несколько моделей. Например, у ванильной курицы есть обычная, холодная и детская модель.
animations
Короткие имена для анимаций и контроллеров анимаций. Свои можно смешивать с ванильными.
"animations": {
"walk": "animation.wiki.ruby_golem.walk",
"look_at_target": "animation.common.look_at_target",
"attack_controller": "controller.animation.wiki.ruby_golem.attack"
}Просто дать им имена недостаточно: они играют, только если указаны в scripts.animate (ниже) или запущены контроллером анимаций.
Полезные ванильные анимации, которые можно позаимствовать, если у твоих костей подходящие названия:
| Анимация | Что двигает | Какие кости нужны |
|---|---|---|
animation.common.look_at_target | Голову в сторону того, на что смотрит моб | head |
animation.quadruped.walk | Четыре ноги при ходьбе | от leg0 до leg3 |
animation.humanoid.move | Руки и ноги при ходьбе | leftarm, rightarm, leftleg, rightleg |
animation_controllers
В старых клиентских файлах контроллеры перечисляются в отдельном массиве, а не в animations:
"animation_controllers": [
{ "attack": "controller.animation.wiki.ruby_golem.attack" }
]Каждая запись - объект с одним коротким именем. Перечисленные здесь контроллеры работают сами, без scripts.animate. С format_version 1.10.0 и новее обычно контроллеры кладут в animations и запускают из scripts.animate, как в полном примере.
render_controllers
Контроллер рендера выбирает, какую геометрию, текстуру и материал рисовать. В списке их может быть несколько, и рисуются все.
"render_controllers": ["controller.render.wiki.ruby_golem"]Для моба с одной моделью, одним скином и одним материалом свой контроллер не нужен. Ванильный controller.render.default рисует те, что называются default. Чтобы менять текстуры, напиши небольшой контроллер сам:
{
"format_version": "1.8.0",
"render_controllers": {
"controller.render.wiki.ruby_golem": {
"geometry": "Geometry.default",
"materials": [{ "*": "Material.default" }],
"textures": [
"q.property('wiki:mood') == 'angry' ? Texture.angry : Texture.default"
]
}
}
}Geometry.default, Material.default и Texture.angry ссылаются на короткие имена из клиентского файла. * в materials значит "все кости". Строка текстуры - это вопрос на Molang: злые големы получают злой скин.
Это работает только потому, что у свойства в пакете поведения стоит "client_sync": true. Без него пакет ресурсов не видит значение.
Ещё можно включать и выключать целый контроллер рендера условием на Molang. Так ванильные криперы делают своё свечение при заряде:
"render_controllers": [
"controller.render.wiki.ruby_golem",
{ "controller.render.wiki.ruby_golem_glow": "q.property('wiki:mood') == 'angry'" }
]scripts
В scripts лежат небольшие кусочки Molang, которые выполняются на устройстве игрока.
| Скрипт | Когда выполняется | Для чего |
|---|---|---|
initialize | Один раз, когда моб впервые появляется | Задать начальные значения переменных |
pre_animation | Каждый кадр, перед анимациями | Вычислить значения, нужные анимациям |
animate | Каждый кадр | Какие анимации и контроллеры проигрывать |
scale | Каждый кадр | Увеличить или уменьшить всю модель |
variables | Не скрипт, а список | Пометить переменные как public, чтобы их могли читать attachable |
animate
Каждая запись - короткое имя из animations. Оберни его в объект, чтобы проигрывать с силой от 0 до 1:
"animate": [
{ "walk": "q.modified_move_speed" },
"look_at_target",
"attack_controller"
]walk играет сильнее, чем быстрее движется голем, и останавливается, когда он стоит. look_at_target играет всегда.
scale
"scale": "q.is_baby ? 0.5 : 1.2"Это меняет только то, как моб выглядит. Его хитбокс, заданный в пакете поведения, остаётся прежнего размера. Ванильные летучие мыши используют "0.35", чтобы уменьшить свою модель.
pre_animation
"pre_animation": [
"v.is_angry = q.property('wiki:mood') == 'angry';"
]Вычисли значение здесь один раз и используй v.is_angry во многих анимациях, вместо того чтобы везде повторять одно и то же длинное выражение.
spawn_egg
Без spawn_egg у моба нет яйца в творческом инвентаре. Сделать его можно двумя способами.
Два цвета. Игра рисует стандартное яйцо с цветом фона и пятнами:
"spawn_egg": {
"base_color": "#9b111e",
"overlay_color": "#f4c2c2"
}Своя картинка. Используй короткое имя из item_texture.json, как для иконки предмета (смотри Текстуры предметов):
"spawn_egg": {
"texture": "wiki_ruby_golem_egg"
}Если у этого короткого имени список из нескольких текстур, добавь "texture_index", чтобы выбрать одну. Отсчёт идёт с 0. Ещё яйцу нужен "is_spawnable": true в пакете поведения и название в lang-файле:
entity.wiki:ruby_golem.name=Ruby Golem
item.spawn_egg.entity.wiki:ruby_golem.name=Ruby Golem Spawn EggДругие поля
| Поле | Что делает |
|---|---|
enable_attachables | true показывает на мобе броню и предметы в руках с помощью attachable |
hide_armor | true скрывает любую броню на мобе |
held_item_ignores_lighting | true рисует предметы в руках полностью освещёнными, даже в темноте |
locators | Именованные точки на модели, например куда крепится поводок |
particle_effects | Короткие имена для частиц, чтобы использовать их в анимациях |
sound_effects | Короткие имена для звуков, чтобы использовать их в анимациях |
min_engine_version | Загружать этот файл, только если пакет рассчитан на эту версию игры или новее |
Если что-то не работает
| Что ты видишь | Скорее всего, причина |
|---|---|
| Моб невидим, видна только тень | identifier не совпадает с пакетом поведения, или неверное название геометрии |
| Фиолетово-чёрная клетка | Неверный путь к текстуре, или он заканчивается на .png |
| Дырки чёрные, а не прозрачные | Используй entity_alphatest вместо entity |
| Анимация никогда не играет | Она есть в animations, но не в scripts.animate и не в контроллере |
| Нет яйца призыва | Нет spawn_egg, или в пакете поведения is_spawnable равен false |
| Текстура никогда не меняется | У свойства нет "client_sync": true |
Больше помощи в гайде Когда что-то сломалось. Полный разбор создания моба - в гайде Твой первый моб.