Вызов нестандартного рендера предмета по запросу

Версия Minecraft
1.7.10
API
Forge

VeniVidiVici

Санта Барбарис
327
15
198
Добрый день, столкнулся с небольшим тупняком, просьба помочь разобраться. Есть необходимость отрисовать obj предмет по игроку обычным вызовом, без использования брони. Не могу составить сам метод/вызов.

У меня есть класс рендера предмета из Obj, который как и нужно обрисовывает его в игре:
Java:
public class ItemCustomRender implements IItemRenderer
{
    private IModelCustom model;
    private ResourceLocation texture;
    private int slotType;
    
    public ItemCustomRender(String setNumber, IModelCustom model, int slotType)
    {
        texture = new ResourceLocation(ModInfo.MODID, "textures/" + getTypeName(slotType) + "/" + setNumber + ".png");   
        this.model = model;
        this.slotType = slotType;
    }

    public String getTypeName(int type)
    {
        /*так надо*/
        return "type_name";
    }
    
    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type) {
        switch (type)
        {
            case ENTITY: return true;
            case EQUIPPED: return true;
            case EQUIPPED_FIRST_PERSON: return true;
            case INVENTORY: return true;
            default: return false;
        }
    }

    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
        return false;
    }

    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
        switch (type)
        {
            case ENTITY:
            {
                if (slotType == 0)
                {
                    GL11.glPushMatrix();
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    GL11.glRotatef(1.0F, 0.0F, 0.0F, 1.0F);
                    model.renderAll();
                    GL11.glPopMatrix();
                }
                break;
            }
            case EQUIPPED:
            {
                if (slotType == 0)
                {
                    GL11.glPushMatrix();
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    GL11.glRotatef(30.0F, 0.0F, 0.0F, 1.0F);
                    model.renderAll();
                    GL11.glPopMatrix();
                }
                break;
            }
            case EQUIPPED_FIRST_PERSON:
            {
                if (slotType == 0)
                {
                    GL11.glPushMatrix();
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
                    GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F);
                    model.renderAll();
                    GL11.glPopMatrix();
                }
                break;
            }
            case INVENTORY:
                if (slotType == 0)
                {
                    GL11.glPushMatrix();
                    Minecraft.getMinecraft().renderEngine.bindTexture(texture);
                    GL11.glRotatef(45.0F, 0.0F, 1.0F, 1.0F);
                    GL11.glRotatef(-135.0F, 1.0F, 0.0F, 0.0F);
                    GL11.glScalef(1, 1, 1);
                    model.renderAll();
                    GL11.glPopMatrix();
                }
                break;
            
            default:
                break;
        }
    }
}

И есть вот такой класс рендера, в котором мне как-то нужно вызвать рендер этого предмета, имея лишь сущность и сам стак.

RenderCustomLayer:
public class RenderCustomLayer {
    
    public RenderCustomLayer(){

    }

    public void render(EntityLivingBase entity, ItemStack item) {
        this.doRender(entity, item);
    }

    public void doRender(EntityLivingBase entity, ItemStack item){
        float entityTranslateY = entity instanceof EntityPlayer ? 0F : -1.5F;
        GL11.glPushMatrix();
        if (!entity.isSneaking()){
            GL11.glTranslatef(0F,  0.2F + entityTranslateY + 0.0F, 0.5F);
        }
        else{
            GL11.glTranslatef(0F, 0.2F + entityTranslateY - 0.1F, 0.6F);
            GL11.glRotatef(20F, 1F, 0F, 0F);
        }
        GL11.glScalef(0.8F, 0.8F, 0.8F);
        GL11.glRotatef(180, 0F, 0F, 1F);
        
        if(item != null)
        {
            if(item.getItem() instanceof ItemClothes)
                // Как вызвать рендер?
        }
        GL11.glPopMatrix();
    }
}

Сам вызов идёт вот из этого хэндлера:
PlayerRenderHandler:
public class PlayerRenderHandler {

    public static final RenderCustomLayer RENDER = new RenderCustomLayer();
    
    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    public void onPlayerRenderTick(RenderPlayerEvent.Specials.Pre e) {
        EntityLivingBase entity = e.entityLiving;
        if(entity instanceof EntityPlayer){
            ExtendedPlayer exp = ExtendedPlayer.get((EntityPlayer)entity);
            ItemStack item = exp.inventory.getStackInSlot(InventoryCustomPlayer.SLOT_TYPE1);
            if(item != null)
                RENDER.render(entity, item);
        }
    }
}

Т.е. по факту мне надо вызвать нестандартный рендер этого предмета на персонаже, но не могу понять, каким именно методом это правильно сделать. Помогите, пожалуйста, разобраться. Либо подскажите как это сделать корректней, если такие варианты есть, так как за идеальность моей реализации не кичусь.
 

VeniVidiVici

Санта Барбарис
327
15
198
А, всё, сообразил.
Java:
ItemRenderer renderer = new ItemRenderer(Minecraft.getMinecraft());
renderer.renderItem(entity, item, 0, ItemRenderType.EQUIPPED);

Может кому в целом пригодится код, оставлю как есть тут.
 
7,099
324
1,510
На 1.7.10 еще нет слоев, поэтому надо юзать RenderLivingEvent. Как рисовать предмет можно посмотреть в гуи маяка
 
210
1
19
надо юзать RenderLivingEvent
Клонировал класс ItemRenderer, отрисовал через него предмет в RenderPlayerEvent.Specials.Post, исправив в клонированном классе под себя местонахождение относительно игрока. С учётом того, что я не врубаюсь в методы GL11, подбирал цифры везде методом научного тыка и мои действия были похожи на тряску дерева обезьяной. Однако требуемого результата через два часа я всё-таки достиг. Если долго мучиться - что-нибудь получится... Аллилуйя!
 

VeniVidiVici

Санта Барбарис
327
15
198

LaoTheLizard , товарищ, а ты часом с этой темой не можешь чего нестандартного посоветовать?

 
210
1
19
7,099
324
1,510
GlStateManager учитывает, какие атрибуты сейчас включены и не включает/не выключает их повторно. Не знаю ,насколько это ускоряет рендер
 
Сверху