Модель брони не двигается с игроком

Версия Minecraft
1.16.5
API
Forge
39
8
5
Сделал в Blockbench'е броню (просто куча рандомных полосок), экспортировал .java-объект и сохранил текстуру. И вроде даже рендерится на игроке, но вот проблема - моделька просто висит на месте игрока, не следуя поворотам головы, рук и ног... В чём проблема и есть ли альтернативные способы создания/подключения моделей?
Скрины:
Screenshot_465.pngScreenshot_464.png

Код модели:

Java:
public class CustomArmorModel extends BipedModel<LivingEntity> {
    private final ModelRenderer Head;
    private final ModelRenderer Body;
    private final ModelRenderer RightArm;
    private final ModelRenderer LeftArm;
    private final ModelRenderer RightLeg;
    private final ModelRenderer LeftLeg;

    public CustomArmorModel() {
        super(1);
        textureWidth = 64;
        textureHeight = 64;

        Head = new ModelRenderer(this);
        Head.setRotationPoint(0.0F, 0.0F, 0.0F);
        Head.setTextureOffset(32, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, 0.5F, false);

        Body = new ModelRenderer(this);
        Body.setRotationPoint(0.0F, 0.0F, 0.0F);
        Body.setTextureOffset(16, 32).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, 0.25F, false);
        Body.setTextureOffset(0, 0).addBox(-1.0F, 2.0F, 3.0F, 1.0F, 1.0F, 1.0F, 0.0F, false);
        Body.setTextureOffset(40, 32).addBox(-8.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false);

        RightArm = new ModelRenderer(this);
        RightArm.setRotationPoint(-5.0F, 2.0F, 0.0F);

        LeftArm = new ModelRenderer(this);
        LeftArm.setRotationPoint(5.0F, 2.0F, 0.0F);
        LeftArm.setTextureOffset(48, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false);

        RightLeg = new ModelRenderer(this);
        RightLeg.setRotationPoint(-1.9F, 12.0F, 0.0F);
        RightLeg.setTextureOffset(0, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false);

        LeftLeg = new ModelRenderer(this);
        LeftLeg.setRotationPoint(1.9F, 12.0F, 0.0F);
        LeftLeg.setTextureOffset(0, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.25F, false);
    }


    @Override
    public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){
        Head.render(matrixStack, buffer, packedLight, packedOverlay);
        Body.render(matrixStack, buffer, packedLight, packedOverlay);
        RightArm.render(matrixStack, buffer, packedLight, packedOverlay);
        LeftArm.render(matrixStack, buffer, packedLight, packedOverlay);
        RightLeg.render(matrixStack, buffer, packedLight, packedOverlay);
        LeftLeg.render(matrixStack, buffer, packedLight, packedOverlay);
    }
}
 
Решение
Спустя несколько месяцев вернулся к рендеру брони и разобрался. Собака была зарыта в том, что метод setRotationAngles вызывается чёрт знает где чёрт знает когда (если вызываются вообще), и на момент вызова render() все углы моделек равны нулям. Вывод: копировать углы с бипедов на свои модельки надо прямо в рендере. И вот ещё: всё, что делает a.addChild(b) - после отрисовки компонента a будет отрисован компонент b. Казалось бы, привяжи свои модели к бипедным и вызывай super.render(), но нет. Родительский рендер чё-то там портит в буфере отрисовки, и мои компоненты уже накладываются вкривь и вкось. Так что вот моё финальное рабочее решение:
Java:
public class CustomArmorModel extends BipedModel<LivingEntity> {
    private final ModelRenderer...
7,099
324
1,510
Видимо, тутор на все времена:
1624359960957.png
 
4,045
63
645
А я говорил, говорил! В 1.16.5 бронька сломана!
А никто мне не верил...
Не вызывается ваш этот ротейтАнглес. Можно даже через консоль проверить...
...
Я тупо привязал свои модели к моделям из бипета по типу head.addChild(mask);
Но это, конечно, половинчатое решение...
Где-то в фордже явно косяк.
 
Последнее редактирование:
205
12
103
Эм... А где ты нашёл метод render в предмете?
В моём случае это расширение интерфейса ICurioItem, метод идет от него и просто пихает в свой слой эту модель.

В случае с броней можно регать свой слой, а можно накатить весь рендер на RenderPlayerEvent, и с него уже рисовать. Мне свои слои полноценно делать было лень, потому я рендерил через ивент. Там же вся математика на поворот, ибо модель эта физически не регистрируется и зааттачить её нельзя. Смотреть тут: SSKirillSS/relics

Я сейчас плавно переписываю все предметы, которые давно делал, попутно исправляя все косяки. Когда буду переписывать этот - перенесу на бипед, можешь тогда посмотреть.
 
39
8
5
Спустя несколько месяцев вернулся к рендеру брони и разобрался. Собака была зарыта в том, что метод setRotationAngles вызывается чёрт знает где чёрт знает когда (если вызываются вообще), и на момент вызова render() все углы моделек равны нулям. Вывод: копировать углы с бипедов на свои модельки надо прямо в рендере. И вот ещё: всё, что делает a.addChild(b) - после отрисовки компонента a будет отрисован компонент b. Казалось бы, привяжи свои модели к бипедным и вызывай super.render(), но нет. Родительский рендер чё-то там портит в буфере отрисовки, и мои компоненты уже накладываются вкривь и вкось. Так что вот моё финальное рабочее решение:
Java:
public class CustomArmorModel extends BipedModel<LivingEntity> {
    private final ModelRenderer Head;
    private final ModelRenderer Body;
    private final ModelRenderer RightArm;
    private final ModelRenderer LeftArm;
    private final ModelRenderer RightLeg;
    private final ModelRenderer LeftLeg;
    public CustomArmorModel() {
        super(1);
        textureWidth = 64;
        textureHeight = 64;

        Head = new ModelRenderer(this);
        Head.setRotationPoint(0.0F, 0.0F, 0.0F);
        Head.setTextureOffset(0, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, 0.0F, false);

        Body = new ModelRenderer(this);
        Body.setRotationPoint(0.0F, 0.0F, 0.0F);
        Body.setTextureOffset(0, 16).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, 0.0F, false);

        RightArm = new ModelRenderer(this);
        RightArm.setRotationPoint(-5.0F, 2.0F, 0.0F);
        RightArm.setTextureOffset(16, 32).addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.0F, false);

        LeftArm = new ModelRenderer(this);
        LeftArm.setRotationPoint(5.0F, 2.0F, 0.0F);
        LeftArm.setTextureOffset(32, 0).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.0F, false);

        RightLeg = new ModelRenderer(this);
        RightLeg.setRotationPoint(-1.9F, 12.0F, 0.0F);
        RightLeg.setTextureOffset(0, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.0F, false);

        LeftLeg = new ModelRenderer(this);
        LeftLeg.setRotationPoint(1.9F, 12.0F, 0.0F);
        LeftLeg.setTextureOffset(24, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, 0.0F, false);
    }

    @Override
    public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){
        Head.copyModelAngles(bipedHead);
        Body.copyModelAngles(bipedBody);
        RightArm.copyModelAngles(bipedRightArm);
        LeftArm.copyModelAngles(bipedLeftArm);
        LeftLeg.copyModelAngles(bipedLeftLeg);
        RightLeg.copyModelAngles(bipedRightLeg);
        if (bipedHead.showModel) { //helm equipped
            Head.render(matrixStack, buffer, packedLight, packedOverlay);
        }
        if (bipedBody.showModel){  //chest equipped
            Body.render(matrixStack, buffer, packedLight, packedOverlay);
            LeftArm.render(matrixStack, buffer, packedLight, packedOverlay);
            RightArm.render(matrixStack, buffer, packedLight, packedOverlay);
        }
        if (bipedLeftLeg.showModel){  //leggings equipped
            LeftLeg.render(matrixStack, buffer, packedLight, packedOverlay);
            RightLeg.render(matrixStack, buffer, packedLight, packedOverlay);
        }
    }
}
 
Сверху