Rendu 3D



  • Bonjour,

    J'aimerais rendre en 3D un modèle dans le dos d'un joueur (un Sac), j'ai trouvé ce post :

    http://www.minecraftforgefrance.fr/showthread.php?tid=1207

    Seulement, il manque énormément de détails, comment Register la classe etc et de plus, c'est marqué pour 1.7.10 mais le :

    extends RenderPlayerBase
    

    N'existe pas j'ai du le changer par :

    extends RenderPlayer
    

    Et la méthode @Override renderPlayer :

    The method renderPlayer(AbstractClientPlayer, double, double, double, float, float) of type RenderPlayerItem must override or implement a supertype method

    Je vois pas très bien ce que veut dire ce message.

    Voici donc la classe que j'ai formé :

    package fr.altiscraft.benjaminloison.proxy;
    
    import org.lwjgl.opengl.GL11;
    import org.lwjgl.opengl.GL12;
    
    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.entity.RenderPlayer;
    import net.minecraft.client.renderer.texture.TextureManager;
    import net.minecraft.client.renderer.texture.TextureMap;
    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;
    
    public class RenderPlayerItem extends RenderPlayer {
    
    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);
    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);
    }
    
    }
    

    De plus je ne sais pas comment il faut appliquer le code à la fin du post pour bien régler la rotation.

    J'aimerais que ça soit compatible au multi-joueur, que chacun puisse voir si quelqu'un à un sac dans le dos des autres.

    PS: J'aimerais aussi faire quelque chose comme ceci: http://www.minecraftforgefrance.fr/showthread.php?tid=1245

    Mais avec un modèle de flansmod, donc déjà en .class etc et je pense pas que du coup c'est trop possible,

    Merci d'avance pour la lecture, 🙂



  • Tu ne vois pas la classe RenderPlayerBase car tout simplement elle appartient à la lib Render Player API. Pour ajouter un modèle dans le dos du joueur comme ceci, tu peux soit te servir de l'event RenderPlayerEvent, ce qui te permettra de ne dépendre de la lib Render Player API, ou alors tu te sers d'une classe héritant RenderPlayerBase.
    Pour ta seconde question, y'a sûrement moyen, je regarderai + en détail si personne n'a d'ici là la réponse…



  • Es-ce que tu a vérifié ce qu'il y a dans la class RenderPlayer ?
    Pour moi (je suis en 1.8 donc c'est peut-être différent), il y a une fonction "func_180596_a" ou "doRender" mais y n'y a pas "renderPlayer".



  • Toute façon , il ne pourra pas enregistrer sa classe héritant de RenderPlayer. Si vous pensez qu'il pourra enregistrer son rendu comme ça
    RenderingRegistry.registerEntityRenderingHandler(EntityPlayer.class, new RenderPlayerItem(new ModelBiped(), 0.5F));

    Vous vous trompez, essayez ça fera juste crasher le jeu. Je n'ai pas testé mais essaie de cancel l'event RenderPlayerEvent, et d'appeler la fonction doRender de ta nouvelle classe RenderPlayer. Sa peut peut-être marcher…


  • Administrateurs

    Il n'est pas obligé de cancel l'event RenderPlayerEvent.
    Cette event peut être utilisé pour rendre n'importe quoi en rapport avec le joueur.
    On l'utilise pour le chapeau de FFMT libs :
    https://github.com/FFMT/FFMT-libs/blob/ce0cebba7fb13cc4d06b1f1bee2ae75768c03347/common/fr/minecraftforgefrance/ffmtlibs/event/PlayerEventHandler.java#L30
    (il y a pleins de truc car la texture est chargé sur files.minecraftforgefrance.fr/hats et le modèle est récréé à partir des fichiers textes).



  • Pour flan's mod et donc pour un modèle dans une gui, suffi que tu ai les sources de flan's mod 😉 (disponible ici au passage)



  • 😕 J'ai fais recherches etc mais je galère à trouver un code source qui me serait utile, j'aimerais que lorsque le joueur a un sac ça l'affiche dans son dos, quelqu'un pourrait m'envoyer un code s'il vous plaît et en l'expliquant ce serait superbe 🙂

    Merci,

    PS: Je fais des tests pour le Flansmod 😉


  • Administrateurs

    Il faut déjà un code qui parcours les différents item de l'inventaire pour voir si le sac y ait. Ça ce n'est rien de compliqué, c'est juste une condition dans une boucle for.
    Ensuite si c'est le cas il faut bind la texture puis rendre le modèle du sac.



  • Ouai l'histoire du for c'est tranquille mais pour le rendu 3D, ça c'est mon faible et j'ai aucune idée de comment faire en faite…

    Ps: j'ai réussi pour le Flansmod rendu de ouf merci ! 🙂 J'avais oublié que dans le code source y avait déjà un rendu 3D dans un Gui 🙂



  • Quelqu'un a une idée ou un peu de code à me donner pour mon rendu 3D d'item ? (Je ne sais pas du tout comment m'y prendre :/)