кастомный рендер руки выглядит странно на шифте

Версия Minecraft
1.12.2
API
Forge
51
8
5
Я хотел сделать кастомный рендер для руки, чтобы от первого лица игрок видел броню на своей руке, но на шифте рука почему-то странно поворачивается. Подскажите, пожалуйста, что делать. Вот мой код
Java:
package com.nymoo.afp.common.mixin.impl;

import com.nymoo.afp.common.item.IPowerArmor;
import com.nymoo.afp.common.render.model.armor.PowerArmorModel;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHandSide;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.MathHelper;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ItemRenderer.class)
public abstract class MixinItemRenderer {
    @Inject(method = "renderArmFirstPerson", at = @At("HEAD"), cancellable = true)
    private void onRenderArmFirstPerson(float equipProgress, float swingProgress, EnumHandSide hand, CallbackInfo ci) {
        EntityPlayer player = Minecraft.getMinecraft().player;
        if (player == null) return;

        ItemStack chestplateStack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
        if (chestplateStack.isEmpty() || !(chestplateStack.getItem() instanceof IPowerArmor)) return;

        // Кастомный рендер руки силовой брони
        boolean flag = hand == EnumHandSide.RIGHT;
        float f = flag ? 1.0F : -1.0F;
        float f1 = MathHelper.sqrt(swingProgress);
        float f2 = -0.3F * MathHelper.sin(f1 * (float) Math.PI);
        float f3 = 0.4F * MathHelper.sin(f1 * ((float) Math.PI * 2F));
        float f4 = -0.4F * MathHelper.sin(swingProgress * (float) Math.PI);
        GlStateManager.translate(f * (f2 + 0.64000005F), f3 + -0.6F + equipProgress * -0.6F, f4 + -0.71999997F);
        GlStateManager.rotate(f * 45.0F, 0.0F, 1.0F, 0.0F);
        float f5 = MathHelper.sin(swingProgress * swingProgress * (float) Math.PI);
        float f6 = MathHelper.sin(f1 * (float) Math.PI);
        GlStateManager.rotate(f * f6 * 70.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(f * f5 * -20.0F, 0.0F, 0.0F, 1.0F);

        // Получение модели брони
        ModelBiped bipedModel = chestplateStack.getItem().getArmorModel(player, chestplateStack, EntityEquipmentSlot.CHEST, null);
        PowerArmorModel model = (PowerArmorModel) bipedModel;

        // Нейтральное вращение
        model.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, player);

        // Биндинг текстуры брони
        String regPath = chestplateStack.getItem().getRegistryName().getPath();
        String armorType = regPath.substring(0, regPath.length() - "_chestplate".length());
        ResourceLocation texture = new ResourceLocation("afp", "textures/armor/" + armorType + "/" + armorType + ".png");
        Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
       
        // Трансформаторы
        GlStateManager.translate(f * -1.0F, 3.6F, 3.5F);
        GlStateManager.rotate(f * 120.0F, 0.0F, 0.0F, 1.0F);
        GlStateManager.rotate(200.0F, 1.0F, 0.0F, 0.0F);
        GlStateManager.rotate(f * -135.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.translate(f * 5.6F, 0.0F, 0.0F);

        // Рендер руки
        GlStateManager.disableCull();
        GL11.glShadeModel(GL11.GL_SMOOTH);
        if (flag) {
            model.rightArm.render(0.0625F);
        } else {
            model.leftArm.render(0.0625F);
        }
        GL11.glShadeModel(GL11.GL_FLAT);
        GlStateManager.enableCull();

        ci.cancel();
    }
}

Вот как выглядит в игре
Без шифта
1755459876387.png

С шифтом
1755460072923.png
 
Решение
В целом маловероятно.

Не поможет.

Есть net.minecraftforge.client.event.RenderSpecificHandEvent он вызывается не много раньше чем renderArmFirstPerson, но в целом тоже самое.

Шота я зх. ванильные модельки рендерятся без проблем.
Посмотреть вложение 18900
Hand:
@Mod.EventBusSubscriber
public class Hand {

    @SubscribeEvent
    public static void renderHand(RenderSpecificHandEvent e) {
        AbstractClientPlayer player = Minecraft.getMinecraft().player;
        if (player == null) return;

        boolean flag1 = e.getHand() == EnumHand.MAIN_HAND;
        ItemStack stack = player.getHeldItem(e.getHand());
        if (!flag1) return;
        if (!stack.isEmpty()) return;
        if (player.isInvisible()) return;

        EnumHandSide...
Попробуй перед рендером руки model.isSneak = false; делать.
Майновские руки во так рендерятся
RenderPlayer:
    public void renderRightArm(AbstractClientPlayer clientPlayer)
    {
        float f = 1.0F;
        GlStateManager.color(1.0F, 1.0F, 1.0F);
        float f1 = 0.0625F;
        ModelPlayer modelplayer = this.getMainModel();
        this.setModelVisibilities(clientPlayer);
        GlStateManager.enableBlend();
        modelplayer.swingProgress = 0.0F;
        modelplayer.isSneak = false;
        modelplayer.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, clientPlayer);
        modelplayer.bipedRightArm.rotateAngleX = 0.0F;
        modelplayer.bipedRightArm.render(0.0625F);
        modelplayer.bipedRightArmwear.rotateAngleX = 0.0F;
        modelplayer.bipedRightArmwear.render(0.0625F);
        GlStateManager.disableBlend();
    }

    public void renderLeftArm(AbstractClientPlayer clientPlayer)
    {
        float f = 1.0F;
        GlStateManager.color(1.0F, 1.0F, 1.0F);
        float f1 = 0.0625F;
        ModelPlayer modelplayer = this.getMainModel();
        this.setModelVisibilities(clientPlayer);
        GlStateManager.enableBlend();
        modelplayer.isSneak = false;
        modelplayer.swingProgress = 0.0F;
        modelplayer.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, clientPlayer);
        modelplayer.bipedLeftArm.rotateAngleX = 0.0F;
        modelplayer.bipedLeftArm.render(0.0625F);
        modelplayer.bipedLeftArmwear.rotateAngleX = 0.0F;
        modelplayer.bipedLeftArmwear.render(0.0625F);
        GlStateManager.disableBlend();
    }
 
Последнее редактирование:
Попробуй перед рендером руки model.isSneak = false; делать.
Я добавил это и теперь рука просто удлиняется на шифте. Может лучше миксин делать для RenderPlayer.renderRightArm/renderLeftArm? И стоит ли вообще использовать миксины для такой задачи, насколько велик шанс несовместимости с другими модами?
 
несовместимости с другими модами
В целом маловероятно.
Может лучше миксин делать для RenderPlayer.renderRightArm/renderLeftArm?
Не поможет.
стоит ли вообще использовать миксины для такой задачи
Есть net.minecraftforge.client.event.RenderSpecificHandEvent он вызывается не много раньше чем renderArmFirstPerson, но в целом тоже самое.
рука просто удлиняется на шифте
Шота я зх. ванильные модельки рендерятся без проблем.
Minecraft 1.12.2 18.08.2025 23_01_12.png
Hand:
@Mod.EventBusSubscriber
public class Hand {

    @SubscribeEvent
    public static void renderHand(RenderSpecificHandEvent e) {
        AbstractClientPlayer player = Minecraft.getMinecraft().player;
        if (player == null) return;

        boolean flag1 = e.getHand() == EnumHand.MAIN_HAND;
        ItemStack stack = player.getHeldItem(e.getHand());
        if (!flag1) return;
        if (!stack.isEmpty()) return;
        if (player.isInvisible()) return;

        EnumHandSide enumhandside = player.getPrimaryHand();
        float swingProgress = e.getSwingProgress();
        float equipProgress = e.getEquipProgress();

        boolean flag = enumhandside == EnumHandSide.RIGHT;
        float f = flag ? 1.0F : -1.0F;
        float f1 = MathHelper.sqrt(swingProgress);
        float f2 = -0.3F * MathHelper.sin(f1 * (float)Math.PI);
        float f3 = 0.4F * MathHelper.sin(f1 * ((float)Math.PI * 2F));
        float f4 = -0.4F * MathHelper.sin(swingProgress * (float)Math.PI);
        GlStateManager.translate(f * (f2 + 0.64000005F), f3 + -0.6F + equipProgress * -0.6F, f4 + -0.71999997F);
        GlStateManager.rotate(f * 45.0F, 0.0F, 1.0F, 0.0F);
        float f5 = MathHelper.sin(swingProgress * swingProgress * (float)Math.PI);
        float f6 = MathHelper.sin(f1 * (float)Math.PI);
        GlStateManager.rotate(f * f6 * 70.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(f * f5 * -20.0F, 0.0F, 0.0F, 1.0F);

        ModelBiped model = new ModelSkeleton(); // ультра костыль, не делай так, у меня фпс минимум на 20% упал

        Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("textures/entity/skeleton/skeleton.png")); // это тоже, лучше не создавать объект каждый рендер фрейм

        GlStateManager.translate(f * -1.0F, 3.6F, 3.5F);
        GlStateManager.rotate(f * 120.0F, 0.0F, 0.0F, 1.0F);
        GlStateManager.rotate(200.0F, 1.0F, 0.0F, 0.0F);
        GlStateManager.rotate(f * -135.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.translate(f * 5.6F, 0.0F, 0.0F);

        GlStateManager.disableCull();
        GL11.glShadeModel(GL11.GL_SMOOTH);
        GlStateManager.color(1.0F, 1.0F, 1.0F);
        GlStateManager.enableBlend();
        model.isSneak = false;
        model.swingProgress = 0.0F;
        if (flag) {
            model.bipedRightArm.rotateAngleX = 0.0F;
            model.bipedRightArm.render(0.0625F);
        } else {
            model.bipedLeftArm.rotateAngleX = 0.0F;
            model.bipedLeftArm.render(0.0625F);
        }
        GlStateManager.disableBlend();
        GL11.glShadeModel(GL11.GL_FLAT);
        GlStateManager.enableCull();

        e.setCanceled(true);
    }
}
UPD:
Таумовская броня тоже
2025-08-19_00.02.41.png
Hand:
@Mod.EventBusSubscriber
public class Hand {

    @SubscribeEvent
    public static void renderHand(RenderSpecificHandEvent e) {
        AbstractClientPlayer player = Minecraft.getMinecraft().player;
        if (player == null) return;

        boolean flag1 = e.getHand() == EnumHand.MAIN_HAND;
        ItemStack stack = player.getHeldItem(e.getHand());
        if (!flag1) return;
        if (!stack.isEmpty()) return;
        if (player.isInvisible()) return;

        EnumHandSide enumhandside = player.getPrimaryHand();
        float swingProgress = e.getSwingProgress();
        float equipProgress = e.getEquipProgress();

        boolean flag = enumhandside == EnumHandSide.RIGHT;
        float f = flag ? 1.0F : -1.0F;
        float f1 = MathHelper.sqrt(swingProgress);
        float f2 = -0.3F * MathHelper.sin(f1 * (float)Math.PI);
        float f3 = 0.4F * MathHelper.sin(f1 * ((float)Math.PI * 2F));
        float f4 = -0.4F * MathHelper.sin(swingProgress * (float)Math.PI);
        GlStateManager.translate(f * (f2 + 0.64000005F), f3 + -0.6F + equipProgress * -0.6F, f4 + -0.71999997F);
        GlStateManager.rotate(f * 45.0F, 0.0F, 1.0F, 0.0F);
        float f5 = MathHelper.sin(swingProgress * swingProgress * (float)Math.PI);
        float f6 = MathHelper.sin(f1 * (float)Math.PI);
        GlStateManager.rotate(f * f6 * 70.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(f * f5 * -20.0F, 0.0F, 0.0F, 1.0F);

        ModelBiped modelBiped = new ModelPlayer(0.0F, false);
        ModelBiped model = new ModelFortressArmor(0.0F);

        GlStateManager.translate(f * -1.0F, 3.6F, 3.5F);
        GlStateManager.rotate(f * 120.0F, 0.0F, 0.0F, 1.0F);
        GlStateManager.rotate(200.0F, 1.0F, 0.0F, 0.0F);
        GlStateManager.rotate(f * -135.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.translate(f * 5.6F, 0.0F, 0.0F);

        GlStateManager.disableCull();
        GL11.glShadeModel(GL11.GL_SMOOTH);
        GlStateManager.color(1.0F, 1.0F, 1.0F);
        GlStateManager.enableBlend();
        model.isSneak = false;
        model.swingProgress = 0.0F;
        modelBiped.isSneak = false;
        modelBiped.swingProgress = 0.0F;
        if (flag) {
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("thaumcraft:textures/entity/armor/fortress_armor.png"));
            model.bipedRightArm.rotateAngleX = 0.0F;
            model.bipedRightArm.render(0.0625F);
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("returnoftheancients:textures/svorovanoe/steve.png"));
            modelBiped.bipedRightArm.rotateAngleX = 0.0F;
            modelBiped.bipedRightArm.render(0.0625F);
        } else {
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("thaumcraft:textures/entity/armor/fortress_armor.png"));
            model.bipedLeftArm.rotateAngleX = 0.0F;
            model.bipedLeftArm.render(0.0625F);
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("returnoftheancients:textures/svorovanoe/steve.png"));
            modelBiped.bipedLeftArm.rotateAngleX = 0.0F;
            modelBiped.bipedLeftArm.render(0.0625F);
        }
        GlStateManager.disableBlend();
        GL11.glShadeModel(GL11.GL_FLAT);
        GlStateManager.enableCull();

        e.setCanceled(true);
    }
}
 
Последнее редактирование:
В целом маловероятно.

Не поможет.

Есть net.minecraftforge.client.event.RenderSpecificHandEvent он вызывается не много раньше чем renderArmFirstPerson, но в целом тоже самое.

Шота я зх. ванильные модельки рендерятся без проблем.
Посмотреть вложение 18900
Hand:
@Mod.EventBusSubscriber
public class Hand {

    @SubscribeEvent
    public static void renderHand(RenderSpecificHandEvent e) {
        AbstractClientPlayer player = Minecraft.getMinecraft().player;
        if (player == null) return;

        boolean flag1 = e.getHand() == EnumHand.MAIN_HAND;
        ItemStack stack = player.getHeldItem(e.getHand());
        if (!flag1) return;
        if (!stack.isEmpty()) return;
        if (player.isInvisible()) return;

        EnumHandSide enumhandside = player.getPrimaryHand();
        float swingProgress = e.getSwingProgress();
        float equipProgress = e.getEquipProgress();

        boolean flag = enumhandside == EnumHandSide.RIGHT;
        float f = flag ? 1.0F : -1.0F;
        float f1 = MathHelper.sqrt(swingProgress);
        float f2 = -0.3F * MathHelper.sin(f1 * (float)Math.PI);
        float f3 = 0.4F * MathHelper.sin(f1 * ((float)Math.PI * 2F));
        float f4 = -0.4F * MathHelper.sin(swingProgress * (float)Math.PI);
        GlStateManager.translate(f * (f2 + 0.64000005F), f3 + -0.6F + equipProgress * -0.6F, f4 + -0.71999997F);
        GlStateManager.rotate(f * 45.0F, 0.0F, 1.0F, 0.0F);
        float f5 = MathHelper.sin(swingProgress * swingProgress * (float)Math.PI);
        float f6 = MathHelper.sin(f1 * (float)Math.PI);
        GlStateManager.rotate(f * f6 * 70.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(f * f5 * -20.0F, 0.0F, 0.0F, 1.0F);

        ModelBiped model = new ModelSkeleton(); // ультра костыль, не делай так, у меня фпс минимум на 20% упал

        Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("textures/entity/skeleton/skeleton.png")); // это тоже, лучше не создавать объект каждый рендер фрейм

        GlStateManager.translate(f * -1.0F, 3.6F, 3.5F);
        GlStateManager.rotate(f * 120.0F, 0.0F, 0.0F, 1.0F);
        GlStateManager.rotate(200.0F, 1.0F, 0.0F, 0.0F);
        GlStateManager.rotate(f * -135.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.translate(f * 5.6F, 0.0F, 0.0F);

        GlStateManager.disableCull();
        GL11.glShadeModel(GL11.GL_SMOOTH);
        GlStateManager.color(1.0F, 1.0F, 1.0F);
        GlStateManager.enableBlend();
        model.isSneak = false;
        model.swingProgress = 0.0F;
        if (flag) {
            model.bipedRightArm.rotateAngleX = 0.0F;
            model.bipedRightArm.render(0.0625F);
        } else {
            model.bipedLeftArm.rotateAngleX = 0.0F;
            model.bipedLeftArm.render(0.0625F);
        }
        GlStateManager.disableBlend();
        GL11.glShadeModel(GL11.GL_FLAT);
        GlStateManager.enableCull();

        e.setCanceled(true);
    }
}
UPD:
Таумовская броня тоже
Посмотреть вложение 18907
Hand:
@Mod.EventBusSubscriber
public class Hand {

    @SubscribeEvent
    public static void renderHand(RenderSpecificHandEvent e) {
        AbstractClientPlayer player = Minecraft.getMinecraft().player;
        if (player == null) return;

        boolean flag1 = e.getHand() == EnumHand.MAIN_HAND;
        ItemStack stack = player.getHeldItem(e.getHand());
        if (!flag1) return;
        if (!stack.isEmpty()) return;
        if (player.isInvisible()) return;

        EnumHandSide enumhandside = player.getPrimaryHand();
        float swingProgress = e.getSwingProgress();
        float equipProgress = e.getEquipProgress();

        boolean flag = enumhandside == EnumHandSide.RIGHT;
        float f = flag ? 1.0F : -1.0F;
        float f1 = MathHelper.sqrt(swingProgress);
        float f2 = -0.3F * MathHelper.sin(f1 * (float)Math.PI);
        float f3 = 0.4F * MathHelper.sin(f1 * ((float)Math.PI * 2F));
        float f4 = -0.4F * MathHelper.sin(swingProgress * (float)Math.PI);
        GlStateManager.translate(f * (f2 + 0.64000005F), f3 + -0.6F + equipProgress * -0.6F, f4 + -0.71999997F);
        GlStateManager.rotate(f * 45.0F, 0.0F, 1.0F, 0.0F);
        float f5 = MathHelper.sin(swingProgress * swingProgress * (float)Math.PI);
        float f6 = MathHelper.sin(f1 * (float)Math.PI);
        GlStateManager.rotate(f * f6 * 70.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.rotate(f * f5 * -20.0F, 0.0F, 0.0F, 1.0F);

        ModelBiped modelBiped = new ModelPlayer(0.0F, false);
        ModelBiped model = new ModelFortressArmor(0.0F);

        GlStateManager.translate(f * -1.0F, 3.6F, 3.5F);
        GlStateManager.rotate(f * 120.0F, 0.0F, 0.0F, 1.0F);
        GlStateManager.rotate(200.0F, 1.0F, 0.0F, 0.0F);
        GlStateManager.rotate(f * -135.0F, 0.0F, 1.0F, 0.0F);
        GlStateManager.translate(f * 5.6F, 0.0F, 0.0F);

        GlStateManager.disableCull();
        GL11.glShadeModel(GL11.GL_SMOOTH);
        GlStateManager.color(1.0F, 1.0F, 1.0F);
        GlStateManager.enableBlend();
        model.isSneak = false;
        model.swingProgress = 0.0F;
        modelBiped.isSneak = false;
        modelBiped.swingProgress = 0.0F;
        if (flag) {
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("thaumcraft:textures/entity/armor/fortress_armor.png"));
            model.bipedRightArm.rotateAngleX = 0.0F;
            model.bipedRightArm.render(0.0625F);
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("returnoftheancients:textures/svorovanoe/steve.png"));
            modelBiped.bipedRightArm.rotateAngleX = 0.0F;
            modelBiped.bipedRightArm.render(0.0625F);
        } else {
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("thaumcraft:textures/entity/armor/fortress_armor.png"));
            model.bipedLeftArm.rotateAngleX = 0.0F;
            model.bipedLeftArm.render(0.0625F);
            Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("returnoftheancients:textures/svorovanoe/steve.png"));
            modelBiped.bipedLeftArm.rotateAngleX = 0.0F;
            modelBiped.bipedLeftArm.render(0.0625F);
        }
        GlStateManager.disableBlend();
        GL11.glShadeModel(GL11.GL_FLAT);
        GlStateManager.enableCull();

        e.setCanceled(true);
    }
}
Попробовал использовать RenderSpecificHandEvent, но это не помогло, затем все-таки решил попробовать сделать миксин для RenderPlayer - не помогло. Проблему наконец-то решил, удалил строку model.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, player); и все заработало. Вот код
MixinRenderPlayer:
package com.nymoo.afp.common.mixin.impl;

import com.nymoo.afp.common.item.IPowerArmor;
import com.nymoo.afp.common.render.model.armor.PowerArmorModel;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.util.HashMap;
import java.util.Map;

@Mixin(RenderPlayer.class)
public abstract class MixinRenderPlayer {

    private static final Map<Item, ResourceLocation> ARMOR_TEXTURE_CACHE = new HashMap<>();

    @Inject(method = "renderRightArm", at = @At("HEAD"), cancellable = true)
    private void onRenderRightArm(AbstractClientPlayer player, CallbackInfo ci) {
        renderCustomArm(player, true, ci);
    }

    @Inject(method = "renderLeftArm", at = @At("HEAD"), cancellable = true)
    private void onRenderLeftArm(AbstractClientPlayer player, CallbackInfo ci) {
        renderCustomArm(player, false, ci);
    }

    private void renderCustomArm(AbstractClientPlayer player, boolean isRightArm, CallbackInfo ci) {
        ItemStack chestplate = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
        if (chestplate.isEmpty()) return;
        Item item = chestplate.getItem();
        if (!(item instanceof IPowerArmor)) return;

        ModelBiped armorModel = item.getArmorModel(player, chestplate, EntityEquipmentSlot.CHEST, null);
        if (!(armorModel instanceof PowerArmorModel)) return;
        PowerArmorModel model = (PowerArmorModel) armorModel;

        ResourceLocation texture = ARMOR_TEXTURE_CACHE.get(item);
        if (texture == null) {
            String regPath = item.getRegistryName().getPath();
            String armorType = regPath.replace("_chestplate", "");
            texture = new ResourceLocation("afp", "textures/armor/" + armorType + "/" + armorType + ".png");
            ARMOR_TEXTURE_CACHE.put(item, texture);
        }

        GlStateManager.color(1.0F, 1.0F, 1.0F);

        GlStateManager.enableBlend();
        Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
        if (isRightArm) {
            model.rightArm.render(0.0625F);
        } else {
            model.leftArm.render(0.0625F);
        }
        GlStateManager.disableBlend();
        ci.cancel();
    }
}

Вообще не знаю, почему это сработало, но если вы хотите докопаться до истины, то вот мой репозиторий GitHub - neoNymOo/Atom-Fusion-Protocol
 
Назад
Сверху