1. Вики
  2. /Сущности
  3. /Файл клиентской сущности

Файл клиентской сущности

Сторона пакета ресурсов для моба Bedrock: файл клиентской сущности с материалами, текстурами, геометрией, анимациями, контроллерами рендера, скриптами и яйцом призыва.

Файл поведения решает, что моб делает. Файл клиентской сущности решает, как он выглядит: какая у него модель, скин, анимации и как выглядит его яйцо призыва. Этот файл живёт в пакете ресурсов.

Представь его как список коротких прозвищ. Здесь ты даёшь каждой модели, текстуре и анимации короткое имя, а остальные файлы пакета ресурсов используют эти имена.

Файлы

Пакет ресурсов
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.

RP/entity/ruby_golem.entity.json
{
  "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

Материал говорит игре, как рисовать пиксели: непрозрачными, прозрачными, светящимися и так далее. Ты выбираешь из материалов, которые уже есть в игре, и даёшь каждому короткое имя.

RP/entity/ruby_golem.entity.json (description)
"materials": {
  "default": "entity_alphatest",
  "glow": "entity_emissive_alpha"
}
МатериалДля чего
entityПолностью непрозрачные скины без прозрачных пикселей
entity_alphatestСкины с полностью прозрачными дырками. Самый надёжный вариант по умолчанию.
entity_alphablendПолупрозрачные пиксели, как у стекла или слизня
entity_emissive_alphaЧасти, которые светятся в темноте, задаются альфа-каналом текстуры

У многих ванильных мобов есть материалы, названные в их честь (pig, iron_golem). Они настроены под одного моба, так что для своего моба используй общие entity....

textures

Короткие имена для каждого скина. Пути начинаются от корня пакета ресурсов и пишутся без .png.

RP/entity/ruby_golem.entity.json (description)
"textures": {
  "default": "textures/entity/ruby_golem",
  "angry": "textures/entity/ruby_golem_angry"
}

Можно указать сколько угодно. Какой из них показывается, решает контроллер рендера. Советы по рисованию скинов - в гайде Пиксельные текстуры.

geometry

Короткие имена для каждой модели. Значение - это identifier, записанный внутри файла .geo.json, а не название файла.

RP/entity/ruby_golem.entity.json (description)
"geometry": {
  "default": "geometry.wiki.ruby_golem"
}

У моба может быть несколько моделей. Например, у ванильной курицы есть обычная, холодная и детская модель.

animations

Короткие имена для анимаций и контроллеров анимаций. Свои можно смешивать с ванильными.

RP/entity/ruby_golem.entity.json (description)
"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

Контроллер рендера выбирает, какую геометрию, текстуру и материал рисовать. В списке их может быть несколько, и рисуются все.

RP/entity/ruby_golem.entity.json (description)
"render_controllers": ["controller.render.wiki.ruby_golem"]

Для моба с одной моделью, одним скином и одним материалом свой контроллер не нужен. Ванильный controller.render.default рисует те, что называются default. Чтобы менять текстуры, напиши небольшой контроллер сам:

RP/render_controllers/ruby_golem.render_controllers.json
{
  "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:

RP/entity/ruby_golem.entity.json (scripts)
"animate": [
  { "walk": "q.modified_move_speed" },
  "look_at_target",
  "attack_controller"
]

walk играет сильнее, чем быстрее движется голем, и останавливается, когда он стоит. look_at_target играет всегда.

scale

RP/entity/ruby_golem.entity.json (scripts)
"scale": "q.is_baby ? 0.5 : 1.2"

Это меняет только то, как моб выглядит. Его хитбокс, заданный в пакете поведения, остаётся прежнего размера. Ванильные летучие мыши используют "0.35", чтобы уменьшить свою модель.

pre_animation

RP/entity/ruby_golem.entity.json (scripts)
"pre_animation": [
  "v.is_angry = q.property('wiki:mood') == 'angry';"
]

Вычисли значение здесь один раз и используй v.is_angry во многих анимациях, вместо того чтобы везде повторять одно и то же длинное выражение.

spawn_egg

Без spawn_egg у моба нет яйца в творческом инвентаре. Сделать его можно двумя способами.

Два цвета. Игра рисует стандартное яйцо с цветом фона и пятнами:

RP/entity/ruby_golem.entity.json (description)
"spawn_egg": {
  "base_color": "#9b111e",
  "overlay_color": "#f4c2c2"
}

Своя картинка. Используй короткое имя из item_texture.json, как для иконки предмета (смотри Текстуры предметов):

RP/entity/ruby_golem.entity.json (description)
"spawn_egg": {
  "texture": "wiki_ruby_golem_egg"
}

Если у этого короткого имени список из нескольких текстур, добавь "texture_index", чтобы выбрать одну. Отсчёт идёт с 0. Ещё яйцу нужен "is_spawnable": true в пакете поведения и название в lang-файле:

RP/texts/en_US.lang
entity.wiki:ruby_golem.name=Ruby Golem
item.spawn_egg.entity.wiki:ruby_golem.name=Ruby Golem Spawn Egg

Другие поля

ПолеЧто делает
enable_attachablestrue показывает на мобе броню и предметы в руках с помощью attachable
hide_armortrue скрывает любую броню на мобе
held_item_ignores_lightingtrue рисует предметы в руках полностью освещёнными, даже в темноте
locatorsИменованные точки на модели, например куда крепится поводок
particle_effectsКороткие имена для частиц, чтобы использовать их в анимациях
sound_effectsКороткие имена для звуков, чтобы использовать их в анимациях
min_engine_versionЗагружать этот файл, только если пакет рассчитан на эту версию игры или новее

Если что-то не работает

Что ты видишьСкорее всего, причина
Моб невидим, видна только теньidentifier не совпадает с пакетом поведения, или неверное название геометрии
Фиолетово-чёрная клеткаНеверный путь к текстуре, или он заканчивается на .png
Дырки чёрные, а не прозрачныеИспользуй entity_alphatest вместо entity
Анимация никогда не играетОна есть в animations, но не в scripts.animate и не в контроллере
Нет яйца призываНет spawn_egg, или в пакете поведения is_spawnable равен false
Текстура никогда не меняетсяУ свойства нет "client_sync": true

Больше помощи в гайде Когда что-то сломалось. Полный разбор создания моба - в гайде Твой первый моб.

We use cookies to improve your experience and analyse site traffic. Learn more