Не могу рендерить итемы как карту (в две руки)

Версия Minecraft
1.7.10

RareScrap

Модератор
1,334
40
645
Привет, форумчане. Хочу сделать IItemRenderer который может рендерить любой итем в две руки, как это происходит с ItemMap. Наследовать итем от ItemMap - не вариант, т.к. у меня нет MapData. Я пробовал накидать что-то в этом роде, но у меня теперь вообще ничего не рендерится от первого лица (даже рука). Подозреваю что это из-за предварительных трансформаций, которые происходят в ItemRenderer до вызова моего рендера.

Мой рендер:
package com.example.examplemod;

import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

public class MapItemRenderer implements IItemRenderer {

    private static final ResourceLocation RES_MAP_BACKGROUND = new ResourceLocation("textures/map/map_background.png");


    private Minecraft mc = Minecraft.getMinecraft();

    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type) {
        return type == ItemRenderType.EQUIPPED_FIRST_PERSON;
    }

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

    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
        renderAsMap(mc.timer.renderPartialTicks);
    }

    public void renderAsMap(float partialTickTime) {
        float equippedProgress = RenderManager.instance.itemRenderer.equippedProgress;
        float prevEquippedProgress = RenderManager.instance.itemRenderer.prevEquippedProgress;

        float f1 = prevEquippedProgress + (equippedProgress - prevEquippedProgress) * partialTickTime;
        EntityClientPlayerMP entityclientplayermp = this.mc.thePlayer;
        float f2 = entityclientplayermp.prevRotationPitch + (entityclientplayermp.rotationPitch - entityclientplayermp.prevRotationPitch) * partialTickTime;

        float f5;
        float f6;
        float f7;
        float f8;
        float f9;
        float f10;
        float f13;
        Render render;
        RenderPlayer renderplayer;

        GL11.glPushMatrix();
        f13 = 0.8F;
        f5 = entityclientplayermp.getSwingProgress(partialTickTime);
        f6 = MathHelper.sin(f5 * (float)Math.PI);
        f7 = MathHelper.sin(MathHelper.sqrt_float(f5) * (float)Math.PI);
        GL11.glTranslatef(-f7 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(f5) * (float)Math.PI * 2.0F) * 0.2F, -f6 * 0.2F);
        f5 = 1.0F - f2 / 45.0F + 0.1F;

        if (f5 < 0.0F)
        {
            f5 = 0.0F;
        }

        if (f5 > 1.0F)
        {
            f5 = 1.0F;
        }

        f5 = -MathHelper.cos(f5 * (float)Math.PI) * 0.5F + 0.5F;
        GL11.glTranslatef(0.0F, 0.0F * f13 - (1.0F - f1) * 1.2F - f5 * 0.5F + 0.04F, -0.9F * f13);
        GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(f5 * -85.0F, 0.0F, 0.0F, 1.0F);
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        this.mc.getTextureManager().bindTexture(entityclientplayermp.getLocationSkin());

        for (int i1 = 0; i1 < 2; ++i1)
        {
            int j1 = i1 * 2 - 1;
            GL11.glPushMatrix();
            GL11.glTranslatef(-0.0F, -0.6F, 1.1F * (float)j1);
            GL11.glRotatef((float)(-45 * j1), 1.0F, 0.0F, 0.0F);
            GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F);
            GL11.glRotatef(59.0F, 0.0F, 0.0F, 1.0F);
            GL11.glRotatef((float)(-65 * j1), 0.0F, 1.0F, 0.0F);
            render = RenderManager.instance.getEntityRenderObject(this.mc.thePlayer);
            renderplayer = (RenderPlayer)render;
            f10 = 1.0F;
            GL11.glScalef(f10, f10, f10);
            renderplayer.renderFirstPersonArm(this.mc.thePlayer);
            GL11.glPopMatrix();
        }

        f6 = entityclientplayermp.getSwingProgress(partialTickTime);
        f7 = MathHelper.sin(f6 * f6 * (float)Math.PI);
        f8 = MathHelper.sin(MathHelper.sqrt_float(f6) * (float)Math.PI);
        GL11.glRotatef(-f7 * 20.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(-f8 * 20.0F, 0.0F, 0.0F, 1.0F);
        GL11.glRotatef(-f8 * 80.0F, 1.0F, 0.0F, 0.0F);
        f9 = 0.38F;
        GL11.glScalef(f9, f9, f9);
        GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
        GL11.glTranslatef(-1.0F, -1.0F, 0.0F);
        f10 = 0.015625F;
        GL11.glScalef(f10, f10, f10);
        this.mc.getTextureManager().bindTexture(RES_MAP_BACKGROUND);
        Tessellator tessellator = Tessellator.instance;
        GL11.glNormal3f(0.0F, 0.0F, -1.0F);
        tessellator.startDrawingQuads();
        byte b0 = 7;
        tessellator.addVertexWithUV((double)(0 - b0), (double)(128 + b0), 0.0D, 0.0D, 1.0D);
        tessellator.addVertexWithUV((double)(128 + b0), (double)(128 + b0), 0.0D, 1.0D, 1.0D);
        tessellator.addVertexWithUV((double)(128 + b0), (double)(0 - b0), 0.0D, 1.0D, 0.0D);
        tessellator.addVertexWithUV((double)(0 - b0), (double)(0 - b0), 0.0D, 0.0D, 0.0D);
        tessellator.draw();

//        IItemRenderer custom = MinecraftForgeClient.getItemRenderer(itemstack, FIRST_PERSON_MAP);
//        MapData mapdata = ((ItemMap)itemstack.getItem()).getMapData(itemstack, this.mc.theWorld);
//
//        if (custom == null)
//        {
//            if (mapdata != null)
//            {
//                this.mc.entityRenderer.getMapItemRenderer().func_148250_a(mapdata, false);
//            }
//        }
//        else
//        {
//            custom.renderItem(FIRST_PERSON_MAP, itemstack, mc.thePlayer, mc.getTextureManager(), mapdata);
//        }

        GL11.glPopMatrix();
    }
}

Кто нибудь знает как добиться желаемого? Гугление выдало лишь такую же проблему у другого юзера, но без решения.
 
Ну если предмет свой. То просто рендеришь руки, а рендер предмета передвигаешь в пространсве, так чтобы он в две руки вставал.
У меня рендер предмета в руках как плоская текстура.
Java:
package timaxa007.mapos.client;

import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.IItemRenderer;
import timaxa007.mapos.MaposMod;

public class RenderItemMapos implements IItemRenderer {

    private static final ResourceLocation RES_MAP_BACKGROUND = new ResourceLocation("textures/map/map_background.png");

    @Override
    public boolean handleRenderType(ItemStack item, ItemRenderType type) {
        switch(type) {
        case EQUIPPED_FIRST_PERSON:return true;
        default:return false;
        }
    }

    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
        switch(type) {
        case EQUIPPED_FIRST_PERSON:return true;
        default:return false;
        }
    }

    @Override
    public void renderItem(ItemRenderType type, ItemStack itemstack, Object... data) {
        if (itemstack.getItemDamage() >= MaposMod.metaSize) return;
        if (itemstack.getItemDamage() < 0) return;

        EntityClientPlayerMP entityclientplayermp = Minecraft.getMinecraft().thePlayer;
        float par1 = 0.0625F;

        float f2 = entityclientplayermp.prevRotationPitch + (entityclientplayermp.rotationPitch - entityclientplayermp.prevRotationPitch) * par1;

        int i = Minecraft.getMinecraft().theWorld.getLightBrightnessForSkyBlocks(MathHelper.floor_double(entityclientplayermp.posX), MathHelper.floor_double(entityclientplayermp.posY), MathHelper.floor_double(entityclientplayermp.posZ), 0);
        int j = i % 65536;
        int k = i / 65536;
        OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)j / 1.0F, (float)k / 1.0F);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        float f6;
        float f7;
        float f8;

        float f9;
        float f10;
        RenderPlayer renderplayer;

        GL11.glPushMatrix();
        GL11.glRotatef(-45.0F, 0.0F, 1.0F, 0.0F);
        GL11.glTranslatef(-0.7F, 0.5F, 0F);
        f10 = 2.5F;
        GL11.glScalef(f10, f10, f10);

        f7 = entityclientplayermp.getSwingProgress(par1);
        f8 = MathHelper.sin(f7 * (float)Math.PI);
        f6 = MathHelper.sin(MathHelper.sqrt_float(f7) * (float)Math.PI);
        GL11.glTranslatef(-f6 * 0.0F, MathHelper.sin(MathHelper.sqrt_float(f7) * (float)Math.PI * 2.0F) * 0.2F, -f8 * 0.2F);
        f7 = 1.0F - f2 / 45.0F + 0.1F;

        if (f7 < 0.0F) f7 = 0.0F;
        if (f7 > 1.0F) f7 = 1.0F;

        f7 = -MathHelper.cos(f7 * (float)Math.PI) * 0.5F + 0.5F;
        GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(f7 * -85.0F, 0.0F, 0.0F, 1.0F);

        GL11.glTranslatef(0F, 0.55F, 0F);
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        Minecraft.getMinecraft().getTextureManager().bindTexture(entityclientplayermp.getLocationSkin());

        for (k = 0; k < 2; ++k) {
            int l = k * 2 - 1;
            GL11.glPushMatrix();
            GL11.glTranslatef(-0.0F, -0.6F, 1.1F * (float)l);
            GL11.glRotatef((float)(-45 * l), 1.0F, 0.0F, 0.0F);
            GL11.glRotatef(-90.0F, 0.0F, 0.0F, 1.0F);
            GL11.glRotatef(59.0F, 0.0F, 0.0F, 1.0F);
            GL11.glRotatef((float)(-65 * l), 0.0F, 1.0F, 0.0F);
            renderplayer = (RenderPlayer)RenderManager.instance.getEntityRenderObject(Minecraft.getMinecraft().thePlayer);
            renderplayer.renderFirstPersonArm(Minecraft.getMinecraft().thePlayer);
            GL11.glPopMatrix();
        }

        f10 = 0.38F;
        GL11.glScalef(f10, f10, f10);
        GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
        GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
        GL11.glTranslatef(-1.0F, -1.0F, 0.0F);
        f10 = 0.015625F;
        GL11.glScalef(f10, f10, f10);

        Minecraft.getMinecraft().getTextureManager().bindTexture(ProxyClient.RES_MAP[itemstack.getItemDamage()]);
        Tessellator tessellator = Tessellator.instance;
        GL11.glNormal3f(0.0F, 0.0F, -1.0F);
        byte b0 = 8;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)(0 - b0), (double)(128 + b0), 0.0D, 0.0D, 1.0D);
        tessellator.addVertexWithUV((double)(128 + b0), (double)(128 + b0), 0.0D, 1.0D, 1.0D);
        tessellator.addVertexWithUV((double)(128 + b0), (double)(0 - b0), 0.0D, 1.0D, 0.0D);
        tessellator.addVertexWithUV((double)(0 - b0), (double)(0 - b0), 0.0D, 0.0D, 0.0D);
        tessellator.draw();

        GL11.glPopMatrix();
    }

}
Вместо:
Java:
        Minecraft.getMinecraft().getTextureManager().bindTexture(ProxyClient.RES_MAP[itemstack.getItemDamage()]);
        Tessellator tessellator = Tessellator.instance;
        GL11.glNormal3f(0.0F, 0.0F, -1.0F);
        byte b0 = 8;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)(0 - b0), (double)(128 + b0), 0.0D, 0.0D, 1.0D);
        tessellator.addVertexWithUV((double)(128 + b0), (double)(128 + b0), 0.0D, 1.0D, 1.0D);
        tessellator.addVertexWithUV((double)(128 + b0), (double)(0 - b0), 0.0D, 1.0D, 0.0D);
        tessellator.addVertexWithUV((double)(0 - b0), (double)(0 - b0), 0.0D, 0.0D, 0.0D);
        tessellator.draw();
Рендер своего предмета.
---
Скриншота и/или видео получше нету.

Код делал давно (В конце августа 2018 года).
 
Выложил решение на основе ванильного кода в ресурсы
 
Назад
Сверху