Собственная анимация смерти моба

Версия Minecraft
1.12.2
API
Forge
25
3
Имеется:
  • отдельный объект содержащий настройку анимации и метод для расчёта смещения частей тела моба покадрово во времени.
  • класс по типу ModelBiped для моба с изменённым методом setRotationAngles(...), в котором собственно и применяются эти изменения для частей тела.

Задача:
Применить анимацию смерти, отменив ванильную анимацию.

Проблема:
По сути при смерти моба, его отбрасывает, он краснеет и поворачивается (левым) боком к земле. Как это отменить?
  • отбрасывание я обнулил в методе onDeath(). Тупо засетил на ноль все motion;
  • краснянку отменил в рендере сущности RenderLivingBase.setBrightness(...), а имено переменная flag1;

Теперь при смерти моб тупо падает влево на землю.
Так как помимо смерти есть и другие анимации, прекрасно работающие в своих условиях, писать отдельный полный рендер для частного случая не хотелось бы.
Может есть возможность обратного перерасчёта угла поворота или хз.
Предположу, что где-то есть такая штука для всех частей тела: GlStateManager.rotate(angle, 0.0f, 0.0f, 1.0f);
да вот только где...
 
1,038
57
229
используй вектор от того кто нанёс урон до моба, это направление и будет угол.
в векторах вообще очень много вещей, время (компас, когда в играх говорят враг на 12 часов) выражают через вектора, расстояние, направление
Vector3 vec = AttackEntity.Position - Mob.Position
нормализуй и получишь направление (vec.normalize()). Наложи его на часы (циферблат) и получишь угол (Dot Product)
 
Последнее редактирование:
25
3
Объясню иначе:
Вот так моб выглядит через 20 тиков после смерти:
1695386260268.png
за эти 20 тиков смерти он наклоняется на 90 градусов влево (относительно себя самого), и похоже по синусоидальной скорости (точно не линейная).

А надо, чтобы оставался в вертикальном (обычном) состоянии.
Как говорится умер стоя :LOL:
Может эту ванильную анимацию смерти можно вообще отключить как-нибудь?
 
1,038
57
229
Как говорится умер стоя
ну если не ошибаюсь мы делали EntityDeath, corpse. А как уж он там будет выглядеть, куда падать и прочее, зависит исключительно от Вас.
Надо спавнить труп (ну мы делали чтобы его можно было залутать), либо переписывали сущность так, чтобы во время смерти он вёл себя как надо.

Может эту ванильную анимацию смерти можно вообще отключить как-нибудь?
можно, посмотрите сами. Можно даже перестать его рисовать. Событие смерти и получение урона, делайте что хотите.
 
434
41
110
Может эту ванильную анимацию смерти можно вообще отключить как-нибудь?
Возможно сработает такой костыль как
1) При нанесении смертельного урона отменить урон и сделать сущность неуязвимой (+ доп инфа при сохранении сущности, или просто запретить)
2) Проиграть нужную анимацию
3) Пометить сущность как мертвую а после удалить из мира (World#removeEntity)

+ Есть такое поле EntityLivingBase#deathTime, проверь его истинное назначение (возможно это то что тебе нужно)

UPD
Предположу, что где-то есть такая штука для всех частей тела: GlStateManager.rotate(angle, 0.0f, 0.0f, 1.0f);
да вот только где...
RenderLivingBase#applyRotations
 
Последнее редактирование:
25
3
1 - Создавать отдельную сущность, как копию текущей только для одной анимации и писать для неё отдельный рендер - мощный костыль. Думаю он хорошо подходит для лутинга трупа, возможно сделаю потом так же :)

2 - Что касается RenderLivingBase.applyRotations(); гениально! Я оказался слеп и даже не заметил такой очевидный метод. Именно там и идёт этот поворот по квадратной скорости. Я просто переписал этот метод в своём рендере, отменив поворот для случаев когда есть анимация смерти.
Очень не хотелось бы изменять значение времени смерти EntityLivingBase.deathTime - так как от него работает несколько других механик.

Спасибо. В совокупности всего что тут есть: Проблема решена!
 
Сверху