SOLVED Rendu d'un item dans le dos


  • Bonjour, j'essaye de faire un rendu des épées / arc dans le dos du personnage lorsque ces items sont équipé j'ai réussi plus ou moins mais je ne trouve pas comment faire suivre l'item parallélement au dos :

    –> http://puu.sh/axw0I/ecdeb5b56a.png

    Mais si je tourne mon perso sur lui même :

    --> http://puu.sh/axw4H/912459f5bc.png
    --> http://puu.sh/axw5J/fb13d2010e.png

    
    package fr.cc;
    
    import java.awt.image.BufferedImage;
    import java.net.URL;
    import java.util.HashMap;
    
    import javax.imageio.ImageIO;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.entity.AbstractClientPlayer;
    import net.minecraft.client.renderer.ItemRenderer;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.client.renderer.texture.DynamicTexture;
    import net.minecraft.client.renderer.texture.TextureManager;
    import net.minecraft.client.renderer.texture.TextureMap;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemBow;
    import net.minecraft.item.ItemStack;
    import net.minecraft.item.ItemSword;
    import net.minecraft.util.IIcon;
    import net.minecraft.util.ResourceLocation;
    
    import org.lwjgl.opengl.GL11;
    import org.lwjgl.opengl.GL12;
    
    import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type;
    
    public class CoolCraftPlayer extends RenderPlayerBase {
    
    private Minecraft mc = Minecraft.getMinecraft();
    
    @Override
    public void renderPlayer(AbstractClientPlayer player, double x, double z, double y, float f, float f2) {
    if (player.getHeldItem() != null) {
    ItemStack heldItem = player.getHeldItem();
    if (heldItem.getItem() instanceof ItemSword || heldItem.getItem() instanceof ItemBow) {
    GL11.glPushMatrix();
    GL11.glTranslatef(0.0F, -0.5F, 0.16F);
    if (player.inventory.armorItemInSlot(2) != null) {
    GL11.glTranslatef(0.0F, player.isSneaking() ? -0.1F : 0.0F, player.isSneaking() ? 0.025F : 0.06F);
    }
    if (player.isSneaking()) {
    GL11.glRotatef(-28.799999F, 1.0F, 0.0F, 0.0F);
    GL11.glTranslatef(0.0F, 0.0F, 0.18F);
    }
    int i = heldItem.getItem() instanceof ItemSword ? 1 : 2;
    GL11.glRotatef(i * -90.0F, 0F, 0F, 1F);
    GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
    System.out.println(f);
    GL11.glEnable(3042);
    GL11.glBlendFunc(770, 771);
    renderItemIn3d(heldItem);
    GL11.glDisable(3042);
    GL11.glPopMatrix();
    }
    }
    super.renderPlayer(player, x, z, y, f, f2);
    }
    
    public static void renderItemIn3d(ItemStack stack) {
    TextureManager textureManager = Minecraft.getMinecraft().getTextureManager();
    if (textureManager == null)
    return;
    Item item = stack.getItem();
    
    GL11.glPushMatrix();
    
    Tessellator tessellator = Tessellator.instance;
    GL11.glEnable(GL12.GL_RESCALE_NORMAL);
    GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
    GL11.glTranslatef(-0.5F, -0.5F, 1 / 32.0F);
    
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    
    int passes = item.getRenderPasses(stack.getItemDamage());
    for (int pass = 0; pass < passes; pass++) {
    textureManager.bindTexture(((stack.getItemSpriteNumber() == 0) ? TextureMap.locationBlocksTexture : TextureMap.locationItemsTexture));
    IIcon icon = item.getIcon(stack, pass);
    float minU = icon.getMinU();
    float maxU = icon.getMaxU();
    float minV = icon.getMinV();
    float maxV = icon.getMaxV();
    setColorFromInt(item.getColorFromItemStack(stack, pass));
    ItemRenderer.renderItemIn2D(tessellator, maxU, minV, minU, maxV, icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
    }
    GL11.glDisable(GL12.GL_RESCALE_NORMAL);
    
    GL11.glPopMatrix();
    }
    
    public static void setColorFromInt(int color) {
    float r = (color >> 16 & 255) / 255.0F;
    float g = (color >> 8 & 255) / 255.0F;
    float b = (color & 255) / 255.0F;
    GL11.glColor4f(r, g, b, 1.0F);
    }
    
    }
    
    
  • Moddeurs confirmés Modérateurs

    il te faut jouer avec les rotatef et scalef de ton code de rendu pour trouver la bonne position

  • Rédacteurs

    tu n'a pas pris en compte le paramètre de rotation du corps : " player.rotationYaw; ", il me semble que c'est ce paramètre ou alors c'est un paramètre avec un nom similaire.

  • Moddeurs confirmés Modérateurs

    exact phenix j'avais mal lu sa question


  • Je maitrise mal la fonction GL11.glRotatef()

    D'après ce que je comprends y'a :

    GL11.glRotatef(ANGLE , X , Y , Z)

    dont je fais :

    GL11.glRotatef(player.renderYawOffset, ?F, 0F, ?F);

    Pour faire un rotation sur X / Z mais comment savoir les valeurs de X / Z ?


    Ah ! j'ai trouvé le float du corps :

    
    int i = heldItem.getItem() instanceof ItemSword ? 1 : 2;
    GL11.glRotatef(i * -90.0F, 0F, 0F, 1F);
    GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
    GL11.glRotatef(-player.renderYawOffset, 0F, 1F, 0F);
    GL11.glEnable(3042);
    GL11.glBlendFunc(770, 771);
    renderItemIn3d(heldItem);
    GL11.glDisable(3042);
    GL11.glPopMatrix();